19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:29:53 +01:00
parent 6e54c1af6c
commit 3ca647e428
1087 changed files with 132065 additions and 108499 deletions

View file

@ -0,0 +1,359 @@
import { test, describe, expect } from "@odoo/hoot";
import { tick } from "@odoo/hoot-mock";
import { setupPosEnv, getFilledOrder } from "@point_of_sale/../tests/unit/utils";
import { definePosModels } from "@point_of_sale/../tests/unit/data/generate_model_definitions";
import { addProductLineToOrder } from "@pos_loyalty/../tests/unit/utils";
definePosModels();
const { DateTime } = luxon;
describe("pos.order - loyalty", () => {
test("_getIgnoredProductIdsTotalDiscount", async () => {
const store = await setupPosEnv();
const order = store.addNewOrder();
const ignoredProductIds = order._getIgnoredProductIdsTotalDiscount();
expect(ignoredProductIds.length).toBeGreaterThan(0);
});
test("getOrderlines, _get_reward_lines and _get_regular_order_lines", async () => {
const store = await setupPosEnv();
const order = await getFilledOrder(store);
const [line1, line2] = order.getOrderlines();
line1.update({ is_reward_line: true });
line2.update({ is_reward_line: false, refunded_orderline_id: 123 });
// Verify getOrderlines method
const orderedLines = order.getOrderlines();
expect(orderedLines[0]).toBe(line2);
expect(orderedLines[1]).toBe(line1);
expect(orderedLines[0].is_reward_line).toBe(false);
expect(orderedLines[1].is_reward_line).toBe(true);
expect(order.getLastOrderline()).toBe(line2);
// Verify _get_reward_lines method
const rewardLines = order._get_reward_lines();
expect(rewardLines).toEqual([line1]);
expect(rewardLines[0].is_reward_line).toBe(true);
// Verify _get_regular_order_lines
const regularLine = await addProductLineToOrder(store, order);
expect(order.getOrderlines().length).toBe(3);
const regularLines = order._get_regular_order_lines();
expect(regularLines.length).toBe(2);
expect(regularLines[1].id).toBe(regularLine.id);
});
test("setPricelist", async () => {
const store = await setupPosEnv();
const models = store.models;
const order = store.addNewOrder();
const pricelist2 = models["product.pricelist"].get(2);
order.uiState.couponPointChanges = {
key1: { program_id: 1, points: 100 },
key2: { program_id: 2, points: 50 },
};
order.setPricelist(pricelist2);
const remainingKeys = Object.keys(order.uiState.couponPointChanges);
expect(remainingKeys.length).toBe(1);
expect(order.uiState.couponPointChanges[remainingKeys[0]].program_id).toBe(2);
});
test("_resetPrograms", async () => {
const store = await setupPosEnv();
const order = store.addNewOrder();
order.uiState.disabledRewards = new Set(["reward1"]);
order.uiState.codeActivatedProgramRules = ["rule1"];
order.uiState.couponPointChanges = { key1: { points: 100 } };
await addProductLineToOrder(store, order, {
is_reward_line: true,
});
order._resetPrograms();
expect(order.uiState.disabledRewards.size).toBeEmpty();
expect(order.uiState.codeActivatedProgramRules.length).toBeEmpty();
expect(order.uiState.couponPointChanges).toMatchObject({});
});
test("_programIsApplicable", async () => {
const store = await setupPosEnv();
const models = store.models;
const order = store.addNewOrder();
// Get loyalty program #1 - type = "ewallet"
const program = models["loyalty.program"].get(1);
expect(order._programIsApplicable(program)).toBe(true);
program.partner_id = false;
program.is_nominative = true;
expect(order._programIsApplicable(program)).toBe(false);
});
test("_getRealCouponPoints", async () => {
const store = await setupPosEnv();
const models = store.models;
const order = store.addNewOrder();
// Get loyalty card #1 which program_id = 1 (loyalty)
const card = models["loyalty.card"].get(1);
order.uiState.couponPointChanges = {
1: {
coupon_id: 1,
program_id: 1,
points: 25,
},
};
await addProductLineToOrder(store, order, {
is_reward_line: true,
coupon_id: card,
points_cost: 5,
});
expect(order._getRealCouponPoints(card.id)).toBe(30);
});
test("processGiftCard", async () => {
const store = await setupPosEnv();
const models = store.models;
const order = store.addNewOrder();
// Get loyalty program #3 - type = "gift_card"
const giftProgram = models["loyalty.program"].get(3);
const line = await addProductLineToOrder(store, order, {
price_unit: 10,
eWalletGiftCardProgram: giftProgram,
});
order.selected_orderline = line;
const expirationDate = DateTime.now().plus({ days: 1 }).toISODate();
order.processGiftCard("GIFT9999", 100, expirationDate);
const couponChanges = Object.values(order.uiState.couponPointChanges);
expect(couponChanges.length).toBe(1);
expect(couponChanges[0].code).toBe("GIFT9999");
expect(couponChanges[0].points).toBe(100);
expect(couponChanges[0].expiration_date).toBe(expirationDate);
expect(couponChanges[0].manual).toBe(true);
});
test("_getDiscountableOnOrder", async () => {
const store = await setupPosEnv();
const models = store.models;
const order = store.addNewOrder();
await addProductLineToOrder(store, order, {
qty: 2,
});
await addProductLineToOrder(store, order, {
price_unit: 5,
});
// Get loyalty reward #1 - type = "discount"
const reward = models["loyalty.reward"].get(1);
const result = order._getDiscountableOnOrder(reward);
expect(result.discountable).toBe(25);
});
test("_computeNItems", async () => {
const store = await setupPosEnv();
const models = store.models;
const order = await getFilledOrder(store);
// Get loyalty rule #1 - which program_id = 1 (loyalty)
const rule = models["loyalty.rule"].get(1);
expect(order.getOrderlines().length).toBe(2);
expect(order._computeNItems(rule)).toBe(5);
});
test("_canGenerateRewards", async () => {
const store = await setupPosEnv();
const models = store.models;
const order = store.addNewOrder();
await addProductLineToOrder(store, order, {
qty: 5,
});
// Get loyalty program #2 - type = "ewallet"
const program = models["loyalty.program"].get(2);
expect(order._canGenerateRewards(program, 50, 50)).toBe(true);
expect(order._canGenerateRewards(program, 30, 30)).toBe(false);
});
test("isProgramsResettable", async () => {
const store = await setupPosEnv();
const order = store.addNewOrder();
expect(order.isProgramsResettable()).toBe(false);
order.uiState.disabledRewards = [...new Set(["RULE1"])];
expect(order.isProgramsResettable()).toBe(true);
order.uiState.disabledRewards = new Set();
order.uiState.codeActivatedProgramRules.push("RULE2");
expect(order.isProgramsResettable()).toBe(true);
order.uiState.codeActivatedProgramRules = [];
order.uiState.couponPointChanges = { key1: { points: 10 } };
expect(order.isProgramsResettable()).toBe(true);
});
test("removeOrderline", async () => {
const store = await setupPosEnv();
const models = store.models;
const order = store.addNewOrder();
// Get loyalty reward #1 - type = "discount"
const reward = models["loyalty.reward"].get(1);
// Get loyalty card #1 - which program_id = 1 (loyalty)
const coupon = models["loyalty.card"].get(1);
const rewardLine = await addProductLineToOrder(store, order, {
is_reward_line: true,
reward_id: reward,
coupon_id: coupon,
reward_identifier_code: "ABC123",
});
const normalLine = await addProductLineToOrder(store, order, {
price_unit: 20,
is_reward_line: false,
});
expect(order.getOrderlines().length).toBe(2);
const result = order.removeOrderline(rewardLine);
expect(result).toBe(true);
expect(order.getOrderlines().length).toBe(1);
const remainingLines = order.getOrderlines();
expect(remainingLines.length).toBe(1);
expect(remainingLines[0].id).toBe(normalLine.id);
expect(remainingLines[0].is_reward_line).toBe(false);
});
test("isSaleDisallowed", async () => {
const store = await setupPosEnv();
const models = store.models;
const order = store.addNewOrder();
// Get loyalty program #3 - type = "gift_card"
const giftProgram = models["loyalty.program"].get(3);
const result = order.isSaleDisallowed({}, { eWalletGiftCardProgram: giftProgram });
expect(result).toBe(false);
});
test("setPartner and getLoyaltyPoints", async () => {
const store = await setupPosEnv();
const models = store.models;
const order = store.addNewOrder();
const partner1 = models["res.partner"].get(1);
const partner2 = models["res.partner"].get(3);
order.setPartner(partner1);
order.uiState.couponPointChanges = {
key1: { program_id: 5, points: 100 },
key2: { program_id: 2, points: 50 },
};
order.setPartner(partner2);
const remainingKeys = Object.keys(order.uiState.couponPointChanges);
expect(remainingKeys.length).toBe(1);
expect(order.uiState.couponPointChanges[remainingKeys[0]].program_id).toBe(2);
// Verify getLoyaltyPoints method
order.uiState.couponPointChanges = {
1: {
coupon_id: 1,
program_id: 1,
points: 25,
},
};
const loyaltyStats = order.getLoyaltyPoints();
expect(loyaltyStats.length).toBe(1);
expect(loyaltyStats[0].points.name).toBe("Points");
expect(loyaltyStats[0].points.won).toBe(25);
expect(loyaltyStats[0].points.balance).toBe(10);
});
test("getLoyaltyPoints adapts to qty decreasing", async () => {
const store = await setupPosEnv();
const models = store.models;
const order = store.addNewOrder();
const partner1 = models["res.partner"].get(1);
order.setPartner(partner1);
await store.orderUpdateLoyaltyPrograms();
const reward = models["loyalty.reward"].get(3);
const loyalty_card = models["loyalty.card"].get(4);
const line = await addProductLineToOrder(store, order, {
productId: 10,
templateId: 10,
qty: 3,
});
await store.orderUpdateLoyaltyPrograms();
order._applyReward(reward, loyalty_card.id);
const loyaltyStats = order.getLoyaltyPoints();
expect(loyaltyStats[0].points.won).toBe(0);
expect(loyaltyStats[0].points.spent).toBe(3);
expect(loyaltyStats[0].points.total).toBe(0);
expect(loyaltyStats[0].points.balance).toBe(3);
line.setQuantity(2);
await store.updateRewards();
await tick();
const loyaltyStats2 = order.getLoyaltyPoints();
expect(loyaltyStats2[0].points.won).toBe(0);
expect(loyaltyStats2[0].points.spent).toBe(2);
expect(loyaltyStats2[0].points.total).toBe(1);
expect(loyaltyStats2[0].points.balance).toBe(3);
});
test("reward amount tax included cheapest product", async () => {
const store = await setupPosEnv();
const order = store.addNewOrder();
const line = await addProductLineToOrder(store, order, {
productId: 24,
templateId: 24,
qty: 1,
});
expect(line.prices.total_included).toBe(10);
expect(line.prices.total_excluded).toBe(8.7);
await store.updateRewards();
await tick();
expect(order.getOrderlines().length).toBe(2);
const rewardLine = order._get_reward_lines()[0];
expect(rewardLine.prices.total_included).toBe(-10);
});
});

