mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-18 05:40:31 +00:00
289 lines
8.4 KiB
TypeScript
289 lines
8.4 KiB
TypeScript
// import moment from 'moment';
|
|
// import { sumBy } from 'lodash';
|
|
// import { Knex } from 'knex';
|
|
// import { Inject, Service } from 'typedi';
|
|
// import * as R from 'ramda';
|
|
// import { AccountNormal, IBill, IItemEntry, ILedgerEntry } from '@/interfaces';
|
|
// import HasTenancyService from '@/services/Tenancy/TenancyService';
|
|
// import Ledger from '@/services/Accounting/Ledger';
|
|
// import LedgerStorageService from '@/services/Accounting/LedgerStorageService';
|
|
// import ItemsEntriesService from '@/services/Items/ItemsEntriesService';
|
|
|
|
// @Service()
|
|
// export class BillGLEntries {
|
|
// @Inject()
|
|
// private tenancy: HasTenancyService;
|
|
|
|
// @Inject()
|
|
// private ledgerStorage: LedgerStorageService;
|
|
|
|
// @Inject()
|
|
// private itemsEntriesService: ItemsEntriesService;
|
|
|
|
// /**
|
|
// * Creates bill GL entries.
|
|
// * @param {number} tenantId -
|
|
// * @param {number} billId -
|
|
// * @param {Knex.Transaction} trx -
|
|
// */
|
|
// public writeBillGLEntries = async (
|
|
// tenantId: number,
|
|
// billId: number,
|
|
// trx?: Knex.Transaction
|
|
// ) => {
|
|
// const { accountRepository } = this.tenancy.repositories(tenantId);
|
|
// const { Bill } = this.tenancy.models(tenantId);
|
|
|
|
// // Retrieves bill with associated entries and landed costs.
|
|
// const bill = await Bill.query(trx)
|
|
// .findById(billId)
|
|
// .withGraphFetched('entries.item')
|
|
// .withGraphFetched('entries.allocatedCostEntries')
|
|
// .withGraphFetched('locatedLandedCosts.allocateEntries');
|
|
|
|
// // Finds or create a A/P account based on the given currency.
|
|
// const APAccount = await accountRepository.findOrCreateAccountsPayable(
|
|
// bill.currencyCode,
|
|
// {},
|
|
// trx
|
|
// );
|
|
// // Find or create tax payable account.
|
|
// const taxPayableAccount = await accountRepository.findOrCreateTaxPayable(
|
|
// {},
|
|
// trx
|
|
// );
|
|
// const billLedger = this.getBillLedger(
|
|
// bill,
|
|
// APAccount.id,
|
|
// taxPayableAccount.id
|
|
// );
|
|
// // Commit the GL enties on the storage.
|
|
// await this.ledgerStorage.commit(tenantId, billLedger, trx);
|
|
// };
|
|
|
|
// /**
|
|
// * Reverts the given bill GL entries.
|
|
// * @param {number} tenantId
|
|
// * @param {number} billId
|
|
// * @param {Knex.Transaction} trx
|
|
// */
|
|
// public revertBillGLEntries = async (
|
|
// tenantId: number,
|
|
// billId: number,
|
|
// trx?: Knex.Transaction
|
|
// ) => {
|
|
// await this.ledgerStorage.deleteByReference(tenantId, billId, 'Bill', trx);
|
|
// };
|
|
|
|
// /**
|
|
// * Rewrites the given bill GL entries.
|
|
// * @param {number} tenantId
|
|
// * @param {number} billId
|
|
// * @param {Knex.Transaction} trx
|
|
// */
|
|
// public rewriteBillGLEntries = async (
|
|
// tenantId: number,
|
|
// billId: number,
|
|
// trx?: Knex.Transaction
|
|
// ) => {
|
|
// // Reverts the bill GL entries.
|
|
// await this.revertBillGLEntries(tenantId, billId, trx);
|
|
|
|
// // Writes the bill GL entries.
|
|
// await this.writeBillGLEntries(tenantId, billId, trx);
|
|
// };
|
|
|
|
// /**
|
|
// * Retrieves the bill common entry.
|
|
// * @param {IBill} bill
|
|
// * @returns {ILedgerEntry}
|
|
// */
|
|
// private getBillCommonEntry = (bill: IBill) => {
|
|
// return {
|
|
// debit: 0,
|
|
// credit: 0,
|
|
// currencyCode: bill.currencyCode,
|
|
// exchangeRate: bill.exchangeRate || 1,
|
|
|
|
// transactionId: bill.id,
|
|
// transactionType: 'Bill',
|
|
|
|
// date: moment(bill.billDate).format('YYYY-MM-DD'),
|
|
// userId: bill.userId,
|
|
|
|
// referenceNumber: bill.referenceNo,
|
|
// transactionNumber: bill.billNumber,
|
|
|
|
// branchId: bill.branchId,
|
|
// projectId: bill.projectId,
|
|
|
|
// createdAt: bill.createdAt,
|
|
// };
|
|
// };
|
|
|
|
// /**
|
|
// * Retrieves the bill item inventory/cost entry.
|
|
// * @param {IBill} bill -
|
|
// * @param {IItemEntry} entry -
|
|
// * @param {number} index -
|
|
// */
|
|
// private getBillItemEntry = R.curry(
|
|
// (bill: IBill, entry: IItemEntry, index: number): ILedgerEntry => {
|
|
// const commonJournalMeta = this.getBillCommonEntry(bill);
|
|
|
|
// const localAmount = bill.exchangeRate * entry.amountExludingTax;
|
|
// const landedCostAmount = sumBy(entry.allocatedCostEntries, 'cost');
|
|
|
|
// return {
|
|
// ...commonJournalMeta,
|
|
// debit: localAmount + landedCostAmount,
|
|
// accountId:
|
|
// ['inventory'].indexOf(entry.item.type) !== -1
|
|
// ? entry.item.inventoryAccountId
|
|
// : entry.costAccountId,
|
|
// index: index + 1,
|
|
// indexGroup: 10,
|
|
// itemId: entry.itemId,
|
|
// itemQuantity: entry.quantity,
|
|
// accountNormal: AccountNormal.DEBIT,
|
|
// };
|
|
// }
|
|
// );
|
|
|
|
// /**
|
|
// * Retrieves the bill landed cost entry.
|
|
// * @param {IBill} bill -
|
|
// * @param {} landedCost -
|
|
// * @param {number} index -
|
|
// */
|
|
// private getBillLandedCostEntry = R.curry(
|
|
// (bill: IBill, landedCost, index: number): ILedgerEntry => {
|
|
// const commonJournalMeta = this.getBillCommonEntry(bill);
|
|
|
|
// return {
|
|
// ...commonJournalMeta,
|
|
// credit: landedCost.amount,
|
|
// accountId: landedCost.costAccountId,
|
|
// accountNormal: AccountNormal.DEBIT,
|
|
// index: 1,
|
|
// indexGroup: 20,
|
|
// };
|
|
// }
|
|
// );
|
|
|
|
// /**
|
|
// * Retrieves the bill payable entry.
|
|
// * @param {number} payableAccountId
|
|
// * @param {IBill} bill
|
|
// * @returns {ILedgerEntry}
|
|
// */
|
|
// private getBillPayableEntry = (
|
|
// payableAccountId: number,
|
|
// bill: IBill
|
|
// ): ILedgerEntry => {
|
|
// const commonJournalMeta = this.getBillCommonEntry(bill);
|
|
|
|
// return {
|
|
// ...commonJournalMeta,
|
|
// credit: bill.totalLocal,
|
|
// accountId: payableAccountId,
|
|
// contactId: bill.vendorId,
|
|
// accountNormal: AccountNormal.CREDIT,
|
|
// index: 1,
|
|
// indexGroup: 5,
|
|
// };
|
|
// };
|
|
|
|
// /**
|
|
// * Retrieves the bill tax GL entry.
|
|
// * @param {IBill} bill -
|
|
// * @param {number} taxPayableAccountId -
|
|
// * @param {IItemEntry} entry -
|
|
// * @param {number} index -
|
|
// * @returns {ILedgerEntry}
|
|
// */
|
|
// private getBillTaxEntry = R.curry(
|
|
// (
|
|
// bill: IBill,
|
|
// taxPayableAccountId: number,
|
|
// entry: IItemEntry,
|
|
// index: number
|
|
// ): ILedgerEntry => {
|
|
// const commonJournalMeta = this.getBillCommonEntry(bill);
|
|
|
|
// return {
|
|
// ...commonJournalMeta,
|
|
// debit: entry.taxAmount,
|
|
// index,
|
|
// indexGroup: 30,
|
|
// accountId: taxPayableAccountId,
|
|
// accountNormal: AccountNormal.CREDIT,
|
|
// taxRateId: entry.taxRateId,
|
|
// taxRate: entry.taxRate,
|
|
// };
|
|
// }
|
|
// );
|
|
|
|
// /**
|
|
// * Retrieves the bill tax GL entries.
|
|
// * @param {IBill} bill
|
|
// * @param {number} taxPayableAccountId
|
|
// * @returns {ILedgerEntry[]}
|
|
// */
|
|
// private getBillTaxEntries = (bill: IBill, taxPayableAccountId: number) => {
|
|
// // Retrieves the non-zero tax entries.
|
|
// const nonZeroTaxEntries = this.itemsEntriesService.getNonZeroEntries(
|
|
// bill.entries
|
|
// );
|
|
// const transformTaxEntry = this.getBillTaxEntry(bill, taxPayableAccountId);
|
|
|
|
// return nonZeroTaxEntries.map(transformTaxEntry);
|
|
// };
|
|
|
|
// /**
|
|
// * Retrieves the given bill GL entries.
|
|
// * @param {IBill} bill
|
|
// * @param {number} payableAccountId
|
|
// * @returns {ILedgerEntry[]}
|
|
// */
|
|
// private getBillGLEntries = (
|
|
// bill: IBill,
|
|
// payableAccountId: number,
|
|
// taxPayableAccountId: number
|
|
// ): ILedgerEntry[] => {
|
|
// const payableEntry = this.getBillPayableEntry(payableAccountId, bill);
|
|
|
|
// const itemEntryTransformer = this.getBillItemEntry(bill);
|
|
// const landedCostTransformer = this.getBillLandedCostEntry(bill);
|
|
|
|
// const itemsEntries = bill.entries.map(itemEntryTransformer);
|
|
// const landedCostEntries = bill.locatedLandedCosts.map(
|
|
// landedCostTransformer
|
|
// );
|
|
// const taxEntries = this.getBillTaxEntries(bill, taxPayableAccountId);
|
|
|
|
// // Allocate cost entries journal entries.
|
|
// return [payableEntry, ...itemsEntries, ...landedCostEntries, ...taxEntries];
|
|
// };
|
|
|
|
// /**
|
|
// * Retrieves the given bill ledger.
|
|
// * @param {IBill} bill
|
|
// * @param {number} payableAccountId
|
|
// * @returns {Ledger}
|
|
// */
|
|
// private getBillLedger = (
|
|
// bill: IBill,
|
|
// payableAccountId: number,
|
|
// taxPayableAccountId: number
|
|
// ) => {
|
|
// const entries = this.getBillGLEntries(
|
|
// bill,
|
|
// payableAccountId,
|
|
// taxPayableAccountId
|
|
// );
|
|
|
|
// return new Ledger(entries);
|
|
// };
|
|
// }
|