diff --git a/server/src/models/SaleInvoice.js b/server/src/models/SaleInvoice.js index c0dfe3bfb..628d378ec 100644 --- a/server/src/models/SaleInvoice.js +++ b/server/src/models/SaleInvoice.js @@ -7,14 +7,14 @@ export default class SaleInvoice extends TenantModel { * Table name */ static get tableName() { - return "sales_invoices"; + return 'sales_invoices'; } /** * Timestamps columns. */ get timestamps() { - return ["created_at", "updated_at"]; + return ['created_at', 'updated_at']; } /** @@ -22,14 +22,14 @@ export default class SaleInvoice extends TenantModel { */ static get virtualAttributes() { return [ - "dueAmount", - "isDelivered", - "isOverdue", - "isPartiallyPaid", - "isFullyPaid", - "isPaid", - "remainingDays", - "overdueDays", + 'dueAmount', + 'isDelivered', + 'isOverdue', + 'isPartiallyPaid', + 'isFullyPaid', + 'isPaid', + 'remainingDays', + 'overdueDays', ]; } @@ -95,7 +95,7 @@ export default class SaleInvoice extends TenantModel { const date = moment(); const dueDate = moment(this.dueDate); - return Math.max(dueDate.diff(date, "days"), 0); + return Math.max(dueDate.diff(date, 'days'), 0); } /** @@ -114,7 +114,7 @@ export default class SaleInvoice extends TenantModel { * * @param {*} asDate */ - getOverdueDays(asDate = moment().format("YYYY-MM-DD")) { + getOverdueDays(asDate = moment().format('YYYY-MM-DD')) { // Can't continue in case due date not defined. if (!this.dueDate) { return null; @@ -123,7 +123,7 @@ export default class SaleInvoice extends TenantModel { const date = moment(asDate); const dueDate = moment(this.dueDate); - return Math.max(date.diff(dueDate, "days"), 0); + return Math.max(date.diff(dueDate, 'days'), 0); } /** @@ -135,65 +135,65 @@ export default class SaleInvoice extends TenantModel { * Filters the due invoices. */ dueInvoices(query) { - query.where(raw("BALANCE - PAYMENT_AMOUNT > 0")); + query.where(raw('BALANCE - PAYMENT_AMOUNT > 0')); }, /** * Filters the invoices between the given date range. */ - filterDateRange(query, startDate, endDate, type = "day") { - const dateFormat = "YYYY-MM-DD HH:mm:ss"; + filterDateRange(query, startDate, endDate, type = 'day') { + const dateFormat = 'YYYY-MM-DD HH:mm:ss'; const fromDate = moment(startDate).startOf(type).format(dateFormat); const toDate = moment(endDate).endOf(type).format(dateFormat); if (startDate) { - query.where("invoice_date", ">=", fromDate); + query.where('invoice_date', '>=', fromDate); } if (endDate) { - query.where("invoice_date", "<=", toDate); + query.where('invoice_date', '<=', toDate); } }, /** * Filters the invoices in draft status. */ draft(query) { - query.where("delivered_at", null); + query.where('delivered_at', null); }, /** * Filters the delivered invoices. */ delivered(query) { - query.whereNot("delivered_at", null); + query.whereNot('delivered_at', null); }, /** * Filters the unpaid invoices. */ unpaid(query) { - query.where(raw("PAYMENT_AMOUNT = 0")); + query.where(raw('PAYMENT_AMOUNT = 0')); }, /** * Filters the overdue invoices. */ - overdue(query, asDate = moment().format("YYYY-MM-DD")) { - query.where("due_date", "<", asDate); + overdue(query, asDate = moment().format('YYYY-MM-DD')) { + query.where('due_date', '<', asDate); }, /** * Filters the not overdue invoices. */ - notOverdue(query, asDate = moment().format("YYYY-MM-DD")) { - query.where("due_date", ">=", asDate); + notOverdue(query, asDate = moment().format('YYYY-MM-DD')) { + query.where('due_date', '>=', asDate); }, /** * Filters the partially invoices. */ partiallyPaid(query) { - query.whereNot("payment_amount", 0); - query.whereNot(raw("`PAYMENT_AMOUNT` = `BALANCE`")); + query.whereNot('payment_amount', 0); + query.whereNot(raw('`PAYMENT_AMOUNT` = `BALANCE`')); }, /** * Filters the paid invoices. */ paid(query) { - query.where(raw("PAYMENT_AMOUNT = BALANCE")); + query.where(raw('PAYMENT_AMOUNT = BALANCE')); }, /** * Filters the sale invoices from the given date. @@ -219,9 +219,7 @@ export default class SaleInvoice extends TenantModel { */ maxInvoiceNo(query, prefix, number) { query - .select( - raw(`REPLACE(INVOICE_NO, "${prefix}", "") AS INV_NUMBER`) - ) + .select(raw(`REPLACE(INVOICE_NO, "${prefix}", "") AS INV_NUMBER`)) .havingRaw('CHAR_LENGTH(INV_NUMBER) = ??', [number.length]) .orderBy('invNumber', 'DESC') .limit(1) @@ -229,8 +227,8 @@ export default class SaleInvoice extends TenantModel { }, byPrefixAndNumber(query, prefix, number) { - query.where('invoice_no', `${prefix}${number}`) - } + query.where('invoice_no', `${prefix}${number}`); + }, }; } @@ -238,22 +236,22 @@ export default class SaleInvoice extends TenantModel { * Relationship mapping. */ static get relationMappings() { - const AccountTransaction = require("models/AccountTransaction"); - const ItemEntry = require("models/ItemEntry"); - const Contact = require("models/Contact"); - const InventoryCostLotTracker = require("models/InventoryCostLotTracker"); - const PaymentReceiveEntry = require("models/PaymentReceiveEntry"); + const AccountTransaction = require('models/AccountTransaction'); + const ItemEntry = require('models/ItemEntry'); + const Contact = require('models/Contact'); + const InventoryCostLotTracker = require('models/InventoryCostLotTracker'); + const PaymentReceiveEntry = require('models/PaymentReceiveEntry'); return { entries: { relation: Model.HasManyRelation, modelClass: ItemEntry.default, join: { - from: "sales_invoices.id", - to: "items_entries.referenceId", + from: 'sales_invoices.id', + to: 'items_entries.referenceId', }, filter(builder) { - builder.where("reference_type", "SaleInvoice"); + builder.where('reference_type', 'SaleInvoice'); }, }, @@ -261,8 +259,8 @@ export default class SaleInvoice extends TenantModel { relation: Model.BelongsToOneRelation, modelClass: Contact.default, join: { - from: "sales_invoices.customerId", - to: "contacts.id", + from: 'sales_invoices.customerId', + to: 'contacts.id', }, filter(query) { query.where('contact_service', 'Customer'); @@ -275,14 +273,32 @@ export default class SaleInvoice extends TenantModel { join: { from: 'sales_invoices.id', to: 'accounts_transactions.referenceId', + }, + filter(builder) { + builder.where('reference_type', 'SaleInvoice'); + }, }, + + costTransactions: { + relation: Model.HasManyRelation, + modelClass: InventoryCostLotTracker.default, join: { from: 'sales_invoices.id', to: 'inventory_cost_lot_tracker.transactionId', }, filter(builder) { + builder.where('transaction_type', 'SaleInvoice'); + }, }, + + paymentEntries: { + relation: Model.HasManyRelation, + modelClass: PaymentReceiveEntry.default, join: { + from: 'sales_invoices.id', + to: 'payment_receives_entries.invoice_id', + }, + }, }; } @@ -292,7 +308,7 @@ export default class SaleInvoice extends TenantModel { * @param {Numeric} amount */ static async changePaymentAmount(invoiceId, amount) { - const changeMethod = amount > 0 ? "increment" : "decrement"; + const changeMethod = amount > 0 ? 'increment' : 'decrement'; await this.query() .where('id', invoiceId) @@ -305,86 +321,86 @@ export default class SaleInvoice extends TenantModel { static get fields() { return { customer: { - label: "Customer", - column: "customer_id", - relation: "contacts.id", - relationColumn: "contacts.displayName", + label: 'Customer', + column: 'customer_id', + relation: 'contacts.id', + relationColumn: 'contacts.displayName', - fieldType: "options", - optionsResource: "customers", - optionsKey: "id", - optionsLable: "displayName", + fieldType: 'options', + optionsResource: 'customers', + optionsKey: 'id', + optionsLable: 'displayName', }, invoice_date: { - label: "Invoice date", - column: "invoice_date", - columnType: "date", - fieldType: "date", + label: 'Invoice date', + column: 'invoice_date', + columnType: 'date', + fieldType: 'date', }, due_date: { - label: "Due date", - column: "due_date", - columnType: "date", - fieldType: "date", + label: 'Due date', + column: 'due_date', + columnType: 'date', + fieldType: 'date', }, invoice_no: { - label: "Invoice No.", - column: "invoice_no", - columnType: "number", - fieldType: "number", + label: 'Invoice No.', + column: 'invoice_no', + columnType: 'number', + fieldType: 'number', }, reference_no: { - label: "Reference No.", - column: "reference_no", - columnType: "number", - fieldType: "number", + label: 'Reference No.', + column: 'reference_no', + columnType: 'number', + fieldType: 'number', }, invoice_message: { - label: "Invoice message", - column: "invoice_message", - columnType: "text", - fieldType: "text", + label: 'Invoice message', + column: 'invoice_message', + columnType: 'text', + fieldType: 'text', }, terms_conditions: { - label: "Terms & conditions", - column: "terms_conditions", - columnType: "text", - fieldType: "text", + label: 'Terms & conditions', + column: 'terms_conditions', + columnType: 'text', + fieldType: 'text', }, invoice_amount: { - label: "Invoice amount", - column: "invoice_amount", - columnType: "number", - fieldType: "number", + label: 'Invoice amount', + column: 'invoice_amount', + columnType: 'number', + fieldType: 'number', }, payment_amount: { - label: "Payment amount", - column: "payment_amount", - columnType: "number", - fieldType: "number", + label: 'Payment amount', + column: 'payment_amount', + columnType: 'number', + fieldType: 'number', }, balance: { - label: "Balance", - column: "balance", - columnType: "number", - fieldType: "number", + label: 'Balance', + column: 'balance', + columnType: 'number', + fieldType: 'number', }, due_amount: { - label: "Due amount", - column: "due_amount", - columnType: "number", - fieldType: "number", + label: 'Due amount', + column: 'due_amount', + columnType: 'number', + fieldType: 'number', sortQuery(query, role) { query.modify('sortByDueAmount', role.order); }, }, created_at: { - label: "Created at", - column: "created_at", - columnType: "date", + label: 'Created at', + column: 'created_at', + columnType: 'date', }, status: { - label: "Status", + label: 'Status', options: [ { key: 'draft', label: 'Draft' }, { key: 'delivered', label: 'Delivered' }, @@ -398,20 +414,20 @@ export default class SaleInvoice extends TenantModel { case 'draft': query.modify('draft'); break; - case "delivered": - query.modify("delivered"); + case 'delivered': + query.modify('delivered'); break; - case "unpaid": - query.modify("unpaid"); + case 'unpaid': + query.modify('unpaid'); break; - case "overdue": - query.modify("overdue"); + case 'overdue': + query.modify('overdue'); break; - case "partially-paid": - query.modify("partiallyPaid"); + case 'partially-paid': + query.modify('partiallyPaid'); break; - case "paid": - query.modify("paid"); + case 'paid': + query.modify('paid'); break; } },