Fix ice bag count + default ice check-in to 1 bag
The form sends payment_ice as a descriptive label, e.g. "One Ice
ticket good for one bag per day (3 total bags)". The old parser pulled
the first number ("3") and treated it as 3 tickets, then multiplied by
3 bags/ticket → 9 bags for one ice ticket (18 for two). New
iceBagsFromPayment reads the "(N total bags)" the label states
directly, with worded-count and numeric dollar/count fallbacks for
forward compatibility. 1 ice → 3 bags, 2 → 6. 5 new tests.
Scanner: Ice mode now defaults the check-in count to 1 (a bag at a
time) instead of all remaining bags; staff can bump it up.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
49e45ff94c
commit
049f433930
4 changed files with 64 additions and 9 deletions
|
|
@ -1,5 +1,7 @@
|
|||
import { describe, it, expect } from "vitest";
|
||||
import { nameGroup, qty, selected, addressLine, readDonor } from "../fluentforms.js";
|
||||
import { nameGroup, qty, selected, addressLine, readDonor, iceBagsFromPayment } from "../fluentforms.js";
|
||||
|
||||
const ICE = { bagsPerTicket: 3, ticketPrice: 20 };
|
||||
|
||||
// Food vendors are the only vendor tickets; two pass-holder name slots.
|
||||
const FOOD_SLOTS = ["names", "names_1"];
|
||||
|
|
@ -44,6 +46,29 @@ describe("food vendor pass counting", () => {
|
|||
});
|
||||
});
|
||||
|
||||
describe("iceBagsFromPayment", () => {
|
||||
it("reads '(N total bags)' from the real form label", () => {
|
||||
expect(iceBagsFromPayment("One Ice ticket good for one bag per day (3 total bags)", ICE)).toBe(3);
|
||||
expect(iceBagsFromPayment("Two Ice tickets good for one bag per day (6 total bags)", ICE)).toBe(6);
|
||||
});
|
||||
it("falls back to a worded ice-ticket count", () => {
|
||||
expect(iceBagsFromPayment("Two Ice tickets", ICE)).toBe(6); // 2 × 3
|
||||
expect(iceBagsFromPayment("Four Ice tickets", ICE)).toBe(12);
|
||||
});
|
||||
it("falls back to a dollar total at the ticket price", () => {
|
||||
expect(iceBagsFromPayment("$40.00", ICE)).toBe(6); // 2 tickets × 3
|
||||
expect(iceBagsFromPayment(20, ICE)).toBe(3); // 1 ticket × 3
|
||||
});
|
||||
it("treats a small plain count as ticket count", () => {
|
||||
expect(iceBagsFromPayment(2, ICE)).toBe(6); // 2 tickets × 3
|
||||
});
|
||||
it("is 0 for blank / no ice", () => {
|
||||
expect(iceBagsFromPayment("", ICE)).toBe(0);
|
||||
expect(iceBagsFromPayment(undefined, ICE)).toBe(0);
|
||||
expect(iceBagsFromPayment(0, ICE)).toBe(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe("readDonor", () => {
|
||||
it("treats donor_tier=member as a donor", () => {
|
||||
expect(readDonor({ donor_tier: "member" })).toEqual({ isDonor: true, donorTier: "member" });
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue