diff --git a/packages/server/src/database/migrations/20230810191606_create_tax_rates.js b/packages/server/src/database/migrations/20230810191606_create_tax_rates.js index d83efd765..717567d16 100644 --- a/packages/server/src/database/migrations/20230810191606_create_tax_rates.js +++ b/packages/server/src/database/migrations/20230810191606_create_tax_rates.js @@ -42,6 +42,7 @@ exports.up = (knex) => { .unsigned() .references('id') .inTable('tax_rates'); + table.decimal('tax_rate').unsigned(); }); }; diff --git a/packages/server/src/interfaces/Account.ts b/packages/server/src/interfaces/Account.ts index 3d3ce47a7..4de176c37 100644 --- a/packages/server/src/interfaces/Account.ts +++ b/packages/server/src/interfaces/Account.ts @@ -77,6 +77,9 @@ export interface IAccountTransaction { projectId?: number; account?: IAccount; + + taxRateId?: number; + taxRate?: number; } export interface IAccountResponse extends IAccount {} diff --git a/packages/server/src/interfaces/Ledger.ts b/packages/server/src/interfaces/Ledger.ts index 57a17f6c5..0f6379676 100644 --- a/packages/server/src/interfaces/Ledger.ts +++ b/packages/server/src/interfaces/Ledger.ts @@ -47,7 +47,9 @@ export interface ILedgerEntry { itemId?: number; branchId?: number; projectId?: number; + taxRateId?: number; + taxRate?: number; entryId?: number; createdAt?: Date; diff --git a/packages/server/src/models/AccountTransaction.ts b/packages/server/src/models/AccountTransaction.ts index a8ad848f7..47fbd62ec 100644 --- a/packages/server/src/models/AccountTransaction.ts +++ b/packages/server/src/models/AccountTransaction.ts @@ -6,6 +6,10 @@ import { getTransactionTypeLabel } from '@/utils/transactions-types'; export default class AccountTransaction extends TenantModel { referenceType: string; + credit: number; + debit: number; + exchangeRate: number; + taxRate: number; /** * Table name @@ -28,6 +32,54 @@ export default class AccountTransaction extends TenantModel { return ['referenceTypeFormatted']; } + /** + * Retrieves the credit amount in foreign currency. + * @return {number} + */ + get creditFcy() { + return this.credit; + } + + /** + * Retrieves the debit amount in foreign currency. + * @return {number} + */ + get debitFcy() { + return this.debit; + } + + /** + * Retrieves the credit amount in base currency. + * @return {number} + */ + get creditBcy() { + return this.credit * this.exchangeRate; + } + + /** + * Retrieves the debit amount in base currency. + * @return {number} + */ + get debitBcy() { + return this.debit * this.exchangeRate; + } + + /** + * Retrieves the tax amount in foreign currency. + * @return {number} + */ + get taxAmountFcy() { + return (this.creditFcy - this.debitFcy) * this.taxRate; + } + + /** + * Retrieves the tax amount in base currency. + * @return {number} + */ + get taxAmountBcy() { + return (this.creditBcy - this.debitBcy) * this.taxRate; + } + /** * Retrieve formatted reference type. * @return {string} diff --git a/packages/server/src/services/Accounting/JournalCommands.ts b/packages/server/src/services/Accounting/JournalCommands.ts index d1c585646..ed7ad043d 100644 --- a/packages/server/src/services/Accounting/JournalCommands.ts +++ b/packages/server/src/services/Accounting/JournalCommands.ts @@ -1,10 +1,6 @@ -import moment from 'moment'; -import { castArray, sumBy, toArray } from 'lodash'; -import { IBill, ISystemUser, IAccount } from '@/interfaces'; +import { castArray } from 'lodash'; import JournalPoster from './JournalPoster'; -import JournalEntry from './JournalEntry'; -import { IExpense, IExpenseCategory } from '@/interfaces'; -import { increment } from 'utils'; + export default class JournalCommands { journal: JournalPoster; models: any; @@ -16,7 +12,6 @@ export default class JournalCommands { */ constructor(journal: JournalPoster) { this.journal = journal; - this.repositories = this.journal.repositories; this.models = this.journal.models; } diff --git a/packages/server/src/services/Accounting/Ledger.ts b/packages/server/src/services/Accounting/Ledger.ts index ffd67a97a..7cb71bed8 100644 --- a/packages/server/src/services/Accounting/Ledger.ts +++ b/packages/server/src/services/Accounting/Ledger.ts @@ -234,6 +234,9 @@ export default class Ledger implements ILedger { entryId: entry.id, branchId: entry.branchId, projectId: entry.projectId, + + taxRateId: entry.taxRateId, + taxRate: entry.taxRate, }; } diff --git a/packages/server/src/services/Accounting/utils.ts b/packages/server/src/services/Accounting/utils.ts index 45a3de94e..ee675f09c 100644 --- a/packages/server/src/services/Accounting/utils.ts +++ b/packages/server/src/services/Accounting/utils.ts @@ -32,5 +32,8 @@ export const transformLedgerEntryToTransaction = ( projectId: entry.projectId, costable: entry.costable, + + taxRateId: entry.taxRateId, + taxRate: entry.taxRate, }; }; diff --git a/packages/server/src/services/Sales/Invoices/InvoiceGLEntries.ts b/packages/server/src/services/Sales/Invoices/InvoiceGLEntries.ts index 8371aed86..6017e643e 100644 --- a/packages/server/src/services/Sales/Invoices/InvoiceGLEntries.ts +++ b/packages/server/src/services/Sales/Invoices/InvoiceGLEntries.ts @@ -53,7 +53,7 @@ export class SaleInvoiceGLEntries { saleInvoice, ARAccount.id, taxPayableAccount.id - ); + ); // Commits the ledger entries to the storage as UOW. await this.ledegrRepository.commit(tenantId, ledger, trx); }; @@ -190,6 +190,8 @@ export class SaleInvoiceGLEntries { itemQuantity: entry.quantity, accountNormal: AccountNormal.CREDIT, projectId: entry.projectId || saleInvoice.projectId, + taxRateId: entry.taxRateId, + taxRate: entry.taxRate, }; } ); @@ -201,15 +203,22 @@ export class SaleInvoiceGLEntries { * @returns {ILedgerEntry} */ private getInvoiceTaxEntry = R.curry( - (saleInvoice: ISaleInvoice, taxPayableAccountId: number): ILedgerEntry => { + ( + saleInvoice: ISaleInvoice, + taxPayableAccountId: number, + entry: IItemEntry, + index: number + ): ILedgerEntry => { const commonEntry = this.getInvoiceGLCommonEntry(saleInvoice); return { ...commonEntry, - credit: saleInvoice.taxAmountWithheld, + credit: entry.taxAmount, accountId: taxPayableAccountId, - index: saleInvoice.entries.length + 3, + index: index + 3, accountNormal: AccountNormal.CREDIT, + taxRateId: entry.taxRateId, + taxRate : entry.taxRate, }; } ); @@ -230,10 +239,13 @@ export class SaleInvoiceGLEntries { ARAccountId ); const transformItemEntry = this.getInvoiceItemEntry(saleInvoice); - + const transformTaxEntry = this.getInvoiceTaxEntry( + saleInvoice, + taxPayableAccountId + ); const creditEntries = saleInvoice.entries.map(transformItemEntry); - const taxEntry = this.getInvoiceTaxEntry(saleInvoice, taxPayableAccountId); + const taxEntries = saleInvoice.entries.map(transformTaxEntry); - return [receivableEntry, ...creditEntries, taxEntry]; + return [receivableEntry, ...creditEntries, ...taxEntries]; }; } diff --git a/packages/server/src/services/Sales/PaymentReceives/PaymentReceivesApplication.ts b/packages/server/src/services/Sales/PaymentReceives/PaymentReceivesApplication.ts index 3b5057ed9..afeca6010 100644 --- a/packages/server/src/services/Sales/PaymentReceives/PaymentReceivesApplication.ts +++ b/packages/server/src/services/Sales/PaymentReceives/PaymentReceivesApplication.ts @@ -87,7 +87,7 @@ export class PaymentReceivesApplication { } /** - * deletes the given payment receive. + * Deletes the given payment receive. * @param {number} tenantId * @param {number} paymentReceiveId * @param {ISystemUser} authorizedUser @@ -126,7 +126,7 @@ export class PaymentReceivesApplication { } /** - * + * Retrieves the given payment receive. * @param {number} tenantId * @param {number} paymentReceiveId * @returns {Promise}