Files
bigcapital/packages/server/src/modules/BillLandedCosts/models/BillLandedCost.ts
2025-06-10 17:08:32 +02:00

118 lines
3.0 KiB
TypeScript

import { Model } from 'objection';
import { lowerCase } from 'lodash';
// import TenantModel from 'models/TenantModel';
import { BaseModel } from '@/models/Model';
import { Bill } from '@/modules/Bills/models/Bill';
import { BillLandedCostEntry } from './BillLandedCostEntry';
import { ItemEntry } from '@/modules/TransactionItemEntry/models/ItemEntry';
import { ExpenseCategory } from '@/modules/Expenses/models/ExpenseCategory.model';
export class BillLandedCost extends BaseModel {
amount!: number;
fromTransactionId!: number;
fromTransactionType!: string;
fromTransactionEntryId!: number;
allocationMethod!: string;
costAccountId!: number;
description!: string;
billId!: number;
exchangeRate!: number;
currencyCode!: string;
bill!: Bill;
allocateEntries!: BillLandedCostEntry[];
allocatedFromBillEntry!: ItemEntry;
allocatedFromExpenseEntry!: ExpenseCategory;
/**
* Table name
*/
static get tableName() {
return 'bill_located_costs';
}
/**
* Model timestamps.
*/
get timestamps() {
return ['createdAt', 'updatedAt'];
}
/**
* Virtual attributes.
*/
static get virtualAttributes() {
return ['localAmount', 'allocationMethodFormatted'];
}
/**
* Retrieves the cost local amount.
* @returns {number}
*/
get localAmount() {
return this.amount * this.exchangeRate;
}
/**
* Allocation method formatted.
*/
get allocationMethodFormatted() {
const allocationMethod = lowerCase(this.allocationMethod);
const keyLabelsPairs = {
value: 'allocation_method.value.label',
quantity: 'allocation_method.quantity.label',
};
return keyLabelsPairs[allocationMethod] || '';
}
/**
* Relationship mapping.
*/
static get relationMappings() {
const { BillLandedCostEntry } = require('./BillLandedCostEntry');
const { Bill } = require('../../Bills/models/Bill');
const {
ItemEntry,
} = require('../../TransactionItemEntry/models/ItemEntry');
const {
ExpenseCategory,
} = require('../../Expenses/models/ExpenseCategory.model');
return {
bill: {
relation: Model.BelongsToOneRelation,
modelClass: Bill,
join: {
from: 'bill_located_costs.billId',
to: 'bills.id',
},
},
allocateEntries: {
relation: Model.HasManyRelation,
modelClass: BillLandedCostEntry,
join: {
from: 'bill_located_costs.id',
to: 'bill_located_cost_entries.billLocatedCostId',
},
},
allocatedFromBillEntry: {
relation: Model.BelongsToOneRelation,
modelClass: ItemEntry,
join: {
from: 'bill_located_costs.fromTransactionEntryId',
to: 'items_entries.id',
},
},
allocatedFromExpenseEntry: {
relation: Model.BelongsToOneRelation,
modelClass: ExpenseCategory,
join: {
from: 'bill_located_costs.fromTransactionEntryId',
to: 'expense_transaction_categories.id',
},
},
};
}
}