@posx/core 5.5.557 → 5.5.558

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.
package/build/index.d.ts CHANGED
@@ -1878,6 +1878,8 @@ interface ICoreCategory extends IProductBase {
1878
1878
  * Indicates whether the category is delisted
1879
1879
  */
1880
1880
  is_delisted: boolean;
1881
+ /** Auto-generated category code */
1882
+ code?: string;
1881
1883
  printing_sequence?: number;
1882
1884
  }
1883
1885
  interface ICategory extends ICoreCategory {
@@ -1914,6 +1916,7 @@ declare class CoreCategory extends ProductBase implements ICoreCategory {
1914
1916
  max_order: number;
1915
1917
  min_order: number;
1916
1918
  is_delisted: boolean;
1919
+ code?: string;
1917
1920
  printing_sequence: number;
1918
1921
  constructor();
1919
1922
  }
@@ -1932,6 +1935,7 @@ declare class Category extends ProductBase implements ICategory {
1932
1935
  uid: string;
1933
1936
  max_order: number;
1934
1937
  min_order: number;
1938
+ code?: string;
1935
1939
  constructor();
1936
1940
  }
1937
1941
  interface ISubcategory extends IProductBase {
@@ -1987,6 +1991,8 @@ interface ICoreItem extends IProductBase {
1987
1991
  * The barcode of the item.
1988
1992
  */
1989
1993
  barcode: string;
1994
+ /** Auto-generated PLU hash code */
1995
+ plu?: string;
1990
1996
  /**
1991
1997
  * The price of the item.
1992
1998
  */
@@ -2038,6 +2044,7 @@ declare class CoreItem extends ProductBase implements ICoreItem {
2038
2044
  sku: string;
2039
2045
  type: ProductType;
2040
2046
  barcode: string;
2047
+ plu?: string;
2041
2048
  category_uid: string;
2042
2049
  price: number;
2043
2050
  original_price: number;
@@ -6125,11 +6132,15 @@ interface IExportRow {
6125
6132
  is_delisted?: boolean;
6126
6133
  name_translations?: string;
6127
6134
  prices?: IPrice[];
6135
+ plu?: string;
6136
+ code?: string;
6128
6137
  }
6129
6138
  //#endregion
6130
6139
  //#region src/utils/csv.utils.d.ts
6131
- /** Create CSV export blob from categories and products */
6140
+ /** Create CSV export blob from categories and products. Uses existing code/plu fields as-is. */
6132
6141
  declare function createCSVExport(categories: ICategory[], products: IItem[], filename?: string): Blob;
6142
+ /** Same as createCSVExport but auto-generates missing category code / item PLU via SHA-256 hash. */
6143
+ declare function createCSVExportWithHash(categories: ICategory[], products: IItem[], filename?: string): Promise<Blob>;
6133
6144
  /** Import categories and products from CSV file */
6134
6145
  declare function importFromCSV(file: File): Promise<{
6135
6146
  categories: ICategory[];
@@ -6219,5 +6230,5 @@ interface ValidationResult {
6219
6230
  }
6220
6231
  declare function validateSTTemplate(jsonStr: string): ValidationResult;
6221
6232
  //#endregion
6222
- export { Address, AppBaseModel, AppConfig, AppCoreModel, AppCoreService, AppExtraModel, AppLocalService, AppMiscService, AppRemoteService, AppReport, AppReportService, Applying, AssetItem, AssetTags, AssetType, Between, BreakPeriod, Cache, CalcFlow, CalcType, CancelInvoiceOptions, CardPaymentCode, CashDrawerConfig, Category, CategorySalesSummary, CategoryService, CategoryType, Charge, ChargeConfig, CheckInvoiceOptions, Codepages, ComboGroup, ComboGroupItem, Condition, Config, ConfigService, CoreCategory, CoreItem, Coupon, CouponItemized, CouponUsage, CreateInvoiceOptions, CrmConfig, CurrencyConfig, CustomResponse, Customer, CustomerDisplaySystemConfig, DayOfWeek, DeployChannel, Device, DeviceEtc, DeviceType, DirectPayInvoiceOptions, DiscountType, DrawerSummary, ElectronSocket, Employee, EmployeeRole, EmployeeRoleService, EmployeeService, ErrorMsgs, EscPosCompatibility, EscPosPrinter, FileUploadRequest, GTOConfig, GeneralConfig, GetManyResult, Holiday, IAddress, IAppBase, IAppBaseModel, IAppConfig, IAppCore, IAppCoreModel, IAppCoreService, IAppExtra, IAppExtraModel, IAppLocalService, IAppMiscService, IAppModelSequence, IAppRemoteService, IAppReport, IAppReportService, IApplying, ICache, ICashDrawerConfig, ICategory, ICategoryService, IChangePaymentMethodOption, ICharge, IChargeConfig, IComboGroup, IComboGroupItem, IConfig, IConfigService, ICoreCategory, ICoreItem, ICoupon, ICouponItemized, ICouponUsage, ICredit, ICrmConfig, ICurrencyConfig, ICustomer, ICustomerDisplaySystemConfig, IDevice, IDiscount, IDiscountSummaryEntry, IDrawerSummary, IEmployee, IEmployeeRole, IEmployeeRoleService, IEmployeeService, IEscPosPrinter, IEtc, IExportRow, IFileUploadRequest, IFileUploadResponse, IFontSize, IGeneralConfig, IGtoConfig, IInventoryConfig, IInvoice, IInvoiceActivity, IInvoiceBaseService, IInvoiceCharge, IInvoiceCoreLine, IInvoiceDiscount, IInvoiceLine, IInvoiceOperationService, IInvoiceService, IItem, IItemService, IKdsConfig, IKioskSystemConfig, IKitchenConfig, ILabelConfig, ILineOperationService, ILoyaltyProgram, ILoyaltyProgramSummary, IMarketing, IMenu, IMenuService, IMerchant, IMerchantAsset, INode, INodePrinter, INote, INoteEntity, INoteGroup, INoteGroupEntity, INoteGroupService, INoteService, IOnlineOrderConfig, IOrderConfig, IOrderDisplay, IOrderDisplayService, IOrderDisplaySystemConfig, IPaxConfig, IPayment, IPaymentConfig, IPaymentMethod, IPaymentMethodHistory, IPaymentMethodService, IPaymentService, IPaymentSummary, IPoint, IPrice, IPrintBarcode, IPrintCommand, IPrintCommandLine, IPrintImage, IPrintJob, IPrintJobService, IPrintQrcode, IPrintTable, IPrintTableRowItem, IPrintTemplate, IPrintTemplateCore, IPrintTemplateService, IPrintText, IPrinter, IPrinterService, IProductBase, IProductConfig, IProductService, IPushData, IReceiptConfig, IRenderPrintTemplateOptions, IReport, IReportCategory, IReportConfig, IReportData, IReportRequest, IRoundingConfig, ISalesSummary, ISection, ISectionItem, ISectionItemService, ISectionService, IServiceOptions, IShift, IShiftService, IStandardPaymentMethod, IStockLog, IStockLogService, IStorage, ISubcategory, ISubcategoryService, ITaxConfig, ITemplateData, ITill, ITillConfig, ITillService, IUser, IUserConfig, IVisibility, In, Include, InventoryConfig, Invoice, InvoiceAction, InvoiceActivity, InvoiceBaseService, InvoiceCharge, InvoiceCoreLine, InvoiceDiscount, InvoiceLine, InvoiceOperationService, InvoiceService, InvoiceStatus, InvoiceType, Item, ItemSalesSummary, ItemService, KdsConfig, KioskSystemConfig, KitchenConfig, LabelConfig, LineOperationService, LineOptions, LoyaltyProgram, LoyaltyProgramSummary, MarketingConfig, Menu, MenuService, Merchant, MessageType, ModelPrefix, ModelType, ModifierSalesSummary, Node, NodePrinter, Not, Note, NoteEntity, NoteGroup, NoteGroupEntity, OnlineOrderConfig, OpenHours, OrderConfig, OrderDisplay, OrderDisplayService, OrderDisplayStatus, OrderDisplaySystemConfig, OrderFlow, PaxConfig, PayInvoiceOptions, Payment, PaymentConfig, PaymentMethod, PaymentMethodHistory, PaymentMethodService, PaymentService, PaymentStatus, PaymentSummary, PaynowMethod, Price, PrintAlign, PrintBarcode, PrintCommand, PrintImage, PrintJob, PrintJobService, PrintJobStatus, PrintQrcode, PrintSize, PrintStyle, PrintTemplate, PrintTemplateCore, PrintTemplateService, PrintType, Printer, PrinterConnections, PrinterProtocols, PrinterService, PrinterStatus, PrinterType, ProductBase, ProductConfig, ProductPartialAssets, ProductPartialConfig, ProductService, ProductType, PushData, Raw, Receipt, RenderPrintTemplateOptions, Report, ReportCategory, ReportConfig, ReportData, ReportType, RoundingConfig, SalesSummary, Schedule, Section, SectionItem, SectionItemService, SectionItemStatus, SectionService, ServiceFactory, ServiceMode, ServiceOptions, Shift, ShiftService, ShiftStatus, SpecialDay, StandardPaymentMethod, StockChange, StockLog, StockLogEntityType, StockLogRefType, StockLogService, StockLogType, Storage, StorageService, Subcategory, SwitchInvoiceOptions, System, SystemError, TCategorySalesSummary, TDynamicOrderQR, TItemCoreSalesSummary, TItemSalesSummary, TModifierSalesSummary, TStockChange, TStockChangeItem, TStorageService, TaxConfig, TaxMethod, TemplateData, Till, TillConfig, TillService, TillType, UomType, UpdateGeneralConfigOptions, UpdateInvoiceOptions, User, UserConfig, type ValidationError, type ValidationResult, Visibility, VoidInvoiceOptions, createCSVExport, dbSchemas, filterByParams, humanizedData, importFromCSV, normalizedDate, transformer, validateSTTemplate };
6233
+ export { Address, AppBaseModel, AppConfig, AppCoreModel, AppCoreService, AppExtraModel, AppLocalService, AppMiscService, AppRemoteService, AppReport, AppReportService, Applying, AssetItem, AssetTags, AssetType, Between, BreakPeriod, Cache, CalcFlow, CalcType, CancelInvoiceOptions, CardPaymentCode, CashDrawerConfig, Category, CategorySalesSummary, CategoryService, CategoryType, Charge, ChargeConfig, CheckInvoiceOptions, Codepages, ComboGroup, ComboGroupItem, Condition, Config, ConfigService, CoreCategory, CoreItem, Coupon, CouponItemized, CouponUsage, CreateInvoiceOptions, CrmConfig, CurrencyConfig, CustomResponse, Customer, CustomerDisplaySystemConfig, DayOfWeek, DeployChannel, Device, DeviceEtc, DeviceType, DirectPayInvoiceOptions, DiscountType, DrawerSummary, ElectronSocket, Employee, EmployeeRole, EmployeeRoleService, EmployeeService, ErrorMsgs, EscPosCompatibility, EscPosPrinter, FileUploadRequest, GTOConfig, GeneralConfig, GetManyResult, Holiday, IAddress, IAppBase, IAppBaseModel, IAppConfig, IAppCore, IAppCoreModel, IAppCoreService, IAppExtra, IAppExtraModel, IAppLocalService, IAppMiscService, IAppModelSequence, IAppRemoteService, IAppReport, IAppReportService, IApplying, ICache, ICashDrawerConfig, ICategory, ICategoryService, IChangePaymentMethodOption, ICharge, IChargeConfig, IComboGroup, IComboGroupItem, IConfig, IConfigService, ICoreCategory, ICoreItem, ICoupon, ICouponItemized, ICouponUsage, ICredit, ICrmConfig, ICurrencyConfig, ICustomer, ICustomerDisplaySystemConfig, IDevice, IDiscount, IDiscountSummaryEntry, IDrawerSummary, IEmployee, IEmployeeRole, IEmployeeRoleService, IEmployeeService, IEscPosPrinter, IEtc, IExportRow, IFileUploadRequest, IFileUploadResponse, IFontSize, IGeneralConfig, IGtoConfig, IInventoryConfig, IInvoice, IInvoiceActivity, IInvoiceBaseService, IInvoiceCharge, IInvoiceCoreLine, IInvoiceDiscount, IInvoiceLine, IInvoiceOperationService, IInvoiceService, IItem, IItemService, IKdsConfig, IKioskSystemConfig, IKitchenConfig, ILabelConfig, ILineOperationService, ILoyaltyProgram, ILoyaltyProgramSummary, IMarketing, IMenu, IMenuService, IMerchant, IMerchantAsset, INode, INodePrinter, INote, INoteEntity, INoteGroup, INoteGroupEntity, INoteGroupService, INoteService, IOnlineOrderConfig, IOrderConfig, IOrderDisplay, IOrderDisplayService, IOrderDisplaySystemConfig, IPaxConfig, IPayment, IPaymentConfig, IPaymentMethod, IPaymentMethodHistory, IPaymentMethodService, IPaymentService, IPaymentSummary, IPoint, IPrice, IPrintBarcode, IPrintCommand, IPrintCommandLine, IPrintImage, IPrintJob, IPrintJobService, IPrintQrcode, IPrintTable, IPrintTableRowItem, IPrintTemplate, IPrintTemplateCore, IPrintTemplateService, IPrintText, IPrinter, IPrinterService, IProductBase, IProductConfig, IProductService, IPushData, IReceiptConfig, IRenderPrintTemplateOptions, IReport, IReportCategory, IReportConfig, IReportData, IReportRequest, IRoundingConfig, ISalesSummary, ISection, ISectionItem, ISectionItemService, ISectionService, IServiceOptions, IShift, IShiftService, IStandardPaymentMethod, IStockLog, IStockLogService, IStorage, ISubcategory, ISubcategoryService, ITaxConfig, ITemplateData, ITill, ITillConfig, ITillService, IUser, IUserConfig, IVisibility, In, Include, InventoryConfig, Invoice, InvoiceAction, InvoiceActivity, InvoiceBaseService, InvoiceCharge, InvoiceCoreLine, InvoiceDiscount, InvoiceLine, InvoiceOperationService, InvoiceService, InvoiceStatus, InvoiceType, Item, ItemSalesSummary, ItemService, KdsConfig, KioskSystemConfig, KitchenConfig, LabelConfig, LineOperationService, LineOptions, LoyaltyProgram, LoyaltyProgramSummary, MarketingConfig, Menu, MenuService, Merchant, MessageType, ModelPrefix, ModelType, ModifierSalesSummary, Node, NodePrinter, Not, Note, NoteEntity, NoteGroup, NoteGroupEntity, OnlineOrderConfig, OpenHours, OrderConfig, OrderDisplay, OrderDisplayService, OrderDisplayStatus, OrderDisplaySystemConfig, OrderFlow, PaxConfig, PayInvoiceOptions, Payment, PaymentConfig, PaymentMethod, PaymentMethodHistory, PaymentMethodService, PaymentService, PaymentStatus, PaymentSummary, PaynowMethod, Price, PrintAlign, PrintBarcode, PrintCommand, PrintImage, PrintJob, PrintJobService, PrintJobStatus, PrintQrcode, PrintSize, PrintStyle, PrintTemplate, PrintTemplateCore, PrintTemplateService, PrintType, Printer, PrinterConnections, PrinterProtocols, PrinterService, PrinterStatus, PrinterType, ProductBase, ProductConfig, ProductPartialAssets, ProductPartialConfig, ProductService, ProductType, PushData, Raw, Receipt, RenderPrintTemplateOptions, Report, ReportCategory, ReportConfig, ReportData, ReportType, RoundingConfig, SalesSummary, Schedule, Section, SectionItem, SectionItemService, SectionItemStatus, SectionService, ServiceFactory, ServiceMode, ServiceOptions, Shift, ShiftService, ShiftStatus, SpecialDay, StandardPaymentMethod, StockChange, StockLog, StockLogEntityType, StockLogRefType, StockLogService, StockLogType, Storage, StorageService, Subcategory, SwitchInvoiceOptions, System, SystemError, TCategorySalesSummary, TDynamicOrderQR, TItemCoreSalesSummary, TItemSalesSummary, TModifierSalesSummary, TStockChange, TStockChangeItem, TStorageService, TaxConfig, TaxMethod, TemplateData, Till, TillConfig, TillService, TillType, UomType, UpdateGeneralConfigOptions, UpdateInvoiceOptions, User, UserConfig, type ValidationError, type ValidationResult, Visibility, VoidInvoiceOptions, createCSVExport, createCSVExportWithHash, dbSchemas, filterByParams, humanizedData, importFromCSV, normalizedDate, transformer, validateSTTemplate };
6223
6234
  //# sourceMappingURL=index.d.ts.map
package/build/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import e from"dayjs";import{nanoid as t}from"nanoid";import n from"esc-pos-encoder-ionic";import r from"wcwidth";import{Dexie as i,liveQuery as a}from"dexie";import{v4 as o}from"uuid";import*as s from"lodash";import c from"axios";import l from"crypto-js";import{SelectTransform as u}from"selecttransform";import{NetworkInterface as d}from"@awesome-cordova-plugins/network-interface";import f from"handlebars";import{QueryBuilder as p}from"@litepos/autoquery";import m from"bcryptjs";var h=(e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function.")});function g(e){"@babel/helpers - typeof";return g=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},g(e)}function _(e,t){if(g(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(g(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function v(e){var t=_(e,`string`);return g(t)==`symbol`?t:t+``}function y(e,t,n){return(t=v(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var b=class{constructor(){y(this,`address1`,``),y(this,`address2`,``),y(this,`lat`,``),y(this,`lng`,``),y(this,`postcode`,``),y(this,`note`,``),y(this,`is_default`,!1),y(this,`name`,``),y(this,`salute`,``),y(this,`phone_number`,``)}},ee=class{constructor(){y(this,`id`,0),y(this,`ref_id`,``),y(this,`image_url`,``),y(this,`stripe_token`,``),y(this,`stripe_customer_id`,``),y(this,`username`,``),y(this,`normalized_username`,``),y(this,`company`,``),y(this,`ic`,``),y(this,`display_name`,``),y(this,`full_name`,``),y(this,`birth_date`,``),y(this,`gender`,``),y(this,`address`,``),y(this,`postcode`,``),y(this,`note`,``),y(this,`language`,``),y(this,`time_zone`,``),y(this,`created_at`,new Date),y(this,`updated_at`,new Date),y(this,`license_ids`,``),y(this,`security_stamp`,``),y(this,`phone_number`,``)}},x=class extends ee{constructor(){super(),y(this,`license_id`,0),y(this,`credit`,0),y(this,`point`,0),y(this,`transaction_total`,0),y(this,`transaction_time`,0),y(this,`user_group_id`,0),y(this,`user_group_name`,``),y(this,`group_expires_at`,null),y(this,`error`,``)}},S=function(e){return e[e.All=1]=`All`,e[e.Inclusive=2]=`Inclusive`,e[e.Exclusive=3]=`Exclusive`,e}(S||{}),C=function(e){return e[e.Flat=1]=`Flat`,e[e.Percent=2]=`Percent`,e}(C||{}),te=class{constructor(){y(this,`applying_type`,S.Inclusive),y(this,`applying_items`,[])}},w=class{constructor(e){y(this,`guid`,``),y(this,`promo_code`,``),y(this,`is_multi_stores`,!1),y(this,`name`,``),y(this,`alias`,void 0),y(this,`description`,void 0),y(this,`description_alias`,void 0),y(this,`applying_plus`,void 0),y(this,`applying_user_tags`,void 0),y(this,`applying_user_groups`,void 0),y(this,`discount_calc_type`,C.Flat),y(this,`discount_amount`,void 0),y(this,`discount_percent`,void 0),y(this,`duration`,30),y(this,`usage_count`,0),y(this,`usage_limit_per_invoice`,1),y(this,`above_invoice_amount`,void 0),y(this,`below_invoice_amount`,void 0),y(this,`is_delivery_free`,!1),y(this,`is_individual_use`,!0),y(this,`price_in_points`,void 0),y(this,`styles`,{}),y(this,`expired_at`,void 0),y(this,`auto_gen`,!1),y(this,`can_sell`,!0),y(this,`can_redeem`,!0),e&&(this.guid=e.guid,this.promo_code=e.promo_code,this.is_multi_stores=e.is_multi_stores,this.name=e.name,this.alias=e.alias,this.description=e.description,this.description_alias=e.description_alias,this.applying_plus=e.applying_plus,this.applying_user_tags=e.applying_user_tags,this.applying_user_groups=e.applying_user_groups,this.discount_calc_type=e.discount_calc_type,this.discount_amount=e.discount_amount,this.discount_percent=e.discount_percent,this.duration=e.duration,this.usage_count=e.usage_count,this.usage_limit_per_invoice=e.usage_limit_per_invoice,this.above_invoice_amount=e.above_invoice_amount,this.below_invoice_amount=e.below_invoice_amount,this.is_delivery_free=e.is_delivery_free,this.is_individual_use=e.is_individual_use,this.price_in_points=e.price_in_points,this.styles={...e.styles},this.expired_at=e.expired_at,this.auto_gen=e.auto_gen,this.can_sell=e.can_sell,this.can_redeem=e.can_redeem)}},ne=class{constructor(e){y(this,`invoice_uid`,``),e&&(this.invoice_uid=e.invoice_uid)}},re=class{constructor(e){y(this,`guid`,``),y(this,`coupon`,new w),y(this,`is_multi_stores`,!1),y(this,`usage`,new ne),y(this,`employee_uid`,``),y(this,`promo_code`,``),y(this,`is_expired`,!1),y(this,`is_redeemed`,!1),y(this,`is_generated`,!1),e&&(this.guid=e.guid,this.coupon=new w(e.coupon),this.is_multi_stores=e.is_multi_stores,this.usage=new ne(e.usage),this.employee_uid=e.employee_uid,this.promo_code=e.promo_code,this.is_expired=e.is_expired,this.is_redeemed=e.is_redeemed,this.is_generated=e.is_generated)}};const ie={from(t){return e(t).format(`YYYY-MM-DD HH:mm:ss`)},to(e){return e}};var T=class{constructor(){y(this,`uid`,void 0),y(this,`updated_at`,new Date),y(this,`created_at`,new Date),y(this,`created_at_timestamp`,new Date().getTime()),y(this,`deleted_at`,null),y(this,`_timestamp`,void 0),y(this,`id_in_server`,void 0)}},E=class extends T{constructor(){super(),y(this,`name`,void 0),y(this,`name_translations`,{})}},ae=class extends E{constructor(...e){super(...e),y(this,`description`,void 0),y(this,`description_translations`,{})}};let D=function(e){return e.Merchant=`mnt_`,e.Section=`sec_`,e.SectionItem=`sit_`,e.Category=`cat_`,e.Subcategory=`sat_`,e.Item=`itm_`,e.ItemModifier=`iod_`,e.ItemModifierCategory=`imc_`,e.Config=`cfg_`,e.Device=`dev_`,e.Invoice=`inv_`,e.InvoiceLine=`iln_`,e.InvoiceCharge=`ich_`,e.Payment=`pay_`,e.Employee=`emp_`,e.Shift=`shf_`,e.Till=`til_`,e.ReportCategory=`rpc_`,e.Report=`rpt_`,e.AppReport=`apr_`,e.PaymentMethod=`pmd_`,e.PrintTemplate=`ptl_`,e.PrintJob=`pjb_`,e.Printer=`prt_`,e.InvoiceDiscount=`ind_`,e.EmployeeRole=`emr_`,e.OrderDisplaySystem=`ods_`,e.Charge=`chr_`,e.Price=`prc_`,e.ComboGroup=`cbo_`,e.Storage=`sto_`,e.Menu=`men_`,e.StockLog=`stl_`,e}({}),oe=function(e){return e.Merchant=`mnt`,e.Section=`sec`,e.SectionItem=`sit`,e.Category=`cat`,e.Subcategory=`sat`,e.Item=`itm`,e.Config=`cfg`,e.Device=`dev`,e.Invoice=`inv`,e}({}),se=function(e){return e.LOCAL=`local`,e.CLOUD=`cloud`,e}({});var ce=class{constructor(){y(this,`mode`,void 0),y(this,`base_url`,void 0),y(this,`device_uid`,void 0),y(this,`merchant_uid`,void 0),y(this,`token`,void 0),y(this,`database`,void 0)}};let le=function(e){return e.Data=`DataMessage`,e.Event=`EventMessage`,e}({});var ue=class{constructor(){y(this,`model`,``),y(this,`data`,``),y(this,`has_many`,!1),y(this,`type`,le.Data)}},O=class extends Error{constructor(e){super(e),this.name=`system_error`}};let k=function(e){return e.outdatedInvoice=`outdated invoice`,e.outdatedSectionItem=`outdated section item`,e.outdatedSourceSectionItem=`outdated source section item`,e.outdatedTargetSectionItem=`outdated target section item`,e}({}),A=function(e){return e.Open=`opened`,e.Closed=`closed`,e}({});var de=class extends T{constructor(){super(),y(this,`user_uid`,``),y(this,`started_at`,new Date),y(this,`ended_at`,new Date),y(this,`declared_amount`,0),y(this,`drawer_amount`,0),y(this,`first_invoice_number`,0),y(this,`status`,A.Open),y(this,`uid`,D.Shift+t())}};let j=function(e){return e.OpenDeposit=`open_deposit`,e.CashDeposit=`cash_deposit`,e.CashIn=`cash_in`,e.CashOut=`cash_out`,e.CashInvoice=`cash_invoice`,e}({});var M=class extends T{constructor(){super(),y(this,`user_uid`,``),y(this,`shift_uid`,``),y(this,`invoice_uid`,``),y(this,`type`,j.CashDeposit),y(this,`amount`,0),y(this,`note`,``),y(this,`uid`,D.Till+t())}};let N=function(e){return e.CLOSED=`closed`,e.OPENED=`opened`,e.PAYMENT=`payment`,e}({});var fe=class extends E{constructor(){super(),y(this,`printer_id_order_list`,[]),y(this,`order_printer_uids`,[]),y(this,`receipt_printer_uid`,``),y(this,`check_printer_uid`,``),y(this,`qr_printer_uid`,``),y(this,`total`,0),y(this,`time`,0),y(this,`pax`,0),y(this,`invoice_created_at`,new Date),y(this,`child_pax`,0),y(this,`baby_pax`,0),y(this,`uid`,D.SectionItem+t()),y(this,`invoice_uid`,``),y(this,`section_uid`,``),y(this,`status`,N.CLOSED),y(this,`size_x`,0),y(this,`size_y`,0),y(this,`row`,0),y(this,`col`,0),y(this,`is_take_out`,!1),y(this,`is_delivery`,!1),y(this,`is_locked`,!1),y(this,`soup_base_quota`,0),y(this,`soup_base_type`,0),y(this,`is_delete`,!1),y(this,`meta`,{}),y(this,`customer`,{}),y(this,`etc`,{})}},pe=class extends E{constructor(){super(),y(this,`sequence`,0),y(this,`uid`,D.Section+t())}},me=class extends E{constructor(){super(),y(this,`permissions`,[]),y(this,`is_default`,!1),y(this,`uid`,D.EmployeeRole+t())}},he=class{constructor(e){y(this,`item_uid`,``),y(this,`quantity`,0),y(this,`modifiers`,[]),this.item_uid=e,this.quantity=0,this.modifiers=[]}},ge=class extends ae{constructor(){super(),y(this,`meta`,{}),y(this,`etc`,{}),y(this,`assets`,{}),y(this,`config`,{online_order_display_large_image:!1}),y(this,`is_internal`,!1),y(this,`color`,``),y(this,`icon`,``),y(this,`sequence`,0)}},_e=class{constructor(){y(this,`system`,ve.POS),y(this,`visible`,!1),y(this,`sequence`,0)}};let ve=function(e){return e.POS=`pos`,e.QrCodeOrder=`qr_code_order`,e}({}),ye=function(e){return e.Product=`product`,e.Modifier=`modifier`,e}({});var be=class extends ge{constructor(){super(),y(this,`type`,ye.Modifier),y(this,`visibility`,[]),y(this,`uid`,D.ItemModifierCategory+t()),y(this,`max_order`,0),y(this,`min_order`,0),y(this,`is_delisted`,!1),y(this,`printing_sequence`,0)}},xe=class extends ge{constructor(){super(),y(this,`image_url`,``),y(this,`image_file_path`,``),y(this,`image_thumbnail_url`,``),y(this,`image_thumbnail_file_path`,``),y(this,`has_subcategory`,!1),y(this,`name_translations`,{}),y(this,`visibility`,void 0),y(this,`printing_sequence`,0),y(this,`type`,ye.Product),y(this,`is_delisted`,!1),y(this,`subcategories`,[]),y(this,`uid`,D.Category+t()),y(this,`max_order`,0),y(this,`min_order`,0)}},Se=class extends ge{constructor(){super(),y(this,`category_uid`,``),y(this,`uid`,D.Subcategory+t())}};let P=function(e){return e.ByQuantity=`by_quantity`,e.ByWeight=`by_weight`,e.Service=`service`,e.Combo=`combo`,e.Modifier=`modifier`,e.Package=`package`,e}({});var Ce=class extends ge{constructor(){super(),y(this,`image_url`,``),y(this,`image_file_path`,``),y(this,`image_thumbnail_url`,``),y(this,`image_thumbnail_file_path`,``),y(this,`visibility`,[]),y(this,`sku`,``),y(this,`type`,P.Modifier),y(this,`barcode`,``),y(this,`category_uid`,``),y(this,`price`,0),y(this,`original_price`,0),y(this,`prices`,[]),y(this,`stock`,1e3),y(this,`print_on_receipt`,!0),y(this,`price_adjustable`,!1),y(this,`is_sold_out`,!1),y(this,`recipe`,``),y(this,`is_remark_disabled`,!1),y(this,`auto_select_first_modifier`,!1),y(this,`uid`,D.ItemModifier+t())}},we=class extends Ce{constructor(){super(),y(this,`codename`,``),y(this,`sku`,``),y(this,`recipe`,``),y(this,`barcode`,``),y(this,`type`,P.ByQuantity),y(this,`add_credit`,0),y(this,`add_point`,0),y(this,`category_uid`,``),y(this,`subcategory_uid`,``),y(this,`unit`,0),y(this,`stock`,0),y(this,`is_sold_out`,!1),y(this,`sold`,0),y(this,`print_on_receipt`,!0),y(this,`price`,0),y(this,`open_editor`,!0),y(this,`price_adjustable`,!1),y(this,`minus_point`,0),y(this,`cost`,0),y(this,`discountable`,!0),y(this,`printing_sequence`,0),y(this,`recommended`,!1),y(this,`likes`,0),y(this,`dislikes`,0),y(this,`is_tax_exempt`,!1),y(this,`is_service_charge_exempt`,!1),y(this,`is_point_reward_exempt`,!1),y(this,`is_credit_reward_exempt`,!1),y(this,`is_internal`,!1),y(this,`is_delisted`,!1),y(this,`uid`,D.Item+t()),y(this,`modifiers`,void 0),y(this,`modifier_categories`,void 0),y(this,`kitchen_printers_uids`,[]),y(this,`order_printers_uids`,[]),y(this,`label_printers_uids`,[]),y(this,`open_editor_panel`,!1),y(this,`open_price_editor`,!1),y(this,`combo_groups`,[])}},Te=class extends T{constructor(){super(),y(this,`lookup_keys`,[]),y(this,`product_uid`,``),y(this,`uid`,D.Price+t()),y(this,`amount`,0),y(this,`name`,``),y(this,`name_translations`,{})}},Ee=class{constructor(){y(this,`item_uid`,``),y(this,`combo_item`,new we),y(this,`price`,0),y(this,`sequence`,0),y(this,`meta`,{})}},De=class{constructor(){y(this,`uid`,D.ComboGroup+t()),y(this,`name`,``),y(this,`name_translations`,{}),y(this,`min_order`,1),y(this,`max_order`,1),y(this,`combo_items`,[]),y(this,`sequence`,0),y(this,`meta`,{})}},Oe=class e{constructor(){y(this,`_state`,e.State.CLOSED),y(this,`cleanup`,void 0),y(this,`onData`,null),y(this,`onClose`,null),y(this,`onError`,null)}get state(){return this._state}static setWindow(t){e.electronSocket=t.electronSocket}setupListeners(){this.cleanup?.(),this.cleanup=window.electronSocket.onEvent(t=>{switch(t.type){case`DataReceived`:this.onData?.(new Uint8Array(t.data));break;case`Close`:this._state=e.State.CLOSED,this.onClose?.(t.hasError),this.cleanup?.();break;case`Error`:this.onError?.(t.errorMessage);break}})}async open(t,n,r,i){try{if(this._state!==e.State.CLOSED){i?.(`Invalid state: ${this._state}`);return}this._state=e.State.OPENING,this.setupListeners(),await e.electronSocket.open(t,n)?(this._state=e.State.OPENED,r?.()):i?.(`Open failed`)}catch(t){this._state=e.State.CLOSED,this.cleanup?.(),i?.(`Open failed: ${t}`)}}async write(t,n,r){try{this._state!==e.State.OPENED&&r?.(`Socket not opened`),await e.electronSocket.write(Array.from(t))?n?.():r?.(`Write failed`)}catch(e){r?.(`Write failed: ${e}`)}}async close(t,n){if(this._state!==e.State.OPENED){n?.(`Invalid state: ${this._state}`);return}try{this._state=e.State.CLOSING,await e.electronSocket.close()?(this._state=e.State.CLOSED,this.cleanup?.(),t?.()):n?.(`Close socket failed`)}catch(t){this._state=e.State.CLOSED,this.cleanup?.(),n?.(`Close socket failed: ${t}`)}}};y(Oe,`State`,{CLOSED:0,OPENING:1,OPENED:2,CLOSING:3}),y(Oe,`electronSocket`,null);function ke(e){return e===`69`}const Ae={Ẳ:2,Ẵ:5,Ẫ:6,Ỷ:20,Ỹ:25,Ỵ:30,Ạ:128,Ắ:129,Ằ:130,Ặ:131,Ấ:132,Ầ:133,Ẩ:134,Ậ:135,Ẽ:136,Ẹ:137,Ế:138,Ề:139,Ể:140,Ễ:141,Ệ:142,Ố:143,Ồ:144,Ổ:145,Ỗ:146,Ộ:147,Ợ:148,Ớ:149,Ờ:150,Ở:151,Ị:152,Ỏ:153,Ọ:154,Ỉ:155,Ủ:156,Ũ:157,Ụ:158,Ỳ:159,Õ:160,ắ:161,ằ:162,ặ:163,ấ:164,ầ:165,ẩ:166,ậ:167,ẽ:168,ẹ:169,ế:170,ề:171,ể:172,ễ:173,ệ:174,ố:175,ồ:176,ổ:177,ỗ:178,Ỡ:179,Ơ:180,ộ:181,ờ:182,ở:183,ị:184,Ự:185,Ứ:186,Ừ:187,Ử:188,ơ:189,ớ:190,Ư:191,À:192,Á:193,Â:194,Ã:195,Ả:196,Ă:197,ẳ:198,ẵ:199,È:200,É:201,Ê:202,Ẻ:203,Ì:204,Í:205,Ĩ:206,ỳ:207,Đ:208,ứ:209,Ò:210,Ó:211,Ô:212,ạ:213,ỷ:214,ừ:215,ử:216,Ù:217,Ú:218,ỹ:219,ỵ:220,Ý:221,ỡ:222,ư:223,à:224,á:225,â:226,ã:227,ả:228,ă:229,ữ:230,ẫ:231,è:232,é:233,ê:234,ẻ:235,ì:236,í:237,ĩ:238,ỉ:239,đ:240,ự:241,ò:242,ó:243,ô:244,õ:245,ỏ:246,ọ:247,ụ:248,ù:249,ú:250,ũ:251,ủ:252,ý:253,ợ:254,Ữ:255};function je(e,t=63){let n=[];for(let r of e)if(Ae[r]!==void 0)n.push(Ae[r]);else{let e=r.charCodeAt(0);e<=127?n.push(e):n.push(t)}return Uint8Array.from(n)}function Me(){return typeof Socket>`u`?new Oe:new Socket}var Ne=class{constructor(){y(this,`socket`,void 0),this.socket=Me(),console.log(`this.socket`,JSON.stringify(this.socket)),this.socket.onData=function(e){console.log(`event - receive: `,e)},this.socket.onClose=function(e){console.log(`event - socket closed`)},this.socket.onError=function(e){console.error(`event - socket error:`,e)}}async testPrint(e){await this.connect(`192.168.1.253`);let t=await this.interpret(e);console.log(`escpos commands:`,JSON.stringify(t));let n=await this.write(t);return await this.disconnect(),n}async connect(e,t=9100,n=5e3){return new Promise((r,i)=>{let a,o,s=()=>{a&&window.clearTimeout(a),o&&window.clearInterval(o)};o=window.setInterval(()=>{this.socket.state===2&&(s(),r(!0))},100),a=window.setTimeout(()=>{s(),r(!1)},n),this.socket.open(e,t,()=>{},e=>{s(),r(!1)})}).catch(async e=>!1)}async write(e,t=1e4){return new Promise((n,r)=>{let i;this.socket.write(e,()=>{console.log(`write success`),clearTimeout(i),n(!0)}),i=window.setTimeout(()=>{console.error(`socket write timed out`),n(!1)},t)}).catch(e=>(console.error(`socket write exception: `,e),!1))}async interpret(e){let t=new n,r=t.initialize();if(e.codepage&&!Object.values(F).includes(e.codepage)){let t=parseInt(e.codepage,10);r.raw([31,27,31,255,t,10,0])}else e.codepage&&Object.values(F).includes(e.codepage)?t.codepage(e.codepage):t.codepage(F.SimplifiedChinese);for(let t of e.items){if(!t)throw Error(`Item is undefined or null`);switch(t.style){case Fe.Bold:r.bold(!0);break;case Fe.Italic:r.italic(!0);break;case Fe.Underline:r.underline(!0);break;default:r.bold(!1),r.italic(!1),r.underline(!1);break}switch(t.align&&r.align(t.align),t.type){case I.Text:if(t.item?.text){if(t.item.size===Ie.Custom&&t.item.height&&t.item.width){if(t.item.width<0||t.item.width>7||t.item.height<0||t.item.height>7)throw Error(`font_width and font_height must be between 0 and 7`);let e=t.item.height<<4|t.item.width;r.raw([29,33,e])}else t.item.size&&r.size(t.item.size);if(ke(e.codepage)){let e=je(t.item.text);r.raw(Array.from(e))}else r.text(t.item.text,t.item.line_width??48);t.item.size===Ie.Custom&&r.raw([29,33,0])}break;case I.Table:if(t.table){if(t.table.size===Ie.Custom&&t.table.height&&t.table.width){if(t.table.width<0||t.table.width>7||t.table.height<0||t.table.height>7)throw Error(`font_width and font_height must be between 0 and 7`);let e=t.table.height<<4|t.table.width;r.raw([29,33,e])}else t.table.size&&r.size(t.table.size);this.formatTable(t.table.items,t.table.line_width??48).forEach(n=>{if(ke(e.codepage)){let e=je(n);r.raw(Array.from(e))}else r.text(n,t.table.line_width??48);r.newline()}),t.table.size===Ie.Custom&&r.raw([29,33,0])}break;case I.Line:r.line(t.item?.text?.repeat(48)??`-`.repeat(48),t.item?.line_width??48);break;case I.NewLine:t.repeat=t.repeat??1;for(let e=0;e<t.repeat;e++)r.newline();break;case I.Image:if(t.image){let e=await this.base64ToImageBitmap(t.image.base64_data);r.image(e,t.image.width,t.image.height,t.image.algorithm,t.image.threshold)}break;case I.QRCode:t.qrcode&&r.qrcode(t.qrcode.data,t.qrcode.model,t.qrcode.size,t.qrcode.errorlevel);break;case I.Barcode:t.barcode&&r.barcode(t.barcode.data,t.barcode.symbology,t.barcode.height);break;case I.Cut:r.cut(t.item?.text??`full`);break;case I.Beeper:r.beeper();break;case I.OpenCashDrawer:r.openCashDrawer();break;default:throw Error(`Unsupported item type: ${t.type}`)}}return r.encode()}formatTable(e,t=48){let n=e.map(e=>Math.floor(t*(e.column_width/100))),r=e.map((e,t)=>this.wrapText(e.text,n[t])),i=[],a=Math.max(...r.map(e=>e.length));for(let t=0;t<a;t++){let a=``;for(let i=0;i<e.length;i++){let e=r[i][t]||``;a+=this.padEnd(e,n[i])}i.push(a)}return i}padEnd(e,t){let n=Array.from(e).reduce((e,t)=>e+r(t),0);return e+` `.repeat(Math.max(0,t-n))}padStart(e,t){let n=Array.from(e).reduce((e,t)=>e+r(t),0);return` `.repeat(Math.max(0,t-n))+e}wrapText(e,t){if(typeof e!=`string`&&(e=e.toString()),!e)return[``];let n=[],i=``,a=0;for(let o of e){let e=r(o);a+e>t&&(n.push(i),i=``,a=0),i+=o,a+=e}return i&&n.push(i),n}async disconnect(){if(!this.socket||this.socket.state!==2)return!0;try{return await this.close(),!0}catch(e){throw Error(e)}}close(e=5e3){return new Promise((t,n)=>{let r=this.socket.onClose,i;this.socket.onClose=e=>{clearTimeout(i),this.socket.onClose=r,e?n(Error(`Socket closed with error: ${e}`)):t(),typeof r==`function`&&r(e)},i=window.setTimeout(()=>{this.socket.onClose=r,n(Error(`Socket close operation timed out`))},e),this.socket.close(()=>console.log(`Close initiated successfully`),e=>{clearTimeout(i),this.socket.onClose=r,n(e)})})}async base64ToImageBitmap(e){let t=e.match(/^data:(image\/(?:jpeg|png));base64,(.+)$/i);if(!t)throw Error(`base64_data format is invalid or image type is not supported (only jpeg/png allowed)`);let[,n,r]=t,i=new Blob([Uint8Array.from(atob(r),e=>e.charCodeAt(0))],{type:n});return await createImageBitmap(i)}};let F=function(e){return e.English=`cp437`,e.Greek=`cp737`,e.WesternEurope=`cp850`,e.BalticRim=`cp775`,e.CentralEurope=`cp852`,e.Cyrillic=`cp855`,e.Turkish=`cp857`,e.MultilingualLatin1WithEuro=`cp858`,e.Portuguese=`cp860`,e.Icelandic=`cp861`,e.Hebrew=`cp862`,e.FrenchCanadian=`cp863`,e.Arabic=`cp864`,e.Nordic=`cp865`,e.Russian=`cp866`,e.ModernGreek=`cp869`,e.SimplifiedChinese=`cp936`,e.Korean=`cp949`,e.TraditionalChinese=`cp950`,e.WesternEuropeanLatin=`cp1252`,e.ArabicISO=`iso88596`,e.Japanese=`shiftjis`,e.CentralEuropeanLatinWindows=`windows1250`,e.CyrillicWindows=`windows1251`,e.WesternEuropeanLatinWindows=`windows1252`,e.GreekWindows=`windows1253`,e.TurkishWindows=`windows1254`,e.HebrewWindows=`windows1255`,e.ArabicWindows=`windows1256`,e.BalticWindows=`windows1257`,e.Vietnamese=`windows1258`,e}({}),Pe=function(e){return e.Left=`left`,e.Center=`center`,e.Right=`right`,e}({}),Fe=function(e){return e.Normal=`normal`,e.Bold=`bold`,e.Italic=`italic`,e.Underline=`underline`,e}({}),Ie=function(e){return e.Custom=`custom`,e.Normal=`normal`,e.Small=`small`,e}({}),I=function(e){return e.Text=`text`,e.Table=`table`,e.Line=`line`,e.Image=`image`,e.QRCode=`qrcode`,e.NewLine=`newline`,e.Barcode=`barcode`,e.Cut=`cut`,e.Beeper=`beeper`,e.OpenCashDrawer=`open_cash_drawer`,e}({});var Le=class{constructor(){y(this,`data`,``),y(this,`symbology`,`ean13`),y(this,`height`,0)}},Re=class{constructor(){y(this,`data`,``),y(this,`model`,2),y(this,`size`,6),y(this,`errorlevel`,`m`)}},ze=class{constructor(){y(this,`base64_data`,``),y(this,`width`,0),y(this,`height`,0),y(this,`algorithm`,`threshold`),y(this,`threshold`,128)}};let Be=function(e){return e[e.SunmiPrinter=0]=`SunmiPrinter`,e}({});var L=class{constructor(){y(this,`codepage`,F.WesternEuropeanLatin),y(this,`items`,[])}};function R(t,n){return e(t).format(n||`YYYY-MMM-DD HH:mm:ss`)}function Ve(e){return`${e.getFullYear()}-${(e.getMonth()+1).toString().padStart(2,`0`)}-${e.getDate().toString().padStart(2,`0`)} ${e.getHours().toString().padStart(2,`0`)}:${e.getMinutes().toString().padStart(2,`0`)}:${e.getSeconds().toString().padStart(2,`0`)}`}var He=class extends E{constructor(){super(),y(this,`machine_name`,``),y(this,`connection_id`,``),y(this,`type`,We.Client),y(this,`etc`,{fomopay_terminal_id:``,hirector_public_key:``,hirector_private_key:``,yeahpay_app_id:``,yeahpay_device_sn:``,yeahpay_server_public_key:``,yeahpay_client_private_key:``,yeahpay_signature_key:``,yeahpay_async_url:``,sync_to_specific_cds:``})}},Ue=class extends E{constructor(){super(),y(this,`type`,We.Node),y(this,`machine_name`,``),y(this,`connection_id`,``),y(this,`etc`,{fomopay_terminal_id:``,hirector_public_key:``,hirector_private_key:``,yeahpay_app_id:``,yeahpay_device_sn:``,yeahpay_server_public_key:``,yeahpay_client_private_key:``,yeahpay_signature_key:``,yeahpay_async_url:``,sync_to_specific_cds:``})}};let We=function(e){return e.Client=`client`,e.Node=`node`,e}({}),z=function(e){return e.ReceiptPrinter=`receipt_printer`,e.CheckPrinter=`check_printer`,e.OrderPrinter=`order_printer`,e.KitchenPrinter=`kitchen_printer`,e.KioskPrinter=`kiosk_printer`,e.LabelPrinter=`label_printer`,e.QrCodePrinter=`qr_code_printer`,e}({});var Ge=class{constructor(){y(this,`printer_name`,``),y(this,`status`,``),y(this,`port_name`,``),y(this,`error`,``)}};let Ke=function(e){return e.ESCPOS=`ESC/POS`,e.TSPL=`TSPL`,e}({}),qe=function(e){return e.USB=`USB`,e.WINDOWS_DRIVER=`WINDOWS_DRIVER`,e.ETHERNET=`ETHERNET`,e.BLUETOOTH=`BLUETOOTH`,e.BUILTIN=`BUILTIN`,e.IMIN_BUILT_IN=`IMIN_BUILT_IN`,e}({});var Je=class{constructor(){y(this,`header`,``),y(this,`body`,``),y(this,`footer`,``),y(this,`commands`,``),y(this,`type`,z.ReceiptPrinter)}},B=class extends E{constructor(){super(),y(this,`header`,``),y(this,`body`,``),y(this,`footer`,``),y(this,`commands`,``),y(this,`printer_type`,z.ReceiptPrinter),y(this,`codepage`,void 0),y(this,`uid`,D.PrintTemplate+t()),y(this,`report_code_name`,``)}};let Ye=function(e){return e.Queued=`queued`,e.Printed=`printed`,e.Failed=`failed`,e.Expired=`expired`,e}({});var V=class extends E{constructor(e,n,r=!1,i=1){super(),y(this,`printer_name`,``),y(this,`driver_printer_name`,``),y(this,`printer_ip`,``),y(this,`printer_uid`,``),y(this,`printer_type`,z.ReceiptPrinter),y(this,`protocol`,Ke.ESCPOS),y(this,`connection_type`,qe.ETHERNET),y(this,`data`,new L),y(this,`status`,Ye.Queued),y(this,`retries`,0),y(this,`commands`,``),y(this,`uid`,D.PrintJob+t()),y(this,`save_only`,!1),y(this,`print_times`,1),y(this,`printed`,0),y(this,`device_uid_to_print`,``),y(this,`designated_table_section_uids`,[]),y(this,`job_id`,0),y(this,`print_sequence`,void 0),y(this,`meta`,{}),this.driver_printer_name=e.driver_printer_name,e.protocol&&(this.protocol=e.protocol),e.connection_type&&(this.connection_type=e.connection_type),this.printer_name=e.name,this.printer_ip=e.ip_address,e.type&&(this.printer_type=e.type),this.data=n,this.printer_uid=e.uid,this.save_only=r,this.print_times=i,e.print_sequence!==void 0&&(this.print_sequence=e.print_sequence)}};let Xe=function(e){return e.Online=`online`,e.Offline=`offline`,e}({});var Ze=class extends E{constructor(){super(),y(this,`device_uid`,``),y(this,`terminal_device_uids`,[]),y(this,`type`,z.ReceiptPrinter),y(this,`is_not_default`,!1),y(this,`driver_printer_name`,``),y(this,`fallback_printer_uid`,0),y(this,`protocol`,Ke.ESCPOS),y(this,`connection_type`,qe.ETHERNET),y(this,`print_template_uid`,``),y(this,`uid`,D.Printer+t()),y(this,`ip_address`,``),y(this,`status`,Xe.Online),y(this,`kitchen_itemized_print`,!1),y(this,`print_times`,1),y(this,`retries`,1),y(this,`use_device_name`,!1),y(this,`usb_device_name`,``)}},Qe=class{constructor(){y(this,`config`,{}),y(this,`invoice`,{}),y(this,`report_data`,{}),y(this,`section_item`,{}),y(this,`printer_name`,``),y(this,`printed_at`,new Date),y(this,`normalized_printed_at`,``),y(this,`meta`,{}),y(this,`is_cancel`,!1),this.normalized_printed_at=R(this.printed_at)}},H=class{constructor(){y(this,`printer_name`,``),y(this,`kitchen_itemized_print`,!1),y(this,`is_cancel`,!1)}},$e=class extends T{constructor(){super(),y(this,`invoice_uid`,``),y(this,`tender_amount`,0),y(this,`change_amount`,0),y(this,`payment_method_uid`,``),y(this,`payment_method_code`,``),y(this,`payment_method_name`,``),y(this,`payment_method`,new et),y(this,`payment_method_history`,void 0),y(this,`uid`,D.Payment+t()),y(this,`updated_at`,new Date)}},et=class extends E{constructor(){super(),y(this,`sequence`,0),y(this,`payment_currency_id`,0),y(this,`currency_code`,``),y(this,`currency_symbol`,`$`),y(this,`payment_method_code`,``),y(this,`name`,``),y(this,`codename`,``),y(this,`name_abbrev`,``),y(this,`enable_drawer`,!1),y(this,`enable_receipt`,!1),y(this,`image_url`,``),y(this,`custom_image_url`,``),y(this,`is_cash`,!1),y(this,`is_integrated`,!1),y(this,`is_disabled`,!0),y(this,`type`,0),y(this,`api_id`,``),y(this,`api_key`,``),y(this,`is_sales_exclusive`,!1),y(this,`enable_credit_validation`,!1),y(this,`enable_customer_validation`,!1),y(this,`is_cancellable`,!1),y(this,`require_zero_balance`,!1),y(this,`uid`,D.PaymentMethod+t())}},tt=class extends et{constructor(){super(),y(this,`changed_at`,new Date),y(this,`changed_by`,``)}},nt=class{toPaymentMethod(){let e=new et;return e.currency_code=this.currency_code||``,e.payment_method_code=this.payment_method_code||``,e.codename=this.codename||``,e.name=this.name||``,e.name_abbrev=this.name_abbrev||``,e.enable_drawer=this.enable_drawer,e.enable_receipt=this.enable_receipt,e.image_url=this.image_url||``,e.is_cash=this.is_cash,e.is_integrated=this.is_integrated,e.is_disabled=this.is_disabled,e.type=this.type,e.api_id=this.api_id||``,e.api_key=this.api_key||``,e}constructor(e){y(this,`access_token`,null),y(this,`image_base64`,null),y(this,`error`,null),y(this,`currency_code`,null),y(this,`payment_method_code`,``),y(this,`codename`,null),y(this,`name_abbrev`,null),y(this,`name`,``),y(this,`enable_drawer`,!1),y(this,`enable_receipt`,!0),y(this,`image_url`,``),y(this,`is_cash`,!1),y(this,`is_integrated`,!1),y(this,`is_disabled`,!1),y(this,`type`,0),y(this,`api_id`,null),y(this,`api_key`,null),y(this,`timestamp_create`,Date.now()),y(this,`timestamp_update`,Date.now()),e&&Object.assign(this,e)}};let rt=function(e){return e.STARTED=`payment_started`,e.COMPLETED=`payment_completed`,e.FAILED=`payment_failed`,e.CANCELLED=`payment_cancelled`,e}({});var it=class extends E{constructor(){super()}},at=class extends it{constructor(){super()}},ot=class extends E{constructor(){super(),y(this,`note_group_uid`,``),y(this,`related_model`,oe.Invoice),y(this,`usage`,0)}},st=class extends ot{constructor(){super()}};let ct=function(e){return e.DineIn=`dine_in`,e.TakeOut=`take_out`,e.Delivery=`delivery`,e}({}),lt=function(e){return e.PayToOrder=`pay_to_order`,e.OrderFirstAndPayLater=`order_first_and_pay_later`,e.OnSelection=`on_selection`,e}({}),ut=function(e){return e.Inclusive=`inclusive`,e.Exclusive=`exclusive`,e}({}),U=function(e){return e.Open=`open`,e.OnHold=`on_hold`,e.Paying=`paying`,e.Paid=`paid`,e.Void=`void`,e.PayAtCounter=`pay_at_counter`,e}({}),dt=function(e){return e.Calibration=`calibration`,e.Create=`create`,e.Update=`update`,e.Cancel=`cancel`,e.Hold=`hold`,e.PaymentAsync=`payment_async`,e.Check=`check`,e.Void=`void`,e.Switch=`switch`,e.Reprint=`reprint`,e.Display=`display`,e.Merge=`merge`,e.Calculate=`calculate`,e.Delivery=`delivery`,e.Payment=`payment`,e.ChangePayment=`change_payment`,e.AddCustomer=`add_customer`,e.VoidAndDuplicate=`void_and_duplicate`,e.Duplicate=`duplicate`,e.PayAtCounter=`pay_at_counter`,e.PayInvoice=`pay_invoice`,e.SettleOnlineDeliveryOrder=`settle_online_delivery_order`,e}({}),ft=function(e){return e.quantity=`quantity`,e.weight=`weight`,e}({}),W=function(e){return e.Flat=`flat`,e.Percent=`percent`,e}({}),G=function(e){return e.AfterSubtotal=`after_subtotal`,e.AfterServiceCharge=`after_service_charge`,e.AfterGrantTotal=`after_grant_total`,e}({}),pt=function(e){return e.Custom=`custom`,e.Voucher=`voucher`,e.Coupon=`coupon`,e}({});var mt=class{constructor(){y(this,`uid`,D.InvoiceCharge+t()),y(this,`name`,``),y(this,`percentage`,0),y(this,`amount`,0),y(this,`calc_flow`,G.AfterSubtotal)}},ht=class{constructor(){y(this,`action`,dt.Create),y(this,`action_by`,``),y(this,`device_uid`,``),y(this,`action_at`,new Date)}},gt=class{constructor(){y(this,`uid`,D.Charge+t()),y(this,`name`,``),y(this,`percent`,0),y(this,`calc_flow`,G.AfterSubtotal),y(this,`trigger_condition`,``)}},_t=class{constructor(){y(this,`calc_type`,W.Flat),y(this,`amount`,0),y(this,`percent`,0),y(this,`percent_amount`,0),y(this,`type`,pt.Custom),y(this,`calc_flow`,G.AfterSubtotal),y(this,`applying_item_uids`,[]),y(this,`name`,``),y(this,`name_translation`,{}),y(this,`voucher_uid`,``),y(this,`coupon_uid`,``),y(this,`uid`,D.InvoiceDiscount+t())}},vt=class{constructor(){y(this,`item_uid`,``),y(this,`item`,new Ce),y(this,`price`,0),y(this,`unit_of_measure`,ft.quantity),y(this,`quantity`,0),y(this,`sent`,0),y(this,`kds_done`,0),y(this,`is_cancel_printed`,!1),y(this,`selected`,!1),y(this,`sales_user_uid`,``)}},yt=class extends T{constructor(){super(),y(this,`item_uid`,``),y(this,`price`,0),y(this,`unit_of_measure`,ft.quantity),y(this,`quantity`,0),y(this,`remark`,``),y(this,`invoice_uid`,``),y(this,`discount_calc_type`,W.Flat),y(this,`discount_amount`,0),y(this,`discount_percent`,0),y(this,`subtotal`,0),y(this,`subtotal_before_discount`,0),y(this,`item`,new we),y(this,`point`,0),y(this,`point_subtotal`,0),y(this,`up_size`,!1),y(this,`is_take_out`,!1),y(this,`is_duplicate`,!1),y(this,`is_combo`,!1),y(this,`is_combo_item`,!1),y(this,`combo_group_uid`,``),y(this,`combo_line_uid`,``),y(this,`modifiers`,[]),y(this,`duplicated_from_uid`,``),y(this,`sent`,0),y(this,`kds_done`,0),y(this,`is_cancel_printed`,!1),y(this,`selected`,!1),y(this,`sales_user_uid`,``),y(this,`meta`,{}),y(this,`attached_to_line_uid`,void 0)}},bt=class extends T{constructor(){super(),y(this,`ref_id`,``),y(this,`call_num`,``),y(this,`table_uid`,``),y(this,`table_name`,``),y(this,`type`,ct.DineIn),y(this,`pax`,0),y(this,`adult_pax`,0),y(this,`child_pax`,0),y(this,`baby_pax`,0),y(this,`subtotal`,0),y(this,`point_subtotal`,0),y(this,`service_chargeable_subtotal`,0),y(this,`discountable_subtotal`,0),y(this,`service_charge`,0),y(this,`delivery_id`,0),y(this,`delivery_charge`,0),y(this,`delivery_type`,``),y(this,`delivery_by`,``),y(this,`use_customer_point`,!1),y(this,`add_point`,0),y(this,`minus_point`,0),y(this,`rewarded_point_rate`,0),y(this,`rewarded_point`,0),y(this,`use_customer_balance`,!1),y(this,`add_credit`,0),y(this,`minus_credit`,0),y(this,`rewarded_credit_rate`,0),y(this,`rewarded_credit`,0),y(this,`discounts`,[]),y(this,`discount_amount`,0),y(this,`tax`,0),y(this,`rounding`,0),y(this,`tip`,0),y(this,`grand_total`,0),y(this,`customer_id`,0),y(this,`remark`,``),y(this,`sales_user_uid`,``),y(this,`status`,U.Open),y(this,`paid_at`,new Date(0)),y(this,`voided_at`,new Date(0)),y(this,`humanized_paid_at`,``),y(this,`humanized_voided_at`,``),y(this,`humanized_created_at`,``),y(this,`order_id`,0),y(this,`to_address`,new b),y(this,`payment_source_method`,``),y(this,`payment_source_last4`,``),y(this,`payment_source_charge_ref`,``),y(this,`is_sales_exclusive`,!1),y(this,`etc`,{}),y(this,`action`,void 0),y(this,`lines`,[]),y(this,`deleted_lines`,[]),y(this,`payment_has_cash`,!1),y(this,`payments`,[]),y(this,`table_switch_id`,0),y(this,`employee_uid`,``),y(this,`employee_name`,``),y(this,`receipt_print_override`,!1),y(this,`customer`,new x),y(this,`is_duplicate`,!1),y(this,`kitchen_print_override`,!1),y(this,`otp`,``),y(this,`activities`,[]),y(this,`receipt_print_job_uid`,``),y(this,`kitchen_print_job_uids`,[]),y(this,`label_print_job_uids`,[]),y(this,`charges`,[]),y(this,`is_charge_triggered`,!1),y(this,`uid`,D.Invoice+t()),y(this,`meta`,{}),y(this,`price_lookup_key`,``)}},xt=class extends T{constructor(){super(),y(this,`user_uid`,void 0),y(this,`name`,void 0),y(this,`email`,void 0),y(this,`password`,void 0),y(this,`uid`,D.Employee+t()),y(this,`role_uid`,``),y(this,`language`,`en`),y(this,`can_login`,!0)}},St=class extends T{constructor(){super(),y(this,`config`,new At),y(this,`cache`,new Ct),y(this,`storage`,{pricing_lookup_keys:[],pay_in_reasons:[],pay_out_reasons:[]})}},Ct=class{constructor(){y(this,`printers`,[])}},wt=class{constructor(){}},Tt=class{constructor(){y(this,`enable_price_tiers`,!1),y(this,`rewarded_credit_rate`,0),y(this,`rewarded_point_rate`,0),y(this,`inclusive_service_charge`,!1),y(this,`inclusive_tax`,!1),y(this,`default_country_code`,`+65`),y(this,`disable_member_price_prompt`,!1)}},Et=class{constructor(){y(this,`enabled`,!1),y(this,`full_screen_assets`,[]),y(this,`half_screen_assets`,[]),y(this,`is_logo_hidden`,!1),y(this,`order_list_font_size`,`1.875rem`),y(this,`order_modifier_font_size`,`1.25rem`),y(this,`screen_width`,1024),y(this,`screen_height`,768),y(this,`order_display_duration`,60)}};let Dt=function(e){return e.SmoochPay=`SPCD`,e.YeahPay=`YEAP`,e}({});var Ot=class{constructor(){y(this,`takeaway_only`,!1),y(this,`guest_order_only`,!1),y(this,`disable_paynow_payment`,!1),y(this,`disable_card_payment`,!1),y(this,`disable_receipt_printer_receipt`,!1),y(this,`landing_image`,``),y(this,`menu_banner_image`,``),y(this,`home_page_images`,[]),y(this,`paynow_method`,jt.WyoPaynow),y(this,`card_payment_code`,Dt.SmoochPay)}},kt=class{constructor(){y(this,`point`,{sms_notification:!1,above_invoice_amount:0,conversion_rate:0,inclusive_service_charge:!1,inclusive_tax:!1}),y(this,`credit`,{sms_notification:!1,above_invoice_amount:0,conversion_rate:0,inclusive_service_charge:!1,inclusive_tax:!1})}},At=class{constructor(){y(this,`general`,new Ft),y(this,`product`,new Pt),y(this,`till`,new It),y(this,`report`,new Lt),y(this,`receipt`,new Rt),y(this,`kitchen`,new zt),y(this,`kds`,new Bt),y(this,`label`,new Vt),y(this,`order`,new Ht),y(this,`ods`,new Ut),y(this,`payment`,new Wt),y(this,`user`,new Gt),y(this,`tax`,new Kt),y(this,`rounding`,new Yt),y(this,`inventory`,new Xt),y(this,`pax_config`,new Zt),y(this,`gto`,new Qt),y(this,`cash_drawer`,new $t),y(this,`marketing`,new kt),y(this,`charges`,new qt),y(this,`currency`,new Jt),y(this,`cds`,new Et),y(this,`kiosk`,new Ot),y(this,`online_order`,new Mt),y(this,`loyalty_program`,new Tt),y(this,`crm`,new wt)}};let jt=function(e){return e.FomoOnlinePaynow=`PNWO`,e.WyoPaynow=`WPPN`,e}({});var Mt=class{constructor(){y(this,`enable_membership`,!1),y(this,`login_call_to_action_text`,``),y(this,`menu_banner_image_url`,``),y(this,`paynow_method`,void 0),y(this,`disable_pay_at_counter`,!1),y(this,`disable_paynow_payment`,!1),y(this,`default_language`,`en`),y(this,`category_selector_mode`,`photo_mode`),y(this,`dynamic_order_qr`,{default_order_flow:lt.OrderFirstAndPayLater,select_order_flow:!1,select_menus:!1}),y(this,`max_dining_time`,0),y(this,`disable_logo_for_item_photo_fallback`,!1),y(this,`whatsapp_login_only`,!1),y(this,`enable_whatsapp_login`,!1),y(this,`assets`,{})}};let Nt=function(e){return e.PROD=`prod`,e.DEV=`dev`,e}({});var Pt=class{constructor(){y(this,`enable_codename_search`,!1),y(this,`item_name_font_size`,14),y(this,`item_name_bg_opacity`,75)}},Ft=class{constructor(){y(this,`company_name`,``),y(this,`company_name_alias`,``),y(this,`company_logo`,``),y(this,`company_tax_reg_no`,``),y(this,`company_postcode`,``),y(this,`company_address`,``),y(this,`company_country`,``),y(this,`company_tel`,``),y(this,`business_day_cutoff_hour`,0),y(this,`floor_plan_table_name`,`table`),y(this,`deploy_channel`,Nt.PROD),y(this,`language`,`en`),y(this,`debug`,!1),y(this,`logging`,!1),y(this,`offline_mode`,!1),y(this,`opening_schedules`,[{opening_hours:{open:`10:00`,close:`22:00`}}])}},It=class{constructor(){y(this,`control`,!0),y(this,`slip`,!0)}},Lt=class{constructor(){y(this,`itemized_consolidated`,!0),y(this,`itemized_separated`,``),y(this,`shift_itemized`,!0),y(this,`start_time`,`09:00:01`),y(this,`end_time`,`23:59:59`),y(this,`shift_print_time`,1),y(this,`shift_disable`,!1),y(this,`email`,!1),y(this,`day_boundary_offset`,0)}},Rt=class{constructor(){y(this,`enabled`,!0),y(this,`show_print_dialog`,!1),y(this,`print_docket`,!1),y(this,`hide_non_price_item`,!1),y(this,`receipt_no_reset_daily`,!1),y(this,`language`,`en`),y(this,`disable_persistent_tcp`,!1)}},zt=class{constructor(){y(this,`enabled`,!0),y(this,`print_item_price`,!1),y(this,`print_cancel_slip`,!1),y(this,`print_cancel_whole_invoice`,!1),y(this,`language`,`en`)}},Bt=class{constructor(){y(this,`enabled`,!0),y(this,`display_order_after_payment`,!1),y(this,`print_slip_upon_completed`,!1)}},Vt=class{constructor(){y(this,`print`,!1),y(this,`text_to_raster`,!1)}},Ht=class{constructor(){y(this,`separation_line`,!1),y(this,`slip`,!0),y(this,`slip_font_size_ratio`,1),y(this,`max_dinning`,0),y(this,`exit_menu_after_payment`,!1),y(this,`hide_combo_item_on_receipt`,!1),y(this,`hide_combo_item_on_interactive_view`,!1),y(this,`hide_categories_when_ordering`,!1),y(this,`end_shift_with_open_tables`,!1),y(this,`datetime_format`,`YYYY-MMM-DD HH:mm:ss`),y(this,`ref_prefix`,`01`)}},Ut=class{constructor(){y(this,`enabled`,!1),y(this,`language`,`en`)}},Wt=class{constructor(){y(this,`quick_cash_payment`,!1),y(this,`notification`,!0),y(this,`quick`,!1)}},Gt=class{constructor(){y(this,`control`,!0)}},Kt=class{constructor(){y(this,`enabled`,!0),y(this,`method`,ut.Inclusive),y(this,`rate`,7),y(this,`name`,`GST`)}},qt=class{constructor(){y(this,`service_charge`,!1),y(this,`service_charge_rate`,10)}},Jt=class{constructor(){y(this,`currency_symbol`,`$`),y(this,`is_symbol_after_amount`,!1)}},Yt=class{constructor(){y(this,`base`,.1),y(this,`up`,!0),y(this,`cashless`,!1),y(this,`prepayment_rounding`,!1)}},Xt=class{constructor(){y(this,`inventory_control`,!1),y(this,`sold_out_for_today_only`,!1)}},Zt=class{constructor(){y(this,`pax`,!0),y(this,`detail`,!1)}},Qt=class{constructor(){y(this,`interface`,``),y(this,`genesis_date`,``),y(this,`upload_time`,``),y(this,`ftp_svr`,``),y(this,`ftp_usr`,``),y(this,`ftp_port`,``),y(this,`ftp_path`,``),y(this,`ftp_pwd`,``),y(this,`mall_id`,``),y(this,`machine_id`,``),y(this,`ftp_type`,`ftp`)}},$t=class{constructor(){y(this,`kick_code`,`27, 112, 48, 55, 121`),y(this,`connection_mode`,`via_receipt_printer`)}},en=class{constructor(e){y(this,`name`,``),y(this,`base64`,``),y(this,`extension`,`png`),Object.assign(this,e)}};const tn=e=>e===``||e===void 0,nn=e=>t=>tn(e)||t.includes(e),rn=e=>t=>tn(e)||e.includes(t),an=(e,t)=>n=>n>e&&n<t,on=e=>typeof e==`function`?(t,n)=>!e(t,n):t=>t!=e,sn=e=>e,cn=e=>t=>!t.deleted_at&&Object.keys(e).every(n=>{if(tn(e[n])||t[n]===e[n])return!0;if(typeof e[n]==`function`)return e[n](t[n],t)});var ln=class{constructor(){y(this,`db`,void 0),y(this,`moduleName`,void 0)}get table(){return this.db.table(this.moduleName)}liveQuery(e){return a(e)}async saveOne(e){let n={...e};return n.created_at||(n.created_at=new Date),n.uid||(n.uid=t()),n.updated_at=new Date,await this.db.table(this.moduleName).put(n),n}async saveMany(e){let n=e.map(e=>(e.uid||(e.uid=t(),e.created_at=new Date),e.updated_at=new Date,e));return await this.db.table(this.moduleName).bulkPut(n),n}async hasAny(){return await this.db.table(this.moduleName).count()>0}async getOne(e){return await this.db.table(this.moduleName).get(e)||null}async getOneByParams(e){return this.db.table(this.moduleName).filter(cn(e)).first()}async getDefaultOne(){return this.moduleName?this.db.table(this.moduleName).filter(e=>e.deleted_at===null||e.deleted_at===void 0).first():null}async getAll(){return this.db.table(this.moduleName).toArray()}async getMany(e={},t={}){let{page:n=1,pageSize:r=10,...i}=t||{},a=await this.db.table(this.moduleName).filter(cn(e)).count(),o=this.db.table(this.moduleName).filter(cn(e));return r!==-1&&o.offset((n-1)*r).limit(r),{list:await o.toArray(),count:a,page:n,pageSize:r}}},un=class extends ln{async updateOne(e,t){throw Error(`Method not implemented.`)}async deleteOne(e){throw Error(`Method not implemented.`)}},K=class extends ln{constructor(...e){super(...e),y(this,`http`,void 0),y(this,`methodName`,void 0),y(this,`options`,void 0)}async addOne(e){return this.http.put(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/${this.methodName}`,e)}async updateOne(e,t){return this.http.patch(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/${e}`,t)}async updateMany(e){return this.http.patch(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}`,e)}async deleteOne(e){return e.deleted_at=new Date,this.http.delete(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/${e.id_in_server}`)}async hardDeleteOne(e){return await this.db.table(this.moduleName).delete(e.uid),e}};let dn=function(e){return e[e.printable=0]=`printable`,e[e.generative=1]=`generative`,e}({});var fn=class{constructor(){y(this,`uid`,D.ReportCategory+ +t()),y(this,`name`,``),y(this,`name_translations`,{}),y(this,`reports`,[]),y(this,`created_at`,new Date),y(this,`created_at_timestamp`,new Date().getTime()),y(this,`updated_at`,new Date),y(this,`deleted_at`,null)}},pn=class{constructor(){y(this,`uid`,D.Report+t()),y(this,`name`,``),y(this,`name_translations`,{}),y(this,`type`,void 0),y(this,`codename`,``),y(this,`created_at`,new Date),y(this,`created_at_timestamp`,new Date().getTime()),y(this,`updated_at`,new Date),y(this,`deleted_at`,null)}},mn=class extends T{constructor(){super(),y(this,`uid`,D.AppReport+t()),y(this,`reports`,[]),y(this,`version`,1)}},hn=class{constructor(){y(this,`start_datetime`,``),y(this,`humanized_start_datetime`,``),y(this,`end_datetime`,``),y(this,`humanized_end_datetime`,``),y(this,`humanized_printed_datetime`,``),y(this,`sales_summary`,new gn),y(this,`drawer_summary`,new _n),y(this,`payments_summary`,[]),y(this,`loyalty_program_summary`,new yn),y(this,`item_sales_summary`,[]),y(this,`item_sales_summary_total`,0),y(this,`item_sales_summary_total_count`,0),y(this,`item_sales_summary_by_category`,[]),y(this,`modifier_sales_summary`,[]),y(this,`modifier_sales_summary_total`,0),y(this,`modifier_sales_summary_total_count`,0),y(this,`config`,{}),y(this,`invoice_discount_summary`,[]),y(this,`item_discount_summary`,[])}},gn=class{constructor(){y(this,`sales_total`,0),y(this,`foc_sales_total`,0),y(this,`foc_sales_count`,0),y(this,`rounding_total`,0),y(this,`tax_total`,0),y(this,`service_charge_total`,0),y(this,`discount_total`,0),y(this,`voucher_total`,0),y(this,`voucher_count`,0),y(this,`coupon_total`,0),y(this,`coupon_count`,0),y(this,`paid_invoice_count`,0),y(this,`paid_invoice_total`,0),y(this,`void_invoice_count`,0),y(this,`void_invoice_total`,0),y(this,`total_pax`,0),y(this,`pax_sales_total`,0)}},_n=class{constructor(){y(this,`open_amount`,0),y(this,`declared_amount`,0),y(this,`drawer_amount`,0),y(this,`difference`,0),y(this,`pay_in_total`,0),y(this,`pay_in_count`,0),y(this,`cash_invoice_total`,0),y(this,`cash_invoice_count`,0),y(this,`pay_out_total`,0),y(this,`pay_out_count`,0)}},vn=class{constructor(){y(this,`code`,``),y(this,`name`,``),y(this,`total`,0),y(this,`count`,0)}},yn=class{constructor(){y(this,`add_credit_total`,0),y(this,`add_credit_count`,0),y(this,`topup_paid_total`,0),y(this,`topup_paid_count`,0),y(this,`rewarded_credit_total`,0),y(this,`rewarded_credit_count`,0),y(this,`minus_credit_total`,0),y(this,`minus_credit_count`,0),y(this,`rewarded_point_total`,0),y(this,`rewarded_point_count`,0),y(this,`minus_point_total`,0),y(this,`minus_point_count`,0)}},bn=class{constructor(){y(this,`item`,{}),y(this,`quantity`,0),y(this,`total_amount`,0),y(this,`modifiers`,[])}},xn=class{constructor(){y(this,`item`,{}),y(this,`quantity`,0),y(this,`total_amount`,0)}},Sn=class{constructor(){y(this,`category`,null),y(this,`items`,[]),y(this,`total_quantity`,0),y(this,`total_amount`,0)}},Cn=class extends K{constructor(e,t,n,r=`printers`,i=`printer`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i,y(this,`configService`,void 0),y(this,`printJobService`,void 0),y(this,`printersFromCache`,void 0),this.configService=new Lr(e,t,n,`configs`,`config`),this.printJobService=new qr(e,t,n,`print_jobs`,`print_job`),this.init().catch(e=>console.error(e))}async init(){this.printersFromCache||(this.printersFromCache=(await this.configService.getDefaultOne())?.cache?.printers??[])}async getPhysicalPrintersFromNode(){return(await this.http.get(`api/v5/merchants/`+this.options.merchant_uid+`/`+this.moduleName+`/get_physical_printers`)).data}async getUnpairedNode(){return this.http.get(`api/v5/merchants/`+this.options.merchant_uid+`/node`)}async pairNode(e){return this.http.get(`api/v5/merchants/`+this.options.merchant_uid+`/nodes/${e}/pair-node`)}async getDefaultPrinter(e){let t=await this.db.table(`printers`).filter(t=>t.type===e&&t.deleted_at==null).toArray();return t.find(e=>!e.is_not_default)||t[0]||null}async getDefaultReceiptPrinter(){return this.getDefaultPrinter(z.ReceiptPrinter)}async getDefaultPrinterByType(e){return this.getDefaultPrinter(e)}async getDefaultKioskPrinter(){return this.getDefaultPrinter(z.KioskPrinter)}async getDefaultCheckPrinter(){return this.getDefaultPrinter(z.CheckPrinter)}async getDefaultKitchenPrinter(){return this.getDefaultPrinter(z.KitchenPrinter)}async getDefaultOrderPrinter(){return this.getDefaultPrinter(z.OrderPrinter)}async getPrintersByUids(e){return this.db.table(`printers`).where(`uid`).anyOf(e).filter(e=>e.deleted_at==null).toArray()}async searchPrinters(e=!1,t=9100){if(this.printersFromCache&&!e)return this.printersFromCache;let n=[],r=await d.getWiFiIPAddress();console.log(`ipAddress`,r);let i=r.subnet.split(`.`).map(Number),a=r.ip.split(`.`).map(Number);a[3]=0;let o=i.reduce((e,t,n)=>e+(t^255)*256**(3-n),0);for(let e=1;e<o;e++){let r=[...a],i=3,o=e;for(;o>0;){let e=o%256;for(o=Math.floor(o/256),r[i]+=e;r[i]>254&&i>0;)r[i]-=256,r[--i]++}let s=r.join(`.`);console.log(`ip`,s),await new Ne().connect(s,t,200)&&n.push(s)}return await this.configService.updateCache({printers:n}),n}async openCashDrawer(){let e=await this.getDefaultReceiptPrinter(),t=new L;t.items.push({type:I.OpenCashDrawer});let n=new V(e,t,!1,1);await this.printJobService.addOne(n)}};function q(e,t=2){let n=10**t;return Math.round(e*n)/n}function wn(e){let t=e.name,n=t.lastIndexOf(`.`);return n===-1||n===t.length-1?``:t.slice(n+1)}function Tn(e){return new Promise((t,n)=>{let r=new FileReader;r.onloadend=()=>{typeof r.result==`string`?t(r.result.split(`,`)[1]):n(Error(`Could not convert file to Base64.`))},r.onerror=()=>n(Error(`File reading failed.`)),r.readAsDataURL(e)})}const J=(e,t)=>e.replace(/([a-z])([A-Z])/g,`$1 $2`).replace(/[_\-\.]+/g,` `).toLowerCase().replace(/[\s]+(\w)/g,(e,n)=>t(n)),En=e=>e.replace(/^\W+|\W+$/g,``),Dn=e=>typeof e==`string`?J(e,e=>e.toUpperCase()):``,On=e=>typeof e==`string`?e.charAt(0).toUpperCase()+e.slice(1):``,kn=e=>typeof e==`string`?e.replace(/\w\S*/g,e=>On(e)):``,An=e=>typeof e==`string`?J(e,e=>`-`+e):``,jn=e=>typeof e==`string`?J(e,e=>`.`+e):``,Mn=e=>Nn(e),Nn=e=>typeof e==`string`?e.toLowerCase():``,Pn=e=>{if(typeof e!=`string`)return``;let t=J(e,e=>e.toUpperCase());return t.charAt(0).toUpperCase()+t.slice(1)},Fn=e=>typeof e==`string`?J(e,e=>`/`+e):``,In=e=>typeof e==`string`?e.replace(/((?:\S[^\.\?\!]*)[\.\?\!]*)/g,e=>e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()):``,Ln=e=>typeof e==`string`?J(e,e=>`_`+e):``,Rn=e=>typeof e==`string`?e.replace(/[- _]+/g,` `).split(` `).map(e=>On(e)).join(` `):``,zn=e=>Bn(e),Bn=e=>typeof e==`string`?e.toUpperCase():``,Vn=(e,t)=>typeof e==`string`&&typeof t==`string`?e+t:e,Hn=(e,t)=>{if(typeof e!=`string`)return``;let n=``;for(let e=0;e<t;e++)n+=`&nbsp;`;return n+e+n},Un=e=>typeof e==`string`?En(e):``,Wn=e=>typeof e==`string`?e.split(` `).join(`-`):``,Gn=(e,t=` `)=>typeof e==`string`?(typeof t!=`string`&&(t=` `),e.split(t).join(`+`)):``,Kn=(e,t)=>typeof e==`string`&&typeof t==`string`?t+e:e,qn=(e,t)=>typeof e==`string`?typeof t==`string`?e.split(t).join(``):e:``,Jn=(e,t)=>typeof e==`string`?typeof t==`string`?e.replace(t,``):e:``,Yn=(e,t,n)=>typeof e==`string`?typeof t==`string`?(typeof n!=`string`&&(n=``),e.split(t).join(n)):e:``,Xn=(e,t,n)=>typeof e==`string`?typeof t==`string`?(typeof n!=`string`&&(n=``),e.replace(t,n)):e:``,Zn=e=>typeof e==`string`?e.split(``).reverse().join(``):``,Qn=(e,t=`,`)=>typeof e==`string`?(typeof t!=`string`&&(t=`,`),e.split(t)):[],$n=(e,t)=>typeof e==`string`?e.length<=t?e:rr(e,t)+`…`:``,er=e=>typeof e==`string`?e.trim():``,tr=e=>typeof e==`string`?e.replace(/^\s+/,``):``,nr=e=>typeof e==`string`?e.replace(/\s+$/,``):``,rr=(e,t,n=``)=>typeof e==`string`?(typeof n!=`string`&&(n=``),e.length>t?e.slice(0,t-n.length)+n:e):``;var ir={camelcase:Dn,capitalize:On,capitalizeAll:kn,dashcase:An,dotcase:jn,downcase:Mn,lowercase:Nn,pascalcase:Pn,pathcase:Fn,sentence:In,snakecase:Ln,titleize:Rn,upcase:zn,uppercase:Bn,append:Vn,center:Hn,chop:Un,hyphenate:Wn,plusify:Gn,prepend:Kn,remove:qn,removeFirst:Jn,replace:Yn,replaceFirst:Xn,reverse:Zn,split:Qn,ellipsis:$n,trim:er,trimLeft:tr,trimRight:nr,truncate:rr,truncateWords:(e,t,n=`…`)=>{if(typeof e==`string`&&typeof t==`number`){typeof n!=`string`&&(n=`…`);let r=e.split(/[ \t]/);return(t>r.length?r:r.slice(0,t)).join(` `).trim()+n}return``},isString:e=>typeof e==`string`,occurrences:(e,t)=>{if(typeof e!=`string`)return 0;let n=t.length,r=0,i=0;for(;(r=e.indexOf(t,r))>-1;)i++,r+=n;return i}};const ar=e=>e&&typeof e==`object`&&typeof e.fn==`function`,Y=(e,t,n)=>ar(n)?e?n.fn?n.fn(t):!0:n.inverse?n.inverse(t):!1:e,or=function(...e){let t=e.pop();return Y(e.every(e=>!!e),this,t)},sr=function(...e){let t=e.pop();return Y(e.some(e=>!!e),this,t)},cr=function(e,t){return Y(!e,this,t)},lr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),Y(e===t,this,n)},ur=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),Y(e==t,this,n)},dr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),Y(e!==t,this,n)},fr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),Y(e!=t,this,n)},pr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),Y(e>t,this,n)},mr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),Y(e>=t,this,n)},hr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),Y(e<t,this,n)},gr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),Y(e<=t,this,n)},_r=function(e,t,n,r){if(arguments.length<4)throw Error(`Helper {{compare}} expects 4 arguments`);let i;switch(t){case`==`:i=e==n;break;case`===`:i=e===n;break;case`!=`:i=e!=n;break;case`!==`:i=e!==n;break;case`<`:i=e<n;break;case`>`:i=e>n;break;case`<=`:i=e<=n;break;case`>=`:i=e>=n;break;case`typeof`:i=typeof e===n;break;default:throw Error(`Helper {{compare}}: invalid operator: \`${t}\``)}return Y(i,this,r)},vr=function(e,t,n){return typeof n==`number`&&(n=arguments[3]),Y(e==null?!1:Array.isArray(e)||typeof e==`string`?e.includes(t):typeof e==`object`?t in e:!1,this,n)},yr=vr,br=function(e,...t){let n=t.pop();return Y(t.includes(e),this,n)},xr=(e,t)=>{if(!(!e||!t))return t.split(`.`).reduce((e,t)=>e?.[t],e)},Sr=e=>{let t=[];for(let n=0;n<e.length-1;n+=2)typeof e[n]==`string`&&!ar(e[n+1])&&t.push({prop:e[n],value:e[n+1]});return t};var Cr={and:or,or:sr,not:cr,eq:lr,is:ur,neq:dr,isnt:fr,gt:pr,gte:mr,lt:hr,lte:gr,compare:_r,contains:vr,includes:yr,in:br,findAnd:function(e,...t){if(!Array.isArray(e))return null;let n=Sr(t);return e.find(e=>n.every(t=>xr(e,t.prop)===t.value))||null},findOr:function(e,...t){if(!Array.isArray(e))return null;let n=Sr(t);return e.find(e=>n.some(t=>xr(e,t.prop)===t.value))||null},filterAnd:function(e,...t){if(!Array.isArray(e))return[];let n=Sr(t);return e.filter(e=>n.every(t=>xr(e,t.prop)===t.value))},filterOr:function(e,...t){if(!Array.isArray(e))return[];let n=Sr(t);return e.filter(e=>n.some(t=>xr(e,t.prop)===t.value))},default:function(...e){for(let t=0;t<e.length-1;t++)if(e[t]!=null)return e[t];return``},neither:function(e,t,n){return Y(!e&&!t,this,n)},ifEven:function(e,t){return Y(e%2==0,this,t)},ifOdd:function(e,t){return Y(e%2!=0,this,t)},ifNth:function(e,t,n){return Y(typeof e==`number`&&typeof t==`number`&&t%e===0,this,n)}};function wr(e){let t=e?.handlebars||e?.hbs||h(`handlebars`);return Object.keys(ir).forEach(e=>{t.registerHelper(e,ir[e])}),Object.keys(Cr).forEach(e=>{t.registerHelper(e,Cr[e])}),t.helpers}var Tr=wr,Er=class extends T{constructor(){super(),y(this,`uid`,D.OrderDisplaySystem+t()),y(this,`order_number`,``),y(this,`status`,X.Preparing)}};let X=function(e){return e.Preparing=`preparing`,e.ReadyForPickup=`ready_for_pickup`,e}({});var Dr=class extends K{constructor(e,t,n,r=`order_displays`,i=`order_display`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async toPickUp(e){let t=await this.getOne(e);if(!t)throw new O(`Display order not found`);if(t.status==`ready_for_pickup`)throw new O(`Order is already ready for pickup`);if(t.status=X.ReadyForPickup,t.updated_at=new Date,t.id_in_server==0)throw new O(`Order is not synced with server`);return await this.updateOne(t.id_in_server,t),t}async toPreparing(e){let t=await this.getOne(e);if(!t)throw new O(`Display order not found`);if(t.status==`preparing`)throw new O(`Order is already preparing`);if(t.status=X.Preparing,t.updated_at=new Date,t.id_in_server==0)throw new O(`Order is not synced with server`);return await this.updateOne(t.id_in_server,t),t}async undo(){let e=await this.db.table(this.moduleName).filter(e=>e.status==X.ReadyForPickup).reverse().limit(100).toArray();if(e.length===0)throw new O(`No order to undo`);e.sort((e,t)=>{let n=new Date(e.updated_at).getTime();return new Date(t.updated_at).getTime()-n});let t=e[0];if(t.status=X.Preparing,t.updated_at=new Date,t.id_in_server==0)throw new O(`Order is not synced with server`);return await this.updateOne(t.id_in_server,t),t}};Tr({handlebars:f});const Or={quantity:1,price:0,remark:``};var kr=class extends K{constructor(e,t,n,r=`invoices`,i=`invoice`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i,y(this,`tillService`,void 0),y(this,`sectionItemService`,void 0),y(this,`configService`,void 0),y(this,`printTemplateService`,void 0),y(this,`printerService`,void 0),y(this,`printJobService`,void 0),y(this,`itemService`,void 0),y(this,`orderDisplayService`,void 0),this.tillService=new Hr(e,t,n,`tills`,`till`),this.sectionItemService=new zr(e,t,n,`section_items`,`section_item`),this.configService=new Lr(e,t,n,`configs`,`config`),this.printTemplateService=new Yr(e,t,n,`print_templates`,`print_template`),this.printerService=new Cn(e,t,n,`printers`,`printer`),this.printJobService=new qr(e,t,n,`print_jobs`,`print_job`),this.itemService=new Fr(e,t,n,`items`,`item`),this.orderDisplayService=new Dr(e,t,n)}calculate(e,t,n=!1){if(e.lines==null||e.lines.length<1)return this.resetInvoiceCalculations(e),e;if(this.calculateLines(e),this.calculatePointSubtotal(e),this.calculateInvoiceServiceChargeableSubtotal(e),e.discount_amount=0,this.calculateDiscount(e,G.AfterSubtotal),e.grand_total<0&&(e.grand_total=0,e.service_chargeable_subtotal=0),this.calculateInvoiceCharges(e,G.AfterSubtotal),e.subtotal>0&&e.discount_amount>0){let t=1-e.discount_amount/e.subtotal;e.service_chargeable_subtotal=q(Math.max(0,e.service_chargeable_subtotal*t),2)}else e.discount_amount>=e.subtotal&&(e.service_chargeable_subtotal=0);let r=t.config.charges.service_charge?t.config.charges.service_charge_rate:0;this.calculateServiceCharge(e,r),this.calculateDiscount(e,G.AfterServiceCharge),e.grand_total<0&&(e.grand_total=0),this.calculateInvoiceCharges(e,G.AfterServiceCharge);let i=t.config.tax.enabled?t.config.tax.rate:0;return this.calculateTax(e,i,t.config.tax.method),this.calculateDeliveryCharge(e),this.calculateCreditDeduction(e),n?e.rounding=0:this.calculateRounding(e,t.config.rounding.base,t.config.rounding.up,t.config.rounding.cashless,t.config.rounding.nearest),this.calculateDiscount(e,G.AfterGrantTotal),e.grand_total<0&&(e.grand_total=0),this.calculateInvoiceCharges(e,G.AfterGrantTotal),e.grand_total=q(e.grand_total),e.rewarded_credit_rate=t.config?.loyalty_program?.rewarded_credit_rate??0,this.calculateRewardCredit(e,0,t.config?.loyalty_program?.inclusive_service_charge,t.config?.loyalty_program?.inclusive_tax),this.calculateAddCredit(e),this.calculateAddPoint(e),e.rewarded_point_rate=t.config?.loyalty_program?.rewarded_point_rate??0,this.calculateRewardPoint(e,t.config?.loyalty_program?.rewarded_point_rate,t.config?.loyalty_program?.inclusive_service_charge,t.config?.loyalty_program?.inclusive_tax),e.grand_total<0&&(e.grand_total=0),this.calculateChangeAmount(e),e}calculateLines(e){e.subtotal=0,e.point_subtotal=0;let t=0;for(let n of e.lines)this.calculateLine(n),t+=n.subtotal,e.subtotal+=q(n.subtotal,2),e.point_subtotal+=n.point_subtotal;e.subtotal=q(t,2),e.grand_total=q(e.subtotal,2)}calculateLine(e){this.resetLineCalculations(e),e.point_subtotal=e.quantity*e.point;let t=0;e.modifiers&&(t=e.modifiers.reduce((e,t)=>e+t.price*t.quantity,0)),e.subtotal=e.subtotal_before_discount=q(e.quantity*(e.price+t),2),e.item.discountable&&(e.discount_amount>0||e.discount_percent>0)&&(e.discount_calc_type==W.Flat||(e.discount_amount=q(e.subtotal*e.discount_percent,2)),e.subtotal-=e.discount_amount),e.subtotal=q(e.subtotal,2)}calculatePointSubtotal(e){if(e.point_subtotal=0,!(e.lines==null||e.lines.length<1)){for(let t of e.lines)t.point_subtotal=t.quantity*t.point,e.point_subtotal+=t.point_subtotal;e.minus_point=e.point_subtotal}}calculateInvoiceServiceChargeableSubtotal(e){(e.lines==null||e.lines.length<1)&&(e.service_chargeable_subtotal=0),e.service_chargeable_subtotal=q(q(e.lines.filter(e=>!e.is_take_out&&!e.item.is_service_charge_exempt).reduce((e,t)=>e+t.subtotal,0)),2)}calculateDiscount(e,t){if(!e?.lines?.length)return;let n=0;if(e.discountable_subtotal=q(e.lines.filter(e=>e.item.discountable).reduce((e,t)=>e+t.subtotal,0),2),e.discounts?.length){for(let r of e.discounts.filter(e=>e.calc_flow==t))if(!r.applying_item_uids?.length)r.calc_type==W.Flat?n+=r.amount:(r.percent_amount=q((e.discountable_subtotal-e.discount_amount-n)*r.percent),n+=r.percent_amount);else{let t=0,i=!1;for(let n of e.lines)r.applying_item_uids.includes(n.item_uid)&&n.price>t&&(t=n.price,i=!0);if(!i){e.discounts=e.discounts.filter(e=>e.uid!=r.uid);continue}r.calc_type==W.Flat?(r.amount=q(r.amount>t?t:r.amount),n+=r.amount):(r.percent_amount=q(t*r.percent),n+=r.percent_amount)}e.discount_amount+=q(n),e.grand_total=q(e.grand_total-n)}}calculateRounding(e,t,n,r,i){if(e.rounding=0,!t||!r&&!e.payment_has_cash)return;let a=(e.payments?.filter(e=>!e.payment_method?.is_cash)||[]).reduce((e,t)=>e+t.tender_amount-t.change_amount,0),o=a>0?e.grand_total-a:e.grand_total;e.rounding=q(this.roundingStep(o,t,n,i)),e.grand_total+=e.rounding}roundingStep(e,t,n,r){let i=Math.round(e*100),a=Math.round(t*100),o=i%a;if(o===0)return 0;let s;return s=r?o>=a/2?a-o:-o:n?a-o:-o,q(s/100)}calculateDeliveryCharge(e){e.delivery_charge>0&&e.type===ct.Delivery&&(e.grand_total+=e.delivery_charge,e.grand_total=q(e.grand_total,2))}calculateServiceCharge(e,t){let n=0;e.service_charge=0,!(e.lines==null||e.lines.length<1)&&(e.type==ct.Delivery||e.type==ct.TakeOut||(t>0&&(n=e.service_chargeable_subtotal*(t/100)),e.service_charge=q(n,2),e.grand_total+=e.service_charge,e.grand_total=q(e.grand_total,2)))}calculateTax(e,t,n){if(e.tax=0,t<=0)return;let r=this.calculateTaxSubtotalRatio(e),i=e.grand_total-e.service_charge;n===ut.Inclusive?e.tax=q(i*r*t/(100+t)+e.service_charge*t/(100+t),2):(e.tax=q(i*r*t/100+e.service_charge*t/100,2),e.grand_total=q(e.grand_total+e.tax,2))}calculateCreditDeduction(e){e.minus_credit>0&&(e.minus_credit>e.grand_total&&(e.minus_credit=e.grand_total),e.grand_total-=e.minus_credit)}calculateTaxSubtotalRatio(e){let t=1;return!e.lines||!e.lines.some(e=>e.item.is_tax_exempt)||e.grand_total===0||e.subtotal===0||(t=1-e.lines.filter(e=>e.item.is_tax_exempt).reduce((e,t)=>e+t.subtotal,0)/e.subtotal),t}calculateRewardCredit(e,t,n,r){if(e.rewarded_credit=0,e.grand_total<=0||t>0&&t>e.grand_total)return;let i=e.rewarded_credit_rate,a=e.grand_total;n||(a-=e.service_charge),r||(a-=e.tax),a-=e.lines.filter(e=>e.item.is_credit_reward_exempt).reduce((e,t)=>e+t.subtotal,0),e.rewarded_credit=q(a*i,2)}calculateAddCredit(e){let t=0;if(e.add_credit=0,!(!e.lines||e.lines.length<=0)){for(let n of e.lines.filter(e=>e.item.add_credit>0))t+=n.item.add_credit*n.quantity;e.add_credit=t}}calculateAddPoint(e){let t=0;if(e.add_point=0,!(!e.lines||e.lines.length<=0)){for(let n of e.lines.filter(e=>e.item.add_point>0))t+=n.item.add_point*n.quantity;e.add_point=t}}calculateRewardPoint(e,t,n,r){if(e.rewarded_point=0,e.rewarded_point_rate<=0||e.grand_total<=0)return;let i=e.grand_total;n||(i-=e.service_charge),r||(i-=e.tax),i-=e.lines.filter(e=>e.item.is_point_reward_exempt).reduce((e,t)=>e+t.subtotal,0),e.rewarded_point=Math.floor(i*e.rewarded_point_rate)}calculateDiscountFromTargetTotal(e,t,n){if(this.calculate(e,n),t>=e.grand_total)return 0;let r=n.config.rounding.base||.01,i=0,a=e.grand_total-t+r*10;for(;a-i>r/2;){let r=q((i+a)/2,2);if(r===i||r===a)break;let o=s.cloneDeep(e);o.discounts||(o.discounts=[]),o.discounts.push({...new _t,calc_type:W.Flat,calc_flow:G.AfterServiceCharge,amount:r}),this.calculate(o,n),o.grand_total<=t?a=r:i=r}let o=s.cloneDeep(e);if(o.discounts=[...o.discounts||[],{...new _t,calc_type:W.Flat,calc_flow:G.AfterServiceCharge,amount:a}],this.calculate(o,n),o.grand_total>t)throw Error(`Target grand total ${t} is unreachable`);return q(a,2)}resetInvoiceCalculations(e){e.subtotal=0,e.point_subtotal=0,e.service_chargeable_subtotal=0,e.service_charge=0,e.tax=0,e.grand_total=0,e.rounding=0,e.discount_amount=0,e.minus_credit=0,e.rewarded_credit=0,e.rewarded_point=0,e.add_credit=0,e.add_point=0,e.charges&&e.charges.length>0&&e.charges.forEach(e=>{e.amount=0})}resetLineCalculations(e){e.subtotal=0,e.subtotal_before_discount=0,e.point_subtotal=0}calculateChangeAmount(e){if(e.payments.length<=0||e.payments.every(e=>!e.payment_method.is_cash))return;let t=q(e.payments.reduce((e,t)=>e+t.tender_amount,0)-e.grand_total);e.payments.filter(e=>e.payment_method.is_cash);let n=e.payments.filter(e=>e.payment_method.is_cash);n.forEach(e=>e.change_amount=0);let r=n[n.length-1];r.change_amount=q(t)}calculateInvoiceCharges(e,t){if(!(!e.charges||e.charges.length===0))for(let n of e.charges.filter(e=>e.calc_flow===t)){let t=0;switch(n.calc_flow){case G.AfterSubtotal:t=e.subtotal;break;case G.AfterServiceCharge:t=e.subtotal+e.service_charge;break;case G.AfterGrantTotal:t=e.grand_total;break;default:t=e.subtotal}n.percentage>0&&(n.amount=q(t*(n.percentage/100),2)),e.grand_total+=n.amount,e.grand_total=q(e.grand_total,2)}}},Ar=class extends kr{addItemToLine(e,n,r,i,a,o,s,c,l){let u={...Or,...o};e.lines??(e.lines=[]);let d=this.findOrCreateLine(e,i,u.quantity,u.price,a,u.remark,s,c,l);return i.type==P.Combo&&(d.is_combo=!0),d.uid?(d.quantity+=u.quantity,d.quantity<=0&&(e.lines=e.lines.filter(e=>e.uid!==d.uid))):u.quantity>0&&(d.uid=D.InvoiceLine+t(),e.lines.push(d)),d}duplicateLine(e,n){let r=s.cloneDeep(n);r.is_duplicate=!0,r.duplicated_from_uid=n.uid,r.uid=D.InvoiceLine+t(),e.lines.push(r);for(let i of this.getAttachedLines(e,n.uid)){let n=s.cloneDeep(i);n.uid=D.InvoiceLine+t(),n.attached_to_line_uid=r.uid,e.lines.push(n)}return e}addAttachedItemsToLine(e,t,n,r,i){if(!n?.length)return[];let a=[];for(let o of n){let n=this.addItemToLine(e,r,i,o,[],{quantity:t.quantity},!0);n.attached_to_line_uid=t.uid,a.push(n)}return a}getAttachedLines(e,t){return e.lines?.filter(e=>e.attached_to_line_uid===t)||[]}calibrateDuplicates(e){if(!e.lines||e.lines.length<=0)return e;let t=e.lines.filter(e=>e.is_duplicate);for(let n of t){let t=e.lines.find(e=>e.uid===n.duplicated_from_uid&&!e.is_duplicate);t&&this.compareLines(t,n)?(t.quantity+=n.quantity,t.sent+=n.sent,e.lines=e.lines.filter(e=>e!==n)):n.is_duplicate=!1}return e}toInvoiceCoreLine(e,t=1){let n=new vt;return n.item=s.cloneDeep(e),n.item_uid=e.uid,n.quantity=t,n.price=e.price,n}addModifier(e,t){if(!e||e.length<=0)return[t];{let n=e.findIndex(e=>e.item_uid===t.item_uid&&e.price===t.price);return n<0?e.push(t):e[n].quantity+=t.quantity,e}}changeLinePrice(e,t){return e==null||(e.price=t),e}changeLineDiscount(e,t,n){if(e==null)return e;if(t==W.Percent&&n>100)throw new O(`Discount percent can not be more than 100%`);if(t==W.Flat&&n>e.subtotal)throw new O(`Discount amount can not be more than price`);return e.discount_calc_type=t,t==W.Flat?e.discount_amount=n:e.discount_percent=n,e}minusLineQuantity(e,t,n,r=!1){if(n<=0)throw new O(`Quantity can not be less than 0, input a positive quantity to minus the line quantity`);if(e.lines==null||e.lines.length<=0)return e;if(!t)throw new O(`Line can not be null or empty`);if(t.quantity-t.sent<Math.abs(n)){let i=Math.abs(n)-(t.quantity-t.sent),a=s.cloneDeep(t);a.quantity=i,a.sent=i,r||e.deleted_lines.push(a),t.sent-=i}t.quantity<=n&&(e.lines=e.lines.filter(e=>e.uid!==t.uid)),t.quantity-=n;let i=this.getAttachedLines(e,t.uid);if(t.quantity<=0){let t=new Set(i.map(e=>e.uid));e.lines=e.lines.filter(e=>!t.has(e.uid))}else for(let e of i)e.quantity=t.quantity}addLineQuantity(e,t,n){if(e.lines==null||e.lines.length<=0)return e;t.quantity+=n;for(let n of this.getAttachedLines(e,t.uid))n.quantity=t.quantity}minusModifierQuantity(e,t,n=0){if(!e||e.length<=0)return e;{n=n??0;let r=e.findIndex(e=>e.item_uid===t.item_uid&&e.price===t.price);return r<0||(e[r].quantity<=n?e.splice(r,1):e[r].quantity-=n),e}}changeModifierQuantity(e,t,n){if(!e||e.length<=0)return e;n=n??0;let r=e.findIndex(e=>e.item_uid===t.item_uid&&e.price===t.price);return r<0?e:(e[r].quantity+=n,e[r].quantity<=0&&e.splice(r,1),e)}addModifierQuantity(e,t,n=0){if(!e||e.length<=0)return e;{n=n??0;let r=e.findIndex(e=>e.item_uid===t.item_uid&&e.price===t.price);return r<0||(e[r].quantity+=n),e}}changeModifierPrice(e,t){return e&&(e.price=t,e)}overwriteNoteToLine(e,t){return t&&(e.remark=t),e}findOrCreateLine(e,t,n,r=0,i=[],a=``,o=!1,s,c){if(r=r??t.price,!e.lines||e.lines.length<=0||o)return this.createInvoiceLine(t,n,r,i,a);{let o=e.lines.filter(e=>e.item_uid===t.uid);if(!o||o.length<=0)return this.createInvoiceLine(t,n,r,i,a);if(s&&c){for(let e of o)if(e.is_combo_item&&this.compareModifiers(e.modifiers,i)&&e.remark===a&&e.price===r&&e.combo_line_uid===s&&e.combo_group_uid===c)return e}else for(let e of o)if(!e.is_combo_item&&this.compareModifiers(e.modifiers,i)&&e.remark===a&&e.price===r&&!e.is_take_out)return e;return this.createInvoiceLine(t,n,r,i,a)}}createInvoiceLine(e,t,n=0,r=[],i=``){let a=new yt;return a.item=s.cloneDeep(e),a.item_uid=e.uid,a.quantity=t,a.point=e.minus_point,a.price=n??e.price,a.quantity=t,a.modifiers=r,a.remark=i,a}compareModifiers(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.some(e=>e.item_uid===n.item_uid&&e.price===n.price&&e.quantity===n.quantity))return!1;return!0}compareLines(e,t){return!(e.remark!=t.remark||e.price!=t.price||e.is_take_out!=t.is_take_out||e.discount_calc_type!=t.discount_calc_type||e.discount_amount!=t.discount_amount||e.discount_percent!=t.discount_percent||!this.compareModifiers(e.modifiers,t.modifiers))}addComboItemToLine(e,t,n,r,i,a,o,s){let c=this.addItemToLine(e,t,n,r,o,s,!1,i,a);return c.is_combo_item=!0,c.combo_line_uid=i,c.combo_group_uid=a,c}removeAllComboItems(e,t,n=!1){if(!e.lines||e.lines.length==0)return[];let r=e.lines.filter(e=>e.combo_line_uid==t&&e.is_combo_item);return e.lines=s.differenceBy(e.lines,r,`uid`),n||e.deleted_lines.push(...r),r}duplicateComboLines(e,n){if(!n.is_combo)throw new O(`Line is not a combo`);let r=s.cloneDeep(n);return r.uid=D.InvoiceLine+t(),r.is_duplicate=!0,r.duplicated_from_uid=n.uid,e.lines.push(r),e.lines.filter(e=>e.combo_line_uid===n.uid&&e.is_combo_item).forEach(n=>{let i=s.cloneDeep(n);i.uid=D.InvoiceLine+t(),i.combo_line_uid=r.uid,i.is_duplicate=!0,e.lines.push(i)}),e}},jr=class extends Ar{async addInvoice(e){let t=await this.http.put(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/add_invoice`,e);if(t.error==k.outdatedInvoice)throw await this.saveOne(t.data),new O(t.error);if(t.error)throw new O(t.error);return t.data}async createInvoice(e,t,n){e.status=U.Open,e.ref_id||(e.ref_id=await this.getRefId()),e.call_num||(e.call_num=e.ref_id.slice(-3)),e.table_name=t.name,e.table_uid=t.uid,t.invoice_uid=e.uid,t.status=N.OPENED,this.sectionItemService.syncInvoiceData(t,e),this.addEmployeeToInvoice(e,n),e.created_at=new Date,e.created_at_timestamp=e.created_at.getTime();let r=(await this.configService.getDefaultOne()).config?.order?.datetime_format;e.humanized_created_at=R(e.created_at,r),t.invoice_created_at=new Date;let i=await this.createKitchenPrintJobs(e),a=await this.createLabelPrintJobs(e),o=await this.createOrderPrintJobs(e),s=this.sortPrintJobsByPrinterSequence([...i,...a,...o]);e.kitchen_print_job_uids||(e.kitchen_print_job_uids=[]),e.label_print_job_uids||(e.label_print_job_uids=[]);let c=e.kitchen_print_job_uids.length,l=e.label_print_job_uids.length,u=i.map(e=>e.uid),d=a.map(e=>e.uid);u.length>0&&e.kitchen_print_job_uids.push(u),d.length>0&&e.label_print_job_uids.push(d),await this.preprocessInvoice(e);let f={invoice:e,section_item:t};s.length>0&&(f.print_jobs=s);try{let e=await this.http.put(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/${this.methodName}`,f);if(e.error==k.outdatedInvoice)throw await this.saveOne(e.data),f.invoice=e.data,new O(e.error);if(e.error==k.outdatedSectionItem)throw await this.sectionItemService.saveOne(e.data),f.section_item=e.data,new O(e.error);return f}catch(t){throw e.kitchen_print_job_uids.length=c,e.label_print_job_uids.length=l,t}}async updateInvoice(e,t,n){this.sectionItemService.syncInvoiceData(t,e),this.addEmployeeToInvoice(e,n),e.updated_at=new Date;let r=await this.createKitchenPrintJobs(e),i=await this.createCancelKitchenPrintJobs(e,e.deleted_lines),a=await this.createLabelPrintJobs(e),o=await this.createOrderPrintJobs(e),s=this.sortPrintJobsByPrinterSequence([...r,...i,...a,...o]);e.kitchen_print_job_uids||(e.kitchen_print_job_uids=[]),e.label_print_job_uids||(e.label_print_job_uids=[]);let c=e.kitchen_print_job_uids.length,l=e.label_print_job_uids.length,u=r.map(e=>e.uid),d=a.map(e=>e.uid);u.length>0&&e.kitchen_print_job_uids.push(u),d.length>0&&e.label_print_job_uids.push(d),await this.preprocessInvoice(e);let f={invoice:e,section_item:t};s.length>0&&(f.print_jobs=s);try{let e=await this.http.patch(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/update_invoice`,f);if(e.error==k.outdatedInvoice)throw await this.saveOne(e.data),new O(`${e.error}, system has updated the data, please try again`);if(e.error==k.outdatedSectionItem)throw await this.sectionItemService.saveOne(e.data),f.section_item=e.data,new O(`${e.error}, system has updated the data, please try again`);return f}catch(t){throw e.kitchen_print_job_uids.length=c,e.label_print_job_uids.length=l,t}}async cancelInvoice(e,t,n){if(e.id_in_server==0&&e.lines.length<=0)throw new O(`The invoice is empty and nothing can be canceled.`);if(e.id_in_server==0)return e.lines=[],{invoice:e,section_item:t};e.status=U.Void,t.invoice_uid=``,t.status=N.CLOSED,this.sectionItemService.reset(t),this.addEmployeeToInvoice(e,n);let r=await this.createReceiptPrintJob(e,z.ReceiptPrinter,!0),i={invoice:e,section_item:t};r&&(i.print_jobs=[r]);let a=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/cancel_invoice`,i);if(a.error==k.outdatedInvoice)throw await this.saveOne(a.data),i.invoice=a.data,new O(a.error);if(a.error==k.outdatedSectionItem)throw await this.sectionItemService.saveOne(a.data),i.section_item=a.data,new O(a.error);return i}async checkInvoice(e,t,n,r){t.status=N.PAYMENT,this.addEmployeeToInvoice(e,n);let i=await this.createReceiptPrintJob(e,z.CheckPrinter,!1,0,r),a=await this.createLabelPrintJobs(e),o=await this.createKitchenPrintJobs(e),s=await this.createOrderPrintJobs(e),c=[...a,...o,...s];i&&c.push(i);let l=this.sortPrintJobsByPrinterSequence(c);e.kitchen_print_job_uids||(e.kitchen_print_job_uids=[]),e.label_print_job_uids||(e.label_print_job_uids=[]);let u=e.kitchen_print_job_uids.length,d=e.label_print_job_uids.length,f=o.map(e=>e.uid),p=a.map(e=>e.uid);f.length>0&&e.kitchen_print_job_uids.push(f),p.length>0&&e.label_print_job_uids.push(p),await this.preprocessInvoice(e);let m={invoice:e,section_item:t};l.length>0&&(m.print_jobs=l);try{let e=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/check_invoice`,m);if(e.error==k.outdatedInvoice)throw await this.saveOne(e.data),m.invoice=e.data,new O(e.error);if(e.error==k.outdatedSectionItem)throw await this.sectionItemService.saveOne(e.data),m.section_item=e.data,new O(e.error);return m}catch(t){throw e.kitchen_print_job_uids.length=u,e.label_print_job_uids.length=d,t}}async switchInvoice(e,t,n,r){if(t.uid==n.uid)throw new O(`source and target table can not be the same`);if(t.status!=N.CLOSED)throw new O(`target table is occupied`);if(e.lines==null||e.lines.length<=0)throw new O(`source table has nothing to switch`);t.invoice_uid=e.uid,t.status=n.status,this.sectionItemService.syncInvoiceData(t,e),n.invoice_uid=``,n.status=N.CLOSED,this.sectionItemService.reset(n),e.table_uid=t.uid,e.table_name=t.name,this.addEmployeeToInvoice(e,r);let i={invoice:e,target_section_item:t,source_section_item:n},a=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/switch_invoice`,i);if(a.error==k.outdatedInvoice)throw await this.saveOne(a.data),i.invoice=a.data,new O(a.error);if(a.error==k.outdatedSourceSectionItem)throw await this.sectionItemService.saveOne(a.data),i.source_section_item=a.data,new O(a.error);if(a.error==k.outdatedTargetSectionItem)throw await this.sectionItemService.saveOne(a.data),i.target_section_item=a.data,new O(a.error);return i}async payInvoice(e,t,n,r,i){e.status=U.Paid,t.invoice_uid=``,t.status=N.CLOSED,this.sectionItemService.reset(t),this.addEmployeeToInvoice(e,r),e.paid_at=new Date;let a=(await this.configService.getDefaultOne()).config,o=a?.order?.datetime_format;e.humanized_paid_at=R(e.paid_at,o),e.payment_has_cash=e.payments?.some(e=>e.payment_method?.is_cash===!0);let s=await this.getStockChangeList(e,!1),c=await this.createLabelPrintJobs(e),l=await this.createReceiptPrintJob(e,z.ReceiptPrinter,!1,0,i),u=await this.createKitchenPrintJobs(e),d=await this.createCancelKitchenPrintJobs(e,e.deleted_lines),f=await this.createOrderPrintJobs(e),p=[...c,...u,...d,...f];l&&p.push(l);let m=this.sortPrintJobsByPrinterSequence(p);e.kitchen_print_job_uids||(e.kitchen_print_job_uids=[]),e.label_print_job_uids||(e.label_print_job_uids=[]);let h=e.kitchen_print_job_uids.length,g=e.label_print_job_uids.length,_=u.map(e=>e.uid),v=c.map(e=>e.uid);_.length>0&&e.kitchen_print_job_uids.push(_),v.length>0&&e.label_print_job_uids.push(v),await this.preprocessInvoice(e);let y={invoice:e,section_item:t,till:n};m.length>0&&(y.print_jobs=m);try{let t=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/pay_invoice`,y);if(t.error==k.outdatedInvoice)throw await this.saveOne(t.data),y.invoice=t.data,new O(`${t.error}, system has updated the data and please try again`);if(t.error==k.outdatedSectionItem)throw await this.sectionItemService.saveOne(t.data),y.section_item=t.data,new O(`${t.error}, system has updated the data and please try again`);if(s.length>0&&await this.itemService.changeItemsStock(s),e.call_num&&a?.ods?.enabled){let t=new Er;t.order_number=e.call_num,await this.orderDisplayService.addOne(t)}return y}catch(t){throw e.kitchen_print_job_uids.length=h,e.label_print_job_uids.length=g,t}}async directPayInvoice(e,t,n,r,i,a=!1){e.status=U.Paid,n!=null&&this.addEmployeeToInvoice(e,n),e.paid_at=new Date;let o=(await this.configService.getDefaultOne()).config,s=o?.order?.datetime_format;e.humanized_paid_at=R(e.paid_at,s),e.created_at=new Date,e.created_at_timestamp=e.created_at.getTime(),e.humanized_created_at=R(e.created_at,s),e.ref_id||(e.ref_id=await this.getRefId()),e.call_num||(e.call_num=e.ref_id.slice(-3)),e.payment_has_cash=e.payments?.some(e=>e.payment_method?.is_cash===!0);let c=await this.getStockChangeList(e,!1),l=null,u=null;if(r&&r.type==z.KioskPrinter){let t=!!o?.kiosk?.disable_receipt_printer_receipt;l=await this.createReceiptPrintJob(e,z.ReceiptPrinter,t),u=await this.createReceiptPrintJob(e,z.KioskPrinter,!1,0,r,i)}else l=await this.createReceiptPrintJob(e,z.ReceiptPrinter,!1,0,r);let d=await this.createLabelPrintJobs(e),f=await this.createKitchenPrintJobs(e,a),p=await this.createOrderPrintJobs(e),m=[...d,...f,...p];l&&m.push(l),u&&m.push(u);let h=this.sortPrintJobsByPrinterSequence(m),g=f.map(e=>e.uid),_=d.map(e=>e.uid);g.length>0&&(e.kitchen_print_job_uids=[g]),_.length>0&&(e.label_print_job_uids=[_]),await this.preprocessInvoice(e);let v={invoice:e,till:t};h.length>0&&(v.print_jobs=h);let y=await this.http.put(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/direct_pay_invoice`,v);if(y.error==k.outdatedInvoice)throw await this.saveOne(y.data),v.invoice=y.data,new O(y.error);if(c.length>0&&await this.itemService.changeItemsStock(c),e.call_num&&o?.ods?.enabled){let t=new Er;t.order_number=e.call_num,await this.orderDisplayService.addOne(t)}return v}async voidInvoice(e,t,n,r){n&&(e.etc.void_reason=n);let i=e.status;e.status=U.Void,e.voided_at=new Date;let a=(await this.configService.getDefaultOne()).config?.order?.datetime_format;e.humanized_voided_at=R(e.voided_at,a),t&&(t.deleted_at=new Date),this.addEmployeeToInvoice(e,r);let o=(await this.configService.getDefaultOne()).config,s=await this.createReceiptPrintJob(e,z.ReceiptPrinter,!0),c=[];o.kitchen.print_cancel_whole_invoice&&(c=await this.createCancelKitchenPrintJobs(e,e.lines)||[]);let l=[...c];s&&l.push(s);let u={invoice:e,till:t};l.length>0&&(u.print_jobs=l);let d=await this.tillService.db.table(`tills`).where({invoice_uid:e.uid}).toArray(),f=d.filter(e=>e.type===j.CashInvoice&&!e.deleted_at).reduce((e,t)=>e+t.amount,0);if(f>0){let t=new M;t.type=j.CashInvoice,t.amount=-f,t.invoice_uid=e.uid,t.shift_uid=d[0]?.shift_uid,t.user_uid=r?.uid||d[0]?.user_uid,u.till=t}if(e.table_uid){let t=await this.sectionItemService.getOne(e.table_uid);t.status!=N.CLOSED&&(t.invoice_uid=``,t.status=N.CLOSED,u.section_item=t)}let p=[];i==U.Paid&&(p=await this.getStockChangeList(e));let m=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/void_invoice`,u);if(m.error==k.outdatedInvoice)throw await this.saveOne(m.data),u.invoice=m.data,new O(m.error);return p.length>0&&await this.itemService.changeItemsStock(p),u}async duplicateInvoice(e,n){if(e.status!=U.Paid)throw new O(`invalid invoice status`);let r=s.cloneDeep(e);if(r.etc.is_duplicate=!0,r.etc.duplicated_from_uid=r.uid,r.uid=D.Invoice+t(),r.status=U.Open,r.ref_id=await this.getRefId(),this.addEmployeeToInvoice(r,n),r.lines)for(let e of r.lines)e.uid=D.InvoiceLine+t();if(r.payments)for(let e of r.payments)e.uid=D.Payment+t();return r}async reprintReceipt(e,n=!1,r){if(!e?.receipt_print_job_uid)throw new O(`The invoice does not have a receipt`);let i=await this.printJobService.getOne(e.receipt_print_job_uid);if(!i){let t=new p().addParam(`uid`,`EqualTo`,e.receipt_print_job_uid),n=await this.printJobService.autoquery(t);if(!n.results||n.results.length<=0)throw new O(`The invoice does not have a receipt`);i=n.results[0]}let a=r;if(a||(a=await this.printerService.getOne(i.printer_uid)),a||(a=await this.printerService.getDefaultReceiptPrinter()),!a)throw new O(`Receipt printer not found`);return i=this.printJobService.replacePrinter(i,a),i.uid=D.PrintJob+t(),i.save_only=n,i.status=Ye.Queued,i.print_times=1,i.printed=0,i.retries=0,i.created_at_timestamp=Date.now(),await this.printJobService.addOne(i),i}async printLastKitchenSlips(e){let n=await this.getOne(e);if(!n)throw new O(`Invoice not found`);let r=n.kitchen_print_job_uids?.[n.kitchen_print_job_uids.length-1]||[],i=n.label_print_job_uids?.[n.label_print_job_uids.length-1]||[],a=[...r,...i];if(a.length===0)throw new O(`No kitchen or label print found`);let o=new p().addParam(`uid`,`In`,a),s=await this.printJobService.autoquery(o);if(!s.results||s.results.length===0)throw new O(`Print jobs not found`);for(let e of s.results){let n=await this.printerService.getOne(e.printer_uid);if(!n)continue;let r=this.printJobService.replacePrinter(e,n),i=r.uid;r.uid=D.PrintJob+t(),r.save_only=!1,r.status=Ye.Queued,r.print_times=1,r.printed=0,r.retries=0,r.created_at_timestamp=Date.now(),r.meta||(r.meta={}),r.meta.is_reprint=!0,r.meta.parent_uid=i,await this.printJobService.addOne(r)}return!0}addInvoiceDiscount(e,t,n,r=G.AfterSubtotal,i=`custom`,a={}){if(e.discounts||(e.discounts=[]),t==W.Percent&&n>100)throw new O(`Discount percent can not be more than 100%`);let o=new _t;return o.calc_type=t,o.calc_flow=r,o.name=i,o.name_translation=a,t==W.Flat?o.amount=n:o.percent=n,e.discounts.push(o),e}addCouponToInvoice(e,t,n=G.AfterSubtotal){e.discounts||(e.discounts=[]);let r=new _t;if(r.calc_type=t.coupon.discount_calc_type==1?W.Flat:W.Percent,r.calc_flow=n,r.name=t.coupon.name,r.calc_type==W.Flat?r.amount=t.coupon.discount_amount:r.percent=t.coupon.discount_percent,r.coupon_uid=t.guid,t.coupon.applying_plus.applying_items?.length>0&&(r.applying_item_uids=t.coupon.applying_plus.applying_items,!e.lines||s.intersection(r.applying_item_uids,e.lines.map(e=>e.item_uid)).length===0))throw new O(`Coupon can not applied to any product in this order`);return e.discounts.push(r),e}removeInvoiceDiscount(e,t){return e.discounts&&(e.discounts=e.discounts.filter(e=>e.uid!==t)),e}overwriteNoteToInvoice(e,t){return t&&(e.remark=t),e}addSalesPersonToInvoice(e,t){return e.sales_user_uid=t,e}addPaxToInvoice(e,t){return e.pax=t,e}addCustomerToInvoice(e,t){if(!t)throw new O(`Customer object can not be null`);return e.customer_id=t.id,e.customer=s.cloneDeep(t),e}async autoQuery(e,t){return await this.http.get(`sapi/v5/merchants/${this.options.merchant_uid}/${this.moduleName}`,{params:e.build(),...t})}appendInvoice(e,t){if(e?.id_in_server==0)return t;for(let n of t.lines)if(n.is_combo||n.is_combo_item)n.quantity>0&&e.lines.push(n);else{let t=this.findOrCreateLine(e,n.item,n.quantity,n.price,n.modifiers,n.remark);t.uid?t.quantity+=n.quantity:n.quantity>0&&e.lines.push(n)}return t.remark&&(e.remark=t.remark),t.customer_id&&!e.customer_id&&(e.customer_id=t.customer_id),e}async mergeInvoice(e,t){if(t.lines?.length==0)throw new O(`Source invoice has no nothing to merge`);if(t.lines.some(e=>e.quantity!=e.sent))throw new O(`Please send first before merging`);if(!await this.getOne(e.uid))throw new O(`Target invoice not found`);if(!await this.getOne(t.uid))throw new O(`Source invoice not found`);if(e?.id_in_server==0)throw new O(`Target invoice is not synced to server`);if(t?.id_in_server==0)throw new O(`Source invoice is not synced to server`);for(let n of t.lines)if(n.is_combo||n.is_combo_item)n.quantity>0&&e.lines.push(n);else{let t=this.findOrCreateLine(e,n.item,n.quantity,n.price,n.modifiers,n.remark);t.uid?t.quantity+=n.quantity:n.quantity>0&&e.lines.push(n)}return e.customer_id||(e.customer_id=t.customer_id),e}async getRefId(){let e=(await this.configService.getDefaultOne()).config?.order?.ref_prefix||`01`,t=(await this.http.get(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/${this.methodName}/get_invoice_counter`)).data.toString().padStart(9,`0`);return`${e}${this.formatDate(new Date)}${t}`}async changePayments(e,t){if(e.status!=U.Paid)throw new O(`invalid invoice status`);if(!t||t.length<1)throw new O(`invalid options`);for(let n of t){let t=e.payments.find(e=>e.uid==n.source_payment.uid);if(!t)throw new O(`payment not found`);t.payment_method_uid=n.target_payment_method.uid,t.payment_method_code=n.target_payment_method.payment_method_code,t.payment_method_name=n.target_payment_method.name,t.payment_method=s.cloneDeep(n.target_payment_method),t.payment_method_history=s.cloneDeep(n.target_payment_method),t.payment_method_history.changed_at=new Date}return e.is_sales_exclusive=e.payments.some(e=>e.payment_method.is_sales_exclusive),e}formatDate(e){let t=e.getFullYear().toString().slice(-2),n=(e.getMonth()+1).toString().padStart(2,`0`),r=e.getDate().toString().padStart(2,`0`);return t+n+r}addEmployeeToInvoice(e,t){return t?(e.employee_uid=t.uid,e.employee_name=t.name,e):e}async createReceiptPrintJob(e,t,n=!1,r=0,i=null,a){let o;if(i)o=i;else if(t==z.ReceiptPrinter||t==z.CheckPrinter){let n=e.table_uid?await this.sectionItemService.getOne(e.table_uid):null,r=t==z.ReceiptPrinter?n?.receipt_printer_uid:n?.check_printer_uid;r&&(o=await this.printerService.getOne(r)),o||(o=t==z.ReceiptPrinter?await this.printerService.getDefaultReceiptPrinter():await this.printerService.getDefaultCheckPrinter())}if(!o||!o.print_template_uid)return null;r||(r=o.print_times);let s=await this.configService.getDefaultOne(),c=await this.printTemplateService.getOneByParams({uid:o.print_template_uid});if(!c)throw new O(`Print template not found`);t==z.ReceiptPrinter&&!s.config?.receipt?.enabled&&(n=!0);let l=await this.printTemplateService.renderPrintTemplate(e,s.config,c,{...new H,printer_name:o.name}),u=new V(o,l,n,r);return t!=z.ReceiptPrinter&&(u.printer_type=t),o.connection_type!=qe.ETHERNET&&(u.connection_type=o.connection_type),t==z.ReceiptPrinter&&(e.receipt_print_job_uid=u.uid),a&&(u.device_uid_to_print=a),u}sortLinesByItemSequence(e){return s.chain(e||[]).groupBy(e=>e.is_combo_item?e.combo_line_uid:e.uid).map(e=>s.sortBy(e,[e=>!e.is_combo,e=>e.item.printing_sequence||e.item.sequence||999999])).sortBy(e=>e[0].item.printing_sequence||e[0].item.sequence||999999).flatten().value()}getSortedLines(e,t){return t.disable_printing_sequence?e:this.sortLinesByItemSequence(e)}sortLineModifiers(e){for(let t of e){if(!t.modifiers?.length||!t.item.modifiers?.length)continue;let e=new Map(t.item.modifier_categories?.map(e=>[e.uid,e.printing_sequence??999999])),n=new Map(t.item.modifiers.map(e=>[e.uid,e]));t.modifiers.sort((t,r)=>{let i=n.get(t.item_uid),a=n.get(r.item_uid);return(e.get(i?.category_uid)??999999)-(e.get(a?.category_uid)??999999)||(i?.sequence??0)-(a?.sequence??0)})}}async createKitchenPrintJobs(e,t=!1){let n=(await this.configService.getDefaultOne()).config;if(!n.kitchen.enabled&&!t||e.lines.every(e=>e.sent==e.quantity))return[];let r=[],{lines:i,printerUids:a}=this.filterLinesAndPrintersToPrint(e.lines,z.KitchenPrinter),o=await this.printerService.getPrintersByUids(a);for(let t of o){let a=await this.printTemplateService.getOneByParams({uid:t.print_template_uid});if(!a)continue;let o=i.filter(e=>e.item.kitchen_printers_uids.includes(t.uid)),c=this.getSortedLines(o,t);this.sortLineModifiers(c);let l=s.cloneDeep(e);if(t.kitchen_itemized_print)for(let e of c){l.lines=[e];let i=new V(t,await this.printTemplateService.renderPrintTemplate(l,n,a,{...new H,printer_name:t.name}),!1,t.print_times);r.push(i)}else{l.lines=c;let e=new V(t,await this.printTemplateService.renderPrintTemplate(l,n,a,{...new H,printer_name:t.name}),!1,t.print_times);r.push(e)}}return r}async createOrderPrintJobs(e){let t=(await this.configService.getDefaultOne()).config;if(!t.receipt.print_docket||e.lines.every(e=>e.sent==e.quantity))return[];let n=[],{lines:r,printerUids:i}=this.filterLinesAndPrintersToPrint(e.lines,z.OrderPrinter),a=e.table_uid?await this.sectionItemService.getOne(e.table_uid):null,o=await this.printerService.getPrintersByUids(i);for(let i of o){if(a?.order_printer_uids?.length>0&&!a.order_printer_uids.includes(i.uid))continue;let o=await this.printTemplateService.getOneByParams({uid:i.print_template_uid});if(!o)continue;let c=r.filter(e=>e.item.order_printers_uids.includes(i.uid)),l=this.getSortedLines(c,i);this.sortLineModifiers(l);let u=s.cloneDeep(e);u.lines=l;let d=new V(i,await this.printTemplateService.renderPrintTemplate(u,t,o,{...new H,printer_name:i.name}),!1,i.print_times);n.push(d)}return n}async createLabelPrintJobs(e){let t=(await this.configService.getDefaultOne()).config;if(e.lines.every(e=>e.sent==e.quantity))return[];let n=[],{lines:r,printerUids:i}=this.filterLinesAndPrintersToPrint(e.lines,z.LabelPrinter);if(i.length==0||r.length==0)return[];let a=await this.printerService.getPrintersByUids(i),o=s.cloneDeep(e);this.sortLineModifiers(r);let c=r.length,l=1;for(let e of r)e.meta.total_index=c,e.meta.index=l,l++;for(let e of a)for(let i of r){if(!i.item.label_printers_uids.includes(e.uid))continue;let r=await this.printTemplateService.getOneByParams({uid:e.print_template_uid});if(!r||!r.commands)continue;let a=f.compile(r.commands);o.lines=[i];let s=a({invoice:o,config:t}),c=new V(e,new L,!1,e.print_times);c.commands=s,n.push(c)}return n}filterLinesAndPrintersToPrint(e,t){let n;switch(t){case z.KitchenPrinter:n=`kitchen_printers_uids`;break;case z.OrderPrinter:n=`order_printers_uids`;break;case z.LabelPrinter:n=`label_printers_uids`;break;default:n=`kitchen_printers_uids`}let r=[],i=new Set;for(let a of e)if(a.quantity<=a.sent)continue;else if(!a.item[n]||a.item[n].length==0)continue;else{a.item[n].forEach(e=>i.add(e));let e=s.cloneDeep(a);if(e.quantity-=e.sent,t==z.LabelPrinter)for(let t=0;t<e.quantity;t++){let t=s.cloneDeep(e);t.quantity=1,r.push(t)}else r.push(e)}return{lines:r,printerUids:Array.from(i)}}filterDeletedLinesForCancelPrint(e){let t=[],n=new Set;for(let r of e){if(r.is_cancel_printed||!r.item.kitchen_printers_uids||r.item.kitchen_printers_uids.length==0)continue;r.item.kitchen_printers_uids.forEach(e=>n.add(e));let e=s.cloneDeep(r);t.push(e)}return{lines:t,printerUids:Array.from(n)}}async createCancelKitchenPrintJobs(e,t){let n=(await this.configService.getDefaultOne()).config;if(!n.kitchen.print_cancel_slip||!t||t.length===0)return[];let{lines:r,printerUids:i}=this.filterDeletedLinesForCancelPrint(t);if(r.length===0)return[];let a=await this.printerService.getPrintersByUids(i),o=[];for(let t of a){let i=await this.printTemplateService.getOneByParams({uid:t.print_template_uid});if(!i)continue;let a=r.filter(e=>e.item.kitchen_printers_uids.includes(t.uid)),c=this.getSortedLines(a,t);this.sortLineModifiers(c);let l=s.cloneDeep(e);if(t.kitchen_itemized_print)for(let e of c){l.lines=[e];let r=new V(t,await this.printTemplateService.renderPrintTemplate(l,n,i,{printer_name:t.name,kitchen_itemized_print:t.kitchen_itemized_print,is_cancel:!0}),!1,t.print_times);o.push(r)}else{l.lines=c;let e=new V(t,await this.printTemplateService.renderPrintTemplate(l,n,i,{printer_name:t.name,kitchen_itemized_print:t.kitchen_itemized_print,is_cancel:!0}),!1,t.print_times);o.push(e)}}for(let t of e.deleted_lines)t.is_cancel_printed=!0;return o}sortPrintJobsByPrinterSequence(e){return e.sort((e,t)=>(e?.print_sequence??999)-(t?.print_sequence??999))}async preprocessInvoice(e){if(e.lines)for(let t of e.lines)t.sent=t.quantity;return e}addInvoiceCharge(e,t,n,r,i=G.AfterSubtotal){e.charges||(e.charges=[]);let a=new mt;return a.name=t,a.percentage=n,a.amount=r,a.calc_flow=i,e.charges.push(a),e}removeInvoiceCharge(e,t){return e.charges&&(e.charges=e.charges.filter(e=>e.uid!==t)),e}async getStockChangeList(e,t=!0){if(!e.lines||e.lines.length===0)return[];let n=t?1:-1,r=new Map;for(let t of e.lines){let e=r.get(t.item_uid)||new he(t.item_uid);if(e.quantity+=t.quantity*n,t.modifiers&&t.modifiers.length>0)for(let r of t.modifiers){let i=e.modifiers.find(e=>e.item_uid===r.item_uid);i||(i={item_uid:r.item_uid,quantity:0},e.modifiers.push(i)),i.quantity+=t.quantity*r.quantity*n}r.set(t.item_uid,e)}return Array.from(r.values())}sliceInvoice(e){if(!e||!e.lines||e.lines.length===0)return[];let t=[];for(let n of e.lines)for(let r=0;r<n.quantity;r++){let r=s.cloneDeep(e),i=s.cloneDeep(n);i.quantity=1,r.lines=[i],t.push(r)}return t}},Mr=class extends jr{},Nr=class extends K{constructor(e,t,n,r=`employee_roles`,i=`employee_role`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}},Pr=class extends K{constructor(e,t,n,r=`employees`,i=`employee`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async login(e,t){try{let n=await this.getOne(e);if(n){if(await m.compare(t,n.password))return!0;throw new O(`Password is incorrect`)}else throw new O(`User not found`)}catch(e){throw e instanceof O?e:new O(`Unexpected error, login failed`)}}async createEmployee(e){try{if(await this.getOne(e.uid))throw new O(`User already exists`);return e.password&&(e.password=await m.hash(e.password,12)),this.addOne(e)}catch(e){throw e instanceof O?e:new O(`Unexpected error, creating employee failed`)}}async changePassword(e){try{return await m.hash(e,12)}catch{throw new O(`Unexpected error, changing password failed`)}}},Fr=class extends K{constructor(e,t,n,r=`items`,i=`item`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async search(e){return this.db.transaction(`r`,this.db.table(this.moduleName),async()=>await this.db.table(this.moduleName).where(`name`).anyOfIgnoreCase(e).or(`codename`).anyOfIgnoreCase(e).or(`barcode`).anyOfIgnoreCase(e).toArray())}async addModifierCategory(e,n){return n.uid=D.ItemModifierCategory+t(),e.modifier_categories||(e.modifier_categories=[]),e.modifier_categories.push(n),e}async updateModifierCategory(e,t){if(!e.modifier_categories)throw e.modifier_categories=[],new O(`Item does not have any modifier categories`);let n=e.modifier_categories.findIndex(e=>e.uid===t.uid);if(n===-1)throw new O(`Modifier category not found`);return e.modifier_categories[n]=t,e}async removeModifierCategory(e,t){if(!e.modifier_categories)throw e.modifier_categories=[],new O(`Item does not have any modifier categories`);return e.modifier_categories=e.modifier_categories.filter(e=>e.uid!==t.uid),e}async addModifier(e,n){return e.modifiers||(e.modifiers=[]),n.uid=D.ItemModifier+t(),e.modifiers.push(n),e}async updateModifier(e,t){if(!e.modifiers)throw e.modifiers=[],new O(`Item does not have any modifiers`);let n=e.modifiers.findIndex(e=>e.uid===t.uid);if(n===-1)throw new O(`Modifier not found`);return e.modifiers[n]=t,e}async removeModifier(e,t){if(!e.modifiers)throw e.modifiers=[],new O(`Item does not have any modifiers`);return e.modifiers=e.modifiers.filter(e=>e.uid!==t.uid),e}async attachModifierToGroup(e,t,n){if(!e.modifier_categories)throw e.modifier_categories=[],new O(`Item does not have any modifier categories`);if(!e.modifier_categories.find(e=>e.uid===n))throw new O(`Modifier category not found`);let r=e.modifiers.find(e=>e.uid===t);if(!r)throw new O(`Modifier not found`);return r.category_uid=n,e}async addImageAsync(e,t){let n=o(),r=this.getFileExtension(e);await this.http.post(`api/v5/merchants/`+this.options.merchant_uid+`/upload-image`,new en({base64:await this.convertFileToBase64(e),name:n,extension:this.getFileExtension(e)})),t.image_url=`${this.options.base_url}images/${n}.${r}`,t.image_thumbnail_url=`${this.options.base_url}images/${n}.thumbnail.${r}`}async changeToSoldOut(e){let t=await this.getOne(e);if(!t)throw new O(`Item not found`);return t.stock=0,t.is_sold_out=!0,this.updateOne(t.id_in_server,t)}async changeToAvailable(e,t=1){let n=await this.getOne(e);if(!n)throw new O(`Item not found`);return n.stock=t,n.is_sold_out=!1,this.updateOne(n.id_in_server,n)}async changeStock(e,t){let n=await this.getOne(e);if(!n)throw new O(`Item not found`);let r=Number(n.stock);return n.stock=(isNaN(r)?0:r)+t,this.updateOne(n.id_in_server,n)}async changeItemsStock(e){let t=[];for(let n of e){let e=await this.getOne(n.item_uid);if(!e)continue;let r=Number(e.stock);e.stock=(isNaN(r)?0:r)+n.quantity;for(let t of n.modifiers){let n=e.modifiers?.find(e=>e.uid===t.item_uid);if(!n)continue;let r=Number(n.stock);n.stock=(isNaN(r)?0:r)+Number(t.quantity)}t.push(e)}await this.updateMany(t)}convertFileToBase64(e){return new Promise((t,n)=>{let r=new FileReader;r.onloadend=()=>{typeof r.result==`string`?t(r.result.split(`,`)[1]):n(Error(`Could not convert file to Base64.`))},r.onerror=()=>n(Error(`File reading failed.`)),r.readAsDataURL(e)})}getFileExtension(e){let t=e.name,n=t.lastIndexOf(`.`);return n===-1||n===t.length-1?``:t.slice(n+1)}async cloneItem(e){let n=s.cloneDeep(e);if(n.uid=D.Item+t(),n.id_in_server=0,!n.modifier_categories||n.modifier_categories.length===0)return n;let r=[],i=[];for(let e of n.modifier_categories){let t=n.modifiers?.filter(t=>t.category_uid===e.uid);if(!t||t.length===0)continue;let{modifierCategory:a,modifiers:o}=await this.cloneModifiers(e,t);r.push(a),i.push(...o)}return n.modifier_categories=r,n.modifiers=i,n}async cloneModifiers(e,n){let r=s.cloneDeep(e);r.uid=D.ItemModifierCategory+t();let i=[];for(let e of n){let n=s.cloneDeep(e);n.uid=D.ItemModifier+t(),n.category_uid=r.uid,i.push(n)}return{modifierCategory:r,modifiers:i}}async copyModifierGroupToItems(e,t,n){if(!e||!t?.length||!n?.length)throw new O(`Invalid input parameters`);let r=[];for(let i of n){i.modifier_categories=i.modifier_categories||[],i.modifiers=i.modifiers||[];let{modifierCategory:n,modifiers:a}=await this.cloneModifiers(e,t);i.modifier_categories.push(n),i.modifiers.push(...a),r.push(i)}return await this.updateMany(r),r}sanitize(e){if(e.name&&(e.name=e.name.trim()),e.name_translations)for(let t in e.name_translations)e.name_translations[t]&&(e.name_translations[t]=e.name_translations[t].trim());if(e.type!==P.Combo)return e.combo_groups=[],e;if(!e.combo_groups?.length)return e;for(let t of e.combo_groups)for(let e of t.combo_items)delete e.combo_item;return e}},Ir=class extends K{constructor(e,t,n,r=`categories`,i=`category`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async addSubcategory(e,t){return e.subcategories||(e.subcategories=[]),e.subcategories.push(t),e.has_subcategory||(e.has_subcategory=!0),e.id_in_server?await this.updateOne(e.id_in_server,e):await this.addOne(e),e}async updateSubcategory(e,t){if(!e.subcategories)throw e.subcategories=[],e.has_subcategory&&(e.has_subcategory=!1),new O(`Category does not have any subcategories`);let n=e.subcategories.findIndex(e=>e.uid===t.uid);if(n===-1)throw new O(`Subcategory not found`);return e.subcategories[n]=t,e.id_in_server?await this.updateOne(e.id_in_server,e):await this.addOne(e),e}async removeSubcategory(e,t){if(!e.subcategories)throw e.subcategories=[],e.has_subcategory&&(e.has_subcategory=!1),new O(`Category does not have any subcategories`);return e.subcategories=e.subcategories.filter(e=>e.uid!==t),e.id_in_server?await this.updateOne(e.id_in_server,e):await this.addOne(e),e}},Lr=class extends K{constructor(e,t,n,r=`configs`,i=`config`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i,y(this,`configFactories`,{general:()=>new Ft,product:()=>new Pt,till:()=>new It,report:()=>new Lt,receipt:()=>new Rt,kitchen:()=>new zt,kds:()=>new Bt,label:()=>new Vt,order:()=>new Ht,payment:()=>new Wt,user:()=>new Gt,tax:()=>new Kt,rounding:()=>new Yt,charges:()=>new qt,currency:()=>new Jt,inventory:()=>new Xt,pax_config:()=>new Zt,gto:()=>new Qt,cash_drawer:()=>new $t,marketing:()=>new kt})}async updateConfig(e,t){let n=await this.getDefaultOne();n||(n=new St);let r=this.configFactories[e],i=n.config[e]||{};return n.config[e]||(r&&typeof r==`function`?n.config[e]=r():n.config[e]={},i=n.config[e]),Object.keys(t).forEach(e=>{t[e]!==void 0&&(i[e]=t[e])}),n.id_in_server?this.updateOne(n.id_in_server,n):this.addOne(n)}async updateGeneralConfig(e){let t=await this.getDefaultOne();t||(t=new St);let n=t.config.general;return Object.keys(e).forEach(t=>{e[t]!==void 0&&(n[t]=e[t])}),t.id_in_server?this.updateOne(t.id_in_server,t):this.addOne(t)}async updateCache(e){let t=await this.getDefaultOne();return t.cache={...t.cache,...e},t.id_in_server?this.updateOne(t.id_in_server,t):this.addOne(t)}async uploadFile(e){let t=o(),n=wn(e);return await this.http.post(`api/v5/merchants/`+this.options.merchant_uid+`/upload-image`,new en({base64:await Tn(e),name:t,extension:n})),{file_url:`${this.options.base_url}images/${t}.${n}`,thumbnail_url:`${this.options.base_url}images/${t}.thumbnail.${n}`}}},Rr=class extends K{constructor(e,t,n,r=`sections`,i=`section`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}},zr=class extends K{constructor(e,t,n,r=`section_items`,i=`section_item`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async changeToTakeOut(e){let t=await this.getOne(e);if(!t)throw Error(`Item not found`);return t.is_take_out=!t.is_take_out,this.updateOne(t.id_in_server,t)}reset(e){e.total=0,e.pax=0,e.customer={}}syncInvoiceData(e,t){e.total=t.grand_total,e.pax=t.pax,e.customer={display_name:t.customer?.display_name||``,phone_number:t.customer?.phone_number||``}}},Br=class extends K{constructor(e,t,n,r=`products`,i=`product`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}},Vr=class extends K{constructor(e,t,n,r=`shifts`,i=`shift`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i,y(this,`tillService`,void 0),this.tillService=new Hr(e,t,n)}async cashIn(e,t){let n=await this.db.table(this.moduleName).filter(e=>(e.deleted_at===null||e.deleted_at===void 0)&&e.status===A.Open).first();if(!n)throw new O(`No opening shift found`);let r=new M;return r.amount=e,r.type=j.CashIn,r.user_uid=n.user_uid,r.shift_uid=n.uid,r.note=t,this.tillService.addOne(r)}async cashOut(e,t){let n=await this.db.table(this.moduleName).filter(e=>(e.deleted_at===null||e.deleted_at===void 0)&&e.status===A.Open).first();if(!n)throw new O(`No opening shift found`);let r=new M;return r.amount=e,r.type=j.CashOut,r.user_uid=n.user_uid,r.shift_uid=n.uid,r.note=t,this.tillService.addOne(r)}async closeShift(e,t){let n=await this.db.table(this.moduleName).filter(e=>(e.deleted_at===null||e.deleted_at===void 0)&&e.status==A.Open).first();if(!n)throw new O(`No opening shift found`);return n.declared_amount=e,n.ended_at=new Date,n.user_uid=t,n.status=A.Closed,this.updateOne(n.id_in_server,n)}async openShift(e,t,n=``){console.log(`open shift entry`);let r=await this.db.table(this.moduleName).filter(e=>(e.deleted_at===null||e.deleted_at===void 0)&&e.status==A.Open).first();if(r)throw new O(`shift is already opened shift at ${r.started_at}`);let i=new de;if(i.started_at=new Date,i.user_uid=t,i.status=A.Open,await this.addOne(i),e>0){let r=new M;r.amount=e,r.type=j.OpenDeposit,r.user_uid=t,r.amount=e,r.shift_uid=i.uid,r.note=n,await this.tillService.addOne(r)}return console.log(`open shift end`),i}},Hr=class extends K{constructor(e,t,n,r=`tills`,i=`till`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}createCashInvoiceTill(e,t,n,r=``,i=``){let a=new M;return a.shift_uid=t,a.user_uid=n,a.note=r,a.invoice_uid=i,a.amount=q(e.filter(e=>e.payment_method.is_cash).map(e=>e.tender_amount-e.change_amount).reduce((e,t)=>e+t,0)),a.type=j.CashInvoice,a}},Ur=class extends K{constructor(e,t,n,r=`payment_methods`,i=`payment_method`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async syncStandardPaymentMethods(){try{let{data:e}=await this.http.get(`api/v5/merchants/`+this.options.merchant_uid+`/standard_payment_methods`),t=[];for(let n of e){let e=new nt(n),r=await this.getOneByParams({payment_method_code:e.payment_method_code}),i=e.toPaymentMethod();r?(i.uid=r.uid,i.id_in_server=r.id_in_server,i.sequence=r.sequence,i.is_disabled=r.is_disabled,i.is_integrated=r.is_integrated,i.api_id=r.api_id,i.api_key=r.api_key):(i.is_disabled=!0,await this.addOne(i)),t.push(i)}return t}catch(e){return console.error(`Failed to sync standard payment methods:`,e),[]}}async enablePaymentMethod(e){return e.is_disabled=!1,this.updateOne(e.id_in_server,e)}async disablePaymentMethod(e){return e.is_disabled=!0,this.updateOne(e.id_in_server,e)}async changeSequence(e,t){let n=(await this.db.table(this.moduleName).filter(e=>!e.is_disabled).sortBy(`sequence`)).filter(t=>t.id_in_server!==e.id_in_server);t<0&&(t=0),t>n.length&&(t=n.length),n.splice(t,0,e);let r=[];for(let e=0;e<n.length;e++)n[e].sequence!==e&&(n[e].sequence=e,r.push(n[e]));return r.length>0&&await this.updateMany(r),e}},Wr=class extends K{constructor(e,t,n,r=`payments`,i=`payment`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async addPayment(e,t,n){let r=new $e;r.invoice_uid=e.uid,r.tender_amount=t;let i=e.payments.reduce((e,t)=>e+t.tender_amount,0)+t;return n.is_cash&&i>=e.grand_total&&(r.change_amount=q(i-e.grand_total)),r.payment_method_uid=n.uid,r.payment_method_code=n.payment_method_code,r.payment_method_name=n.name,r.payment_method=s.cloneDeep(n),e.payments.push(r),e}async removePayment(e,t){return e.payments=e.payments.filter(e=>e.uid!==t),e}},Gr=class{async calibrateSequence(e){let t=await e.getAll();t.sort((e,t)=>e.sequence-t.sequence);let n=[];for(let e=0;e<t.length;e++){let r=t[e];r.sequence!==e&&(r.sequence=e,n.push(r))}await e.updateMany(n)}async changeSequence(e,t,n){if(n<0)throw new O(`Invalid target index.`);let r=Array.isArray(e),i=r?e:await e.getAll();if(i=i.filter(e=>e.deleted_at===null).sort((e,t)=>e.sequence-t.sequence),n>=i.length)throw new O(`Invalid target index.`);let a=i.findIndex(e=>e.uid==t.uid),o=new Map(i.map(e=>[e.uid,e.sequence]));a<n&&(n+=1),i.splice(n,0,null);let s=i.filter(e=>!(e&&e.uid===t.uid)).map((e,n)=>e===null?(t.sequence=n+1,t):(e.sequence=n+1,e)).filter(e=>o.get(e.uid)!==e.sequence);return r||await e.updateMany(s),s}},Kr=class extends K{constructor(e,t,n,r=`reports`,i=`report`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i,y(this,`invoiceService`,void 0),y(this,`tillService`,void 0),y(this,`paymentService`,void 0),y(this,`printerService`,void 0),y(this,`printTemplateService`,void 0),y(this,`printJobService`,void 0),y(this,`configService`,void 0),this.invoiceService=new Mr(e,t,n,`invoices`,`invoice`),this.tillService=new Hr(e,t,n,`tills`,`till`),this.paymentService=new Wr(e,t,n,`payments`,`payment`),this.printerService=new Cn(e,t,n,`printers`,`printer`),this.printTemplateService=new Yr(e,t,n,`print_templates`,`print_template`),this.printJobService=new qr(e,t,n,`print_jobs`,`print_job`),this.configService=new Lr(e,t,n,`configs`,`config`)}async syncStandardReports(){let e=await this.getDefaultOne();e||(e=new mn);let t=await this.http.get(`api/v5/merchants/`+this.options.merchant_uid+`/standard_reports`);return e={...e,...t.data},e.updated_at=new Date,e.id_in_server?await this.updateOne(e.id_in_server,e):await this.addOne(e),e}async printReport(e){e.copies=e.copies||1;let t=await this.printerService.getDefaultReceiptPrinter();if(!t)throw new O(`No default receipt printer found`);let n=await this.printTemplateService.getOneByParams({report_code_name:e.report_code_name});if(!n)throw new O(`No print template found`);let r=await this.configService.getDefaultOne(),i=await this.getReportData(e,r.config?.order?.datetime_format,r.config?.currency?.currency_symbol||`$`),a=new V(t,await this.printTemplateService.renderReportPrintTemplate(i,r.config,n),!1,e.copies);await this.printJobService.addOne(a)}async getReportData(e,t,n=`$`){let r=new hn;if(e.shift_uid){await this.db.table(`shifts`).where(`uid`).equals(e.shift_uid).and(e=>e.deleted_at==null||e.deleted_at==null).first(),r.drawer_summary.declared_amount=e.declared_amount;let t=await this.db.table(`tills`).where(`shift_uid`).equals(e.shift_uid).and(e=>e.deleted_at==null).toArray();r.drawer_summary.open_amount=q(t.filter(e=>e.type==j.OpenDeposit).reduce((e,t)=>e+t.amount,0)),r.drawer_summary.pay_in_total=q(t.filter(e=>e.type==j.CashIn).reduce((e,t)=>e+t.amount,0)),r.drawer_summary.cash_invoice_total=q(t.filter(e=>e.type==j.CashInvoice).reduce((e,t)=>e+t.amount,0)),r.drawer_summary.cash_invoice_count=t.filter(e=>e.type==j.CashInvoice).length,r.drawer_summary.pay_in_count=t.filter(e=>e.type==j.CashIn).length,r.drawer_summary.pay_out_total=q(t.filter(e=>e.type==j.CashOut).reduce((e,t)=>e+t.amount,0)),r.drawer_summary.pay_out_count=t.filter(e=>e.type==j.CashOut).length,r.drawer_summary.drawer_amount=q(r.drawer_summary.open_amount+r.drawer_summary.pay_in_total+r.drawer_summary.cash_invoice_total-r.drawer_summary.pay_out_total),r.drawer_summary.difference=q(r.drawer_summary.drawer_amount-r.drawer_summary.declared_amount)}r.start_datetime=new Date(e.start_datetime).toISOString(),r.end_datetime=new Date(e.end_datetime).toISOString(),r.humanized_start_datetime=R(new Date(e.start_datetime),t),r.humanized_end_datetime=R(new Date(e.end_datetime),t),r.humanized_printed_datetime=R(new Date,t);let i=new p().addParam(`paid_at`,`GreaterThanOrEqualTo`,new Date(e.start_datetime).toISOString()).addParam(`paid_at`,`LessThanOrEqualTo`,new Date(e.end_datetime).toISOString()).addParam(`deleted_at`,`IsNull`,!0).includeTotal(!0),a=(await this.invoiceService.autoQuery(i,{timeout:6e5})).results||[];return this.processReportInvoicesData(r,a,n)}async processReportInvoicesData(e,t=[],n=`$`){let r=new Map,i=new Map,a=await this.db.table(`categories`).toArray(),o=new Map(a.map(e=>[e.uid,e])),s=new Map,c=new Map,l=(e,t,n)=>`${e}|${t}|${n.toFixed(4)}`,u=(e,t,r,i)=>e||(t===W.Percent?`${q(i*100)}% Discount`:`${n}${q(r)} Discount`),d=(e,t,n,r,i,a)=>{let o=l(t,n,n===W.Percent?i:r),s=e.get(o);s?(s.count++,s.total=q(s.total+a)):e.set(o,{name:t,alias:u(t,n,r,i),calc_type:n,amount:r,percent:i,count:1,total:q(a)})};t.forEach(t=>{t.status==U.Paid&&(e.sales_summary.paid_invoice_total+=t.grand_total,e.sales_summary.sales_total+=t.grand_total,e.sales_summary.paid_invoice_count++,e.sales_summary.rounding_total+=t.rounding,e.sales_summary.tax_total+=t.tax,e.sales_summary.service_charge_total+=t.service_charge,e.sales_summary.discount_total+=t.discount_amount,t.add_credit>0&&(e.loyalty_program_summary.add_credit_total+=t.add_credit,e.loyalty_program_summary.add_credit_count++,e.loyalty_program_summary.topup_paid_count++),t.rewarded_credit>0&&(e.loyalty_program_summary.rewarded_credit_total+=t.rewarded_credit,e.loyalty_program_summary.rewarded_credit_count++),t.minus_credit>0&&(e.loyalty_program_summary.minus_credit_total+=t.minus_credit,e.loyalty_program_summary.minus_credit_count++),t.rewarded_point>0&&(e.loyalty_program_summary.rewarded_point_total+=t.rewarded_point,e.loyalty_program_summary.rewarded_point_count++),t.minus_point>0&&(e.loyalty_program_summary.minus_point_total+=t.minus_point,e.loyalty_program_summary.minus_point_count++),e.sales_summary.total_pax+=t.pax,t.pax>0&&(e.sales_summary.pax_sales_total+=t.grand_total),t.lines.forEach(t=>{t.item.add_credit>0&&(e.loyalty_program_summary.topup_paid_total+=t.subtotal);let n=this.generateItemKey(t),a=r.get(n);if(a?(a.quantity+=t.quantity,a.total_amount=q(a.total_amount+t.subtotal),t.modifiers&&t.modifiers.length>0&&t.modifiers.forEach(e=>{let t=e.item.name.trim(),n=i.get(t);n?(n.quantity+=e.quantity,n.total_amount=q(n.total_amount+e.price*e.quantity)):(n=new xn,n.item=e.item,n.quantity=e.quantity,n.total_amount=q(e.price*e.quantity),i.set(t,n))})):(a=new bn,a.item=t.item,a.quantity=t.quantity,a.total_amount=q(t.subtotal),a.modifiers=[],t.modifiers&&t.modifiers.length>0&&t.modifiers.forEach(e=>{let t={item:e.item,quantity:e.quantity,total_amount:q(e.price*e.quantity)};a.modifiers.push(t);let n=e.item.name.trim(),r=i.get(n);r?(r.quantity+=e.quantity,r.total_amount=q(r.total_amount+e.price*e.quantity)):(r=new xn,r.item=e.item,r.quantity=e.quantity,r.total_amount=q(e.price*e.quantity),i.set(n,r))}),r.set(n,a)),t.discount_amount||t.discount_percent){let e=t.subtotal_before_discount-t.subtotal;e>0&&d(c,``,t.discount_calc_type,t.discount_amount,t.discount_percent,e)}}),t.payments.forEach(t=>{let n=e.payments_summary.find(e=>e.code==t.payment_method_code);t.tender_amount||(t.tender_amount=t.change_amount),n?(n.count++,n.total=q(n.total+(t.tender_amount-t.change_amount))):e.payments_summary.push({code:t.payment_method_code,name:t.payment_method_name,count:1,total:q(t.tender_amount-t.change_amount)})}),t.discounts?.forEach(e=>{let t=e.applying_item_uids&&e.applying_item_uids.length>0,n=e.calc_type===W.Percent?e.percent_amount:e.amount;d(t?c:s,e.name||``,e.calc_type,e.amount,e.percent,n)})),t.is_sales_exclusive&&(e.sales_summary.foc_sales_total+=t.grand_total,e.sales_summary.foc_sales_count++),t.status==U.Void&&(e.sales_summary.void_invoice_total+=t.grand_total,e.sales_summary.void_invoice_count++)});let f=Array.from(r.values());f.sort((e,t)=>{let n=o.get(e.item.category_uid),r=o.get(t.item.category_uid),i=n?.sequence??999999,a=r?.sequence??999999;return i===a?(e.item.sequence??999999)-(t.item.sequence??999999):i-a}),e.item_sales_summary=f;let p=0,m=0,h=new Map;f.forEach(e=>{if(p+=e.total_amount,m+=e.quantity,!e.item.category_uid)return;let t=e.item.category_uid,n=h.get(t);n||(n=new Sn,n.category=o.get(e.item.category_uid)||null,h.set(t,n)),n.items.push(e),n.total_quantity+=e.quantity,n.total_amount+=e.total_amount}),e.item_sales_summary_total=q(p),e.item_sales_summary_total_count=m;let g=Array.from(h.values());g.sort((e,t)=>(e.category?.sequence??999999)-(t.category?.sequence??999999)),g.forEach(e=>{e.total_amount=q(e.total_amount),e.items.sort((e,t)=>t.total_amount===e.total_amount?t.quantity-e.quantity:t.total_amount-e.total_amount)}),e.item_sales_summary_by_category=g;let _=Array.from(i.values());_.sort((e,t)=>t.quantity===e.quantity?t.total_amount-e.total_amount:t.quantity-e.quantity),e.modifier_sales_summary=_;let v=0,y=0;return e.modifier_sales_summary.forEach(e=>{v+=e.total_amount,y+=e.quantity}),e.modifier_sales_summary_total=q(v),e.modifier_sales_summary_total_count=y,e.invoice_discount_summary=Array.from(s.values()),e.item_discount_summary=Array.from(c.values()),e.sales_summary.paid_invoice_total=q(e.sales_summary.paid_invoice_total),e.sales_summary.sales_total=q(e.sales_summary.sales_total),e.sales_summary.rounding_total=q(e.sales_summary.rounding_total),e.sales_summary.tax_total=q(e.sales_summary.tax_total),e.sales_summary.service_charge_total=q(e.sales_summary.service_charge_total),e.sales_summary.discount_total=q(e.sales_summary.discount_total),e.sales_summary.foc_sales_total=q(e.sales_summary.foc_sales_total),e.sales_summary.void_invoice_total=q(e.sales_summary.void_invoice_total),e.sales_summary.pax_sales_total=q(e.sales_summary.pax_sales_total),e.loyalty_program_summary.add_credit_total=q(e.loyalty_program_summary.add_credit_total),e.loyalty_program_summary.topup_paid_total=q(e.loyalty_program_summary.topup_paid_total),e.loyalty_program_summary.rewarded_credit_total=q(e.loyalty_program_summary.rewarded_credit_total),e.loyalty_program_summary.minus_credit_total=q(e.loyalty_program_summary.minus_credit_total),e}generateItemKey(e){let t=e.item.uid;if(e.modifiers&&e.modifiers.length>0){let n=[...e.modifiers].sort((e,t)=>{let n=`${e.item.name.trim()}:${e.quantity}`,r=`${t.item.name.trim()}:${t.quantity}`;return n.localeCompare(r)}).map(e=>`${e.item.uid}:${e.quantity}`);t+=`-`+n.join(`-`)}return t}},qr=class extends K{constructor(e,t,n,r=`print_jobs`,i=`print_job`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async autoquery(e){let t=e.build();return await this.http.get(`sapi/v5/merchants/${this.options.merchant_uid}/${this.moduleName}`,{params:{...t}})}replacePrinter(e,t){return e.printer_name=t.name,e.printer_ip=t.ip_address,e.printer_type=t.type,e.printer_uid=t.uid,e.driver_printer_name=t.driver_printer_name,t.protocol&&(e.protocol=t.protocol),t.connection_type&&(e.connection_type=t.connection_type),e.usb_serial_number=t.usb_serial_number,e.use_device_name=t.use_device_name,e.usb_device_name=t.usb_device_name,t.print_sequence!==void 0&&(e.print_sequence=t.print_sequence),e}},Jr=class extends K{constructor(e,t,n,r=`menus`,i=`menu`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}},Yr=class extends K{constructor(e,t,n,r=`print_templates`,i=`print_template`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i,y(this,`httpClient`,void 0),y(this,`secretKey`,`tKB84ZlZRzLzA2LcglNNLquucKZwtJApRTaPKjAJHFbDd8nJRD`),this.httpClient=c.create({baseURL:`https://revopos-cdn.sgp1.digitaloceanspaces.com`,timeout:3e3})}async initialize(){if(!await this.getOneByParams({printer_type:z.ReceiptPrinter})){let e=new B;e.name=`Default Receipt Template`,e.body=await this.getPrintTemplate(`rbt`),e.header=await this.getPrintTemplate(`rht`),e.footer=await this.getPrintTemplate(`rft`),e.printer_type=z.ReceiptPrinter,await this.addOne(e),console.log(`Default Receipt Template added`)}if(!await this.getOneByParams({printer_type:z.CheckPrinter})){let e=new B;e.name=`Default Check Template`,e.body=await this.getPrintTemplate(`cbt`),e.header=await this.getPrintTemplate(`cht`),e.footer=await this.getPrintTemplate(`cft`),e.printer_type=z.CheckPrinter,await this.addOne(e),console.log(`Default Check Template added`)}if(!await this.getOneByParams({printer_type:z.OrderPrinter})){let e=new B;e.name=`Default docket Template`,e.body=await this.getPrintTemplate(`obt`),e.header=await this.getPrintTemplate(`oht`),e.footer=await this.getPrintTemplate(`oft`),e.printer_type=z.OrderPrinter,await this.addOne(e),console.log(`Default Order Template added`)}if(!await this.getOneByParams({printer_type:z.KitchenPrinter})){let e=new B;e.name=`Default Kitchen Template`,e.body=await this.getPrintTemplate(`kbt`),e.header=await this.getPrintTemplate(`kht`),e.footer=await this.getPrintTemplate(`kft`),e.printer_type=z.KitchenPrinter,await this.addOne(e),console.log(`Default Kitchen Template added`)}if(!await this.getOneByParams({printer_type:z.KioskPrinter})){let e=new B;e.name=`Default Kiosk Template`,e.body=await this.getPrintTemplate(`kioskbt`),e.header=await this.getPrintTemplate(`kioskht`),e.footer=await this.getPrintTemplate(`kioskft`),e.printer_type=z.KioskPrinter,await this.addOne(e),console.log(`Default Kiosk Template added`)}if(!await this.getOneByParams({printer_type:z.LabelPrinter})){let e=new B;e.commands=await this.getPrintTemplate(`tspl_cmds`),e.name=`Default Label Template`,e.printer_type=z.LabelPrinter,await this.addOne(e)}if(!await this.getOneByParams({printer_type:z.QrCodePrinter})){let e=new B;e.name=`Default QR Code Template`,e.body=await this.getPrintTemplate(`qrbt`),e.header=await this.getPrintTemplate(`qrht`),e.footer=await this.getPrintTemplate(`qrft`),e.printer_type=z.QrCodePrinter,await this.addOne(e)}if(!await this.getOneByParams({report_code_name:`sales_summary_report`})){let e=new B;e.name=`Sales Summary Report`,e.body=await this.getPrintTemplate(`sumbt`),e.header=await this.getPrintTemplate(`sumht`),e.footer=await this.getPrintTemplate(`sumft`),e.report_code_name=`sales_summary_report`,await this.addOne(e),console.log(`Sales Summary Report Template added`)}if(!await this.getOneByParams({report_code_name:`shift_report`})){let e=new B;e.name=`Shift Report`,e.body=await this.getPrintTemplate(`sbt`),e.header=await this.getPrintTemplate(`sht`),e.footer=await this.getPrintTemplate(`sft`),e.report_code_name=`shift_report`,await this.addOne(e),console.log(`Shift Report Template added`)}if(!await this.getOneByParams({report_code_name:`item_sales_report`})){let e=new B;e.name=`Item Sales Report`,e.body=await this.getPrintTemplate(`isrbt`),e.header=await this.getPrintTemplate(`isrht`),e.footer=await this.getPrintTemplate(`isrft`),e.report_code_name=`item_sales_report`,await this.addOne(e),console.log(`Item Sales Report Template added`)}if(!await this.getOneByParams({report_code_name:`modifier_sales_report`})){let e=new B;e.name=`Modifier Sales Report`,e.body=await this.getPrintTemplate(`msrbt`),e.header=await this.getPrintTemplate(`msrht`),e.footer=await this.getPrintTemplate(`msrft`),e.report_code_name=`modifier_sales_report`,await this.addOne(e),console.log(`Modifier Sales Report Template added`)}}async renderPrintTemplate(e,t,n,r=new H){let i=new L;n.printer_type==z.KitchenPrinter||n.printer_type==z.OrderPrinter?i.codepage=n.codepage||this.getCodepageByCountryCode(t.kitchen.language):i.codepage=n.codepage||this.getCodepageByCountryCode(t.receipt.language);let a=new Qe;return a.invoice=e,a.config=t,a.normalized_printed_at=R(a.printed_at,t?.order?.datetime_format),a.printer_name=r.printer_name,r.is_cancel&&(a.is_cancel=r.is_cancel),i.items.push(...await this.renderPrintCommand(n.header,a)),i.items.push(...await this.renderPrintCommand(n.body,a)),i.items.push(...await this.renderPrintCommand(n.footer,a)),i}async renderReportPrintTemplate(e,t,n,r=new H){let i=new L,a=new Qe;return a.report_data=e,a.config=t,a.normalized_printed_at=R(a.printed_at,t?.order?.datetime_format),i.codepage=n.codepage||F.SimplifiedChinese,i.items.push(...await this.renderPrintCommand(n.header,a)),i.items.push(...await this.renderPrintCommand(n.body,a)),i.items.push(...await this.renderPrintCommand(n.footer,a)),i}async renderPrintTemplateByData(e,t,n=new H){let r=new L;return r.items.push(...await this.renderPrintCommand(e.header,t)),r.items.push(...await this.renderPrintCommand(e.body,t)),r.items.push(...await this.renderPrintCommand(e.footer,t)),r}async getPrintTemplate(e){let t=await this.httpClient.get(`/xpos-core/${e}.enc`,{responseType:`text`});return l.AES.decrypt(t.data,this.secretKey).toString(l.enc.Utf8)}getCodepageByCountryCode(e){let t={US:F.English,GR:F.Greek,DE:F.WesternEurope,LT:F.BalticRim,PL:F.CentralEurope,RU:F.Cyrillic,TR:F.Turkish,EU:F.MultilingualLatin1WithEuro,PT:F.Portuguese,IS:F.Icelandic,IL:F.Hebrew,CA:F.FrenchCanadian,EG:F.Arabic,NO:F.Nordic,BY:F.Russian,MK:F.ModernGreek,CN:F.SimplifiedChinese,KR:F.Korean,TW:F.TraditionalChinese,FR:F.WesternEuropeanLatin,AE:F.ArabicISO,JP:F.Japanese,CZ:F.CentralEuropeanLatinWindows,BG:F.CyrillicWindows,ES:F.WesternEuropeanLatinWindows,CY:F.GreekWindows,AZ:F.TurkishWindows,PS:F.HebrewWindows,SA:F.ArabicWindows,LV:F.BalticWindows,VN:F.Vietnamese};return e&&t[e.toUpperCase()]||t.CN}async renderPrintCommand(e,t){try{let n=new u(!0),r=JSON.parse(e);console.log(`template`,JSON.stringify(r)),console.log(`templateData`,JSON.stringify(t));let i=await n.transform(r,t,!1);return i=s.flatMap(i,e=>e),i=s.compact(i),i}catch(e){throw console.error(e),e}}},Xr=class extends K{constructor(e,t,n,r=`storages`,i=`storage`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}},Zr=class extends K{constructor(e,t,n,r=`stock_logs`,i=`stock_log`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}};function Qr(e,t,n){let r=c.create({baseURL:e,timeout:2e4,headers:{"x-device-uid":t,Authorization:`Bearer ${n}`}});return r.interceptors.response.use(function(e){return e.data},function(e){return Promise.reject(e)}),r}const $r=new Map([[`Item`,Fr],[`Section`,Rr],[`SectionItem`,zr],[`Category`,Ir],[`Config`,Lr],[`Shift`,Vr],[`Till`,Hr],[`Employee`,Pr],[`PaymentMethod`,Ur],[`Invoice`,Mr],[`Report`,Kr],[`Printer`,Cn],[`PrintJob`,qr],[`PrintTemplate`,Yr],[`EmployeeRole`,Nr],[`OrderDisplay`,Dr],[`Storage`,Xr],[`Menu`,Jr],[`StockLog`,Zr]]),Z=`uid, updated_at, created_at, deleted_at, _timestamp, id_in_server, created_at_timestamp`,Q=`${Z}, sequence`,ei=`${Q}, status`,ti=`${Z}, till_type, shift_uid, invoice_uid`,ni=`${Q}, payment_method_code, is_disabled`,ri=`${Z}, type, status, table_uid`,ii=`${Q}, name, barcode, codename`,ai=`${Z}, status, printer_type, connection_type, protocol, save_only, device_uid_to_print`,oi=`${Z}, name, printer_type`,si=`${Z}, order_number, status`,ci=`${Z}, model`,li={items:ii,sections:Q,section_items:Q,categories:Q,shifts:ei,tills:ti,employees:`${Z}, role_uid`,payment_methods:ni,invoices:ri,configs:Z,reports:Z,printers:Z,print_jobs:ai,print_templates:oi,employee_roles:`${Z}, name, is_default`,order_displays:si,storages:ci,menus:Z,stock_logs:`${Z}, entity_type, entity_uid, type`};var $=function(e){return e.DISCONNECTED=`disconnected`,e.CONNECTED=`connected`,e.ERROR=`error`,e}($||{}),ui=class e{constructor(e,t,n=!1){this.options=e,this.win=t,y(this,`mode`,void 0),y(this,`http`,void 0),y(this,`dataSource`,void 0),y(this,`status`,$.DISCONNECTED),this.mode=e.mode,this.http=Qr(e.base_url,e.device_uid,e.token),n||this.initializeDatabase(),Oe.setWindow(t)}static async init(t,n,r=!1){let i=new e(t,n,!0);return r||await i.initializeDatabase(),i}async initializeDatabase(){try{if(!this.options.database||!this.options.database.name)throw Error(`Database name is not defined`);this.dataSource=await new i(this.options.database.name),this.dataSource.version(29).stores(li),this.status=$.CONNECTED}catch(e){this.status=$.ERROR,console.error(`Database connection error:`,e)}return this.dataSource}async dropDatabase(){await i.delete(this.options.database.name),await this.initializeDatabase()}clearTableData(e){return this.dataSource.table(e).clear()}async getService(e){if(this.status==$.ERROR)throw Error(`Database connection error`);for(;this.status==$.DISCONNECTED;)await new Promise(e=>setTimeout(e,100));try{return new e(this.http,this.dataSource,this.options)}catch(e){throw Error(`Service instantiation error: `+e?.message)}}async getServiceByName(e){if(this.status==$.ERROR)throw Error(`Database connection error`);for(;this.status==$.DISCONNECTED;)await new Promise(e=>setTimeout(e,100));try{let t=$r.get(e);if(!t)throw Error(`No service found for model: ${e}`);return new t(this.http,this.dataSource,this.options)}catch(e){throw Error(`Service instantiation error: `+e?.message)}}};const di={v1:{headers:[`Type`,`Name`,`SKU`,`Price`,`Stock`,`Is Internal`,`Min Order`,`Max Order`,`Image URL`,`Thumbnail URL`,`Sequence`]},v2:{headers:[`Type`,`Name`,`SKU`,`Price`,`Stock`,`Is Internal`,`Min Order`,`Max Order`,`Image URL`,`Thumbnail URL`,`Sequence`,`Item UID`]},v3:{headers:[`Type`,`Name`,`SKU`,`Price`,`Stock`,`Is Internal`,`Min Order`,`Max Order`,`Image URL`,`Thumbnail URL`,`Sequence`,`Item UID`,`Print On Receipt`,`Discountable`,`Open Editor Panel`,`Is Delisted`,`Name Translations`]},v4:{headers:[`Type`,`Name`,`SKU`,`Price`,`Stock`,`Is Internal`,`Min Order`,`Max Order`,`Image URL`,`Thumbnail URL`,`Sequence`,`Item UID`,`Print On Receipt`,`Discountable`,`Open Editor Panel`,`Is Delisted`,`Name Translations`,`Prices`]}},fi=[`category`,`subcategory`,`product`,`modifier_category`,`modifier`,`combo`,`combo_group`,`combo_item`];function pi(e,t,n=`export.csv`){let r=yi(_i(e,t));return new Blob([``+r],{type:`text/csv;charset=utf-8;`})}function mi(e){if(!(e==null||e===``)){if(typeof e==`number`&&!isNaN(e))return e;if(typeof e==`string`){let t=parseFloat(e);return isNaN(t)?void 0:t}}}function hi(e){if(!e)return``;let t=Object.entries(e).filter(([,e])=>e);return t.length===0?``:t.map(([e,t])=>`${e}:${t}`).join(`|`)}function gi(e){if(!e||!e.trim())return{};let t={};for(let n of e.split(`|`)){let e=n.indexOf(`:`);e>0&&(t[n.slice(0,e).trim()]=n.slice(e+1).trim())}return t}function _i(e,t){let n=[],r=new Map;for(let e of t)r.has(e.category_uid)||r.set(e.category_uid,[]),r.get(e.category_uid).push(e);for(let t of e){n.push({type:`category`,name:t.name,sku:``,price:void 0,stock:void 0,is_internal:t.is_internal,min_order:void 0,max_order:void 0,image_url:t.image_url||``,image_thumbnail_url:t.image_thumbnail_url||``,sequence:t.sequence,is_delisted:t.is_delisted,name_translations:hi(t.name_translations)});let e=r.get(t.uid)||[];if(t.has_subcategory&&t.subcategories&&t.subcategories.length>0){let r=new Map;for(let e of t.subcategories)r.set(e.uid,e);let i=new Map,a=[];for(let t of e)t.subcategory_uid&&r.has(t.subcategory_uid)?(i.has(t.subcategory_uid)||i.set(t.subcategory_uid,[]),i.get(t.subcategory_uid).push(t)):a.push(t);for(let e of t.subcategories){n.push({type:`subcategory`,name:e.name,sku:``,sequence:e.sequence,name_translations:hi(e.name_translations)});let t=i.get(e.uid)||[];for(let e of t)vi(n,e)}for(let e of a)vi(n,e)}else for(let t of e)vi(n,t)}return n}function vi(e,t){let n=t.type===P.Combo;if(e.push({type:n?`combo`:`product`,name:t.name,sku:t.sku||``,price:t.price,stock:mi(t.stock),is_internal:t.is_internal,min_order:void 0,max_order:void 0,image_url:t.image_url||``,image_thumbnail_url:t.image_thumbnail_url||``,sequence:t.sequence,print_on_receipt:t.print_on_receipt,discountable:t.discountable,open_editor_panel:t.open_editor_panel,is_delisted:t.is_delisted,name_translations:hi(t.name_translations),item_uid:t.uid,prices:t.prices?.length?t.prices:void 0}),n&&t.combo_groups&&t.combo_groups.length>0){for(let n of t.combo_groups)if(e.push({type:`combo_group`,name:n.name,sku:``,price:void 0,stock:void 0,is_internal:void 0,min_order:n.min_order,max_order:n.max_order,image_url:``,image_thumbnail_url:``,sequence:n.sequence}),n.combo_items&&n.combo_items.length>0)for(let t of n.combo_items)e.push({type:`combo_item`,name:t.combo_item?.name||``,sku:``,price:t.price,stock:void 0,is_internal:void 0,min_order:void 0,max_order:void 0,image_url:``,image_thumbnail_url:``,sequence:t.sequence,item_uid:t.item_uid})}if(!n&&t.modifier_categories&&t.modifier_categories.length>0){for(let n of t.modifier_categories)if(e.push({type:`modifier_category`,name:n.name,sku:``,price:void 0,stock:void 0,is_internal:void 0,min_order:n.min_order,max_order:n.max_order,image_url:``,image_thumbnail_url:``,sequence:n.sequence}),t.modifiers&&t.modifiers.length>0){let r=t.modifiers.filter(e=>e.category_uid===n.uid);for(let t of r)e.push({type:`modifier`,name:t.name,sku:t.sku||``,price:t.price,stock:mi(t.stock),is_internal:t.is_internal,min_order:void 0,max_order:void 0,image_url:t.image_url||``,image_thumbnail_url:t.image_thumbnail_url||``,sequence:t.sequence,print_on_receipt:t.print_on_receipt,name_translations:hi(t.name_translations),prices:t.prices?.length?t.prices:void 0})}}}function yi(e){let t=[di.v4.headers.join(`,`)];for(let n of e)try{let e=n.prices?.length?`"${JSON.stringify(n.prices).replace(/"/g,`""`)}"`:``,r=[n.type,`"${n.name.replace(/"/g,`""`)}"`,n.sku||``,n.price===void 0?``:n.price.toString(),n.stock===void 0?``:n.stock.toString(),n.is_internal===void 0?``:n.is_internal.toString(),n.min_order===void 0?``:n.min_order.toString(),n.max_order===void 0?``:n.max_order.toString(),n.image_url||``,n.image_thumbnail_url||``,n.sequence===void 0?``:n.sequence.toString(),n.item_uid||``,n.print_on_receipt===void 0?``:n.print_on_receipt.toString(),n.discountable===void 0?``:n.discountable.toString(),n.open_editor_panel===void 0?``:n.open_editor_panel.toString(),n.is_delisted===void 0?``:n.is_delisted.toString(),n.name_translations?`"${n.name_translations.replace(/"/g,`""`)}"`:``,e];t.push(r.join(`,`))}catch(e){throw Error(`Export failed on "${n.name}" (type: ${n.type}): ${e.message}`)}return t.join(`
2
- `)}async function bi(e){return Ei(wi(await e.text()))}function xi(e){let t=Ti(e).map(e=>e.trim());return t.includes(`Prices`)?`v4`:t.includes(`Print On Receipt`)||t.includes(`Name Translations`)?`v3`:t.includes(`Item UID`)?`v2`:`v1`}function Si(e,t,n){let r=e?.trim().toLowerCase();if(r){if(r===`true`)return!0;if(r===`false`)return!1;throw Error(`Invalid ${t} "${e}" at line ${n}. Must be: true or false`)}}function Ci(e,t){if(!e)return[];try{let t=JSON.parse(e);if(!Array.isArray(t))throw Error(`not an array`);return t.map(e=>{let t=new Te;return t.lookup_keys=e.lookup_keys||[],t.amount=e.amount||0,t.name=e.name||``,t.name_translations=e.name_translations||{},t.product_uid=e.product_uid||``,t})}catch{throw Error(`Invalid Prices JSON at line ${t}`)}}function wi(e){let t=e.replace(/^\uFEFF/,``).replace(/\r\n/g,`
1
+ import e from"dayjs";import{nanoid as t}from"nanoid";import n from"esc-pos-encoder-ionic";import r from"wcwidth";import{Dexie as i,liveQuery as a}from"dexie";import{v4 as o}from"uuid";import*as s from"lodash";import c from"axios";import l from"crypto-js";import{SelectTransform as u}from"selecttransform";import{NetworkInterface as d}from"@awesome-cordova-plugins/network-interface";import f from"handlebars";import{QueryBuilder as p}from"@litepos/autoquery";import m from"bcryptjs";var h=(e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function.")});function g(e){"@babel/helpers - typeof";return g=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},g(e)}function _(e,t){if(g(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(g(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function v(e){var t=_(e,`string`);return g(t)==`symbol`?t:t+``}function y(e,t,n){return(t=v(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var b=class{constructor(){y(this,`address1`,``),y(this,`address2`,``),y(this,`lat`,``),y(this,`lng`,``),y(this,`postcode`,``),y(this,`note`,``),y(this,`is_default`,!1),y(this,`name`,``),y(this,`salute`,``),y(this,`phone_number`,``)}},ee=class{constructor(){y(this,`id`,0),y(this,`ref_id`,``),y(this,`image_url`,``),y(this,`stripe_token`,``),y(this,`stripe_customer_id`,``),y(this,`username`,``),y(this,`normalized_username`,``),y(this,`company`,``),y(this,`ic`,``),y(this,`display_name`,``),y(this,`full_name`,``),y(this,`birth_date`,``),y(this,`gender`,``),y(this,`address`,``),y(this,`postcode`,``),y(this,`note`,``),y(this,`language`,``),y(this,`time_zone`,``),y(this,`created_at`,new Date),y(this,`updated_at`,new Date),y(this,`license_ids`,``),y(this,`security_stamp`,``),y(this,`phone_number`,``)}},te=class extends ee{constructor(){super(),y(this,`license_id`,0),y(this,`credit`,0),y(this,`point`,0),y(this,`transaction_total`,0),y(this,`transaction_time`,0),y(this,`user_group_id`,0),y(this,`user_group_name`,``),y(this,`group_expires_at`,null),y(this,`error`,``)}},ne=function(e){return e[e.All=1]=`All`,e[e.Inclusive=2]=`Inclusive`,e[e.Exclusive=3]=`Exclusive`,e}(ne||{}),re=function(e){return e[e.Flat=1]=`Flat`,e[e.Percent=2]=`Percent`,e}(re||{}),ie=class{constructor(){y(this,`applying_type`,ne.Inclusive),y(this,`applying_items`,[])}},ae=class{constructor(e){y(this,`guid`,``),y(this,`promo_code`,``),y(this,`is_multi_stores`,!1),y(this,`name`,``),y(this,`alias`,void 0),y(this,`description`,void 0),y(this,`description_alias`,void 0),y(this,`applying_plus`,void 0),y(this,`applying_user_tags`,void 0),y(this,`applying_user_groups`,void 0),y(this,`discount_calc_type`,re.Flat),y(this,`discount_amount`,void 0),y(this,`discount_percent`,void 0),y(this,`duration`,30),y(this,`usage_count`,0),y(this,`usage_limit_per_invoice`,1),y(this,`above_invoice_amount`,void 0),y(this,`below_invoice_amount`,void 0),y(this,`is_delivery_free`,!1),y(this,`is_individual_use`,!0),y(this,`price_in_points`,void 0),y(this,`styles`,{}),y(this,`expired_at`,void 0),y(this,`auto_gen`,!1),y(this,`can_sell`,!0),y(this,`can_redeem`,!0),e&&(this.guid=e.guid,this.promo_code=e.promo_code,this.is_multi_stores=e.is_multi_stores,this.name=e.name,this.alias=e.alias,this.description=e.description,this.description_alias=e.description_alias,this.applying_plus=e.applying_plus,this.applying_user_tags=e.applying_user_tags,this.applying_user_groups=e.applying_user_groups,this.discount_calc_type=e.discount_calc_type,this.discount_amount=e.discount_amount,this.discount_percent=e.discount_percent,this.duration=e.duration,this.usage_count=e.usage_count,this.usage_limit_per_invoice=e.usage_limit_per_invoice,this.above_invoice_amount=e.above_invoice_amount,this.below_invoice_amount=e.below_invoice_amount,this.is_delivery_free=e.is_delivery_free,this.is_individual_use=e.is_individual_use,this.price_in_points=e.price_in_points,this.styles={...e.styles},this.expired_at=e.expired_at,this.auto_gen=e.auto_gen,this.can_sell=e.can_sell,this.can_redeem=e.can_redeem)}},oe=class{constructor(e){y(this,`invoice_uid`,``),e&&(this.invoice_uid=e.invoice_uid)}},se=class{constructor(e){y(this,`guid`,``),y(this,`coupon`,new ae),y(this,`is_multi_stores`,!1),y(this,`usage`,new oe),y(this,`employee_uid`,``),y(this,`promo_code`,``),y(this,`is_expired`,!1),y(this,`is_redeemed`,!1),y(this,`is_generated`,!1),e&&(this.guid=e.guid,this.coupon=new ae(e.coupon),this.is_multi_stores=e.is_multi_stores,this.usage=new oe(e.usage),this.employee_uid=e.employee_uid,this.promo_code=e.promo_code,this.is_expired=e.is_expired,this.is_redeemed=e.is_redeemed,this.is_generated=e.is_generated)}};const ce={from(t){return e(t).format(`YYYY-MM-DD HH:mm:ss`)},to(e){return e}};var x=class{constructor(){y(this,`uid`,void 0),y(this,`updated_at`,new Date),y(this,`created_at`,new Date),y(this,`created_at_timestamp`,new Date().getTime()),y(this,`deleted_at`,null),y(this,`_timestamp`,void 0),y(this,`id_in_server`,void 0)}},S=class extends x{constructor(){super(),y(this,`name`,void 0),y(this,`name_translations`,{})}},le=class extends S{constructor(...e){super(...e),y(this,`description`,void 0),y(this,`description_translations`,{})}};let C=function(e){return e.Merchant=`mnt_`,e.Section=`sec_`,e.SectionItem=`sit_`,e.Category=`cat_`,e.Subcategory=`sat_`,e.Item=`itm_`,e.ItemModifier=`iod_`,e.ItemModifierCategory=`imc_`,e.Config=`cfg_`,e.Device=`dev_`,e.Invoice=`inv_`,e.InvoiceLine=`iln_`,e.InvoiceCharge=`ich_`,e.Payment=`pay_`,e.Employee=`emp_`,e.Shift=`shf_`,e.Till=`til_`,e.ReportCategory=`rpc_`,e.Report=`rpt_`,e.AppReport=`apr_`,e.PaymentMethod=`pmd_`,e.PrintTemplate=`ptl_`,e.PrintJob=`pjb_`,e.Printer=`prt_`,e.InvoiceDiscount=`ind_`,e.EmployeeRole=`emr_`,e.OrderDisplaySystem=`ods_`,e.Charge=`chr_`,e.Price=`prc_`,e.ComboGroup=`cbo_`,e.Storage=`sto_`,e.Menu=`men_`,e.StockLog=`stl_`,e}({}),ue=function(e){return e.Merchant=`mnt`,e.Section=`sec`,e.SectionItem=`sit`,e.Category=`cat`,e.Subcategory=`sat`,e.Item=`itm`,e.Config=`cfg`,e.Device=`dev`,e.Invoice=`inv`,e}({}),de=function(e){return e.LOCAL=`local`,e.CLOUD=`cloud`,e}({});var fe=class{constructor(){y(this,`mode`,void 0),y(this,`base_url`,void 0),y(this,`device_uid`,void 0),y(this,`merchant_uid`,void 0),y(this,`token`,void 0),y(this,`database`,void 0)}};let pe=function(e){return e.Data=`DataMessage`,e.Event=`EventMessage`,e}({});var me=class{constructor(){y(this,`model`,``),y(this,`data`,``),y(this,`has_many`,!1),y(this,`type`,pe.Data)}},w=class extends Error{constructor(e){super(e),this.name=`system_error`}};let T=function(e){return e.outdatedInvoice=`outdated invoice`,e.outdatedSectionItem=`outdated section item`,e.outdatedSourceSectionItem=`outdated source section item`,e.outdatedTargetSectionItem=`outdated target section item`,e}({}),E=function(e){return e.Open=`opened`,e.Closed=`closed`,e}({});var he=class extends x{constructor(){super(),y(this,`user_uid`,``),y(this,`started_at`,new Date),y(this,`ended_at`,new Date),y(this,`declared_amount`,0),y(this,`drawer_amount`,0),y(this,`first_invoice_number`,0),y(this,`status`,E.Open),y(this,`uid`,C.Shift+t())}};let D=function(e){return e.OpenDeposit=`open_deposit`,e.CashDeposit=`cash_deposit`,e.CashIn=`cash_in`,e.CashOut=`cash_out`,e.CashInvoice=`cash_invoice`,e}({});var O=class extends x{constructor(){super(),y(this,`user_uid`,``),y(this,`shift_uid`,``),y(this,`invoice_uid`,``),y(this,`type`,D.CashDeposit),y(this,`amount`,0),y(this,`note`,``),y(this,`uid`,C.Till+t())}};let k=function(e){return e.CLOSED=`closed`,e.OPENED=`opened`,e.PAYMENT=`payment`,e}({});var ge=class extends S{constructor(){super(),y(this,`printer_id_order_list`,[]),y(this,`order_printer_uids`,[]),y(this,`receipt_printer_uid`,``),y(this,`check_printer_uid`,``),y(this,`qr_printer_uid`,``),y(this,`total`,0),y(this,`time`,0),y(this,`pax`,0),y(this,`invoice_created_at`,new Date),y(this,`child_pax`,0),y(this,`baby_pax`,0),y(this,`uid`,C.SectionItem+t()),y(this,`invoice_uid`,``),y(this,`section_uid`,``),y(this,`status`,k.CLOSED),y(this,`size_x`,0),y(this,`size_y`,0),y(this,`row`,0),y(this,`col`,0),y(this,`is_take_out`,!1),y(this,`is_delivery`,!1),y(this,`is_locked`,!1),y(this,`soup_base_quota`,0),y(this,`soup_base_type`,0),y(this,`is_delete`,!1),y(this,`meta`,{}),y(this,`customer`,{}),y(this,`etc`,{})}},_e=class extends S{constructor(){super(),y(this,`sequence`,0),y(this,`uid`,C.Section+t())}},ve=class extends S{constructor(){super(),y(this,`permissions`,[]),y(this,`is_default`,!1),y(this,`uid`,C.EmployeeRole+t())}},ye=class{constructor(e){y(this,`item_uid`,``),y(this,`quantity`,0),y(this,`modifiers`,[]),this.item_uid=e,this.quantity=0,this.modifiers=[]}},be=class extends le{constructor(){super(),y(this,`meta`,{}),y(this,`etc`,{}),y(this,`assets`,{}),y(this,`config`,{online_order_display_large_image:!1}),y(this,`is_internal`,!1),y(this,`color`,``),y(this,`icon`,``),y(this,`sequence`,0)}},xe=class{constructor(){y(this,`system`,Se.POS),y(this,`visible`,!1),y(this,`sequence`,0)}};let Se=function(e){return e.POS=`pos`,e.QrCodeOrder=`qr_code_order`,e}({}),Ce=function(e){return e.Product=`product`,e.Modifier=`modifier`,e}({});var we=class extends be{constructor(){super(),y(this,`type`,Ce.Modifier),y(this,`visibility`,[]),y(this,`uid`,C.ItemModifierCategory+t()),y(this,`max_order`,0),y(this,`min_order`,0),y(this,`is_delisted`,!1),y(this,`code`,void 0),y(this,`printing_sequence`,0)}},Te=class extends be{constructor(){super(),y(this,`image_url`,``),y(this,`image_file_path`,``),y(this,`image_thumbnail_url`,``),y(this,`image_thumbnail_file_path`,``),y(this,`has_subcategory`,!1),y(this,`name_translations`,{}),y(this,`visibility`,void 0),y(this,`printing_sequence`,0),y(this,`type`,Ce.Product),y(this,`is_delisted`,!1),y(this,`subcategories`,[]),y(this,`uid`,C.Category+t()),y(this,`max_order`,0),y(this,`min_order`,0),y(this,`code`,void 0)}},Ee=class extends be{constructor(){super(),y(this,`category_uid`,``),y(this,`uid`,C.Subcategory+t())}};let A=function(e){return e.ByQuantity=`by_quantity`,e.ByWeight=`by_weight`,e.Service=`service`,e.Combo=`combo`,e.Modifier=`modifier`,e.Package=`package`,e}({});var De=class extends be{constructor(){super(),y(this,`image_url`,``),y(this,`image_file_path`,``),y(this,`image_thumbnail_url`,``),y(this,`image_thumbnail_file_path`,``),y(this,`visibility`,[]),y(this,`sku`,``),y(this,`type`,A.Modifier),y(this,`barcode`,``),y(this,`plu`,void 0),y(this,`category_uid`,``),y(this,`price`,0),y(this,`original_price`,0),y(this,`prices`,[]),y(this,`stock`,1e3),y(this,`print_on_receipt`,!0),y(this,`price_adjustable`,!1),y(this,`is_sold_out`,!1),y(this,`recipe`,``),y(this,`is_remark_disabled`,!1),y(this,`auto_select_first_modifier`,!1),y(this,`uid`,C.ItemModifier+t())}},j=class extends De{constructor(){super(),y(this,`codename`,``),y(this,`sku`,``),y(this,`recipe`,``),y(this,`barcode`,``),y(this,`type`,A.ByQuantity),y(this,`add_credit`,0),y(this,`add_point`,0),y(this,`category_uid`,``),y(this,`subcategory_uid`,``),y(this,`unit`,0),y(this,`stock`,0),y(this,`is_sold_out`,!1),y(this,`sold`,0),y(this,`print_on_receipt`,!0),y(this,`price`,0),y(this,`open_editor`,!0),y(this,`price_adjustable`,!1),y(this,`minus_point`,0),y(this,`cost`,0),y(this,`discountable`,!0),y(this,`printing_sequence`,0),y(this,`recommended`,!1),y(this,`likes`,0),y(this,`dislikes`,0),y(this,`is_tax_exempt`,!1),y(this,`is_service_charge_exempt`,!1),y(this,`is_point_reward_exempt`,!1),y(this,`is_credit_reward_exempt`,!1),y(this,`is_internal`,!1),y(this,`is_delisted`,!1),y(this,`uid`,C.Item+t()),y(this,`modifiers`,void 0),y(this,`modifier_categories`,void 0),y(this,`kitchen_printers_uids`,[]),y(this,`order_printers_uids`,[]),y(this,`label_printers_uids`,[]),y(this,`open_editor_panel`,!1),y(this,`open_price_editor`,!1),y(this,`combo_groups`,[])}},Oe=class extends x{constructor(){super(),y(this,`lookup_keys`,[]),y(this,`product_uid`,``),y(this,`uid`,C.Price+t()),y(this,`amount`,0),y(this,`name`,``),y(this,`name_translations`,{})}},ke=class{constructor(){y(this,`item_uid`,``),y(this,`combo_item`,new j),y(this,`price`,0),y(this,`sequence`,0),y(this,`meta`,{})}},Ae=class{constructor(){y(this,`uid`,C.ComboGroup+t()),y(this,`name`,``),y(this,`name_translations`,{}),y(this,`min_order`,1),y(this,`max_order`,1),y(this,`combo_items`,[]),y(this,`sequence`,0),y(this,`meta`,{})}},M=class e{constructor(){y(this,`_state`,e.State.CLOSED),y(this,`cleanup`,void 0),y(this,`onData`,null),y(this,`onClose`,null),y(this,`onError`,null)}get state(){return this._state}static setWindow(t){e.electronSocket=t.electronSocket}setupListeners(){this.cleanup?.(),this.cleanup=window.electronSocket.onEvent(t=>{switch(t.type){case`DataReceived`:this.onData?.(new Uint8Array(t.data));break;case`Close`:this._state=e.State.CLOSED,this.onClose?.(t.hasError),this.cleanup?.();break;case`Error`:this.onError?.(t.errorMessage);break}})}async open(t,n,r,i){try{if(this._state!==e.State.CLOSED){i?.(`Invalid state: ${this._state}`);return}this._state=e.State.OPENING,this.setupListeners(),await e.electronSocket.open(t,n)?(this._state=e.State.OPENED,r?.()):i?.(`Open failed`)}catch(t){this._state=e.State.CLOSED,this.cleanup?.(),i?.(`Open failed: ${t}`)}}async write(t,n,r){try{this._state!==e.State.OPENED&&r?.(`Socket not opened`),await e.electronSocket.write(Array.from(t))?n?.():r?.(`Write failed`)}catch(e){r?.(`Write failed: ${e}`)}}async close(t,n){if(this._state!==e.State.OPENED){n?.(`Invalid state: ${this._state}`);return}try{this._state=e.State.CLOSING,await e.electronSocket.close()?(this._state=e.State.CLOSED,this.cleanup?.(),t?.()):n?.(`Close socket failed`)}catch(t){this._state=e.State.CLOSED,this.cleanup?.(),n?.(`Close socket failed: ${t}`)}}};y(M,`State`,{CLOSED:0,OPENING:1,OPENED:2,CLOSING:3}),y(M,`electronSocket`,null);function je(e){return e===`69`}const Me={Ẳ:2,Ẵ:5,Ẫ:6,Ỷ:20,Ỹ:25,Ỵ:30,Ạ:128,Ắ:129,Ằ:130,Ặ:131,Ấ:132,Ầ:133,Ẩ:134,Ậ:135,Ẽ:136,Ẹ:137,Ế:138,Ề:139,Ể:140,Ễ:141,Ệ:142,Ố:143,Ồ:144,Ổ:145,Ỗ:146,Ộ:147,Ợ:148,Ớ:149,Ờ:150,Ở:151,Ị:152,Ỏ:153,Ọ:154,Ỉ:155,Ủ:156,Ũ:157,Ụ:158,Ỳ:159,Õ:160,ắ:161,ằ:162,ặ:163,ấ:164,ầ:165,ẩ:166,ậ:167,ẽ:168,ẹ:169,ế:170,ề:171,ể:172,ễ:173,ệ:174,ố:175,ồ:176,ổ:177,ỗ:178,Ỡ:179,Ơ:180,ộ:181,ờ:182,ở:183,ị:184,Ự:185,Ứ:186,Ừ:187,Ử:188,ơ:189,ớ:190,Ư:191,À:192,Á:193,Â:194,Ã:195,Ả:196,Ă:197,ẳ:198,ẵ:199,È:200,É:201,Ê:202,Ẻ:203,Ì:204,Í:205,Ĩ:206,ỳ:207,Đ:208,ứ:209,Ò:210,Ó:211,Ô:212,ạ:213,ỷ:214,ừ:215,ử:216,Ù:217,Ú:218,ỹ:219,ỵ:220,Ý:221,ỡ:222,ư:223,à:224,á:225,â:226,ã:227,ả:228,ă:229,ữ:230,ẫ:231,è:232,é:233,ê:234,ẻ:235,ì:236,í:237,ĩ:238,ỉ:239,đ:240,ự:241,ò:242,ó:243,ô:244,õ:245,ỏ:246,ọ:247,ụ:248,ù:249,ú:250,ũ:251,ủ:252,ý:253,ợ:254,Ữ:255};function Ne(e,t=63){let n=[];for(let r of e)if(Me[r]!==void 0)n.push(Me[r]);else{let e=r.charCodeAt(0);e<=127?n.push(e):n.push(t)}return Uint8Array.from(n)}function Pe(){return typeof Socket>`u`?new M:new Socket}var Fe=class{constructor(){y(this,`socket`,void 0),this.socket=Pe(),console.log(`this.socket`,JSON.stringify(this.socket)),this.socket.onData=function(e){console.log(`event - receive: `,e)},this.socket.onClose=function(e){console.log(`event - socket closed`)},this.socket.onError=function(e){console.error(`event - socket error:`,e)}}async testPrint(e){await this.connect(`192.168.1.253`);let t=await this.interpret(e);console.log(`escpos commands:`,JSON.stringify(t));let n=await this.write(t);return await this.disconnect(),n}async connect(e,t=9100,n=5e3){return new Promise((r,i)=>{let a,o,s=()=>{a&&window.clearTimeout(a),o&&window.clearInterval(o)};o=window.setInterval(()=>{this.socket.state===2&&(s(),r(!0))},100),a=window.setTimeout(()=>{s(),r(!1)},n),this.socket.open(e,t,()=>{},e=>{s(),r(!1)})}).catch(async e=>!1)}async write(e,t=1e4){return new Promise((n,r)=>{let i;this.socket.write(e,()=>{console.log(`write success`),clearTimeout(i),n(!0)}),i=window.setTimeout(()=>{console.error(`socket write timed out`),n(!1)},t)}).catch(e=>(console.error(`socket write exception: `,e),!1))}async interpret(e){let t=new n,r=t.initialize();if(e.codepage&&!Object.values(N).includes(e.codepage)){let t=parseInt(e.codepage,10);r.raw([31,27,31,255,t,10,0])}else e.codepage&&Object.values(N).includes(e.codepage)?t.codepage(e.codepage):t.codepage(N.SimplifiedChinese);for(let t of e.items){if(!t)throw Error(`Item is undefined or null`);switch(t.style){case Le.Bold:r.bold(!0);break;case Le.Italic:r.italic(!0);break;case Le.Underline:r.underline(!0);break;default:r.bold(!1),r.italic(!1),r.underline(!1);break}switch(t.align&&r.align(t.align),t.type){case F.Text:if(t.item?.text){if(t.item.size===P.Custom&&t.item.height&&t.item.width){if(t.item.width<0||t.item.width>7||t.item.height<0||t.item.height>7)throw Error(`font_width and font_height must be between 0 and 7`);let e=t.item.height<<4|t.item.width;r.raw([29,33,e])}else t.item.size&&r.size(t.item.size);if(je(e.codepage)){let e=Ne(t.item.text);r.raw(Array.from(e))}else r.text(t.item.text,t.item.line_width??48);t.item.size===P.Custom&&r.raw([29,33,0])}break;case F.Table:if(t.table){if(t.table.size===P.Custom&&t.table.height&&t.table.width){if(t.table.width<0||t.table.width>7||t.table.height<0||t.table.height>7)throw Error(`font_width and font_height must be between 0 and 7`);let e=t.table.height<<4|t.table.width;r.raw([29,33,e])}else t.table.size&&r.size(t.table.size);this.formatTable(t.table.items,t.table.line_width??48).forEach(n=>{if(je(e.codepage)){let e=Ne(n);r.raw(Array.from(e))}else r.text(n,t.table.line_width??48);r.newline()}),t.table.size===P.Custom&&r.raw([29,33,0])}break;case F.Line:r.line(t.item?.text?.repeat(48)??`-`.repeat(48),t.item?.line_width??48);break;case F.NewLine:t.repeat=t.repeat??1;for(let e=0;e<t.repeat;e++)r.newline();break;case F.Image:if(t.image){let e=await this.base64ToImageBitmap(t.image.base64_data);r.image(e,t.image.width,t.image.height,t.image.algorithm,t.image.threshold)}break;case F.QRCode:t.qrcode&&r.qrcode(t.qrcode.data,t.qrcode.model,t.qrcode.size,t.qrcode.errorlevel);break;case F.Barcode:t.barcode&&r.barcode(t.barcode.data,t.barcode.symbology,t.barcode.height);break;case F.Cut:r.cut(t.item?.text??`full`);break;case F.Beeper:r.beeper();break;case F.OpenCashDrawer:r.openCashDrawer();break;default:throw Error(`Unsupported item type: ${t.type}`)}}return r.encode()}formatTable(e,t=48){let n=e.map(e=>Math.floor(t*(e.column_width/100))),r=e.map((e,t)=>this.wrapText(e.text,n[t])),i=[],a=Math.max(...r.map(e=>e.length));for(let t=0;t<a;t++){let a=``;for(let i=0;i<e.length;i++){let e=r[i][t]||``;a+=this.padEnd(e,n[i])}i.push(a)}return i}padEnd(e,t){let n=Array.from(e).reduce((e,t)=>e+r(t),0);return e+` `.repeat(Math.max(0,t-n))}padStart(e,t){let n=Array.from(e).reduce((e,t)=>e+r(t),0);return` `.repeat(Math.max(0,t-n))+e}wrapText(e,t){if(typeof e!=`string`&&(e=e.toString()),!e)return[``];let n=[],i=``,a=0;for(let o of e){let e=r(o);a+e>t&&(n.push(i),i=``,a=0),i+=o,a+=e}return i&&n.push(i),n}async disconnect(){if(!this.socket||this.socket.state!==2)return!0;try{return await this.close(),!0}catch(e){throw Error(e)}}close(e=5e3){return new Promise((t,n)=>{let r=this.socket.onClose,i;this.socket.onClose=e=>{clearTimeout(i),this.socket.onClose=r,e?n(Error(`Socket closed with error: ${e}`)):t(),typeof r==`function`&&r(e)},i=window.setTimeout(()=>{this.socket.onClose=r,n(Error(`Socket close operation timed out`))},e),this.socket.close(()=>console.log(`Close initiated successfully`),e=>{clearTimeout(i),this.socket.onClose=r,n(e)})})}async base64ToImageBitmap(e){let t=e.match(/^data:(image\/(?:jpeg|png));base64,(.+)$/i);if(!t)throw Error(`base64_data format is invalid or image type is not supported (only jpeg/png allowed)`);let[,n,r]=t,i=new Blob([Uint8Array.from(atob(r),e=>e.charCodeAt(0))],{type:n});return await createImageBitmap(i)}};let N=function(e){return e.English=`cp437`,e.Greek=`cp737`,e.WesternEurope=`cp850`,e.BalticRim=`cp775`,e.CentralEurope=`cp852`,e.Cyrillic=`cp855`,e.Turkish=`cp857`,e.MultilingualLatin1WithEuro=`cp858`,e.Portuguese=`cp860`,e.Icelandic=`cp861`,e.Hebrew=`cp862`,e.FrenchCanadian=`cp863`,e.Arabic=`cp864`,e.Nordic=`cp865`,e.Russian=`cp866`,e.ModernGreek=`cp869`,e.SimplifiedChinese=`cp936`,e.Korean=`cp949`,e.TraditionalChinese=`cp950`,e.WesternEuropeanLatin=`cp1252`,e.ArabicISO=`iso88596`,e.Japanese=`shiftjis`,e.CentralEuropeanLatinWindows=`windows1250`,e.CyrillicWindows=`windows1251`,e.WesternEuropeanLatinWindows=`windows1252`,e.GreekWindows=`windows1253`,e.TurkishWindows=`windows1254`,e.HebrewWindows=`windows1255`,e.ArabicWindows=`windows1256`,e.BalticWindows=`windows1257`,e.Vietnamese=`windows1258`,e}({}),Ie=function(e){return e.Left=`left`,e.Center=`center`,e.Right=`right`,e}({}),Le=function(e){return e.Normal=`normal`,e.Bold=`bold`,e.Italic=`italic`,e.Underline=`underline`,e}({}),P=function(e){return e.Custom=`custom`,e.Normal=`normal`,e.Small=`small`,e}({}),F=function(e){return e.Text=`text`,e.Table=`table`,e.Line=`line`,e.Image=`image`,e.QRCode=`qrcode`,e.NewLine=`newline`,e.Barcode=`barcode`,e.Cut=`cut`,e.Beeper=`beeper`,e.OpenCashDrawer=`open_cash_drawer`,e}({});var Re=class{constructor(){y(this,`data`,``),y(this,`symbology`,`ean13`),y(this,`height`,0)}},ze=class{constructor(){y(this,`data`,``),y(this,`model`,2),y(this,`size`,6),y(this,`errorlevel`,`m`)}},Be=class{constructor(){y(this,`base64_data`,``),y(this,`width`,0),y(this,`height`,0),y(this,`algorithm`,`threshold`),y(this,`threshold`,128)}};let Ve=function(e){return e[e.SunmiPrinter=0]=`SunmiPrinter`,e}({});var I=class{constructor(){y(this,`codepage`,N.WesternEuropeanLatin),y(this,`items`,[])}};function L(t,n){return e(t).format(n||`YYYY-MMM-DD HH:mm:ss`)}function He(e){return`${e.getFullYear()}-${(e.getMonth()+1).toString().padStart(2,`0`)}-${e.getDate().toString().padStart(2,`0`)} ${e.getHours().toString().padStart(2,`0`)}:${e.getMinutes().toString().padStart(2,`0`)}:${e.getSeconds().toString().padStart(2,`0`)}`}var Ue=class extends S{constructor(){super(),y(this,`machine_name`,``),y(this,`connection_id`,``),y(this,`type`,Ge.Client),y(this,`etc`,{fomopay_terminal_id:``,hirector_public_key:``,hirector_private_key:``,yeahpay_app_id:``,yeahpay_device_sn:``,yeahpay_server_public_key:``,yeahpay_client_private_key:``,yeahpay_signature_key:``,yeahpay_async_url:``,sync_to_specific_cds:``})}},We=class extends S{constructor(){super(),y(this,`type`,Ge.Node),y(this,`machine_name`,``),y(this,`connection_id`,``),y(this,`etc`,{fomopay_terminal_id:``,hirector_public_key:``,hirector_private_key:``,yeahpay_app_id:``,yeahpay_device_sn:``,yeahpay_server_public_key:``,yeahpay_client_private_key:``,yeahpay_signature_key:``,yeahpay_async_url:``,sync_to_specific_cds:``})}};let Ge=function(e){return e.Client=`client`,e.Node=`node`,e}({}),R=function(e){return e.ReceiptPrinter=`receipt_printer`,e.CheckPrinter=`check_printer`,e.OrderPrinter=`order_printer`,e.KitchenPrinter=`kitchen_printer`,e.KioskPrinter=`kiosk_printer`,e.LabelPrinter=`label_printer`,e.QrCodePrinter=`qr_code_printer`,e}({});var Ke=class{constructor(){y(this,`printer_name`,``),y(this,`status`,``),y(this,`port_name`,``),y(this,`error`,``)}};let qe=function(e){return e.ESCPOS=`ESC/POS`,e.TSPL=`TSPL`,e}({}),Je=function(e){return e.USB=`USB`,e.WINDOWS_DRIVER=`WINDOWS_DRIVER`,e.ETHERNET=`ETHERNET`,e.BLUETOOTH=`BLUETOOTH`,e.BUILTIN=`BUILTIN`,e.IMIN_BUILT_IN=`IMIN_BUILT_IN`,e}({});var Ye=class{constructor(){y(this,`header`,``),y(this,`body`,``),y(this,`footer`,``),y(this,`commands`,``),y(this,`type`,R.ReceiptPrinter)}},z=class extends S{constructor(){super(),y(this,`header`,``),y(this,`body`,``),y(this,`footer`,``),y(this,`commands`,``),y(this,`printer_type`,R.ReceiptPrinter),y(this,`codepage`,void 0),y(this,`uid`,C.PrintTemplate+t()),y(this,`report_code_name`,``)}};let Xe=function(e){return e.Queued=`queued`,e.Printed=`printed`,e.Failed=`failed`,e.Expired=`expired`,e}({});var B=class extends S{constructor(e,n,r=!1,i=1){super(),y(this,`printer_name`,``),y(this,`driver_printer_name`,``),y(this,`printer_ip`,``),y(this,`printer_uid`,``),y(this,`printer_type`,R.ReceiptPrinter),y(this,`protocol`,qe.ESCPOS),y(this,`connection_type`,Je.ETHERNET),y(this,`data`,new I),y(this,`status`,Xe.Queued),y(this,`retries`,0),y(this,`commands`,``),y(this,`uid`,C.PrintJob+t()),y(this,`save_only`,!1),y(this,`print_times`,1),y(this,`printed`,0),y(this,`device_uid_to_print`,``),y(this,`designated_table_section_uids`,[]),y(this,`job_id`,0),y(this,`print_sequence`,void 0),y(this,`meta`,{}),this.driver_printer_name=e.driver_printer_name,e.protocol&&(this.protocol=e.protocol),e.connection_type&&(this.connection_type=e.connection_type),this.printer_name=e.name,this.printer_ip=e.ip_address,e.type&&(this.printer_type=e.type),this.data=n,this.printer_uid=e.uid,this.save_only=r,this.print_times=i,e.print_sequence!==void 0&&(this.print_sequence=e.print_sequence)}};let Ze=function(e){return e.Online=`online`,e.Offline=`offline`,e}({});var Qe=class extends S{constructor(){super(),y(this,`device_uid`,``),y(this,`terminal_device_uids`,[]),y(this,`type`,R.ReceiptPrinter),y(this,`is_not_default`,!1),y(this,`driver_printer_name`,``),y(this,`fallback_printer_uid`,0),y(this,`protocol`,qe.ESCPOS),y(this,`connection_type`,Je.ETHERNET),y(this,`print_template_uid`,``),y(this,`uid`,C.Printer+t()),y(this,`ip_address`,``),y(this,`status`,Ze.Online),y(this,`kitchen_itemized_print`,!1),y(this,`print_times`,1),y(this,`retries`,1),y(this,`use_device_name`,!1),y(this,`usb_device_name`,``)}},$e=class{constructor(){y(this,`config`,{}),y(this,`invoice`,{}),y(this,`report_data`,{}),y(this,`section_item`,{}),y(this,`printer_name`,``),y(this,`printed_at`,new Date),y(this,`normalized_printed_at`,``),y(this,`meta`,{}),y(this,`is_cancel`,!1),this.normalized_printed_at=L(this.printed_at)}},V=class{constructor(){y(this,`printer_name`,``),y(this,`kitchen_itemized_print`,!1),y(this,`is_cancel`,!1)}},et=class extends x{constructor(){super(),y(this,`invoice_uid`,``),y(this,`tender_amount`,0),y(this,`change_amount`,0),y(this,`payment_method_uid`,``),y(this,`payment_method_code`,``),y(this,`payment_method_name`,``),y(this,`payment_method`,new tt),y(this,`payment_method_history`,void 0),y(this,`uid`,C.Payment+t()),y(this,`updated_at`,new Date)}},tt=class extends S{constructor(){super(),y(this,`sequence`,0),y(this,`payment_currency_id`,0),y(this,`currency_code`,``),y(this,`currency_symbol`,`$`),y(this,`payment_method_code`,``),y(this,`name`,``),y(this,`codename`,``),y(this,`name_abbrev`,``),y(this,`enable_drawer`,!1),y(this,`enable_receipt`,!1),y(this,`image_url`,``),y(this,`custom_image_url`,``),y(this,`is_cash`,!1),y(this,`is_integrated`,!1),y(this,`is_disabled`,!0),y(this,`type`,0),y(this,`api_id`,``),y(this,`api_key`,``),y(this,`is_sales_exclusive`,!1),y(this,`enable_credit_validation`,!1),y(this,`enable_customer_validation`,!1),y(this,`is_cancellable`,!1),y(this,`require_zero_balance`,!1),y(this,`uid`,C.PaymentMethod+t())}},nt=class extends tt{constructor(){super(),y(this,`changed_at`,new Date),y(this,`changed_by`,``)}},rt=class{toPaymentMethod(){let e=new tt;return e.currency_code=this.currency_code||``,e.payment_method_code=this.payment_method_code||``,e.codename=this.codename||``,e.name=this.name||``,e.name_abbrev=this.name_abbrev||``,e.enable_drawer=this.enable_drawer,e.enable_receipt=this.enable_receipt,e.image_url=this.image_url||``,e.is_cash=this.is_cash,e.is_integrated=this.is_integrated,e.is_disabled=this.is_disabled,e.type=this.type,e.api_id=this.api_id||``,e.api_key=this.api_key||``,e}constructor(e){y(this,`access_token`,null),y(this,`image_base64`,null),y(this,`error`,null),y(this,`currency_code`,null),y(this,`payment_method_code`,``),y(this,`codename`,null),y(this,`name_abbrev`,null),y(this,`name`,``),y(this,`enable_drawer`,!1),y(this,`enable_receipt`,!0),y(this,`image_url`,``),y(this,`is_cash`,!1),y(this,`is_integrated`,!1),y(this,`is_disabled`,!1),y(this,`type`,0),y(this,`api_id`,null),y(this,`api_key`,null),y(this,`timestamp_create`,Date.now()),y(this,`timestamp_update`,Date.now()),e&&Object.assign(this,e)}};let it=function(e){return e.STARTED=`payment_started`,e.COMPLETED=`payment_completed`,e.FAILED=`payment_failed`,e.CANCELLED=`payment_cancelled`,e}({});var at=class extends S{constructor(){super()}},ot=class extends at{constructor(){super()}},st=class extends S{constructor(){super(),y(this,`note_group_uid`,``),y(this,`related_model`,ue.Invoice),y(this,`usage`,0)}},ct=class extends st{constructor(){super()}};let lt=function(e){return e.DineIn=`dine_in`,e.TakeOut=`take_out`,e.Delivery=`delivery`,e}({}),ut=function(e){return e.PayToOrder=`pay_to_order`,e.OrderFirstAndPayLater=`order_first_and_pay_later`,e.OnSelection=`on_selection`,e}({}),dt=function(e){return e.Inclusive=`inclusive`,e.Exclusive=`exclusive`,e}({}),H=function(e){return e.Open=`open`,e.OnHold=`on_hold`,e.Paying=`paying`,e.Paid=`paid`,e.Void=`void`,e.PayAtCounter=`pay_at_counter`,e}({}),ft=function(e){return e.Calibration=`calibration`,e.Create=`create`,e.Update=`update`,e.Cancel=`cancel`,e.Hold=`hold`,e.PaymentAsync=`payment_async`,e.Check=`check`,e.Void=`void`,e.Switch=`switch`,e.Reprint=`reprint`,e.Display=`display`,e.Merge=`merge`,e.Calculate=`calculate`,e.Delivery=`delivery`,e.Payment=`payment`,e.ChangePayment=`change_payment`,e.AddCustomer=`add_customer`,e.VoidAndDuplicate=`void_and_duplicate`,e.Duplicate=`duplicate`,e.PayAtCounter=`pay_at_counter`,e.PayInvoice=`pay_invoice`,e.SettleOnlineDeliveryOrder=`settle_online_delivery_order`,e}({}),pt=function(e){return e.quantity=`quantity`,e.weight=`weight`,e}({}),U=function(e){return e.Flat=`flat`,e.Percent=`percent`,e}({}),W=function(e){return e.AfterSubtotal=`after_subtotal`,e.AfterServiceCharge=`after_service_charge`,e.AfterGrantTotal=`after_grant_total`,e}({}),mt=function(e){return e.Custom=`custom`,e.Voucher=`voucher`,e.Coupon=`coupon`,e}({});var ht=class{constructor(){y(this,`uid`,C.InvoiceCharge+t()),y(this,`name`,``),y(this,`percentage`,0),y(this,`amount`,0),y(this,`calc_flow`,W.AfterSubtotal)}},gt=class{constructor(){y(this,`action`,ft.Create),y(this,`action_by`,``),y(this,`device_uid`,``),y(this,`action_at`,new Date)}},_t=class{constructor(){y(this,`uid`,C.Charge+t()),y(this,`name`,``),y(this,`percent`,0),y(this,`calc_flow`,W.AfterSubtotal),y(this,`trigger_condition`,``)}},vt=class{constructor(){y(this,`calc_type`,U.Flat),y(this,`amount`,0),y(this,`percent`,0),y(this,`percent_amount`,0),y(this,`type`,mt.Custom),y(this,`calc_flow`,W.AfterSubtotal),y(this,`applying_item_uids`,[]),y(this,`name`,``),y(this,`name_translation`,{}),y(this,`voucher_uid`,``),y(this,`coupon_uid`,``),y(this,`uid`,C.InvoiceDiscount+t())}},yt=class{constructor(){y(this,`item_uid`,``),y(this,`item`,new De),y(this,`price`,0),y(this,`unit_of_measure`,pt.quantity),y(this,`quantity`,0),y(this,`sent`,0),y(this,`kds_done`,0),y(this,`is_cancel_printed`,!1),y(this,`selected`,!1),y(this,`sales_user_uid`,``)}},bt=class extends x{constructor(){super(),y(this,`item_uid`,``),y(this,`price`,0),y(this,`unit_of_measure`,pt.quantity),y(this,`quantity`,0),y(this,`remark`,``),y(this,`invoice_uid`,``),y(this,`discount_calc_type`,U.Flat),y(this,`discount_amount`,0),y(this,`discount_percent`,0),y(this,`subtotal`,0),y(this,`subtotal_before_discount`,0),y(this,`item`,new j),y(this,`point`,0),y(this,`point_subtotal`,0),y(this,`up_size`,!1),y(this,`is_take_out`,!1),y(this,`is_duplicate`,!1),y(this,`is_combo`,!1),y(this,`is_combo_item`,!1),y(this,`combo_group_uid`,``),y(this,`combo_line_uid`,``),y(this,`modifiers`,[]),y(this,`duplicated_from_uid`,``),y(this,`sent`,0),y(this,`kds_done`,0),y(this,`is_cancel_printed`,!1),y(this,`selected`,!1),y(this,`sales_user_uid`,``),y(this,`meta`,{}),y(this,`attached_to_line_uid`,void 0)}},xt=class extends x{constructor(){super(),y(this,`ref_id`,``),y(this,`call_num`,``),y(this,`table_uid`,``),y(this,`table_name`,``),y(this,`type`,lt.DineIn),y(this,`pax`,0),y(this,`adult_pax`,0),y(this,`child_pax`,0),y(this,`baby_pax`,0),y(this,`subtotal`,0),y(this,`point_subtotal`,0),y(this,`service_chargeable_subtotal`,0),y(this,`discountable_subtotal`,0),y(this,`service_charge`,0),y(this,`delivery_id`,0),y(this,`delivery_charge`,0),y(this,`delivery_type`,``),y(this,`delivery_by`,``),y(this,`use_customer_point`,!1),y(this,`add_point`,0),y(this,`minus_point`,0),y(this,`rewarded_point_rate`,0),y(this,`rewarded_point`,0),y(this,`use_customer_balance`,!1),y(this,`add_credit`,0),y(this,`minus_credit`,0),y(this,`rewarded_credit_rate`,0),y(this,`rewarded_credit`,0),y(this,`discounts`,[]),y(this,`discount_amount`,0),y(this,`tax`,0),y(this,`rounding`,0),y(this,`tip`,0),y(this,`grand_total`,0),y(this,`customer_id`,0),y(this,`remark`,``),y(this,`sales_user_uid`,``),y(this,`status`,H.Open),y(this,`paid_at`,new Date(0)),y(this,`voided_at`,new Date(0)),y(this,`humanized_paid_at`,``),y(this,`humanized_voided_at`,``),y(this,`humanized_created_at`,``),y(this,`order_id`,0),y(this,`to_address`,new b),y(this,`payment_source_method`,``),y(this,`payment_source_last4`,``),y(this,`payment_source_charge_ref`,``),y(this,`is_sales_exclusive`,!1),y(this,`etc`,{}),y(this,`action`,void 0),y(this,`lines`,[]),y(this,`deleted_lines`,[]),y(this,`payment_has_cash`,!1),y(this,`payments`,[]),y(this,`table_switch_id`,0),y(this,`employee_uid`,``),y(this,`employee_name`,``),y(this,`receipt_print_override`,!1),y(this,`customer`,new te),y(this,`is_duplicate`,!1),y(this,`kitchen_print_override`,!1),y(this,`otp`,``),y(this,`activities`,[]),y(this,`receipt_print_job_uid`,``),y(this,`kitchen_print_job_uids`,[]),y(this,`label_print_job_uids`,[]),y(this,`charges`,[]),y(this,`is_charge_triggered`,!1),y(this,`uid`,C.Invoice+t()),y(this,`meta`,{}),y(this,`price_lookup_key`,``)}},St=class extends x{constructor(){super(),y(this,`user_uid`,void 0),y(this,`name`,void 0),y(this,`email`,void 0),y(this,`password`,void 0),y(this,`uid`,C.Employee+t()),y(this,`role_uid`,``),y(this,`language`,`en`),y(this,`can_login`,!0)}},Ct=class extends x{constructor(){super(),y(this,`config`,new jt),y(this,`cache`,new wt),y(this,`storage`,{pricing_lookup_keys:[],pay_in_reasons:[],pay_out_reasons:[]})}},wt=class{constructor(){y(this,`printers`,[])}},Tt=class{constructor(){}},Et=class{constructor(){y(this,`enable_price_tiers`,!1),y(this,`rewarded_credit_rate`,0),y(this,`rewarded_point_rate`,0),y(this,`inclusive_service_charge`,!1),y(this,`inclusive_tax`,!1),y(this,`default_country_code`,`+65`),y(this,`disable_member_price_prompt`,!1)}},Dt=class{constructor(){y(this,`enabled`,!1),y(this,`full_screen_assets`,[]),y(this,`half_screen_assets`,[]),y(this,`is_logo_hidden`,!1),y(this,`order_list_font_size`,`1.875rem`),y(this,`order_modifier_font_size`,`1.25rem`),y(this,`screen_width`,1024),y(this,`screen_height`,768),y(this,`order_display_duration`,60)}};let Ot=function(e){return e.SmoochPay=`SPCD`,e.YeahPay=`YEAP`,e}({});var kt=class{constructor(){y(this,`takeaway_only`,!1),y(this,`guest_order_only`,!1),y(this,`disable_paynow_payment`,!1),y(this,`disable_card_payment`,!1),y(this,`disable_receipt_printer_receipt`,!1),y(this,`landing_image`,``),y(this,`menu_banner_image`,``),y(this,`home_page_images`,[]),y(this,`paynow_method`,Mt.WyoPaynow),y(this,`card_payment_code`,Ot.SmoochPay)}},At=class{constructor(){y(this,`point`,{sms_notification:!1,above_invoice_amount:0,conversion_rate:0,inclusive_service_charge:!1,inclusive_tax:!1}),y(this,`credit`,{sms_notification:!1,above_invoice_amount:0,conversion_rate:0,inclusive_service_charge:!1,inclusive_tax:!1})}},jt=class{constructor(){y(this,`general`,new It),y(this,`product`,new Ft),y(this,`till`,new Lt),y(this,`report`,new Rt),y(this,`receipt`,new zt),y(this,`kitchen`,new Bt),y(this,`kds`,new Vt),y(this,`label`,new Ht),y(this,`order`,new Ut),y(this,`ods`,new Wt),y(this,`payment`,new Gt),y(this,`user`,new Kt),y(this,`tax`,new qt),y(this,`rounding`,new Xt),y(this,`inventory`,new Zt),y(this,`pax_config`,new Qt),y(this,`gto`,new $t),y(this,`cash_drawer`,new en),y(this,`marketing`,new At),y(this,`charges`,new Jt),y(this,`currency`,new Yt),y(this,`cds`,new Dt),y(this,`kiosk`,new kt),y(this,`online_order`,new Nt),y(this,`loyalty_program`,new Et),y(this,`crm`,new Tt)}};let Mt=function(e){return e.FomoOnlinePaynow=`PNWO`,e.WyoPaynow=`WPPN`,e}({});var Nt=class{constructor(){y(this,`enable_membership`,!1),y(this,`login_call_to_action_text`,``),y(this,`menu_banner_image_url`,``),y(this,`paynow_method`,void 0),y(this,`disable_pay_at_counter`,!1),y(this,`disable_paynow_payment`,!1),y(this,`default_language`,`en`),y(this,`category_selector_mode`,`photo_mode`),y(this,`dynamic_order_qr`,{default_order_flow:ut.OrderFirstAndPayLater,select_order_flow:!1,select_menus:!1}),y(this,`max_dining_time`,0),y(this,`disable_logo_for_item_photo_fallback`,!1),y(this,`whatsapp_login_only`,!1),y(this,`enable_whatsapp_login`,!1),y(this,`assets`,{})}};let Pt=function(e){return e.PROD=`prod`,e.DEV=`dev`,e}({});var Ft=class{constructor(){y(this,`enable_codename_search`,!1),y(this,`item_name_font_size`,14),y(this,`item_name_bg_opacity`,75)}},It=class{constructor(){y(this,`company_name`,``),y(this,`company_name_alias`,``),y(this,`company_logo`,``),y(this,`company_tax_reg_no`,``),y(this,`company_postcode`,``),y(this,`company_address`,``),y(this,`company_country`,``),y(this,`company_tel`,``),y(this,`business_day_cutoff_hour`,0),y(this,`floor_plan_table_name`,`table`),y(this,`deploy_channel`,Pt.PROD),y(this,`language`,`en`),y(this,`debug`,!1),y(this,`logging`,!1),y(this,`offline_mode`,!1),y(this,`opening_schedules`,[{opening_hours:{open:`10:00`,close:`22:00`}}])}},Lt=class{constructor(){y(this,`control`,!0),y(this,`slip`,!0)}},Rt=class{constructor(){y(this,`itemized_consolidated`,!0),y(this,`itemized_separated`,``),y(this,`shift_itemized`,!0),y(this,`start_time`,`09:00:01`),y(this,`end_time`,`23:59:59`),y(this,`shift_print_time`,1),y(this,`shift_disable`,!1),y(this,`email`,!1),y(this,`day_boundary_offset`,0)}},zt=class{constructor(){y(this,`enabled`,!0),y(this,`show_print_dialog`,!1),y(this,`print_docket`,!1),y(this,`hide_non_price_item`,!1),y(this,`receipt_no_reset_daily`,!1),y(this,`language`,`en`),y(this,`disable_persistent_tcp`,!1)}},Bt=class{constructor(){y(this,`enabled`,!0),y(this,`print_item_price`,!1),y(this,`print_cancel_slip`,!1),y(this,`print_cancel_whole_invoice`,!1),y(this,`language`,`en`)}},Vt=class{constructor(){y(this,`enabled`,!0),y(this,`display_order_after_payment`,!1),y(this,`print_slip_upon_completed`,!1)}},Ht=class{constructor(){y(this,`print`,!1),y(this,`text_to_raster`,!1)}},Ut=class{constructor(){y(this,`separation_line`,!1),y(this,`slip`,!0),y(this,`slip_font_size_ratio`,1),y(this,`max_dinning`,0),y(this,`exit_menu_after_payment`,!1),y(this,`hide_combo_item_on_receipt`,!1),y(this,`hide_combo_item_on_interactive_view`,!1),y(this,`hide_categories_when_ordering`,!1),y(this,`end_shift_with_open_tables`,!1),y(this,`datetime_format`,`YYYY-MMM-DD HH:mm:ss`),y(this,`ref_prefix`,`01`)}},Wt=class{constructor(){y(this,`enabled`,!1),y(this,`language`,`en`)}},Gt=class{constructor(){y(this,`quick_cash_payment`,!1),y(this,`notification`,!0),y(this,`quick`,!1)}},Kt=class{constructor(){y(this,`control`,!0)}},qt=class{constructor(){y(this,`enabled`,!0),y(this,`method`,dt.Inclusive),y(this,`rate`,7),y(this,`name`,`GST`)}},Jt=class{constructor(){y(this,`service_charge`,!1),y(this,`service_charge_rate`,10)}},Yt=class{constructor(){y(this,`currency_symbol`,`$`),y(this,`is_symbol_after_amount`,!1)}},Xt=class{constructor(){y(this,`base`,.1),y(this,`up`,!0),y(this,`cashless`,!1),y(this,`prepayment_rounding`,!1)}},Zt=class{constructor(){y(this,`inventory_control`,!1),y(this,`sold_out_for_today_only`,!1)}},Qt=class{constructor(){y(this,`pax`,!0),y(this,`detail`,!1)}},$t=class{constructor(){y(this,`interface`,``),y(this,`genesis_date`,``),y(this,`upload_time`,``),y(this,`ftp_svr`,``),y(this,`ftp_usr`,``),y(this,`ftp_port`,``),y(this,`ftp_path`,``),y(this,`ftp_pwd`,``),y(this,`mall_id`,``),y(this,`machine_id`,``),y(this,`ftp_type`,`ftp`)}},en=class{constructor(){y(this,`kick_code`,`27, 112, 48, 55, 121`),y(this,`connection_mode`,`via_receipt_printer`)}},tn=class{constructor(e){y(this,`name`,``),y(this,`base64`,``),y(this,`extension`,`png`),Object.assign(this,e)}};const nn=e=>e===``||e===void 0,rn=e=>t=>nn(e)||t.includes(e),an=e=>t=>nn(e)||e.includes(t),on=(e,t)=>n=>n>e&&n<t,sn=e=>typeof e==`function`?(t,n)=>!e(t,n):t=>t!=e,cn=e=>e,ln=e=>t=>!t.deleted_at&&Object.keys(e).every(n=>{if(nn(e[n])||t[n]===e[n])return!0;if(typeof e[n]==`function`)return e[n](t[n],t)});var un=class{constructor(){y(this,`db`,void 0),y(this,`moduleName`,void 0)}get table(){return this.db.table(this.moduleName)}liveQuery(e){return a(e)}async saveOne(e){let n={...e};return n.created_at||(n.created_at=new Date),n.uid||(n.uid=t()),n.updated_at=new Date,await this.db.table(this.moduleName).put(n),n}async saveMany(e){let n=e.map(e=>(e.uid||(e.uid=t(),e.created_at=new Date),e.updated_at=new Date,e));return await this.db.table(this.moduleName).bulkPut(n),n}async hasAny(){return await this.db.table(this.moduleName).count()>0}async getOne(e){return await this.db.table(this.moduleName).get(e)||null}async getOneByParams(e){return this.db.table(this.moduleName).filter(ln(e)).first()}async getDefaultOne(){return this.moduleName?this.db.table(this.moduleName).filter(e=>e.deleted_at===null||e.deleted_at===void 0).first():null}async getAll(){return this.db.table(this.moduleName).toArray()}async getMany(e={},t={}){let{page:n=1,pageSize:r=10,...i}=t||{},a=await this.db.table(this.moduleName).filter(ln(e)).count(),o=this.db.table(this.moduleName).filter(ln(e));return r!==-1&&o.offset((n-1)*r).limit(r),{list:await o.toArray(),count:a,page:n,pageSize:r}}},dn=class extends un{async updateOne(e,t){throw Error(`Method not implemented.`)}async deleteOne(e){throw Error(`Method not implemented.`)}},G=class extends un{constructor(...e){super(...e),y(this,`http`,void 0),y(this,`methodName`,void 0),y(this,`options`,void 0)}async addOne(e){return this.http.put(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/${this.methodName}`,e)}async updateOne(e,t){return this.http.patch(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/${e}`,t)}async updateMany(e){return this.http.patch(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}`,e)}async deleteOne(e){return e.deleted_at=new Date,this.http.delete(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/${e.id_in_server}`)}async hardDeleteOne(e){return await this.db.table(this.moduleName).delete(e.uid),e}};let fn=function(e){return e[e.printable=0]=`printable`,e[e.generative=1]=`generative`,e}({});var pn=class{constructor(){y(this,`uid`,C.ReportCategory+ +t()),y(this,`name`,``),y(this,`name_translations`,{}),y(this,`reports`,[]),y(this,`created_at`,new Date),y(this,`created_at_timestamp`,new Date().getTime()),y(this,`updated_at`,new Date),y(this,`deleted_at`,null)}},mn=class{constructor(){y(this,`uid`,C.Report+t()),y(this,`name`,``),y(this,`name_translations`,{}),y(this,`type`,void 0),y(this,`codename`,``),y(this,`created_at`,new Date),y(this,`created_at_timestamp`,new Date().getTime()),y(this,`updated_at`,new Date),y(this,`deleted_at`,null)}},hn=class extends x{constructor(){super(),y(this,`uid`,C.AppReport+t()),y(this,`reports`,[]),y(this,`version`,1)}},gn=class{constructor(){y(this,`start_datetime`,``),y(this,`humanized_start_datetime`,``),y(this,`end_datetime`,``),y(this,`humanized_end_datetime`,``),y(this,`humanized_printed_datetime`,``),y(this,`sales_summary`,new _n),y(this,`drawer_summary`,new vn),y(this,`payments_summary`,[]),y(this,`loyalty_program_summary`,new bn),y(this,`item_sales_summary`,[]),y(this,`item_sales_summary_total`,0),y(this,`item_sales_summary_total_count`,0),y(this,`item_sales_summary_by_category`,[]),y(this,`modifier_sales_summary`,[]),y(this,`modifier_sales_summary_total`,0),y(this,`modifier_sales_summary_total_count`,0),y(this,`config`,{}),y(this,`invoice_discount_summary`,[]),y(this,`item_discount_summary`,[])}},_n=class{constructor(){y(this,`sales_total`,0),y(this,`foc_sales_total`,0),y(this,`foc_sales_count`,0),y(this,`rounding_total`,0),y(this,`tax_total`,0),y(this,`service_charge_total`,0),y(this,`discount_total`,0),y(this,`voucher_total`,0),y(this,`voucher_count`,0),y(this,`coupon_total`,0),y(this,`coupon_count`,0),y(this,`paid_invoice_count`,0),y(this,`paid_invoice_total`,0),y(this,`void_invoice_count`,0),y(this,`void_invoice_total`,0),y(this,`total_pax`,0),y(this,`pax_sales_total`,0)}},vn=class{constructor(){y(this,`open_amount`,0),y(this,`declared_amount`,0),y(this,`drawer_amount`,0),y(this,`difference`,0),y(this,`pay_in_total`,0),y(this,`pay_in_count`,0),y(this,`cash_invoice_total`,0),y(this,`cash_invoice_count`,0),y(this,`pay_out_total`,0),y(this,`pay_out_count`,0)}},yn=class{constructor(){y(this,`code`,``),y(this,`name`,``),y(this,`total`,0),y(this,`count`,0)}},bn=class{constructor(){y(this,`add_credit_total`,0),y(this,`add_credit_count`,0),y(this,`topup_paid_total`,0),y(this,`topup_paid_count`,0),y(this,`rewarded_credit_total`,0),y(this,`rewarded_credit_count`,0),y(this,`minus_credit_total`,0),y(this,`minus_credit_count`,0),y(this,`rewarded_point_total`,0),y(this,`rewarded_point_count`,0),y(this,`minus_point_total`,0),y(this,`minus_point_count`,0)}},xn=class{constructor(){y(this,`item`,{}),y(this,`quantity`,0),y(this,`total_amount`,0),y(this,`modifiers`,[])}},Sn=class{constructor(){y(this,`item`,{}),y(this,`quantity`,0),y(this,`total_amount`,0)}},Cn=class{constructor(){y(this,`category`,null),y(this,`items`,[]),y(this,`total_quantity`,0),y(this,`total_amount`,0)}},wn=class extends G{constructor(e,t,n,r=`printers`,i=`printer`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i,y(this,`configService`,void 0),y(this,`printJobService`,void 0),y(this,`printersFromCache`,void 0),this.configService=new Rr(e,t,n,`configs`,`config`),this.printJobService=new qr(e,t,n,`print_jobs`,`print_job`),this.init().catch(e=>console.error(e))}async init(){this.printersFromCache||(this.printersFromCache=(await this.configService.getDefaultOne())?.cache?.printers??[])}async getPhysicalPrintersFromNode(){return(await this.http.get(`api/v5/merchants/`+this.options.merchant_uid+`/`+this.moduleName+`/get_physical_printers`)).data}async getUnpairedNode(){return this.http.get(`api/v5/merchants/`+this.options.merchant_uid+`/node`)}async pairNode(e){return this.http.get(`api/v5/merchants/`+this.options.merchant_uid+`/nodes/${e}/pair-node`)}async getDefaultPrinter(e){let t=await this.db.table(`printers`).filter(t=>t.type===e&&t.deleted_at==null).toArray();return t.find(e=>!e.is_not_default)||t[0]||null}async getDefaultReceiptPrinter(){return this.getDefaultPrinter(R.ReceiptPrinter)}async getDefaultPrinterByType(e){return this.getDefaultPrinter(e)}async getDefaultKioskPrinter(){return this.getDefaultPrinter(R.KioskPrinter)}async getDefaultCheckPrinter(){return this.getDefaultPrinter(R.CheckPrinter)}async getDefaultKitchenPrinter(){return this.getDefaultPrinter(R.KitchenPrinter)}async getDefaultOrderPrinter(){return this.getDefaultPrinter(R.OrderPrinter)}async getPrintersByUids(e){return this.db.table(`printers`).where(`uid`).anyOf(e).filter(e=>e.deleted_at==null).toArray()}async searchPrinters(e=!1,t=9100){if(this.printersFromCache&&!e)return this.printersFromCache;let n=[],r=await d.getWiFiIPAddress();console.log(`ipAddress`,r);let i=r.subnet.split(`.`).map(Number),a=r.ip.split(`.`).map(Number);a[3]=0;let o=i.reduce((e,t,n)=>e+(t^255)*256**(3-n),0);for(let e=1;e<o;e++){let r=[...a],i=3,o=e;for(;o>0;){let e=o%256;for(o=Math.floor(o/256),r[i]+=e;r[i]>254&&i>0;)r[i]-=256,r[--i]++}let s=r.join(`.`);console.log(`ip`,s),await new Fe().connect(s,t,200)&&n.push(s)}return await this.configService.updateCache({printers:n}),n}async openCashDrawer(){let e=await this.getDefaultReceiptPrinter(),t=new I;t.items.push({type:F.OpenCashDrawer});let n=new B(e,t,!1,1);await this.printJobService.addOne(n)}};function K(e,t=2){let n=10**t;return Math.round(e*n)/n}function Tn(e){let t=e.name,n=t.lastIndexOf(`.`);return n===-1||n===t.length-1?``:t.slice(n+1)}function En(e){return new Promise((t,n)=>{let r=new FileReader;r.onloadend=()=>{typeof r.result==`string`?t(r.result.split(`,`)[1]):n(Error(`Could not convert file to Base64.`))},r.onerror=()=>n(Error(`File reading failed.`)),r.readAsDataURL(e)})}const q=(e,t)=>e.replace(/([a-z])([A-Z])/g,`$1 $2`).replace(/[_\-\.]+/g,` `).toLowerCase().replace(/[\s]+(\w)/g,(e,n)=>t(n)),Dn=e=>e.replace(/^\W+|\W+$/g,``),On=e=>typeof e==`string`?q(e,e=>e.toUpperCase()):``,kn=e=>typeof e==`string`?e.charAt(0).toUpperCase()+e.slice(1):``,An=e=>typeof e==`string`?e.replace(/\w\S*/g,e=>kn(e)):``,jn=e=>typeof e==`string`?q(e,e=>`-`+e):``,Mn=e=>typeof e==`string`?q(e,e=>`.`+e):``,Nn=e=>Pn(e),Pn=e=>typeof e==`string`?e.toLowerCase():``,Fn=e=>{if(typeof e!=`string`)return``;let t=q(e,e=>e.toUpperCase());return t.charAt(0).toUpperCase()+t.slice(1)},In=e=>typeof e==`string`?q(e,e=>`/`+e):``,Ln=e=>typeof e==`string`?e.replace(/((?:\S[^\.\?\!]*)[\.\?\!]*)/g,e=>e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()):``,Rn=e=>typeof e==`string`?q(e,e=>`_`+e):``,zn=e=>typeof e==`string`?e.replace(/[- _]+/g,` `).split(` `).map(e=>kn(e)).join(` `):``,Bn=e=>Vn(e),Vn=e=>typeof e==`string`?e.toUpperCase():``,Hn=(e,t)=>typeof e==`string`&&typeof t==`string`?e+t:e,Un=(e,t)=>{if(typeof e!=`string`)return``;let n=``;for(let e=0;e<t;e++)n+=`&nbsp;`;return n+e+n},Wn=e=>typeof e==`string`?Dn(e):``,Gn=e=>typeof e==`string`?e.split(` `).join(`-`):``,Kn=(e,t=` `)=>typeof e==`string`?(typeof t!=`string`&&(t=` `),e.split(t).join(`+`)):``,qn=(e,t)=>typeof e==`string`&&typeof t==`string`?t+e:e,Jn=(e,t)=>typeof e==`string`?typeof t==`string`?e.split(t).join(``):e:``,Yn=(e,t)=>typeof e==`string`?typeof t==`string`?e.replace(t,``):e:``,Xn=(e,t,n)=>typeof e==`string`?typeof t==`string`?(typeof n!=`string`&&(n=``),e.split(t).join(n)):e:``,Zn=(e,t,n)=>typeof e==`string`?typeof t==`string`?(typeof n!=`string`&&(n=``),e.replace(t,n)):e:``,Qn=e=>typeof e==`string`?e.split(``).reverse().join(``):``,$n=(e,t=`,`)=>typeof e==`string`?(typeof t!=`string`&&(t=`,`),e.split(t)):[],er=(e,t)=>typeof e==`string`?e.length<=t?e:ir(e,t)+`…`:``,tr=e=>typeof e==`string`?e.trim():``,nr=e=>typeof e==`string`?e.replace(/^\s+/,``):``,rr=e=>typeof e==`string`?e.replace(/\s+$/,``):``,ir=(e,t,n=``)=>typeof e==`string`?(typeof n!=`string`&&(n=``),e.length>t?e.slice(0,t-n.length)+n:e):``;var ar={camelcase:On,capitalize:kn,capitalizeAll:An,dashcase:jn,dotcase:Mn,downcase:Nn,lowercase:Pn,pascalcase:Fn,pathcase:In,sentence:Ln,snakecase:Rn,titleize:zn,upcase:Bn,uppercase:Vn,append:Hn,center:Un,chop:Wn,hyphenate:Gn,plusify:Kn,prepend:qn,remove:Jn,removeFirst:Yn,replace:Xn,replaceFirst:Zn,reverse:Qn,split:$n,ellipsis:er,trim:tr,trimLeft:nr,trimRight:rr,truncate:ir,truncateWords:(e,t,n=`…`)=>{if(typeof e==`string`&&typeof t==`number`){typeof n!=`string`&&(n=`…`);let r=e.split(/[ \t]/);return(t>r.length?r:r.slice(0,t)).join(` `).trim()+n}return``},isString:e=>typeof e==`string`,occurrences:(e,t)=>{if(typeof e!=`string`)return 0;let n=t.length,r=0,i=0;for(;(r=e.indexOf(t,r))>-1;)i++,r+=n;return i}};const or=e=>e&&typeof e==`object`&&typeof e.fn==`function`,J=(e,t,n)=>or(n)?e?n.fn?n.fn(t):!0:n.inverse?n.inverse(t):!1:e,sr=function(...e){let t=e.pop();return J(e.every(e=>!!e),this,t)},cr=function(...e){let t=e.pop();return J(e.some(e=>!!e),this,t)},lr=function(e,t){return J(!e,this,t)},ur=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),J(e===t,this,n)},dr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),J(e==t,this,n)},fr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),J(e!==t,this,n)},pr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),J(e!=t,this,n)},mr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),J(e>t,this,n)},hr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),J(e>=t,this,n)},gr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),J(e<t,this,n)},_r=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),J(e<=t,this,n)},vr=function(e,t,n,r){if(arguments.length<4)throw Error(`Helper {{compare}} expects 4 arguments`);let i;switch(t){case`==`:i=e==n;break;case`===`:i=e===n;break;case`!=`:i=e!=n;break;case`!==`:i=e!==n;break;case`<`:i=e<n;break;case`>`:i=e>n;break;case`<=`:i=e<=n;break;case`>=`:i=e>=n;break;case`typeof`:i=typeof e===n;break;default:throw Error(`Helper {{compare}}: invalid operator: \`${t}\``)}return J(i,this,r)},yr=function(e,t,n){return typeof n==`number`&&(n=arguments[3]),J(e==null?!1:Array.isArray(e)||typeof e==`string`?e.includes(t):typeof e==`object`?t in e:!1,this,n)},br=yr,xr=function(e,...t){let n=t.pop();return J(t.includes(e),this,n)},Sr=(e,t)=>{if(!(!e||!t))return t.split(`.`).reduce((e,t)=>e?.[t],e)},Cr=e=>{let t=[];for(let n=0;n<e.length-1;n+=2)typeof e[n]==`string`&&!or(e[n+1])&&t.push({prop:e[n],value:e[n+1]});return t};var wr={and:sr,or:cr,not:lr,eq:ur,is:dr,neq:fr,isnt:pr,gt:mr,gte:hr,lt:gr,lte:_r,compare:vr,contains:yr,includes:br,in:xr,findAnd:function(e,...t){if(!Array.isArray(e))return null;let n=Cr(t);return e.find(e=>n.every(t=>Sr(e,t.prop)===t.value))||null},findOr:function(e,...t){if(!Array.isArray(e))return null;let n=Cr(t);return e.find(e=>n.some(t=>Sr(e,t.prop)===t.value))||null},filterAnd:function(e,...t){if(!Array.isArray(e))return[];let n=Cr(t);return e.filter(e=>n.every(t=>Sr(e,t.prop)===t.value))},filterOr:function(e,...t){if(!Array.isArray(e))return[];let n=Cr(t);return e.filter(e=>n.some(t=>Sr(e,t.prop)===t.value))},default:function(...e){for(let t=0;t<e.length-1;t++)if(e[t]!=null)return e[t];return``},neither:function(e,t,n){return J(!e&&!t,this,n)},ifEven:function(e,t){return J(e%2==0,this,t)},ifOdd:function(e,t){return J(e%2!=0,this,t)},ifNth:function(e,t,n){return J(typeof e==`number`&&typeof t==`number`&&t%e===0,this,n)}};function Tr(e){let t=e?.handlebars||e?.hbs||h(`handlebars`);return Object.keys(ar).forEach(e=>{t.registerHelper(e,ar[e])}),Object.keys(wr).forEach(e=>{t.registerHelper(e,wr[e])}),t.helpers}var Er=Tr,Dr=class extends x{constructor(){super(),y(this,`uid`,C.OrderDisplaySystem+t()),y(this,`order_number`,``),y(this,`status`,Y.Preparing)}};let Y=function(e){return e.Preparing=`preparing`,e.ReadyForPickup=`ready_for_pickup`,e}({});var Or=class extends G{constructor(e,t,n,r=`order_displays`,i=`order_display`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async toPickUp(e){let t=await this.getOne(e);if(!t)throw new w(`Display order not found`);if(t.status==`ready_for_pickup`)throw new w(`Order is already ready for pickup`);if(t.status=Y.ReadyForPickup,t.updated_at=new Date,t.id_in_server==0)throw new w(`Order is not synced with server`);return await this.updateOne(t.id_in_server,t),t}async toPreparing(e){let t=await this.getOne(e);if(!t)throw new w(`Display order not found`);if(t.status==`preparing`)throw new w(`Order is already preparing`);if(t.status=Y.Preparing,t.updated_at=new Date,t.id_in_server==0)throw new w(`Order is not synced with server`);return await this.updateOne(t.id_in_server,t),t}async undo(){let e=await this.db.table(this.moduleName).filter(e=>e.status==Y.ReadyForPickup).reverse().limit(100).toArray();if(e.length===0)throw new w(`No order to undo`);e.sort((e,t)=>{let n=new Date(e.updated_at).getTime();return new Date(t.updated_at).getTime()-n});let t=e[0];if(t.status=Y.Preparing,t.updated_at=new Date,t.id_in_server==0)throw new w(`Order is not synced with server`);return await this.updateOne(t.id_in_server,t),t}};Er({handlebars:f});const kr={quantity:1,price:0,remark:``};var Ar=class extends G{constructor(e,t,n,r=`invoices`,i=`invoice`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i,y(this,`tillService`,void 0),y(this,`sectionItemService`,void 0),y(this,`configService`,void 0),y(this,`printTemplateService`,void 0),y(this,`printerService`,void 0),y(this,`printJobService`,void 0),y(this,`itemService`,void 0),y(this,`orderDisplayService`,void 0),this.tillService=new X(e,t,n,`tills`,`till`),this.sectionItemService=new Br(e,t,n,`section_items`,`section_item`),this.configService=new Rr(e,t,n,`configs`,`config`),this.printTemplateService=new Yr(e,t,n,`print_templates`,`print_template`),this.printerService=new wn(e,t,n,`printers`,`printer`),this.printJobService=new qr(e,t,n,`print_jobs`,`print_job`),this.itemService=new Ir(e,t,n,`items`,`item`),this.orderDisplayService=new Or(e,t,n)}calculate(e,t,n=!1){if(e.lines==null||e.lines.length<1)return this.resetInvoiceCalculations(e),e;if(this.calculateLines(e),this.calculatePointSubtotal(e),this.calculateInvoiceServiceChargeableSubtotal(e),e.discount_amount=0,this.calculateDiscount(e,W.AfterSubtotal),e.grand_total<0&&(e.grand_total=0,e.service_chargeable_subtotal=0),this.calculateInvoiceCharges(e,W.AfterSubtotal),e.subtotal>0&&e.discount_amount>0){let t=1-e.discount_amount/e.subtotal;e.service_chargeable_subtotal=K(Math.max(0,e.service_chargeable_subtotal*t),2)}else e.discount_amount>=e.subtotal&&(e.service_chargeable_subtotal=0);let r=t.config.charges.service_charge?t.config.charges.service_charge_rate:0;this.calculateServiceCharge(e,r),this.calculateDiscount(e,W.AfterServiceCharge),e.grand_total<0&&(e.grand_total=0),this.calculateInvoiceCharges(e,W.AfterServiceCharge);let i=t.config.tax.enabled?t.config.tax.rate:0;return this.calculateTax(e,i,t.config.tax.method),this.calculateDeliveryCharge(e),this.calculateCreditDeduction(e),n?e.rounding=0:this.calculateRounding(e,t.config.rounding.base,t.config.rounding.up,t.config.rounding.cashless,t.config.rounding.nearest),this.calculateDiscount(e,W.AfterGrantTotal),e.grand_total<0&&(e.grand_total=0),this.calculateInvoiceCharges(e,W.AfterGrantTotal),e.grand_total=K(e.grand_total),e.rewarded_credit_rate=t.config?.loyalty_program?.rewarded_credit_rate??0,this.calculateRewardCredit(e,0,t.config?.loyalty_program?.inclusive_service_charge,t.config?.loyalty_program?.inclusive_tax),this.calculateAddCredit(e),this.calculateAddPoint(e),e.rewarded_point_rate=t.config?.loyalty_program?.rewarded_point_rate??0,this.calculateRewardPoint(e,t.config?.loyalty_program?.rewarded_point_rate,t.config?.loyalty_program?.inclusive_service_charge,t.config?.loyalty_program?.inclusive_tax),e.grand_total<0&&(e.grand_total=0),this.calculateChangeAmount(e),e}calculateLines(e){e.subtotal=0,e.point_subtotal=0;let t=0;for(let n of e.lines)this.calculateLine(n),t+=n.subtotal,e.subtotal+=K(n.subtotal,2),e.point_subtotal+=n.point_subtotal;e.subtotal=K(t,2),e.grand_total=K(e.subtotal,2)}calculateLine(e){this.resetLineCalculations(e),e.point_subtotal=e.quantity*e.point;let t=0;e.modifiers&&(t=e.modifiers.reduce((e,t)=>e+t.price*t.quantity,0)),e.subtotal=e.subtotal_before_discount=K(e.quantity*(e.price+t),2),e.item.discountable&&(e.discount_amount>0||e.discount_percent>0)&&(e.discount_calc_type==U.Flat||(e.discount_amount=K(e.subtotal*e.discount_percent,2)),e.subtotal-=e.discount_amount),e.subtotal=K(e.subtotal,2)}calculatePointSubtotal(e){if(e.point_subtotal=0,!(e.lines==null||e.lines.length<1)){for(let t of e.lines)t.point_subtotal=t.quantity*t.point,e.point_subtotal+=t.point_subtotal;e.minus_point=e.point_subtotal}}calculateInvoiceServiceChargeableSubtotal(e){(e.lines==null||e.lines.length<1)&&(e.service_chargeable_subtotal=0),e.service_chargeable_subtotal=K(K(e.lines.filter(e=>!e.is_take_out&&!e.item.is_service_charge_exempt).reduce((e,t)=>e+t.subtotal,0)),2)}calculateDiscount(e,t){if(!e?.lines?.length)return;let n=0;if(e.discountable_subtotal=K(e.lines.filter(e=>e.item.discountable).reduce((e,t)=>e+t.subtotal,0),2),e.discounts?.length){for(let r of e.discounts.filter(e=>e.calc_flow==t))if(!r.applying_item_uids?.length)r.calc_type==U.Flat?n+=r.amount:(r.percent_amount=K((e.discountable_subtotal-e.discount_amount-n)*r.percent),n+=r.percent_amount);else{let t=0,i=!1;for(let n of e.lines)r.applying_item_uids.includes(n.item_uid)&&n.price>t&&(t=n.price,i=!0);if(!i){e.discounts=e.discounts.filter(e=>e.uid!=r.uid);continue}r.calc_type==U.Flat?(r.amount=K(r.amount>t?t:r.amount),n+=r.amount):(r.percent_amount=K(t*r.percent),n+=r.percent_amount)}e.discount_amount+=K(n),e.grand_total=K(e.grand_total-n)}}calculateRounding(e,t,n,r,i){if(e.rounding=0,!t||!r&&!e.payment_has_cash)return;let a=(e.payments?.filter(e=>!e.payment_method?.is_cash)||[]).reduce((e,t)=>e+t.tender_amount-t.change_amount,0),o=a>0?e.grand_total-a:e.grand_total;e.rounding=K(this.roundingStep(o,t,n,i)),e.grand_total+=e.rounding}roundingStep(e,t,n,r){let i=Math.round(e*100),a=Math.round(t*100),o=i%a;if(o===0)return 0;let s;return s=r?o>=a/2?a-o:-o:n?a-o:-o,K(s/100)}calculateDeliveryCharge(e){e.delivery_charge>0&&e.type===lt.Delivery&&(e.grand_total+=e.delivery_charge,e.grand_total=K(e.grand_total,2))}calculateServiceCharge(e,t){let n=0;e.service_charge=0,!(e.lines==null||e.lines.length<1)&&(e.type==lt.Delivery||e.type==lt.TakeOut||(t>0&&(n=e.service_chargeable_subtotal*(t/100)),e.service_charge=K(n,2),e.grand_total+=e.service_charge,e.grand_total=K(e.grand_total,2)))}calculateTax(e,t,n){if(e.tax=0,t<=0)return;let r=this.calculateTaxSubtotalRatio(e),i=e.grand_total-e.service_charge;n===dt.Inclusive?e.tax=K(i*r*t/(100+t)+e.service_charge*t/(100+t),2):(e.tax=K(i*r*t/100+e.service_charge*t/100,2),e.grand_total=K(e.grand_total+e.tax,2))}calculateCreditDeduction(e){e.minus_credit>0&&(e.minus_credit>e.grand_total&&(e.minus_credit=e.grand_total),e.grand_total-=e.minus_credit)}calculateTaxSubtotalRatio(e){let t=1;return!e.lines||!e.lines.some(e=>e.item.is_tax_exempt)||e.grand_total===0||e.subtotal===0||(t=1-e.lines.filter(e=>e.item.is_tax_exempt).reduce((e,t)=>e+t.subtotal,0)/e.subtotal),t}calculateRewardCredit(e,t,n,r){if(e.rewarded_credit=0,e.grand_total<=0||t>0&&t>e.grand_total)return;let i=e.rewarded_credit_rate,a=e.grand_total;n||(a-=e.service_charge),r||(a-=e.tax),a-=e.lines.filter(e=>e.item.is_credit_reward_exempt).reduce((e,t)=>e+t.subtotal,0),e.rewarded_credit=K(a*i,2)}calculateAddCredit(e){let t=0;if(e.add_credit=0,!(!e.lines||e.lines.length<=0)){for(let n of e.lines.filter(e=>e.item.add_credit>0))t+=n.item.add_credit*n.quantity;e.add_credit=t}}calculateAddPoint(e){let t=0;if(e.add_point=0,!(!e.lines||e.lines.length<=0)){for(let n of e.lines.filter(e=>e.item.add_point>0))t+=n.item.add_point*n.quantity;e.add_point=t}}calculateRewardPoint(e,t,n,r){if(e.rewarded_point=0,e.rewarded_point_rate<=0||e.grand_total<=0)return;let i=e.grand_total;n||(i-=e.service_charge),r||(i-=e.tax),i-=e.lines.filter(e=>e.item.is_point_reward_exempt).reduce((e,t)=>e+t.subtotal,0),e.rewarded_point=Math.floor(i*e.rewarded_point_rate)}calculateDiscountFromTargetTotal(e,t,n){if(this.calculate(e,n),t>=e.grand_total)return 0;let r=n.config.rounding.base||.01,i=0,a=e.grand_total-t+r*10;for(;a-i>r/2;){let r=K((i+a)/2,2);if(r===i||r===a)break;let o=s.cloneDeep(e);o.discounts||(o.discounts=[]),o.discounts.push({...new vt,calc_type:U.Flat,calc_flow:W.AfterServiceCharge,amount:r}),this.calculate(o,n),o.grand_total<=t?a=r:i=r}let o=s.cloneDeep(e);if(o.discounts=[...o.discounts||[],{...new vt,calc_type:U.Flat,calc_flow:W.AfterServiceCharge,amount:a}],this.calculate(o,n),o.grand_total>t)throw Error(`Target grand total ${t} is unreachable`);return K(a,2)}resetInvoiceCalculations(e){e.subtotal=0,e.point_subtotal=0,e.service_chargeable_subtotal=0,e.service_charge=0,e.tax=0,e.grand_total=0,e.rounding=0,e.discount_amount=0,e.minus_credit=0,e.rewarded_credit=0,e.rewarded_point=0,e.add_credit=0,e.add_point=0,e.charges&&e.charges.length>0&&e.charges.forEach(e=>{e.amount=0})}resetLineCalculations(e){e.subtotal=0,e.subtotal_before_discount=0,e.point_subtotal=0}calculateChangeAmount(e){if(e.payments.length<=0||e.payments.every(e=>!e.payment_method.is_cash))return;let t=K(e.payments.reduce((e,t)=>e+t.tender_amount,0)-e.grand_total);e.payments.filter(e=>e.payment_method.is_cash);let n=e.payments.filter(e=>e.payment_method.is_cash);n.forEach(e=>e.change_amount=0);let r=n[n.length-1];r.change_amount=K(t)}calculateInvoiceCharges(e,t){if(!(!e.charges||e.charges.length===0))for(let n of e.charges.filter(e=>e.calc_flow===t)){let t=0;switch(n.calc_flow){case W.AfterSubtotal:t=e.subtotal;break;case W.AfterServiceCharge:t=e.subtotal+e.service_charge;break;case W.AfterGrantTotal:t=e.grand_total;break;default:t=e.subtotal}n.percentage>0&&(n.amount=K(t*(n.percentage/100),2)),e.grand_total+=n.amount,e.grand_total=K(e.grand_total,2)}}},jr=class extends Ar{addItemToLine(e,n,r,i,a,o,s,c,l){let u={...kr,...o};e.lines??(e.lines=[]);let d=this.findOrCreateLine(e,i,u.quantity,u.price,a,u.remark,s,c,l);return i.type==A.Combo&&(d.is_combo=!0),d.uid?(d.quantity+=u.quantity,d.quantity<=0&&(e.lines=e.lines.filter(e=>e.uid!==d.uid))):u.quantity>0&&(d.uid=C.InvoiceLine+t(),e.lines.push(d)),d}duplicateLine(e,n){let r=s.cloneDeep(n);r.is_duplicate=!0,r.duplicated_from_uid=n.uid,r.uid=C.InvoiceLine+t(),e.lines.push(r);for(let i of this.getAttachedLines(e,n.uid)){let n=s.cloneDeep(i);n.uid=C.InvoiceLine+t(),n.attached_to_line_uid=r.uid,e.lines.push(n)}return e}addAttachedItemsToLine(e,t,n,r,i){if(!n?.length)return[];let a=[];for(let o of n){let n=this.addItemToLine(e,r,i,o,[],{quantity:t.quantity},!0);n.attached_to_line_uid=t.uid,a.push(n)}return a}getAttachedLines(e,t){return e.lines?.filter(e=>e.attached_to_line_uid===t)||[]}calibrateDuplicates(e){if(!e.lines||e.lines.length<=0)return e;let t=e.lines.filter(e=>e.is_duplicate);for(let n of t){let t=e.lines.find(e=>e.uid===n.duplicated_from_uid&&!e.is_duplicate);t&&this.compareLines(t,n)?(t.quantity+=n.quantity,t.sent+=n.sent,e.lines=e.lines.filter(e=>e!==n)):n.is_duplicate=!1}return e}toInvoiceCoreLine(e,t=1){let n=new yt;return n.item=s.cloneDeep(e),n.item_uid=e.uid,n.quantity=t,n.price=e.price,n}addModifier(e,t){if(!e||e.length<=0)return[t];{let n=e.findIndex(e=>e.item_uid===t.item_uid&&e.price===t.price);return n<0?e.push(t):e[n].quantity+=t.quantity,e}}changeLinePrice(e,t){return e==null||(e.price=t),e}changeLineDiscount(e,t,n){if(e==null)return e;if(t==U.Percent&&n>100)throw new w(`Discount percent can not be more than 100%`);if(t==U.Flat&&n>e.subtotal)throw new w(`Discount amount can not be more than price`);return e.discount_calc_type=t,t==U.Flat?e.discount_amount=n:e.discount_percent=n,e}minusLineQuantity(e,t,n,r=!1){if(n<=0)throw new w(`Quantity can not be less than 0, input a positive quantity to minus the line quantity`);if(e.lines==null||e.lines.length<=0)return e;if(!t)throw new w(`Line can not be null or empty`);if(t.quantity-t.sent<Math.abs(n)){let i=Math.abs(n)-(t.quantity-t.sent),a=s.cloneDeep(t);a.quantity=i,a.sent=i,r||e.deleted_lines.push(a),t.sent-=i}t.quantity<=n&&(e.lines=e.lines.filter(e=>e.uid!==t.uid)),t.quantity-=n;let i=this.getAttachedLines(e,t.uid);if(t.quantity<=0){let t=new Set(i.map(e=>e.uid));e.lines=e.lines.filter(e=>!t.has(e.uid))}else for(let e of i)e.quantity=t.quantity}addLineQuantity(e,t,n){if(e.lines==null||e.lines.length<=0)return e;t.quantity+=n;for(let n of this.getAttachedLines(e,t.uid))n.quantity=t.quantity}minusModifierQuantity(e,t,n=0){if(!e||e.length<=0)return e;{n=n??0;let r=e.findIndex(e=>e.item_uid===t.item_uid&&e.price===t.price);return r<0||(e[r].quantity<=n?e.splice(r,1):e[r].quantity-=n),e}}changeModifierQuantity(e,t,n){if(!e||e.length<=0)return e;n=n??0;let r=e.findIndex(e=>e.item_uid===t.item_uid&&e.price===t.price);return r<0?e:(e[r].quantity+=n,e[r].quantity<=0&&e.splice(r,1),e)}addModifierQuantity(e,t,n=0){if(!e||e.length<=0)return e;{n=n??0;let r=e.findIndex(e=>e.item_uid===t.item_uid&&e.price===t.price);return r<0||(e[r].quantity+=n),e}}changeModifierPrice(e,t){return e&&(e.price=t,e)}overwriteNoteToLine(e,t){return t&&(e.remark=t),e}findOrCreateLine(e,t,n,r=0,i=[],a=``,o=!1,s,c){if(r=r??t.price,!e.lines||e.lines.length<=0||o)return this.createInvoiceLine(t,n,r,i,a);{let o=e.lines.filter(e=>e.item_uid===t.uid);if(!o||o.length<=0)return this.createInvoiceLine(t,n,r,i,a);if(s&&c){for(let e of o)if(e.is_combo_item&&this.compareModifiers(e.modifiers,i)&&e.remark===a&&e.price===r&&e.combo_line_uid===s&&e.combo_group_uid===c)return e}else for(let e of o)if(!e.is_combo_item&&this.compareModifiers(e.modifiers,i)&&e.remark===a&&e.price===r&&!e.is_take_out)return e;return this.createInvoiceLine(t,n,r,i,a)}}createInvoiceLine(e,t,n=0,r=[],i=``){let a=new bt;return a.item=s.cloneDeep(e),a.item_uid=e.uid,a.quantity=t,a.point=e.minus_point,a.price=n??e.price,a.quantity=t,a.modifiers=r,a.remark=i,a}compareModifiers(e,t){if(e.length!==t.length)return!1;for(let n of e)if(!t.some(e=>e.item_uid===n.item_uid&&e.price===n.price&&e.quantity===n.quantity))return!1;return!0}compareLines(e,t){return!(e.remark!=t.remark||e.price!=t.price||e.is_take_out!=t.is_take_out||e.discount_calc_type!=t.discount_calc_type||e.discount_amount!=t.discount_amount||e.discount_percent!=t.discount_percent||!this.compareModifiers(e.modifiers,t.modifiers))}addComboItemToLine(e,t,n,r,i,a,o,s){let c=this.addItemToLine(e,t,n,r,o,s,!1,i,a);return c.is_combo_item=!0,c.combo_line_uid=i,c.combo_group_uid=a,c}removeAllComboItems(e,t,n=!1){if(!e.lines||e.lines.length==0)return[];let r=e.lines.filter(e=>e.combo_line_uid==t&&e.is_combo_item);return e.lines=s.differenceBy(e.lines,r,`uid`),n||e.deleted_lines.push(...r),r}duplicateComboLines(e,n){if(!n.is_combo)throw new w(`Line is not a combo`);let r=s.cloneDeep(n);return r.uid=C.InvoiceLine+t(),r.is_duplicate=!0,r.duplicated_from_uid=n.uid,e.lines.push(r),e.lines.filter(e=>e.combo_line_uid===n.uid&&e.is_combo_item).forEach(n=>{let i=s.cloneDeep(n);i.uid=C.InvoiceLine+t(),i.combo_line_uid=r.uid,i.is_duplicate=!0,e.lines.push(i)}),e}},Mr=class extends jr{async addInvoice(e){let t=await this.http.put(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/add_invoice`,e);if(t.error==T.outdatedInvoice)throw await this.saveOne(t.data),new w(t.error);if(t.error)throw new w(t.error);return t.data}async createInvoice(e,t,n){e.status=H.Open,e.ref_id||(e.ref_id=await this.getRefId()),e.call_num||(e.call_num=e.ref_id.slice(-3)),e.table_name=t.name,e.table_uid=t.uid,t.invoice_uid=e.uid,t.status=k.OPENED,this.sectionItemService.syncInvoiceData(t,e),this.addEmployeeToInvoice(e,n),e.created_at=new Date,e.created_at_timestamp=e.created_at.getTime();let r=(await this.configService.getDefaultOne()).config?.order?.datetime_format;e.humanized_created_at=L(e.created_at,r),t.invoice_created_at=new Date;let i=await this.createKitchenPrintJobs(e),a=await this.createLabelPrintJobs(e),o=await this.createOrderPrintJobs(e),s=this.sortPrintJobsByPrinterSequence([...i,...a,...o]);e.kitchen_print_job_uids||(e.kitchen_print_job_uids=[]),e.label_print_job_uids||(e.label_print_job_uids=[]);let c=e.kitchen_print_job_uids.length,l=e.label_print_job_uids.length,u=i.map(e=>e.uid),d=a.map(e=>e.uid);u.length>0&&e.kitchen_print_job_uids.push(u),d.length>0&&e.label_print_job_uids.push(d),await this.preprocessInvoice(e);let f={invoice:e,section_item:t};s.length>0&&(f.print_jobs=s);try{let e=await this.http.put(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/${this.methodName}`,f);if(e.error==T.outdatedInvoice)throw await this.saveOne(e.data),f.invoice=e.data,new w(e.error);if(e.error==T.outdatedSectionItem)throw await this.sectionItemService.saveOne(e.data),f.section_item=e.data,new w(e.error);return f}catch(t){throw e.kitchen_print_job_uids.length=c,e.label_print_job_uids.length=l,t}}async updateInvoice(e,t,n){this.sectionItemService.syncInvoiceData(t,e),this.addEmployeeToInvoice(e,n),e.updated_at=new Date;let r=await this.createKitchenPrintJobs(e),i=await this.createCancelKitchenPrintJobs(e,e.deleted_lines),a=await this.createLabelPrintJobs(e),o=await this.createOrderPrintJobs(e),s=this.sortPrintJobsByPrinterSequence([...r,...i,...a,...o]);e.kitchen_print_job_uids||(e.kitchen_print_job_uids=[]),e.label_print_job_uids||(e.label_print_job_uids=[]);let c=e.kitchen_print_job_uids.length,l=e.label_print_job_uids.length,u=r.map(e=>e.uid),d=a.map(e=>e.uid);u.length>0&&e.kitchen_print_job_uids.push(u),d.length>0&&e.label_print_job_uids.push(d),await this.preprocessInvoice(e);let f={invoice:e,section_item:t};s.length>0&&(f.print_jobs=s);try{let e=await this.http.patch(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/update_invoice`,f);if(e.error==T.outdatedInvoice)throw await this.saveOne(e.data),new w(`${e.error}, system has updated the data, please try again`);if(e.error==T.outdatedSectionItem)throw await this.sectionItemService.saveOne(e.data),f.section_item=e.data,new w(`${e.error}, system has updated the data, please try again`);return f}catch(t){throw e.kitchen_print_job_uids.length=c,e.label_print_job_uids.length=l,t}}async cancelInvoice(e,t,n){if(e.id_in_server==0&&e.lines.length<=0)throw new w(`The invoice is empty and nothing can be canceled.`);if(e.id_in_server==0)return e.lines=[],{invoice:e,section_item:t};e.status=H.Void,t.invoice_uid=``,t.status=k.CLOSED,this.sectionItemService.reset(t),this.addEmployeeToInvoice(e,n);let r=await this.createReceiptPrintJob(e,R.ReceiptPrinter,!0),i={invoice:e,section_item:t};r&&(i.print_jobs=[r]);let a=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/cancel_invoice`,i);if(a.error==T.outdatedInvoice)throw await this.saveOne(a.data),i.invoice=a.data,new w(a.error);if(a.error==T.outdatedSectionItem)throw await this.sectionItemService.saveOne(a.data),i.section_item=a.data,new w(a.error);return i}async checkInvoice(e,t,n,r){t.status=k.PAYMENT,this.addEmployeeToInvoice(e,n);let i=await this.createReceiptPrintJob(e,R.CheckPrinter,!1,0,r),a=await this.createLabelPrintJobs(e),o=await this.createKitchenPrintJobs(e),s=await this.createOrderPrintJobs(e),c=[...a,...o,...s];i&&c.push(i);let l=this.sortPrintJobsByPrinterSequence(c);e.kitchen_print_job_uids||(e.kitchen_print_job_uids=[]),e.label_print_job_uids||(e.label_print_job_uids=[]);let u=e.kitchen_print_job_uids.length,d=e.label_print_job_uids.length,f=o.map(e=>e.uid),p=a.map(e=>e.uid);f.length>0&&e.kitchen_print_job_uids.push(f),p.length>0&&e.label_print_job_uids.push(p),await this.preprocessInvoice(e);let m={invoice:e,section_item:t};l.length>0&&(m.print_jobs=l);try{let e=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/check_invoice`,m);if(e.error==T.outdatedInvoice)throw await this.saveOne(e.data),m.invoice=e.data,new w(e.error);if(e.error==T.outdatedSectionItem)throw await this.sectionItemService.saveOne(e.data),m.section_item=e.data,new w(e.error);return m}catch(t){throw e.kitchen_print_job_uids.length=u,e.label_print_job_uids.length=d,t}}async switchInvoice(e,t,n,r){if(t.uid==n.uid)throw new w(`source and target table can not be the same`);if(t.status!=k.CLOSED)throw new w(`target table is occupied`);if(e.lines==null||e.lines.length<=0)throw new w(`source table has nothing to switch`);t.invoice_uid=e.uid,t.status=n.status,this.sectionItemService.syncInvoiceData(t,e),n.invoice_uid=``,n.status=k.CLOSED,this.sectionItemService.reset(n),e.table_uid=t.uid,e.table_name=t.name,this.addEmployeeToInvoice(e,r);let i={invoice:e,target_section_item:t,source_section_item:n},a=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/switch_invoice`,i);if(a.error==T.outdatedInvoice)throw await this.saveOne(a.data),i.invoice=a.data,new w(a.error);if(a.error==T.outdatedSourceSectionItem)throw await this.sectionItemService.saveOne(a.data),i.source_section_item=a.data,new w(a.error);if(a.error==T.outdatedTargetSectionItem)throw await this.sectionItemService.saveOne(a.data),i.target_section_item=a.data,new w(a.error);return i}async payInvoice(e,t,n,r,i){e.status=H.Paid,t.invoice_uid=``,t.status=k.CLOSED,this.sectionItemService.reset(t),this.addEmployeeToInvoice(e,r),e.paid_at=new Date;let a=(await this.configService.getDefaultOne()).config,o=a?.order?.datetime_format;e.humanized_paid_at=L(e.paid_at,o),e.payment_has_cash=e.payments?.some(e=>e.payment_method?.is_cash===!0);let s=await this.getStockChangeList(e,!1),c=await this.createLabelPrintJobs(e),l=await this.createReceiptPrintJob(e,R.ReceiptPrinter,!1,0,i),u=await this.createKitchenPrintJobs(e),d=await this.createCancelKitchenPrintJobs(e,e.deleted_lines),f=await this.createOrderPrintJobs(e),p=[...c,...u,...d,...f];l&&p.push(l);let m=this.sortPrintJobsByPrinterSequence(p);e.kitchen_print_job_uids||(e.kitchen_print_job_uids=[]),e.label_print_job_uids||(e.label_print_job_uids=[]);let h=e.kitchen_print_job_uids.length,g=e.label_print_job_uids.length,_=u.map(e=>e.uid),v=c.map(e=>e.uid);_.length>0&&e.kitchen_print_job_uids.push(_),v.length>0&&e.label_print_job_uids.push(v),await this.preprocessInvoice(e);let y={invoice:e,section_item:t,till:n};m.length>0&&(y.print_jobs=m);try{let t=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/pay_invoice`,y);if(t.error==T.outdatedInvoice)throw await this.saveOne(t.data),y.invoice=t.data,new w(`${t.error}, system has updated the data and please try again`);if(t.error==T.outdatedSectionItem)throw await this.sectionItemService.saveOne(t.data),y.section_item=t.data,new w(`${t.error}, system has updated the data and please try again`);if(s.length>0&&await this.itemService.changeItemsStock(s),e.call_num&&a?.ods?.enabled){let t=new Dr;t.order_number=e.call_num,await this.orderDisplayService.addOne(t)}return y}catch(t){throw e.kitchen_print_job_uids.length=h,e.label_print_job_uids.length=g,t}}async directPayInvoice(e,t,n,r,i,a=!1){e.status=H.Paid,n!=null&&this.addEmployeeToInvoice(e,n),e.paid_at=new Date;let o=(await this.configService.getDefaultOne()).config,s=o?.order?.datetime_format;e.humanized_paid_at=L(e.paid_at,s),e.created_at=new Date,e.created_at_timestamp=e.created_at.getTime(),e.humanized_created_at=L(e.created_at,s),e.ref_id||(e.ref_id=await this.getRefId()),e.call_num||(e.call_num=e.ref_id.slice(-3)),e.payment_has_cash=e.payments?.some(e=>e.payment_method?.is_cash===!0);let c=await this.getStockChangeList(e,!1),l=null,u=null;if(r&&r.type==R.KioskPrinter){let t=!!o?.kiosk?.disable_receipt_printer_receipt;l=await this.createReceiptPrintJob(e,R.ReceiptPrinter,t),u=await this.createReceiptPrintJob(e,R.KioskPrinter,!1,0,r,i)}else l=await this.createReceiptPrintJob(e,R.ReceiptPrinter,!1,0,r);let d=await this.createLabelPrintJobs(e),f=await this.createKitchenPrintJobs(e,a),p=await this.createOrderPrintJobs(e),m=[...d,...f,...p];l&&m.push(l),u&&m.push(u);let h=this.sortPrintJobsByPrinterSequence(m),g=f.map(e=>e.uid),_=d.map(e=>e.uid);g.length>0&&(e.kitchen_print_job_uids=[g]),_.length>0&&(e.label_print_job_uids=[_]),await this.preprocessInvoice(e);let v={invoice:e,till:t};h.length>0&&(v.print_jobs=h);let y=await this.http.put(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/direct_pay_invoice`,v);if(y.error==T.outdatedInvoice)throw await this.saveOne(y.data),v.invoice=y.data,new w(y.error);if(c.length>0&&await this.itemService.changeItemsStock(c),e.call_num&&o?.ods?.enabled){let t=new Dr;t.order_number=e.call_num,await this.orderDisplayService.addOne(t)}return v}async voidInvoice(e,t,n,r){n&&(e.etc.void_reason=n);let i=e.status;e.status=H.Void,e.voided_at=new Date;let a=(await this.configService.getDefaultOne()).config?.order?.datetime_format;e.humanized_voided_at=L(e.voided_at,a),t&&(t.deleted_at=new Date),this.addEmployeeToInvoice(e,r);let o=(await this.configService.getDefaultOne()).config,s=await this.createReceiptPrintJob(e,R.ReceiptPrinter,!0),c=[];o.kitchen.print_cancel_whole_invoice&&(c=await this.createCancelKitchenPrintJobs(e,e.lines)||[]);let l=[...c];s&&l.push(s);let u={invoice:e,till:t};l.length>0&&(u.print_jobs=l);let d=await this.tillService.db.table(`tills`).where({invoice_uid:e.uid}).toArray(),f=d.filter(e=>e.type===D.CashInvoice&&!e.deleted_at).reduce((e,t)=>e+t.amount,0);if(f>0){let t=new O;t.type=D.CashInvoice,t.amount=-f,t.invoice_uid=e.uid,t.shift_uid=d[0]?.shift_uid,t.user_uid=r?.uid||d[0]?.user_uid,u.till=t}if(e.table_uid){let t=await this.sectionItemService.getOne(e.table_uid);t.status!=k.CLOSED&&(t.invoice_uid=``,t.status=k.CLOSED,u.section_item=t)}let p=[];i==H.Paid&&(p=await this.getStockChangeList(e));let m=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/void_invoice`,u);if(m.error==T.outdatedInvoice)throw await this.saveOne(m.data),u.invoice=m.data,new w(m.error);return p.length>0&&await this.itemService.changeItemsStock(p),u}async duplicateInvoice(e,n){if(e.status!=H.Paid)throw new w(`invalid invoice status`);let r=s.cloneDeep(e);if(r.etc.is_duplicate=!0,r.etc.duplicated_from_uid=r.uid,r.uid=C.Invoice+t(),r.status=H.Open,r.ref_id=await this.getRefId(),this.addEmployeeToInvoice(r,n),r.lines)for(let e of r.lines)e.uid=C.InvoiceLine+t();if(r.payments)for(let e of r.payments)e.uid=C.Payment+t();return r}async reprintReceipt(e,n=!1,r){if(!e?.receipt_print_job_uid)throw new w(`The invoice does not have a receipt`);let i=await this.printJobService.getOne(e.receipt_print_job_uid);if(!i){let t=new p().addParam(`uid`,`EqualTo`,e.receipt_print_job_uid),n=await this.printJobService.autoquery(t);if(!n.results||n.results.length<=0)throw new w(`The invoice does not have a receipt`);i=n.results[0]}let a=r;if(a||(a=await this.printerService.getOne(i.printer_uid)),a||(a=await this.printerService.getDefaultReceiptPrinter()),!a)throw new w(`Receipt printer not found`);return i=this.printJobService.replacePrinter(i,a),i.uid=C.PrintJob+t(),i.save_only=n,i.status=Xe.Queued,i.print_times=1,i.printed=0,i.retries=0,i.created_at_timestamp=Date.now(),await this.printJobService.addOne(i),i}async printLastKitchenSlips(e){let n=await this.getOne(e);if(!n)throw new w(`Invoice not found`);let r=n.kitchen_print_job_uids?.[n.kitchen_print_job_uids.length-1]||[],i=n.label_print_job_uids?.[n.label_print_job_uids.length-1]||[],a=[...r,...i];if(a.length===0)throw new w(`No kitchen or label print found`);let o=new p().addParam(`uid`,`In`,a),s=await this.printJobService.autoquery(o);if(!s.results||s.results.length===0)throw new w(`Print jobs not found`);for(let e of s.results){let n=await this.printerService.getOne(e.printer_uid);if(!n)continue;let r=this.printJobService.replacePrinter(e,n),i=r.uid;r.uid=C.PrintJob+t(),r.save_only=!1,r.status=Xe.Queued,r.print_times=1,r.printed=0,r.retries=0,r.created_at_timestamp=Date.now(),r.meta||(r.meta={}),r.meta.is_reprint=!0,r.meta.parent_uid=i,await this.printJobService.addOne(r)}return!0}addInvoiceDiscount(e,t,n,r=W.AfterSubtotal,i=`custom`,a={}){if(e.discounts||(e.discounts=[]),t==U.Percent&&n>100)throw new w(`Discount percent can not be more than 100%`);let o=new vt;return o.calc_type=t,o.calc_flow=r,o.name=i,o.name_translation=a,t==U.Flat?o.amount=n:o.percent=n,e.discounts.push(o),e}addCouponToInvoice(e,t,n=W.AfterSubtotal){e.discounts||(e.discounts=[]);let r=new vt;if(r.calc_type=t.coupon.discount_calc_type==1?U.Flat:U.Percent,r.calc_flow=n,r.name=t.coupon.name,r.calc_type==U.Flat?r.amount=t.coupon.discount_amount:r.percent=t.coupon.discount_percent,r.coupon_uid=t.guid,t.coupon.applying_plus.applying_items?.length>0&&(r.applying_item_uids=t.coupon.applying_plus.applying_items,!e.lines||s.intersection(r.applying_item_uids,e.lines.map(e=>e.item_uid)).length===0))throw new w(`Coupon can not applied to any product in this order`);return e.discounts.push(r),e}removeInvoiceDiscount(e,t){return e.discounts&&(e.discounts=e.discounts.filter(e=>e.uid!==t)),e}overwriteNoteToInvoice(e,t){return t&&(e.remark=t),e}addSalesPersonToInvoice(e,t){return e.sales_user_uid=t,e}addPaxToInvoice(e,t){return e.pax=t,e}addCustomerToInvoice(e,t){if(!t)throw new w(`Customer object can not be null`);return e.customer_id=t.id,e.customer=s.cloneDeep(t),e}async autoQuery(e,t){return await this.http.get(`sapi/v5/merchants/${this.options.merchant_uid}/${this.moduleName}`,{params:e.build(),...t})}appendInvoice(e,t){if(e?.id_in_server==0)return t;for(let n of t.lines)if(n.is_combo||n.is_combo_item)n.quantity>0&&e.lines.push(n);else{let t=this.findOrCreateLine(e,n.item,n.quantity,n.price,n.modifiers,n.remark);t.uid?t.quantity+=n.quantity:n.quantity>0&&e.lines.push(n)}return t.remark&&(e.remark=t.remark),t.customer_id&&!e.customer_id&&(e.customer_id=t.customer_id),e}async mergeInvoice(e,t){if(t.lines?.length==0)throw new w(`Source invoice has no nothing to merge`);if(t.lines.some(e=>e.quantity!=e.sent))throw new w(`Please send first before merging`);if(!await this.getOne(e.uid))throw new w(`Target invoice not found`);if(!await this.getOne(t.uid))throw new w(`Source invoice not found`);if(e?.id_in_server==0)throw new w(`Target invoice is not synced to server`);if(t?.id_in_server==0)throw new w(`Source invoice is not synced to server`);for(let n of t.lines)if(n.is_combo||n.is_combo_item)n.quantity>0&&e.lines.push(n);else{let t=this.findOrCreateLine(e,n.item,n.quantity,n.price,n.modifiers,n.remark);t.uid?t.quantity+=n.quantity:n.quantity>0&&e.lines.push(n)}return e.customer_id||(e.customer_id=t.customer_id),e}async getRefId(){let e=(await this.configService.getDefaultOne()).config?.order?.ref_prefix||`01`,t=(await this.http.get(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/${this.methodName}/get_invoice_counter`)).data.toString().padStart(9,`0`);return`${e}${this.formatDate(new Date)}${t}`}async changePayments(e,t){if(e.status!=H.Paid)throw new w(`invalid invoice status`);if(!t||t.length<1)throw new w(`invalid options`);for(let n of t){let t=e.payments.find(e=>e.uid==n.source_payment.uid);if(!t)throw new w(`payment not found`);t.payment_method_uid=n.target_payment_method.uid,t.payment_method_code=n.target_payment_method.payment_method_code,t.payment_method_name=n.target_payment_method.name,t.payment_method=s.cloneDeep(n.target_payment_method),t.payment_method_history=s.cloneDeep(n.target_payment_method),t.payment_method_history.changed_at=new Date}return e.is_sales_exclusive=e.payments.some(e=>e.payment_method.is_sales_exclusive),e}formatDate(e){let t=e.getFullYear().toString().slice(-2),n=(e.getMonth()+1).toString().padStart(2,`0`),r=e.getDate().toString().padStart(2,`0`);return t+n+r}addEmployeeToInvoice(e,t){return t?(e.employee_uid=t.uid,e.employee_name=t.name,e):e}async createReceiptPrintJob(e,t,n=!1,r=0,i=null,a){let o;if(i)o=i;else if(t==R.ReceiptPrinter||t==R.CheckPrinter){let n=e.table_uid?await this.sectionItemService.getOne(e.table_uid):null,r=t==R.ReceiptPrinter?n?.receipt_printer_uid:n?.check_printer_uid;r&&(o=await this.printerService.getOne(r)),o||(o=t==R.ReceiptPrinter?await this.printerService.getDefaultReceiptPrinter():await this.printerService.getDefaultCheckPrinter())}if(!o||!o.print_template_uid)return null;r||(r=o.print_times);let s=await this.configService.getDefaultOne(),c=await this.printTemplateService.getOneByParams({uid:o.print_template_uid});if(!c)throw new w(`Print template not found`);t==R.ReceiptPrinter&&!s.config?.receipt?.enabled&&(n=!0);let l=await this.printTemplateService.renderPrintTemplate(e,s.config,c,{...new V,printer_name:o.name}),u=new B(o,l,n,r);return t!=R.ReceiptPrinter&&(u.printer_type=t),o.connection_type!=Je.ETHERNET&&(u.connection_type=o.connection_type),t==R.ReceiptPrinter&&(e.receipt_print_job_uid=u.uid),a&&(u.device_uid_to_print=a),u}sortLinesByItemSequence(e){return s.chain(e||[]).groupBy(e=>e.is_combo_item?e.combo_line_uid:e.uid).map(e=>s.sortBy(e,[e=>!e.is_combo,e=>e.item.printing_sequence||e.item.sequence||999999])).sortBy(e=>e[0].item.printing_sequence||e[0].item.sequence||999999).flatten().value()}getSortedLines(e,t){return t.disable_printing_sequence?e:this.sortLinesByItemSequence(e)}sortLineModifiers(e){for(let t of e){if(!t.modifiers?.length||!t.item.modifiers?.length)continue;let e=new Map(t.item.modifier_categories?.map(e=>[e.uid,e.printing_sequence??999999])),n=new Map(t.item.modifiers.map(e=>[e.uid,e]));t.modifiers.sort((t,r)=>{let i=n.get(t.item_uid),a=n.get(r.item_uid);return(e.get(i?.category_uid)??999999)-(e.get(a?.category_uid)??999999)||(i?.sequence??0)-(a?.sequence??0)})}}async createKitchenPrintJobs(e,t=!1){let n=(await this.configService.getDefaultOne()).config;if(!n.kitchen.enabled&&!t||e.lines.every(e=>e.sent==e.quantity))return[];let r=[],{lines:i,printerUids:a}=this.filterLinesAndPrintersToPrint(e.lines,R.KitchenPrinter),o=await this.printerService.getPrintersByUids(a);for(let t of o){let a=await this.printTemplateService.getOneByParams({uid:t.print_template_uid});if(!a)continue;let o=i.filter(e=>e.item.kitchen_printers_uids.includes(t.uid)),c=this.getSortedLines(o,t);this.sortLineModifiers(c);let l=s.cloneDeep(e);if(t.kitchen_itemized_print)for(let e of c){l.lines=[e];let i=new B(t,await this.printTemplateService.renderPrintTemplate(l,n,a,{...new V,printer_name:t.name}),!1,t.print_times);r.push(i)}else{l.lines=c;let e=new B(t,await this.printTemplateService.renderPrintTemplate(l,n,a,{...new V,printer_name:t.name}),!1,t.print_times);r.push(e)}}return r}async createOrderPrintJobs(e){let t=(await this.configService.getDefaultOne()).config;if(!t.receipt.print_docket||e.lines.every(e=>e.sent==e.quantity))return[];let n=[],{lines:r,printerUids:i}=this.filterLinesAndPrintersToPrint(e.lines,R.OrderPrinter),a=e.table_uid?await this.sectionItemService.getOne(e.table_uid):null,o=await this.printerService.getPrintersByUids(i);for(let i of o){if(a?.order_printer_uids?.length>0&&!a.order_printer_uids.includes(i.uid))continue;let o=await this.printTemplateService.getOneByParams({uid:i.print_template_uid});if(!o)continue;let c=r.filter(e=>e.item.order_printers_uids.includes(i.uid)),l=this.getSortedLines(c,i);this.sortLineModifiers(l);let u=s.cloneDeep(e);u.lines=l;let d=new B(i,await this.printTemplateService.renderPrintTemplate(u,t,o,{...new V,printer_name:i.name}),!1,i.print_times);n.push(d)}return n}async createLabelPrintJobs(e){let t=(await this.configService.getDefaultOne()).config;if(e.lines.every(e=>e.sent==e.quantity))return[];let n=[],{lines:r,printerUids:i}=this.filterLinesAndPrintersToPrint(e.lines,R.LabelPrinter);if(i.length==0||r.length==0)return[];let a=await this.printerService.getPrintersByUids(i),o=s.cloneDeep(e);this.sortLineModifiers(r);let c=r.length,l=1;for(let e of r)e.meta.total_index=c,e.meta.index=l,l++;for(let e of a)for(let i of r){if(!i.item.label_printers_uids.includes(e.uid))continue;let r=await this.printTemplateService.getOneByParams({uid:e.print_template_uid});if(!r||!r.commands)continue;let a=f.compile(r.commands);o.lines=[i];let s=a({invoice:o,config:t}),c=new B(e,new I,!1,e.print_times);c.commands=s,n.push(c)}return n}filterLinesAndPrintersToPrint(e,t){let n;switch(t){case R.KitchenPrinter:n=`kitchen_printers_uids`;break;case R.OrderPrinter:n=`order_printers_uids`;break;case R.LabelPrinter:n=`label_printers_uids`;break;default:n=`kitchen_printers_uids`}let r=[],i=new Set;for(let a of e)if(a.quantity<=a.sent)continue;else if(!a.item[n]||a.item[n].length==0)continue;else{a.item[n].forEach(e=>i.add(e));let e=s.cloneDeep(a);if(e.quantity-=e.sent,t==R.LabelPrinter)for(let t=0;t<e.quantity;t++){let t=s.cloneDeep(e);t.quantity=1,r.push(t)}else r.push(e)}return{lines:r,printerUids:Array.from(i)}}filterDeletedLinesForCancelPrint(e){let t=[],n=new Set;for(let r of e){if(r.is_cancel_printed||!r.item.kitchen_printers_uids||r.item.kitchen_printers_uids.length==0)continue;r.item.kitchen_printers_uids.forEach(e=>n.add(e));let e=s.cloneDeep(r);t.push(e)}return{lines:t,printerUids:Array.from(n)}}async createCancelKitchenPrintJobs(e,t){let n=(await this.configService.getDefaultOne()).config;if(!n.kitchen.print_cancel_slip||!t||t.length===0)return[];let{lines:r,printerUids:i}=this.filterDeletedLinesForCancelPrint(t);if(r.length===0)return[];let a=await this.printerService.getPrintersByUids(i),o=[];for(let t of a){let i=await this.printTemplateService.getOneByParams({uid:t.print_template_uid});if(!i)continue;let a=r.filter(e=>e.item.kitchen_printers_uids.includes(t.uid)),c=this.getSortedLines(a,t);this.sortLineModifiers(c);let l=s.cloneDeep(e);if(t.kitchen_itemized_print)for(let e of c){l.lines=[e];let r=new B(t,await this.printTemplateService.renderPrintTemplate(l,n,i,{printer_name:t.name,kitchen_itemized_print:t.kitchen_itemized_print,is_cancel:!0}),!1,t.print_times);o.push(r)}else{l.lines=c;let e=new B(t,await this.printTemplateService.renderPrintTemplate(l,n,i,{printer_name:t.name,kitchen_itemized_print:t.kitchen_itemized_print,is_cancel:!0}),!1,t.print_times);o.push(e)}}for(let t of e.deleted_lines)t.is_cancel_printed=!0;return o}sortPrintJobsByPrinterSequence(e){return e.sort((e,t)=>(e?.print_sequence??999)-(t?.print_sequence??999))}async preprocessInvoice(e){if(e.lines)for(let t of e.lines)t.sent=t.quantity;return e}addInvoiceCharge(e,t,n,r,i=W.AfterSubtotal){e.charges||(e.charges=[]);let a=new ht;return a.name=t,a.percentage=n,a.amount=r,a.calc_flow=i,e.charges.push(a),e}removeInvoiceCharge(e,t){return e.charges&&(e.charges=e.charges.filter(e=>e.uid!==t)),e}async getStockChangeList(e,t=!0){if(!e.lines||e.lines.length===0)return[];let n=t?1:-1,r=new Map;for(let t of e.lines){let e=r.get(t.item_uid)||new ye(t.item_uid);if(e.quantity+=t.quantity*n,t.modifiers&&t.modifiers.length>0)for(let r of t.modifiers){let i=e.modifiers.find(e=>e.item_uid===r.item_uid);i||(i={item_uid:r.item_uid,quantity:0},e.modifiers.push(i)),i.quantity+=t.quantity*r.quantity*n}r.set(t.item_uid,e)}return Array.from(r.values())}sliceInvoice(e){if(!e||!e.lines||e.lines.length===0)return[];let t=[];for(let n of e.lines)for(let r=0;r<n.quantity;r++){let r=s.cloneDeep(e),i=s.cloneDeep(n);i.quantity=1,r.lines=[i],t.push(r)}return t}},Nr=class extends Mr{},Pr=class extends G{constructor(e,t,n,r=`employee_roles`,i=`employee_role`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}},Fr=class extends G{constructor(e,t,n,r=`employees`,i=`employee`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async login(e,t){try{let n=await this.getOne(e);if(n){if(await m.compare(t,n.password))return!0;throw new w(`Password is incorrect`)}else throw new w(`User not found`)}catch(e){throw e instanceof w?e:new w(`Unexpected error, login failed`)}}async createEmployee(e){try{if(await this.getOne(e.uid))throw new w(`User already exists`);return e.password&&(e.password=await m.hash(e.password,12)),this.addOne(e)}catch(e){throw e instanceof w?e:new w(`Unexpected error, creating employee failed`)}}async changePassword(e){try{return await m.hash(e,12)}catch{throw new w(`Unexpected error, changing password failed`)}}},Ir=class extends G{constructor(e,t,n,r=`items`,i=`item`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async search(e){return this.db.transaction(`r`,this.db.table(this.moduleName),async()=>await this.db.table(this.moduleName).where(`name`).anyOfIgnoreCase(e).or(`codename`).anyOfIgnoreCase(e).or(`barcode`).anyOfIgnoreCase(e).toArray())}async addModifierCategory(e,n){return n.uid=C.ItemModifierCategory+t(),e.modifier_categories||(e.modifier_categories=[]),e.modifier_categories.push(n),e}async updateModifierCategory(e,t){if(!e.modifier_categories)throw e.modifier_categories=[],new w(`Item does not have any modifier categories`);let n=e.modifier_categories.findIndex(e=>e.uid===t.uid);if(n===-1)throw new w(`Modifier category not found`);return e.modifier_categories[n]=t,e}async removeModifierCategory(e,t){if(!e.modifier_categories)throw e.modifier_categories=[],new w(`Item does not have any modifier categories`);return e.modifier_categories=e.modifier_categories.filter(e=>e.uid!==t.uid),e}async addModifier(e,n){return e.modifiers||(e.modifiers=[]),n.uid=C.ItemModifier+t(),e.modifiers.push(n),e}async updateModifier(e,t){if(!e.modifiers)throw e.modifiers=[],new w(`Item does not have any modifiers`);let n=e.modifiers.findIndex(e=>e.uid===t.uid);if(n===-1)throw new w(`Modifier not found`);return e.modifiers[n]=t,e}async removeModifier(e,t){if(!e.modifiers)throw e.modifiers=[],new w(`Item does not have any modifiers`);return e.modifiers=e.modifiers.filter(e=>e.uid!==t.uid),e}async attachModifierToGroup(e,t,n){if(!e.modifier_categories)throw e.modifier_categories=[],new w(`Item does not have any modifier categories`);if(!e.modifier_categories.find(e=>e.uid===n))throw new w(`Modifier category not found`);let r=e.modifiers.find(e=>e.uid===t);if(!r)throw new w(`Modifier not found`);return r.category_uid=n,e}async addImageAsync(e,t){let n=o(),r=this.getFileExtension(e);await this.http.post(`api/v5/merchants/`+this.options.merchant_uid+`/upload-image`,new tn({base64:await this.convertFileToBase64(e),name:n,extension:this.getFileExtension(e)})),t.image_url=`${this.options.base_url}images/${n}.${r}`,t.image_thumbnail_url=`${this.options.base_url}images/${n}.thumbnail.${r}`}async changeToSoldOut(e){let t=await this.getOne(e);if(!t)throw new w(`Item not found`);return t.stock=0,t.is_sold_out=!0,this.updateOne(t.id_in_server,t)}async changeToAvailable(e,t=1){let n=await this.getOne(e);if(!n)throw new w(`Item not found`);return n.stock=t,n.is_sold_out=!1,this.updateOne(n.id_in_server,n)}async changeStock(e,t){let n=await this.getOne(e);if(!n)throw new w(`Item not found`);let r=Number(n.stock);return n.stock=(isNaN(r)?0:r)+t,this.updateOne(n.id_in_server,n)}async changeItemsStock(e){let t=[];for(let n of e){let e=await this.getOne(n.item_uid);if(!e)continue;let r=Number(e.stock);e.stock=(isNaN(r)?0:r)+n.quantity;for(let t of n.modifiers){let n=e.modifiers?.find(e=>e.uid===t.item_uid);if(!n)continue;let r=Number(n.stock);n.stock=(isNaN(r)?0:r)+Number(t.quantity)}t.push(e)}await this.updateMany(t)}convertFileToBase64(e){return new Promise((t,n)=>{let r=new FileReader;r.onloadend=()=>{typeof r.result==`string`?t(r.result.split(`,`)[1]):n(Error(`Could not convert file to Base64.`))},r.onerror=()=>n(Error(`File reading failed.`)),r.readAsDataURL(e)})}getFileExtension(e){let t=e.name,n=t.lastIndexOf(`.`);return n===-1||n===t.length-1?``:t.slice(n+1)}async cloneItem(e){let n=s.cloneDeep(e);if(n.uid=C.Item+t(),n.id_in_server=0,!n.modifier_categories||n.modifier_categories.length===0)return n;let r=[],i=[];for(let e of n.modifier_categories){let t=n.modifiers?.filter(t=>t.category_uid===e.uid);if(!t||t.length===0)continue;let{modifierCategory:a,modifiers:o}=await this.cloneModifiers(e,t);r.push(a),i.push(...o)}return n.modifier_categories=r,n.modifiers=i,n}async cloneModifiers(e,n){let r=s.cloneDeep(e);r.uid=C.ItemModifierCategory+t();let i=[];for(let e of n){let n=s.cloneDeep(e);n.uid=C.ItemModifier+t(),n.category_uid=r.uid,i.push(n)}return{modifierCategory:r,modifiers:i}}async copyModifierGroupToItems(e,t,n){if(!e||!t?.length||!n?.length)throw new w(`Invalid input parameters`);let r=[];for(let i of n){i.modifier_categories=i.modifier_categories||[],i.modifiers=i.modifiers||[];let{modifierCategory:n,modifiers:a}=await this.cloneModifiers(e,t);i.modifier_categories.push(n),i.modifiers.push(...a),r.push(i)}return await this.updateMany(r),r}sanitize(e){if(e.name&&(e.name=e.name.trim()),e.name_translations)for(let t in e.name_translations)e.name_translations[t]&&(e.name_translations[t]=e.name_translations[t].trim());if(e.type!==A.Combo)return e.combo_groups=[],e;if(!e.combo_groups?.length)return e;for(let t of e.combo_groups)for(let e of t.combo_items)delete e.combo_item;return e}},Lr=class extends G{constructor(e,t,n,r=`categories`,i=`category`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async addSubcategory(e,t){return e.subcategories||(e.subcategories=[]),e.subcategories.push(t),e.has_subcategory||(e.has_subcategory=!0),e.id_in_server?await this.updateOne(e.id_in_server,e):await this.addOne(e),e}async updateSubcategory(e,t){if(!e.subcategories)throw e.subcategories=[],e.has_subcategory&&(e.has_subcategory=!1),new w(`Category does not have any subcategories`);let n=e.subcategories.findIndex(e=>e.uid===t.uid);if(n===-1)throw new w(`Subcategory not found`);return e.subcategories[n]=t,e.id_in_server?await this.updateOne(e.id_in_server,e):await this.addOne(e),e}async removeSubcategory(e,t){if(!e.subcategories)throw e.subcategories=[],e.has_subcategory&&(e.has_subcategory=!1),new w(`Category does not have any subcategories`);return e.subcategories=e.subcategories.filter(e=>e.uid!==t),e.id_in_server?await this.updateOne(e.id_in_server,e):await this.addOne(e),e}},Rr=class extends G{constructor(e,t,n,r=`configs`,i=`config`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i,y(this,`configFactories`,{general:()=>new It,product:()=>new Ft,till:()=>new Lt,report:()=>new Rt,receipt:()=>new zt,kitchen:()=>new Bt,kds:()=>new Vt,label:()=>new Ht,order:()=>new Ut,payment:()=>new Gt,user:()=>new Kt,tax:()=>new qt,rounding:()=>new Xt,charges:()=>new Jt,currency:()=>new Yt,inventory:()=>new Zt,pax_config:()=>new Qt,gto:()=>new $t,cash_drawer:()=>new en,marketing:()=>new At})}async updateConfig(e,t){let n=await this.getDefaultOne();n||(n=new Ct);let r=this.configFactories[e],i=n.config[e]||{};return n.config[e]||(r&&typeof r==`function`?n.config[e]=r():n.config[e]={},i=n.config[e]),Object.keys(t).forEach(e=>{t[e]!==void 0&&(i[e]=t[e])}),n.id_in_server?this.updateOne(n.id_in_server,n):this.addOne(n)}async updateGeneralConfig(e){let t=await this.getDefaultOne();t||(t=new Ct);let n=t.config.general;return Object.keys(e).forEach(t=>{e[t]!==void 0&&(n[t]=e[t])}),t.id_in_server?this.updateOne(t.id_in_server,t):this.addOne(t)}async updateCache(e){let t=await this.getDefaultOne();return t.cache={...t.cache,...e},t.id_in_server?this.updateOne(t.id_in_server,t):this.addOne(t)}async uploadFile(e){let t=o(),n=Tn(e);return await this.http.post(`api/v5/merchants/`+this.options.merchant_uid+`/upload-image`,new tn({base64:await En(e),name:t,extension:n})),{file_url:`${this.options.base_url}images/${t}.${n}`,thumbnail_url:`${this.options.base_url}images/${t}.thumbnail.${n}`}}},zr=class extends G{constructor(e,t,n,r=`sections`,i=`section`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}},Br=class extends G{constructor(e,t,n,r=`section_items`,i=`section_item`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async changeToTakeOut(e){let t=await this.getOne(e);if(!t)throw Error(`Item not found`);return t.is_take_out=!t.is_take_out,this.updateOne(t.id_in_server,t)}reset(e){e.total=0,e.pax=0,e.customer={}}syncInvoiceData(e,t){e.total=t.grand_total,e.pax=t.pax,e.customer={display_name:t.customer?.display_name||``,phone_number:t.customer?.phone_number||``}}},Vr=class extends G{constructor(e,t,n,r=`products`,i=`product`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}},Hr=class extends G{constructor(e,t,n,r=`shifts`,i=`shift`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i,y(this,`tillService`,void 0),this.tillService=new X(e,t,n)}async cashIn(e,t){let n=await this.db.table(this.moduleName).filter(e=>(e.deleted_at===null||e.deleted_at===void 0)&&e.status===E.Open).first();if(!n)throw new w(`No opening shift found`);let r=new O;return r.amount=e,r.type=D.CashIn,r.user_uid=n.user_uid,r.shift_uid=n.uid,r.note=t,this.tillService.addOne(r)}async cashOut(e,t){let n=await this.db.table(this.moduleName).filter(e=>(e.deleted_at===null||e.deleted_at===void 0)&&e.status===E.Open).first();if(!n)throw new w(`No opening shift found`);let r=new O;return r.amount=e,r.type=D.CashOut,r.user_uid=n.user_uid,r.shift_uid=n.uid,r.note=t,this.tillService.addOne(r)}async closeShift(e,t){let n=await this.db.table(this.moduleName).filter(e=>(e.deleted_at===null||e.deleted_at===void 0)&&e.status==E.Open).first();if(!n)throw new w(`No opening shift found`);return n.declared_amount=e,n.ended_at=new Date,n.user_uid=t,n.status=E.Closed,this.updateOne(n.id_in_server,n)}async openShift(e,t,n=``){console.log(`open shift entry`);let r=await this.db.table(this.moduleName).filter(e=>(e.deleted_at===null||e.deleted_at===void 0)&&e.status==E.Open).first();if(r)throw new w(`shift is already opened shift at ${r.started_at}`);let i=new he;if(i.started_at=new Date,i.user_uid=t,i.status=E.Open,await this.addOne(i),e>0){let r=new O;r.amount=e,r.type=D.OpenDeposit,r.user_uid=t,r.amount=e,r.shift_uid=i.uid,r.note=n,await this.tillService.addOne(r)}return console.log(`open shift end`),i}},X=class extends G{constructor(e,t,n,r=`tills`,i=`till`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}createCashInvoiceTill(e,t,n,r=``,i=``){let a=new O;return a.shift_uid=t,a.user_uid=n,a.note=r,a.invoice_uid=i,a.amount=K(e.filter(e=>e.payment_method.is_cash).map(e=>e.tender_amount-e.change_amount).reduce((e,t)=>e+t,0)),a.type=D.CashInvoice,a}},Ur=class extends G{constructor(e,t,n,r=`payment_methods`,i=`payment_method`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async syncStandardPaymentMethods(){try{let{data:e}=await this.http.get(`api/v5/merchants/`+this.options.merchant_uid+`/standard_payment_methods`),t=[];for(let n of e){let e=new rt(n),r=await this.getOneByParams({payment_method_code:e.payment_method_code}),i=e.toPaymentMethod();r?(i.uid=r.uid,i.id_in_server=r.id_in_server,i.sequence=r.sequence,i.is_disabled=r.is_disabled,i.is_integrated=r.is_integrated,i.api_id=r.api_id,i.api_key=r.api_key):(i.is_disabled=!0,await this.addOne(i)),t.push(i)}return t}catch(e){return console.error(`Failed to sync standard payment methods:`,e),[]}}async enablePaymentMethod(e){return e.is_disabled=!1,this.updateOne(e.id_in_server,e)}async disablePaymentMethod(e){return e.is_disabled=!0,this.updateOne(e.id_in_server,e)}async changeSequence(e,t){let n=(await this.db.table(this.moduleName).filter(e=>!e.is_disabled).sortBy(`sequence`)).filter(t=>t.id_in_server!==e.id_in_server);t<0&&(t=0),t>n.length&&(t=n.length),n.splice(t,0,e);let r=[];for(let e=0;e<n.length;e++)n[e].sequence!==e&&(n[e].sequence=e,r.push(n[e]));return r.length>0&&await this.updateMany(r),e}},Wr=class extends G{constructor(e,t,n,r=`payments`,i=`payment`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async addPayment(e,t,n){let r=new et;r.invoice_uid=e.uid,r.tender_amount=t;let i=e.payments.reduce((e,t)=>e+t.tender_amount,0)+t;return n.is_cash&&i>=e.grand_total&&(r.change_amount=K(i-e.grand_total)),r.payment_method_uid=n.uid,r.payment_method_code=n.payment_method_code,r.payment_method_name=n.name,r.payment_method=s.cloneDeep(n),e.payments.push(r),e}async removePayment(e,t){return e.payments=e.payments.filter(e=>e.uid!==t),e}},Gr=class{async calibrateSequence(e){let t=await e.getAll();t.sort((e,t)=>e.sequence-t.sequence);let n=[];for(let e=0;e<t.length;e++){let r=t[e];r.sequence!==e&&(r.sequence=e,n.push(r))}await e.updateMany(n)}async changeSequence(e,t,n){if(n<0)throw new w(`Invalid target index.`);let r=Array.isArray(e),i=r?e:await e.getAll();if(i=i.filter(e=>e.deleted_at===null).sort((e,t)=>e.sequence-t.sequence),n>=i.length)throw new w(`Invalid target index.`);let a=i.findIndex(e=>e.uid==t.uid),o=new Map(i.map(e=>[e.uid,e.sequence]));a<n&&(n+=1),i.splice(n,0,null);let s=i.filter(e=>!(e&&e.uid===t.uid)).map((e,n)=>e===null?(t.sequence=n+1,t):(e.sequence=n+1,e)).filter(e=>o.get(e.uid)!==e.sequence);return r||await e.updateMany(s),s}},Kr=class extends G{constructor(e,t,n,r=`reports`,i=`report`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i,y(this,`invoiceService`,void 0),y(this,`tillService`,void 0),y(this,`paymentService`,void 0),y(this,`printerService`,void 0),y(this,`printTemplateService`,void 0),y(this,`printJobService`,void 0),y(this,`configService`,void 0),this.invoiceService=new Nr(e,t,n,`invoices`,`invoice`),this.tillService=new X(e,t,n,`tills`,`till`),this.paymentService=new Wr(e,t,n,`payments`,`payment`),this.printerService=new wn(e,t,n,`printers`,`printer`),this.printTemplateService=new Yr(e,t,n,`print_templates`,`print_template`),this.printJobService=new qr(e,t,n,`print_jobs`,`print_job`),this.configService=new Rr(e,t,n,`configs`,`config`)}async syncStandardReports(){let e=await this.getDefaultOne();e||(e=new hn);let t=await this.http.get(`api/v5/merchants/`+this.options.merchant_uid+`/standard_reports`);return e={...e,...t.data},e.updated_at=new Date,e.id_in_server?await this.updateOne(e.id_in_server,e):await this.addOne(e),e}async printReport(e){e.copies=e.copies||1;let t=await this.printerService.getDefaultReceiptPrinter();if(!t)throw new w(`No default receipt printer found`);let n=await this.printTemplateService.getOneByParams({report_code_name:e.report_code_name});if(!n)throw new w(`No print template found`);let r=await this.configService.getDefaultOne(),i=await this.getReportData(e,r.config?.order?.datetime_format,r.config?.currency?.currency_symbol||`$`),a=new B(t,await this.printTemplateService.renderReportPrintTemplate(i,r.config,n),!1,e.copies);await this.printJobService.addOne(a)}async getReportData(e,t,n=`$`){let r=new gn;if(e.shift_uid){await this.db.table(`shifts`).where(`uid`).equals(e.shift_uid).and(e=>e.deleted_at==null||e.deleted_at==null).first(),r.drawer_summary.declared_amount=e.declared_amount;let t=await this.db.table(`tills`).where(`shift_uid`).equals(e.shift_uid).and(e=>e.deleted_at==null).toArray();r.drawer_summary.open_amount=K(t.filter(e=>e.type==D.OpenDeposit).reduce((e,t)=>e+t.amount,0)),r.drawer_summary.pay_in_total=K(t.filter(e=>e.type==D.CashIn).reduce((e,t)=>e+t.amount,0)),r.drawer_summary.cash_invoice_total=K(t.filter(e=>e.type==D.CashInvoice).reduce((e,t)=>e+t.amount,0)),r.drawer_summary.cash_invoice_count=t.filter(e=>e.type==D.CashInvoice).length,r.drawer_summary.pay_in_count=t.filter(e=>e.type==D.CashIn).length,r.drawer_summary.pay_out_total=K(t.filter(e=>e.type==D.CashOut).reduce((e,t)=>e+t.amount,0)),r.drawer_summary.pay_out_count=t.filter(e=>e.type==D.CashOut).length,r.drawer_summary.drawer_amount=K(r.drawer_summary.open_amount+r.drawer_summary.pay_in_total+r.drawer_summary.cash_invoice_total-r.drawer_summary.pay_out_total),r.drawer_summary.difference=K(r.drawer_summary.drawer_amount-r.drawer_summary.declared_amount)}r.start_datetime=new Date(e.start_datetime).toISOString(),r.end_datetime=new Date(e.end_datetime).toISOString(),r.humanized_start_datetime=L(new Date(e.start_datetime),t),r.humanized_end_datetime=L(new Date(e.end_datetime),t),r.humanized_printed_datetime=L(new Date,t);let i=new p().addParam(`paid_at`,`GreaterThanOrEqualTo`,new Date(e.start_datetime).toISOString()).addParam(`paid_at`,`LessThanOrEqualTo`,new Date(e.end_datetime).toISOString()).addParam(`deleted_at`,`IsNull`,!0).includeTotal(!0),a=(await this.invoiceService.autoQuery(i,{timeout:6e5})).results||[];return this.processReportInvoicesData(r,a,n)}async processReportInvoicesData(e,t=[],n=`$`){let r=new Map,i=new Map,a=await this.db.table(`categories`).toArray(),o=new Map(a.map(e=>[e.uid,e])),s=new Map,c=new Map,l=(e,t,n)=>`${e}|${t}|${n.toFixed(4)}`,u=(e,t,r,i)=>e||(t===U.Percent?`${K(i*100)}% Discount`:`${n}${K(r)} Discount`),d=(e,t,n,r,i,a)=>{let o=l(t,n,n===U.Percent?i:r),s=e.get(o);s?(s.count++,s.total=K(s.total+a)):e.set(o,{name:t,alias:u(t,n,r,i),calc_type:n,amount:r,percent:i,count:1,total:K(a)})};t.forEach(t=>{t.status==H.Paid&&(e.sales_summary.paid_invoice_total+=t.grand_total,e.sales_summary.sales_total+=t.grand_total,e.sales_summary.paid_invoice_count++,e.sales_summary.rounding_total+=t.rounding,e.sales_summary.tax_total+=t.tax,e.sales_summary.service_charge_total+=t.service_charge,e.sales_summary.discount_total+=t.discount_amount,t.add_credit>0&&(e.loyalty_program_summary.add_credit_total+=t.add_credit,e.loyalty_program_summary.add_credit_count++,e.loyalty_program_summary.topup_paid_count++),t.rewarded_credit>0&&(e.loyalty_program_summary.rewarded_credit_total+=t.rewarded_credit,e.loyalty_program_summary.rewarded_credit_count++),t.minus_credit>0&&(e.loyalty_program_summary.minus_credit_total+=t.minus_credit,e.loyalty_program_summary.minus_credit_count++),t.rewarded_point>0&&(e.loyalty_program_summary.rewarded_point_total+=t.rewarded_point,e.loyalty_program_summary.rewarded_point_count++),t.minus_point>0&&(e.loyalty_program_summary.minus_point_total+=t.minus_point,e.loyalty_program_summary.minus_point_count++),e.sales_summary.total_pax+=t.pax,t.pax>0&&(e.sales_summary.pax_sales_total+=t.grand_total),t.lines.forEach(t=>{t.item.add_credit>0&&(e.loyalty_program_summary.topup_paid_total+=t.subtotal);let n=this.generateItemKey(t),a=r.get(n);if(a?(a.quantity+=t.quantity,a.total_amount=K(a.total_amount+t.subtotal),t.modifiers&&t.modifiers.length>0&&t.modifiers.forEach(e=>{let t=e.item.name.trim(),n=i.get(t);n?(n.quantity+=e.quantity,n.total_amount=K(n.total_amount+e.price*e.quantity)):(n=new Sn,n.item=e.item,n.quantity=e.quantity,n.total_amount=K(e.price*e.quantity),i.set(t,n))})):(a=new xn,a.item=t.item,a.quantity=t.quantity,a.total_amount=K(t.subtotal),a.modifiers=[],t.modifiers&&t.modifiers.length>0&&t.modifiers.forEach(e=>{let t={item:e.item,quantity:e.quantity,total_amount:K(e.price*e.quantity)};a.modifiers.push(t);let n=e.item.name.trim(),r=i.get(n);r?(r.quantity+=e.quantity,r.total_amount=K(r.total_amount+e.price*e.quantity)):(r=new Sn,r.item=e.item,r.quantity=e.quantity,r.total_amount=K(e.price*e.quantity),i.set(n,r))}),r.set(n,a)),t.discount_amount||t.discount_percent){let e=t.subtotal_before_discount-t.subtotal;e>0&&d(c,``,t.discount_calc_type,t.discount_amount,t.discount_percent,e)}}),t.payments.forEach(t=>{let n=e.payments_summary.find(e=>e.code==t.payment_method_code);t.tender_amount||(t.tender_amount=t.change_amount),n?(n.count++,n.total=K(n.total+(t.tender_amount-t.change_amount))):e.payments_summary.push({code:t.payment_method_code,name:t.payment_method_name,count:1,total:K(t.tender_amount-t.change_amount)})}),t.discounts?.forEach(e=>{let t=e.applying_item_uids&&e.applying_item_uids.length>0,n=e.calc_type===U.Percent?e.percent_amount:e.amount;d(t?c:s,e.name||``,e.calc_type,e.amount,e.percent,n)})),t.is_sales_exclusive&&(e.sales_summary.foc_sales_total+=t.grand_total,e.sales_summary.foc_sales_count++),t.status==H.Void&&(e.sales_summary.void_invoice_total+=t.grand_total,e.sales_summary.void_invoice_count++)});let f=Array.from(r.values());f.sort((e,t)=>{let n=o.get(e.item.category_uid),r=o.get(t.item.category_uid),i=n?.sequence??999999,a=r?.sequence??999999;return i===a?(e.item.sequence??999999)-(t.item.sequence??999999):i-a}),e.item_sales_summary=f;let p=0,m=0,h=new Map;f.forEach(e=>{if(p+=e.total_amount,m+=e.quantity,!e.item.category_uid)return;let t=e.item.category_uid,n=h.get(t);n||(n=new Cn,n.category=o.get(e.item.category_uid)||null,h.set(t,n)),n.items.push(e),n.total_quantity+=e.quantity,n.total_amount+=e.total_amount}),e.item_sales_summary_total=K(p),e.item_sales_summary_total_count=m;let g=Array.from(h.values());g.sort((e,t)=>(e.category?.sequence??999999)-(t.category?.sequence??999999)),g.forEach(e=>{e.total_amount=K(e.total_amount),e.items.sort((e,t)=>t.total_amount===e.total_amount?t.quantity-e.quantity:t.total_amount-e.total_amount)}),e.item_sales_summary_by_category=g;let _=Array.from(i.values());_.sort((e,t)=>t.quantity===e.quantity?t.total_amount-e.total_amount:t.quantity-e.quantity),e.modifier_sales_summary=_;let v=0,y=0;return e.modifier_sales_summary.forEach(e=>{v+=e.total_amount,y+=e.quantity}),e.modifier_sales_summary_total=K(v),e.modifier_sales_summary_total_count=y,e.invoice_discount_summary=Array.from(s.values()),e.item_discount_summary=Array.from(c.values()),e.sales_summary.paid_invoice_total=K(e.sales_summary.paid_invoice_total),e.sales_summary.sales_total=K(e.sales_summary.sales_total),e.sales_summary.rounding_total=K(e.sales_summary.rounding_total),e.sales_summary.tax_total=K(e.sales_summary.tax_total),e.sales_summary.service_charge_total=K(e.sales_summary.service_charge_total),e.sales_summary.discount_total=K(e.sales_summary.discount_total),e.sales_summary.foc_sales_total=K(e.sales_summary.foc_sales_total),e.sales_summary.void_invoice_total=K(e.sales_summary.void_invoice_total),e.sales_summary.pax_sales_total=K(e.sales_summary.pax_sales_total),e.loyalty_program_summary.add_credit_total=K(e.loyalty_program_summary.add_credit_total),e.loyalty_program_summary.topup_paid_total=K(e.loyalty_program_summary.topup_paid_total),e.loyalty_program_summary.rewarded_credit_total=K(e.loyalty_program_summary.rewarded_credit_total),e.loyalty_program_summary.minus_credit_total=K(e.loyalty_program_summary.minus_credit_total),e}generateItemKey(e){let t=e.item.uid;if(e.modifiers&&e.modifiers.length>0){let n=[...e.modifiers].sort((e,t)=>{let n=`${e.item.name.trim()}:${e.quantity}`,r=`${t.item.name.trim()}:${t.quantity}`;return n.localeCompare(r)}).map(e=>`${e.item.uid}:${e.quantity}`);t+=`-`+n.join(`-`)}return t}},qr=class extends G{constructor(e,t,n,r=`print_jobs`,i=`print_job`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}async autoquery(e){let t=e.build();return await this.http.get(`sapi/v5/merchants/${this.options.merchant_uid}/${this.moduleName}`,{params:{...t}})}replacePrinter(e,t){return e.printer_name=t.name,e.printer_ip=t.ip_address,e.printer_type=t.type,e.printer_uid=t.uid,e.driver_printer_name=t.driver_printer_name,t.protocol&&(e.protocol=t.protocol),t.connection_type&&(e.connection_type=t.connection_type),e.usb_serial_number=t.usb_serial_number,e.use_device_name=t.use_device_name,e.usb_device_name=t.usb_device_name,t.print_sequence!==void 0&&(e.print_sequence=t.print_sequence),e}},Jr=class extends G{constructor(e,t,n,r=`menus`,i=`menu`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}},Yr=class extends G{constructor(e,t,n,r=`print_templates`,i=`print_template`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i,y(this,`httpClient`,void 0),y(this,`secretKey`,`tKB84ZlZRzLzA2LcglNNLquucKZwtJApRTaPKjAJHFbDd8nJRD`),this.httpClient=c.create({baseURL:`https://revopos-cdn.sgp1.digitaloceanspaces.com`,timeout:3e3})}async initialize(){if(!await this.getOneByParams({printer_type:R.ReceiptPrinter})){let e=new z;e.name=`Default Receipt Template`,e.body=await this.getPrintTemplate(`rbt`),e.header=await this.getPrintTemplate(`rht`),e.footer=await this.getPrintTemplate(`rft`),e.printer_type=R.ReceiptPrinter,await this.addOne(e),console.log(`Default Receipt Template added`)}if(!await this.getOneByParams({printer_type:R.CheckPrinter})){let e=new z;e.name=`Default Check Template`,e.body=await this.getPrintTemplate(`cbt`),e.header=await this.getPrintTemplate(`cht`),e.footer=await this.getPrintTemplate(`cft`),e.printer_type=R.CheckPrinter,await this.addOne(e),console.log(`Default Check Template added`)}if(!await this.getOneByParams({printer_type:R.OrderPrinter})){let e=new z;e.name=`Default docket Template`,e.body=await this.getPrintTemplate(`obt`),e.header=await this.getPrintTemplate(`oht`),e.footer=await this.getPrintTemplate(`oft`),e.printer_type=R.OrderPrinter,await this.addOne(e),console.log(`Default Order Template added`)}if(!await this.getOneByParams({printer_type:R.KitchenPrinter})){let e=new z;e.name=`Default Kitchen Template`,e.body=await this.getPrintTemplate(`kbt`),e.header=await this.getPrintTemplate(`kht`),e.footer=await this.getPrintTemplate(`kft`),e.printer_type=R.KitchenPrinter,await this.addOne(e),console.log(`Default Kitchen Template added`)}if(!await this.getOneByParams({printer_type:R.KioskPrinter})){let e=new z;e.name=`Default Kiosk Template`,e.body=await this.getPrintTemplate(`kioskbt`),e.header=await this.getPrintTemplate(`kioskht`),e.footer=await this.getPrintTemplate(`kioskft`),e.printer_type=R.KioskPrinter,await this.addOne(e),console.log(`Default Kiosk Template added`)}if(!await this.getOneByParams({printer_type:R.LabelPrinter})){let e=new z;e.commands=await this.getPrintTemplate(`tspl_cmds`),e.name=`Default Label Template`,e.printer_type=R.LabelPrinter,await this.addOne(e)}if(!await this.getOneByParams({printer_type:R.QrCodePrinter})){let e=new z;e.name=`Default QR Code Template`,e.body=await this.getPrintTemplate(`qrbt`),e.header=await this.getPrintTemplate(`qrht`),e.footer=await this.getPrintTemplate(`qrft`),e.printer_type=R.QrCodePrinter,await this.addOne(e)}if(!await this.getOneByParams({report_code_name:`sales_summary_report`})){let e=new z;e.name=`Sales Summary Report`,e.body=await this.getPrintTemplate(`sumbt`),e.header=await this.getPrintTemplate(`sumht`),e.footer=await this.getPrintTemplate(`sumft`),e.report_code_name=`sales_summary_report`,await this.addOne(e),console.log(`Sales Summary Report Template added`)}if(!await this.getOneByParams({report_code_name:`shift_report`})){let e=new z;e.name=`Shift Report`,e.body=await this.getPrintTemplate(`sbt`),e.header=await this.getPrintTemplate(`sht`),e.footer=await this.getPrintTemplate(`sft`),e.report_code_name=`shift_report`,await this.addOne(e),console.log(`Shift Report Template added`)}if(!await this.getOneByParams({report_code_name:`item_sales_report`})){let e=new z;e.name=`Item Sales Report`,e.body=await this.getPrintTemplate(`isrbt`),e.header=await this.getPrintTemplate(`isrht`),e.footer=await this.getPrintTemplate(`isrft`),e.report_code_name=`item_sales_report`,await this.addOne(e),console.log(`Item Sales Report Template added`)}if(!await this.getOneByParams({report_code_name:`modifier_sales_report`})){let e=new z;e.name=`Modifier Sales Report`,e.body=await this.getPrintTemplate(`msrbt`),e.header=await this.getPrintTemplate(`msrht`),e.footer=await this.getPrintTemplate(`msrft`),e.report_code_name=`modifier_sales_report`,await this.addOne(e),console.log(`Modifier Sales Report Template added`)}}async renderPrintTemplate(e,t,n,r=new V){let i=new I;n.printer_type==R.KitchenPrinter||n.printer_type==R.OrderPrinter?i.codepage=n.codepage||this.getCodepageByCountryCode(t.kitchen.language):i.codepage=n.codepage||this.getCodepageByCountryCode(t.receipt.language);let a=new $e;return a.invoice=e,a.config=t,a.normalized_printed_at=L(a.printed_at,t?.order?.datetime_format),a.printer_name=r.printer_name,r.is_cancel&&(a.is_cancel=r.is_cancel),i.items.push(...await this.renderPrintCommand(n.header,a)),i.items.push(...await this.renderPrintCommand(n.body,a)),i.items.push(...await this.renderPrintCommand(n.footer,a)),i}async renderReportPrintTemplate(e,t,n,r=new V){let i=new I,a=new $e;return a.report_data=e,a.config=t,a.normalized_printed_at=L(a.printed_at,t?.order?.datetime_format),i.codepage=n.codepage||N.SimplifiedChinese,i.items.push(...await this.renderPrintCommand(n.header,a)),i.items.push(...await this.renderPrintCommand(n.body,a)),i.items.push(...await this.renderPrintCommand(n.footer,a)),i}async renderPrintTemplateByData(e,t,n=new V){let r=new I;return r.items.push(...await this.renderPrintCommand(e.header,t)),r.items.push(...await this.renderPrintCommand(e.body,t)),r.items.push(...await this.renderPrintCommand(e.footer,t)),r}async getPrintTemplate(e){let t=await this.httpClient.get(`/xpos-core/${e}.enc`,{responseType:`text`});return l.AES.decrypt(t.data,this.secretKey).toString(l.enc.Utf8)}getCodepageByCountryCode(e){let t={US:N.English,GR:N.Greek,DE:N.WesternEurope,LT:N.BalticRim,PL:N.CentralEurope,RU:N.Cyrillic,TR:N.Turkish,EU:N.MultilingualLatin1WithEuro,PT:N.Portuguese,IS:N.Icelandic,IL:N.Hebrew,CA:N.FrenchCanadian,EG:N.Arabic,NO:N.Nordic,BY:N.Russian,MK:N.ModernGreek,CN:N.SimplifiedChinese,KR:N.Korean,TW:N.TraditionalChinese,FR:N.WesternEuropeanLatin,AE:N.ArabicISO,JP:N.Japanese,CZ:N.CentralEuropeanLatinWindows,BG:N.CyrillicWindows,ES:N.WesternEuropeanLatinWindows,CY:N.GreekWindows,AZ:N.TurkishWindows,PS:N.HebrewWindows,SA:N.ArabicWindows,LV:N.BalticWindows,VN:N.Vietnamese};return e&&t[e.toUpperCase()]||t.CN}async renderPrintCommand(e,t){try{let n=new u(!0),r=JSON.parse(e);console.log(`template`,JSON.stringify(r)),console.log(`templateData`,JSON.stringify(t));let i=await n.transform(r,t,!1);return i=s.flatMap(i,e=>e),i=s.compact(i),i}catch(e){throw console.error(e),e}}},Xr=class extends G{constructor(e,t,n,r=`storages`,i=`storage`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}},Zr=class extends G{constructor(e,t,n,r=`stock_logs`,i=`stock_log`){super(),this.http=e,this.db=t,this.options=n,this.moduleName=r,this.methodName=i}};function Qr(e,t,n){let r=c.create({baseURL:e,timeout:2e4,headers:{"x-device-uid":t,Authorization:`Bearer ${n}`}});return r.interceptors.response.use(function(e){return e.data},function(e){return Promise.reject(e)}),r}const $r=new Map([[`Item`,Ir],[`Section`,zr],[`SectionItem`,Br],[`Category`,Lr],[`Config`,Rr],[`Shift`,Hr],[`Till`,X],[`Employee`,Fr],[`PaymentMethod`,Ur],[`Invoice`,Nr],[`Report`,Kr],[`Printer`,wn],[`PrintJob`,qr],[`PrintTemplate`,Yr],[`EmployeeRole`,Pr],[`OrderDisplay`,Or],[`Storage`,Xr],[`Menu`,Jr],[`StockLog`,Zr]]),Z=`uid, updated_at, created_at, deleted_at, _timestamp, id_in_server, created_at_timestamp`,Q=`${Z}, sequence`,ei=`${Q}, status`,ti=`${Z}, till_type, shift_uid, invoice_uid`,ni=`${Q}, payment_method_code, is_disabled`,ri=`${Z}, type, status, table_uid`,ii=`${Q}, name, barcode, codename`,ai=`${Z}, status, printer_type, connection_type, protocol, save_only, device_uid_to_print`,oi=`${Z}, name, printer_type`,si=`${Z}, order_number, status`,ci=`${Z}, model`,li={items:ii,sections:Q,section_items:Q,categories:Q,shifts:ei,tills:ti,employees:`${Z}, role_uid`,payment_methods:ni,invoices:ri,configs:Z,reports:Z,printers:Z,print_jobs:ai,print_templates:oi,employee_roles:`${Z}, name, is_default`,order_displays:si,storages:ci,menus:Z,stock_logs:`${Z}, entity_type, entity_uid, type`};var $=function(e){return e.DISCONNECTED=`disconnected`,e.CONNECTED=`connected`,e.ERROR=`error`,e}($||{}),ui=class e{constructor(e,t,n=!1){this.options=e,this.win=t,y(this,`mode`,void 0),y(this,`http`,void 0),y(this,`dataSource`,void 0),y(this,`status`,$.DISCONNECTED),this.mode=e.mode,this.http=Qr(e.base_url,e.device_uid,e.token),n||this.initializeDatabase(),M.setWindow(t)}static async init(t,n,r=!1){let i=new e(t,n,!0);return r||await i.initializeDatabase(),i}async initializeDatabase(){try{if(!this.options.database||!this.options.database.name)throw Error(`Database name is not defined`);this.dataSource=await new i(this.options.database.name),this.dataSource.version(29).stores(li),this.status=$.CONNECTED}catch(e){this.status=$.ERROR,console.error(`Database connection error:`,e)}return this.dataSource}async dropDatabase(){await i.delete(this.options.database.name),await this.initializeDatabase()}clearTableData(e){return this.dataSource.table(e).clear()}async getService(e){if(this.status==$.ERROR)throw Error(`Database connection error`);for(;this.status==$.DISCONNECTED;)await new Promise(e=>setTimeout(e,100));try{return new e(this.http,this.dataSource,this.options)}catch(e){throw Error(`Service instantiation error: `+e?.message)}}async getServiceByName(e){if(this.status==$.ERROR)throw Error(`Database connection error`);for(;this.status==$.DISCONNECTED;)await new Promise(e=>setTimeout(e,100));try{let t=$r.get(e);if(!t)throw Error(`No service found for model: ${e}`);return new t(this.http,this.dataSource,this.options)}catch(e){throw Error(`Service instantiation error: `+e?.message)}}};async function di(e){if(!e)return``;let t=new TextEncoder().encode(e),n=await crypto.subtle.digest(`SHA-256`,t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,`0`)).join(``).slice(0,12).toUpperCase()}const fi={v1:{headers:[`Type`,`Name`,`SKU`,`Price`,`Stock`,`Is Internal`,`Min Order`,`Max Order`,`Image URL`,`Thumbnail URL`,`Sequence`]},v2:{headers:[`Type`,`Name`,`SKU`,`Price`,`Stock`,`Is Internal`,`Min Order`,`Max Order`,`Image URL`,`Thumbnail URL`,`Sequence`,`Item UID`]},v3:{headers:[`Type`,`Name`,`SKU`,`Price`,`Stock`,`Is Internal`,`Min Order`,`Max Order`,`Image URL`,`Thumbnail URL`,`Sequence`,`Item UID`,`Print On Receipt`,`Discountable`,`Open Editor Panel`,`Is Delisted`,`Name Translations`]},v4:{headers:[`Type`,`Name`,`SKU`,`Price`,`Stock`,`Is Internal`,`Min Order`,`Max Order`,`Image URL`,`Thumbnail URL`,`Sequence`,`Item UID`,`Print On Receipt`,`Discountable`,`Open Editor Panel`,`Is Delisted`,`Name Translations`,`Prices`]},v5:{headers:[`Type`,`Name`,`SKU`,`Price`,`Stock`,`Is Internal`,`Min Order`,`Max Order`,`Image URL`,`Thumbnail URL`,`Sequence`,`Item UID`,`Print On Receipt`,`Discountable`,`Open Editor Panel`,`Is Delisted`,`Name Translations`,`Prices`,`PLU`,`Code`]}},pi=[`category`,`subcategory`,`product`,`modifier_category`,`modifier`,`combo`,`combo_group`,`combo_item`];function mi(e,t,n=`export.csv`){return gi(bi(e,t,e=>e.code||``,e=>e.plu||``))}async function hi(e,t,n=`export.csv`){let r=new Map;for(let t of e)r.set(t,t.code||(t.name?await di(`${t.name}|CAT`):``));let i=new Map;for(let e of t){let t=e.price??0;i.set(e,e.plu||(e.name?await di(`${e.name}|${t.toFixed(2)}`):``))}return gi(bi(e,t,e=>r.get(e)||``,e=>i.get(e)||``))}function gi(e){let t=Si(e);return new Blob([``+t],{type:`text/csv;charset=utf-8;`})}function _i(e){if(!(e==null||e===``)){if(typeof e==`number`&&!isNaN(e))return e;if(typeof e==`string`){let t=parseFloat(e);return isNaN(t)?void 0:t}}}function vi(e){if(!e)return``;let t=Object.entries(e).filter(([,e])=>e);return t.length===0?``:t.map(([e,t])=>`${e}:${t}`).join(`|`)}function yi(e){if(!e||!e.trim())return{};let t={};for(let n of e.split(`|`)){let e=n.indexOf(`:`);e>0&&(t[n.slice(0,e).trim()]=n.slice(e+1).trim())}return t}function bi(e,t,n,r){let i=[],a=new Map;for(let e of t)a.has(e.category_uid)||a.set(e.category_uid,[]),a.get(e.category_uid).push(e);for(let t of e){let e=n(t);i.push({type:`category`,name:t.name,sku:``,price:void 0,stock:void 0,is_internal:t.is_internal,min_order:void 0,max_order:void 0,image_url:t.image_url||``,image_thumbnail_url:t.image_thumbnail_url||``,sequence:t.sequence,is_delisted:t.is_delisted,name_translations:vi(t.name_translations),code:e});let o=a.get(t.uid)||[];if(t.has_subcategory&&t.subcategories&&t.subcategories.length>0){let e=new Map;for(let n of t.subcategories)e.set(n.uid,n);let n=new Map,a=[];for(let t of o)t.subcategory_uid&&e.has(t.subcategory_uid)?(n.has(t.subcategory_uid)||n.set(t.subcategory_uid,[]),n.get(t.subcategory_uid).push(t)):a.push(t);for(let e of t.subcategories){i.push({type:`subcategory`,name:e.name,sku:``,sequence:e.sequence,name_translations:vi(e.name_translations)});let t=n.get(e.uid)||[];for(let e of t)xi(i,e,r)}for(let e of a)xi(i,e,r)}else for(let e of o)xi(i,e,r)}return i}function xi(e,t,n){let r=t.type===A.Combo,i=n(t);if(e.push({type:r?`combo`:`product`,name:t.name,sku:t.sku||``,price:t.price,stock:_i(t.stock),is_internal:t.is_internal,min_order:void 0,max_order:void 0,image_url:t.image_url||``,image_thumbnail_url:t.image_thumbnail_url||``,sequence:t.sequence,print_on_receipt:t.print_on_receipt,discountable:t.discountable,open_editor_panel:t.open_editor_panel,is_delisted:t.is_delisted,name_translations:vi(t.name_translations),item_uid:t.uid,prices:t.prices?.length?t.prices:void 0,plu:i}),r&&t.combo_groups&&t.combo_groups.length>0){for(let n of t.combo_groups)if(e.push({type:`combo_group`,name:n.name,sku:``,price:void 0,stock:void 0,is_internal:void 0,min_order:n.min_order,max_order:n.max_order,image_url:``,image_thumbnail_url:``,sequence:n.sequence}),n.combo_items&&n.combo_items.length>0)for(let t of n.combo_items)e.push({type:`combo_item`,name:t.combo_item?.name||``,sku:``,price:t.price,stock:void 0,is_internal:void 0,min_order:void 0,max_order:void 0,image_url:``,image_thumbnail_url:``,sequence:t.sequence,item_uid:t.item_uid})}if(!r&&t.modifier_categories&&t.modifier_categories.length>0){for(let n of t.modifier_categories)if(e.push({type:`modifier_category`,name:n.name,sku:``,price:void 0,stock:void 0,is_internal:void 0,min_order:n.min_order,max_order:n.max_order,image_url:``,image_thumbnail_url:``,sequence:n.sequence}),t.modifiers&&t.modifiers.length>0){let r=t.modifiers.filter(e=>e.category_uid===n.uid);for(let t of r)e.push({type:`modifier`,name:t.name,sku:t.sku||``,price:t.price,stock:_i(t.stock),is_internal:t.is_internal,min_order:void 0,max_order:void 0,image_url:t.image_url||``,image_thumbnail_url:t.image_thumbnail_url||``,sequence:t.sequence,print_on_receipt:t.print_on_receipt,name_translations:vi(t.name_translations),prices:t.prices?.length?t.prices:void 0})}}}function Si(e){let t=[fi.v5.headers.join(`,`)];for(let n of e)try{let e=n.prices?.length?`"${JSON.stringify(n.prices).replace(/"/g,`""`)}"`:``,r=[n.type,`"${n.name.replace(/"/g,`""`)}"`,n.sku||``,n.price===void 0?``:n.price.toString(),n.stock===void 0?``:n.stock.toString(),n.is_internal===void 0?``:n.is_internal.toString(),n.min_order===void 0?``:n.min_order.toString(),n.max_order===void 0?``:n.max_order.toString(),n.image_url||``,n.image_thumbnail_url||``,n.sequence===void 0?``:n.sequence.toString(),n.item_uid||``,n.print_on_receipt===void 0?``:n.print_on_receipt.toString(),n.discountable===void 0?``:n.discountable.toString(),n.open_editor_panel===void 0?``:n.open_editor_panel.toString(),n.is_delisted===void 0?``:n.is_delisted.toString(),n.name_translations?`"${n.name_translations.replace(/"/g,`""`)}"`:``,e,n.plu?`"${n.plu.replace(/"/g,`""`)}"`:``,n.code?`"${n.code.replace(/"/g,`""`)}"`:``];t.push(r.join(`,`))}catch(e){throw Error(`Export failed on "${n.name}" (type: ${n.type}): ${e.message}`)}return t.join(`
2
+ `)}async function Ci(e){return ki(Di(await e.text()))}function wi(e){let t=Oi(e).map(e=>e.trim());return t.includes(`PLU`)||t.includes(`Code`)?`v5`:t.includes(`Prices`)?`v4`:t.includes(`Print On Receipt`)||t.includes(`Name Translations`)?`v3`:t.includes(`Item UID`)?`v2`:`v1`}function Ti(e,t,n){let r=e?.trim().toLowerCase();if(r){if(r===`true`)return!0;if(r===`false`)return!1;throw Error(`Invalid ${t} "${e}" at line ${n}. Must be: true or false`)}}function Ei(e,t){if(!e)return[];try{let t=JSON.parse(e);if(!Array.isArray(t))throw Error(`not an array`);return t.map(e=>{let t=new Oe;return t.lookup_keys=e.lookup_keys||[],t.amount=e.amount||0,t.name=e.name||``,t.name_translations=e.name_translations||{},t.product_uid=e.product_uid||``,t})}catch{throw Error(`Invalid Prices JSON at line ${t}`)}}function Di(e){let t=e.replace(/^\uFEFF/,``).replace(/\r\n/g,`
3
3
  `).replace(/\r/g,`
4
4
  `).trim().split(`
5
- `);if(t.length===0)throw Error(`CSV file is empty`);let n=t[0].trim(),r=xi(n),i=di[r],a=i.headers.length,o=i.headers.join(`,`);if(n!==o)throw Error(`Invalid CSV header. Expected: ${o}\nReceived: ${n}`);let s=[];for(let e=1;e<t.length;e++){let n=t[e].trim();if(!n)continue;let i=Ti(n);if(i.length!==a)throw Error(`Invalid CSV row at line ${e+1}: expected ${a} columns`);let[o,c,l,u,d,f,p,m,h,g,_]=i,v=r===`v1`?``:i[11];if(!o||!c.trim())throw Error(`Missing required fields at line ${e+1}`);if(!fi.includes(o))throw Error(`Invalid type "${o}" at line ${e+1}. Must be: ${fi.join(`, `)}`);let y;if(u&&u.trim()&&(y=parseFloat(u),isNaN(y)))throw Error(`Invalid price "${u}" at line ${e+1}`);let b;if(d&&d.trim()&&(b=parseFloat(d),isNaN(b)))throw Error(`Invalid stock "${d}" at line ${e+1}`);let ee=Si(f,`is_internal`,e+1),x;if(p&&p.trim()&&(x=parseInt(p,10),isNaN(x)))throw Error(`Invalid min_order "${p}" at line ${e+1}`);let S;if(m&&m.trim()&&(S=parseInt(m,10),isNaN(S)))throw Error(`Invalid max_order "${m}" at line ${e+1}`);let C;if(_&&_.trim()&&(C=parseInt(_,10),isNaN(C)))throw Error(`Invalid sequence "${_}" at line ${e+1}`);let te,w,ne,re,ie=``,T;(r===`v3`||r===`v4`)&&(te=Si(i[12],`print_on_receipt`,e+1),w=Si(i[13],`discountable`,e+1),ne=Si(i[14],`open_editor_panel`,e+1),re=Si(i[15],`is_delisted`,e+1),ie=i[16]?.trim()||``),r===`v4`&&i[17]?.trim()&&(T=Ci(i[17],e+1)),s.push({type:o,name:c.trim(),sku:l?.trim()||``,price:y,stock:b,is_internal:ee,min_order:x,max_order:S,image_url:h?.trim()||``,image_thumbnail_url:g?.trim()||``,sequence:C,item_uid:v?.trim()||``,print_on_receipt:te,discountable:w,open_editor_panel:ne,is_delisted:re,name_translations:ie,prices:T})}return s}function Ti(e){let t=[],n=``,r=!1;for(let i=0;i<e.length;i++){let a=e[i];a===`"`?r&&e[i+1]===`"`?(n+=`"`,i++):r=!r:a===`,`&&!r?(t.push(n),n=``):n+=a}return t.push(n),t}function Ei(e){let n=[],r=[],i=null,a=null,o=null,s=null,c=null,l=0,u=new Map;for(let n of e)(n.type===`product`||n.type===`combo`)&&n.item_uid&&u.set(n.item_uid,D.Item+t());for(let t of e)if(t.type===`category`)i=new xe,i.name=t.name,i.is_internal=t.is_internal===void 0?!1:t.is_internal,i.sequence=t.sequence===void 0?l++:t.sequence,i.image_url=t.image_url||``,i.image_thumbnail_url=t.image_thumbnail_url||``,i.visibility=[],i.is_delisted=t.is_delisted===void 0?!1:t.is_delisted,t.name_translations&&(i.name_translations=gi(t.name_translations)),n.push(i),o=null,s=null,c=null,a=null;else if(t.type===`subcategory`){if(!i)throw Error(`Subcategory "${t.name}" found without a category`);a=new Se,a.name=t.name,a.sequence=t.sequence||0,a.category_uid=i.uid,t.name_translations&&(a.name_translations=gi(t.name_translations)),i.has_subcategory=!0,i.subcategories.push(a),o=null,s=null,c=null}else if(t.type===`product`||t.type===`combo`){if(!i)throw Error(`${t.type===`combo`?`Combo`:`Product`} "${t.name}" found without a category`);if(o=new we,o.uid=t.item_uid&&u.get(t.item_uid)||o.uid,o.name=t.name,o.sku=t.sku||``,o.price=t.price||0,o.stock=t.stock===void 0?1e3:t.stock,o.is_internal=t.is_internal===void 0?!1:t.is_internal,o.sequence=t.sequence||0,o.image_url=t.image_url||``,o.image_thumbnail_url=t.image_thumbnail_url||``,o.category_uid=i.uid,o.type=t.type===`combo`?P.Combo:P.ByQuantity,o.modifier_categories=[],o.modifiers=[],o.combo_groups=[],t.print_on_receipt!==void 0&&(o.print_on_receipt=t.print_on_receipt),t.discountable!==void 0&&(o.discountable=t.discountable),t.open_editor_panel!==void 0&&(o.open_editor_panel=t.open_editor_panel),t.is_delisted!==void 0&&(o.is_delisted=t.is_delisted),t.name_translations&&(o.name_translations=gi(t.name_translations)),t.prices?.length){for(let e of t.prices)e.product_uid=o.uid;o.prices=t.prices}a&&(o.subcategory_uid=a.uid),r.push(o),s=null,c=null}else if(t.type===`combo_group`){if(!o||o.type!==P.Combo)throw Error(`Combo group "${t.name}" found without a combo product`);c=new De,c.name=t.name,c.min_order=t.min_order===void 0?1:t.min_order,c.max_order=t.max_order===void 0?1:t.max_order,c.sequence=t.sequence===void 0?o.combo_groups.length:t.sequence,o.combo_groups.push(c)}else if(t.type===`combo_item`){if(!c)throw Error(`Combo item "${t.name}" found without a combo group`);let e=new Ee;e.item_uid=u.get(t.item_uid||``)||t.item_uid||``,e.price=t.price||0,e.sequence=t.sequence||0,e.combo_item=new we,e.combo_item.name=t.name,c.combo_items.push(e)}else if(t.type===`modifier_category`){if(!o)throw Error(`Modifier category "${t.name}" found without a product`);s=new be,s.name=t.name,s.min_order=t.min_order===void 0?0:t.min_order,s.max_order=t.max_order===void 0?0:t.max_order,s.sequence=t.sequence===void 0?o.modifier_categories.length:t.sequence,s.visibility=[],o.modifier_categories.push(s)}else if(t.type===`modifier`){if(!o)throw Error(`Modifier "${t.name}" found without a product`);let e=new Ce;if(e.name=t.name,e.sku=t.sku||``,e.price=t.price||0,e.stock=t.stock===void 0?0:t.stock,e.is_internal=t.is_internal===void 0?!1:t.is_internal,e.sequence=t.sequence||0,e.image_url=t.image_url||``,e.image_thumbnail_url=t.image_thumbnail_url||``,e.type=P.Modifier,e.category_uid=s?s.uid:o.category_uid,t.print_on_receipt!==void 0&&(e.print_on_receipt=t.print_on_receipt),t.name_translations&&(e.name_translations=gi(t.name_translations)),t.prices?.length){for(let n of t.prices)n.product_uid=e.uid;e.prices=t.prices}o.modifiers.push(e)}return{categories:n,products:r}}let Di=function(e){return e.None=``,e.Always=`always`,e}({}),Oi=function(e){return e.Image=`image`,e.Video=`video`,e.Unsupported=`unsupported`,e}({}),ki=function(e){return e.CdsFullScreenImage=`cds_full_screen_image`,e.CdsHalfScreenImage=`cds_half_screen_image`,e}({});var Ai=class{constructor(){y(this,`name`,void 0),y(this,`address`,void 0),y(this,`postcode`,void 0),y(this,`tel`,void 0),y(this,`tax_number`,void 0),y(this,`user_id`,void 0),y(this,`uid`,void 0),y(this,`api_key`,void 0),y(this,`ip_address`,void 0),y(this,`meta`,void 0)}},ji=class extends E{constructor(...e){super(...e),y(this,`uid`,D.Storage+t()),y(this,`model`,void 0),y(this,`data`,void 0)}},Mi=class extends E{constructor(...e){super(...e),y(this,`uid`,D.Menu+t()),y(this,`icon`,``),y(this,`meta`,{}),y(this,`category_uids`,[]),y(this,`online_order_expiry_in_minutes`,0),y(this,`online_order_session_expiry_in_minutes`,0)}};let Ni=function(e){return e.In=`IN`,e.Out=`OUT`,e.Adjust=`ADJUST`,e.Production=`PRODUCTION`,e}({}),Pi=function(e){return e.Invoice=`invoice`,e.Purchase=`purchase`,e.Production=`production`,e.Stocktake=`stocktake`,e}({}),Fi=function(e){return e.Item=`item`,e.Material=`material`,e}({});var Ii=class extends T{constructor(){super(),y(this,`entity_type`,Fi.Item),y(this,`entity_uid`,``),y(this,`type`,Ni.Adjust),y(this,`qty`,0),y(this,`qty_before`,0),y(this,`qty_after`,0),y(this,`ref_type`,void 0),y(this,`ref_uid`,void 0),y(this,`reason`,void 0),y(this,`created_by`,void 0),y(this,`uid`,D.StockLog+t())}};const Li=[`#each`,`#if`,`#elseif`,`#else`,`#let`,`#merge`,`#concat`,`#include`,`#?`,`#flatten`];function Ri(e){let t=[],n=(e,n,r,i)=>t.push({type:e,path:n,message:r,context:i}),r;try{r=JSON.parse(e)}catch(t){let n=t.message.match(/position (\d+)/)?.[1];return{valid:!1,errors:[{type:`JSON_PARSE`,path:null,message:t.message,context:n?e.slice(Math.max(0,n-20),+n+20):void 0}]}}let i=JSON.stringify(r),a=i.match(/"[^"]*"/g)||[],o=0,s=0;return a.forEach(e=>{o+=(e.match(/\{\{/g)||[]).length,s+=(e.match(/\}\}/g)||[]).length}),o!==s&&n(`BRACKET_MISMATCH`,null,`{{ : ${o}, }} : ${s}`),(i.match(/\{\{([^}]+)\}\}/g)||[]).forEach(e=>{let t=e.slice(2,-2).trim();if(t.startsWith(`#`)){let r=t.split(/\s/)[0];Li.includes(r)||n(`UNKNOWN_DIRECTIVE`,null,r,e);return}try{Function(`with(this){return(${t})}`)}catch(t){n(`INVALID_EXPRESSION`,null,t.message,e)}}),(function e(t,r){if(!(!t||typeof t!=`object`)){if(Array.isArray(t)){let i=t[0]&&Object.keys(t[0])[0];i?.includes(`#if`)&&!i.includes(`#elseif`)&&zi(t,r,n),t.forEach((t,n)=>e(t,`${r}[${n}]`));return}for(let i in t){let a=t[i];i.includes(`#each`)&&typeof a!=`object`&&n(`INVALID_EACH`,r,`value must be object`,i),i.includes(`#let`)&&(!Array.isArray(a)||a.length!==2)&&n(`INVALID_LET`,r,`must be [definitions, template]`,i),(i.includes(`#merge`)||i.includes(`#concat`))&&!Array.isArray(a)&&n(`INVALID_STRUCTURE`,r,`value must be array`,i),e(a,r?`${r}.${i}`:i)}}})(r,``),{valid:!t.length,errors:t}}function zi(e,t,n){let r=e=>Object.keys(e)[0]||``;r(e[0]).match(/#if\s/)||n(`INVALID_CONDITIONAL`,t,`must start with #if`,r(e[0]));for(let i=1;i<e.length-1;i++)r(e[i]).includes(`#elseif`)||n(`INVALID_CONDITIONAL`,`${t}[${i}]`,`middle must be #elseif`,r(e[i]));e.length>1&&!r(e.at(-1)).includes(`#else`)&&n(`INVALID_CONDITIONAL`,`${t}[${e.length-1}]`,`last must be #else/#elseif`,r(e.at(-1)))}export{b as Address,E as AppBaseModel,St as AppConfig,T as AppCoreModel,ln as AppCoreService,ae as AppExtraModel,un as AppLocalService,Gr as AppMiscService,K as AppRemoteService,mn as AppReport,Kr as AppReportService,te as Applying,ki as AssetTags,Oi as AssetType,an as Between,Ct as Cache,G as CalcFlow,W as CalcType,Dt as CardPaymentCode,$t as CashDrawerConfig,xe as Category,Sn as CategorySalesSummary,Ir as CategoryService,ye as CategoryType,gt as Charge,qt as ChargeConfig,F as Codepages,De as ComboGroup,Ee as ComboGroupItem,Di as Condition,At as Config,Lr as ConfigService,be as CoreCategory,Ce as CoreItem,w as Coupon,re as CouponItemized,ne as CouponUsage,wt as CrmConfig,Jt as CurrencyConfig,x as Customer,Et as CustomerDisplaySystemConfig,Nt as DeployChannel,He as Device,We as DeviceType,pt as DiscountType,_n as DrawerSummary,Oe as ElectronSocket,xt as Employee,me as EmployeeRole,Nr as EmployeeRoleService,Pr as EmployeeService,k as ErrorMsgs,Be as EscPosCompatibility,Ne as EscPosPrinter,en as FileUploadRequest,Qt as GTOConfig,Ft as GeneralConfig,rn as In,nn as Include,Xt as InventoryConfig,bt as Invoice,dt as InvoiceAction,ht as InvoiceActivity,kr as InvoiceBaseService,mt as InvoiceCharge,vt as InvoiceCoreLine,_t as InvoiceDiscount,yt as InvoiceLine,jr as InvoiceOperationService,Mr as InvoiceService,U as InvoiceStatus,ct as InvoiceType,we as Item,bn as ItemSalesSummary,Fr as ItemService,Bt as KdsConfig,Ot as KioskSystemConfig,zt as KitchenConfig,Vt as LabelConfig,Ar as LineOperationService,Tt as LoyaltyProgram,yn as LoyaltyProgramSummary,kt as MarketingConfig,Mi as Menu,Jr as MenuService,Ai as Merchant,le as MessageType,D as ModelPrefix,oe as ModelType,xn as ModifierSalesSummary,Ue as Node,Ge as NodePrinter,on as Not,st as Note,ot as NoteEntity,at as NoteGroup,it as NoteGroupEntity,Mt as OnlineOrderConfig,Ht as OrderConfig,Er as OrderDisplay,Dr as OrderDisplayService,X as OrderDisplayStatus,Ut as OrderDisplaySystemConfig,lt as OrderFlow,Zt as PaxConfig,$e as Payment,Wt as PaymentConfig,et as PaymentMethod,tt as PaymentMethodHistory,Ur as PaymentMethodService,Wr as PaymentService,rt as PaymentStatus,vn as PaymentSummary,jt as PaynowMethod,Te as Price,Pe as PrintAlign,Le as PrintBarcode,L as PrintCommand,ze as PrintImage,V as PrintJob,qr as PrintJobService,Ye as PrintJobStatus,Re as PrintQrcode,Ie as PrintSize,Fe as PrintStyle,B as PrintTemplate,Je as PrintTemplateCore,Yr as PrintTemplateService,I as PrintType,Ze as Printer,qe as PrinterConnections,Ke as PrinterProtocols,Cn as PrinterService,Xe as PrinterStatus,z as PrinterType,ge as ProductBase,Pt as ProductConfig,Br as ProductService,P as ProductType,ue as PushData,sn as Raw,Rt as Receipt,H as RenderPrintTemplateOptions,pn as Report,fn as ReportCategory,Lt as ReportConfig,hn as ReportData,dn as ReportType,Yt as RoundingConfig,gn as SalesSummary,pe as Section,fe as SectionItem,zr as SectionItemService,N as SectionItemStatus,Rr as SectionService,ui as ServiceFactory,se as ServiceMode,ce as ServiceOptions,de as Shift,Vr as ShiftService,A as ShiftStatus,nt as StandardPaymentMethod,he as StockChange,Ii as StockLog,Fi as StockLogEntityType,Pi as StockLogRefType,Zr as StockLogService,Ni as StockLogType,ji as Storage,Xr as StorageService,Se as Subcategory,ve as System,O as SystemError,Kt as TaxConfig,ut as TaxMethod,Qe as TemplateData,M as Till,It as TillConfig,Hr as TillService,j as TillType,ft as UomType,ee as User,Gt as UserConfig,_e as Visibility,pi as createCSVExport,li as dbSchemas,cn as filterByParams,R as humanizedData,bi as importFromCSV,Ve as normalizedDate,ie as transformer,Ri as validateSTTemplate};
5
+ `);if(t.length===0)throw Error(`CSV file is empty`);let n=t[0].trim(),r=wi(n),i=fi[r],a=i.headers.length,o=i.headers.join(`,`);if(n!==o)throw Error(`Invalid CSV header. Expected: ${o}\nReceived: ${n}`);let s=[];for(let e=1;e<t.length;e++){let n=t[e].trim();if(!n)continue;let i=Oi(n);if(i.length!==a)throw Error(`Invalid CSV row at line ${e+1}: expected ${a} columns`);let[o,c,l,u,d,f,p,m,h,g,_]=i,v=r===`v1`?``:i[11];if(!o||!c.trim())throw Error(`Missing required fields at line ${e+1}`);if(!pi.includes(o))throw Error(`Invalid type "${o}" at line ${e+1}. Must be: ${pi.join(`, `)}`);let y;if(u&&u.trim()&&(y=parseFloat(u),isNaN(y)))throw Error(`Invalid price "${u}" at line ${e+1}`);let b;if(d&&d.trim()&&(b=parseFloat(d),isNaN(b)))throw Error(`Invalid stock "${d}" at line ${e+1}`);let ee=Ti(f,`is_internal`,e+1),te;if(p&&p.trim()&&(te=parseInt(p,10),isNaN(te)))throw Error(`Invalid min_order "${p}" at line ${e+1}`);let ne;if(m&&m.trim()&&(ne=parseInt(m,10),isNaN(ne)))throw Error(`Invalid max_order "${m}" at line ${e+1}`);let re;if(_&&_.trim()&&(re=parseInt(_,10),isNaN(re)))throw Error(`Invalid sequence "${_}" at line ${e+1}`);let ie,ae,oe,se,ce=``,x,S=``,le=``;(r===`v3`||r===`v4`||r===`v5`)&&(ie=Ti(i[12],`print_on_receipt`,e+1),ae=Ti(i[13],`discountable`,e+1),oe=Ti(i[14],`open_editor_panel`,e+1),se=Ti(i[15],`is_delisted`,e+1),ce=i[16]?.trim()||``),(r===`v4`||r===`v5`)&&i[17]?.trim()&&(x=Ei(i[17],e+1)),r===`v5`&&(S=i[18]?.trim()||``,le=i[19]?.trim()||``),s.push({type:o,name:c.trim(),sku:l?.trim()||``,price:y,stock:b,is_internal:ee,min_order:te,max_order:ne,image_url:h?.trim()||``,image_thumbnail_url:g?.trim()||``,sequence:re,item_uid:v?.trim()||``,print_on_receipt:ie,discountable:ae,open_editor_panel:oe,is_delisted:se,name_translations:ce,prices:x,plu:S,code:le})}return s}function Oi(e){let t=[],n=``,r=!1;for(let i=0;i<e.length;i++){let a=e[i];a===`"`?r&&e[i+1]===`"`?(n+=`"`,i++):r=!r:a===`,`&&!r?(t.push(n),n=``):n+=a}return t.push(n),t}function ki(e){let n=[],r=[],i=null,a=null,o=null,s=null,c=null,l=0,u=new Map;for(let n of e)(n.type===`product`||n.type===`combo`)&&n.item_uid&&u.set(n.item_uid,C.Item+t());for(let t of e)if(t.type===`category`)i=new Te,i.name=t.name,i.is_internal=t.is_internal===void 0?!1:t.is_internal,i.sequence=t.sequence===void 0?l++:t.sequence,i.image_url=t.image_url||``,i.image_thumbnail_url=t.image_thumbnail_url||``,i.visibility=[],i.is_delisted=t.is_delisted===void 0?!1:t.is_delisted,t.name_translations&&(i.name_translations=yi(t.name_translations)),t.code&&(i.code=t.code),n.push(i),o=null,s=null,c=null,a=null;else if(t.type===`subcategory`){if(!i)throw Error(`Subcategory "${t.name}" found without a category`);a=new Ee,a.name=t.name,a.sequence=t.sequence||0,a.category_uid=i.uid,t.name_translations&&(a.name_translations=yi(t.name_translations)),i.has_subcategory=!0,i.subcategories.push(a),o=null,s=null,c=null}else if(t.type===`product`||t.type===`combo`){if(!i)throw Error(`${t.type===`combo`?`Combo`:`Product`} "${t.name}" found without a category`);if(o=new j,o.uid=t.item_uid&&u.get(t.item_uid)||o.uid,o.name=t.name,o.sku=t.sku||``,o.price=t.price||0,o.stock=t.stock===void 0?1e3:t.stock,o.is_internal=t.is_internal===void 0?!1:t.is_internal,o.sequence=t.sequence||0,o.image_url=t.image_url||``,o.image_thumbnail_url=t.image_thumbnail_url||``,o.category_uid=i.uid,o.type=t.type===`combo`?A.Combo:A.ByQuantity,o.modifier_categories=[],o.modifiers=[],o.combo_groups=[],t.print_on_receipt!==void 0&&(o.print_on_receipt=t.print_on_receipt),t.discountable!==void 0&&(o.discountable=t.discountable),t.open_editor_panel!==void 0&&(o.open_editor_panel=t.open_editor_panel),t.is_delisted!==void 0&&(o.is_delisted=t.is_delisted),t.name_translations&&(o.name_translations=yi(t.name_translations)),t.prices?.length){for(let e of t.prices)e.product_uid=o.uid;o.prices=t.prices}t.plu&&(o.plu=t.plu),a&&(o.subcategory_uid=a.uid),r.push(o),s=null,c=null}else if(t.type===`combo_group`){if(!o||o.type!==A.Combo)throw Error(`Combo group "${t.name}" found without a combo product`);c=new Ae,c.name=t.name,c.min_order=t.min_order===void 0?1:t.min_order,c.max_order=t.max_order===void 0?1:t.max_order,c.sequence=t.sequence===void 0?o.combo_groups.length:t.sequence,o.combo_groups.push(c)}else if(t.type===`combo_item`){if(!c)throw Error(`Combo item "${t.name}" found without a combo group`);let e=new ke;e.item_uid=u.get(t.item_uid||``)||t.item_uid||``,e.price=t.price||0,e.sequence=t.sequence||0,e.combo_item=new j,e.combo_item.name=t.name,c.combo_items.push(e)}else if(t.type===`modifier_category`){if(!o)throw Error(`Modifier category "${t.name}" found without a product`);s=new we,s.name=t.name,s.min_order=t.min_order===void 0?0:t.min_order,s.max_order=t.max_order===void 0?0:t.max_order,s.sequence=t.sequence===void 0?o.modifier_categories.length:t.sequence,s.visibility=[],o.modifier_categories.push(s)}else if(t.type===`modifier`){if(!o)throw Error(`Modifier "${t.name}" found without a product`);let e=new De;if(e.name=t.name,e.sku=t.sku||``,e.price=t.price||0,e.stock=t.stock===void 0?0:t.stock,e.is_internal=t.is_internal===void 0?!1:t.is_internal,e.sequence=t.sequence||0,e.image_url=t.image_url||``,e.image_thumbnail_url=t.image_thumbnail_url||``,e.type=A.Modifier,e.category_uid=s?s.uid:o.category_uid,t.print_on_receipt!==void 0&&(e.print_on_receipt=t.print_on_receipt),t.name_translations&&(e.name_translations=yi(t.name_translations)),t.prices?.length){for(let n of t.prices)n.product_uid=e.uid;e.prices=t.prices}o.modifiers.push(e)}return{categories:n,products:r}}let Ai=function(e){return e.None=``,e.Always=`always`,e}({}),ji=function(e){return e.Image=`image`,e.Video=`video`,e.Unsupported=`unsupported`,e}({}),Mi=function(e){return e.CdsFullScreenImage=`cds_full_screen_image`,e.CdsHalfScreenImage=`cds_half_screen_image`,e}({});var Ni=class{constructor(){y(this,`name`,void 0),y(this,`address`,void 0),y(this,`postcode`,void 0),y(this,`tel`,void 0),y(this,`tax_number`,void 0),y(this,`user_id`,void 0),y(this,`uid`,void 0),y(this,`api_key`,void 0),y(this,`ip_address`,void 0),y(this,`meta`,void 0)}},Pi=class extends S{constructor(...e){super(...e),y(this,`uid`,C.Storage+t()),y(this,`model`,void 0),y(this,`data`,void 0)}},Fi=class extends S{constructor(...e){super(...e),y(this,`uid`,C.Menu+t()),y(this,`icon`,``),y(this,`meta`,{}),y(this,`category_uids`,[]),y(this,`online_order_expiry_in_minutes`,0),y(this,`online_order_session_expiry_in_minutes`,0)}};let Ii=function(e){return e.In=`IN`,e.Out=`OUT`,e.Adjust=`ADJUST`,e.Production=`PRODUCTION`,e}({}),Li=function(e){return e.Invoice=`invoice`,e.Purchase=`purchase`,e.Production=`production`,e.Stocktake=`stocktake`,e}({}),Ri=function(e){return e.Item=`item`,e.Material=`material`,e}({});var zi=class extends x{constructor(){super(),y(this,`entity_type`,Ri.Item),y(this,`entity_uid`,``),y(this,`type`,Ii.Adjust),y(this,`qty`,0),y(this,`qty_before`,0),y(this,`qty_after`,0),y(this,`ref_type`,void 0),y(this,`ref_uid`,void 0),y(this,`reason`,void 0),y(this,`created_by`,void 0),y(this,`uid`,C.StockLog+t())}};const Bi=[`#each`,`#if`,`#elseif`,`#else`,`#let`,`#merge`,`#concat`,`#include`,`#?`,`#flatten`];function Vi(e){let t=[],n=(e,n,r,i)=>t.push({type:e,path:n,message:r,context:i}),r;try{r=JSON.parse(e)}catch(t){let n=t.message.match(/position (\d+)/)?.[1];return{valid:!1,errors:[{type:`JSON_PARSE`,path:null,message:t.message,context:n?e.slice(Math.max(0,n-20),+n+20):void 0}]}}let i=JSON.stringify(r),a=i.match(/"[^"]*"/g)||[],o=0,s=0;return a.forEach(e=>{o+=(e.match(/\{\{/g)||[]).length,s+=(e.match(/\}\}/g)||[]).length}),o!==s&&n(`BRACKET_MISMATCH`,null,`{{ : ${o}, }} : ${s}`),(i.match(/\{\{([^}]+)\}\}/g)||[]).forEach(e=>{let t=e.slice(2,-2).trim();if(t.startsWith(`#`)){let r=t.split(/\s/)[0];Bi.includes(r)||n(`UNKNOWN_DIRECTIVE`,null,r,e);return}try{Function(`with(this){return(${t})}`)}catch(t){n(`INVALID_EXPRESSION`,null,t.message,e)}}),(function e(t,r){if(!(!t||typeof t!=`object`)){if(Array.isArray(t)){let i=t[0]&&Object.keys(t[0])[0];i?.includes(`#if`)&&!i.includes(`#elseif`)&&Hi(t,r,n),t.forEach((t,n)=>e(t,`${r}[${n}]`));return}for(let i in t){let a=t[i];i.includes(`#each`)&&typeof a!=`object`&&n(`INVALID_EACH`,r,`value must be object`,i),i.includes(`#let`)&&(!Array.isArray(a)||a.length!==2)&&n(`INVALID_LET`,r,`must be [definitions, template]`,i),(i.includes(`#merge`)||i.includes(`#concat`))&&!Array.isArray(a)&&n(`INVALID_STRUCTURE`,r,`value must be array`,i),e(a,r?`${r}.${i}`:i)}}})(r,``),{valid:!t.length,errors:t}}function Hi(e,t,n){let r=e=>Object.keys(e)[0]||``;r(e[0]).match(/#if\s/)||n(`INVALID_CONDITIONAL`,t,`must start with #if`,r(e[0]));for(let i=1;i<e.length-1;i++)r(e[i]).includes(`#elseif`)||n(`INVALID_CONDITIONAL`,`${t}[${i}]`,`middle must be #elseif`,r(e[i]));e.length>1&&!r(e.at(-1)).includes(`#else`)&&n(`INVALID_CONDITIONAL`,`${t}[${e.length-1}]`,`last must be #else/#elseif`,r(e.at(-1)))}export{b as Address,S as AppBaseModel,Ct as AppConfig,x as AppCoreModel,un as AppCoreService,le as AppExtraModel,dn as AppLocalService,Gr as AppMiscService,G as AppRemoteService,hn as AppReport,Kr as AppReportService,ie as Applying,Mi as AssetTags,ji as AssetType,on as Between,wt as Cache,W as CalcFlow,U as CalcType,Ot as CardPaymentCode,en as CashDrawerConfig,Te as Category,Cn as CategorySalesSummary,Lr as CategoryService,Ce as CategoryType,_t as Charge,Jt as ChargeConfig,N as Codepages,Ae as ComboGroup,ke as ComboGroupItem,Ai as Condition,jt as Config,Rr as ConfigService,we as CoreCategory,De as CoreItem,ae as Coupon,se as CouponItemized,oe as CouponUsage,Tt as CrmConfig,Yt as CurrencyConfig,te as Customer,Dt as CustomerDisplaySystemConfig,Pt as DeployChannel,Ue as Device,Ge as DeviceType,mt as DiscountType,vn as DrawerSummary,M as ElectronSocket,St as Employee,ve as EmployeeRole,Pr as EmployeeRoleService,Fr as EmployeeService,T as ErrorMsgs,Ve as EscPosCompatibility,Fe as EscPosPrinter,tn as FileUploadRequest,$t as GTOConfig,It as GeneralConfig,an as In,rn as Include,Zt as InventoryConfig,xt as Invoice,ft as InvoiceAction,gt as InvoiceActivity,Ar as InvoiceBaseService,ht as InvoiceCharge,yt as InvoiceCoreLine,vt as InvoiceDiscount,bt as InvoiceLine,Mr as InvoiceOperationService,Nr as InvoiceService,H as InvoiceStatus,lt as InvoiceType,j as Item,xn as ItemSalesSummary,Ir as ItemService,Vt as KdsConfig,kt as KioskSystemConfig,Bt as KitchenConfig,Ht as LabelConfig,jr as LineOperationService,Et as LoyaltyProgram,bn as LoyaltyProgramSummary,At as MarketingConfig,Fi as Menu,Jr as MenuService,Ni as Merchant,pe as MessageType,C as ModelPrefix,ue as ModelType,Sn as ModifierSalesSummary,We as Node,Ke as NodePrinter,sn as Not,ct as Note,st as NoteEntity,ot as NoteGroup,at as NoteGroupEntity,Nt as OnlineOrderConfig,Ut as OrderConfig,Dr as OrderDisplay,Or as OrderDisplayService,Y as OrderDisplayStatus,Wt as OrderDisplaySystemConfig,ut as OrderFlow,Qt as PaxConfig,et as Payment,Gt as PaymentConfig,tt as PaymentMethod,nt as PaymentMethodHistory,Ur as PaymentMethodService,Wr as PaymentService,it as PaymentStatus,yn as PaymentSummary,Mt as PaynowMethod,Oe as Price,Ie as PrintAlign,Re as PrintBarcode,I as PrintCommand,Be as PrintImage,B as PrintJob,qr as PrintJobService,Xe as PrintJobStatus,ze as PrintQrcode,P as PrintSize,Le as PrintStyle,z as PrintTemplate,Ye as PrintTemplateCore,Yr as PrintTemplateService,F as PrintType,Qe as Printer,Je as PrinterConnections,qe as PrinterProtocols,wn as PrinterService,Ze as PrinterStatus,R as PrinterType,be as ProductBase,Ft as ProductConfig,Vr as ProductService,A as ProductType,me as PushData,cn as Raw,zt as Receipt,V as RenderPrintTemplateOptions,mn as Report,pn as ReportCategory,Rt as ReportConfig,gn as ReportData,fn as ReportType,Xt as RoundingConfig,_n as SalesSummary,_e as Section,ge as SectionItem,Br as SectionItemService,k as SectionItemStatus,zr as SectionService,ui as ServiceFactory,de as ServiceMode,fe as ServiceOptions,he as Shift,Hr as ShiftService,E as ShiftStatus,rt as StandardPaymentMethod,ye as StockChange,zi as StockLog,Ri as StockLogEntityType,Li as StockLogRefType,Zr as StockLogService,Ii as StockLogType,Pi as Storage,Xr as StorageService,Ee as Subcategory,Se as System,w as SystemError,qt as TaxConfig,dt as TaxMethod,$e as TemplateData,O as Till,Lt as TillConfig,X as TillService,D as TillType,pt as UomType,ee as User,Kt as UserConfig,xe as Visibility,mi as createCSVExport,hi as createCSVExportWithHash,li as dbSchemas,ln as filterByParams,L as humanizedData,Ci as importFromCSV,He as normalizedDate,ce as transformer,Vi as validateSTTemplate};
6
6
  //# sourceMappingURL=index.js.map
package/jest.setup.cjs CHANGED
@@ -1,6 +1,21 @@
1
1
  // Jest setup file to polyfill File and Blob APIs
2
2
  // This ensures consistent behavior across different Node.js versions and test environments
3
3
 
4
+ // Polyfill crypto.subtle for Node.js environment - must be done early
5
+ const { webcrypto } = require('crypto');
6
+ Object.defineProperty(global, 'crypto', {
7
+ value: webcrypto,
8
+ writable: true,
9
+ configurable: true
10
+ });
11
+
12
+ // Polyfill TextEncoder for Node.js environment
13
+ if (typeof TextEncoder === 'undefined') {
14
+ const util = require('util');
15
+ global.TextEncoder = util.TextEncoder;
16
+ global.TextDecoder = util.TextDecoder;
17
+ }
18
+
4
19
  // Polyfill Blob.text() if not available
5
20
  if (typeof Blob !== 'undefined' && !Blob.prototype.text) {
6
21
  Blob.prototype.text = async function() {
@@ -23,7 +38,6 @@ if (typeof FileReader === 'undefined') {
23
38
 
24
39
  readAsText(blob) {
25
40
  try {
26
- // For our polyfilled Blob
27
41
  if (blob.parts) {
28
42
  this.result = blob.parts.join('');
29
43
  } else if (typeof blob === 'string') {
@@ -31,7 +45,6 @@ if (typeof FileReader === 'undefined') {
31
45
  } else {
32
46
  this.result = String(blob);
33
47
  }
34
-
35
48
  if (this.onload) {
36
49
  setTimeout(() => this.onload({ target: this }), 0);
37
50
  }
@@ -55,11 +68,9 @@ if (typeof Blob === 'undefined') {
55
68
  return acc + (typeof part === 'string' ? part.length : part.length || 0);
56
69
  }, 0);
57
70
  }
58
-
59
71
  async text() {
60
72
  return this.parts.join('');
61
73
  }
62
-
63
74
  async arrayBuffer() {
64
75
  const text = await this.text();
65
76
  const buffer = Buffer.from(text);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posx/core",
3
- "version": "5.5.557",
3
+ "version": "5.5.558",
4
4
  "description": "POSX core libraries",
5
5
  "main": "./build/index.js",
6
6
  "author": "Steven Lee",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posx/core",
3
- "version": "5.5.557",
3
+ "version": "5.5.558",
4
4
  "description": "POSX core libraries",
5
5
  "type": "module",
6
6
  "main": "./build/index.js",