View file

@ -0,0 +1,59 @@
import { test, describe, expect } from "@odoo/hoot";
import { setupPosEnv } from "@point_of_sale/../tests/unit/utils";
import { definePosModels } from "@point_of_sale/../tests/unit/data/generate_model_definitions";
import { addProductLineToOrder } from "@pos_loyalty/../tests/unit/utils";
definePosModels();
describe("pos.order.line - loyalty", () => {
test("getEWalletGiftCardProgramType", async () => {
const store = await setupPosEnv();
const models = store.models;
const order = store.addNewOrder();
// Get loyalty program #2 - type = "ewallet"
const program = models["loyalty.program"].get(2);
const line = await addProductLineToOrder(store, order, {
_e_wallet_program_id: program,
});
expect(line.getEWalletGiftCardProgramType()).toBe(`${program.program_type}`);
});
test("ignoreLoyaltyPoints", async () => {
const store = await setupPosEnv();
const models = store.models;
const order = store.addNewOrder();
// Get loyalty program #2 - type = "ewallet"
const programA = models["loyalty.program"].get(2);
// Get loyalty program #4 - type = "ewallet"
const programB = models["loyalty.program"].get(4);
const line = await addProductLineToOrder(store, order);
line.update({ _e_wallet_program_id: programB });
expect(line.ignoreLoyaltyPoints({ program: programA })).toBe(true);
});
test("getGiftCardOrEWalletBalance", async () => {
const store = await setupPosEnv();
const models = store.models;
// Get loyalty card #3 which program_id = 3 (gift_card)
const card = models["loyalty.card"].get(3);
const order = store.addNewOrder();
const line = await addProductLineToOrder(store, order, {
is_reward_line: true,
coupon_id: card,
});
const balance = line.getGiftCardOrEWalletBalance();
expect(balance).toBeOfType("string");
expect(balance).toMatch(new RegExp(`${card.points}`));
});
});