fix: expire loyalty program on maximum usage

This commit is contained in:
Gadha2311
2026-01-31 13:45:03 +05:30
parent b28df59d94
commit 446585dee7
4 changed files with 65 additions and 4 deletions
+13 -1
View File
@@ -30,6 +30,7 @@ import {
getItemVisibility,
validateLoyaltyProgram,
getLoyaltyProgramTier,
isLoyaltyProgramMaxedOut,
} from 'models/helpers';
import { StockTransfer } from 'models/inventory/StockTransfer';
import { validateBatch } from 'models/inventory/helpers';
@@ -1086,7 +1087,18 @@ export abstract class Invoice extends Transactional {
ModelNameEnum.Party,
this.party
);
return partyDoc?.loyaltyProgram as string;
const loyaltyProgramName = partyDoc?.loyaltyProgram as string;
if (!loyaltyProgramName) {
return '';
}
const maxedOut = await isLoyaltyProgramMaxedOut(
this.fyo,
loyaltyProgramName
);
return maxedOut ? '' : loyaltyProgramName;
},
dependsOn: ['party', 'name'],
},
+31
View File
@@ -1654,6 +1654,37 @@ export async function validateLoyaltyProgram(
}
}
export async function isLoyaltyProgramMaxedOut(
fyo: Fyo,
loyaltyProgramName: string
): Promise<boolean> {
if (!loyaltyProgramName) {
return false;
}
const loyaltyProgram = await fyo.db.getAll(ModelNameEnum.LoyaltyProgram, {
fields: ['maximumUse', 'used', 'isEnabled'],
filters: { name: loyaltyProgramName },
});
if (!loyaltyProgram[0]) {
return false;
}
if (!loyaltyProgram[0]?.isEnabled) {
return true;
}
const maximumUse = loyaltyProgram[0]?.maximumUse as number;
const used = loyaltyProgram[0]?.used as number;
if (!maximumUse) {
return false;
}
return used >= maximumUse;
}
export function removeFreeItems(sinvDoc: SalesInvoice) {
if (!sinvDoc || !sinvDoc.items) {
return;
+18 -2
View File
@@ -166,6 +166,7 @@ import {
removeFreeItems,
getItemRateFromPriceList,
getItemVisibility,
isLoyaltyProgramMaxedOut,
} from 'models/helpers';
import {
POSItem,
@@ -495,7 +496,21 @@ export default defineComponent({
filters: { name: value },
});
this.loyaltyProgram = party[0]?.loyaltyProgram as string;
const loyaltyProgramName = party[0]?.loyaltyProgram as string;
if (loyaltyProgramName) {
const isMaxedOut = await isLoyaltyProgramMaxedOut(
this.fyo,
loyaltyProgramName
);
if (isMaxedOut) {
this.loyaltyProgram = '';
this.loyaltyPoints = 0;
return;
}
}
this.loyaltyProgram = loyaltyProgramName;
this.loyaltyPoints = party[0]?.loyaltyPoints as number;
},
@@ -644,7 +659,8 @@ export default defineComponent({
this.fyo.singles.AccountingSettings?.enablePriceList &&
this.loyaltyPoints &&
this.sinvDoc.party &&
this.sinvDoc.items?.length
this.sinvDoc.items?.length &&
this.loyaltyProgram
) {
this.toggleModal('LoyaltyProgram', true);
}
+3 -1
View File
@@ -76,7 +76,9 @@
<div
class="relative group"
:class="{
hidden: !fyo.singles.AccountingSettings?.enableLoyaltyProgram,
hidden:
!fyo.singles.AccountingSettings?.enableLoyaltyProgram ||
!loyaltyProgram,
}"
>
<div