Files
bigcapital/packages/server-nest/src/modules/TransactionItemEntry/models/ItemEntry.ts
2024-12-26 20:57:21 +02:00

244 lines
5.7 KiB
TypeScript

import { BaseModel } from '@/models/Model';
import {
getExlusiveTaxAmount,
getInclusiveTaxAmount,
} from '@/modules/TaxRates/utils';
export class ItemEntry extends BaseModel {
public referenceType: string;
public referenceId: string;
public index: number;
public itemId: number;
public description: string;
public sellAccountId: number;
public costAccountId: number;
public landedCost: boolean;
public allocatedCostAmount: number;
public taxRate: number;
public discount: number;
public quantity: number;
public rate: number;
public isInclusiveTax: number;
/**
* Table name.
* @returns {string}
*/
static get tableName() {
return 'items_entries';
}
/**
* Timestamps columns.
* @returns {string[]}
*/
get timestamps() {
return ['created_at', 'updated_at'];
}
/**
* Virtual attributes.
* @returns {string[]}
*/
static get virtualAttributes() {
return [
'amount',
'taxAmount',
'amountExludingTax',
'amountInclusingTax',
'total',
];
}
/**
* Item entry total.
* Amount of item entry includes tax and subtracted discount amount.
* @returns {number}
*/
get total() {
return this.amountInclusingTax;
}
/**
* Item entry amount.
* Amount of item entry that may include or exclude tax.
* @returns {number}
*/
get amount() {
return this.quantity * this.rate;
}
/**
* Item entry amount including tax.
* @returns {number}
*/
get amountInclusingTax() {
return this.isInclusiveTax ? this.amount : this.amount + this.taxAmount;
}
/**
* Item entry amount excluding tax.
* @returns {number}
*/
get amountExludingTax() {
return this.isInclusiveTax ? this.amount - this.taxAmount : this.amount;
}
/**
* Discount amount.
* @returns {number}
*/
get discountAmount() {
return this.amount * (this.discount / 100);
}
/**
* Tag rate fraction.
* @returns {number}
*/
get tagRateFraction() {
return this.taxRate / 100;
}
/**
* Tax amount withheld.
* @returns {number}
*/
get taxAmount() {
return this.isInclusiveTax
? getInclusiveTaxAmount(this.amount, this.taxRate)
: getExlusiveTaxAmount(this.amount, this.taxRate);
}
static calcAmount(itemEntry) {
const { discount, quantity, rate } = itemEntry;
const total = quantity * rate;
return discount ? total - total * discount * 0.01 : total;
}
/**
* Item entry relations.
*/
// static get relationMappings() {
// const Item = require('models/Item');
// const BillLandedCostEntry = require('models/BillLandedCostEntry');
// const SaleInvoice = require('models/SaleInvoice');
// const Bill = require('models/Bill');
// const SaleReceipt = require('models/SaleReceipt');
// const SaleEstimate = require('models/SaleEstimate');
// const ProjectTask = require('models/Task');
// const Expense = require('models/Expense');
// const TaxRate = require('models/TaxRate');
// return {
// item: {
// relation: Model.BelongsToOneRelation,
// modelClass: Item.default,
// join: {
// from: 'items_entries.itemId',
// to: 'items.id',
// },
// },
// allocatedCostEntries: {
// relation: Model.HasManyRelation,
// modelClass: BillLandedCostEntry.default,
// join: {
// from: 'items_entries.referenceId',
// to: 'bill_located_cost_entries.entryId',
// },
// },
// invoice: {
// relation: Model.BelongsToOneRelation,
// modelClass: SaleInvoice.default,
// join: {
// from: 'items_entries.referenceId',
// to: 'sales_invoices.id',
// },
// },
// bill: {
// relation: Model.BelongsToOneRelation,
// modelClass: Bill.default,
// join: {
// from: 'items_entries.referenceId',
// to: 'bills.id',
// },
// },
// estimate: {
// relation: Model.BelongsToOneRelation,
// modelClass: SaleEstimate.default,
// join: {
// from: 'items_entries.referenceId',
// to: 'sales_estimates.id',
// },
// },
// /**
// * Sale receipt reference.
// */
// receipt: {
// relation: Model.BelongsToOneRelation,
// modelClass: SaleReceipt.default,
// join: {
// from: 'items_entries.referenceId',
// to: 'sales_receipts.id',
// },
// },
// /**
// * Project task reference.
// */
// projectTaskRef: {
// relation: Model.HasManyRelation,
// modelClass: ProjectTask.default,
// join: {
// from: 'items_entries.projectRefId',
// to: 'tasks.id',
// },
// },
// /**
// * Project expense reference.
// */
// projectExpenseRef: {
// relation: Model.HasManyRelation,
// modelClass: Expense.default,
// join: {
// from: 'items_entries.projectRefId',
// to: 'expenses_transactions.id',
// },
// },
// /**
// * Project bill reference.
// */
// projectBillRef: {
// relation: Model.HasManyRelation,
// modelClass: Bill.default,
// join: {
// from: 'items_entries.projectRefId',
// to: 'bills.id',
// },
// },
// /**
// * Tax rate reference.
// */
// tax: {
// relation: Model.HasOneRelation,
// modelClass: TaxRate.default,
// join: {
// from: 'items_entries.taxRateId',
// to: 'tax_rates.id',
// },
// },
// };
// }
}