mirror of
https://github.com/frappe/books.git
synced 2024-12-23 11:29:03 +00:00
102 lines
2.4 KiB
TypeScript
102 lines
2.4 KiB
TypeScript
import { Doc } from 'fyo/model/doc';
|
|
import {
|
|
FiltersMap,
|
|
FormulaMap,
|
|
ReadOnlyMap,
|
|
RequiredMap,
|
|
} from 'fyo/model/types';
|
|
import { ModelNameEnum } from 'models/types';
|
|
import { Money } from 'pesa';
|
|
import { StockMovement } from './StockMovement';
|
|
import { MovementType } from './types';
|
|
|
|
export class StockMovementItem extends Doc {
|
|
name?: string;
|
|
item?: string;
|
|
fromLocation?: string;
|
|
toLocation?: string;
|
|
quantity?: number;
|
|
rate?: Money;
|
|
amount?: Money;
|
|
parentdoc?: StockMovement;
|
|
|
|
get isIssue() {
|
|
return this.parentdoc?.movementType === MovementType.MaterialIssue;
|
|
}
|
|
|
|
get isReceipt() {
|
|
return this.parentdoc?.movementType === MovementType.MaterialReceipt;
|
|
}
|
|
|
|
get isTransfer() {
|
|
return this.parentdoc?.movementType === MovementType.MaterialTransfer;
|
|
}
|
|
|
|
static filters: FiltersMap = {
|
|
item: () => ({ trackItem: true }),
|
|
};
|
|
|
|
formulas: FormulaMap = {
|
|
rate: {
|
|
formula: async () => {
|
|
if (!this.item) {
|
|
return this.rate;
|
|
}
|
|
|
|
return await this.fyo.getValue(ModelNameEnum.Item, this.item, 'rate');
|
|
},
|
|
dependsOn: ['item'],
|
|
},
|
|
amount: {
|
|
formula: () => this.rate!.mul(this.quantity!),
|
|
dependsOn: ['item', 'rate', 'quantity'],
|
|
},
|
|
fromLocation: {
|
|
formula: (fn) => {
|
|
if (this.isReceipt || this.isTransfer) {
|
|
return null;
|
|
}
|
|
|
|
const defaultLocation = this.fyo.singles.InventorySettings
|
|
?.defaultLocation as string | undefined;
|
|
if (defaultLocation && !this.location && this.isIssue) {
|
|
return defaultLocation;
|
|
}
|
|
|
|
return this.toLocation;
|
|
},
|
|
dependsOn: ['movementType'],
|
|
},
|
|
toLocation: {
|
|
formula: (fn) => {
|
|
if (this.isIssue || this.isTransfer) {
|
|
return null;
|
|
}
|
|
|
|
const defaultLocation = this.fyo.singles.InventorySettings
|
|
?.defaultLocation as string | undefined;
|
|
if (defaultLocation && !this.location && this.isReceipt) {
|
|
return defaultLocation;
|
|
}
|
|
|
|
return this.toLocation;
|
|
},
|
|
dependsOn: ['movementType'],
|
|
},
|
|
};
|
|
|
|
required: RequiredMap = {
|
|
fromLocation: () => this.isIssue || this.isTransfer,
|
|
toLocation: () => this.isReceipt || this.isTransfer,
|
|
};
|
|
|
|
readOnly: ReadOnlyMap = {
|
|
fromLocation: () => this.isReceipt,
|
|
toLocation: () => this.isIssue,
|
|
};
|
|
|
|
static createFilters: FiltersMap = {
|
|
item: () => ({ trackItem: true, itemType: 'Product' }),
|
|
};
|
|
}
|