mirror of
https://github.com/frappe/books.git
synced 2026-08-24 10:04:45 -05:00
60 lines
1.7 KiB
TypeScript
60 lines
1.7 KiB
TypeScript
import { DocValue } from 'fyo/core/types';
|
|
import { Doc } from 'fyo/model/doc';
|
|
import { FiltersMap, ListViewSettings, ValidationMap } from 'fyo/model/types';
|
|
import { ValidationError } from 'fyo/utils/errors';
|
|
import { CollectionRulesItems } from '../CollectionRulesItems/CollectionRulesItems';
|
|
import { AccountRootTypeEnum } from '../Account/types';
|
|
import { getLoyaltyProgramStatusColumn } from '../../helpers';
|
|
|
|
export class LoyaltyProgram extends Doc {
|
|
collectionRules?: CollectionRulesItems[];
|
|
expiryDuration?: number;
|
|
maximumUse?: number;
|
|
used?: number;
|
|
status?: 'Active' | 'Expired' | 'Maxed' | 'Disabled';
|
|
|
|
validations: ValidationMap = {
|
|
used: (value: DocValue) => {
|
|
const used = value as number;
|
|
const maximumUse = this.maximumUse as number;
|
|
|
|
if (used < 0) {
|
|
throw new ValidationError('Used count cannot be negative');
|
|
}
|
|
|
|
if (maximumUse > 0 && used > maximumUse) {
|
|
throw new ValidationError('Used count cannot exceed maximum use limit');
|
|
}
|
|
},
|
|
maximumUse: (value: DocValue) => {
|
|
const maximumUse = value as number;
|
|
|
|
if (maximumUse < 0) {
|
|
throw new ValidationError('Maximum use cannot be negative');
|
|
}
|
|
},
|
|
};
|
|
|
|
async afterSubmit() {
|
|
const maximumUse = (this.maximumUse as number) || 0;
|
|
const used = (this.used as number) || 0;
|
|
|
|
if (maximumUse > 0 && used >= maximumUse) {
|
|
await this.setAndSync({ status: 'Maxed', isEnabled: false });
|
|
}
|
|
}
|
|
|
|
static filters: FiltersMap = {
|
|
expenseAccount: () => ({
|
|
rootType: AccountRootTypeEnum.Expense,
|
|
isGroup: false,
|
|
}),
|
|
};
|
|
|
|
static getListViewSettings(): ListViewSettings {
|
|
return {
|
|
columns: ['name', getLoyaltyProgramStatusColumn(), 'fromDate', 'toDate'],
|
|
};
|
|
}
|
|
}
|