@final-commerce/common 2.0.15 → 2.0.16-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../enums/currency.enum.ts","../enums/core.enum.ts","../enums/stripe-currencies.enum.ts","../enums/product.enum.ts","../enums/payments.enum.ts","../utils/currency.util.ts","../utils/order-totals.util.ts","../constants/pricing.constants.ts","../utils/pricing.util.ts","../utils/report-sign.util.ts","../utils/mongo.util.ts","../order-state-machine/types.ts","../order-state-machine/state-schema.ts","../order-state-machine/financial-invariants.ts","../order-state-machine/default-cross-axis-rules.ts","../order-state-machine/default-config.ts","../order-state-machine/pos-preset.ts","../order-state-machine/build-order-context.ts","../order-state-machine/display-state.ts","../order-state-machine/condition-eval.ts","../order-state-machine/engine.ts","../order-state-machine/validate-config.ts","../order-state-machine/set-order-state.ts","../order-state-machine/legacy-infer.ts","../order-state-machine/resolve-template.ts","../order-state-machine/validate-fragment.ts","../order-state-machine/merge-fragment.ts","../order-state-machine/remove-fragment.ts","../order-state-machine/actions.ts","../order-state-machine/pubsub.ts"],"sourcesContent":["/**\n * ISO 4217 Currency Code Enum\n * Contains all supported currency codes.\n */\nexport enum CurrencyCode {\n // Major currencies with 2 decimal places\n USD = 'USD',\n EUR = 'EUR',\n GBP = 'GBP',\n CAD = 'CAD',\n AUD = 'AUD',\n NZD = 'NZD',\n CHF = 'CHF',\n CNY = 'CNY',\n INR = 'INR',\n MXN = 'MXN',\n BRL = 'BRL',\n ZAR = 'ZAR',\n SGD = 'SGD',\n HKD = 'HKD',\n SEK = 'SEK',\n NOK = 'NOK',\n DKK = 'DKK',\n PLN = 'PLN',\n THB = 'THB',\n MYR = 'MYR',\n PHP = 'PHP',\n IDR = 'IDR',\n AED = 'AED',\n SAR = 'SAR',\n ILS = 'ILS',\n TRY = 'TRY',\n RUB = 'RUB',\n HTG = 'HTG',\n\n // New Currencies with 2 decimal places\n BND = 'BND', // Brunei Dollar\n CRC = 'CRC', // Costa Rican Colón\n BDT = 'BDT', // Bangladeshi Taka\n UAH = 'UAH', // Ukrainian Hryvnia\n NGN = 'NGN', // Nigerian Naira\n AFN = 'AFN', // Afghan Afghani\n ALL = 'ALL', // Albanian Lek\n AMD = 'AMD', // Armenian Dram\n ANG = 'ANG', // Netherlands Antillean Guilder\n AOA = 'AOA', // Angolan Kwanza\n ARS = 'ARS', // Argentine Peso\n AWG = 'AWG', // Aruban Florin\n AZN = 'AZN', // Azerbaijani Manat\n BAM = 'BAM', // Bosnia and Herzegovina Convertible Mark\n BBD = 'BBD', // Barbadian Dollar\n BGN = 'BGN', // Bulgarian Lev\n BMD = 'BMD', // Bermudian Dollar\n BOB = 'BOB', // Bolivian Boliviano\n BSD = 'BSD', // Bahamian Dollar\n BTN = 'BTN', // Bhutanese Ngultrum\n BWP = 'BWP', // Botswana Pula\n BYN = 'BYN', // Belarusian Ruble\n BZD = 'BZD', // Belize Dollar\n COP = 'COP', // Colombian Peso\n CZK = 'CZK', // Czech Koruna\n DOP = 'DOP', // Dominican Peso\n DZD = 'DZD', // Algerian Dinar\n EGP = 'EGP', // Egyptian Pound\n ETB = 'ETB', // Ethiopian Birr\n FJD = 'FJD', // Fijian Dollar\n GEL = 'GEL', // Georgian Lari\n GHS = 'GHS', // Ghanaian Cedi\n GTQ = 'GTQ', // Guatemalan Quetzal\n GYD = 'GYD', // Guyanese Dollar\n HNL = 'HNL', // Honduran Lempira\n IRR = 'IRR', // Iranian Rial\n JMD = 'JMD', // Jamaican Dollar\n KES = 'KES', // Kenyan Shilling\n KGS = 'KGS', // Kyrgyzstani Som\n KHR = 'KHR', // Cambodian Riel\n KYD = 'KYD', // Cayman Islands Dollar\n KZT = 'KZT', // Kazakhstani Tenge\n LAK = 'LAK', // Lao Kip\n LBP = 'LBP', // Lebanese Pound\n LKR = 'LKR', // Sri Lankan Rupee\n MAD = 'MAD', // Moroccan Dirham\n MDL = 'MDL', // Moldovan Leu\n MKD = 'MKD', // Macedonian Denar\n MMK = 'MMK', // Myanmar Kyat\n MNT = 'MNT', // Mongolian Tögrög\n MOP = 'MOP', // Macanese Pataca\n MUR = 'MUR', // Mauritian Rupee\n MVR = 'MVR', // Maldivian Rufiyaa\n MZN = 'MZN', // Mozambican Metical\n NAD = 'NAD', // Namibian Dollar\n NIO = 'NIO', // Nicaraguan Córdoba\n NPR = 'NPR', // Nepalese Rupee\n PAB = 'PAB', // Panamanian Balboa\n PEN = 'PEN', // Peruvian Sol\n PGK = 'PGK', // Papua New Guinean Kina\n PKR = 'PKR', // Pakistani Rupee\n QAR = 'QAR', // Qatari Riyal\n RON = 'RON', // Romanian Leu\n RSD = 'RSD', // Serbian Dinar\n SBD = 'SBD', // Solomon Islands Dollar\n SRD = 'SRD', // Surinamese Dollar\n SYP = 'SYP', // Syrian Pound\n TJS = 'TJS', // Tajikistani Somoni\n TMT = 'TMT', // Turkmenistani Manat\n TOP = 'TOP', // Tongan Paʻanga\n TTD = 'TTD', // Trinidad and Tobago Dollar\n TZS = 'TZS', // Tanzanian Shilling\n UYU = 'UYU', // Uruguayan Peso\n UZS = 'UZS', // Uzbekistani Som\n VES = 'VES', // Venezuelan Bolívar Soberano\n WST = 'WST', // Samoan Tala\n XCD = 'XCD', // East Caribbean Dollar\n YER = 'YER', // Yemeni Rial\n ZMW = 'ZMW', // Zambian Kwacha\n CDF = 'CDF', // Congolese Franc\n CUP = 'CUP', // Cuban Peso\n ERN = 'ERN', // Eritrean Nakfa\n FKP = 'FKP', // Falkland Islands Pound\n GIP = 'GIP', // Gibraltar Pound\n GMD = 'GMD', // Gambian Dalasi\n KPW = 'KPW', // North Korean Won\n LRD = 'LRD', // Liberian Dollar\n LSL = 'LSL', // Lesotho Loti\n MGA = 'MGA', // Malagasy Ariary\n MWK = 'MWK', // Malawian Kwacha\n SCR = 'SCR', // Seychellois Rupee\n SDG = 'SDG', // Sudanese Pound\n SHP = 'SHP', // Saint Helena Pound\n SLE = 'SLE', // Sierra Leonean Leone\n SOS = 'SOS', // Somali Shilling\n SSP = 'SSP', // South Sudanese Pound\n STN = 'STN', // São Tomé and Príncipe Dobra\n SZL = 'SZL', // Swazi Lilangeni\n VED = 'VED', // Venezuelan Bolívar Digital\n XCG = 'XCG', // Caribbean Guilder\n\n // Zero decimal currencies\n JPY = 'JPY',\n KRW = 'KRW',\n VND = 'VND',\n CLP = 'CLP',\n ISK = 'ISK',\n HUF = 'HUF',\n TWD = 'TWD',\n\n // New Currencies with 0 decimal places\n GNF = 'GNF', // Guinean Franc\n BIF = 'BIF', // Burundian Franc\n DJF = 'DJF', // Djiboutian Franc\n KMF = 'KMF', // Comoro Franc\n PYG = 'PYG', // Paraguayan Guaraní\n RWF = 'RWF', // Rwandan Franc\n UGX = 'UGX', // Ugandan Shilling\n VUV = 'VUV', // Vanuatu Vatu\n XAF = 'XAF', // Central African CFA Franc\n XOF = 'XOF', // West African CFA Franc\n XPF = 'XPF', // CFP Franc\n\n // Three decimal currencies\n KWD = 'KWD',\n BHD = 'BHD',\n OMR = 'OMR',\n JOD = 'JOD',\n TND = 'TND',\n LYD = 'LYD',\n IQD = 'IQD',\n}\n","// Dashboard\nexport enum TimePeriod {\n TODAY = 'today',\n THIS_WEEK = 'this week',\n THIS_MONTH = 'this month',\n THIS_YEAR = 'this year',\n All_TIME = 'all_time',\n}\n\nexport enum TopMetericsSort {\n TOTAL_PAYMENT_VOLUME = 'totalPaymentVolume',\n TOTAL_TRANSACTION = 'totalTransaction',\n}\n\nexport enum CompanyType {\n COMPANY = 'company',\n ROOT = 'root',\n ORGANIZATION = 'organization',\n}\n\nexport enum CustomTableAvailability {\n PUBLIC = 'public',\n ORGANIZATION = 'organization',\n}\n\nexport enum AttributeType {\n STRING = 'string',\n NUMBER = 'number',\n BOOLEAN = 'boolean',\n DATE = 'date',\n JSON_STRING = 'json-string',\n}\n\nexport enum Platform {\n WOO_COMMERCE = 'woo-commerce',\n SHOPIFY = 'shopify',\n OLIVER = 'oliver',\n STANDALONE = 'standalone',\n}\n\nexport enum OrderPlatform {\n POS = 'in-store',\n WOO_COMMERCE = 'woo-commerce',\n}\n\nexport enum CustomerPlatform {\n POS = 'in-store',\n WOO_COMMERCE = 'woo-commerce',\n}\n\nexport enum StationStatus {\n IN_USE = 'IN_USE',\n AVAILABLE = 'AVAILABLE',\n}\n\n//Inventory\nexport enum InventoryBaseActionEnum {\n ADD = 'ADD',\n REMOVE = 'REMOVE',\n RECOUNT = 'RECOUNT',\n SKIP = 'SKIP',\n}\nexport type InventoryBaseActionType = `${InventoryBaseActionEnum}`;\n\nexport enum InventorySpecificActionType {\n STOCK_RECEIVED = 'STOCK_RECEIVED',\n INVENTORY_RECOUNT = 'INVENTORY_RECOUNT',\n DAMAGE = 'DAMAGE',\n THEFT = 'THEFT',\n LOSS = 'LOSS',\n RESTOCK_RETURN = 'RESTOCK_RETURN',\n // Only for Refund events\n REFUND_RESTOCK_RETURN = 'REFUND_RESTOCK_RETURN',\n REFUND_DAMAGE = 'REFUND_DAMAGE',\n // Only for Order events @see OrderCreated triger under mongoose trigger\n SALE = 'SALE',\n // Stock transfer events\n TRANSFER = 'TRANSFER',\n BULK_RECOUNT = 'BULK_RECOUNT',\n // TODO: Move it to separate enum for woo-commerce specific actions\n APPLIED_FROM_WOO = 'APPLIED_FROM_WOO',\n PO_RECEIVED = 'PO_RECEIVED',\n}\n\nexport enum ExtensionCategory {\n SYNC = 'sync',\n PAYMENT = 'payment',\n HUB = 'hub',\n BUILDER = 'builder',\n}\n\nexport enum FeesCustomBillingStatus {\n UNPAID = 'unpaid',\n PAID = 'paid',\n OPEN = 'open',\n}\n\nexport enum PricingPlanEnum {\n DEFAULT = 'default',\n MINIMUM = 'minimum',\n ORGANIZATION = 'organization',\n PLAN = 'plan',\n COMPANY = 'company',\n}\n\nexport enum PricingLevel {\n ORG = 'org',\n PLAN = 'plan',\n DEFAULT = 'default',\n MINIMUM = 'minimum',\n}\n\nexport enum PricingRegionEnum {\n EUROPE = 'europe',\n OTHER = 'others',\n NORTH_AMERICA = 'northAmerica',\n}\n\nexport enum MenuProject {\n MANAGE = 'Manage',\n SCALE = 'Scale',\n BUILD = 'Build',\n PAY = 'Pay',\n RUN = 'Run',\n}\n\nexport enum UserTypes {\n COMPANY_OWNER = 'owner',\n ORG_USER = 'organization_user',\n ORG_OWNER = 'organization_owner',\n FINAL_USER = 'final_user',\n FINAL_OWNER = 'final_owner',\n EMPLOYEE = 'employee',\n SUPER_ADMIN = 'super_admin',\n MANAGER = 'manager',\n ADMIN = 'admin',\n ASSISTANT_MANAGER = 'assistant',\n CASHIER = 'cashier',\n RESELLER = 'reseller',\n}\n\nexport enum OwnerType {\n API_KEY = 'api-key',\n ORGANIZATION = 'organization',\n COMPANY = 'company',\n}\n\nexport enum PublicationAvailability {\n GLOBAL = 'global',\n PRIVATE = 'private',\n}\n\nexport enum PublicationStatus {\n APPROVED = 'approved',\n REJECTED = 'rejected',\n PENDING = 'pending',\n NOT_APPLICABLE = 'not_applicable',\n}\n\nexport interface PublicationConfig {\n availability: PublicationAvailability;\n status: PublicationStatus;\n}\n\nexport enum ResidualStatus {\n PAID = 'paid',\n DUE = 'due',\n ACCRUING = 'accruing',\n}\n\nexport enum PreviewImageMode {\n STATIC = 'static',\n DYNAMIC = 'dynamic',\n}\n\nexport enum LibraryItemType {\n FLOW = 'flow',\n PAGE = 'page',\n COMPOSITION = 'composition',\n LAYOUT = 'layout',\n}\n\nexport enum ResidualPaymentMethod {\n CHEQUE = 'cheque',\n}\n\nexport enum PaymentMethod {\n CUSTOM = 'Custom',\n CASH = 'Cash',\n TERMINAL = 'Terminal',\n CLOUD = 'Cloud',\n BLUETOOTH = 'Bluetooth',\n}\n\nexport enum NonRevenueItemType {\n GIFT_CARD = 'gift-card',\n}\n\nexport enum ReceiptSendChannel {\n EMAIL = 'email',\n TEXT = 'text',\n}\n\n// Discriminates a digital receipt as a sale receipt vs a refund receipt.\nexport enum ReceiptType {\n ORDER = 'order',\n REFUND = 'refund',\n}\n\nexport enum StripeStatus {\n ACTIVE = 'active', // When custom payment subscription is active\n INACTIVE = 'inactive', // When custom payment extension is uninstalled\n PAYMENT_METHOD_REQUIRED = 'payment_method_required', // Default status when a new customer is created\n PAYMENT_METHOD_ADDED = 'payment_method_added', // When Payment Method is added to the customer\n}\n\nexport enum InvoiceStatus {\n PAID = 'paid',\n PENDING = 'pending',\n EXPIRED = 'expired',\n}\n","/**\n * ISO 4217 Currency Code Enum\n * Contains all stripe supported currency codes.\n */\nexport enum StripeCurrencyCode {\n // Major currencies with 2 decimal places\n USD = 'USD',\n EUR = 'EUR',\n GBP = 'GBP',\n CAD = 'CAD',\n AUD = 'AUD',\n NZD = 'NZD',\n CHF = 'CHF',\n CNY = 'CNY',\n INR = 'INR',\n MXN = 'MXN',\n BRL = 'BRL',\n ZAR = 'ZAR',\n SGD = 'SGD',\n HKD = 'HKD',\n SEK = 'SEK',\n NOK = 'NOK',\n DKK = 'DKK',\n PLN = 'PLN',\n THB = 'THB',\n MYR = 'MYR',\n PHP = 'PHP',\n IDR = 'IDR',\n AED = 'AED',\n SAR = 'SAR',\n ILS = 'ILS',\n TRY = 'TRY',\n RUB = 'RUB',\n\n // Zero decimal currencies\n JPY = 'JPY',\n KRW = 'KRW',\n VND = 'VND',\n CLP = 'CLP',\n ISK = 'ISK',\n HUF = 'HUF',\n TWD = 'TWD',\n\n // Three decimal currencies\n KWD = 'KWD',\n BHD = 'BHD',\n OMR = 'OMR',\n JOD = 'JOD',\n TND = 'TND',\n LYD = 'LYD',\n IQD = 'IQD',\n}\n","/*\n Current supported Product Types, used in Product Schema & Most Front-End Types \n*/\nexport enum ProductType {\n SIMPLE = 'simple',\n VARIABLE = 'variable',\n}\n\n/*\n Current supported Product Status, used in Product Schema & Most Front-End Types \n*/\nexport enum ProductStatus {\n ACTIVE = 'active',\n INACTIVE = 'inactive',\n DRAFT = 'draft',\n}\n","// Acquiring processor a company's payments are routed through.\nexport enum PaymentProcessor {\n STRIPE = 'stripe',\n ADYEN = 'adyen',\n /**\n * Payment captured outside FinalPay entirely — set by third parties syncing\n * external order data in. Never written by the POS. Distinguishes \"synced\n * from elsewhere\" from an absent value (legacy FinalPay/Stripe record).\n */\n EXTERNAL = 'external',\n}\n","import { CurrencyCode } from '@/enums/index';\nimport { StripeCurrencyCode } from '@/enums/stripe-currencies.enum';\nimport { Amount, CurrencyConfig } from '@/interfaces/index';\n\n/**\n * Currency utility functions for handling monetary amounts in minor currency units.\n *\n * All monetary values are stored in the database as integers representing the smallest\n * currency unit (e.g., cents for USD, pence for GBP). This avoids floating-point\n * precision issues and ensures accurate financial calculations.\n *\n * @example\n * // Convert $10.50 to cents for storage\n * const cents = toMinorUnits(10.50, 'USD'); // Returns 1050\n *\n * // Convert cents back to dollars for display\n * const dollars = fromMinorUnits(1050, 'USD'); // Returns 10.50\n *\n * // Format for display\n * const formatted = formatCurrency(1050, 'USD'); // Returns '$10.50'\n */\n\n/**\n * Configuration for supported currencies.\n * Currencies are keyed by their ISO 4217 currency code.\n */\nexport const CURRENCY_CONFIG: Record<CurrencyCode | string, CurrencyConfig> = {\n // Major currencies with 2 decimal places\n [CurrencyCode.USD]: { minorUnits: 2, symbol: '$', symbolPosition: 'prefix' },\n [CurrencyCode.EUR]: { minorUnits: 2, symbol: '€', symbolPosition: 'prefix' },\n [CurrencyCode.GBP]: { minorUnits: 2, symbol: '£', symbolPosition: 'prefix' },\n [CurrencyCode.CAD]: { minorUnits: 2, symbol: 'CA$', symbolPosition: 'prefix' },\n [CurrencyCode.AUD]: { minorUnits: 2, symbol: 'A$', symbolPosition: 'prefix' },\n [CurrencyCode.NZD]: { minorUnits: 2, symbol: 'NZ$', symbolPosition: 'prefix' },\n [CurrencyCode.CHF]: { minorUnits: 2, symbol: 'CHF', symbolPosition: 'prefix' },\n [CurrencyCode.CNY]: { minorUnits: 2, symbol: '¥', symbolPosition: 'prefix' },\n [CurrencyCode.INR]: { minorUnits: 2, symbol: '₹', symbolPosition: 'prefix' },\n [CurrencyCode.MXN]: { minorUnits: 2, symbol: 'MX$', symbolPosition: 'prefix' },\n [CurrencyCode.BRL]: { minorUnits: 2, symbol: 'R$', symbolPosition: 'prefix' },\n [CurrencyCode.ZAR]: { minorUnits: 2, symbol: 'R', symbolPosition: 'prefix' },\n [CurrencyCode.SGD]: { minorUnits: 2, symbol: 'S$', symbolPosition: 'prefix' },\n [CurrencyCode.HKD]: { minorUnits: 2, symbol: 'HK$', symbolPosition: 'prefix' },\n [CurrencyCode.SEK]: { minorUnits: 2, symbol: 'kr', symbolPosition: 'suffix' },\n [CurrencyCode.NOK]: { minorUnits: 2, symbol: 'kr', symbolPosition: 'suffix' },\n [CurrencyCode.DKK]: { minorUnits: 2, symbol: 'kr', symbolPosition: 'suffix' },\n [CurrencyCode.PLN]: { minorUnits: 2, symbol: 'zł', symbolPosition: 'suffix' },\n [CurrencyCode.THB]: { minorUnits: 2, symbol: '฿', symbolPosition: 'prefix' },\n [CurrencyCode.MYR]: { minorUnits: 2, symbol: 'RM', symbolPosition: 'prefix' },\n [CurrencyCode.PHP]: { minorUnits: 2, symbol: '₱', symbolPosition: 'prefix' },\n [CurrencyCode.IDR]: { minorUnits: 2, symbol: 'Rp', symbolPosition: 'prefix' },\n [CurrencyCode.AED]: { minorUnits: 2, symbol: 'د.إ', symbolPosition: 'prefix' },\n [CurrencyCode.SAR]: { minorUnits: 2, symbol: '﷼', symbolPosition: 'prefix' },\n [CurrencyCode.ILS]: { minorUnits: 2, symbol: '₪', symbolPosition: 'prefix' },\n [CurrencyCode.TRY]: { minorUnits: 2, symbol: '₺', symbolPosition: 'prefix' },\n [CurrencyCode.RUB]: { minorUnits: 2, symbol: '₽', symbolPosition: 'suffix' },\n [CurrencyCode.HTG]: { minorUnits: 2, symbol: 'HTG', symbolPosition: 'prefix' },\n\n // New Currencies with 2 decimal places\n [CurrencyCode.BND]: { minorUnits: 2, symbol: 'BND', symbolPosition: 'prefix' },\n [CurrencyCode.CRC]: { minorUnits: 2, symbol: 'CRC', symbolPosition: 'prefix' },\n [CurrencyCode.BDT]: { minorUnits: 2, symbol: 'BDT', symbolPosition: 'prefix' },\n [CurrencyCode.UAH]: { minorUnits: 2, symbol: 'UAH', symbolPosition: 'prefix' },\n [CurrencyCode.NGN]: { minorUnits: 2, symbol: '₦', symbolPosition: 'prefix' },\n [CurrencyCode.AFN]: { minorUnits: 2, symbol: '؋', symbolPosition: 'prefix' },\n [CurrencyCode.ALL]: { minorUnits: 2, symbol: 'L', symbolPosition: 'suffix' },\n [CurrencyCode.AMD]: { minorUnits: 2, symbol: '֏', symbolPosition: 'suffix' },\n [CurrencyCode.ANG]: { minorUnits: 2, symbol: 'ƒ', symbolPosition: 'prefix' },\n [CurrencyCode.AOA]: { minorUnits: 2, symbol: 'Kz', symbolPosition: 'prefix' },\n [CurrencyCode.ARS]: { minorUnits: 2, symbol: 'AR$', symbolPosition: 'prefix' },\n [CurrencyCode.AWG]: { minorUnits: 2, symbol: 'Afl.', symbolPosition: 'prefix' },\n [CurrencyCode.AZN]: { minorUnits: 2, symbol: '₼', symbolPosition: 'prefix' },\n [CurrencyCode.BAM]: { minorUnits: 2, symbol: 'KM', symbolPosition: 'suffix' },\n [CurrencyCode.BBD]: { minorUnits: 2, symbol: 'Bds$', symbolPosition: 'prefix' },\n [CurrencyCode.BGN]: { minorUnits: 2, symbol: 'лв', symbolPosition: 'suffix' },\n [CurrencyCode.BMD]: { minorUnits: 2, symbol: 'BD$', symbolPosition: 'prefix' },\n [CurrencyCode.BOB]: { minorUnits: 2, symbol: 'Bs.', symbolPosition: 'prefix' },\n [CurrencyCode.BSD]: { minorUnits: 2, symbol: 'B$', symbolPosition: 'prefix' },\n [CurrencyCode.BTN]: { minorUnits: 2, symbol: 'Nu.', symbolPosition: 'prefix' },\n [CurrencyCode.BWP]: { minorUnits: 2, symbol: 'P', symbolPosition: 'prefix' },\n [CurrencyCode.BYN]: { minorUnits: 2, symbol: 'Br', symbolPosition: 'suffix' },\n [CurrencyCode.BZD]: { minorUnits: 2, symbol: 'BZ$', symbolPosition: 'prefix' },\n [CurrencyCode.COP]: { minorUnits: 2, symbol: 'COL$', symbolPosition: 'prefix' },\n [CurrencyCode.CZK]: { minorUnits: 2, symbol: 'Kč', symbolPosition: 'suffix' },\n [CurrencyCode.DOP]: { minorUnits: 2, symbol: 'RD$', symbolPosition: 'prefix' },\n [CurrencyCode.DZD]: { minorUnits: 2, symbol: 'DA', symbolPosition: 'prefix' },\n [CurrencyCode.EGP]: { minorUnits: 2, symbol: 'E£', symbolPosition: 'prefix' },\n [CurrencyCode.ETB]: { minorUnits: 2, symbol: 'Br', symbolPosition: 'prefix' },\n [CurrencyCode.FJD]: { minorUnits: 2, symbol: 'FJ$', symbolPosition: 'prefix' },\n [CurrencyCode.GEL]: { minorUnits: 2, symbol: '₾', symbolPosition: 'prefix' },\n [CurrencyCode.GHS]: { minorUnits: 2, symbol: '₵', symbolPosition: 'prefix' },\n [CurrencyCode.GTQ]: { minorUnits: 2, symbol: 'Q', symbolPosition: 'prefix' },\n [CurrencyCode.GYD]: { minorUnits: 2, symbol: 'G$', symbolPosition: 'prefix' },\n [CurrencyCode.HNL]: { minorUnits: 2, symbol: 'L', symbolPosition: 'prefix' },\n [CurrencyCode.IRR]: { minorUnits: 2, symbol: '﷼', symbolPosition: 'prefix' },\n [CurrencyCode.JMD]: { minorUnits: 2, symbol: 'J$', symbolPosition: 'prefix' },\n [CurrencyCode.KES]: { minorUnits: 2, symbol: 'KSh', symbolPosition: 'prefix' },\n [CurrencyCode.KGS]: { minorUnits: 2, symbol: 'с', symbolPosition: 'suffix' },\n [CurrencyCode.KHR]: { minorUnits: 2, symbol: '៛', symbolPosition: 'prefix' },\n [CurrencyCode.KYD]: { minorUnits: 2, symbol: 'CI$', symbolPosition: 'prefix' },\n [CurrencyCode.KZT]: { minorUnits: 2, symbol: '₸', symbolPosition: 'prefix' },\n [CurrencyCode.LAK]: { minorUnits: 2, symbol: '₭', symbolPosition: 'prefix' },\n [CurrencyCode.LBP]: { minorUnits: 2, symbol: 'L£', symbolPosition: 'prefix' },\n [CurrencyCode.LKR]: { minorUnits: 2, symbol: 'Rs', symbolPosition: 'prefix' },\n [CurrencyCode.MAD]: { minorUnits: 2, symbol: 'DH', symbolPosition: 'prefix' },\n [CurrencyCode.MDL]: { minorUnits: 2, symbol: 'L', symbolPosition: 'suffix' },\n [CurrencyCode.MKD]: { minorUnits: 2, symbol: 'ден', symbolPosition: 'suffix' },\n [CurrencyCode.MMK]: { minorUnits: 2, symbol: 'K', symbolPosition: 'prefix' },\n [CurrencyCode.MNT]: { minorUnits: 2, symbol: '₮', symbolPosition: 'prefix' },\n [CurrencyCode.MOP]: { minorUnits: 2, symbol: 'MOP$', symbolPosition: 'prefix' },\n [CurrencyCode.MUR]: { minorUnits: 2, symbol: 'Rs', symbolPosition: 'prefix' },\n [CurrencyCode.MVR]: { minorUnits: 2, symbol: 'Rf', symbolPosition: 'prefix' },\n [CurrencyCode.MZN]: { minorUnits: 2, symbol: 'MT', symbolPosition: 'prefix' },\n [CurrencyCode.NAD]: { minorUnits: 2, symbol: 'N$', symbolPosition: 'prefix' },\n [CurrencyCode.NIO]: { minorUnits: 2, symbol: 'C$', symbolPosition: 'prefix' },\n [CurrencyCode.NPR]: { minorUnits: 2, symbol: 'Rs', symbolPosition: 'prefix' },\n [CurrencyCode.PAB]: { minorUnits: 2, symbol: 'B/.', symbolPosition: 'prefix' },\n [CurrencyCode.PEN]: { minorUnits: 2, symbol: 'S/', symbolPosition: 'prefix' },\n [CurrencyCode.PGK]: { minorUnits: 2, symbol: 'K', symbolPosition: 'prefix' },\n [CurrencyCode.PKR]: { minorUnits: 2, symbol: '₨', symbolPosition: 'prefix' },\n [CurrencyCode.QAR]: { minorUnits: 2, symbol: 'QR', symbolPosition: 'prefix' },\n [CurrencyCode.RON]: { minorUnits: 2, symbol: 'lei', symbolPosition: 'suffix' },\n [CurrencyCode.RSD]: { minorUnits: 2, symbol: 'дин.', symbolPosition: 'suffix' },\n [CurrencyCode.SBD]: { minorUnits: 2, symbol: 'SI$', symbolPosition: 'prefix' },\n [CurrencyCode.SRD]: { minorUnits: 2, symbol: 'Sr$', symbolPosition: 'prefix' },\n [CurrencyCode.SYP]: { minorUnits: 2, symbol: '£S', symbolPosition: 'prefix' },\n [CurrencyCode.TJS]: { minorUnits: 2, symbol: 'SM', symbolPosition: 'prefix' },\n [CurrencyCode.TMT]: { minorUnits: 2, symbol: 'm.', symbolPosition: 'prefix' },\n [CurrencyCode.TOP]: { minorUnits: 2, symbol: 'T$', symbolPosition: 'prefix' },\n [CurrencyCode.TTD]: { minorUnits: 2, symbol: 'TT$', symbolPosition: 'prefix' },\n [CurrencyCode.TZS]: { minorUnits: 2, symbol: 'TSh', symbolPosition: 'prefix' },\n [CurrencyCode.UYU]: { minorUnits: 2, symbol: '$U', symbolPosition: 'prefix' },\n [CurrencyCode.UZS]: { minorUnits: 2, symbol: 'сўм', symbolPosition: 'suffix' },\n [CurrencyCode.VES]: { minorUnits: 2, symbol: 'Bs.', symbolPosition: 'prefix' },\n [CurrencyCode.WST]: { minorUnits: 2, symbol: 'WS$', symbolPosition: 'prefix' },\n [CurrencyCode.XCD]: { minorUnits: 2, symbol: 'EC$', symbolPosition: 'prefix' },\n [CurrencyCode.YER]: { minorUnits: 2, symbol: '﷼', symbolPosition: 'prefix' },\n [CurrencyCode.ZMW]: { minorUnits: 2, symbol: 'ZK', symbolPosition: 'prefix' },\n [CurrencyCode.CDF]: { minorUnits: 2, symbol: 'FC', symbolPosition: 'prefix' },\n [CurrencyCode.CUP]: { minorUnits: 2, symbol: '$MN', symbolPosition: 'prefix' },\n [CurrencyCode.ERN]: { minorUnits: 2, symbol: 'Nfk', symbolPosition: 'prefix' },\n [CurrencyCode.FKP]: { minorUnits: 2, symbol: 'FK£', symbolPosition: 'prefix' },\n [CurrencyCode.GIP]: { minorUnits: 2, symbol: 'GI£', symbolPosition: 'prefix' },\n [CurrencyCode.GMD]: { minorUnits: 2, symbol: 'D', symbolPosition: 'prefix' },\n [CurrencyCode.KPW]: { minorUnits: 2, symbol: 'KPW', symbolPosition: 'prefix' },\n [CurrencyCode.LRD]: { minorUnits: 2, symbol: 'L$', symbolPosition: 'prefix' },\n [CurrencyCode.LSL]: { minorUnits: 2, symbol: 'M', symbolPosition: 'prefix' },\n [CurrencyCode.MGA]: { minorUnits: 2, symbol: 'Ar', symbolPosition: 'prefix' },\n [CurrencyCode.MWK]: { minorUnits: 2, symbol: 'MK', symbolPosition: 'prefix' },\n [CurrencyCode.SCR]: { minorUnits: 2, symbol: 'SR', symbolPosition: 'prefix' },\n [CurrencyCode.SDG]: { minorUnits: 2, symbol: 'SDG', symbolPosition: 'prefix' },\n [CurrencyCode.SHP]: { minorUnits: 2, symbol: 'SH£', symbolPosition: 'prefix' },\n [CurrencyCode.SLE]: { minorUnits: 2, symbol: 'Le', symbolPosition: 'prefix' },\n [CurrencyCode.SOS]: { minorUnits: 2, symbol: 'SSh', symbolPosition: 'prefix' },\n [CurrencyCode.SSP]: { minorUnits: 2, symbol: 'SSP', symbolPosition: 'prefix' },\n [CurrencyCode.STN]: { minorUnits: 2, symbol: 'Db', symbolPosition: 'prefix' },\n [CurrencyCode.SZL]: { minorUnits: 2, symbol: 'E', symbolPosition: 'prefix' },\n [CurrencyCode.VED]: { minorUnits: 2, symbol: 'Bs.D', symbolPosition: 'prefix' },\n [CurrencyCode.XCG]: { minorUnits: 2, symbol: 'Cg', symbolPosition: 'prefix' },\n\n // Zero decimal currencies\n [CurrencyCode.JPY]: { minorUnits: 0, symbol: '¥', symbolPosition: 'prefix' },\n [CurrencyCode.KRW]: { minorUnits: 0, symbol: '₩', symbolPosition: 'prefix' },\n [CurrencyCode.VND]: { minorUnits: 0, symbol: '₫', symbolPosition: 'suffix' },\n [CurrencyCode.CLP]: { minorUnits: 0, symbol: 'CLP$', symbolPosition: 'prefix' },\n [CurrencyCode.ISK]: { minorUnits: 0, symbol: 'kr', symbolPosition: 'suffix' },\n [CurrencyCode.HUF]: { minorUnits: 0, symbol: 'Ft', symbolPosition: 'suffix' },\n [CurrencyCode.TWD]: { minorUnits: 0, symbol: 'NT$', symbolPosition: 'prefix' },\n\n // New Currencies with 0 decimal places\n [CurrencyCode.GNF]: { minorUnits: 0, symbol: 'GNF', symbolPosition: 'prefix' },\n [CurrencyCode.BIF]: { minorUnits: 0, symbol: 'FBu', symbolPosition: 'prefix' },\n [CurrencyCode.DJF]: { minorUnits: 0, symbol: 'Fdj', symbolPosition: 'prefix' },\n [CurrencyCode.KMF]: { minorUnits: 0, symbol: 'CF', symbolPosition: 'prefix' },\n [CurrencyCode.PYG]: { minorUnits: 0, symbol: '₲', symbolPosition: 'prefix' },\n [CurrencyCode.RWF]: { minorUnits: 0, symbol: 'FRw', symbolPosition: 'prefix' },\n [CurrencyCode.UGX]: { minorUnits: 0, symbol: 'USh', symbolPosition: 'prefix' },\n [CurrencyCode.VUV]: { minorUnits: 0, symbol: 'VT', symbolPosition: 'prefix' },\n [CurrencyCode.XAF]: { minorUnits: 0, symbol: 'FCFA', symbolPosition: 'suffix' },\n [CurrencyCode.XOF]: { minorUnits: 0, symbol: 'CFA', symbolPosition: 'suffix' },\n [CurrencyCode.XPF]: { minorUnits: 0, symbol: '₣', symbolPosition: 'suffix' },\n\n // Three decimal currencies\n [CurrencyCode.KWD]: { minorUnits: 3, symbol: 'KD', symbolPosition: 'prefix' },\n [CurrencyCode.BHD]: { minorUnits: 3, symbol: 'BD', symbolPosition: 'prefix' },\n [CurrencyCode.OMR]: { minorUnits: 3, symbol: 'OMR', symbolPosition: 'prefix' },\n [CurrencyCode.JOD]: { minorUnits: 3, symbol: 'JD', symbolPosition: 'prefix' },\n [CurrencyCode.TND]: { minorUnits: 3, symbol: 'DT', symbolPosition: 'prefix' },\n [CurrencyCode.LYD]: { minorUnits: 3, symbol: 'LD', symbolPosition: 'prefix' },\n [CurrencyCode.IQD]: { minorUnits: 3, symbol: 'IQD', symbolPosition: 'prefix' },\n};\n\n/** Default configuration for unknown currencies (assumes 2 decimal places) */\nconst DEFAULT_CURRENCY_CONFIG: CurrencyConfig = {\n minorUnits: 2,\n symbol: '',\n symbolPosition: 'prefix',\n};\n\n/**\n * Gets the currency configuration for a given currency code.\n * Falls back to default configuration (2 decimal places) for unknown currencies.\n *\n * @param currency - ISO 4217 currency code (e.g., 'USD', 'EUR')\n * @returns Currency configuration\n */\nexport function getCurrencyConfig(currency: CurrencyCode): CurrencyConfig {\n const upperCurrency = currency.toUpperCase();\n return CURRENCY_CONFIG[upperCurrency] || DEFAULT_CURRENCY_CONFIG;\n}\n\n/**\n * Gets the multiplier for converting between major and minor currency units.\n *\n * @param currency - ISO 4217 currency code (e.g., 'USD', 'EUR')\n * @returns The multiplier (e.g., 100 for USD, 1 for JPY, 1000 for KWD)\n *\n * @example\n * getMinorUnitMultiplier('USD'); // Returns 100\n * getMinorUnitMultiplier('JPY'); // Returns 1\n * getMinorUnitMultiplier('KWD'); // Returns 1000\n */\nexport function getMinorUnitMultiplier(currency: CurrencyCode): number {\n const config = getCurrencyConfig(currency);\n return Math.pow(10, config.minorUnits);\n}\n\n/**\n * Converts a major currency amount to minor units (e.g., dollars to cents).\n * Uses Math.round to handle floating-point precision issues.\n *\n * @param amount - Amount in major currency units (e.g., 10.50 dollars)\n * @param currency - ISO 4217 currency code (e.g., 'USD')\n * @returns Amount in minor units as an integer (e.g., 1050 cents)\n *\n * @example\n * toMinorUnits(10.50, 'USD'); // Returns 1050\n * toMinorUnits(1000, 'JPY'); // Returns 1000 (JPY has no minor units)\n * toMinorUnits(10.500, 'KWD'); // Returns 10500 (KWD has 3 decimal places)\n */\nexport function toMinorUnits(amount: number, currency: CurrencyCode): number {\n const multiplier = getMinorUnitMultiplier(currency);\n // Use Math.round to handle floating-point precision issues\n return Math.round(amount * multiplier);\n}\n\n/**\n * Converts minor currency units to major units (e.g., cents to dollars).\n *\n * @param minorAmount - Amount in minor units (e.g., 1050 cents)\n * @param currency - ISO 4217 currency code (e.g., 'USD')\n * @returns Amount in major units (e.g., 10.50 dollars)\n *\n * @example\n * fromMinorUnits(1050, 'USD'); // Returns 10.50\n * fromMinorUnits(1000, 'JPY'); // Returns 1000\n * fromMinorUnits(10500, 'KWD'); // Returns 10.500\n */\nexport function fromMinorUnits(minorAmount: number, currency: CurrencyCode): number {\n const multiplier = getMinorUnitMultiplier(currency);\n return minorAmount / multiplier;\n}\n\n/**\n * Formats a minor currency amount for display with currency symbol.\n *\n * @param minorAmount - Amount in minor units (e.g., 1050 cents)\n * @param currency - ISO 4217 currency code (e.g., 'USD')\n * @param options - Formatting options\n * @returns Formatted currency string (e.g., '$10.50')\n *\n * @example\n * formatCurrency(1050, 'USD'); // Returns '$10.50'\n * formatCurrency(1000, 'JPY'); // Returns '¥1000'\n * formatCurrency(10500, 'KWD'); // Returns 'KD10.500'\n */\nexport function formatCurrency(\n minorAmount: number,\n currency: CurrencyCode,\n options: {\n /** Whether to include the currency symbol (default: true) */\n includeSymbol?: boolean;\n /** Whether to use grouping separators for thousands (default: true) */\n useGrouping?: boolean;\n } = {},\n): string {\n const { includeSymbol = true, useGrouping = true } = options;\n const config = getCurrencyConfig(currency);\n const majorAmount = fromMinorUnits(minorAmount, currency);\n\n const formattedNumber = majorAmount.toLocaleString('en-US', {\n minimumFractionDigits: config.minorUnits,\n maximumFractionDigits: config.minorUnits,\n useGrouping,\n });\n\n if (!includeSymbol || !config.symbol) {\n return formattedNumber;\n }\n\n if (config.symbolPosition === 'suffix') {\n return `${formattedNumber}${config.symbol}`;\n }\n\n return `${config.symbol}${formattedNumber}`;\n}\n\n/**\n * Safely adds two amounts in minor units.\n * Both amounts should already be in minor units (integers).\n *\n * @param a - First amount in minor units\n * @param b - Second amount in minor units\n * @returns Sum in minor units\n *\n * @example\n * addAmounts(1050, 250); // Returns 1300\n */\nexport function addAmounts(a: number, b: number): number {\n return Math.round(a + b);\n}\n\n/**\n * Safely subtracts two amounts in minor units.\n * Both amounts should already be in minor units (integers).\n *\n * @param a - First amount in minor units\n * @param b - Second amount to subtract in minor units\n * @returns Difference in minor units\n *\n * @example\n * subtractAmounts(1050, 250); // Returns 800\n */\nexport function subtractAmounts(a: number, b: number): number {\n return Math.round(a - b);\n}\n\n/**\n * Safely multiplies an amount by a factor.\n * The amount should be in minor units, the multiplier can be a decimal.\n *\n * @param amount - Amount in minor units\n * @param multiplier - Factor to multiply by (e.g., quantity or percentage as decimal)\n * @returns Product in minor units, rounded to nearest integer\n *\n * @example\n * multiplyAmount(1050, 2); // Returns 2100 (doubling)\n * multiplyAmount(1050, 0.15); // Returns 158 (15% of amount)\n */\nexport function multiplyAmount(amount: number, multiplier: number): number {\n return Math.round(amount * multiplier);\n}\n\n/**\n * Safely divides an amount by a divisor.\n * The amount should be in minor units.\n *\n * @param amount - Amount in minor units\n * @param divisor - Value to divide by\n * @returns Quotient in minor units, rounded to nearest integer\n *\n * @example\n * divideAmount(1050, 2); // Returns 525 (halving)\n * divideAmount(1000, 3); // Returns 333 (rounded)\n */\nexport function divideAmount(amount: number, divisor: number): number {\n if (divisor === 0) {\n throw new Error('Cannot divide by zero');\n }\n return Math.round(amount / divisor);\n}\n\n/**\n * Calculates a percentage of an amount.\n *\n * @param amount - Base amount in minor units\n * @param percentage - Percentage as a number (e.g., 15 for 15%, not 0.15)\n * @returns The percentage amount in minor units\n *\n * @example\n * calculatePercentage(10000, 15); // Returns 1500 (15% of 10000)\n * calculatePercentage(1050, 8.25); // Returns 87 (8.25% of 1050, rounded)\n */\nexport function calculatePercentage(amount: number, percentage: number): number {\n return Math.round((amount * percentage) / 100);\n}\n\n/**\n * Converts a string amount (e.g., \"10.50\") to minor units.\n * Useful for parsing user input or legacy string amounts.\n *\n * @param amountString - Amount as a string (e.g., \"10.50\")\n * @param currency - ISO 4217 currency code\n * @returns Amount in minor units, or null if parsing fails\n *\n * @example\n * parseAmountToMinorUnits(\"10.50\", \"USD\"); // Returns 1050\n * parseAmountToMinorUnits(\"invalid\", \"USD\"); // Returns null\n */\nexport function parseAmountToMinorUnits(amountString: string, currency: CurrencyCode): number | null {\n const parsed = parseFloat(amountString);\n if (isNaN(parsed)) {\n return null;\n }\n return toMinorUnits(parsed, currency);\n}\n\n/**\n * Checks if a currency code is supported with known configuration.\n *\n * @param currency - ISO 4217 currency code\n * @returns True if the currency has explicit configuration\n */\nexport function isSupportedCurrency(currency: CurrencyCode): boolean {\n return currency.toUpperCase() in CURRENCY_CONFIG;\n}\n\n/**\n * Validates that a string is a supported {@link CurrencyCode} and returns it.\n * @param value - Raw currency string (e.g. from API or DTO)\n * @returns Valid CurrencyCode\n * @throws Error if value is not a supported CurrencyCode\n */\nexport function parseCurrencyCode(value: string): CurrencyCode {\n if (!value || typeof value !== 'string') {\n throw new Error(`Currency value is missing or invalid`);\n }\n const validCodes = Object.values(CurrencyCode) as string[];\n if (!validCodes.includes(value)) {\n throw new Error(`\"${value}\" is not a supported CurrencyCode. Supported codes: ${validCodes.join(', ')}`);\n }\n return value as CurrencyCode;\n}\n\nexport function parseStripeCurrencyCode(value: string): StripeCurrencyCode {\n if (!value || typeof value !== 'string') {\n throw new Error(`Currency value is missing or invalid`);\n }\n const validCodes = Object.values(StripeCurrencyCode) as string[];\n if (!validCodes.includes(value)) {\n throw new Error(`\"${value}\" is not a supported Stripe CurrencyCode. Supported codes: ${validCodes.join(', ')}`);\n }\n return value as StripeCurrencyCode;\n}\n\n/**\n * Converts minor currency units to major units as a number.\n * Uses the minorUnits count directly instead of looking up by currency code.\n *\n * @param minorAmount - Amount in minor units (e.g., 1050 cents)\n * @param minorUnits - Number of decimal places for the currency (e.g., 2 for USD, 0 for JPY, 3 for KWD)\n * @returns Amount in major units as a number (e.g., 10.50 dollars)\n *\n * @example\n * stringifyMinorUnits(1050, 2); // Returns 10.50\n * stringifyMinorUnits(1000, 0); // Returns 1000\n * stringifyMinorUnits(10500, 3); // Returns 10.5\n */\nexport function stringifyMinorUnits(minorAmount: number, minorUnits: number): number {\n const multiplier = Math.pow(10, minorUnits);\n return minorAmount / multiplier;\n}\n\n/**\n * Converts minor currency units to a plain decimal string without symbol or grouping.\n * Useful for APIs like WooCommerce that expect plain numeric strings.\n *\n * @param minorAmount - Amount in minor units (e.g., 1050 cents)\n * @param minorUnits - Number of decimal places for the currency (e.g., 2 for USD, 0 for JPY, 3 for KWD)\n * @returns Plain decimal string (e.g., '10.50')\n *\n * @example\n * formatMinorUnitsToString(1050, 2); // Returns '10.50'\n * formatMinorUnitsToString(1000, 0); // Returns '1000'\n * formatMinorUnitsToString(10500, 3); // Returns '10.5'\n */\nexport function formatMinorUnitsToString(minorAmount: number, minorUnits: number): string {\n const majorAmount = stringifyMinorUnits(minorAmount, minorUnits);\n return majorAmount.toString();\n}\n\n/**\n * Get the number of minor units for a currency.\n * Used in BuilderHub\n * @param currency - ISO 4217 currency code\n * @returns Number of minor unit digits (e.g., 2 for USD, 0 for JPY, 3 for KWD)\n */\nexport function getMinorUnits(currency: CurrencyCode): number {\n return getCurrencyConfig(currency).minorUnits;\n}\n\n/**\n * Creates an Amount object from user input string.\n * Converts \"31.22\" + \"USD\" → { amount: 3122, currency: \"USD\", minorUnits: 2 }\n * Used in BuilderHub\n * @param value - User input value (string like \"31.22\" or number)\n * @param currency - ISO 4217 currency code from company.settings.currency\n * @returns Amount object or undefined if value is empty/invalid\n */\nexport function createAmount(value: string | number | null | undefined, currency: CurrencyCode): Amount | undefined {\n if (value === null || value === undefined || value === '') {\n return undefined;\n }\n\n const numericValue = typeof value === 'string' ? parseFloat(value) : value;\n\n if (isNaN(numericValue)) {\n return undefined;\n }\n\n const minorUnits = getMinorUnits(currency);\n const multiplier = Math.pow(10, minorUnits);\n\n return {\n amount: Math.round(numericValue * multiplier),\n currency,\n minorUnits,\n };\n}\n\n/**\n * Converts an Amount object to a display string for the UI.\n * { amount: 3122, currency: \"USD\", minorUnits: 2 } → \"31.22\"\n * Used in BuilderHub\n * @param amount - Amount object from API response\n * @returns Formatted string (e.g., \"31.22\") or empty string if undefined\n */\nexport function amountToString(amount: Amount | undefined | null): string {\n if (!amount) {\n return '';\n }\n\n const divisor = Math.pow(10, amount.minorUnits);\n const majorValue = amount.amount / divisor;\n return majorValue.toFixed(amount.minorUnits);\n}\n","/**\n * Order-total anchors, defined once for every consumer.\n *\n * These are the figures the order page, the reports and the receipts must all agree on. Keeping\n * the arithmetic here rather than at each call site is the point: the same number was previously\n * reassembled in three places and drifted between them.\n */\n\n/** Wire money is `string | number` on some surfaces (Mongoose Decimal serialises as a string). */\ntype MoneyInput = number | string | null | undefined;\n\nfunction toMinorUnits(value: MoneyInput): number {\n return Number(value) || 0;\n}\n\n/**\n * **Total Collected** — what actually hit the drawer and the processor for one order.\n *\n * ```\n * totalCollected = order.summary.amountPaid + order.summary.tipTotal\n * ```\n *\n * Both inputs are persisted fields written by the POS from the same `paymentMethods[]` array:\n * `amountPaid` is Σ `paymentMethods[].amount` (base only — every leg, liability tenders included),\n * and `tipTotal` is Σ `paymentMethods[].tip.amount`. Cash rounding needs no term of its own: the\n * writer has already folded it into the cash leg's `amount`.\n *\n * Do not substitute `summary.total` — that field is `base + tip` ignoring cash rounding, so it\n * equals neither this anchor nor `totalBeforeTip`.\n *\n * Note this is not `amountCollected` from the Sales Breakdown report\n * (`summary.payments.cardTotal + cashTotal + customTotal`), which is tips-exclusive and skips the\n * `redeem` bucket. That figure answers \"how much settles\", this one answers \"how much the\n * customer handed over\".\n *\n * @param amountPaid `order.summary.amountPaid`\n * @param tipTotal `order.summary.tipTotal`\n * @returns integer minor units\n */\nexport function getTotalCollected(amountPaid: MoneyInput, tipTotal: MoneyInput): number {\n return toMinorUnits(amountPaid) + toMinorUnits(tipTotal);\n}\n\n/**\n * **What one tender leg took** — its principal plus the tip captured on it.\n *\n * `paymentMethods[].amount` is the base only; the tip lives in `.tip.amount`. Cash rounding needs\n * no term because the writer has already folded it into `amount`, so adding it here would\n * double-count it and break `Σ legs ≡ Total Collected`.\n *\n * @param amount `paymentMethods[].amount`\n * @param tipAmount `paymentMethods[].tip.amount`\n * @returns integer minor units\n */\nexport function getPaymentLegTotal(amount: MoneyInput, tipAmount: MoneyInput): number {\n return toMinorUnits(amount) + toMinorUnits(tipAmount);\n}\n\n/**\n * **What a cash leg was owed** before the till rounded it to the nearest increment.\n *\n * `cashRounding` is a signed delta already inside `amount` (`rounded − owed`), so removing it\n * recovers what the cashier actually had to collect. Reads back as the \"Amount due\" line above\n * the rounding line on a receipt.\n *\n * @param amount `paymentMethods[].amount`\n * @param cashRounding `paymentMethods[].cashRounding`\n * @returns integer minor units\n */\nexport function getCashAmountDue(amount: MoneyInput, cashRounding: MoneyInput): number {\n return toMinorUnits(amount) - toMinorUnits(cashRounding);\n}\n\n/** The writer's settlement block — `summary.payments`. Liability (`redeem`) tenders are excluded. */\nexport interface SettlementBuckets {\n cardTotal?: MoneyInput;\n cashTotal?: MoneyInput;\n customTotal?: MoneyInput;\n}\n\n/**\n * **What actually settles** to the bank.\n *\n * The writer already bucketed the tender legs into `summary.payments` and skipped the `redeem`\n * bucket while doing it — a gift-card redemption discharges an obligation taken on when the card\n * was sold, so no new money arrives and nothing settles. Those buckets hold\n * `paymentMethods[].amount` only, and a tip is charged to the card and reaches the bank with it,\n * so the tips are added back — the same thing hub-api's settlement report does before computing\n * the deposit (`cardsCollected = orderCardTotal + grossTips`).\n *\n * Equals {@link getTotalCollected} on any order without a redemption; the difference between them\n * is exactly what was redeemed.\n *\n * @param payments `order.summary.payments`\n * @param tipTotal `order.summary.tipTotal`\n * @returns integer minor units\n */\nexport function getSettlementTotal(payments: SettlementBuckets | undefined | null, tipTotal: MoneyInput): number {\n return (\n toMinorUnits(payments?.cardTotal) +\n toMinorUnits(payments?.cashTotal) +\n toMinorUnits(payments?.customTotal) +\n toMinorUnits(tipTotal)\n );\n}\n\n/**\n * **A line's subtotal** — unit price × quantity, before discounts, fees and tax.\n *\n * Product lines persist this as `lineItems[].subTotal`, so read the field there. Custom sales do\n * not carry it — `OrderCustomSale` has no such property in the schema, and the stored documents\n * confirm it — but the figure is still the first row of the line's breakdown, and it is the\n * definition of the field rather than a re-derivation of one.\n *\n * @param price line `price` (unit price)\n * @param quantity line `quantity`\n * @returns integer minor units\n */\nexport function getLineSubtotal(price: MoneyInput, quantity: MoneyInput): number {\n return toMinorUnits(price) * toMinorUnits(quantity);\n}\n\n/**\n * **The goods portion of a line** — its total with the tax taken back out.\n *\n * A refunded custom sale is shown as goods and tax on separate rows, and the stored `total`\n * carries both. Never render the difference as a \"net\" of a *sale* line: tax is rounded on a\n * table-wide aggregate, so a per-line net plus its tax can land a cent off the gross the customer\n * paid. On a refund line the two rows are the refund's own components and do foot.\n *\n * @param total line `total`\n * @param totalTax line `totalTax`\n * @returns integer minor units\n */\nexport function getGoodsPortion(total: MoneyInput, totalTax: MoneyInput): number {\n return toMinorUnits(total) - toMinorUnits(totalTax);\n}\n","import { PricingRegionEnum } from '../enums';\n\nexport interface CurrencyRate {\n rate: number;\n country: string;\n}\n\nexport const REGION_MAPPING: Record<string, PricingRegionEnum> = {\n // North America\n US: PricingRegionEnum.NORTH_AMERICA,\n CA: PricingRegionEnum.NORTH_AMERICA,\n MX: PricingRegionEnum.NORTH_AMERICA,\n\n // Europe\n AT: PricingRegionEnum.EUROPE,\n BE: PricingRegionEnum.EUROPE,\n BG: PricingRegionEnum.EUROPE,\n CH: PricingRegionEnum.EUROPE,\n CY: PricingRegionEnum.EUROPE,\n CZ: PricingRegionEnum.EUROPE,\n DE: PricingRegionEnum.EUROPE,\n DK: PricingRegionEnum.EUROPE,\n EE: PricingRegionEnum.EUROPE,\n ES: PricingRegionEnum.EUROPE,\n FI: PricingRegionEnum.EUROPE,\n FR: PricingRegionEnum.EUROPE,\n GB: PricingRegionEnum.EUROPE, // Stripe uses 'GB' (not 'UK')\n GR: PricingRegionEnum.EUROPE,\n HR: PricingRegionEnum.EUROPE,\n HU: PricingRegionEnum.EUROPE,\n IE: PricingRegionEnum.EUROPE,\n IT: PricingRegionEnum.EUROPE,\n LI: PricingRegionEnum.EUROPE,\n LT: PricingRegionEnum.EUROPE,\n LU: PricingRegionEnum.EUROPE,\n LV: PricingRegionEnum.EUROPE,\n MT: PricingRegionEnum.EUROPE,\n NL: PricingRegionEnum.EUROPE,\n NO: PricingRegionEnum.EUROPE,\n PL: PricingRegionEnum.EUROPE,\n PT: PricingRegionEnum.EUROPE,\n RO: PricingRegionEnum.EUROPE,\n SE: PricingRegionEnum.EUROPE,\n SI: PricingRegionEnum.EUROPE,\n SK: PricingRegionEnum.EUROPE,\n GI: PricingRegionEnum.EUROPE, // Gibraltar (NEW)\n\n // Others (Asia-Pacific, Middle East, South America, etc.)\n AE: PricingRegionEnum.OTHER, // United Arab Emirates\n AU: PricingRegionEnum.OTHER, // Australia\n BR: PricingRegionEnum.OTHER, // Brazil (NEW)\n HK: PricingRegionEnum.OTHER, // Hong Kong\n IN: PricingRegionEnum.OTHER, // India (NEW)\n JP: PricingRegionEnum.OTHER, // Japan\n MY: PricingRegionEnum.OTHER, // Malaysia\n NZ: PricingRegionEnum.OTHER, // New Zealand\n SG: PricingRegionEnum.OTHER, // Singapore\n TH: PricingRegionEnum.OTHER, // Thailand\n};\n\nexport const STRIPE_SUPPORTED_COUNTRIES = new Set([\n // North America\n 'US',\n 'CA',\n 'MX',\n // Europe\n 'AT',\n 'BE',\n 'BG',\n 'CH',\n 'CY',\n 'CZ',\n 'DE',\n 'DK',\n 'EE',\n 'ES',\n 'FI',\n 'FR',\n 'GB',\n 'GR',\n 'HR',\n 'HU',\n 'IE',\n 'IT',\n 'LI',\n 'LT',\n 'LU',\n 'LV',\n 'MT',\n 'NL',\n 'NO',\n 'PL',\n 'PT',\n 'RO',\n 'SE',\n 'SI',\n 'SK',\n // Others\n 'AE', // United Arab Emirates\n 'AU', // Australia\n 'BR', // Brazil (NEW)\n 'GI', // Gibraltar (NEW)\n 'HK', // Hong Kong\n 'IN', // India (NEW)\n 'JP', // Japan\n 'MY', // Malaysia\n 'NZ', // New Zealand\n 'SG', // Singapore\n 'TH', // Thailand\n]);\nexport const NAFixedRates: Record<string, CurrencyRate> = {\n USD: { rate: 30, country: 'United States' },\n CAD: { rate: 20, country: 'Canada' },\n MXN: { rate: 300, country: 'Mexico' },\n};\nexport const EUFixedRates: Record<string, CurrencyRate> = {\n EUR: { rate: 30, country: 'European Union' },\n GBP: { rate: 20, country: 'Great Britain' },\n CHF: { rate: 30, country: 'Switzerland' },\n DKK: { rate: 180, country: 'Denmark' },\n NOK: { rate: 200, country: 'Norway' },\n SEK: { rate: 180, country: 'Sweden' },\n PLN: { rate: 100, country: 'Poland' },\n};\nexport const OtherFixedRates: Record<string, CurrencyRate> = {\n AUD: { rate: 30, country: 'Australia' },\n NZD: { rate: 30, country: 'New Zealand' },\n SGD: { rate: 50, country: 'Singapore' },\n MYR: { rate: 100, country: 'Malaysia' },\n JPY: { rate: 30, country: 'Japan' },\n};\n\nexport const COUNTRY_CURRENCIES: Record<string, string> = {\n US: 'USD', CA: 'CAD', MX: 'MXN',\n AT: 'EUR', BE: 'EUR', BG: 'BGN', CH: 'CHF', CY: 'EUR', CZ: 'CZK',\n DE: 'EUR', DK: 'DKK', EE: 'EUR', ES: 'EUR', FI: 'EUR', FR: 'EUR',\n GB: 'GBP', GI: 'GIP', GR: 'EUR', HR: 'EUR', HU: 'HUF', IE: 'EUR',\n IT: 'EUR', LI: 'CHF', LT: 'EUR', LU: 'EUR', LV: 'EUR', MT: 'EUR',\n NL: 'EUR', NO: 'NOK', PL: 'PLN', PT: 'EUR', RO: 'RON', SE: 'SEK',\n SI: 'EUR', SK: 'EUR',\n AE: 'AED', AU: 'AUD', BR: 'BRL', HK: 'HKD', IN: 'INR', JP: 'JPY',\n MY: 'MYR', NZ: 'NZD', SG: 'SGD', TH: 'THB',\n};","import { PricingRegionEnum } from '../enums';\nimport { REGION_MAPPING, NAFixedRates, EUFixedRates, OtherFixedRates, CurrencyRate } from 'constants/pricing.constants';\n\nexport function getPricingRegionFromCountry(countryCode?: string): PricingRegionEnum {\n const code = (countryCode || '').toUpperCase();\n if (NORTH_AMERICA.has(code)) return PricingRegionEnum.NORTH_AMERICA;\n if (EUROPE.has(code)) return PricingRegionEnum.EUROPE;\n return PricingRegionEnum.OTHER;\n}\n\nexport const NORTH_AMERICA = getCountriesByRegion(PricingRegionEnum.NORTH_AMERICA);\nexport const EUROPE = getCountriesByRegion(PricingRegionEnum.EUROPE);\n\n// TODO_J: Rely on external api to know the exchange rate between USD and the local currency\nexport function convertFixedFeeToLocalCurrency(currency: string, region: PricingRegionEnum): number {\n const currencyCode = currency.toUpperCase();\n let fixedRate: CurrencyRate | undefined;\n\n switch (region) {\n case PricingRegionEnum.NORTH_AMERICA: {\n fixedRate = NAFixedRates[currencyCode];\n break;\n }\n case PricingRegionEnum.EUROPE: {\n fixedRate = EUFixedRates[currencyCode];\n break;\n }\n case PricingRegionEnum.OTHER: {\n fixedRate = OtherFixedRates[currencyCode];\n break;\n }\n }\n return fixedRate?.rate ?? null;\n}\n\nexport function getCountriesByRegion(region: PricingRegionEnum): Set<string> {\n const countries = new Set<string>();\n for (const [country, mappedRegion] of Object.entries(REGION_MAPPING)) {\n if (mappedRegion === region) {\n countries.add(country);\n }\n }\n return countries;\n}\n","import { EndOfSessionReport } from '@/interfaces/Report.interface';\n\n// Paths whose numeric values must be negated when leaving the wire.\n// Backend persists raw positive magnitudes; this is the one place that\n// flips them for display. UI prefix glyphs (\"+ Tips\", \"− Refunds\") are\n// a presentation concern and live in the frontend, not here.\n//\n// Path key uses dot notation. Append `[]` to descend into every array\n// item. Unmatched numeric fields pass through unchanged.\nexport const REPORT_NEGATE_PATHS: ReadonlySet<string> = new Set([\n // Sales summary — reductions to revenue\n 'salesSummary.discounts.netDiscounts',\n 'salesSummary.refundsItems',\n\n // Settlement — money going out of the merchant\n 'settlementBreakdown.cards.refunded',\n 'settlementBreakdown.cards.processingFees',\n 'settlementBreakdown.cash.refunded',\n 'settlementBreakdown.custom[].refunded',\n 'settlementBreakdown.custom[].processingFees',\n\n // Tax breakdown — refunds sub-table renders signed-negative\n 'taxBreakdown.refunds.entries[].taxableSales',\n 'taxBreakdown.refunds.entries[].tax',\n 'taxBreakdown.refunds.total.taxableSales',\n 'taxBreakdown.refunds.total.tax',\n\n // Refunds breakdown — reductions and naturally-signed entries\n 'refundsBreakdown.discountsReversed',\n 'refundsBreakdown.cashRoundingRefund',\n\n // Fees breakdown — refunded magnitudes are money flowing back out\n 'feesBreakdown.productFee.refundedProductFees',\n 'feesBreakdown.cartFee.refundedCartFees',\n\n // Discounts breakdown — refunded magnitudes reverse discount reductions\n 'discountsBreakdown.productDiscounts.refundedProductDiscounts',\n 'discountsBreakdown.cartDiscounts.refundedCartDiscounts',\n\n // Staff sales — refunds are money flowing back out\n 'staffSales.staffSales[].refundSales',\n 'staffSales.refundTotal',\n\n // Tips — refunds are money flowing back out\n 'tipsBreakdown.tips[].refundAmount',\n]);\n\nexport function signReportForDisplay(report: EndOfSessionReport): EndOfSessionReport {\n return negateAtPaths(report, '', REPORT_NEGATE_PATHS) as EndOfSessionReport;\n}\n\nfunction negateAtPaths(value: unknown, path: string, paths: ReadonlySet<string>): unknown {\n if (Array.isArray(value)) {\n const next = `${path}[]`;\n return value.map((item) => negateAtPaths(item, next, paths));\n }\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n const next = path ? `${path}.${key}` : key;\n out[key] = negateAtPaths(child, next, paths);\n }\n return out;\n }\n if (typeof value === 'number' && paths.has(path)) {\n // Avoid producing negative zero: formatters that branch on `value < 0`\n // miss `-0` (IEEE-754 says `-0 < 0` is false), then render `-0` as\n // `$-0.00` instead of `$0.00`. Normalize zero before negating.\n return value === 0 ? 0 : -value;\n }\n return value;\n}\n","// Mongo-id helpers shared across the POS frontend packages (Render + port-louis).\n\nfunction padHex(value: number, length: number) {\n return value.toString(16).padStart(length, '0');\n}\n\n// Canonical MongoDB ObjectId layout (24 hex = 12 bytes):\n// 4-byte timestamp (seconds) + 5-byte per-process random + 3-byte monotonic counter.\n// `PROCESS_RANDOM` is generated ONCE per session (not per call), and the counter is a\n// real incrementing value seeded randomly — fixing the previous impl where the machine/pid\n// bytes were re-randomized every call and the \"counter\" was effectively random (dead).\n// No external dependency (common stays dependency-light); not crypto-grade, same as before.\nconst PROCESS_RANDOM: string = Array.from({ length: 5 }, () =>\n padHex(Math.floor(Math.random() * 0x100), 2),\n).join('');\n\nlet objectIdCounter = Math.floor(Math.random() * 0xffffff);\n\nexport function generateMongoID(): string {\n const timestamp = padHex(Math.floor(Date.now() / 1000), 8);\n objectIdCounter = (objectIdCounter + 1) % 0x1000000;\n return timestamp + PROCESS_RANDOM + padHex(objectIdCounter, 6);\n}\n\nexport function getCurrentISODate() {\n const now = new Date(Date.now());\n\n return now.toISOString();\n}\n\n/** Normalize sync / Redux ids (string or `{ $oid }`) to a 24-char hex string when possible. */\nexport function normalizeMongoIdString(value: unknown): string | null {\n if (value == null || value === '') {\n return null;\n }\n if (typeof value === 'string') {\n const t = value.trim();\n return t.length > 0 ? t : null;\n }\n if (typeof value === 'object' && value !== null && '$oid' in value) {\n const oid = (value as { $oid: unknown }).$oid;\n return typeof oid === 'string' && oid.length > 0 ? oid : null;\n }\n return null;\n}\n","/** Financial lifecycle of an order. */\nexport type PaymentState =\n | 'unpaid'\n | 'payment_pending'\n | 'partially_paid'\n | 'paid'\n | 'partially_refunded'\n | 'refunded'\n | 'voided';\n\n/** Operational lifecycle of an order (goods/services, including returns). */\nexport type FulfillmentState =\n | 'draft'\n | 'pending'\n | 'on_hold'\n | 'in_progress'\n | 'fulfilled'\n | 'partially_fulfilled'\n | 'returned'\n | 'partially_returned'\n | 'cancelled';\n\nexport const PAYMENT_STATES: readonly PaymentState[] = [\n 'unpaid',\n 'payment_pending',\n 'partially_paid',\n 'paid',\n 'partially_refunded',\n 'refunded',\n 'voided',\n] as const;\n\nexport const FULFILLMENT_STATES: readonly FulfillmentState[] = [\n 'draft',\n 'pending',\n 'on_hold',\n 'in_progress',\n 'fulfilled',\n 'partially_fulfilled',\n 'returned',\n 'partially_returned',\n 'cancelled',\n] as const;\n\nexport function isPaymentState(value: string): value is PaymentState {\n return (PAYMENT_STATES as readonly string[]).includes(value);\n}\n\nexport function isFulfillmentState(value: string): value is FulfillmentState {\n return (FULFILLMENT_STATES as readonly string[]).includes(value);\n}\n\n/** Payment × fulfillment pair used by the engine, guards, and `StateConfig.validInitialStates`. */\nexport interface StatePair {\n payment: PaymentState;\n fulfillment: FulfillmentState;\n}\n\n/** Operators for transition conditions (closed set). */\nexport type ConditionOperator =\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'in'\n | 'notIn'\n | 'isEmpty'\n | 'isNotEmpty';\n\nexport const CONDITION_OPERATORS: readonly ConditionOperator[] = [\n 'eq',\n 'neq',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'in',\n 'notIn',\n 'isEmpty',\n 'isNotEmpty',\n] as const;\n\nexport function isConditionOperator(value: string): value is ConditionOperator {\n return (CONDITION_OPERATORS as readonly string[]).includes(value);\n}\n\n/** Path enforcement mode per axis. */\nexport type PathMode = 'strict' | 'permissive';\n\nexport const PATH_MODES: readonly PathMode[] = [\n 'strict',\n 'permissive',\n] as const;\n","import type {\n FulfillmentStateDefinition,\n PaymentStateDefinition,\n} from './interfaces';\nimport type { FulfillmentState, PaymentState } from './types';\n\nexport interface StateSchema {\n readonly paymentStates: readonly PaymentStateDefinition[];\n readonly fulfillmentStates: readonly FulfillmentStateDefinition[];\n}\n\nconst PAYMENT_DEFS: { id: PaymentState; label: string; terminal: boolean }[] = [\n { id: 'unpaid', label: 'Unpaid', terminal: false },\n { id: 'payment_pending', label: 'Payment Pending', terminal: false },\n { id: 'partially_paid', label: 'Partially Paid', terminal: false },\n { id: 'paid', label: 'Paid', terminal: false },\n { id: 'partially_refunded', label: 'Partially Refunded', terminal: false },\n { id: 'refunded', label: 'Refunded', terminal: true },\n { id: 'voided', label: 'Voided', terminal: true },\n];\n\nconst FULFILLMENT_DEFS: { id: FulfillmentState; label: string; terminal: boolean }[] = [\n { id: 'draft', label: 'Draft', terminal: false },\n { id: 'pending', label: 'Pending', terminal: false },\n { id: 'on_hold', label: 'On Hold', terminal: false },\n { id: 'in_progress', label: 'In Progress', terminal: false },\n { id: 'fulfilled', label: 'Fulfilled', terminal: true },\n { id: 'partially_fulfilled', label: 'Partially Fulfilled', terminal: false },\n { id: 'returned', label: 'Returned', terminal: true },\n { id: 'partially_returned', label: 'Partially Returned', terminal: false },\n { id: 'cancelled', label: 'Cancelled', terminal: true },\n];\n\nexport function basePaymentDefinitions(): PaymentStateDefinition[] {\n return PAYMENT_DEFS.map((d) => ({\n id: d.id,\n label: d.label,\n isBase: true,\n isTerminal: d.terminal,\n }));\n}\n\nexport function baseFulfillmentDefinitions(): FulfillmentStateDefinition[] {\n return FULFILLMENT_DEFS.map((d) => ({\n id: d.id,\n label: d.label,\n isBase: true,\n isTerminal: d.terminal,\n }));\n}\n\nexport const STATE_SCHEMA: Readonly<StateSchema> = Object.freeze({\n paymentStates: Object.freeze(basePaymentDefinitions()),\n fulfillmentStates: Object.freeze(baseFulfillmentDefinitions()),\n});\n","import type { FinancialInvariant } from './interfaces';\nimport type { PaymentState, StatePair } from './types';\n\nconst REFUND_ALLOWED_FULFILLMENT = new Set<string>(['fulfilled', 'returned', 'partially_returned', 'cancelled']);\n\n// Payment states ordered by collection progress. Any move that decreases\n// the index is a regression — money was collected but is being \"un-collected\"\n// without going through a refund flow.\nconst PAYMENT_COLLECTION_ORDER: readonly PaymentState[] = ['unpaid', 'partially_paid', 'paid'];\n\n/**\n * Layer 1a — hard-coded, non-configurable financial integrity checks.\n * `check` returns true when the requested transition **violates** the invariant.\n */\nexport const FINANCIAL_INVARIANTS: readonly FinancialInvariant[] = [\n {\n id: 'no-leave-refunded',\n description: 'Cannot change payment state after a full refund (no un-refund / reactivation of funds)',\n check: (from: StatePair | null, to: StatePair) => from?.payment === 'refunded' && to.payment !== 'refunded',\n },\n {\n id: 'no-leave-voided',\n description: 'Cannot un-void payment (voided orders stay voided on the payment axis)',\n check: (from: StatePair | null, to: StatePair) => from?.payment === 'voided' && to.payment !== 'voided',\n },\n {\n id: 'no-refund-without-fulfillment',\n description: 'Cannot mark payment as fully refunded unless fulfillment is delivered, returned, or cancelled',\n check: (_from: StatePair | null, to: StatePair) =>\n to.payment === 'refunded' && !REFUND_ALLOWED_FULFILLMENT.has(to.fulfillment),\n },\n {\n id: 'no-partial-refund-in-draft',\n description: 'Cannot partially refund while order is still in draft fulfillment',\n check: (_from: StatePair | null, to: StatePair) =>\n to.payment === 'partially_refunded' && to.fulfillment === 'draft',\n },\n {\n id: 'no-payment-regression',\n description: 'Payment cannot regress to a lower collection state without a refund — collected funds must be returned through the refund flow, not by reverting payment state',\n check: (from: StatePair | null, to: StatePair) => {\n if (!from) return false;\n const fromIdx = PAYMENT_COLLECTION_ORDER.indexOf(from.payment);\n const toIdx = PAYMENT_COLLECTION_ORDER.indexOf(to.payment);\n return fromIdx !== -1 && toIdx !== -1 && fromIdx > toIdx;\n },\n },\n] as const;\n\n/** Returns IDs of invariants violated by `from` → `to` (empty if none). */\nexport function getFinancialInvariantViolations(from: StatePair | null, to: StatePair): string[] {\n const ids: string[] = [];\n for (const inv of FINANCIAL_INVARIANTS) {\n if (inv.check(from, to)) {\n ids.push(inv.id);\n }\n }\n return ids;\n}\n\nexport function violatesFinancialInvariant(from: StatePair | null, to: StatePair): boolean {\n return getFinancialInvariantViolations(from, to).length > 0;\n}\n","import type { CrossAxisRule } from './interfaces';\n\n/**\n * Default merchant-toggleable cross-axis rules (Layer 1b).\n * Evaluation order and semantics are implemented in Phase 0b (`canTransition`).\n */\nexport const DEFAULT_CROSS_AXIS_RULES: readonly CrossAxisRule[] = [\n {\n id: 'require-payment-before-prep',\n label: 'Require payment before prep',\n description:\n 'When moving fulfillment to in progress, payment must be paid or partially paid',\n enabled: true,\n trigger: { axis: 'fulfillment', to: 'in_progress' },\n requires: { axis: 'payment', states: ['paid', 'partially_paid'] },\n },\n {\n id: 'require-fulfillment-or-return-before-full-refund',\n label: 'Require fulfillment or return before full refund',\n description:\n 'When moving payment to refunded, fulfillment must be fulfilled, returned, partially returned, or cancelled',\n enabled: true,\n trigger: { axis: 'payment', to: 'refunded' },\n requires: {\n axis: 'fulfillment',\n states: ['fulfilled', 'returned', 'partially_returned', 'cancelled'],\n },\n },\n {\n id: 'require-return-context-before-partial-refund',\n label: 'Require return path before partial refund',\n description:\n 'When moving payment to partially refunded, fulfillment must reflect a completed or return path',\n enabled: true,\n trigger: { axis: 'payment', to: 'partially_refunded' },\n requires: {\n axis: 'fulfillment',\n states: ['fulfilled', 'partially_returned', 'returned'],\n },\n },\n {\n id: 'block-fulfillment-when-payment-voided',\n label: 'Block fulfillment completion when payment is voided',\n description:\n 'When moving fulfillment to fulfilled, payment must not be voided',\n enabled: true,\n trigger: { axis: 'fulfillment', to: 'fulfilled' },\n requires: {\n axis: 'payment',\n states: ['unpaid', 'partially_paid', 'paid', 'partially_refunded', 'refunded'],\n },\n },\n {\n id: 'require-payment-before-fulfillment-complete',\n label: 'Require payment before fulfillment complete',\n description:\n 'When moving fulfillment to fulfilled, payment must be paid or partially paid',\n enabled: true,\n trigger: { axis: 'fulfillment', to: 'fulfilled' },\n requires: { axis: 'payment', states: ['paid', 'partially_paid'] },\n },\n];\n","import type {\n DisplayStateRule,\n StateConfig,\n StoredStateConfig,\n} from './interfaces';\nimport type { FulfillmentState, PaymentState } from './types';\nimport { PAYMENT_STATES, FULFILLMENT_STATES } from './types';\nimport { STATE_SCHEMA, basePaymentDefinitions, baseFulfillmentDefinitions } from './state-schema';\n\nconst DEFAULT_EPOCH = new Date(0);\n\nconst PAYMENT_LABELS = new Map<PaymentState, string>(\n basePaymentDefinitions().map((d) => [d.id, d.label]),\n);\nconst FULFILLMENT_LABELS = new Map<FulfillmentState, string>(\n baseFulfillmentDefinitions().map((d) => [d.id, d.label]),\n);\n\nconst TERMINAL_PAYMENT_STATES = new Set<PaymentState>(\n basePaymentDefinitions().filter((d) => d.isTerminal).map((d) => d.id),\n);\n\nconst DISPLAY_LABEL_OVERRIDES: Record<string, string> = {\n 'unpaid|draft': 'In Cart',\n 'unpaid|pending': 'Pending Payment',\n 'unpaid|on_hold': 'On Hold',\n 'unpaid|cancelled': 'Cancelled',\n 'partially_paid|pending': 'Deposit Received',\n 'partially_paid|on_hold': 'On Hold - Deposit Received',\n 'paid|pending': 'Paid - Awaiting Fulfillment',\n 'paid|on_hold': 'Paid - On Hold',\n 'paid|fulfilled': 'Completed',\n 'partially_refunded|fulfilled': 'Partially Refunded',\n 'partially_refunded|partially_returned': 'Partially Returned',\n 'refunded|fulfilled': 'Refunded',\n 'refunded|returned': 'Returned and Refunded',\n 'voided|cancelled': 'Cancelled',\n};\n\nfunction buildDefaultDisplayStateMap(): DisplayStateRule[] {\n const rules: DisplayStateRule[] = [];\n for (const p of PAYMENT_STATES) {\n for (const f of FULFILLMENT_STATES) {\n const key = `${p}|${f}`;\n const override = DISPLAY_LABEL_OVERRIDES[key];\n\n // Terminal payment states only emit entries with explicit overrides to avoid\n // impossible or duplicate combinations (e.g. refunded|draft, voided|pending).\n if (TERMINAL_PAYMENT_STATES.has(p) && !override) continue;\n\n const label = override ?? `${PAYMENT_LABELS.get(p)} / ${FULFILLMENT_LABELS.get(f)}`;\n rules.push({ paymentState: p, fulfillmentState: f, label });\n }\n }\n return rules;\n}\n\nexport const DEFAULT_DISPLAY_STATE_MAP: readonly DisplayStateRule[] =\n buildDefaultDisplayStateMap();\n\n/**\n * System default state configuration (fallback when no merchant config is synced).\n * Does NOT include paymentStates / fulfillmentStates — those live in STATE_SCHEMA.\n */\nexport const DEFAULT_CONFIG: StoredStateConfig = {\n _id: 'default',\n companyId: 'system',\n version: 1,\n name: 'Default',\n isDefault: true,\n paymentPaths: [],\n fulfillmentPaths: [],\n paymentPathMode: 'permissive',\n fulfillmentPathMode: 'permissive',\n crossAxisRules: [],\n transitionConditions: [],\n validInitialStates: [{ payment: 'unpaid', fulfillment: 'draft' }],\n displayStateMap: [...DEFAULT_DISPLAY_STATE_MAP],\n createdAt: DEFAULT_EPOCH,\n updatedAt: DEFAULT_EPOCH,\n};\n\n/** Merges a StoredStateConfig with STATE_SCHEMA into a full StateConfig. */\nexport function buildResolvedConfig(config: StoredStateConfig): StateConfig {\n return {\n ...config,\n paymentStates: STATE_SCHEMA.paymentStates,\n fulfillmentStates: STATE_SCHEMA.fulfillmentStates,\n };\n}\n\n/** Pre-built default StateConfig for engine fallbacks and tests. */\nexport const DEFAULT_RESOLVED_CONFIG: StateConfig =\n buildResolvedConfig(DEFAULT_CONFIG);\n","import { DEFAULT_CONFIG, DEFAULT_DISPLAY_STATE_MAP } from './default-config';\nimport type { StoredStateConfig } from './interfaces';\nimport type { StatePair } from './types';\n\n/**\n * POS-specific initial state pairs. Used the first time an order is written\n * to the DB (park, first payment, split payment first leg, gift-card quick\n * sale). A `canTransition` with `from: null` is only allowed when `to` matches\n * one of these pairs.\n *\n * - `partially_paid + draft` covers the first leg of a split payment on a\n * brand-new cart — the order has no persisted `pending` state yet, so\n * `deriveTargetState(\"pay\")` lands on `partially_paid + draft` until a\n * later leg completes the order and flips it to `paid + fulfilled`.\n */\nexport const POS_VALID_INITIAL_STATES: readonly StatePair[] = [\n { payment: 'unpaid', fulfillment: 'draft' },\n { payment: 'unpaid', fulfillment: 'on_hold' },\n { payment: 'unpaid', fulfillment: 'pending' },\n { payment: 'paid', fulfillment: 'fulfilled' },\n { payment: 'partially_paid', fulfillment: 'draft' },\n { payment: 'partially_paid', fulfillment: 'pending' },\n] as const;\n\n/**\n * Build a POS preset `StoredStateConfig`. This is the baseline config POS\n * clients (Render, Hub-API fallback, tests) use when no merchant-specific\n * config has been synced.\n */\nexport function buildPosPresetConfig(companyId?: string): StoredStateConfig {\n return {\n ...DEFAULT_CONFIG,\n _id: 'pos-preset',\n companyId: companyId ?? DEFAULT_CONFIG.companyId,\n name: 'POS Preset',\n crossAxisRules: [],\n validInitialStates: [...POS_VALID_INITIAL_STATES],\n displayStateMap: [...DEFAULT_DISPLAY_STATE_MAP],\n };\n}\n","import type { OrderContext, OrderLikeForContext, SplitPayment } from './interfaces';\n\nfunction sumNumbers(items: { amount?: number }[] | undefined): number {\n if (!items?.length) return 0;\n let t = 0;\n for (const x of items) {\n const n = x.amount;\n if (typeof n === 'number' && Number.isFinite(n)) t += n;\n }\n return t;\n}\n\nfunction sumRefundQuantities(\n refunds: { quantity?: number }[] | undefined\n): number {\n if (!refunds?.length) return 0;\n let t = 0;\n for (const r of refunds) {\n const q = r.quantity;\n if (typeof q === 'number' && Number.isFinite(q) && q > 0) t += q;\n }\n return t;\n}\n\n/**\n * Builds `OrderContext` for condition evaluation and transition checks.\n */\nexport function buildOrderContext(\n order: OrderLikeForContext | null | undefined,\n extras?: { splitPayment?: SplitPayment }\n): OrderContext {\n const o = order ?? {};\n const total = typeof o.total === 'number' && Number.isFinite(o.total) ? o.total : 0;\n const balance =\n typeof o.balance === 'number' && Number.isFinite(o.balance) ? o.balance : 0;\n const paymentMethods = o.paymentMethods ?? [];\n const refunds = o.refunds ?? o.refund ?? [];\n const lineItems = o.lineItems ?? [];\n\n const totalPaid = sumNumbers(paymentMethods);\n const totalRefunded = sumRefundQuantities(refunds);\n const isFullyPaid = total > 0 ? balance <= 0 : totalPaid > 0 && balance <= 0;\n const hasPartialPayments = totalPaid > 0 && balance > 0;\n\n let itemCount = 0;\n let fulfilledItemCount = 0;\n let returnedItemCount = 0;\n for (const li of lineItems) {\n const q =\n typeof li.quantity === 'number' && Number.isFinite(li.quantity)\n ? Math.max(0, li.quantity)\n : 0;\n itemCount += q;\n const fq =\n typeof li.fulfilledQuantity === 'number' &&\n Number.isFinite(li.fulfilledQuantity)\n ? Math.max(0, li.fulfilledQuantity)\n : 0;\n fulfilledItemCount += Math.min(fq, q);\n const rq =\n typeof li.returnedQuantity === 'number' &&\n Number.isFinite(li.returnedQuantity)\n ? Math.max(0, li.returnedQuantity)\n : 0;\n returnedItemCount += Math.min(rq, q);\n }\n\n const isFullyReturned =\n itemCount > 0 ? returnedItemCount >= itemCount : returnedItemCount > 0;\n const hasPartialReturns = returnedItemCount > 0 && !isFullyReturned;\n\n return {\n order: {\n total,\n balance,\n paymentMethods,\n refunds,\n lineItems,\n },\n computed: {\n balance,\n isFullyPaid,\n hasPartialPayments,\n totalPaid,\n totalRefunded,\n itemCount,\n fulfilledItemCount,\n returnedItemCount,\n isFullyReturned,\n hasPartialReturns,\n },\n splitPayment: extras?.splitPayment,\n };\n}\n","import type { DisplayStateResult, DisplayStateRule, StoredStateConfig } from './interfaces';\nfunction matchesOptional<T extends string>(\n actual: T,\n rule?: T | T[]\n): boolean {\n if (rule === undefined) return true;\n return Array.isArray(rule) ? rule.includes(actual) : rule === actual;\n}\n\n/**\n * Resolves the first matching rule in `config.displayStateMap` (ordered list).\n */\nexport function deriveDisplayState(\n payment: string,\n fulfillment: string,\n config: StoredStateConfig\n): DisplayStateResult {\n for (const rule of config.displayStateMap) {\n if (\n matchesOptional(payment, rule.paymentState) &&\n matchesOptional(fulfillment, rule.fulfillmentState)\n ) {\n return { label: rule.label, color: rule.color, icon: rule.icon };\n }\n }\n return { label: `${payment} / ${fulfillment}` };\n}\n\n/** @internal */\nexport function displayRuleMatchesPair(\n rule: DisplayStateRule,\n payment: string,\n fulfillment: string\n): boolean {\n return (\n matchesOptional(payment, rule.paymentState) &&\n matchesOptional(fulfillment, rule.fulfillmentState)\n );\n}\n","import type {\n Condition,\n FailedCondition,\n OrderContext,\n TransitionConditionSet,\n} from './interfaces';\n\nfunction getByPath(root: unknown, path: string): unknown {\n const parts = path.split('.').filter(Boolean);\n let cur: unknown = root;\n for (const p of parts) {\n if (cur === null || cur === undefined) return undefined;\n if (typeof cur !== 'object') return undefined;\n cur = (cur as Record<string, unknown>)[p];\n }\n return cur;\n}\n\nfunction isEmptyValue(v: unknown): boolean {\n if (v === null || v === undefined) return true;\n if (typeof v === 'string') return v.length === 0;\n if (Array.isArray(v)) return v.length === 0;\n return false;\n}\n\n/**\n * Evaluates a single condition against `OrderContext` (field paths like `order.balance`, `computed.isFullyPaid`).\n */\nexport function evaluateCondition(\n condition: Condition,\n context: OrderContext\n): { ok: boolean; failed?: FailedCondition } {\n const left = getByPath(context, condition.field);\n const op = condition.operator;\n const right = condition.value;\n\n let ok = false;\n switch (op) {\n case 'eq':\n ok = left === right;\n break;\n case 'neq':\n ok = left !== right;\n break;\n case 'gt':\n ok =\n typeof left === 'number' &&\n typeof right === 'number' &&\n left > right;\n break;\n case 'gte':\n ok =\n typeof left === 'number' &&\n typeof right === 'number' &&\n left >= right;\n break;\n case 'lt':\n ok =\n typeof left === 'number' &&\n typeof right === 'number' &&\n left < right;\n break;\n case 'lte':\n ok =\n typeof left === 'number' &&\n typeof right === 'number' &&\n left <= right;\n break;\n case 'in':\n ok = Array.isArray(right) && right.some((r) => r === left);\n break;\n case 'notIn':\n ok = Array.isArray(right) && !right.some((r) => r === left);\n break;\n case 'isEmpty':\n ok = isEmptyValue(left);\n break;\n case 'isNotEmpty':\n ok = !isEmptyValue(left);\n break;\n default: {\n const _exhaustive: never = op;\n return {\n ok: false,\n failed: {\n field: condition.field,\n operator: condition.operator,\n value: condition.value,\n reason: `Unknown operator: ${_exhaustive as string}`,\n },\n };\n }\n }\n\n if (!ok) {\n return {\n ok: false,\n failed: {\n field: condition.field,\n operator: condition.operator,\n value: condition.value,\n },\n };\n }\n return { ok: true };\n}\n\nfunction groupPasses(\n group: { conditions: Condition[] },\n context: OrderContext\n): { ok: boolean; failed: FailedCondition[] } {\n const failed: FailedCondition[] = [];\n for (const c of group.conditions) {\n const r = evaluateCondition(c, context);\n if (!r.ok && r.failed) failed.push(r.failed);\n }\n return { ok: failed.length === 0, failed };\n}\n\n/** OR of AND groups — true if any group passes. */\nexport function evaluateConditionSet(\n set: TransitionConditionSet | undefined,\n context: OrderContext\n): { ok: boolean; failedConditions: FailedCondition[] } {\n if (!set || set.groups.length === 0) {\n return { ok: true, failedConditions: [] };\n }\n const allFailed: FailedCondition[] = [];\n for (const g of set.groups) {\n const { ok, failed } = groupPasses(g, context);\n if (ok) return { ok: true, failedConditions: [] };\n allFailed.push(...failed);\n }\n return { ok: false, failedConditions: allFailed };\n}\n\nexport function conditionSummary(c: Condition): string {\n return `${c.field} ${c.operator} ${JSON.stringify(c.value)}`;\n}\n","import {\n conditionSummary,\n evaluateCondition,\n evaluateConditionSet,\n} from './condition-eval';\nimport { deriveDisplayState } from './display-state';\nimport { getFinancialInvariantViolations } from './financial-invariants';\nimport type {\n AvailableTransition,\n CrossAxisRule,\n FailedCondition,\n OrderContext,\n StateConfig,\n StoredStateConfig,\n TransitionRequest,\n TransitionResult,\n} from './interfaces';\nimport type { FulfillmentState, PaymentState, StatePair } from './types';\n\nexport type { TransitionRequest } from './interfaces';\n\nfunction pairInInitialList(to: StatePair, config: StoredStateConfig): boolean {\n return config.validInitialStates.some(\n (p) => p.payment === to.payment && p.fulfillment === to.fulfillment\n );\n}\n\nfunction triggerTargets(rule: CrossAxisRule): string[] {\n const t = rule.trigger.to;\n return Array.isArray(t) ? [...t] : [t];\n}\n\n/**\n * True when this rule applies to the edge `from` → `to` (trigger axis moved onto `trigger.to`).\n */\nexport function crossAxisRuleApplies(\n rule: CrossAxisRule,\n from: StatePair | null,\n to: StatePair\n): boolean {\n if (!rule.enabled) return false;\n const targets = triggerTargets(rule);\n if (rule.trigger.axis === 'fulfillment') {\n if (!targets.includes(to.fulfillment)) return false;\n if (from !== null && from.fulfillment === to.fulfillment) return false;\n return true;\n }\n if (!targets.includes(to.payment)) return false;\n if (from !== null && from.payment === to.payment) return false;\n return true;\n}\n\nfunction crossAxisSatisfied(rule: CrossAxisRule, to: StatePair): boolean {\n const req = rule.requires;\n if (req.axis === 'payment') {\n return req.states.includes(to.payment);\n }\n return req.states.includes(to.fulfillment);\n}\n\nfunction firstBlockingCrossAxisRule(\n from: StatePair | null,\n to: StatePair,\n config: StoredStateConfig\n): CrossAxisRule | undefined {\n for (const rule of config.crossAxisRules) {\n if (!crossAxisRuleApplies(rule, from, to)) continue;\n if (!crossAxisSatisfied(rule, to)) return rule;\n }\n return undefined;\n}\n\nfunction findConditionSet(config: StoredStateConfig, id: string | undefined) {\n if (!id) return undefined;\n return config.transitionConditions.find((s) => s.id === id);\n}\n\nfunction pathExists(\n paths: { from: string; to: string; conditionSetId?: string }[],\n fromId: string,\n toId: string\n): boolean {\n return paths.some((p) => p.from === fromId && p.to === toId);\n}\n\nfunction axisTransitionAllowed(\n mode: 'strict' | 'permissive',\n paths: { from: string; to: string; conditionSetId?: string }[],\n fromId: string,\n toId: string\n): boolean {\n if (fromId === toId) return true;\n if (mode === 'permissive') return true;\n return pathExists(paths, fromId, toId);\n}\n\nfunction collectPathConditionFailures(\n config: StoredStateConfig,\n from: StatePair | null,\n to: StatePair,\n context: OrderContext\n): { failed: FailedCondition[] } {\n const failed: FailedCondition[] = [];\n if (from === null) return { failed };\n\n if (from.payment !== to.payment) {\n const p = config.paymentPaths.find(\n (x) => x.from === from.payment && x.to === to.payment\n );\n const set = findConditionSet(config, p?.conditionSetId);\n const ev = evaluateConditionSet(set, context);\n if (!ev.ok) failed.push(...ev.failedConditions);\n }\n\n if (from.fulfillment !== to.fulfillment) {\n const p = config.fulfillmentPaths.find(\n (x) => x.from === from.fulfillment && x.to === to.fulfillment\n );\n const set = findConditionSet(config, p?.conditionSetId);\n const ev = evaluateConditionSet(set, context);\n if (!ev.ok) failed.push(...ev.failedConditions);\n }\n\n return { failed };\n}\n\nfunction pathBlocked(\n config: StoredStateConfig,\n from: StatePair | null,\n to: StatePair\n): boolean {\n if (from === null) return false;\n if (\n from.payment !== to.payment &&\n !axisTransitionAllowed(\n config.paymentPathMode,\n config.paymentPaths,\n from.payment,\n to.payment\n )\n ) {\n return true;\n }\n if (\n from.fulfillment !== to.fulfillment &&\n !axisTransitionAllowed(\n config.fulfillmentPathMode,\n config.fulfillmentPaths,\n from.fulfillment,\n to.fulfillment\n )\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * Three-layer evaluation: financial invariants → cross-axis rules → paths → conditions.\n * Order creation (`from === null`): validInitialStates + guards; paths/conditions skipped.\n */\nexport function canTransition(request: TransitionRequest): TransitionResult {\n const { from, to, config, context } = request;\n\n const fin = getFinancialInvariantViolations(from, to);\n if (fin.length > 0) {\n return {\n allowed: false,\n blockedBy: 'financial_invariant',\n guard: fin[0],\n reason: `Blocked by financial invariant: ${fin[0]}`,\n };\n }\n\n const cross = firstBlockingCrossAxisRule(from, to, config);\n if (cross) {\n return {\n allowed: false,\n blockedBy: 'cross_axis_rule',\n guard: cross.id,\n reason: `Blocked by cross-axis rule: ${cross.label}`,\n };\n }\n\n if (from === null) {\n if (!pairInInitialList(to, config)) {\n return {\n allowed: false,\n blockedBy: 'path',\n reason: 'Target state is not a valid initial state for new orders',\n };\n }\n } else if (pathBlocked(config, from, to)) {\n return {\n allowed: false,\n blockedBy: 'path',\n reason: 'Transition is not allowed by configured path rules',\n };\n }\n\n if (!request.skipConditionEvaluation) {\n const cond = collectPathConditionFailures(config, from, to, context);\n if (cond.failed.length > 0) {\n return {\n allowed: false,\n blockedBy: 'condition',\n reason: 'Transition conditions not satisfied',\n failedConditions: cond.failed,\n };\n }\n }\n\n return { allowed: true };\n}\n\nfunction labelForPayment(id: PaymentState, config: StateConfig): string {\n return config.paymentStates.find((s) => s.id === id)?.label ?? id;\n}\n\nfunction labelForFulfillment(id: FulfillmentState, config: StateConfig): string {\n return config.fulfillmentStates.find((s) => s.id === id)?.label ?? id;\n}\n\nfunction transitionDisplayLabel(to: StatePair, config: StateConfig): string {\n const pay = labelForPayment(to.payment, config);\n const ful = labelForFulfillment(to.fulfillment, config);\n const derived = deriveDisplayState(to.payment, to.fulfillment, config).label;\n if (derived && derived !== `${to.payment} / ${to.fulfillment}`) {\n return derived;\n }\n return `${pay} · ${ful}`;\n}\n\nfunction conditionMetLines(\n config: StateConfig,\n from: StatePair,\n to: StatePair,\n context: OrderContext\n): { met: boolean; description: string }[] {\n const lines: { met: boolean; description: string }[] = [];\n\n const appendForPath = (\n p:\n | { conditionSetId?: string }\n | undefined\n ) => {\n const set = findConditionSet(config, p?.conditionSetId);\n if (!set) return;\n for (const g of set.groups) {\n for (const c of g.conditions) {\n const r = evaluateCondition(c, context);\n lines.push({\n met: r.ok,\n description: conditionSummary(c),\n });\n }\n }\n };\n\n if (from.payment !== to.payment) {\n const p = config.paymentPaths.find(\n (x) => x.from === from.payment && x.to === to.payment\n );\n appendForPath(p);\n }\n if (from.fulfillment !== to.fulfillment) {\n const p = config.fulfillmentPaths.find(\n (x) => x.from === from.fulfillment && x.to === to.fulfillment\n );\n appendForPath(p);\n }\n\n return lines;\n}\n\n/**\n * All target pairs reachable in one step from `current` that pass `canTransition`.\n */\nexport function getAvailableTransitions(\n current: StatePair,\n config: StateConfig,\n context: OrderContext\n): AvailableTransition[] {\n const candidates: StatePair[] = [];\n\n for (const s of config.paymentStates) {\n if (s.id === current.payment) continue;\n candidates.push({ payment: s.id, fulfillment: current.fulfillment });\n }\n for (const s of config.fulfillmentStates) {\n if (s.id === current.fulfillment) continue;\n candidates.push({ payment: current.payment, fulfillment: s.id });\n }\n\n const out: AvailableTransition[] = [];\n const seen = new Set<string>();\n\n for (const to of candidates) {\n const key = `${to.payment}:${to.fulfillment}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const result = canTransition({\n from: current,\n to,\n config,\n context,\n });\n if (!result.allowed) continue;\n\n out.push({\n to,\n displayLabel: transitionDisplayLabel(to, config),\n conditions: conditionMetLines(config, current, to, context),\n });\n }\n\n return out;\n}\n","import { buildOrderContext } from './build-order-context';\nimport { displayRuleMatchesPair } from './display-state';\nimport { canTransition } from './engine';\nimport { getFinancialInvariantViolations } from './financial-invariants';\nimport type {\n ConfigValidationError,\n ConfigValidationResult,\n ConfigValidationWarning,\n Condition,\n StateConfig,\n} from './interfaces';\nimport type { StatePair } from './types';\nimport { CONDITION_OPERATORS, FULFILLMENT_STATES, PAYMENT_STATES } from './types';\n\nfunction paymentStateIds(config: StateConfig): Set<string> {\n return new Set<string>(config.paymentStates.map((s) => s.id));\n}\n\nfunction fulfillmentStateIds(config: StateConfig): Set<string> {\n return new Set<string>(config.fulfillmentStates.map((s) => s.id));\n}\n\nconst VALID_OPERATORS = new Set<string>(CONDITION_OPERATORS);\n\nfunction validateConditionShape(\n c: Condition,\n path: string,\n errors: ConfigValidationError[]\n): void {\n if (!VALID_OPERATORS.has(c.operator)) {\n errors.push({\n code: 'invalid_condition_operator',\n message: `Unknown operator \"${c.operator}\"`,\n path,\n });\n return;\n }\n const needsNumberCompare = ['gt', 'gte', 'lt', 'lte'].includes(c.operator);\n if (needsNumberCompare && typeof c.value !== 'number') {\n errors.push({\n code: 'invalid_condition_value_type',\n message: `Operator \"${c.operator}\" requires a numeric value`,\n path: `${path}.value`,\n });\n }\n if ((c.operator === 'in' || c.operator === 'notIn') && !Array.isArray(c.value)) {\n errors.push({\n code: 'invalid_condition_value_type',\n message: `Operator \"${c.operator}\" requires an array value`,\n path: `${path}.value`,\n });\n }\n}\n\n/** Generous context so reachability probes are not blocked by typical payment conditions. */\nfunction validationContext() {\n return buildOrderContext({\n total: 100,\n balance: 0,\n paymentMethods: [{ amount: 100 }],\n lineItems: [{ quantity: 1, fulfilledQuantity: 1, returnedQuantity: 0 }],\n });\n}\n\nfunction pairKey(p: StatePair): string {\n return `${p.payment}\\0${p.fulfillment}`;\n}\n\n/**\n * Structural + semantic validation for `StateConfig`.\n */\nexport function validateConfig(config: StateConfig): ConfigValidationResult {\n const errors: ConfigValidationError[] = [];\n const warnings: ConfigValidationWarning[] = [];\n\n if (!Number.isFinite(config.version) || config.version < 1) {\n errors.push({\n code: 'invalid_version',\n message: 'version must be a finite number >= 1',\n path: 'version',\n });\n }\n\n if (!config.validInitialStates?.length) {\n errors.push({\n code: 'missing_initial_states',\n message: 'validInitialStates must contain at least one pair',\n path: 'validInitialStates',\n });\n }\n\n const payIds = paymentStateIds(config);\n const fulIds = fulfillmentStateIds(config);\n\n config.validInitialStates?.forEach((pair, i) => {\n if (!payIds.has(pair.payment)) {\n errors.push({\n code: 'initial_unknown_payment',\n message: `validInitialStates[${i}].payment \"${pair.payment}\" is not defined`,\n path: `validInitialStates[${i}].payment`,\n });\n }\n if (!fulIds.has(pair.fulfillment)) {\n errors.push({\n code: 'initial_unknown_fulfillment',\n message: `validInitialStates[${i}].fulfillment \"${pair.fulfillment}\" is not defined`,\n path: `validInitialStates[${i}].fulfillment`,\n });\n }\n });\n\n const conditionSetIds = new Set(config.transitionConditions.map((s) => s.id));\n config.transitionConditions.forEach((set, si) => {\n set.groups.forEach((g, gi) => {\n g.conditions.forEach((c, ci) => {\n validateConditionShape(\n c,\n `transitionConditions[${si}].groups[${gi}].conditions[${ci}]`,\n errors\n );\n });\n });\n });\n\n const pathConditionRef = (\n paths: ReadonlyArray<{ from: string; to: string; conditionSetId?: string }>,\n axis: string\n ) => {\n paths.forEach((p, i) => {\n if (p.conditionSetId && !conditionSetIds.has(p.conditionSetId)) {\n errors.push({\n code: 'unknown_condition_set',\n message: `${axis}Paths[${i}] references unknown conditionSetId \"${p.conditionSetId}\"`,\n path: `${axis}Paths[${i}].conditionSetId`,\n });\n }\n });\n };\n pathConditionRef(config.paymentPaths, 'payment');\n pathConditionRef(config.fulfillmentPaths, 'fulfillment');\n\n config.paymentPaths.forEach((path, i) => {\n if (!payIds.has(path.from) || !payIds.has(path.to)) {\n errors.push({\n code: 'payment_path_unknown_state',\n message: `paymentPaths[${i}] references unknown payment state`,\n path: `paymentPaths[${i}]`,\n });\n return;\n }\n for (const f of config.fulfillmentStates) {\n const from: StatePair = { payment: path.from, fulfillment: f.id };\n const to: StatePair = { payment: path.to, fulfillment: f.id };\n if (getFinancialInvariantViolations(null, from).length > 0) continue;\n const v = getFinancialInvariantViolations(from, to);\n if (v.length > 0) {\n errors.push({\n code: 'payment_path_violates_financial_invariant',\n message: `paymentPaths[${i}] (${path.from}→${path.to}) with fulfillment \"${f.id}\" violates invariant(s): ${v.join(', ')}`,\n path: `paymentPaths[${i}]`,\n });\n }\n }\n });\n\n config.fulfillmentPaths.forEach((path, i) => {\n if (!fulIds.has(path.from) || !fulIds.has(path.to)) {\n errors.push({\n code: 'fulfillment_path_unknown_state',\n message: `fulfillmentPaths[${i}] references unknown fulfillment state`,\n path: `fulfillmentPaths[${i}]`,\n });\n return;\n }\n for (const p of config.paymentStates) {\n const from: StatePair = { payment: p.id, fulfillment: path.from };\n const to: StatePair = { payment: p.id, fulfillment: path.to };\n // Skip pairs that are not valid steady states (e.g. refunded+draft); path checks are for real edges.\n if (getFinancialInvariantViolations(null, from).length > 0) continue;\n const v = getFinancialInvariantViolations(from, to);\n if (v.length > 0) {\n errors.push({\n code: 'fulfillment_path_violates_financial_invariant',\n message: `fulfillmentPaths[${i}] (${path.from}→${path.to}) with payment \"${p.id}\" violates invariant(s): ${v.join(', ')}`,\n path: `fulfillmentPaths[${i}]`,\n });\n }\n }\n });\n\n config.crossAxisRules.forEach((rule, i) => {\n const req = rule.requires;\n if (req.axis === 'payment') {\n for (const id of req.states) {\n if (!payIds.has(id)) {\n errors.push({\n code: 'cross_axis_unknown_payment',\n message: `crossAxisRules[${i}] requires unknown payment state \"${id}\"`,\n path: `crossAxisRules[${i}].requires.states`,\n });\n }\n }\n } else {\n for (const id of req.states) {\n if (!fulIds.has(id)) {\n errors.push({\n code: 'cross_axis_unknown_fulfillment',\n message: `crossAxisRules[${i}] requires unknown fulfillment state \"${id}\"`,\n path: `crossAxisRules[${i}].requires.states`,\n });\n }\n }\n }\n\n const trig = rule.trigger;\n const targets = Array.isArray(trig.to) ? trig.to : [trig.to];\n if (trig.axis === 'payment') {\n for (const id of targets) {\n if (!payIds.has(id)) {\n errors.push({\n code: 'cross_axis_trigger_unknown_payment',\n message: `crossAxisRules[${i}] triggers on unknown payment state \"${id}\"`,\n path: `crossAxisRules[${i}].trigger.to`,\n });\n }\n }\n } else {\n for (const id of targets) {\n if (!fulIds.has(id)) {\n errors.push({\n code: 'cross_axis_trigger_unknown_fulfillment',\n message: `crossAxisRules[${i}] triggers on unknown fulfillment state \"${id}\"`,\n path: `crossAxisRules[${i}].trigger.to`,\n });\n }\n }\n }\n });\n\n strictAxisReachability(config, 'payment', payIds, warnings);\n strictAxisReachability(config, 'fulfillment', fulIds, warnings);\n\n combinedReachability(config, warnings);\n\n if (!config.displayStateMap.length) {\n warnings.push({\n code: 'empty_display_map',\n message: 'displayStateMap is empty; UI will fall back to raw state pair labels',\n path: 'displayStateMap',\n });\n } else {\n const missingDisplay: string[] = [];\n for (const p of PAYMENT_STATES) {\n for (const f of FULFILLMENT_STATES) {\n if (!payIds.has(p) || !fulIds.has(f)) continue;\n const matched = config.displayStateMap.some((rule) =>\n displayRuleMatchesPair(rule, p, f)\n );\n if (!matched) missingDisplay.push(`${p}/${f}`);\n }\n }\n if (missingDisplay.length > 0) {\n const sample = missingDisplay.slice(0, 8).join(', ');\n const more =\n missingDisplay.length > 8\n ? ` (+${missingDisplay.length - 8} more)`\n : '';\n warnings.push({\n code: 'display_map_missing_combos',\n message: `No displayStateMap rule matches ${missingDisplay.length} base pair(s): ${sample}${more}`,\n path: 'displayStateMap',\n });\n }\n }\n\n refundReturnPathWarnings(config, payIds, fulIds, warnings);\n\n if (config.paymentPathMode === 'strict' && config.paymentPaths.length === 0) {\n errors.push({\n code: 'strict_payment_paths_empty',\n message: 'paymentPathMode is strict but paymentPaths is empty',\n path: 'paymentPaths',\n });\n }\n if (config.fulfillmentPathMode === 'strict' && config.fulfillmentPaths.length === 0) {\n errors.push({\n code: 'strict_fulfillment_paths_empty',\n message: 'fulfillmentPathMode is strict but fulfillmentPaths is empty',\n path: 'fulfillmentPaths',\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nfunction strictAxisReachability(\n config: StateConfig,\n axis: 'payment' | 'fulfillment',\n ids: Set<string>,\n warnings: ConfigValidationWarning[]\n): void {\n const mode = axis === 'payment' ? config.paymentPathMode : config.fulfillmentPathMode;\n const paths = axis === 'payment' ? config.paymentPaths : config.fulfillmentPaths;\n if (mode !== 'strict' || paths.length === 0) return;\n\n const reachable = new Set<string>();\n const initials = new Set(\n config.validInitialStates.map((p) => (axis === 'payment' ? p.payment : p.fulfillment))\n );\n for (const id of initials) {\n if (ids.has(id)) bfsAxis(id, paths, reachable);\n }\n\n const stateRows =\n axis === 'payment' ? config.paymentStates : config.fulfillmentStates;\n for (const id of stateRows) {\n if (!reachable.has(id.id)) {\n warnings.push({\n code: `${axis}_state_unreachable_strict`,\n message: `State \"${id.id}\" may be unreachable from valid initial ${axis} states under strict paths`,\n path: axis === 'payment' ? 'paymentPaths' : 'fulfillmentPaths',\n });\n }\n if (!id.isTerminal) {\n const hasOut = paths.some((p) => p.from === id.id && p.to !== id.id);\n if (!hasOut) {\n warnings.push({\n code: `${axis}_nonterminal_no_outbound`,\n message: `Non-terminal ${axis} state \"${id.id}\" has no strict outbound path`,\n path: axis === 'payment' ? 'paymentPaths' : 'fulfillmentPaths',\n });\n }\n }\n }\n}\n\nfunction bfsAxis(\n start: string,\n paths: { from: string; to: string }[],\n reachable: Set<string>\n): void {\n const q = [start];\n reachable.add(start);\n while (q.length) {\n const cur = q.pop()!;\n for (const p of paths) {\n if (p.from !== cur) continue;\n if (!reachable.has(p.to)) {\n reachable.add(p.to);\n q.push(p.to);\n }\n }\n }\n}\n\nfunction combinedReachability(\n config: StateConfig,\n warnings: ConfigValidationWarning[]\n): void {\n const ctx = validationContext();\n const payIds = config.paymentStates.map((s) => s.id);\n const fulIds = config.fulfillmentStates.map((s) => s.id);\n const seen = new Set<string>();\n const queue: StatePair[] = [...config.validInitialStates];\n for (const p of queue) {\n seen.add(pairKey(p));\n }\n while (queue.length) {\n const cur = queue.pop()!;\n for (const np of payIds) {\n if (np === cur.payment) continue;\n const to = { payment: np, fulfillment: cur.fulfillment };\n const r = canTransition({\n from: cur,\n to,\n config,\n context: ctx,\n skipConditionEvaluation: true,\n });\n const k = pairKey(to);\n if (r.allowed && !seen.has(k)) {\n seen.add(k);\n queue.push(to);\n }\n }\n for (const nf of fulIds) {\n if (nf === cur.fulfillment) continue;\n const to = { payment: cur.payment, fulfillment: nf };\n const r = canTransition({\n from: cur,\n to,\n config,\n context: ctx,\n skipConditionEvaluation: true,\n });\n const k = pairKey(to);\n if (r.allowed && !seen.has(k)) {\n seen.add(k);\n queue.push(to);\n }\n }\n }\n\n const total = payIds.length * fulIds.length;\n if (\n seen.size < total &&\n (config.paymentPathMode === 'strict' || config.fulfillmentPathMode === 'strict')\n ) {\n warnings.push({\n code: 'combined_pairs_not_all_reachable',\n message:\n 'Some payment×fulfillment pairs appear unreachable under current paths, cross-axis rules, and financial invariants (structural check with generic context)',\n path: 'validInitialStates',\n });\n }\n}\n\nfunction refundReturnPathWarnings(\n config: StateConfig,\n payIds: Set<string>,\n fulIds: Set<string>,\n warnings: ConfigValidationWarning[]\n): void {\n const hasReturned = config.fulfillmentPaths.some(\n (p) => p.to === 'returned' || p.from === 'returned'\n );\n const hasRefunded = config.paymentPaths.some(\n (p) => p.to === 'refunded' || p.from === 'refunded'\n );\n if (\n fulIds.has('returned') &&\n hasReturned &&\n payIds.has('refunded') &&\n !hasRefunded &&\n config.paymentPathMode === 'strict'\n ) {\n warnings.push({\n code: 'refund_path_missing_for_return',\n message:\n 'Fulfillment paths mention \"returned\" but no strict payment path touches \"refunded\"; verify refund workflow',\n path: 'paymentPaths',\n });\n }\n}\n","import { deriveDisplayState } from './display-state';\nimport type { OrderStateWritable, StoredStateConfig } from './interfaces';\nimport type { FulfillmentState, PaymentState, StatePair } from './types';\n\n/**\n * Maps atoms to legacy `status` for dual-write across the full POS vocabulary:\n * 'in-cart' | 'parked' | 'completed' | 'refunded' | 'partial-refund' | 'park-deleted'.\n *\n * Evaluation order matters: refund and void outcomes are terminal and take precedence\n * over fulfillment, so a `voided` order always maps to `park-deleted` regardless of\n * how the fulfillment axis landed (cancelled, returned, etc.). Same for refund terminals.\n */\nexport function mapToLegacyStatus(pair: StatePair): string {\n const { payment, fulfillment } = pair;\n\n // Terminal void — hard-deleted parked order or voided payment.\n if (payment === 'voided') return 'park-deleted';\n\n // Refund outcomes.\n if (payment === 'refunded') return 'refunded';\n if (payment === 'partially_refunded') return 'partial-refund';\n\n // Fully-paid orders. POS auto-fulfills on payment, so fulfilled/in_progress/pending\n // all collapse to 'completed' for the legacy status consumers (web, analytics, etc.).\n if (payment === 'paid') return 'completed';\n\n // Unpaid / partially-paid orders.\n if (fulfillment === 'draft') return 'in-cart';\n if (fulfillment === 'on_hold') return 'parked';\n if (fulfillment === 'pending') return 'parked';\n if (fulfillment === 'cancelled') return 'park-deleted';\n\n return 'parked';\n}\n\n/**\n * Writes payment/fulfillment atoms, derived display label, and legacy `status` in one place.\n */\nexport function setOrderState(\n order: OrderStateWritable,\n paymentState: PaymentState,\n fulfillmentState: FulfillmentState,\n config: StoredStateConfig,\n options?: { includeLegacyStatus?: boolean },\n): void {\n order.paymentState = paymentState;\n order.fulfillmentState = fulfillmentState;\n const display = deriveDisplayState(paymentState, fulfillmentState, config);\n order.displayState = display.label;\n if (options?.includeLegacyStatus !== false) {\n order.status = mapToLegacyStatus({ payment: paymentState, fulfillment: fulfillmentState });\n }\n}\n","import type { OrderLikeForLegacyInference } from './interfaces';\nimport type { StatePair } from './types';\n\nfunction normalizeStatus(raw: string | undefined): string {\n return (raw ?? '').trim().toLowerCase();\n}\n\nfunction hasRefundActivity(order: OrderLikeForLegacyInference): boolean {\n const refunds = order.refunds ?? order.refund ?? [];\n return refunds.some((r) => {\n const q = r.quantity;\n return typeof q === 'number' && q > 0;\n });\n}\n\n/**\n * Deterministic mapping from legacy `order.status` (and payment/refund hints) to state atoms.\n * See plan §2.5 — conservative refund rows assume return tracking on fulfillment.\n */\nexport function inferStatesFromLegacyStatus(\n order: OrderLikeForLegacyInference\n): StatePair {\n const status = normalizeStatus(order.status);\n\n if (status === 'completed') {\n return { payment: 'paid', fulfillment: 'fulfilled' };\n }\n\n if (status === 'in-cart') {\n return { payment: 'unpaid', fulfillment: 'draft' };\n }\n\n if (status === 'park-deleted') {\n return { payment: 'voided', fulfillment: 'cancelled' };\n }\n\n if (status === 'refunded') {\n return { payment: 'refunded', fulfillment: 'returned' };\n }\n\n if (status === 'partial-refund' || status === 'partial_refund') {\n return { payment: 'partially_refunded', fulfillment: 'partially_returned' };\n }\n\n if (status === 'parked') {\n const ctx = order.paymentMethods ?? [];\n const paid = ctx.reduce((s, m) => {\n const a = m.amount;\n return s + (typeof a === 'number' && Number.isFinite(a) ? a : 0);\n }, 0);\n const partial =\n paid > 0 ||\n (typeof order.balance === 'number' &&\n typeof order.total === 'number' &&\n order.total > 0 &&\n order.balance > 0 &&\n order.balance < order.total);\n return {\n payment: partial ? 'partially_paid' : 'unpaid',\n fulfillment: 'on_hold',\n };\n }\n\n if (status === '' && hasRefundActivity(order)) {\n return { payment: 'partially_refunded', fulfillment: 'partially_returned' };\n }\n\n return { payment: 'unpaid', fulfillment: 'pending' };\n}\n","import type { FragmentParam, StateConfigFragment } from './interfaces';\n\nexport interface ResolveTemplateResult {\n fragment: StateConfigFragment;\n resolvedValues: Record<string, unknown>;\n}\n\n/**\n * Resolves a parameterized fragment template into a concrete StateConfigFragment.\n *\n * 1. Merges supplied `values` with param defaults (supplied wins).\n * 2. Validates each resolved value against its param definition.\n * 3. Substitutes `{{key}}` placeholders in the raw template string.\n * 4. Parses the result as JSON into a StateConfigFragment.\n */\nexport function resolveTemplate(\n templateJson: string,\n params: FragmentParam[],\n values: Record<string, unknown> = {},\n): ResolveTemplateResult {\n const resolvedValues: Record<string, unknown> = {};\n\n for (const param of params) {\n const raw = values[param.key] ?? param.default;\n if (raw === undefined || raw === null) {\n throw new Error(`Missing required parameter: \"${param.key}\" (${param.label})`);\n }\n\n validateParamValue(param, raw);\n resolvedValues[param.key] = raw;\n }\n\n let resolved = templateJson;\n for (const [key, value] of Object.entries(resolvedValues)) {\n const placeholder = `{{${key}}}`;\n const replacement =\n typeof value === 'string' ? escapeJsonString(value) : String(value);\n resolved = replaceAll(resolved, placeholder, replacement);\n }\n\n let fragment: StateConfigFragment;\n try {\n fragment = JSON.parse(resolved);\n } catch (err) {\n throw new Error(\n `Fragment template produced invalid JSON after substitution: ${(err as Error).message}`,\n );\n }\n\n return { fragment, resolvedValues };\n}\n\nfunction validateParamValue(param: FragmentParam, value: unknown): void {\n const { key, label, type } = param;\n\n if (type === 'string' && typeof value !== 'string') {\n throw new Error(`Parameter \"${key}\" (${label}) must be a string, got ${typeof value}`);\n }\n if (type === 'number') {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n throw new Error(`Parameter \"${key}\" (${label}) must be a number`);\n }\n if (param.min !== undefined && value < param.min) {\n throw new Error(`Parameter \"${key}\" (${label}) must be >= ${param.min}`);\n }\n if (param.max !== undefined && value > param.max) {\n throw new Error(`Parameter \"${key}\" (${label}) must be <= ${param.max}`);\n }\n }\n if (type === 'boolean' && typeof value !== 'boolean') {\n throw new Error(`Parameter \"${key}\" (${label}) must be a boolean`);\n }\n if (param.options && param.options.length > 0 && !param.options.includes(String(value))) {\n throw new Error(\n `Parameter \"${key}\" (${label}) must be one of: ${param.options.join(', ')}`,\n );\n }\n}\n\n/** Escapes a string for safe embedding inside a JSON-quoted value. */\nfunction escapeJsonString(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t');\n}\n\nfunction replaceAll(str: string, search: string, replacement: string): string {\n let result = str;\n let idx = result.indexOf(search);\n while (idx !== -1) {\n result = result.slice(0, idx) + replacement + result.slice(idx + search.length);\n idx = result.indexOf(search, idx + replacement.length);\n }\n return result;\n}\n","import type {\n ConfigValidationError,\n StoredStateConfig,\n StateConfigFragment,\n} from './interfaces';\nimport { isFulfillmentState, isPaymentState } from './types';\n\nexport interface FragmentValidationResult {\n valid: boolean;\n errors: ConfigValidationError[];\n}\n\n/**\n * Validates a StateConfigFragment against an existing StateConfig.\n *\n * Checks:\n * 1. All state references are members of the closed PaymentState / FulfillmentState unions.\n * 2. No duplicate path edges (from, to) on the same axis.\n * 3. No duplicate condition set IDs.\n * 4. No duplicate cross-axis rule IDs.\n */\nexport function validateFragmentCompatibility(\n config: StoredStateConfig,\n fragment: StateConfigFragment,\n): FragmentValidationResult {\n const errors: ConfigValidationError[] = [];\n\n validateStateReferences(fragment, errors);\n validatePathUniqueness(config, fragment, errors);\n validateConditionSetUniqueness(config, fragment, errors);\n validateCrossAxisRuleUniqueness(config, fragment, errors);\n\n return { valid: errors.length === 0, errors };\n}\n\nfunction validateStateReferences(\n fragment: StateConfigFragment,\n errors: ConfigValidationError[],\n): void {\n for (const path of fragment.paymentPaths ?? []) {\n if (!isPaymentState(path.from)) {\n errors.push({\n code: 'invalid_payment_state',\n message: `Unknown payment state \"${path.from}\" in paymentPaths`,\n path: `paymentPaths[from=${path.from}]`,\n });\n }\n if (!isPaymentState(path.to)) {\n errors.push({\n code: 'invalid_payment_state',\n message: `Unknown payment state \"${path.to}\" in paymentPaths`,\n path: `paymentPaths[to=${path.to}]`,\n });\n }\n }\n\n for (const path of fragment.fulfillmentPaths ?? []) {\n if (!isFulfillmentState(path.from)) {\n errors.push({\n code: 'invalid_fulfillment_state',\n message: `Unknown fulfillment state \"${path.from}\" in fulfillmentPaths`,\n path: `fulfillmentPaths[from=${path.from}]`,\n });\n }\n if (!isFulfillmentState(path.to)) {\n errors.push({\n code: 'invalid_fulfillment_state',\n message: `Unknown fulfillment state \"${path.to}\" in fulfillmentPaths`,\n path: `fulfillmentPaths[to=${path.to}]`,\n });\n }\n }\n\n for (const rule of fragment.crossAxisRules ?? []) {\n const triggerStates = Array.isArray(rule.trigger.to) ? rule.trigger.to : [rule.trigger.to];\n const check = rule.trigger.axis === 'payment' ? isPaymentState : isFulfillmentState;\n for (const s of triggerStates) {\n if (!check(s)) {\n errors.push({\n code: `invalid_${rule.trigger.axis}_state`,\n message: `Unknown ${rule.trigger.axis} state \"${s}\" in crossAxisRule \"${rule.id}\" trigger`,\n path: `crossAxisRules[${rule.id}].trigger.to`,\n });\n }\n }\n const reqCheck = rule.requires.axis === 'payment' ? isPaymentState : isFulfillmentState;\n for (const s of rule.requires.states) {\n if (!reqCheck(s)) {\n errors.push({\n code: `invalid_${rule.requires.axis}_state`,\n message: `Unknown ${rule.requires.axis} state \"${s}\" in crossAxisRule \"${rule.id}\" requires`,\n path: `crossAxisRules[${rule.id}].requires.states`,\n });\n }\n }\n }\n\n for (const pair of fragment.validInitialStates ?? []) {\n if (!isPaymentState(pair.payment)) {\n errors.push({\n code: 'invalid_payment_state',\n message: `Unknown payment state \"${pair.payment}\" in validInitialStates`,\n path: 'validInitialStates',\n });\n }\n if (!isFulfillmentState(pair.fulfillment)) {\n errors.push({\n code: 'invalid_fulfillment_state',\n message: `Unknown fulfillment state \"${pair.fulfillment}\" in validInitialStates`,\n path: 'validInitialStates',\n });\n }\n }\n\n for (const rule of fragment.displayStateMap ?? []) {\n const pStates = rule.paymentState\n ? (Array.isArray(rule.paymentState) ? rule.paymentState : [rule.paymentState])\n : [];\n for (const s of pStates) {\n if (!isPaymentState(s)) {\n errors.push({\n code: 'invalid_payment_state',\n message: `Unknown payment state \"${s}\" in displayStateMap rule \"${rule.label}\"`,\n path: 'displayStateMap',\n });\n }\n }\n const fStates = rule.fulfillmentState\n ? (Array.isArray(rule.fulfillmentState) ? rule.fulfillmentState : [rule.fulfillmentState])\n : [];\n for (const s of fStates) {\n if (!isFulfillmentState(s)) {\n errors.push({\n code: 'invalid_fulfillment_state',\n message: `Unknown fulfillment state \"${s}\" in displayStateMap rule \"${rule.label}\"`,\n path: 'displayStateMap',\n });\n }\n }\n }\n}\n\nfunction validatePathUniqueness(\n config: StoredStateConfig,\n fragment: StateConfigFragment,\n errors: ConfigValidationError[],\n): void {\n const existingPaymentEdges = new Set(\n config.paymentPaths.map((p) => `${p.from}->${p.to}`),\n );\n for (const path of fragment.paymentPaths ?? []) {\n const edge = `${path.from}->${path.to}`;\n if (existingPaymentEdges.has(edge)) {\n errors.push({\n code: 'duplicate_payment_path',\n message: `Payment path ${path.from} → ${path.to} already exists in the config`,\n path: `paymentPaths[${edge}]`,\n });\n }\n }\n\n const existingFulfillmentEdges = new Set(\n config.fulfillmentPaths.map((p) => `${p.from}->${p.to}`),\n );\n for (const path of fragment.fulfillmentPaths ?? []) {\n const edge = `${path.from}->${path.to}`;\n if (existingFulfillmentEdges.has(edge)) {\n errors.push({\n code: 'duplicate_fulfillment_path',\n message: `Fulfillment path ${path.from} → ${path.to} already exists in the config`,\n path: `fulfillmentPaths[${edge}]`,\n });\n }\n }\n}\n\nfunction validateConditionSetUniqueness(\n config: StoredStateConfig,\n fragment: StateConfigFragment,\n errors: ConfigValidationError[],\n): void {\n const existingIds = new Set(config.transitionConditions.map((c) => c.id));\n for (const cond of fragment.transitionConditions ?? []) {\n if (existingIds.has(cond.id)) {\n errors.push({\n code: 'duplicate_condition_set_id',\n message: `Condition set ID \"${cond.id}\" already exists in the config`,\n path: `transitionConditions[${cond.id}]`,\n });\n }\n }\n}\n\nfunction validateCrossAxisRuleUniqueness(\n config: StoredStateConfig,\n fragment: StateConfigFragment,\n errors: ConfigValidationError[],\n): void {\n const existingIds = new Set(config.crossAxisRules.map((r) => r.id));\n for (const rule of fragment.crossAxisRules ?? []) {\n if (existingIds.has(rule.id)) {\n errors.push({\n code: 'duplicate_cross_axis_rule_id',\n message: `Cross-axis rule ID \"${rule.id}\" already exists in the config`,\n path: `crossAxisRules[${rule.id}]`,\n });\n }\n }\n}\n","import type { DisplayStateRule, StoredStateConfig, StateConfigFragment } from './interfaces';\n\nfunction displayRuleKey(rule: DisplayStateRule): string {\n const p = rule.paymentState;\n const f = rule.fulfillmentState;\n const pKey = p === undefined ? '*' : Array.isArray(p) ? p.slice().sort().join(',') : p;\n const fKey = f === undefined ? '*' : Array.isArray(f) ? f.slice().sort().join(',') : f;\n return `${pKey}|${fKey}`;\n}\n\n/**\n * Merges a resolved StateConfigFragment into an existing StateConfig,\n * tagging every contributed item with `_sourceExtensionId`.\n *\n * Returns a new config object (does not mutate the original).\n */\nexport function mergeFragment(\n config: StoredStateConfig,\n fragment: StateConfigFragment,\n extensionId: string,\n): StoredStateConfig {\n const merged: StoredStateConfig = JSON.parse(JSON.stringify(config));\n\n for (const path of fragment.paymentPaths ?? []) {\n merged.paymentPaths.push({ ...path, _sourceExtensionId: extensionId });\n }\n for (const path of fragment.fulfillmentPaths ?? []) {\n merged.fulfillmentPaths.push({ ...path, _sourceExtensionId: extensionId });\n }\n for (const rule of fragment.crossAxisRules ?? []) {\n merged.crossAxisRules.push({ ...rule, _sourceExtensionId: extensionId });\n }\n for (const cond of fragment.transitionConditions ?? []) {\n merged.transitionConditions.push({ ...cond, _sourceExtensionId: extensionId });\n }\n for (const pair of fragment.validInitialStates ?? []) {\n merged.validInitialStates.push(pair);\n }\n\n for (const rule of fragment.displayStateMap ?? []) {\n const tagged = { ...rule, _sourceExtensionId: extensionId };\n const key = displayRuleKey(tagged);\n const existingIdx = merged.displayStateMap.findIndex(\n (r) => displayRuleKey(r) === key,\n );\n if (existingIdx !== -1) {\n merged.displayStateMap[existingIdx] = tagged;\n } else {\n merged.displayStateMap.push(tagged);\n }\n }\n\n return merged;\n}\n","import type { StoredStateConfig } from './interfaces';\n\n/**\n * Removes all items contributed by a specific extension from a StateConfig.\n * Items are identified by their `_sourceExtensionId` tag.\n *\n * Returns a new config object (does not mutate the original).\n */\nexport function removeFragment(\n config: StoredStateConfig,\n extensionId: string,\n): StoredStateConfig {\n const cleaned: StoredStateConfig = JSON.parse(JSON.stringify(config));\n\n cleaned.paymentPaths = cleaned.paymentPaths.filter(\n (p) => p._sourceExtensionId !== extensionId,\n );\n cleaned.fulfillmentPaths = cleaned.fulfillmentPaths.filter(\n (p) => p._sourceExtensionId !== extensionId,\n );\n cleaned.crossAxisRules = cleaned.crossAxisRules.filter(\n (r) => r._sourceExtensionId !== extensionId,\n );\n cleaned.transitionConditions = cleaned.transitionConditions.filter(\n (c) => c._sourceExtensionId !== extensionId,\n );\n cleaned.displayStateMap = cleaned.displayStateMap.filter(\n (d) => d._sourceExtensionId !== extensionId,\n );\n\n return cleaned;\n}\n","/**\n * Command-frame action contract types for the order state machine.\n *\n * These define the param/response shapes and canonical action name strings\n * that extensions and hosts agree on. Command-frame itself stays agnostic —\n * extensions use `commandFrameClient.call<P, R>(ACTION_NAME, params)` with\n * these types, and hosts register handlers under the same string keys.\n */\n\nimport type {\n StateConfig,\n AvailableTransition,\n DisplayStateResult,\n TransitionResult,\n StateConfigFragment,\n} from './interfaces';\nimport type { StatePair } from './types';\n\n// ---------------------------------------------------------------------------\n// Action name constants (shared between extension and host)\n// ---------------------------------------------------------------------------\n\nexport const ORDER_STATE_ACTIONS = {\n getOrderStateConfig: 'getOrderStateConfig',\n getAvailableTransitions: 'getAvailableTransitions',\n getOrderDisplayState: 'getOrderDisplayState',\n transitionOrderState: 'transitionOrderState',\n getStateConfigFragment: 'getStateConfigFragment',\n saveStateConfigFragment: 'saveStateConfigFragment',\n deleteStateConfigFragment: 'deleteStateConfigFragment',\n} as const;\n\n// ---------------------------------------------------------------------------\n// Render (POS) actions\n// ---------------------------------------------------------------------------\n\nexport interface GetOrderStateConfigParams {}\nexport interface GetOrderStateConfigResponse {\n config: StateConfig;\n}\n\nexport interface GetAvailableTransitionsParams {\n /** Look up order by ID from local DB to determine current state. */\n orderId?: string;\n /** Or provide the state pair directly. */\n currentState?: StatePair;\n /** Skip condition evaluation (useful for UI that shows all structural paths). */\n skipConditionEvaluation?: boolean;\n}\nexport interface GetAvailableTransitionsResponse {\n transitions: AvailableTransition[];\n}\n\nexport interface GetOrderDisplayStateParams {\n /** Look up order by ID from local DB to determine current state pair. */\n orderId?: string;\n /** Or provide the state pair directly. */\n statePair?: StatePair;\n}\nexport interface GetOrderDisplayStateResponse {\n display: DisplayStateResult;\n}\n\nexport interface TransitionOrderStateParams {\n orderId: string;\n to: StatePair;\n}\nexport interface TransitionOrderStateResponse {\n success: boolean;\n order: Record<string, unknown>;\n result: TransitionResult;\n}\n\n// ---------------------------------------------------------------------------\n// Manage (Code) actions — state config fragment CRUD\n// ---------------------------------------------------------------------------\n\nexport interface GetStateConfigFragmentParams {\n extensionId: string;\n}\nexport interface GetStateConfigFragmentResponse {\n fragment: StateConfigFragment | null;\n}\n\nexport interface SaveStateConfigFragmentParams {\n extensionId: string;\n fragment: StateConfigFragment;\n}\nexport interface SaveStateConfigFragmentResponse {\n success: boolean;\n validation?: {\n valid: boolean;\n errors: { code: string; message: string; path?: string }[];\n warnings: { code: string; message: string; path?: string }[];\n };\n}\n\nexport interface DeleteStateConfigFragmentParams {\n extensionId: string;\n}\nexport interface DeleteStateConfigFragmentResponse {\n success: boolean;\n}\n","/**\n * Pub/sub event payload types for the order state machine.\n *\n * The host publishes these via command-frame's `topicPublisher` under the\n * \"order-state\" topic. Extensions subscribe by string and cast the payload\n * to the typed event interfaces exported here.\n */\n\nimport type {\n DisplayStateResult,\n TransitionBlockedBy,\n} from './interfaces';\nimport type { StatePair } from './types';\n\nexport const ORDER_STATE_TOPIC = 'order-state' as const;\n\nexport const ORDER_STATE_EVENTS = {\n stateTransitionCompleted: 'state-transition-completed',\n stateTransitionBlocked: 'state-transition-blocked',\n configUpdated: 'config-updated',\n} as const;\n\nexport interface StateTransitionCompletedPayload {\n orderId: string;\n from: StatePair;\n to: StatePair;\n display: DisplayStateResult;\n timestamp: string;\n}\n\nexport interface StateTransitionBlockedPayload {\n orderId: string;\n from: StatePair;\n attemptedTo: StatePair;\n blockedBy: TransitionBlockedBy[];\n timestamp: string;\n}\n\nexport interface ConfigUpdatedPayload {\n companyId: string;\n configId: string;\n version: number;\n timestamp: string;\n}\n\nexport type OrderStateEventPayload =\n | StateTransitionCompletedPayload\n | StateTransitionBlockedPayload\n | ConfigUpdatedPayload;\n"],"mappings":";AAIO,IAAK,eAAL,kBAAKA,kBAAL;AAEL,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AAGN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAA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","names":["CurrencyCode","TimePeriod","TopMetericsSort","CompanyType","CustomTableAvailability","AttributeType","Platform","OrderPlatform","CustomerPlatform","StationStatus","InventoryBaseActionEnum","InventorySpecificActionType","ExtensionCategory","FeesCustomBillingStatus","PricingPlanEnum","PricingLevel","PricingRegionEnum","MenuProject","UserTypes","OwnerType","PublicationAvailability","PublicationStatus","ResidualStatus","PreviewImageMode","LibraryItemType","ResidualPaymentMethod","PaymentMethod","NonRevenueItemType","ReceiptSendChannel","ReceiptType","StripeStatus","InvoiceStatus","StripeCurrencyCode","ProductType","ProductStatus","PaymentProcessor","toMinorUnits"]}
1
+ {"version":3,"sources":["../enums/currency.enum.ts","../enums/core.enum.ts","../enums/stripe-currencies.enum.ts","../enums/product.enum.ts","../enums/payments.enum.ts","../utils/currency.util.ts","../utils/order-totals.util.ts","../constants/pricing.constants.ts","../utils/pricing.util.ts","../utils/report-sign.util.ts","../utils/mongo.util.ts","../order-state-machine/types.ts","../order-state-machine/state-schema.ts","../order-state-machine/financial-invariants.ts","../order-state-machine/default-cross-axis-rules.ts","../order-state-machine/default-config.ts","../order-state-machine/pos-preset.ts","../order-state-machine/build-order-context.ts","../order-state-machine/display-state.ts","../order-state-machine/condition-eval.ts","../order-state-machine/engine.ts","../order-state-machine/validate-config.ts","../order-state-machine/set-order-state.ts","../order-state-machine/legacy-infer.ts","../order-state-machine/resolve-template.ts","../order-state-machine/validate-fragment.ts","../order-state-machine/merge-fragment.ts","../order-state-machine/remove-fragment.ts","../order-state-machine/actions.ts","../order-state-machine/pubsub.ts"],"sourcesContent":["/**\n * ISO 4217 Currency Code Enum\n * Contains all supported currency codes.\n */\nexport enum CurrencyCode {\n // Major currencies with 2 decimal places\n USD = 'USD',\n EUR = 'EUR',\n GBP = 'GBP',\n CAD = 'CAD',\n AUD = 'AUD',\n NZD = 'NZD',\n CHF = 'CHF',\n CNY = 'CNY',\n INR = 'INR',\n MXN = 'MXN',\n BRL = 'BRL',\n ZAR = 'ZAR',\n SGD = 'SGD',\n HKD = 'HKD',\n SEK = 'SEK',\n NOK = 'NOK',\n DKK = 'DKK',\n PLN = 'PLN',\n THB = 'THB',\n MYR = 'MYR',\n PHP = 'PHP',\n IDR = 'IDR',\n AED = 'AED',\n SAR = 'SAR',\n ILS = 'ILS',\n TRY = 'TRY',\n RUB = 'RUB',\n HTG = 'HTG',\n\n // New Currencies with 2 decimal places\n BND = 'BND', // Brunei Dollar\n CRC = 'CRC', // Costa Rican Colón\n BDT = 'BDT', // Bangladeshi Taka\n UAH = 'UAH', // Ukrainian Hryvnia\n NGN = 'NGN', // Nigerian Naira\n AFN = 'AFN', // Afghan Afghani\n ALL = 'ALL', // Albanian Lek\n AMD = 'AMD', // Armenian Dram\n ANG = 'ANG', // Netherlands Antillean Guilder\n AOA = 'AOA', // Angolan Kwanza\n ARS = 'ARS', // Argentine Peso\n AWG = 'AWG', // Aruban Florin\n AZN = 'AZN', // Azerbaijani Manat\n BAM = 'BAM', // Bosnia and Herzegovina Convertible Mark\n BBD = 'BBD', // Barbadian Dollar\n BGN = 'BGN', // Bulgarian Lev\n BMD = 'BMD', // Bermudian Dollar\n BOB = 'BOB', // Bolivian Boliviano\n BSD = 'BSD', // Bahamian Dollar\n BTN = 'BTN', // Bhutanese Ngultrum\n BWP = 'BWP', // Botswana Pula\n BYN = 'BYN', // Belarusian Ruble\n BZD = 'BZD', // Belize Dollar\n COP = 'COP', // Colombian Peso\n CZK = 'CZK', // Czech Koruna\n DOP = 'DOP', // Dominican Peso\n DZD = 'DZD', // Algerian Dinar\n EGP = 'EGP', // Egyptian Pound\n ETB = 'ETB', // Ethiopian Birr\n FJD = 'FJD', // Fijian Dollar\n GEL = 'GEL', // Georgian Lari\n GHS = 'GHS', // Ghanaian Cedi\n GTQ = 'GTQ', // Guatemalan Quetzal\n GYD = 'GYD', // Guyanese Dollar\n HNL = 'HNL', // Honduran Lempira\n IRR = 'IRR', // Iranian Rial\n JMD = 'JMD', // Jamaican Dollar\n KES = 'KES', // Kenyan Shilling\n KGS = 'KGS', // Kyrgyzstani Som\n KHR = 'KHR', // Cambodian Riel\n KYD = 'KYD', // Cayman Islands Dollar\n KZT = 'KZT', // Kazakhstani Tenge\n LAK = 'LAK', // Lao Kip\n LBP = 'LBP', // Lebanese Pound\n LKR = 'LKR', // Sri Lankan Rupee\n MAD = 'MAD', // Moroccan Dirham\n MDL = 'MDL', // Moldovan Leu\n MKD = 'MKD', // Macedonian Denar\n MMK = 'MMK', // Myanmar Kyat\n MNT = 'MNT', // Mongolian Tögrög\n MOP = 'MOP', // Macanese Pataca\n MUR = 'MUR', // Mauritian Rupee\n MVR = 'MVR', // Maldivian Rufiyaa\n MZN = 'MZN', // Mozambican Metical\n NAD = 'NAD', // Namibian Dollar\n NIO = 'NIO', // Nicaraguan Córdoba\n NPR = 'NPR', // Nepalese Rupee\n PAB = 'PAB', // Panamanian Balboa\n PEN = 'PEN', // Peruvian Sol\n PGK = 'PGK', // Papua New Guinean Kina\n PKR = 'PKR', // Pakistani Rupee\n QAR = 'QAR', // Qatari Riyal\n RON = 'RON', // Romanian Leu\n RSD = 'RSD', // Serbian Dinar\n SBD = 'SBD', // Solomon Islands Dollar\n SRD = 'SRD', // Surinamese Dollar\n SYP = 'SYP', // Syrian Pound\n TJS = 'TJS', // Tajikistani Somoni\n TMT = 'TMT', // Turkmenistani Manat\n TOP = 'TOP', // Tongan Paʻanga\n TTD = 'TTD', // Trinidad and Tobago Dollar\n TZS = 'TZS', // Tanzanian Shilling\n UYU = 'UYU', // Uruguayan Peso\n UZS = 'UZS', // Uzbekistani Som\n VES = 'VES', // Venezuelan Bolívar Soberano\n WST = 'WST', // Samoan Tala\n XCD = 'XCD', // East Caribbean Dollar\n YER = 'YER', // Yemeni Rial\n ZMW = 'ZMW', // Zambian Kwacha\n CDF = 'CDF', // Congolese Franc\n CUP = 'CUP', // Cuban Peso\n ERN = 'ERN', // Eritrean Nakfa\n FKP = 'FKP', // Falkland Islands Pound\n GIP = 'GIP', // Gibraltar Pound\n GMD = 'GMD', // Gambian Dalasi\n KPW = 'KPW', // North Korean Won\n LRD = 'LRD', // Liberian Dollar\n LSL = 'LSL', // Lesotho Loti\n MGA = 'MGA', // Malagasy Ariary\n MWK = 'MWK', // Malawian Kwacha\n SCR = 'SCR', // Seychellois Rupee\n SDG = 'SDG', // Sudanese Pound\n SHP = 'SHP', // Saint Helena Pound\n SLE = 'SLE', // Sierra Leonean Leone\n SOS = 'SOS', // Somali Shilling\n SSP = 'SSP', // South Sudanese Pound\n STN = 'STN', // São Tomé and Príncipe Dobra\n SZL = 'SZL', // Swazi Lilangeni\n VED = 'VED', // Venezuelan Bolívar Digital\n XCG = 'XCG', // Caribbean Guilder\n\n // Zero decimal currencies\n JPY = 'JPY',\n KRW = 'KRW',\n VND = 'VND',\n CLP = 'CLP',\n ISK = 'ISK',\n HUF = 'HUF',\n TWD = 'TWD',\n\n // New Currencies with 0 decimal places\n GNF = 'GNF', // Guinean Franc\n BIF = 'BIF', // Burundian Franc\n DJF = 'DJF', // Djiboutian Franc\n KMF = 'KMF', // Comoro Franc\n PYG = 'PYG', // Paraguayan Guaraní\n RWF = 'RWF', // Rwandan Franc\n UGX = 'UGX', // Ugandan Shilling\n VUV = 'VUV', // Vanuatu Vatu\n XAF = 'XAF', // Central African CFA Franc\n XOF = 'XOF', // West African CFA Franc\n XPF = 'XPF', // CFP Franc\n\n // Three decimal currencies\n KWD = 'KWD',\n BHD = 'BHD',\n OMR = 'OMR',\n JOD = 'JOD',\n TND = 'TND',\n LYD = 'LYD',\n IQD = 'IQD',\n}\n","// Dashboard\nexport enum TimePeriod {\n TODAY = 'today',\n THIS_WEEK = 'this week',\n THIS_MONTH = 'this month',\n THIS_YEAR = 'this year',\n All_TIME = 'all_time',\n}\n\nexport enum TopMetericsSort {\n TOTAL_PAYMENT_VOLUME = 'totalPaymentVolume',\n TOTAL_TRANSACTION = 'totalTransaction',\n}\n\nexport enum CompanyType {\n COMPANY = 'company',\n ROOT = 'root',\n ORGANIZATION = 'organization',\n}\n\nexport enum CustomTableAvailability {\n PUBLIC = 'public',\n ORGANIZATION = 'organization',\n}\n\nexport enum AttributeType {\n STRING = 'string',\n NUMBER = 'number',\n BOOLEAN = 'boolean',\n DATE = 'date',\n JSON_STRING = 'json-string',\n}\n\nexport enum Platform {\n WOO_COMMERCE = 'woo-commerce',\n SHOPIFY = 'shopify',\n OLIVER = 'oliver',\n STANDALONE = 'standalone',\n}\n\nexport enum OrderPlatform {\n POS = 'in-store',\n WOO_COMMERCE = 'woo-commerce',\n}\n\nexport enum CustomerPlatform {\n POS = 'in-store',\n WOO_COMMERCE = 'woo-commerce',\n}\n\nexport enum StationStatus {\n IN_USE = 'IN_USE',\n AVAILABLE = 'AVAILABLE',\n}\n\n//Inventory\nexport enum InventoryBaseActionEnum {\n ADD = 'ADD',\n REMOVE = 'REMOVE',\n RECOUNT = 'RECOUNT',\n SKIP = 'SKIP',\n}\nexport type InventoryBaseActionType = `${InventoryBaseActionEnum}`;\n\nexport enum InventorySpecificActionType {\n STOCK_RECEIVED = 'STOCK_RECEIVED',\n INVENTORY_RECOUNT = 'INVENTORY_RECOUNT',\n DAMAGE = 'DAMAGE',\n THEFT = 'THEFT',\n LOSS = 'LOSS',\n RESTOCK_RETURN = 'RESTOCK_RETURN',\n // Only for Refund events\n REFUND_RESTOCK_RETURN = 'REFUND_RESTOCK_RETURN',\n REFUND_DAMAGE = 'REFUND_DAMAGE',\n // Only for Order events @see OrderCreated triger under mongoose trigger\n SALE = 'SALE',\n // Stock transfer events\n TRANSFER = 'TRANSFER',\n BULK_RECOUNT = 'BULK_RECOUNT',\n // TODO: Move it to separate enum for woo-commerce specific actions\n APPLIED_FROM_WOO = 'APPLIED_FROM_WOO',\n PO_RECEIVED = 'PO_RECEIVED',\n}\n\nexport enum ExtensionCategory {\n SYNC = 'sync',\n PAYMENT = 'payment',\n HUB = 'hub',\n BUILDER = 'builder',\n}\n\nexport enum FeesCustomBillingStatus {\n UNPAID = 'unpaid',\n PAID = 'paid',\n OPEN = 'open',\n}\n\nexport enum PricingPlanEnum {\n DEFAULT = 'default',\n MINIMUM = 'minimum',\n ORGANIZATION = 'organization',\n PLAN = 'plan',\n COMPANY = 'company',\n}\n\nexport enum PricingLevel {\n ORG = 'org',\n PLAN = 'plan',\n DEFAULT = 'default',\n MINIMUM = 'minimum',\n}\n\nexport enum PricingRegionEnum {\n EUROPE = 'europe',\n OTHER = 'others',\n NORTH_AMERICA = 'northAmerica',\n}\n\nexport enum MenuProject {\n MANAGE = 'Manage',\n SCALE = 'Scale',\n BUILD = 'Build',\n PAY = 'Pay',\n RUN = 'Run',\n}\n\nexport enum UserTypes {\n COMPANY_OWNER = 'owner',\n ORG_USER = 'organization_user',\n ORG_OWNER = 'organization_owner',\n FINAL_USER = 'final_user',\n FINAL_OWNER = 'final_owner',\n EMPLOYEE = 'employee',\n SUPER_ADMIN = 'super_admin',\n MANAGER = 'manager',\n ADMIN = 'admin',\n ASSISTANT_MANAGER = 'assistant',\n CASHIER = 'cashier',\n RESELLER = 'reseller',\n}\n\nexport enum OwnerType {\n API_KEY = 'api-key',\n ORGANIZATION = 'organization',\n COMPANY = 'company',\n}\n\nexport enum PublicationAvailability {\n GLOBAL = 'global',\n PRIVATE = 'private',\n}\n\nexport enum PublicationStatus {\n APPROVED = 'approved',\n REJECTED = 'rejected',\n PENDING = 'pending',\n NOT_APPLICABLE = 'not_applicable',\n}\n\nexport interface PublicationConfig {\n availability: PublicationAvailability;\n status: PublicationStatus;\n}\n\nexport enum ResidualStatus {\n PAID = 'paid',\n DUE = 'due',\n ACCRUING = 'accruing',\n}\n\nexport enum PreviewImageMode {\n STATIC = 'static',\n DYNAMIC = 'dynamic',\n}\n\nexport enum LibraryItemType {\n FLOW = 'flow',\n PAGE = 'page',\n COMPOSITION = 'composition',\n LAYOUT = 'layout',\n}\n\nexport enum ResidualPaymentMethod {\n CHEQUE = 'cheque',\n}\n\nexport enum PaymentMethod {\n CUSTOM = 'Custom',\n CASH = 'Cash',\n TERMINAL = 'Terminal',\n CLOUD = 'Cloud',\n BLUETOOTH = 'Bluetooth',\n}\n\nexport enum NonRevenueItemType {\n GIFT_CARD = 'gift-card',\n}\n\nexport enum ReceiptSendChannel {\n EMAIL = 'email',\n TEXT = 'text',\n}\n\n// Discriminates a digital receipt as a sale receipt vs a refund receipt.\nexport enum ReceiptType {\n ORDER = 'order',\n REFUND = 'refund',\n}\n\nexport enum StripeStatus {\n ACTIVE = 'active', // When custom payment subscription is active\n INACTIVE = 'inactive', // When custom payment extension is uninstalled\n PAYMENT_METHOD_REQUIRED = 'payment_method_required', // Default status when a new customer is created\n PAYMENT_METHOD_ADDED = 'payment_method_added', // When Payment Method is added to the customer\n}\n\nexport enum InvoiceStatus {\n PAID = 'paid',\n PENDING = 'pending',\n EXPIRED = 'expired',\n}\n","/**\n * ISO 4217 Currency Code Enum\n * Contains all stripe supported currency codes.\n */\nexport enum StripeCurrencyCode {\n // Major currencies with 2 decimal places\n USD = 'USD',\n EUR = 'EUR',\n GBP = 'GBP',\n CAD = 'CAD',\n AUD = 'AUD',\n NZD = 'NZD',\n CHF = 'CHF',\n CNY = 'CNY',\n INR = 'INR',\n MXN = 'MXN',\n BRL = 'BRL',\n ZAR = 'ZAR',\n SGD = 'SGD',\n HKD = 'HKD',\n SEK = 'SEK',\n NOK = 'NOK',\n DKK = 'DKK',\n PLN = 'PLN',\n THB = 'THB',\n MYR = 'MYR',\n PHP = 'PHP',\n IDR = 'IDR',\n AED = 'AED',\n SAR = 'SAR',\n ILS = 'ILS',\n TRY = 'TRY',\n RUB = 'RUB',\n\n // Zero decimal currencies\n JPY = 'JPY',\n KRW = 'KRW',\n VND = 'VND',\n CLP = 'CLP',\n ISK = 'ISK',\n HUF = 'HUF',\n TWD = 'TWD',\n\n // Three decimal currencies\n KWD = 'KWD',\n BHD = 'BHD',\n OMR = 'OMR',\n JOD = 'JOD',\n TND = 'TND',\n LYD = 'LYD',\n IQD = 'IQD',\n}\n","/*\n Current supported Product Types, used in Product Schema & Most Front-End Types \n*/\nexport enum ProductType {\n SIMPLE = 'simple',\n VARIABLE = 'variable',\n}\n\n/*\n Current supported Product Status, used in Product Schema & Most Front-End Types \n*/\nexport enum ProductStatus {\n ACTIVE = 'active',\n INACTIVE = 'inactive',\n DRAFT = 'draft',\n}\n","// Acquiring processor a company's payments are routed through.\nexport enum PaymentProcessor {\n STRIPE = 'stripe',\n ADYEN = 'adyen',\n /**\n * Payment captured outside FinalPay entirely — set by third parties syncing\n * external order data in. Never written by the POS. Distinguishes \"synced\n * from elsewhere\" from an absent value (legacy FinalPay/Stripe record).\n */\n EXTERNAL = 'external',\n}\n","import { CurrencyCode } from '@/enums/index';\nimport { StripeCurrencyCode } from '@/enums/stripe-currencies.enum';\nimport { Amount, CurrencyConfig } from '@/interfaces/index';\n\n/**\n * Currency utility functions for handling monetary amounts in minor currency units.\n *\n * All monetary values are stored in the database as integers representing the smallest\n * currency unit (e.g., cents for USD, pence for GBP). This avoids floating-point\n * precision issues and ensures accurate financial calculations.\n *\n * @example\n * // Convert $10.50 to cents for storage\n * const cents = toMinorUnits(10.50, 'USD'); // Returns 1050\n *\n * // Convert cents back to dollars for display\n * const dollars = fromMinorUnits(1050, 'USD'); // Returns 10.50\n *\n * // Format for display\n * const formatted = formatCurrency(1050, 'USD'); // Returns '$10.50'\n */\n\n/**\n * Configuration for supported currencies.\n * Currencies are keyed by their ISO 4217 currency code.\n */\nexport const CURRENCY_CONFIG: Record<CurrencyCode | string, CurrencyConfig> = {\n // Major currencies with 2 decimal places\n [CurrencyCode.USD]: { minorUnits: 2, symbol: '$', symbolPosition: 'prefix' },\n [CurrencyCode.EUR]: { minorUnits: 2, symbol: '€', symbolPosition: 'prefix' },\n [CurrencyCode.GBP]: { minorUnits: 2, symbol: '£', symbolPosition: 'prefix' },\n [CurrencyCode.CAD]: { minorUnits: 2, symbol: 'CA$', symbolPosition: 'prefix' },\n [CurrencyCode.AUD]: { minorUnits: 2, symbol: 'A$', symbolPosition: 'prefix' },\n [CurrencyCode.NZD]: { minorUnits: 2, symbol: 'NZ$', symbolPosition: 'prefix' },\n [CurrencyCode.CHF]: { minorUnits: 2, symbol: 'CHF', symbolPosition: 'prefix' },\n [CurrencyCode.CNY]: { minorUnits: 2, symbol: '¥', symbolPosition: 'prefix' },\n [CurrencyCode.INR]: { minorUnits: 2, symbol: '₹', symbolPosition: 'prefix' },\n [CurrencyCode.MXN]: { minorUnits: 2, symbol: 'MX$', symbolPosition: 'prefix' },\n [CurrencyCode.BRL]: { minorUnits: 2, symbol: 'R$', symbolPosition: 'prefix' },\n [CurrencyCode.ZAR]: { minorUnits: 2, symbol: 'R', symbolPosition: 'prefix' },\n [CurrencyCode.SGD]: { minorUnits: 2, symbol: 'S$', symbolPosition: 'prefix' },\n [CurrencyCode.HKD]: { minorUnits: 2, symbol: 'HK$', symbolPosition: 'prefix' },\n [CurrencyCode.SEK]: { minorUnits: 2, symbol: 'kr', symbolPosition: 'suffix' },\n [CurrencyCode.NOK]: { minorUnits: 2, symbol: 'kr', symbolPosition: 'suffix' },\n [CurrencyCode.DKK]: { minorUnits: 2, symbol: 'kr', symbolPosition: 'suffix' },\n [CurrencyCode.PLN]: { minorUnits: 2, symbol: 'zł', symbolPosition: 'suffix' },\n [CurrencyCode.THB]: { minorUnits: 2, symbol: '฿', symbolPosition: 'prefix' },\n [CurrencyCode.MYR]: { minorUnits: 2, symbol: 'RM', symbolPosition: 'prefix' },\n [CurrencyCode.PHP]: { minorUnits: 2, symbol: '₱', symbolPosition: 'prefix' },\n [CurrencyCode.IDR]: { minorUnits: 2, symbol: 'Rp', symbolPosition: 'prefix' },\n [CurrencyCode.AED]: { minorUnits: 2, symbol: 'د.إ', symbolPosition: 'prefix' },\n [CurrencyCode.SAR]: { minorUnits: 2, symbol: '﷼', symbolPosition: 'prefix' },\n [CurrencyCode.ILS]: { minorUnits: 2, symbol: '₪', symbolPosition: 'prefix' },\n [CurrencyCode.TRY]: { minorUnits: 2, symbol: '₺', symbolPosition: 'prefix' },\n [CurrencyCode.RUB]: { minorUnits: 2, symbol: '₽', symbolPosition: 'suffix' },\n [CurrencyCode.HTG]: { minorUnits: 2, symbol: 'HTG', symbolPosition: 'prefix' },\n\n // New Currencies with 2 decimal places\n [CurrencyCode.BND]: { minorUnits: 2, symbol: 'BND', symbolPosition: 'prefix' },\n [CurrencyCode.CRC]: { minorUnits: 2, symbol: 'CRC', symbolPosition: 'prefix' },\n [CurrencyCode.BDT]: { minorUnits: 2, symbol: 'BDT', symbolPosition: 'prefix' },\n [CurrencyCode.UAH]: { minorUnits: 2, symbol: 'UAH', symbolPosition: 'prefix' },\n [CurrencyCode.NGN]: { minorUnits: 2, symbol: '₦', symbolPosition: 'prefix' },\n [CurrencyCode.AFN]: { minorUnits: 2, symbol: '؋', symbolPosition: 'prefix' },\n [CurrencyCode.ALL]: { minorUnits: 2, symbol: 'L', symbolPosition: 'suffix' },\n [CurrencyCode.AMD]: { minorUnits: 2, symbol: '֏', symbolPosition: 'suffix' },\n [CurrencyCode.ANG]: { minorUnits: 2, symbol: 'ƒ', symbolPosition: 'prefix' },\n [CurrencyCode.AOA]: { minorUnits: 2, symbol: 'Kz', symbolPosition: 'prefix' },\n [CurrencyCode.ARS]: { minorUnits: 2, symbol: 'AR$', symbolPosition: 'prefix' },\n [CurrencyCode.AWG]: { minorUnits: 2, symbol: 'Afl.', symbolPosition: 'prefix' },\n [CurrencyCode.AZN]: { minorUnits: 2, symbol: '₼', symbolPosition: 'prefix' },\n [CurrencyCode.BAM]: { minorUnits: 2, symbol: 'KM', symbolPosition: 'suffix' },\n [CurrencyCode.BBD]: { minorUnits: 2, symbol: 'Bds$', symbolPosition: 'prefix' },\n [CurrencyCode.BGN]: { minorUnits: 2, symbol: 'лв', symbolPosition: 'suffix' },\n [CurrencyCode.BMD]: { minorUnits: 2, symbol: 'BD$', symbolPosition: 'prefix' },\n [CurrencyCode.BOB]: { minorUnits: 2, symbol: 'Bs.', symbolPosition: 'prefix' },\n [CurrencyCode.BSD]: { minorUnits: 2, symbol: 'B$', symbolPosition: 'prefix' },\n [CurrencyCode.BTN]: { minorUnits: 2, symbol: 'Nu.', symbolPosition: 'prefix' },\n [CurrencyCode.BWP]: { minorUnits: 2, symbol: 'P', symbolPosition: 'prefix' },\n [CurrencyCode.BYN]: { minorUnits: 2, symbol: 'Br', symbolPosition: 'suffix' },\n [CurrencyCode.BZD]: { minorUnits: 2, symbol: 'BZ$', symbolPosition: 'prefix' },\n [CurrencyCode.COP]: { minorUnits: 2, symbol: 'COL$', symbolPosition: 'prefix' },\n [CurrencyCode.CZK]: { minorUnits: 2, symbol: 'Kč', symbolPosition: 'suffix' },\n [CurrencyCode.DOP]: { minorUnits: 2, symbol: 'RD$', symbolPosition: 'prefix' },\n [CurrencyCode.DZD]: { minorUnits: 2, symbol: 'DA', symbolPosition: 'prefix' },\n [CurrencyCode.EGP]: { minorUnits: 2, symbol: 'E£', symbolPosition: 'prefix' },\n [CurrencyCode.ETB]: { minorUnits: 2, symbol: 'Br', symbolPosition: 'prefix' },\n [CurrencyCode.FJD]: { minorUnits: 2, symbol: 'FJ$', symbolPosition: 'prefix' },\n [CurrencyCode.GEL]: { minorUnits: 2, symbol: '₾', symbolPosition: 'prefix' },\n [CurrencyCode.GHS]: { minorUnits: 2, symbol: '₵', symbolPosition: 'prefix' },\n [CurrencyCode.GTQ]: { minorUnits: 2, symbol: 'Q', symbolPosition: 'prefix' },\n [CurrencyCode.GYD]: { minorUnits: 2, symbol: 'G$', symbolPosition: 'prefix' },\n [CurrencyCode.HNL]: { minorUnits: 2, symbol: 'L', symbolPosition: 'prefix' },\n [CurrencyCode.IRR]: { minorUnits: 2, symbol: '﷼', symbolPosition: 'prefix' },\n [CurrencyCode.JMD]: { minorUnits: 2, symbol: 'J$', symbolPosition: 'prefix' },\n [CurrencyCode.KES]: { minorUnits: 2, symbol: 'KSh', symbolPosition: 'prefix' },\n [CurrencyCode.KGS]: { minorUnits: 2, symbol: 'с', symbolPosition: 'suffix' },\n [CurrencyCode.KHR]: { minorUnits: 2, symbol: '៛', symbolPosition: 'prefix' },\n [CurrencyCode.KYD]: { minorUnits: 2, symbol: 'CI$', symbolPosition: 'prefix' },\n [CurrencyCode.KZT]: { minorUnits: 2, symbol: '₸', symbolPosition: 'prefix' },\n [CurrencyCode.LAK]: { minorUnits: 2, symbol: '₭', symbolPosition: 'prefix' },\n [CurrencyCode.LBP]: { minorUnits: 2, symbol: 'L£', symbolPosition: 'prefix' },\n [CurrencyCode.LKR]: { minorUnits: 2, symbol: 'Rs', symbolPosition: 'prefix' },\n [CurrencyCode.MAD]: { minorUnits: 2, symbol: 'DH', symbolPosition: 'prefix' },\n [CurrencyCode.MDL]: { minorUnits: 2, symbol: 'L', symbolPosition: 'suffix' },\n [CurrencyCode.MKD]: { minorUnits: 2, symbol: 'ден', symbolPosition: 'suffix' },\n [CurrencyCode.MMK]: { minorUnits: 2, symbol: 'K', symbolPosition: 'prefix' },\n [CurrencyCode.MNT]: { minorUnits: 2, symbol: '₮', symbolPosition: 'prefix' },\n [CurrencyCode.MOP]: { minorUnits: 2, symbol: 'MOP$', symbolPosition: 'prefix' },\n [CurrencyCode.MUR]: { minorUnits: 2, symbol: 'Rs', symbolPosition: 'prefix' },\n [CurrencyCode.MVR]: { minorUnits: 2, symbol: 'Rf', symbolPosition: 'prefix' },\n [CurrencyCode.MZN]: { minorUnits: 2, symbol: 'MT', symbolPosition: 'prefix' },\n [CurrencyCode.NAD]: { minorUnits: 2, symbol: 'N$', symbolPosition: 'prefix' },\n [CurrencyCode.NIO]: { minorUnits: 2, symbol: 'C$', symbolPosition: 'prefix' },\n [CurrencyCode.NPR]: { minorUnits: 2, symbol: 'Rs', symbolPosition: 'prefix' },\n [CurrencyCode.PAB]: { minorUnits: 2, symbol: 'B/.', symbolPosition: 'prefix' },\n [CurrencyCode.PEN]: { minorUnits: 2, symbol: 'S/', symbolPosition: 'prefix' },\n [CurrencyCode.PGK]: { minorUnits: 2, symbol: 'K', symbolPosition: 'prefix' },\n [CurrencyCode.PKR]: { minorUnits: 2, symbol: '₨', symbolPosition: 'prefix' },\n [CurrencyCode.QAR]: { minorUnits: 2, symbol: 'QR', symbolPosition: 'prefix' },\n [CurrencyCode.RON]: { minorUnits: 2, symbol: 'lei', symbolPosition: 'suffix' },\n [CurrencyCode.RSD]: { minorUnits: 2, symbol: 'дин.', symbolPosition: 'suffix' },\n [CurrencyCode.SBD]: { minorUnits: 2, symbol: 'SI$', symbolPosition: 'prefix' },\n [CurrencyCode.SRD]: { minorUnits: 2, symbol: 'Sr$', symbolPosition: 'prefix' },\n [CurrencyCode.SYP]: { minorUnits: 2, symbol: '£S', symbolPosition: 'prefix' },\n [CurrencyCode.TJS]: { minorUnits: 2, symbol: 'SM', symbolPosition: 'prefix' },\n [CurrencyCode.TMT]: { minorUnits: 2, symbol: 'm.', symbolPosition: 'prefix' },\n [CurrencyCode.TOP]: { minorUnits: 2, symbol: 'T$', symbolPosition: 'prefix' },\n [CurrencyCode.TTD]: { minorUnits: 2, symbol: 'TT$', symbolPosition: 'prefix' },\n [CurrencyCode.TZS]: { minorUnits: 2, symbol: 'TSh', symbolPosition: 'prefix' },\n [CurrencyCode.UYU]: { minorUnits: 2, symbol: '$U', symbolPosition: 'prefix' },\n [CurrencyCode.UZS]: { minorUnits: 2, symbol: 'сўм', symbolPosition: 'suffix' },\n [CurrencyCode.VES]: { minorUnits: 2, symbol: 'Bs.', symbolPosition: 'prefix' },\n [CurrencyCode.WST]: { minorUnits: 2, symbol: 'WS$', symbolPosition: 'prefix' },\n [CurrencyCode.XCD]: { minorUnits: 2, symbol: 'EC$', symbolPosition: 'prefix' },\n [CurrencyCode.YER]: { minorUnits: 2, symbol: '﷼', symbolPosition: 'prefix' },\n [CurrencyCode.ZMW]: { minorUnits: 2, symbol: 'ZK', symbolPosition: 'prefix' },\n [CurrencyCode.CDF]: { minorUnits: 2, symbol: 'FC', symbolPosition: 'prefix' },\n [CurrencyCode.CUP]: { minorUnits: 2, symbol: '$MN', symbolPosition: 'prefix' },\n [CurrencyCode.ERN]: { minorUnits: 2, symbol: 'Nfk', symbolPosition: 'prefix' },\n [CurrencyCode.FKP]: { minorUnits: 2, symbol: 'FK£', symbolPosition: 'prefix' },\n [CurrencyCode.GIP]: { minorUnits: 2, symbol: 'GI£', symbolPosition: 'prefix' },\n [CurrencyCode.GMD]: { minorUnits: 2, symbol: 'D', symbolPosition: 'prefix' },\n [CurrencyCode.KPW]: { minorUnits: 2, symbol: 'KPW', symbolPosition: 'prefix' },\n [CurrencyCode.LRD]: { minorUnits: 2, symbol: 'L$', symbolPosition: 'prefix' },\n [CurrencyCode.LSL]: { minorUnits: 2, symbol: 'M', symbolPosition: 'prefix' },\n [CurrencyCode.MGA]: { minorUnits: 2, symbol: 'Ar', symbolPosition: 'prefix' },\n [CurrencyCode.MWK]: { minorUnits: 2, symbol: 'MK', symbolPosition: 'prefix' },\n [CurrencyCode.SCR]: { minorUnits: 2, symbol: 'SR', symbolPosition: 'prefix' },\n [CurrencyCode.SDG]: { minorUnits: 2, symbol: 'SDG', symbolPosition: 'prefix' },\n [CurrencyCode.SHP]: { minorUnits: 2, symbol: 'SH£', symbolPosition: 'prefix' },\n [CurrencyCode.SLE]: { minorUnits: 2, symbol: 'Le', symbolPosition: 'prefix' },\n [CurrencyCode.SOS]: { minorUnits: 2, symbol: 'SSh', symbolPosition: 'prefix' },\n [CurrencyCode.SSP]: { minorUnits: 2, symbol: 'SSP', symbolPosition: 'prefix' },\n [CurrencyCode.STN]: { minorUnits: 2, symbol: 'Db', symbolPosition: 'prefix' },\n [CurrencyCode.SZL]: { minorUnits: 2, symbol: 'E', symbolPosition: 'prefix' },\n [CurrencyCode.VED]: { minorUnits: 2, symbol: 'Bs.D', symbolPosition: 'prefix' },\n [CurrencyCode.XCG]: { minorUnits: 2, symbol: 'Cg', symbolPosition: 'prefix' },\n\n // Zero decimal currencies\n [CurrencyCode.JPY]: { minorUnits: 0, symbol: '¥', symbolPosition: 'prefix' },\n [CurrencyCode.KRW]: { minorUnits: 0, symbol: '₩', symbolPosition: 'prefix' },\n [CurrencyCode.VND]: { minorUnits: 0, symbol: '₫', symbolPosition: 'suffix' },\n [CurrencyCode.CLP]: { minorUnits: 0, symbol: 'CLP$', symbolPosition: 'prefix' },\n [CurrencyCode.ISK]: { minorUnits: 0, symbol: 'kr', symbolPosition: 'suffix' },\n [CurrencyCode.HUF]: { minorUnits: 0, symbol: 'Ft', symbolPosition: 'suffix' },\n [CurrencyCode.TWD]: { minorUnits: 0, symbol: 'NT$', symbolPosition: 'prefix' },\n\n // New Currencies with 0 decimal places\n [CurrencyCode.GNF]: { minorUnits: 0, symbol: 'GNF', symbolPosition: 'prefix' },\n [CurrencyCode.BIF]: { minorUnits: 0, symbol: 'FBu', symbolPosition: 'prefix' },\n [CurrencyCode.DJF]: { minorUnits: 0, symbol: 'Fdj', symbolPosition: 'prefix' },\n [CurrencyCode.KMF]: { minorUnits: 0, symbol: 'CF', symbolPosition: 'prefix' },\n [CurrencyCode.PYG]: { minorUnits: 0, symbol: '₲', symbolPosition: 'prefix' },\n [CurrencyCode.RWF]: { minorUnits: 0, symbol: 'FRw', symbolPosition: 'prefix' },\n [CurrencyCode.UGX]: { minorUnits: 0, symbol: 'USh', symbolPosition: 'prefix' },\n [CurrencyCode.VUV]: { minorUnits: 0, symbol: 'VT', symbolPosition: 'prefix' },\n [CurrencyCode.XAF]: { minorUnits: 0, symbol: 'FCFA', symbolPosition: 'suffix' },\n [CurrencyCode.XOF]: { minorUnits: 0, symbol: 'CFA', symbolPosition: 'suffix' },\n [CurrencyCode.XPF]: { minorUnits: 0, symbol: '₣', symbolPosition: 'suffix' },\n\n // Three decimal currencies\n [CurrencyCode.KWD]: { minorUnits: 3, symbol: 'KD', symbolPosition: 'prefix' },\n [CurrencyCode.BHD]: { minorUnits: 3, symbol: 'BD', symbolPosition: 'prefix' },\n [CurrencyCode.OMR]: { minorUnits: 3, symbol: 'OMR', symbolPosition: 'prefix' },\n [CurrencyCode.JOD]: { minorUnits: 3, symbol: 'JD', symbolPosition: 'prefix' },\n [CurrencyCode.TND]: { minorUnits: 3, symbol: 'DT', symbolPosition: 'prefix' },\n [CurrencyCode.LYD]: { minorUnits: 3, symbol: 'LD', symbolPosition: 'prefix' },\n [CurrencyCode.IQD]: { minorUnits: 3, symbol: 'IQD', symbolPosition: 'prefix' },\n};\n\n/** Default configuration for unknown currencies (assumes 2 decimal places) */\nconst DEFAULT_CURRENCY_CONFIG: CurrencyConfig = {\n minorUnits: 2,\n symbol: '',\n symbolPosition: 'prefix',\n};\n\n/**\n * Gets the currency configuration for a given currency code.\n * Falls back to default configuration (2 decimal places) for unknown currencies.\n *\n * @param currency - ISO 4217 currency code (e.g., 'USD', 'EUR')\n * @returns Currency configuration\n */\nexport function getCurrencyConfig(currency: CurrencyCode): CurrencyConfig {\n const upperCurrency = currency.toUpperCase();\n return CURRENCY_CONFIG[upperCurrency] || DEFAULT_CURRENCY_CONFIG;\n}\n\n/**\n * Gets the multiplier for converting between major and minor currency units.\n *\n * @param currency - ISO 4217 currency code (e.g., 'USD', 'EUR')\n * @returns The multiplier (e.g., 100 for USD, 1 for JPY, 1000 for KWD)\n *\n * @example\n * getMinorUnitMultiplier('USD'); // Returns 100\n * getMinorUnitMultiplier('JPY'); // Returns 1\n * getMinorUnitMultiplier('KWD'); // Returns 1000\n */\nexport function getMinorUnitMultiplier(currency: CurrencyCode): number {\n const config = getCurrencyConfig(currency);\n return Math.pow(10, config.minorUnits);\n}\n\n/**\n * Converts a major currency amount to minor units (e.g., dollars to cents).\n * Uses Math.round to handle floating-point precision issues.\n *\n * @param amount - Amount in major currency units (e.g., 10.50 dollars)\n * @param currency - ISO 4217 currency code (e.g., 'USD')\n * @returns Amount in minor units as an integer (e.g., 1050 cents)\n *\n * @example\n * toMinorUnits(10.50, 'USD'); // Returns 1050\n * toMinorUnits(1000, 'JPY'); // Returns 1000 (JPY has no minor units)\n * toMinorUnits(10.500, 'KWD'); // Returns 10500 (KWD has 3 decimal places)\n */\nexport function toMinorUnits(amount: number, currency: CurrencyCode): number {\n const multiplier = getMinorUnitMultiplier(currency);\n // Use Math.round to handle floating-point precision issues\n return Math.round(amount * multiplier);\n}\n\n/**\n * Converts minor currency units to major units (e.g., cents to dollars).\n *\n * @param minorAmount - Amount in minor units (e.g., 1050 cents)\n * @param currency - ISO 4217 currency code (e.g., 'USD')\n * @returns Amount in major units (e.g., 10.50 dollars)\n *\n * @example\n * fromMinorUnits(1050, 'USD'); // Returns 10.50\n * fromMinorUnits(1000, 'JPY'); // Returns 1000\n * fromMinorUnits(10500, 'KWD'); // Returns 10.500\n */\nexport function fromMinorUnits(minorAmount: number, currency: CurrencyCode): number {\n const multiplier = getMinorUnitMultiplier(currency);\n return minorAmount / multiplier;\n}\n\n/**\n * Formats a minor currency amount for display with currency symbol.\n *\n * @param minorAmount - Amount in minor units (e.g., 1050 cents)\n * @param currency - ISO 4217 currency code (e.g., 'USD')\n * @param options - Formatting options\n * @returns Formatted currency string (e.g., '$10.50')\n *\n * @example\n * formatCurrency(1050, 'USD'); // Returns '$10.50'\n * formatCurrency(1000, 'JPY'); // Returns '¥1000'\n * formatCurrency(10500, 'KWD'); // Returns 'KD10.500'\n */\nexport function formatCurrency(\n minorAmount: number,\n currency: CurrencyCode,\n options: {\n /** Whether to include the currency symbol (default: true) */\n includeSymbol?: boolean;\n /** Whether to use grouping separators for thousands (default: true) */\n useGrouping?: boolean;\n } = {},\n): string {\n const { includeSymbol = true, useGrouping = true } = options;\n const config = getCurrencyConfig(currency);\n const majorAmount = fromMinorUnits(minorAmount, currency);\n\n const formattedNumber = majorAmount.toLocaleString('en-US', {\n minimumFractionDigits: config.minorUnits,\n maximumFractionDigits: config.minorUnits,\n useGrouping,\n });\n\n if (!includeSymbol || !config.symbol) {\n return formattedNumber;\n }\n\n if (config.symbolPosition === 'suffix') {\n return `${formattedNumber}${config.symbol}`;\n }\n\n return `${config.symbol}${formattedNumber}`;\n}\n\n/**\n * Safely adds two amounts in minor units.\n * Both amounts should already be in minor units (integers).\n *\n * @param a - First amount in minor units\n * @param b - Second amount in minor units\n * @returns Sum in minor units\n *\n * @example\n * addAmounts(1050, 250); // Returns 1300\n */\nexport function addAmounts(a: number, b: number): number {\n return Math.round(a + b);\n}\n\n/**\n * Safely subtracts two amounts in minor units.\n * Both amounts should already be in minor units (integers).\n *\n * @param a - First amount in minor units\n * @param b - Second amount to subtract in minor units\n * @returns Difference in minor units\n *\n * @example\n * subtractAmounts(1050, 250); // Returns 800\n */\nexport function subtractAmounts(a: number, b: number): number {\n return Math.round(a - b);\n}\n\n/**\n * Safely multiplies an amount by a factor.\n * The amount should be in minor units, the multiplier can be a decimal.\n *\n * @param amount - Amount in minor units\n * @param multiplier - Factor to multiply by (e.g., quantity or percentage as decimal)\n * @returns Product in minor units, rounded to nearest integer\n *\n * @example\n * multiplyAmount(1050, 2); // Returns 2100 (doubling)\n * multiplyAmount(1050, 0.15); // Returns 158 (15% of amount)\n */\nexport function multiplyAmount(amount: number, multiplier: number): number {\n return Math.round(amount * multiplier);\n}\n\n/**\n * Safely divides an amount by a divisor.\n * The amount should be in minor units.\n *\n * @param amount - Amount in minor units\n * @param divisor - Value to divide by\n * @returns Quotient in minor units, rounded to nearest integer\n *\n * @example\n * divideAmount(1050, 2); // Returns 525 (halving)\n * divideAmount(1000, 3); // Returns 333 (rounded)\n */\nexport function divideAmount(amount: number, divisor: number): number {\n if (divisor === 0) {\n throw new Error('Cannot divide by zero');\n }\n return Math.round(amount / divisor);\n}\n\n/**\n * Calculates a percentage of an amount.\n *\n * @param amount - Base amount in minor units\n * @param percentage - Percentage as a number (e.g., 15 for 15%, not 0.15)\n * @returns The percentage amount in minor units\n *\n * @example\n * calculatePercentage(10000, 15); // Returns 1500 (15% of 10000)\n * calculatePercentage(1050, 8.25); // Returns 87 (8.25% of 1050, rounded)\n */\nexport function calculatePercentage(amount: number, percentage: number): number {\n return Math.round((amount * percentage) / 100);\n}\n\n/**\n * Converts a string amount (e.g., \"10.50\") to minor units.\n * Useful for parsing user input or legacy string amounts.\n *\n * @param amountString - Amount as a string (e.g., \"10.50\")\n * @param currency - ISO 4217 currency code\n * @returns Amount in minor units, or null if parsing fails\n *\n * @example\n * parseAmountToMinorUnits(\"10.50\", \"USD\"); // Returns 1050\n * parseAmountToMinorUnits(\"invalid\", \"USD\"); // Returns null\n */\nexport function parseAmountToMinorUnits(amountString: string, currency: CurrencyCode): number | null {\n const parsed = parseFloat(amountString);\n if (isNaN(parsed)) {\n return null;\n }\n return toMinorUnits(parsed, currency);\n}\n\n/**\n * Checks if a currency code is supported with known configuration.\n *\n * @param currency - ISO 4217 currency code\n * @returns True if the currency has explicit configuration\n */\nexport function isSupportedCurrency(currency: CurrencyCode): boolean {\n return currency.toUpperCase() in CURRENCY_CONFIG;\n}\n\n/**\n * Validates that a string is a supported {@link CurrencyCode} and returns it.\n * @param value - Raw currency string (e.g. from API or DTO)\n * @returns Valid CurrencyCode\n * @throws Error if value is not a supported CurrencyCode\n */\nexport function parseCurrencyCode(value: string): CurrencyCode {\n if (!value || typeof value !== 'string') {\n throw new Error(`Currency value is missing or invalid`);\n }\n const validCodes = Object.values(CurrencyCode) as string[];\n if (!validCodes.includes(value)) {\n throw new Error(`\"${value}\" is not a supported CurrencyCode. Supported codes: ${validCodes.join(', ')}`);\n }\n return value as CurrencyCode;\n}\n\nexport function parseStripeCurrencyCode(value: string): StripeCurrencyCode {\n if (!value || typeof value !== 'string') {\n throw new Error(`Currency value is missing or invalid`);\n }\n const validCodes = Object.values(StripeCurrencyCode) as string[];\n if (!validCodes.includes(value)) {\n throw new Error(`\"${value}\" is not a supported Stripe CurrencyCode. Supported codes: ${validCodes.join(', ')}`);\n }\n return value as StripeCurrencyCode;\n}\n\n/**\n * Converts minor currency units to major units as a number.\n * Uses the minorUnits count directly instead of looking up by currency code.\n *\n * @param minorAmount - Amount in minor units (e.g., 1050 cents)\n * @param minorUnits - Number of decimal places for the currency (e.g., 2 for USD, 0 for JPY, 3 for KWD)\n * @returns Amount in major units as a number (e.g., 10.50 dollars)\n *\n * @example\n * stringifyMinorUnits(1050, 2); // Returns 10.50\n * stringifyMinorUnits(1000, 0); // Returns 1000\n * stringifyMinorUnits(10500, 3); // Returns 10.5\n */\nexport function stringifyMinorUnits(minorAmount: number, minorUnits: number): number {\n const multiplier = Math.pow(10, minorUnits);\n return minorAmount / multiplier;\n}\n\n/**\n * Converts minor currency units to a plain decimal string without symbol or grouping.\n * Useful for APIs like WooCommerce that expect plain numeric strings.\n *\n * @param minorAmount - Amount in minor units (e.g., 1050 cents)\n * @param minorUnits - Number of decimal places for the currency (e.g., 2 for USD, 0 for JPY, 3 for KWD)\n * @returns Plain decimal string (e.g., '10.50')\n *\n * @example\n * formatMinorUnitsToString(1050, 2); // Returns '10.50'\n * formatMinorUnitsToString(1000, 0); // Returns '1000'\n * formatMinorUnitsToString(10500, 3); // Returns '10.5'\n */\nexport function formatMinorUnitsToString(minorAmount: number, minorUnits: number): string {\n const majorAmount = stringifyMinorUnits(minorAmount, minorUnits);\n return majorAmount.toString();\n}\n\n/**\n * Get the number of minor units for a currency.\n * Used in BuilderHub\n * @param currency - ISO 4217 currency code\n * @returns Number of minor unit digits (e.g., 2 for USD, 0 for JPY, 3 for KWD)\n */\nexport function getMinorUnits(currency: CurrencyCode): number {\n return getCurrencyConfig(currency).minorUnits;\n}\n\n/**\n * Creates an Amount object from user input string.\n * Converts \"31.22\" + \"USD\" → { amount: 3122, currency: \"USD\", minorUnits: 2 }\n * Used in BuilderHub\n * @param value - User input value (string like \"31.22\" or number)\n * @param currency - ISO 4217 currency code from company.settings.currency\n * @returns Amount object or undefined if value is empty/invalid\n */\nexport function createAmount(value: string | number | null | undefined, currency: CurrencyCode): Amount | undefined {\n if (value === null || value === undefined || value === '') {\n return undefined;\n }\n\n const numericValue = typeof value === 'string' ? parseFloat(value) : value;\n\n if (isNaN(numericValue)) {\n return undefined;\n }\n\n const minorUnits = getMinorUnits(currency);\n const multiplier = Math.pow(10, minorUnits);\n\n return {\n amount: Math.round(numericValue * multiplier),\n currency,\n minorUnits,\n };\n}\n\n/**\n * Converts an Amount object to a display string for the UI.\n * { amount: 3122, currency: \"USD\", minorUnits: 2 } → \"31.22\"\n * Used in BuilderHub\n * @param amount - Amount object from API response\n * @returns Formatted string (e.g., \"31.22\") or empty string if undefined\n */\nexport function amountToString(amount: Amount | undefined | null): string {\n if (!amount) {\n return '';\n }\n\n const divisor = Math.pow(10, amount.minorUnits);\n const majorValue = amount.amount / divisor;\n return majorValue.toFixed(amount.minorUnits);\n}\n","/**\n * Order-total anchors, defined once for every consumer.\n *\n * These are the figures the order page, the reports and the receipts must all agree on. Keeping\n * the arithmetic here rather than at each call site is the point: the same number was previously\n * reassembled in three places and drifted between them.\n */\n\n/** Wire money is `string | number` on some surfaces (Mongoose Decimal serialises as a string). */\ntype MoneyInput = number | string | null | undefined;\n\nfunction toMinorUnits(value: MoneyInput): number {\n return Number(value) || 0;\n}\n\n/**\n * **Total Collected** — what actually hit the drawer and the processor for one order.\n *\n * ```\n * totalCollected = order.summary.amountPaid + order.summary.tipTotal\n * ```\n *\n * Both inputs are persisted fields written by the POS from the same `paymentMethods[]` array:\n * `amountPaid` is Σ `paymentMethods[].amount` (base only — every leg, liability tenders included),\n * and `tipTotal` is Σ `paymentMethods[].tip.amount`. Cash rounding needs no term of its own: the\n * writer has already folded it into the cash leg's `amount`.\n *\n * Do not substitute `summary.total` — that field is `base + tip` ignoring cash rounding, so it\n * equals neither this anchor nor `totalBeforeTip`.\n *\n * Note this is not `amountCollected` from the Sales Breakdown report\n * (`summary.payments.cardTotal + cashTotal + customTotal`), which is tips-exclusive and skips the\n * `redeem` bucket. That figure answers \"how much settles\", this one answers \"how much the\n * customer handed over\".\n *\n * @param amountPaid `order.summary.amountPaid`\n * @param tipTotal `order.summary.tipTotal`\n * @returns integer minor units\n */\nexport function getTotalCollected(amountPaid: MoneyInput, tipTotal: MoneyInput): number {\n return toMinorUnits(amountPaid) + toMinorUnits(tipTotal);\n}\n\n/**\n * **What one tender leg took** — its principal plus the tip captured on it.\n *\n * `paymentMethods[].amount` is the base only; the tip lives in `.tip.amount`. Cash rounding needs\n * no term because the writer has already folded it into `amount`, so adding it here would\n * double-count it and break `Σ legs ≡ Total Collected`.\n *\n * @param amount `paymentMethods[].amount`\n * @param tipAmount `paymentMethods[].tip.amount`\n * @returns integer minor units\n */\nexport function getPaymentLegTotal(amount: MoneyInput, tipAmount: MoneyInput): number {\n return toMinorUnits(amount) + toMinorUnits(tipAmount);\n}\n\n/**\n * **What a cash leg was owed** before the till rounded it to the nearest increment.\n *\n * `cashRounding` is a signed delta already inside `amount` (`rounded − owed`), so removing it\n * recovers what the cashier actually had to collect. Reads back as the \"Amount due\" line above\n * the rounding line on a receipt.\n *\n * @param amount `paymentMethods[].amount`\n * @param cashRounding `paymentMethods[].cashRounding`\n * @returns integer minor units\n */\nexport function getCashAmountDue(amount: MoneyInput, cashRounding: MoneyInput): number {\n return toMinorUnits(amount) - toMinorUnits(cashRounding);\n}\n\n/** The writer's settlement block — `summary.payments`. Liability (`redeem`) tenders are excluded. */\nexport interface SettlementBuckets {\n cardTotal?: MoneyInput;\n cashTotal?: MoneyInput;\n customTotal?: MoneyInput;\n}\n\n/**\n * **What actually settles** to the bank.\n *\n * The writer already bucketed the tender legs into `summary.payments` and skipped the `redeem`\n * bucket while doing it — a gift-card redemption discharges an obligation taken on when the card\n * was sold, so no new money arrives and nothing settles. Those buckets hold\n * `paymentMethods[].amount` only, and a tip is charged to the card and reaches the bank with it,\n * so the tips are added back — the same thing hub-api's settlement report does before computing\n * the deposit (`cardsCollected = orderCardTotal + grossTips`).\n *\n * Equals {@link getTotalCollected} on any order without a redemption; the difference between them\n * is exactly what was redeemed.\n *\n * @param payments `order.summary.payments`\n * @param tipTotal `order.summary.tipTotal`\n * @returns integer minor units\n */\nexport function getSettlementTotal(payments: SettlementBuckets | undefined | null, tipTotal: MoneyInput): number {\n return (\n toMinorUnits(payments?.cardTotal) +\n toMinorUnits(payments?.cashTotal) +\n toMinorUnits(payments?.customTotal) +\n toMinorUnits(tipTotal)\n );\n}\n\n/**\n * **A line's subtotal** — unit price × quantity, before discounts, fees and tax.\n *\n * Product lines persist this as `lineItems[].subTotal`, so read the field there. Custom sales do\n * not carry it — `OrderCustomSale` has no such property in the schema, and the stored documents\n * confirm it — but the figure is still the first row of the line's breakdown, and it is the\n * definition of the field rather than a re-derivation of one.\n *\n * @param price line `price` (unit price)\n * @param quantity line `quantity`\n * @returns integer minor units\n */\nexport function getLineSubtotal(price: MoneyInput, quantity: MoneyInput): number {\n return toMinorUnits(price) * toMinorUnits(quantity);\n}\n\n/**\n * **The goods portion of a line** — its total with the tax taken back out.\n *\n * A refunded custom sale is shown as goods and tax on separate rows, and the stored `total`\n * carries both. Never render the difference as a \"net\" of a *sale* line: tax is rounded on a\n * table-wide aggregate, so a per-line net plus its tax can land a cent off the gross the customer\n * paid. On a refund line the two rows are the refund's own components and do foot.\n *\n * @param total line `total`\n * @param totalTax line `totalTax`\n * @returns integer minor units\n */\nexport function getGoodsPortion(total: MoneyInput, totalTax: MoneyInput): number {\n return toMinorUnits(total) - toMinorUnits(totalTax);\n}\n","import { PricingRegionEnum } from '../enums';\n\nexport interface CurrencyRate {\n rate: number;\n country: string;\n}\n\nexport const REGION_MAPPING: Record<string, PricingRegionEnum> = {\n // North America\n US: PricingRegionEnum.NORTH_AMERICA,\n CA: PricingRegionEnum.NORTH_AMERICA,\n MX: PricingRegionEnum.NORTH_AMERICA,\n\n // Europe\n AT: PricingRegionEnum.EUROPE,\n BE: PricingRegionEnum.EUROPE,\n BG: PricingRegionEnum.EUROPE,\n CH: PricingRegionEnum.EUROPE,\n CY: PricingRegionEnum.EUROPE,\n CZ: PricingRegionEnum.EUROPE,\n DE: PricingRegionEnum.EUROPE,\n DK: PricingRegionEnum.EUROPE,\n EE: PricingRegionEnum.EUROPE,\n ES: PricingRegionEnum.EUROPE,\n FI: PricingRegionEnum.EUROPE,\n FR: PricingRegionEnum.EUROPE,\n GB: PricingRegionEnum.EUROPE, // Stripe uses 'GB' (not 'UK')\n GR: PricingRegionEnum.EUROPE,\n HR: PricingRegionEnum.EUROPE,\n HU: PricingRegionEnum.EUROPE,\n IE: PricingRegionEnum.EUROPE,\n IT: PricingRegionEnum.EUROPE,\n LI: PricingRegionEnum.EUROPE,\n LT: PricingRegionEnum.EUROPE,\n LU: PricingRegionEnum.EUROPE,\n LV: PricingRegionEnum.EUROPE,\n MT: PricingRegionEnum.EUROPE,\n NL: PricingRegionEnum.EUROPE,\n NO: PricingRegionEnum.EUROPE,\n PL: PricingRegionEnum.EUROPE,\n PT: PricingRegionEnum.EUROPE,\n RO: PricingRegionEnum.EUROPE,\n SE: PricingRegionEnum.EUROPE,\n SI: PricingRegionEnum.EUROPE,\n SK: PricingRegionEnum.EUROPE,\n GI: PricingRegionEnum.EUROPE, // Gibraltar (NEW)\n\n // Others (Asia-Pacific, Middle East, South America, etc.)\n AE: PricingRegionEnum.OTHER, // United Arab Emirates\n AU: PricingRegionEnum.OTHER, // Australia\n BR: PricingRegionEnum.OTHER, // Brazil (NEW)\n HK: PricingRegionEnum.OTHER, // Hong Kong\n IN: PricingRegionEnum.OTHER, // India (NEW)\n JP: PricingRegionEnum.OTHER, // Japan\n MY: PricingRegionEnum.OTHER, // Malaysia\n NZ: PricingRegionEnum.OTHER, // New Zealand\n SG: PricingRegionEnum.OTHER, // Singapore\n TH: PricingRegionEnum.OTHER, // Thailand\n};\n\nexport const STRIPE_SUPPORTED_COUNTRIES = new Set([\n // North America\n 'US',\n 'CA',\n 'MX',\n // Europe\n 'AT',\n 'BE',\n 'BG',\n 'CH',\n 'CY',\n 'CZ',\n 'DE',\n 'DK',\n 'EE',\n 'ES',\n 'FI',\n 'FR',\n 'GB',\n 'GR',\n 'HR',\n 'HU',\n 'IE',\n 'IT',\n 'LI',\n 'LT',\n 'LU',\n 'LV',\n 'MT',\n 'NL',\n 'NO',\n 'PL',\n 'PT',\n 'RO',\n 'SE',\n 'SI',\n 'SK',\n // Others\n 'AE', // United Arab Emirates\n 'AU', // Australia\n 'BR', // Brazil (NEW)\n 'GI', // Gibraltar (NEW)\n 'HK', // Hong Kong\n 'IN', // India (NEW)\n 'JP', // Japan\n 'MY', // Malaysia\n 'NZ', // New Zealand\n 'SG', // Singapore\n 'TH', // Thailand\n]);\nexport const NAFixedRates: Record<string, CurrencyRate> = {\n USD: { rate: 30, country: 'United States' },\n CAD: { rate: 20, country: 'Canada' },\n MXN: { rate: 300, country: 'Mexico' },\n};\nexport const EUFixedRates: Record<string, CurrencyRate> = {\n EUR: { rate: 30, country: 'European Union' },\n GBP: { rate: 20, country: 'Great Britain' },\n CHF: { rate: 30, country: 'Switzerland' },\n DKK: { rate: 180, country: 'Denmark' },\n NOK: { rate: 200, country: 'Norway' },\n SEK: { rate: 180, country: 'Sweden' },\n PLN: { rate: 100, country: 'Poland' },\n};\nexport const OtherFixedRates: Record<string, CurrencyRate> = {\n AUD: { rate: 30, country: 'Australia' },\n NZD: { rate: 30, country: 'New Zealand' },\n SGD: { rate: 50, country: 'Singapore' },\n MYR: { rate: 100, country: 'Malaysia' },\n JPY: { rate: 30, country: 'Japan' },\n};\n\nexport const COUNTRY_CURRENCIES: Record<string, string> = {\n US: 'USD', CA: 'CAD', MX: 'MXN',\n AT: 'EUR', BE: 'EUR', BG: 'BGN', CH: 'CHF', CY: 'EUR', CZ: 'CZK',\n DE: 'EUR', DK: 'DKK', EE: 'EUR', ES: 'EUR', FI: 'EUR', FR: 'EUR',\n GB: 'GBP', GI: 'GIP', GR: 'EUR', HR: 'EUR', HU: 'HUF', IE: 'EUR',\n IT: 'EUR', LI: 'CHF', LT: 'EUR', LU: 'EUR', LV: 'EUR', MT: 'EUR',\n NL: 'EUR', NO: 'NOK', PL: 'PLN', PT: 'EUR', RO: 'RON', SE: 'SEK',\n SI: 'EUR', SK: 'EUR',\n AE: 'AED', AU: 'AUD', BR: 'BRL', HK: 'HKD', IN: 'INR', JP: 'JPY',\n MY: 'MYR', NZ: 'NZD', SG: 'SGD', TH: 'THB',\n};","import { PricingRegionEnum } from '../enums';\nimport { REGION_MAPPING, NAFixedRates, EUFixedRates, OtherFixedRates, CurrencyRate } from 'constants/pricing.constants';\n\nexport function getPricingRegionFromCountry(countryCode?: string): PricingRegionEnum {\n const code = (countryCode || '').toUpperCase();\n if (NORTH_AMERICA.has(code)) return PricingRegionEnum.NORTH_AMERICA;\n if (EUROPE.has(code)) return PricingRegionEnum.EUROPE;\n return PricingRegionEnum.OTHER;\n}\n\nexport const NORTH_AMERICA = getCountriesByRegion(PricingRegionEnum.NORTH_AMERICA);\nexport const EUROPE = getCountriesByRegion(PricingRegionEnum.EUROPE);\n\n// TODO_J: Rely on external api to know the exchange rate between USD and the local currency\nexport function convertFixedFeeToLocalCurrency(currency: string, region: PricingRegionEnum): number {\n const currencyCode = currency.toUpperCase();\n let fixedRate: CurrencyRate | undefined;\n\n switch (region) {\n case PricingRegionEnum.NORTH_AMERICA: {\n fixedRate = NAFixedRates[currencyCode];\n break;\n }\n case PricingRegionEnum.EUROPE: {\n fixedRate = EUFixedRates[currencyCode];\n break;\n }\n case PricingRegionEnum.OTHER: {\n fixedRate = OtherFixedRates[currencyCode];\n break;\n }\n }\n return fixedRate?.rate ?? null;\n}\n\nexport function getCountriesByRegion(region: PricingRegionEnum): Set<string> {\n const countries = new Set<string>();\n for (const [country, mappedRegion] of Object.entries(REGION_MAPPING)) {\n if (mappedRegion === region) {\n countries.add(country);\n }\n }\n return countries;\n}\n","import { EndOfSessionReport } from '@/interfaces/Report.interface';\n\n// Paths whose numeric values must be negated when leaving the wire.\n// Backend persists raw positive magnitudes; this is the one place that\n// flips them for display. UI prefix glyphs (\"+ Tips\", \"− Refunds\") are\n// a presentation concern and live in the frontend, not here.\n//\n// Path key uses dot notation. Append `[]` to descend into every array\n// item. Unmatched numeric fields pass through unchanged.\nexport const REPORT_NEGATE_PATHS: ReadonlySet<string> = new Set([\n // Sales summary — reductions to revenue\n 'salesSummary.discounts.netDiscounts',\n 'salesSummary.refundsItems',\n\n // Settlement — money going out of the merchant\n 'settlementBreakdown.cards.refunded',\n 'settlementBreakdown.cards.processingFees',\n 'settlementBreakdown.cash.refunded',\n 'settlementBreakdown.custom[].refunded',\n 'settlementBreakdown.custom[].processingFees',\n\n // Tax breakdown — refunds sub-table renders signed-negative\n 'taxBreakdown.refunds.entries[].taxableSales',\n 'taxBreakdown.refunds.entries[].tax',\n 'taxBreakdown.refunds.total.taxableSales',\n 'taxBreakdown.refunds.total.tax',\n\n // Refunds breakdown — reductions and naturally-signed entries\n 'refundsBreakdown.discountsReversed',\n // 2026 AUG10, cashRoundingRefund is showing as natural sign\n // 'refundsBreakdown.cashRoundingRefund',\n\n // Fees breakdown — refunded magnitudes are money flowing back out\n 'feesBreakdown.productFee.refundedProductFees',\n 'feesBreakdown.cartFee.refundedCartFees',\n\n // Discounts breakdown — refunded magnitudes reverse discount reductions\n 'discountsBreakdown.productDiscounts.refundedProductDiscounts',\n 'discountsBreakdown.cartDiscounts.refundedCartDiscounts',\n\n // Staff sales — refunds are money flowing back out\n 'staffSales.staffSales[].refundSales',\n 'staffSales.refundTotal',\n\n // Tips — refunds are money flowing back out\n 'tipsBreakdown.tips[].refundAmount',\n]);\n\nexport function signReportForDisplay(report: EndOfSessionReport): EndOfSessionReport {\n return negateAtPaths(report, '', REPORT_NEGATE_PATHS) as EndOfSessionReport;\n}\n\nfunction negateAtPaths(value: unknown, path: string, paths: ReadonlySet<string>): unknown {\n if (Array.isArray(value)) {\n const next = `${path}[]`;\n return value.map((item) => negateAtPaths(item, next, paths));\n }\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n const next = path ? `${path}.${key}` : key;\n out[key] = negateAtPaths(child, next, paths);\n }\n return out;\n }\n if (typeof value === 'number' && paths.has(path)) {\n // Avoid producing negative zero: formatters that branch on `value < 0`\n // miss `-0` (IEEE-754 says `-0 < 0` is false), then render `-0` as\n // `$-0.00` instead of `$0.00`. Normalize zero before negating.\n return value === 0 ? 0 : -value;\n }\n return value;\n}\n","// Mongo-id helpers shared across the POS frontend packages (Render + port-louis).\n\nfunction padHex(value: number, length: number) {\n return value.toString(16).padStart(length, '0');\n}\n\n// Canonical MongoDB ObjectId layout (24 hex = 12 bytes):\n// 4-byte timestamp (seconds) + 5-byte per-process random + 3-byte monotonic counter.\n// `PROCESS_RANDOM` is generated ONCE per session (not per call), and the counter is a\n// real incrementing value seeded randomly — fixing the previous impl where the machine/pid\n// bytes were re-randomized every call and the \"counter\" was effectively random (dead).\n// No external dependency (common stays dependency-light); not crypto-grade, same as before.\nconst PROCESS_RANDOM: string = Array.from({ length: 5 }, () =>\n padHex(Math.floor(Math.random() * 0x100), 2),\n).join('');\n\nlet objectIdCounter = Math.floor(Math.random() * 0xffffff);\n\nexport function generateMongoID(): string {\n const timestamp = padHex(Math.floor(Date.now() / 1000), 8);\n objectIdCounter = (objectIdCounter + 1) % 0x1000000;\n return timestamp + PROCESS_RANDOM + padHex(objectIdCounter, 6);\n}\n\nexport function getCurrentISODate() {\n const now = new Date(Date.now());\n\n return now.toISOString();\n}\n\n/** Normalize sync / Redux ids (string or `{ $oid }`) to a 24-char hex string when possible. */\nexport function normalizeMongoIdString(value: unknown): string | null {\n if (value == null || value === '') {\n return null;\n }\n if (typeof value === 'string') {\n const t = value.trim();\n return t.length > 0 ? t : null;\n }\n if (typeof value === 'object' && value !== null && '$oid' in value) {\n const oid = (value as { $oid: unknown }).$oid;\n return typeof oid === 'string' && oid.length > 0 ? oid : null;\n }\n return null;\n}\n","/** Financial lifecycle of an order. */\nexport type PaymentState =\n | 'unpaid'\n | 'payment_pending'\n | 'partially_paid'\n | 'paid'\n | 'partially_refunded'\n | 'refunded'\n | 'voided';\n\n/** Operational lifecycle of an order (goods/services, including returns). */\nexport type FulfillmentState =\n | 'draft'\n | 'pending'\n | 'on_hold'\n | 'in_progress'\n | 'fulfilled'\n | 'partially_fulfilled'\n | 'returned'\n | 'partially_returned'\n | 'cancelled';\n\nexport const PAYMENT_STATES: readonly PaymentState[] = [\n 'unpaid',\n 'payment_pending',\n 'partially_paid',\n 'paid',\n 'partially_refunded',\n 'refunded',\n 'voided',\n] as const;\n\nexport const FULFILLMENT_STATES: readonly FulfillmentState[] = [\n 'draft',\n 'pending',\n 'on_hold',\n 'in_progress',\n 'fulfilled',\n 'partially_fulfilled',\n 'returned',\n 'partially_returned',\n 'cancelled',\n] as const;\n\nexport function isPaymentState(value: string): value is PaymentState {\n return (PAYMENT_STATES as readonly string[]).includes(value);\n}\n\nexport function isFulfillmentState(value: string): value is FulfillmentState {\n return (FULFILLMENT_STATES as readonly string[]).includes(value);\n}\n\n/** Payment × fulfillment pair used by the engine, guards, and `StateConfig.validInitialStates`. */\nexport interface StatePair {\n payment: PaymentState;\n fulfillment: FulfillmentState;\n}\n\n/** Operators for transition conditions (closed set). */\nexport type ConditionOperator =\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'in'\n | 'notIn'\n | 'isEmpty'\n | 'isNotEmpty';\n\nexport const CONDITION_OPERATORS: readonly ConditionOperator[] = [\n 'eq',\n 'neq',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'in',\n 'notIn',\n 'isEmpty',\n 'isNotEmpty',\n] as const;\n\nexport function isConditionOperator(value: string): value is ConditionOperator {\n return (CONDITION_OPERATORS as readonly string[]).includes(value);\n}\n\n/** Path enforcement mode per axis. */\nexport type PathMode = 'strict' | 'permissive';\n\nexport const PATH_MODES: readonly PathMode[] = [\n 'strict',\n 'permissive',\n] as const;\n","import type {\n FulfillmentStateDefinition,\n PaymentStateDefinition,\n} from './interfaces';\nimport type { FulfillmentState, PaymentState } from './types';\n\nexport interface StateSchema {\n readonly paymentStates: readonly PaymentStateDefinition[];\n readonly fulfillmentStates: readonly FulfillmentStateDefinition[];\n}\n\nconst PAYMENT_DEFS: { id: PaymentState; label: string; terminal: boolean }[] = [\n { id: 'unpaid', label: 'Unpaid', terminal: false },\n { id: 'payment_pending', label: 'Payment Pending', terminal: false },\n { id: 'partially_paid', label: 'Partially Paid', terminal: false },\n { id: 'paid', label: 'Paid', terminal: false },\n { id: 'partially_refunded', label: 'Partially Refunded', terminal: false },\n { id: 'refunded', label: 'Refunded', terminal: true },\n { id: 'voided', label: 'Voided', terminal: true },\n];\n\nconst FULFILLMENT_DEFS: { id: FulfillmentState; label: string; terminal: boolean }[] = [\n { id: 'draft', label: 'Draft', terminal: false },\n { id: 'pending', label: 'Pending', terminal: false },\n { id: 'on_hold', label: 'On Hold', terminal: false },\n { id: 'in_progress', label: 'In Progress', terminal: false },\n { id: 'fulfilled', label: 'Fulfilled', terminal: true },\n { id: 'partially_fulfilled', label: 'Partially Fulfilled', terminal: false },\n { id: 'returned', label: 'Returned', terminal: true },\n { id: 'partially_returned', label: 'Partially Returned', terminal: false },\n { id: 'cancelled', label: 'Cancelled', terminal: true },\n];\n\nexport function basePaymentDefinitions(): PaymentStateDefinition[] {\n return PAYMENT_DEFS.map((d) => ({\n id: d.id,\n label: d.label,\n isBase: true,\n isTerminal: d.terminal,\n }));\n}\n\nexport function baseFulfillmentDefinitions(): FulfillmentStateDefinition[] {\n return FULFILLMENT_DEFS.map((d) => ({\n id: d.id,\n label: d.label,\n isBase: true,\n isTerminal: d.terminal,\n }));\n}\n\nexport const STATE_SCHEMA: Readonly<StateSchema> = Object.freeze({\n paymentStates: Object.freeze(basePaymentDefinitions()),\n fulfillmentStates: Object.freeze(baseFulfillmentDefinitions()),\n});\n","import type { FinancialInvariant } from './interfaces';\nimport type { PaymentState, StatePair } from './types';\n\nconst REFUND_ALLOWED_FULFILLMENT = new Set<string>(['fulfilled', 'returned', 'partially_returned', 'cancelled']);\n\n// Payment states ordered by collection progress. Any move that decreases\n// the index is a regression — money was collected but is being \"un-collected\"\n// without going through a refund flow.\nconst PAYMENT_COLLECTION_ORDER: readonly PaymentState[] = ['unpaid', 'partially_paid', 'paid'];\n\n/**\n * Layer 1a — hard-coded, non-configurable financial integrity checks.\n * `check` returns true when the requested transition **violates** the invariant.\n */\nexport const FINANCIAL_INVARIANTS: readonly FinancialInvariant[] = [\n {\n id: 'no-leave-refunded',\n description: 'Cannot change payment state after a full refund (no un-refund / reactivation of funds)',\n check: (from: StatePair | null, to: StatePair) => from?.payment === 'refunded' && to.payment !== 'refunded',\n },\n {\n id: 'no-leave-voided',\n description: 'Cannot un-void payment (voided orders stay voided on the payment axis)',\n check: (from: StatePair | null, to: StatePair) => from?.payment === 'voided' && to.payment !== 'voided',\n },\n {\n id: 'no-refund-without-fulfillment',\n description: 'Cannot mark payment as fully refunded unless fulfillment is delivered, returned, or cancelled',\n check: (_from: StatePair | null, to: StatePair) =>\n to.payment === 'refunded' && !REFUND_ALLOWED_FULFILLMENT.has(to.fulfillment),\n },\n {\n id: 'no-partial-refund-in-draft',\n description: 'Cannot partially refund while order is still in draft fulfillment',\n check: (_from: StatePair | null, to: StatePair) =>\n to.payment === 'partially_refunded' && to.fulfillment === 'draft',\n },\n {\n id: 'no-payment-regression',\n description: 'Payment cannot regress to a lower collection state without a refund — collected funds must be returned through the refund flow, not by reverting payment state',\n check: (from: StatePair | null, to: StatePair) => {\n if (!from) return false;\n const fromIdx = PAYMENT_COLLECTION_ORDER.indexOf(from.payment);\n const toIdx = PAYMENT_COLLECTION_ORDER.indexOf(to.payment);\n return fromIdx !== -1 && toIdx !== -1 && fromIdx > toIdx;\n },\n },\n] as const;\n\n/** Returns IDs of invariants violated by `from` → `to` (empty if none). */\nexport function getFinancialInvariantViolations(from: StatePair | null, to: StatePair): string[] {\n const ids: string[] = [];\n for (const inv of FINANCIAL_INVARIANTS) {\n if (inv.check(from, to)) {\n ids.push(inv.id);\n }\n }\n return ids;\n}\n\nexport function violatesFinancialInvariant(from: StatePair | null, to: StatePair): boolean {\n return getFinancialInvariantViolations(from, to).length > 0;\n}\n","import type { CrossAxisRule } from './interfaces';\n\n/**\n * Default merchant-toggleable cross-axis rules (Layer 1b).\n * Evaluation order and semantics are implemented in Phase 0b (`canTransition`).\n */\nexport const DEFAULT_CROSS_AXIS_RULES: readonly CrossAxisRule[] = [\n {\n id: 'require-payment-before-prep',\n label: 'Require payment before prep',\n description:\n 'When moving fulfillment to in progress, payment must be paid or partially paid',\n enabled: true,\n trigger: { axis: 'fulfillment', to: 'in_progress' },\n requires: { axis: 'payment', states: ['paid', 'partially_paid'] },\n },\n {\n id: 'require-fulfillment-or-return-before-full-refund',\n label: 'Require fulfillment or return before full refund',\n description:\n 'When moving payment to refunded, fulfillment must be fulfilled, returned, partially returned, or cancelled',\n enabled: true,\n trigger: { axis: 'payment', to: 'refunded' },\n requires: {\n axis: 'fulfillment',\n states: ['fulfilled', 'returned', 'partially_returned', 'cancelled'],\n },\n },\n {\n id: 'require-return-context-before-partial-refund',\n label: 'Require return path before partial refund',\n description:\n 'When moving payment to partially refunded, fulfillment must reflect a completed or return path',\n enabled: true,\n trigger: { axis: 'payment', to: 'partially_refunded' },\n requires: {\n axis: 'fulfillment',\n states: ['fulfilled', 'partially_returned', 'returned'],\n },\n },\n {\n id: 'block-fulfillment-when-payment-voided',\n label: 'Block fulfillment completion when payment is voided',\n description:\n 'When moving fulfillment to fulfilled, payment must not be voided',\n enabled: true,\n trigger: { axis: 'fulfillment', to: 'fulfilled' },\n requires: {\n axis: 'payment',\n states: ['unpaid', 'partially_paid', 'paid', 'partially_refunded', 'refunded'],\n },\n },\n {\n id: 'require-payment-before-fulfillment-complete',\n label: 'Require payment before fulfillment complete',\n description:\n 'When moving fulfillment to fulfilled, payment must be paid or partially paid',\n enabled: true,\n trigger: { axis: 'fulfillment', to: 'fulfilled' },\n requires: { axis: 'payment', states: ['paid', 'partially_paid'] },\n },\n];\n","import type {\n DisplayStateRule,\n StateConfig,\n StoredStateConfig,\n} from './interfaces';\nimport type { FulfillmentState, PaymentState } from './types';\nimport { PAYMENT_STATES, FULFILLMENT_STATES } from './types';\nimport { STATE_SCHEMA, basePaymentDefinitions, baseFulfillmentDefinitions } from './state-schema';\n\nconst DEFAULT_EPOCH = new Date(0);\n\nconst PAYMENT_LABELS = new Map<PaymentState, string>(\n basePaymentDefinitions().map((d) => [d.id, d.label]),\n);\nconst FULFILLMENT_LABELS = new Map<FulfillmentState, string>(\n baseFulfillmentDefinitions().map((d) => [d.id, d.label]),\n);\n\nconst TERMINAL_PAYMENT_STATES = new Set<PaymentState>(\n basePaymentDefinitions().filter((d) => d.isTerminal).map((d) => d.id),\n);\n\nconst DISPLAY_LABEL_OVERRIDES: Record<string, string> = {\n 'unpaid|draft': 'In Cart',\n 'unpaid|pending': 'Pending Payment',\n 'unpaid|on_hold': 'On Hold',\n 'unpaid|cancelled': 'Cancelled',\n 'partially_paid|pending': 'Deposit Received',\n 'partially_paid|on_hold': 'On Hold - Deposit Received',\n 'paid|pending': 'Paid - Awaiting Fulfillment',\n 'paid|on_hold': 'Paid - On Hold',\n 'paid|fulfilled': 'Completed',\n 'partially_refunded|fulfilled': 'Partially Refunded',\n 'partially_refunded|partially_returned': 'Partially Returned',\n 'refunded|fulfilled': 'Refunded',\n 'refunded|returned': 'Returned and Refunded',\n 'voided|cancelled': 'Cancelled',\n};\n\nfunction buildDefaultDisplayStateMap(): DisplayStateRule[] {\n const rules: DisplayStateRule[] = [];\n for (const p of PAYMENT_STATES) {\n for (const f of FULFILLMENT_STATES) {\n const key = `${p}|${f}`;\n const override = DISPLAY_LABEL_OVERRIDES[key];\n\n // Terminal payment states only emit entries with explicit overrides to avoid\n // impossible or duplicate combinations (e.g. refunded|draft, voided|pending).\n if (TERMINAL_PAYMENT_STATES.has(p) && !override) continue;\n\n const label = override ?? `${PAYMENT_LABELS.get(p)} / ${FULFILLMENT_LABELS.get(f)}`;\n rules.push({ paymentState: p, fulfillmentState: f, label });\n }\n }\n return rules;\n}\n\nexport const DEFAULT_DISPLAY_STATE_MAP: readonly DisplayStateRule[] =\n buildDefaultDisplayStateMap();\n\n/**\n * System default state configuration (fallback when no merchant config is synced).\n * Does NOT include paymentStates / fulfillmentStates — those live in STATE_SCHEMA.\n */\nexport const DEFAULT_CONFIG: StoredStateConfig = {\n _id: 'default',\n companyId: 'system',\n version: 1,\n name: 'Default',\n isDefault: true,\n paymentPaths: [],\n fulfillmentPaths: [],\n paymentPathMode: 'permissive',\n fulfillmentPathMode: 'permissive',\n crossAxisRules: [],\n transitionConditions: [],\n validInitialStates: [{ payment: 'unpaid', fulfillment: 'draft' }],\n displayStateMap: [...DEFAULT_DISPLAY_STATE_MAP],\n createdAt: DEFAULT_EPOCH,\n updatedAt: DEFAULT_EPOCH,\n};\n\n/** Merges a StoredStateConfig with STATE_SCHEMA into a full StateConfig. */\nexport function buildResolvedConfig(config: StoredStateConfig): StateConfig {\n return {\n ...config,\n paymentStates: STATE_SCHEMA.paymentStates,\n fulfillmentStates: STATE_SCHEMA.fulfillmentStates,\n };\n}\n\n/** Pre-built default StateConfig for engine fallbacks and tests. */\nexport const DEFAULT_RESOLVED_CONFIG: StateConfig =\n buildResolvedConfig(DEFAULT_CONFIG);\n","import { DEFAULT_CONFIG, DEFAULT_DISPLAY_STATE_MAP } from './default-config';\nimport type { StoredStateConfig } from './interfaces';\nimport type { StatePair } from './types';\n\n/**\n * POS-specific initial state pairs. Used the first time an order is written\n * to the DB (park, first payment, split payment first leg, gift-card quick\n * sale). A `canTransition` with `from: null` is only allowed when `to` matches\n * one of these pairs.\n *\n * - `partially_paid + draft` covers the first leg of a split payment on a\n * brand-new cart — the order has no persisted `pending` state yet, so\n * `deriveTargetState(\"pay\")` lands on `partially_paid + draft` until a\n * later leg completes the order and flips it to `paid + fulfilled`.\n */\nexport const POS_VALID_INITIAL_STATES: readonly StatePair[] = [\n { payment: 'unpaid', fulfillment: 'draft' },\n { payment: 'unpaid', fulfillment: 'on_hold' },\n { payment: 'unpaid', fulfillment: 'pending' },\n { payment: 'paid', fulfillment: 'fulfilled' },\n { payment: 'partially_paid', fulfillment: 'draft' },\n { payment: 'partially_paid', fulfillment: 'pending' },\n] as const;\n\n/**\n * Build a POS preset `StoredStateConfig`. This is the baseline config POS\n * clients (Render, Hub-API fallback, tests) use when no merchant-specific\n * config has been synced.\n */\nexport function buildPosPresetConfig(companyId?: string): StoredStateConfig {\n return {\n ...DEFAULT_CONFIG,\n _id: 'pos-preset',\n companyId: companyId ?? DEFAULT_CONFIG.companyId,\n name: 'POS Preset',\n crossAxisRules: [],\n validInitialStates: [...POS_VALID_INITIAL_STATES],\n displayStateMap: [...DEFAULT_DISPLAY_STATE_MAP],\n };\n}\n","import type { OrderContext, OrderLikeForContext, SplitPayment } from './interfaces';\n\nfunction sumNumbers(items: { amount?: number }[] | undefined): number {\n if (!items?.length) return 0;\n let t = 0;\n for (const x of items) {\n const n = x.amount;\n if (typeof n === 'number' && Number.isFinite(n)) t += n;\n }\n return t;\n}\n\nfunction sumRefundQuantities(\n refunds: { quantity?: number }[] | undefined\n): number {\n if (!refunds?.length) return 0;\n let t = 0;\n for (const r of refunds) {\n const q = r.quantity;\n if (typeof q === 'number' && Number.isFinite(q) && q > 0) t += q;\n }\n return t;\n}\n\n/**\n * Builds `OrderContext` for condition evaluation and transition checks.\n */\nexport function buildOrderContext(\n order: OrderLikeForContext | null | undefined,\n extras?: { splitPayment?: SplitPayment }\n): OrderContext {\n const o = order ?? {};\n const total = typeof o.total === 'number' && Number.isFinite(o.total) ? o.total : 0;\n const balance =\n typeof o.balance === 'number' && Number.isFinite(o.balance) ? o.balance : 0;\n const paymentMethods = o.paymentMethods ?? [];\n const refunds = o.refunds ?? o.refund ?? [];\n const lineItems = o.lineItems ?? [];\n\n const totalPaid = sumNumbers(paymentMethods);\n const totalRefunded = sumRefundQuantities(refunds);\n const isFullyPaid = total > 0 ? balance <= 0 : totalPaid > 0 && balance <= 0;\n const hasPartialPayments = totalPaid > 0 && balance > 0;\n\n let itemCount = 0;\n let fulfilledItemCount = 0;\n let returnedItemCount = 0;\n for (const li of lineItems) {\n const q =\n typeof li.quantity === 'number' && Number.isFinite(li.quantity)\n ? Math.max(0, li.quantity)\n : 0;\n itemCount += q;\n const fq =\n typeof li.fulfilledQuantity === 'number' &&\n Number.isFinite(li.fulfilledQuantity)\n ? Math.max(0, li.fulfilledQuantity)\n : 0;\n fulfilledItemCount += Math.min(fq, q);\n const rq =\n typeof li.returnedQuantity === 'number' &&\n Number.isFinite(li.returnedQuantity)\n ? Math.max(0, li.returnedQuantity)\n : 0;\n returnedItemCount += Math.min(rq, q);\n }\n\n const isFullyReturned =\n itemCount > 0 ? returnedItemCount >= itemCount : returnedItemCount > 0;\n const hasPartialReturns = returnedItemCount > 0 && !isFullyReturned;\n\n return {\n order: {\n total,\n balance,\n paymentMethods,\n refunds,\n lineItems,\n },\n computed: {\n balance,\n isFullyPaid,\n hasPartialPayments,\n totalPaid,\n totalRefunded,\n itemCount,\n fulfilledItemCount,\n returnedItemCount,\n isFullyReturned,\n hasPartialReturns,\n },\n splitPayment: extras?.splitPayment,\n };\n}\n","import type { DisplayStateResult, DisplayStateRule, StoredStateConfig } from './interfaces';\nfunction matchesOptional<T extends string>(\n actual: T,\n rule?: T | T[]\n): boolean {\n if (rule === undefined) return true;\n return Array.isArray(rule) ? rule.includes(actual) : rule === actual;\n}\n\n/**\n * Resolves the first matching rule in `config.displayStateMap` (ordered list).\n */\nexport function deriveDisplayState(\n payment: string,\n fulfillment: string,\n config: StoredStateConfig\n): DisplayStateResult {\n for (const rule of config.displayStateMap) {\n if (\n matchesOptional(payment, rule.paymentState) &&\n matchesOptional(fulfillment, rule.fulfillmentState)\n ) {\n return { label: rule.label, color: rule.color, icon: rule.icon };\n }\n }\n return { label: `${payment} / ${fulfillment}` };\n}\n\n/** @internal */\nexport function displayRuleMatchesPair(\n rule: DisplayStateRule,\n payment: string,\n fulfillment: string\n): boolean {\n return (\n matchesOptional(payment, rule.paymentState) &&\n matchesOptional(fulfillment, rule.fulfillmentState)\n );\n}\n","import type {\n Condition,\n FailedCondition,\n OrderContext,\n TransitionConditionSet,\n} from './interfaces';\n\nfunction getByPath(root: unknown, path: string): unknown {\n const parts = path.split('.').filter(Boolean);\n let cur: unknown = root;\n for (const p of parts) {\n if (cur === null || cur === undefined) return undefined;\n if (typeof cur !== 'object') return undefined;\n cur = (cur as Record<string, unknown>)[p];\n }\n return cur;\n}\n\nfunction isEmptyValue(v: unknown): boolean {\n if (v === null || v === undefined) return true;\n if (typeof v === 'string') return v.length === 0;\n if (Array.isArray(v)) return v.length === 0;\n return false;\n}\n\n/**\n * Evaluates a single condition against `OrderContext` (field paths like `order.balance`, `computed.isFullyPaid`).\n */\nexport function evaluateCondition(\n condition: Condition,\n context: OrderContext\n): { ok: boolean; failed?: FailedCondition } {\n const left = getByPath(context, condition.field);\n const op = condition.operator;\n const right = condition.value;\n\n let ok = false;\n switch (op) {\n case 'eq':\n ok = left === right;\n break;\n case 'neq':\n ok = left !== right;\n break;\n case 'gt':\n ok =\n typeof left === 'number' &&\n typeof right === 'number' &&\n left > right;\n break;\n case 'gte':\n ok =\n typeof left === 'number' &&\n typeof right === 'number' &&\n left >= right;\n break;\n case 'lt':\n ok =\n typeof left === 'number' &&\n typeof right === 'number' &&\n left < right;\n break;\n case 'lte':\n ok =\n typeof left === 'number' &&\n typeof right === 'number' &&\n left <= right;\n break;\n case 'in':\n ok = Array.isArray(right) && right.some((r) => r === left);\n break;\n case 'notIn':\n ok = Array.isArray(right) && !right.some((r) => r === left);\n break;\n case 'isEmpty':\n ok = isEmptyValue(left);\n break;\n case 'isNotEmpty':\n ok = !isEmptyValue(left);\n break;\n default: {\n const _exhaustive: never = op;\n return {\n ok: false,\n failed: {\n field: condition.field,\n operator: condition.operator,\n value: condition.value,\n reason: `Unknown operator: ${_exhaustive as string}`,\n },\n };\n }\n }\n\n if (!ok) {\n return {\n ok: false,\n failed: {\n field: condition.field,\n operator: condition.operator,\n value: condition.value,\n },\n };\n }\n return { ok: true };\n}\n\nfunction groupPasses(\n group: { conditions: Condition[] },\n context: OrderContext\n): { ok: boolean; failed: FailedCondition[] } {\n const failed: FailedCondition[] = [];\n for (const c of group.conditions) {\n const r = evaluateCondition(c, context);\n if (!r.ok && r.failed) failed.push(r.failed);\n }\n return { ok: failed.length === 0, failed };\n}\n\n/** OR of AND groups — true if any group passes. */\nexport function evaluateConditionSet(\n set: TransitionConditionSet | undefined,\n context: OrderContext\n): { ok: boolean; failedConditions: FailedCondition[] } {\n if (!set || set.groups.length === 0) {\n return { ok: true, failedConditions: [] };\n }\n const allFailed: FailedCondition[] = [];\n for (const g of set.groups) {\n const { ok, failed } = groupPasses(g, context);\n if (ok) return { ok: true, failedConditions: [] };\n allFailed.push(...failed);\n }\n return { ok: false, failedConditions: allFailed };\n}\n\nexport function conditionSummary(c: Condition): string {\n return `${c.field} ${c.operator} ${JSON.stringify(c.value)}`;\n}\n","import {\n conditionSummary,\n evaluateCondition,\n evaluateConditionSet,\n} from './condition-eval';\nimport { deriveDisplayState } from './display-state';\nimport { getFinancialInvariantViolations } from './financial-invariants';\nimport type {\n AvailableTransition,\n CrossAxisRule,\n FailedCondition,\n OrderContext,\n StateConfig,\n StoredStateConfig,\n TransitionRequest,\n TransitionResult,\n} from './interfaces';\nimport type { FulfillmentState, PaymentState, StatePair } from './types';\n\nexport type { TransitionRequest } from './interfaces';\n\nfunction pairInInitialList(to: StatePair, config: StoredStateConfig): boolean {\n return config.validInitialStates.some(\n (p) => p.payment === to.payment && p.fulfillment === to.fulfillment\n );\n}\n\nfunction triggerTargets(rule: CrossAxisRule): string[] {\n const t = rule.trigger.to;\n return Array.isArray(t) ? [...t] : [t];\n}\n\n/**\n * True when this rule applies to the edge `from` → `to` (trigger axis moved onto `trigger.to`).\n */\nexport function crossAxisRuleApplies(\n rule: CrossAxisRule,\n from: StatePair | null,\n to: StatePair\n): boolean {\n if (!rule.enabled) return false;\n const targets = triggerTargets(rule);\n if (rule.trigger.axis === 'fulfillment') {\n if (!targets.includes(to.fulfillment)) return false;\n if (from !== null && from.fulfillment === to.fulfillment) return false;\n return true;\n }\n if (!targets.includes(to.payment)) return false;\n if (from !== null && from.payment === to.payment) return false;\n return true;\n}\n\nfunction crossAxisSatisfied(rule: CrossAxisRule, to: StatePair): boolean {\n const req = rule.requires;\n if (req.axis === 'payment') {\n return req.states.includes(to.payment);\n }\n return req.states.includes(to.fulfillment);\n}\n\nfunction firstBlockingCrossAxisRule(\n from: StatePair | null,\n to: StatePair,\n config: StoredStateConfig\n): CrossAxisRule | undefined {\n for (const rule of config.crossAxisRules) {\n if (!crossAxisRuleApplies(rule, from, to)) continue;\n if (!crossAxisSatisfied(rule, to)) return rule;\n }\n return undefined;\n}\n\nfunction findConditionSet(config: StoredStateConfig, id: string | undefined) {\n if (!id) return undefined;\n return config.transitionConditions.find((s) => s.id === id);\n}\n\nfunction pathExists(\n paths: { from: string; to: string; conditionSetId?: string }[],\n fromId: string,\n toId: string\n): boolean {\n return paths.some((p) => p.from === fromId && p.to === toId);\n}\n\nfunction axisTransitionAllowed(\n mode: 'strict' | 'permissive',\n paths: { from: string; to: string; conditionSetId?: string }[],\n fromId: string,\n toId: string\n): boolean {\n if (fromId === toId) return true;\n if (mode === 'permissive') return true;\n return pathExists(paths, fromId, toId);\n}\n\nfunction collectPathConditionFailures(\n config: StoredStateConfig,\n from: StatePair | null,\n to: StatePair,\n context: OrderContext\n): { failed: FailedCondition[] } {\n const failed: FailedCondition[] = [];\n if (from === null) return { failed };\n\n if (from.payment !== to.payment) {\n const p = config.paymentPaths.find(\n (x) => x.from === from.payment && x.to === to.payment\n );\n const set = findConditionSet(config, p?.conditionSetId);\n const ev = evaluateConditionSet(set, context);\n if (!ev.ok) failed.push(...ev.failedConditions);\n }\n\n if (from.fulfillment !== to.fulfillment) {\n const p = config.fulfillmentPaths.find(\n (x) => x.from === from.fulfillment && x.to === to.fulfillment\n );\n const set = findConditionSet(config, p?.conditionSetId);\n const ev = evaluateConditionSet(set, context);\n if (!ev.ok) failed.push(...ev.failedConditions);\n }\n\n return { failed };\n}\n\nfunction pathBlocked(\n config: StoredStateConfig,\n from: StatePair | null,\n to: StatePair\n): boolean {\n if (from === null) return false;\n if (\n from.payment !== to.payment &&\n !axisTransitionAllowed(\n config.paymentPathMode,\n config.paymentPaths,\n from.payment,\n to.payment\n )\n ) {\n return true;\n }\n if (\n from.fulfillment !== to.fulfillment &&\n !axisTransitionAllowed(\n config.fulfillmentPathMode,\n config.fulfillmentPaths,\n from.fulfillment,\n to.fulfillment\n )\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * Three-layer evaluation: financial invariants → cross-axis rules → paths → conditions.\n * Order creation (`from === null`): validInitialStates + guards; paths/conditions skipped.\n */\nexport function canTransition(request: TransitionRequest): TransitionResult {\n const { from, to, config, context } = request;\n\n const fin = getFinancialInvariantViolations(from, to);\n if (fin.length > 0) {\n return {\n allowed: false,\n blockedBy: 'financial_invariant',\n guard: fin[0],\n reason: `Blocked by financial invariant: ${fin[0]}`,\n };\n }\n\n const cross = firstBlockingCrossAxisRule(from, to, config);\n if (cross) {\n return {\n allowed: false,\n blockedBy: 'cross_axis_rule',\n guard: cross.id,\n reason: `Blocked by cross-axis rule: ${cross.label}`,\n };\n }\n\n if (from === null) {\n if (!pairInInitialList(to, config)) {\n return {\n allowed: false,\n blockedBy: 'path',\n reason: 'Target state is not a valid initial state for new orders',\n };\n }\n } else if (pathBlocked(config, from, to)) {\n return {\n allowed: false,\n blockedBy: 'path',\n reason: 'Transition is not allowed by configured path rules',\n };\n }\n\n if (!request.skipConditionEvaluation) {\n const cond = collectPathConditionFailures(config, from, to, context);\n if (cond.failed.length > 0) {\n return {\n allowed: false,\n blockedBy: 'condition',\n reason: 'Transition conditions not satisfied',\n failedConditions: cond.failed,\n };\n }\n }\n\n return { allowed: true };\n}\n\nfunction labelForPayment(id: PaymentState, config: StateConfig): string {\n return config.paymentStates.find((s) => s.id === id)?.label ?? id;\n}\n\nfunction labelForFulfillment(id: FulfillmentState, config: StateConfig): string {\n return config.fulfillmentStates.find((s) => s.id === id)?.label ?? id;\n}\n\nfunction transitionDisplayLabel(to: StatePair, config: StateConfig): string {\n const pay = labelForPayment(to.payment, config);\n const ful = labelForFulfillment(to.fulfillment, config);\n const derived = deriveDisplayState(to.payment, to.fulfillment, config).label;\n if (derived && derived !== `${to.payment} / ${to.fulfillment}`) {\n return derived;\n }\n return `${pay} · ${ful}`;\n}\n\nfunction conditionMetLines(\n config: StateConfig,\n from: StatePair,\n to: StatePair,\n context: OrderContext\n): { met: boolean; description: string }[] {\n const lines: { met: boolean; description: string }[] = [];\n\n const appendForPath = (\n p:\n | { conditionSetId?: string }\n | undefined\n ) => {\n const set = findConditionSet(config, p?.conditionSetId);\n if (!set) return;\n for (const g of set.groups) {\n for (const c of g.conditions) {\n const r = evaluateCondition(c, context);\n lines.push({\n met: r.ok,\n description: conditionSummary(c),\n });\n }\n }\n };\n\n if (from.payment !== to.payment) {\n const p = config.paymentPaths.find(\n (x) => x.from === from.payment && x.to === to.payment\n );\n appendForPath(p);\n }\n if (from.fulfillment !== to.fulfillment) {\n const p = config.fulfillmentPaths.find(\n (x) => x.from === from.fulfillment && x.to === to.fulfillment\n );\n appendForPath(p);\n }\n\n return lines;\n}\n\n/**\n * All target pairs reachable in one step from `current` that pass `canTransition`.\n */\nexport function getAvailableTransitions(\n current: StatePair,\n config: StateConfig,\n context: OrderContext\n): AvailableTransition[] {\n const candidates: StatePair[] = [];\n\n for (const s of config.paymentStates) {\n if (s.id === current.payment) continue;\n candidates.push({ payment: s.id, fulfillment: current.fulfillment });\n }\n for (const s of config.fulfillmentStates) {\n if (s.id === current.fulfillment) continue;\n candidates.push({ payment: current.payment, fulfillment: s.id });\n }\n\n const out: AvailableTransition[] = [];\n const seen = new Set<string>();\n\n for (const to of candidates) {\n const key = `${to.payment}:${to.fulfillment}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const result = canTransition({\n from: current,\n to,\n config,\n context,\n });\n if (!result.allowed) continue;\n\n out.push({\n to,\n displayLabel: transitionDisplayLabel(to, config),\n conditions: conditionMetLines(config, current, to, context),\n });\n }\n\n return out;\n}\n","import { buildOrderContext } from './build-order-context';\nimport { displayRuleMatchesPair } from './display-state';\nimport { canTransition } from './engine';\nimport { getFinancialInvariantViolations } from './financial-invariants';\nimport type {\n ConfigValidationError,\n ConfigValidationResult,\n ConfigValidationWarning,\n Condition,\n StateConfig,\n} from './interfaces';\nimport type { StatePair } from './types';\nimport { CONDITION_OPERATORS, FULFILLMENT_STATES, PAYMENT_STATES } from './types';\n\nfunction paymentStateIds(config: StateConfig): Set<string> {\n return new Set<string>(config.paymentStates.map((s) => s.id));\n}\n\nfunction fulfillmentStateIds(config: StateConfig): Set<string> {\n return new Set<string>(config.fulfillmentStates.map((s) => s.id));\n}\n\nconst VALID_OPERATORS = new Set<string>(CONDITION_OPERATORS);\n\nfunction validateConditionShape(\n c: Condition,\n path: string,\n errors: ConfigValidationError[]\n): void {\n if (!VALID_OPERATORS.has(c.operator)) {\n errors.push({\n code: 'invalid_condition_operator',\n message: `Unknown operator \"${c.operator}\"`,\n path,\n });\n return;\n }\n const needsNumberCompare = ['gt', 'gte', 'lt', 'lte'].includes(c.operator);\n if (needsNumberCompare && typeof c.value !== 'number') {\n errors.push({\n code: 'invalid_condition_value_type',\n message: `Operator \"${c.operator}\" requires a numeric value`,\n path: `${path}.value`,\n });\n }\n if ((c.operator === 'in' || c.operator === 'notIn') && !Array.isArray(c.value)) {\n errors.push({\n code: 'invalid_condition_value_type',\n message: `Operator \"${c.operator}\" requires an array value`,\n path: `${path}.value`,\n });\n }\n}\n\n/** Generous context so reachability probes are not blocked by typical payment conditions. */\nfunction validationContext() {\n return buildOrderContext({\n total: 100,\n balance: 0,\n paymentMethods: [{ amount: 100 }],\n lineItems: [{ quantity: 1, fulfilledQuantity: 1, returnedQuantity: 0 }],\n });\n}\n\nfunction pairKey(p: StatePair): string {\n return `${p.payment}\\0${p.fulfillment}`;\n}\n\n/**\n * Structural + semantic validation for `StateConfig`.\n */\nexport function validateConfig(config: StateConfig): ConfigValidationResult {\n const errors: ConfigValidationError[] = [];\n const warnings: ConfigValidationWarning[] = [];\n\n if (!Number.isFinite(config.version) || config.version < 1) {\n errors.push({\n code: 'invalid_version',\n message: 'version must be a finite number >= 1',\n path: 'version',\n });\n }\n\n if (!config.validInitialStates?.length) {\n errors.push({\n code: 'missing_initial_states',\n message: 'validInitialStates must contain at least one pair',\n path: 'validInitialStates',\n });\n }\n\n const payIds = paymentStateIds(config);\n const fulIds = fulfillmentStateIds(config);\n\n config.validInitialStates?.forEach((pair, i) => {\n if (!payIds.has(pair.payment)) {\n errors.push({\n code: 'initial_unknown_payment',\n message: `validInitialStates[${i}].payment \"${pair.payment}\" is not defined`,\n path: `validInitialStates[${i}].payment`,\n });\n }\n if (!fulIds.has(pair.fulfillment)) {\n errors.push({\n code: 'initial_unknown_fulfillment',\n message: `validInitialStates[${i}].fulfillment \"${pair.fulfillment}\" is not defined`,\n path: `validInitialStates[${i}].fulfillment`,\n });\n }\n });\n\n const conditionSetIds = new Set(config.transitionConditions.map((s) => s.id));\n config.transitionConditions.forEach((set, si) => {\n set.groups.forEach((g, gi) => {\n g.conditions.forEach((c, ci) => {\n validateConditionShape(\n c,\n `transitionConditions[${si}].groups[${gi}].conditions[${ci}]`,\n errors\n );\n });\n });\n });\n\n const pathConditionRef = (\n paths: ReadonlyArray<{ from: string; to: string; conditionSetId?: string }>,\n axis: string\n ) => {\n paths.forEach((p, i) => {\n if (p.conditionSetId && !conditionSetIds.has(p.conditionSetId)) {\n errors.push({\n code: 'unknown_condition_set',\n message: `${axis}Paths[${i}] references unknown conditionSetId \"${p.conditionSetId}\"`,\n path: `${axis}Paths[${i}].conditionSetId`,\n });\n }\n });\n };\n pathConditionRef(config.paymentPaths, 'payment');\n pathConditionRef(config.fulfillmentPaths, 'fulfillment');\n\n config.paymentPaths.forEach((path, i) => {\n if (!payIds.has(path.from) || !payIds.has(path.to)) {\n errors.push({\n code: 'payment_path_unknown_state',\n message: `paymentPaths[${i}] references unknown payment state`,\n path: `paymentPaths[${i}]`,\n });\n return;\n }\n for (const f of config.fulfillmentStates) {\n const from: StatePair = { payment: path.from, fulfillment: f.id };\n const to: StatePair = { payment: path.to, fulfillment: f.id };\n if (getFinancialInvariantViolations(null, from).length > 0) continue;\n const v = getFinancialInvariantViolations(from, to);\n if (v.length > 0) {\n errors.push({\n code: 'payment_path_violates_financial_invariant',\n message: `paymentPaths[${i}] (${path.from}→${path.to}) with fulfillment \"${f.id}\" violates invariant(s): ${v.join(', ')}`,\n path: `paymentPaths[${i}]`,\n });\n }\n }\n });\n\n config.fulfillmentPaths.forEach((path, i) => {\n if (!fulIds.has(path.from) || !fulIds.has(path.to)) {\n errors.push({\n code: 'fulfillment_path_unknown_state',\n message: `fulfillmentPaths[${i}] references unknown fulfillment state`,\n path: `fulfillmentPaths[${i}]`,\n });\n return;\n }\n for (const p of config.paymentStates) {\n const from: StatePair = { payment: p.id, fulfillment: path.from };\n const to: StatePair = { payment: p.id, fulfillment: path.to };\n // Skip pairs that are not valid steady states (e.g. refunded+draft); path checks are for real edges.\n if (getFinancialInvariantViolations(null, from).length > 0) continue;\n const v = getFinancialInvariantViolations(from, to);\n if (v.length > 0) {\n errors.push({\n code: 'fulfillment_path_violates_financial_invariant',\n message: `fulfillmentPaths[${i}] (${path.from}→${path.to}) with payment \"${p.id}\" violates invariant(s): ${v.join(', ')}`,\n path: `fulfillmentPaths[${i}]`,\n });\n }\n }\n });\n\n config.crossAxisRules.forEach((rule, i) => {\n const req = rule.requires;\n if (req.axis === 'payment') {\n for (const id of req.states) {\n if (!payIds.has(id)) {\n errors.push({\n code: 'cross_axis_unknown_payment',\n message: `crossAxisRules[${i}] requires unknown payment state \"${id}\"`,\n path: `crossAxisRules[${i}].requires.states`,\n });\n }\n }\n } else {\n for (const id of req.states) {\n if (!fulIds.has(id)) {\n errors.push({\n code: 'cross_axis_unknown_fulfillment',\n message: `crossAxisRules[${i}] requires unknown fulfillment state \"${id}\"`,\n path: `crossAxisRules[${i}].requires.states`,\n });\n }\n }\n }\n\n const trig = rule.trigger;\n const targets = Array.isArray(trig.to) ? trig.to : [trig.to];\n if (trig.axis === 'payment') {\n for (const id of targets) {\n if (!payIds.has(id)) {\n errors.push({\n code: 'cross_axis_trigger_unknown_payment',\n message: `crossAxisRules[${i}] triggers on unknown payment state \"${id}\"`,\n path: `crossAxisRules[${i}].trigger.to`,\n });\n }\n }\n } else {\n for (const id of targets) {\n if (!fulIds.has(id)) {\n errors.push({\n code: 'cross_axis_trigger_unknown_fulfillment',\n message: `crossAxisRules[${i}] triggers on unknown fulfillment state \"${id}\"`,\n path: `crossAxisRules[${i}].trigger.to`,\n });\n }\n }\n }\n });\n\n strictAxisReachability(config, 'payment', payIds, warnings);\n strictAxisReachability(config, 'fulfillment', fulIds, warnings);\n\n combinedReachability(config, warnings);\n\n if (!config.displayStateMap.length) {\n warnings.push({\n code: 'empty_display_map',\n message: 'displayStateMap is empty; UI will fall back to raw state pair labels',\n path: 'displayStateMap',\n });\n } else {\n const missingDisplay: string[] = [];\n for (const p of PAYMENT_STATES) {\n for (const f of FULFILLMENT_STATES) {\n if (!payIds.has(p) || !fulIds.has(f)) continue;\n const matched = config.displayStateMap.some((rule) =>\n displayRuleMatchesPair(rule, p, f)\n );\n if (!matched) missingDisplay.push(`${p}/${f}`);\n }\n }\n if (missingDisplay.length > 0) {\n const sample = missingDisplay.slice(0, 8).join(', ');\n const more =\n missingDisplay.length > 8\n ? ` (+${missingDisplay.length - 8} more)`\n : '';\n warnings.push({\n code: 'display_map_missing_combos',\n message: `No displayStateMap rule matches ${missingDisplay.length} base pair(s): ${sample}${more}`,\n path: 'displayStateMap',\n });\n }\n }\n\n refundReturnPathWarnings(config, payIds, fulIds, warnings);\n\n if (config.paymentPathMode === 'strict' && config.paymentPaths.length === 0) {\n errors.push({\n code: 'strict_payment_paths_empty',\n message: 'paymentPathMode is strict but paymentPaths is empty',\n path: 'paymentPaths',\n });\n }\n if (config.fulfillmentPathMode === 'strict' && config.fulfillmentPaths.length === 0) {\n errors.push({\n code: 'strict_fulfillment_paths_empty',\n message: 'fulfillmentPathMode is strict but fulfillmentPaths is empty',\n path: 'fulfillmentPaths',\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nfunction strictAxisReachability(\n config: StateConfig,\n axis: 'payment' | 'fulfillment',\n ids: Set<string>,\n warnings: ConfigValidationWarning[]\n): void {\n const mode = axis === 'payment' ? config.paymentPathMode : config.fulfillmentPathMode;\n const paths = axis === 'payment' ? config.paymentPaths : config.fulfillmentPaths;\n if (mode !== 'strict' || paths.length === 0) return;\n\n const reachable = new Set<string>();\n const initials = new Set(\n config.validInitialStates.map((p) => (axis === 'payment' ? p.payment : p.fulfillment))\n );\n for (const id of initials) {\n if (ids.has(id)) bfsAxis(id, paths, reachable);\n }\n\n const stateRows =\n axis === 'payment' ? config.paymentStates : config.fulfillmentStates;\n for (const id of stateRows) {\n if (!reachable.has(id.id)) {\n warnings.push({\n code: `${axis}_state_unreachable_strict`,\n message: `State \"${id.id}\" may be unreachable from valid initial ${axis} states under strict paths`,\n path: axis === 'payment' ? 'paymentPaths' : 'fulfillmentPaths',\n });\n }\n if (!id.isTerminal) {\n const hasOut = paths.some((p) => p.from === id.id && p.to !== id.id);\n if (!hasOut) {\n warnings.push({\n code: `${axis}_nonterminal_no_outbound`,\n message: `Non-terminal ${axis} state \"${id.id}\" has no strict outbound path`,\n path: axis === 'payment' ? 'paymentPaths' : 'fulfillmentPaths',\n });\n }\n }\n }\n}\n\nfunction bfsAxis(\n start: string,\n paths: { from: string; to: string }[],\n reachable: Set<string>\n): void {\n const q = [start];\n reachable.add(start);\n while (q.length) {\n const cur = q.pop()!;\n for (const p of paths) {\n if (p.from !== cur) continue;\n if (!reachable.has(p.to)) {\n reachable.add(p.to);\n q.push(p.to);\n }\n }\n }\n}\n\nfunction combinedReachability(\n config: StateConfig,\n warnings: ConfigValidationWarning[]\n): void {\n const ctx = validationContext();\n const payIds = config.paymentStates.map((s) => s.id);\n const fulIds = config.fulfillmentStates.map((s) => s.id);\n const seen = new Set<string>();\n const queue: StatePair[] = [...config.validInitialStates];\n for (const p of queue) {\n seen.add(pairKey(p));\n }\n while (queue.length) {\n const cur = queue.pop()!;\n for (const np of payIds) {\n if (np === cur.payment) continue;\n const to = { payment: np, fulfillment: cur.fulfillment };\n const r = canTransition({\n from: cur,\n to,\n config,\n context: ctx,\n skipConditionEvaluation: true,\n });\n const k = pairKey(to);\n if (r.allowed && !seen.has(k)) {\n seen.add(k);\n queue.push(to);\n }\n }\n for (const nf of fulIds) {\n if (nf === cur.fulfillment) continue;\n const to = { payment: cur.payment, fulfillment: nf };\n const r = canTransition({\n from: cur,\n to,\n config,\n context: ctx,\n skipConditionEvaluation: true,\n });\n const k = pairKey(to);\n if (r.allowed && !seen.has(k)) {\n seen.add(k);\n queue.push(to);\n }\n }\n }\n\n const total = payIds.length * fulIds.length;\n if (\n seen.size < total &&\n (config.paymentPathMode === 'strict' || config.fulfillmentPathMode === 'strict')\n ) {\n warnings.push({\n code: 'combined_pairs_not_all_reachable',\n message:\n 'Some payment×fulfillment pairs appear unreachable under current paths, cross-axis rules, and financial invariants (structural check with generic context)',\n path: 'validInitialStates',\n });\n }\n}\n\nfunction refundReturnPathWarnings(\n config: StateConfig,\n payIds: Set<string>,\n fulIds: Set<string>,\n warnings: ConfigValidationWarning[]\n): void {\n const hasReturned = config.fulfillmentPaths.some(\n (p) => p.to === 'returned' || p.from === 'returned'\n );\n const hasRefunded = config.paymentPaths.some(\n (p) => p.to === 'refunded' || p.from === 'refunded'\n );\n if (\n fulIds.has('returned') &&\n hasReturned &&\n payIds.has('refunded') &&\n !hasRefunded &&\n config.paymentPathMode === 'strict'\n ) {\n warnings.push({\n code: 'refund_path_missing_for_return',\n message:\n 'Fulfillment paths mention \"returned\" but no strict payment path touches \"refunded\"; verify refund workflow',\n path: 'paymentPaths',\n });\n }\n}\n","import { deriveDisplayState } from './display-state';\nimport type { OrderStateWritable, StoredStateConfig } from './interfaces';\nimport type { FulfillmentState, PaymentState, StatePair } from './types';\n\n/**\n * Maps atoms to legacy `status` for dual-write across the full POS vocabulary:\n * 'in-cart' | 'parked' | 'completed' | 'refunded' | 'partial-refund' | 'park-deleted'.\n *\n * Evaluation order matters: refund and void outcomes are terminal and take precedence\n * over fulfillment, so a `voided` order always maps to `park-deleted` regardless of\n * how the fulfillment axis landed (cancelled, returned, etc.). Same for refund terminals.\n */\nexport function mapToLegacyStatus(pair: StatePair): string {\n const { payment, fulfillment } = pair;\n\n // Terminal void — hard-deleted parked order or voided payment.\n if (payment === 'voided') return 'park-deleted';\n\n // Refund outcomes.\n if (payment === 'refunded') return 'refunded';\n if (payment === 'partially_refunded') return 'partial-refund';\n\n // Fully-paid orders. POS auto-fulfills on payment, so fulfilled/in_progress/pending\n // all collapse to 'completed' for the legacy status consumers (web, analytics, etc.).\n if (payment === 'paid') return 'completed';\n\n // Unpaid / partially-paid orders.\n if (fulfillment === 'draft') return 'in-cart';\n if (fulfillment === 'on_hold') return 'parked';\n if (fulfillment === 'pending') return 'parked';\n if (fulfillment === 'cancelled') return 'park-deleted';\n\n return 'parked';\n}\n\n/**\n * Writes payment/fulfillment atoms, derived display label, and legacy `status` in one place.\n */\nexport function setOrderState(\n order: OrderStateWritable,\n paymentState: PaymentState,\n fulfillmentState: FulfillmentState,\n config: StoredStateConfig,\n options?: { includeLegacyStatus?: boolean },\n): void {\n order.paymentState = paymentState;\n order.fulfillmentState = fulfillmentState;\n const display = deriveDisplayState(paymentState, fulfillmentState, config);\n order.displayState = display.label;\n if (options?.includeLegacyStatus !== false) {\n order.status = mapToLegacyStatus({ payment: paymentState, fulfillment: fulfillmentState });\n }\n}\n","import type { OrderLikeForLegacyInference } from './interfaces';\nimport type { StatePair } from './types';\n\nfunction normalizeStatus(raw: string | undefined): string {\n return (raw ?? '').trim().toLowerCase();\n}\n\nfunction hasRefundActivity(order: OrderLikeForLegacyInference): boolean {\n const refunds = order.refunds ?? order.refund ?? [];\n return refunds.some((r) => {\n const q = r.quantity;\n return typeof q === 'number' && q > 0;\n });\n}\n\n/**\n * Deterministic mapping from legacy `order.status` (and payment/refund hints) to state atoms.\n * See plan §2.5 — conservative refund rows assume return tracking on fulfillment.\n */\nexport function inferStatesFromLegacyStatus(\n order: OrderLikeForLegacyInference\n): StatePair {\n const status = normalizeStatus(order.status);\n\n if (status === 'completed') {\n return { payment: 'paid', fulfillment: 'fulfilled' };\n }\n\n if (status === 'in-cart') {\n return { payment: 'unpaid', fulfillment: 'draft' };\n }\n\n if (status === 'park-deleted') {\n return { payment: 'voided', fulfillment: 'cancelled' };\n }\n\n if (status === 'refunded') {\n return { payment: 'refunded', fulfillment: 'returned' };\n }\n\n if (status === 'partial-refund' || status === 'partial_refund') {\n return { payment: 'partially_refunded', fulfillment: 'partially_returned' };\n }\n\n if (status === 'parked') {\n const ctx = order.paymentMethods ?? [];\n const paid = ctx.reduce((s, m) => {\n const a = m.amount;\n return s + (typeof a === 'number' && Number.isFinite(a) ? a : 0);\n }, 0);\n const partial =\n paid > 0 ||\n (typeof order.balance === 'number' &&\n typeof order.total === 'number' &&\n order.total > 0 &&\n order.balance > 0 &&\n order.balance < order.total);\n return {\n payment: partial ? 'partially_paid' : 'unpaid',\n fulfillment: 'on_hold',\n };\n }\n\n if (status === '' && hasRefundActivity(order)) {\n return { payment: 'partially_refunded', fulfillment: 'partially_returned' };\n }\n\n return { payment: 'unpaid', fulfillment: 'pending' };\n}\n","import type { FragmentParam, StateConfigFragment } from './interfaces';\n\nexport interface ResolveTemplateResult {\n fragment: StateConfigFragment;\n resolvedValues: Record<string, unknown>;\n}\n\n/**\n * Resolves a parameterized fragment template into a concrete StateConfigFragment.\n *\n * 1. Merges supplied `values` with param defaults (supplied wins).\n * 2. Validates each resolved value against its param definition.\n * 3. Substitutes `{{key}}` placeholders in the raw template string.\n * 4. Parses the result as JSON into a StateConfigFragment.\n */\nexport function resolveTemplate(\n templateJson: string,\n params: FragmentParam[],\n values: Record<string, unknown> = {},\n): ResolveTemplateResult {\n const resolvedValues: Record<string, unknown> = {};\n\n for (const param of params) {\n const raw = values[param.key] ?? param.default;\n if (raw === undefined || raw === null) {\n throw new Error(`Missing required parameter: \"${param.key}\" (${param.label})`);\n }\n\n validateParamValue(param, raw);\n resolvedValues[param.key] = raw;\n }\n\n let resolved = templateJson;\n for (const [key, value] of Object.entries(resolvedValues)) {\n const placeholder = `{{${key}}}`;\n const replacement =\n typeof value === 'string' ? escapeJsonString(value) : String(value);\n resolved = replaceAll(resolved, placeholder, replacement);\n }\n\n let fragment: StateConfigFragment;\n try {\n fragment = JSON.parse(resolved);\n } catch (err) {\n throw new Error(\n `Fragment template produced invalid JSON after substitution: ${(err as Error).message}`,\n );\n }\n\n return { fragment, resolvedValues };\n}\n\nfunction validateParamValue(param: FragmentParam, value: unknown): void {\n const { key, label, type } = param;\n\n if (type === 'string' && typeof value !== 'string') {\n throw new Error(`Parameter \"${key}\" (${label}) must be a string, got ${typeof value}`);\n }\n if (type === 'number') {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n throw new Error(`Parameter \"${key}\" (${label}) must be a number`);\n }\n if (param.min !== undefined && value < param.min) {\n throw new Error(`Parameter \"${key}\" (${label}) must be >= ${param.min}`);\n }\n if (param.max !== undefined && value > param.max) {\n throw new Error(`Parameter \"${key}\" (${label}) must be <= ${param.max}`);\n }\n }\n if (type === 'boolean' && typeof value !== 'boolean') {\n throw new Error(`Parameter \"${key}\" (${label}) must be a boolean`);\n }\n if (param.options && param.options.length > 0 && !param.options.includes(String(value))) {\n throw new Error(\n `Parameter \"${key}\" (${label}) must be one of: ${param.options.join(', ')}`,\n );\n }\n}\n\n/** Escapes a string for safe embedding inside a JSON-quoted value. */\nfunction escapeJsonString(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t');\n}\n\nfunction replaceAll(str: string, search: string, replacement: string): string {\n let result = str;\n let idx = result.indexOf(search);\n while (idx !== -1) {\n result = result.slice(0, idx) + replacement + result.slice(idx + search.length);\n idx = result.indexOf(search, idx + replacement.length);\n }\n return result;\n}\n","import type {\n ConfigValidationError,\n StoredStateConfig,\n StateConfigFragment,\n} from './interfaces';\nimport { isFulfillmentState, isPaymentState } from './types';\n\nexport interface FragmentValidationResult {\n valid: boolean;\n errors: ConfigValidationError[];\n}\n\n/**\n * Validates a StateConfigFragment against an existing StateConfig.\n *\n * Checks:\n * 1. All state references are members of the closed PaymentState / FulfillmentState unions.\n * 2. No duplicate path edges (from, to) on the same axis.\n * 3. No duplicate condition set IDs.\n * 4. No duplicate cross-axis rule IDs.\n */\nexport function validateFragmentCompatibility(\n config: StoredStateConfig,\n fragment: StateConfigFragment,\n): FragmentValidationResult {\n const errors: ConfigValidationError[] = [];\n\n validateStateReferences(fragment, errors);\n validatePathUniqueness(config, fragment, errors);\n validateConditionSetUniqueness(config, fragment, errors);\n validateCrossAxisRuleUniqueness(config, fragment, errors);\n\n return { valid: errors.length === 0, errors };\n}\n\nfunction validateStateReferences(\n fragment: StateConfigFragment,\n errors: ConfigValidationError[],\n): void {\n for (const path of fragment.paymentPaths ?? []) {\n if (!isPaymentState(path.from)) {\n errors.push({\n code: 'invalid_payment_state',\n message: `Unknown payment state \"${path.from}\" in paymentPaths`,\n path: `paymentPaths[from=${path.from}]`,\n });\n }\n if (!isPaymentState(path.to)) {\n errors.push({\n code: 'invalid_payment_state',\n message: `Unknown payment state \"${path.to}\" in paymentPaths`,\n path: `paymentPaths[to=${path.to}]`,\n });\n }\n }\n\n for (const path of fragment.fulfillmentPaths ?? []) {\n if (!isFulfillmentState(path.from)) {\n errors.push({\n code: 'invalid_fulfillment_state',\n message: `Unknown fulfillment state \"${path.from}\" in fulfillmentPaths`,\n path: `fulfillmentPaths[from=${path.from}]`,\n });\n }\n if (!isFulfillmentState(path.to)) {\n errors.push({\n code: 'invalid_fulfillment_state',\n message: `Unknown fulfillment state \"${path.to}\" in fulfillmentPaths`,\n path: `fulfillmentPaths[to=${path.to}]`,\n });\n }\n }\n\n for (const rule of fragment.crossAxisRules ?? []) {\n const triggerStates = Array.isArray(rule.trigger.to) ? rule.trigger.to : [rule.trigger.to];\n const check = rule.trigger.axis === 'payment' ? isPaymentState : isFulfillmentState;\n for (const s of triggerStates) {\n if (!check(s)) {\n errors.push({\n code: `invalid_${rule.trigger.axis}_state`,\n message: `Unknown ${rule.trigger.axis} state \"${s}\" in crossAxisRule \"${rule.id}\" trigger`,\n path: `crossAxisRules[${rule.id}].trigger.to`,\n });\n }\n }\n const reqCheck = rule.requires.axis === 'payment' ? isPaymentState : isFulfillmentState;\n for (const s of rule.requires.states) {\n if (!reqCheck(s)) {\n errors.push({\n code: `invalid_${rule.requires.axis}_state`,\n message: `Unknown ${rule.requires.axis} state \"${s}\" in crossAxisRule \"${rule.id}\" requires`,\n path: `crossAxisRules[${rule.id}].requires.states`,\n });\n }\n }\n }\n\n for (const pair of fragment.validInitialStates ?? []) {\n if (!isPaymentState(pair.payment)) {\n errors.push({\n code: 'invalid_payment_state',\n message: `Unknown payment state \"${pair.payment}\" in validInitialStates`,\n path: 'validInitialStates',\n });\n }\n if (!isFulfillmentState(pair.fulfillment)) {\n errors.push({\n code: 'invalid_fulfillment_state',\n message: `Unknown fulfillment state \"${pair.fulfillment}\" in validInitialStates`,\n path: 'validInitialStates',\n });\n }\n }\n\n for (const rule of fragment.displayStateMap ?? []) {\n const pStates = rule.paymentState\n ? (Array.isArray(rule.paymentState) ? rule.paymentState : [rule.paymentState])\n : [];\n for (const s of pStates) {\n if (!isPaymentState(s)) {\n errors.push({\n code: 'invalid_payment_state',\n message: `Unknown payment state \"${s}\" in displayStateMap rule \"${rule.label}\"`,\n path: 'displayStateMap',\n });\n }\n }\n const fStates = rule.fulfillmentState\n ? (Array.isArray(rule.fulfillmentState) ? rule.fulfillmentState : [rule.fulfillmentState])\n : [];\n for (const s of fStates) {\n if (!isFulfillmentState(s)) {\n errors.push({\n code: 'invalid_fulfillment_state',\n message: `Unknown fulfillment state \"${s}\" in displayStateMap rule \"${rule.label}\"`,\n path: 'displayStateMap',\n });\n }\n }\n }\n}\n\nfunction validatePathUniqueness(\n config: StoredStateConfig,\n fragment: StateConfigFragment,\n errors: ConfigValidationError[],\n): void {\n const existingPaymentEdges = new Set(\n config.paymentPaths.map((p) => `${p.from}->${p.to}`),\n );\n for (const path of fragment.paymentPaths ?? []) {\n const edge = `${path.from}->${path.to}`;\n if (existingPaymentEdges.has(edge)) {\n errors.push({\n code: 'duplicate_payment_path',\n message: `Payment path ${path.from} → ${path.to} already exists in the config`,\n path: `paymentPaths[${edge}]`,\n });\n }\n }\n\n const existingFulfillmentEdges = new Set(\n config.fulfillmentPaths.map((p) => `${p.from}->${p.to}`),\n );\n for (const path of fragment.fulfillmentPaths ?? []) {\n const edge = `${path.from}->${path.to}`;\n if (existingFulfillmentEdges.has(edge)) {\n errors.push({\n code: 'duplicate_fulfillment_path',\n message: `Fulfillment path ${path.from} → ${path.to} already exists in the config`,\n path: `fulfillmentPaths[${edge}]`,\n });\n }\n }\n}\n\nfunction validateConditionSetUniqueness(\n config: StoredStateConfig,\n fragment: StateConfigFragment,\n errors: ConfigValidationError[],\n): void {\n const existingIds = new Set(config.transitionConditions.map((c) => c.id));\n for (const cond of fragment.transitionConditions ?? []) {\n if (existingIds.has(cond.id)) {\n errors.push({\n code: 'duplicate_condition_set_id',\n message: `Condition set ID \"${cond.id}\" already exists in the config`,\n path: `transitionConditions[${cond.id}]`,\n });\n }\n }\n}\n\nfunction validateCrossAxisRuleUniqueness(\n config: StoredStateConfig,\n fragment: StateConfigFragment,\n errors: ConfigValidationError[],\n): void {\n const existingIds = new Set(config.crossAxisRules.map((r) => r.id));\n for (const rule of fragment.crossAxisRules ?? []) {\n if (existingIds.has(rule.id)) {\n errors.push({\n code: 'duplicate_cross_axis_rule_id',\n message: `Cross-axis rule ID \"${rule.id}\" already exists in the config`,\n path: `crossAxisRules[${rule.id}]`,\n });\n }\n }\n}\n","import type { DisplayStateRule, StoredStateConfig, StateConfigFragment } from './interfaces';\n\nfunction displayRuleKey(rule: DisplayStateRule): string {\n const p = rule.paymentState;\n const f = rule.fulfillmentState;\n const pKey = p === undefined ? '*' : Array.isArray(p) ? p.slice().sort().join(',') : p;\n const fKey = f === undefined ? '*' : Array.isArray(f) ? f.slice().sort().join(',') : f;\n return `${pKey}|${fKey}`;\n}\n\n/**\n * Merges a resolved StateConfigFragment into an existing StateConfig,\n * tagging every contributed item with `_sourceExtensionId`.\n *\n * Returns a new config object (does not mutate the original).\n */\nexport function mergeFragment(\n config: StoredStateConfig,\n fragment: StateConfigFragment,\n extensionId: string,\n): StoredStateConfig {\n const merged: StoredStateConfig = JSON.parse(JSON.stringify(config));\n\n for (const path of fragment.paymentPaths ?? []) {\n merged.paymentPaths.push({ ...path, _sourceExtensionId: extensionId });\n }\n for (const path of fragment.fulfillmentPaths ?? []) {\n merged.fulfillmentPaths.push({ ...path, _sourceExtensionId: extensionId });\n }\n for (const rule of fragment.crossAxisRules ?? []) {\n merged.crossAxisRules.push({ ...rule, _sourceExtensionId: extensionId });\n }\n for (const cond of fragment.transitionConditions ?? []) {\n merged.transitionConditions.push({ ...cond, _sourceExtensionId: extensionId });\n }\n for (const pair of fragment.validInitialStates ?? []) {\n merged.validInitialStates.push(pair);\n }\n\n for (const rule of fragment.displayStateMap ?? []) {\n const tagged = { ...rule, _sourceExtensionId: extensionId };\n const key = displayRuleKey(tagged);\n const existingIdx = merged.displayStateMap.findIndex(\n (r) => displayRuleKey(r) === key,\n );\n if (existingIdx !== -1) {\n merged.displayStateMap[existingIdx] = tagged;\n } else {\n merged.displayStateMap.push(tagged);\n }\n }\n\n return merged;\n}\n","import type { StoredStateConfig } from './interfaces';\n\n/**\n * Removes all items contributed by a specific extension from a StateConfig.\n * Items are identified by their `_sourceExtensionId` tag.\n *\n * Returns a new config object (does not mutate the original).\n */\nexport function removeFragment(\n config: StoredStateConfig,\n extensionId: string,\n): StoredStateConfig {\n const cleaned: StoredStateConfig = JSON.parse(JSON.stringify(config));\n\n cleaned.paymentPaths = cleaned.paymentPaths.filter(\n (p) => p._sourceExtensionId !== extensionId,\n );\n cleaned.fulfillmentPaths = cleaned.fulfillmentPaths.filter(\n (p) => p._sourceExtensionId !== extensionId,\n );\n cleaned.crossAxisRules = cleaned.crossAxisRules.filter(\n (r) => r._sourceExtensionId !== extensionId,\n );\n cleaned.transitionConditions = cleaned.transitionConditions.filter(\n (c) => c._sourceExtensionId !== extensionId,\n );\n cleaned.displayStateMap = cleaned.displayStateMap.filter(\n (d) => d._sourceExtensionId !== extensionId,\n );\n\n return cleaned;\n}\n","/**\n * Command-frame action contract types for the order state machine.\n *\n * These define the param/response shapes and canonical action name strings\n * that extensions and hosts agree on. Command-frame itself stays agnostic —\n * extensions use `commandFrameClient.call<P, R>(ACTION_NAME, params)` with\n * these types, and hosts register handlers under the same string keys.\n */\n\nimport type {\n StateConfig,\n AvailableTransition,\n DisplayStateResult,\n TransitionResult,\n StateConfigFragment,\n} from './interfaces';\nimport type { StatePair } from './types';\n\n// ---------------------------------------------------------------------------\n// Action name constants (shared between extension and host)\n// ---------------------------------------------------------------------------\n\nexport const ORDER_STATE_ACTIONS = {\n getOrderStateConfig: 'getOrderStateConfig',\n getAvailableTransitions: 'getAvailableTransitions',\n getOrderDisplayState: 'getOrderDisplayState',\n transitionOrderState: 'transitionOrderState',\n getStateConfigFragment: 'getStateConfigFragment',\n saveStateConfigFragment: 'saveStateConfigFragment',\n deleteStateConfigFragment: 'deleteStateConfigFragment',\n} as const;\n\n// ---------------------------------------------------------------------------\n// Render (POS) actions\n// ---------------------------------------------------------------------------\n\nexport interface GetOrderStateConfigParams {}\nexport interface GetOrderStateConfigResponse {\n config: StateConfig;\n}\n\nexport interface GetAvailableTransitionsParams {\n /** Look up order by ID from local DB to determine current state. */\n orderId?: string;\n /** Or provide the state pair directly. */\n currentState?: StatePair;\n /** Skip condition evaluation (useful for UI that shows all structural paths). */\n skipConditionEvaluation?: boolean;\n}\nexport interface GetAvailableTransitionsResponse {\n transitions: AvailableTransition[];\n}\n\nexport interface GetOrderDisplayStateParams {\n /** Look up order by ID from local DB to determine current state pair. */\n orderId?: string;\n /** Or provide the state pair directly. */\n statePair?: StatePair;\n}\nexport interface GetOrderDisplayStateResponse {\n display: DisplayStateResult;\n}\n\nexport interface TransitionOrderStateParams {\n orderId: string;\n to: StatePair;\n}\nexport interface TransitionOrderStateResponse {\n success: boolean;\n order: Record<string, unknown>;\n result: TransitionResult;\n}\n\n// ---------------------------------------------------------------------------\n// Manage (Code) actions — state config fragment CRUD\n// ---------------------------------------------------------------------------\n\nexport interface GetStateConfigFragmentParams {\n extensionId: string;\n}\nexport interface GetStateConfigFragmentResponse {\n fragment: StateConfigFragment | null;\n}\n\nexport interface SaveStateConfigFragmentParams {\n extensionId: string;\n fragment: StateConfigFragment;\n}\nexport interface SaveStateConfigFragmentResponse {\n success: boolean;\n validation?: {\n valid: boolean;\n errors: { code: string; message: string; path?: string }[];\n warnings: { code: string; message: string; path?: string }[];\n };\n}\n\nexport interface DeleteStateConfigFragmentParams {\n extensionId: string;\n}\nexport interface DeleteStateConfigFragmentResponse {\n success: boolean;\n}\n","/**\n * Pub/sub event payload types for the order state machine.\n *\n * The host publishes these via command-frame's `topicPublisher` under the\n * \"order-state\" topic. Extensions subscribe by string and cast the payload\n * to the typed event interfaces exported here.\n */\n\nimport type {\n DisplayStateResult,\n TransitionBlockedBy,\n} from './interfaces';\nimport type { StatePair } from './types';\n\nexport const ORDER_STATE_TOPIC = 'order-state' as const;\n\nexport const ORDER_STATE_EVENTS = {\n stateTransitionCompleted: 'state-transition-completed',\n stateTransitionBlocked: 'state-transition-blocked',\n configUpdated: 'config-updated',\n} as const;\n\nexport interface StateTransitionCompletedPayload {\n orderId: string;\n from: StatePair;\n to: StatePair;\n display: DisplayStateResult;\n timestamp: string;\n}\n\nexport interface StateTransitionBlockedPayload {\n orderId: string;\n from: StatePair;\n attemptedTo: StatePair;\n blockedBy: TransitionBlockedBy[];\n timestamp: string;\n}\n\nexport interface ConfigUpdatedPayload {\n companyId: string;\n configId: string;\n version: number;\n timestamp: string;\n}\n\nexport type OrderStateEventPayload =\n | StateTransitionCompletedPayload\n | StateTransitionBlockedPayload\n | ConfigUpdatedPayload;\n"],"mappings":";AAIO,IAAK,eAAL,kBAAKA,kBAAL;AAEL,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AAGN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAAM;AACN,EAAAA,cAAA,SAA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","names":["CurrencyCode","TimePeriod","TopMetericsSort","CompanyType","CustomTableAvailability","AttributeType","Platform","OrderPlatform","CustomerPlatform","StationStatus","InventoryBaseActionEnum","InventorySpecificActionType","ExtensionCategory","FeesCustomBillingStatus","PricingPlanEnum","PricingLevel","PricingRegionEnum","MenuProject","UserTypes","OwnerType","PublicationAvailability","PublicationStatus","ResidualStatus","PreviewImageMode","LibraryItemType","ResidualPaymentMethod","PaymentMethod","NonRevenueItemType","ReceiptSendChannel","ReceiptType","StripeStatus","InvoiceStatus","StripeCurrencyCode","ProductType","ProductStatus","PaymentProcessor","toMinorUnits"]}