mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-15 04:10:32 +00:00
244 lines
5.6 KiB
TypeScript
244 lines
5.6 KiB
TypeScript
import { Model, mixin } from 'objection';
|
|
import TenantModel from 'models/TenantModel';
|
|
import { buildFilterQuery } from '@/lib/ViewRolesBuilder';
|
|
import ItemSettings from './Item.Settings';
|
|
import ModelSetting from './ModelSetting';
|
|
import CustomViewBaseModel from './CustomViewBaseModel';
|
|
import { DEFAULT_VIEWS } from '@/services/Items/constants';
|
|
import ModelSearchable from './ModelSearchable';
|
|
|
|
export default class Item extends mixin(TenantModel, [
|
|
ModelSetting,
|
|
CustomViewBaseModel,
|
|
ModelSearchable,
|
|
]) {
|
|
/**
|
|
* Table name
|
|
*/
|
|
static get tableName() {
|
|
return 'items';
|
|
}
|
|
|
|
/**
|
|
* Model timestamps.
|
|
*/
|
|
get timestamps() {
|
|
return ['createdAt', 'updatedAt'];
|
|
}
|
|
|
|
/**
|
|
* Allows to mark model as resourceable to viewable and filterable.
|
|
*/
|
|
static get resourceable() {
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Model modifiers.
|
|
*/
|
|
static get modifiers() {
|
|
return {
|
|
sortBy(query, columnSort, sortDirection) {
|
|
query.orderBy(columnSort, sortDirection);
|
|
},
|
|
viewRolesBuilder(query, conditions, logicExpression) {
|
|
buildFilterQuery(Item.tableName, conditions, logicExpression)(query);
|
|
},
|
|
|
|
/**
|
|
* Inactive/Active mode.
|
|
*/
|
|
inactiveMode(query, active = false) {
|
|
query.where('items.active', !active);
|
|
},
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/
|
|
static get relationMappings() {
|
|
const Media = require('models/Media');
|
|
const Account = require('models/Account');
|
|
const ItemCategory = require('models/ItemCategory');
|
|
const ItemWarehouseQuantity = require('models/ItemWarehouseQuantity');
|
|
const ItemEntry = require('models/ItemEntry');
|
|
const WarehouseTransferEntry = require('models/WarehouseTransferEntry');
|
|
const InventoryAdjustmentEntry = require('models/InventoryAdjustmentEntry');
|
|
const TaxRate = require('models/TaxRate');
|
|
|
|
return {
|
|
/**
|
|
* Item may belongs to cateogory model.
|
|
*/
|
|
category: {
|
|
relation: Model.BelongsToOneRelation,
|
|
modelClass: ItemCategory.default,
|
|
join: {
|
|
from: 'items.categoryId',
|
|
to: 'items_categories.id',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Item may belongs to cost account.
|
|
*/
|
|
costAccount: {
|
|
relation: Model.BelongsToOneRelation,
|
|
modelClass: Account.default,
|
|
join: {
|
|
from: 'items.costAccountId',
|
|
to: 'accounts.id',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Item may belongs to sell account.
|
|
*/
|
|
sellAccount: {
|
|
relation: Model.BelongsToOneRelation,
|
|
modelClass: Account.default,
|
|
join: {
|
|
from: 'items.sellAccountId',
|
|
to: 'accounts.id',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Item may belongs to inventory account.
|
|
*/
|
|
inventoryAccount: {
|
|
relation: Model.BelongsToOneRelation,
|
|
modelClass: Account.default,
|
|
join: {
|
|
from: 'items.inventoryAccountId',
|
|
to: 'accounts.id',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Item has many warehouses quantities.
|
|
*/
|
|
itemWarehouses: {
|
|
relation: Model.HasManyRelation,
|
|
modelClass: ItemWarehouseQuantity.default,
|
|
join: {
|
|
from: 'items.id',
|
|
to: 'items_warehouses_quantity.itemId',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Item may has many item entries.
|
|
*/
|
|
itemEntries: {
|
|
relation: Model.HasManyRelation,
|
|
modelClass: ItemEntry.default,
|
|
join: {
|
|
from: 'items.id',
|
|
to: 'items_entries.itemId',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Item may has many warehouses transfers entries.
|
|
*/
|
|
warehousesTransfersEntries: {
|
|
relation: Model.HasManyRelation,
|
|
modelClass: WarehouseTransferEntry.default,
|
|
join: {
|
|
from: 'items.id',
|
|
to: 'warehouses_transfers_entries.itemId',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Item has many inventory adjustment entries.
|
|
*/
|
|
inventoryAdjustmentsEntries: {
|
|
relation: Model.HasManyRelation,
|
|
modelClass: InventoryAdjustmentEntry.default,
|
|
join: {
|
|
from: 'items.id',
|
|
to: 'inventory_adjustments_entries.itemId',
|
|
},
|
|
},
|
|
|
|
/**
|
|
*
|
|
*/
|
|
media: {
|
|
relation: Model.ManyToManyRelation,
|
|
modelClass: Media.default,
|
|
join: {
|
|
from: 'items.id',
|
|
through: {
|
|
from: 'media_links.model_id',
|
|
to: 'media_links.media_id',
|
|
},
|
|
to: 'media.id',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Item may has sell tax rate.
|
|
*/
|
|
sellTaxRate: {
|
|
relation: Model.BelongsToOneRelation,
|
|
modelClass: TaxRate.default,
|
|
join: {
|
|
from: 'items.sellTaxRateId',
|
|
to: 'tax_rates.id',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Item may has purchase tax rate.
|
|
*/
|
|
purchaseTaxRate: {
|
|
relation: Model.BelongsToOneRelation,
|
|
modelClass: TaxRate.default,
|
|
join: {
|
|
from: 'items.purchaseTaxRateId',
|
|
to: 'tax_rates.id',
|
|
},
|
|
},
|
|
};
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
static get secureDeleteRelations() {
|
|
return [
|
|
'itemEntries',
|
|
'inventoryAdjustmentsEntries',
|
|
'warehousesTransfersEntries',
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Model settings.
|
|
*/
|
|
static get meta() {
|
|
return ItemSettings;
|
|
}
|
|
|
|
/**
|
|
* Retrieve the default custom views, roles and columns.
|
|
*/
|
|
static get defaultViews() {
|
|
return DEFAULT_VIEWS;
|
|
}
|
|
|
|
/**
|
|
* Model search roles.
|
|
*/
|
|
static get searchRoles() {
|
|
return [
|
|
{ fieldKey: 'name', comparator: 'contains' },
|
|
{ condition: 'or', fieldKey: 'code', comparator: 'like' },
|
|
];
|
|
}
|
|
}
|