import { Service } from 'typedi'; import { ISaleInvoice, AccountNormal, ILedgerEntry, ILedger } from '@/interfaces'; import Ledger from '@/services/Accounting/Ledger'; @Service() export class SaleInvoiceWriteoffGLEntries { /** * Retrieves the invoice write-off common GL entry. * @param {ISaleInvoice} saleInvoice */ private getInvoiceWriteoffGLCommonEntry = (saleInvoice: ISaleInvoice) => { return { date: saleInvoice.invoiceDate, currencyCode: saleInvoice.currencyCode, exchangeRate: saleInvoice.exchangeRate, transactionId: saleInvoice.id, transactionType: 'InvoiceWriteOff', transactionNumber: saleInvoice.invoiceNo, referenceNo: saleInvoice.referenceNo, branchId: saleInvoice.branchId, }; }; /** * Retrieves the invoice write-off receiveable GL entry. * @param {number} ARAccountId * @param {ISaleInvoice} saleInvoice * @returns {ILedgerEntry} */ private getInvoiceWriteoffGLReceivableEntry = ( ARAccountId: number, saleInvoice: ISaleInvoice ): ILedgerEntry => { const commontEntry = this.getInvoiceWriteoffGLCommonEntry(saleInvoice); return { ...commontEntry, credit: saleInvoice.localWrittenoffAmount, accountId: ARAccountId, contactId: saleInvoice.customerId, debit: 0, index: 1, indexGroup: 300, accountNormal: saleInvoice.writtenoffExpenseAccount.accountNormal, }; }; /** * Retrieves the invoice write-off expense GL entry. * @param {ISaleInvoice} saleInvoice * @returns {ILedgerEntry} */ private getInvoiceWriteoffGLExpenseEntry = ( saleInvoice: ISaleInvoice ): ILedgerEntry => { const commontEntry = this.getInvoiceWriteoffGLCommonEntry(saleInvoice); return { ...commontEntry, debit: saleInvoice.localWrittenoffAmount, accountId: saleInvoice.writtenoffExpenseAccountId, credit: 0, index: 2, indexGroup: 300, accountNormal: AccountNormal.DEBIT, }; }; /** * Retrieves the invoice write-off GL entries. * @param {number} ARAccountId * @param {ISaleInvoice} saleInvoice * @returns {ILedgerEntry[]} */ public getInvoiceWriteoffGLEntries = ( ARAccountId: number, saleInvoice: ISaleInvoice ): ILedgerEntry[] => { const creditEntry = this.getInvoiceWriteoffGLExpenseEntry(saleInvoice); const debitEntry = this.getInvoiceWriteoffGLReceivableEntry( ARAccountId, saleInvoice ); return [debitEntry, creditEntry]; }; /** * Retrieves the invoice write-off ledger. * @param {number} ARAccountId * @param {ISaleInvoice} saleInvoice * @returns {Ledger} */ public getInvoiceWriteoffLedger = ( ARAccountId: number, saleInvoice: ISaleInvoice ): ILedger => { const entries = this.getInvoiceWriteoffGLEntries(ARAccountId, saleInvoice); return new Ledger(entries); }; }