import { Model, mixin } from 'objection'; import TenantModel from 'models/TenantModel'; import ModelSetting from './ModelSetting'; import SaleReceiptSettings from './SaleReceipt.Settings'; export default class SaleReceipt extends mixin(TenantModel, [ModelSetting]) { /** * Table name */ static get tableName() { return 'sales_receipts'; } /** * Timestamps columns. */ get timestamps() { return ['created_at', 'updated_at']; } /** * Virtual attributes. */ static get virtualAttributes() { return ['isClosed', 'isDraft']; } /** * Detarmine whether the sale receipt closed. * @return {boolean} */ get isClosed() { return !!this.closedAt; } /** * Detarmines whether the sale receipt drafted. * @return {boolean} */ get isDraft() { return !this.closedAt; } /** * Model modifiers. */ static get modifiers() { return { /** * Filters the closed receipts. */ closed(query) { query.whereNot('closed_at', null); }, /** * Filters the invoices in draft status. */ draft(query) { query.where('closed_at', null); }, /** * Sorting the receipts order by status. */ sortByStatus(query, order) { query.orderByRaw(`CLOSED_AT IS NULL ${order}`); }, /** * Filtering the receipts orders by status. */ filterByStatus(query, status) { switch (status) { case 'draft': query.modify('draft'); break; case 'closed': default: query.modify('closed'); break; } } }; } /** * Relationship mapping. */ static get relationMappings() { const Customer = require('models/Customer'); const Account = require('models/Account'); const AccountTransaction = require('models/AccountTransaction'); const ItemEntry = require('models/ItemEntry'); return { customer: { relation: Model.BelongsToOneRelation, modelClass: Customer.default, join: { from: 'sales_receipts.customerId', to: 'contacts.id', }, filter(query) { query.where('contact_service', 'customer'); }, }, depositAccount: { relation: Model.BelongsToOneRelation, modelClass: Account.default, join: { from: 'sales_receipts.depositAccountId', to: 'accounts.id', }, }, entries: { relation: Model.HasManyRelation, modelClass: ItemEntry.default, join: { from: 'sales_receipts.id', to: 'items_entries.referenceId', }, filter(builder) { builder.where('reference_type', 'SaleReceipt'); }, }, transactions: { relation: Model.HasManyRelation, modelClass: AccountTransaction.default, join: { from: 'sales_receipts.id', to: 'accounts_transactions.referenceId', }, filter(builder) { builder.where('reference_type', 'SaleReceipt'); }, }, }; } /** * Sale invoice meta. */ static get meta() { return SaleReceiptSettings; } }