@posx/core 5.5.396 → 5.5.398

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
@@ -4628,6 +4628,8 @@ interface IItemService extends IAppRemoteService<IItem> {
4628
4628
  * @returns Promise resolving to array of updated items
4629
4629
  */
4630
4630
  copyModifierGroupToItems(sourceModifierCategory: ICoreCategory, sourceModifiers: ICoreItem[], targetItems: IItem[]): Promise<IItem[]>;
4631
+ /** Remove deprecated combo_item data from combo groups to reduce payload size */
4632
+ sanitize(item: IItem): IItem;
4631
4633
  }
4632
4634
  declare class ItemService extends AppRemoteService<IItem> implements IItemService {
4633
4635
  readonly http: AxiosInstance;
@@ -4657,6 +4659,7 @@ declare class ItemService extends AppRemoteService<IItem> implements IItemServic
4657
4659
  modifiers: ICoreItem[];
4658
4660
  }>;
4659
4661
  copyModifierGroupToItems(sourceModifierCategory: ICoreCategory, sourceModifiers: ICoreItem[], targetItems: IItem[]): Promise<IItem[]>;
4662
+ sanitize(item: IItem): IItem;
4660
4663
  }
4661
4664
  /**
4662
4665
  * Represents a service for managing categories.
package/build/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import e from"dayjs";import{nanoid as t}from"nanoid";import n from"esc-pos-encoder-ionic";import r from"wcwidth";import 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 ee=(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 h(e){"@babel/helpers - typeof";return h=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},h(e)}function g(e,t){if(h(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(h(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function _(e){var t=g(e,`string`);return h(t)==`symbol`?t:t+``}function v(e,t,n){return(t=_(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var te=class{constructor(){v(this,`address1`,``),v(this,`address2`,``),v(this,`lat`,``),v(this,`lng`,``),v(this,`postcode`,``),v(this,`note`,``),v(this,`is_default`,!1),v(this,`name`,``),v(this,`salute`,``),v(this,`phone_number`,``)}},y=class{constructor(){v(this,`id`,0),v(this,`ref_id`,``),v(this,`image_url`,``),v(this,`stripe_token`,``),v(this,`stripe_customer_id`,``),v(this,`username`,``),v(this,`normalized_username`,``),v(this,`company`,``),v(this,`ic`,``),v(this,`display_name`,``),v(this,`full_name`,``),v(this,`birth_date`,``),v(this,`gender`,``),v(this,`address`,``),v(this,`postcode`,``),v(this,`note`,``),v(this,`language`,``),v(this,`time_zone`,``),v(this,`created_at`,new Date),v(this,`updated_at`,new Date),v(this,`license_ids`,``),v(this,`security_stamp`,``),v(this,`phone_number`,``)}},b=class extends y{constructor(){super(),v(this,`license_id`,0),v(this,`credit`,0),v(this,`point`,0),v(this,`transaction_total`,0),v(this,`transaction_time`,0),v(this,`user_group_id`,0),v(this,`user_group_name`,``),v(this,`group_expires_at`,null),v(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(){v(this,`applying_type`,ne.Inclusive),v(this,`applying_items`,[])}},ae=class{constructor(e){v(this,`guid`,``),v(this,`promo_code`,``),v(this,`is_multi_stores`,!1),v(this,`name`,``),v(this,`alias`,void 0),v(this,`description`,void 0),v(this,`description_alias`,void 0),v(this,`applying_plus`,void 0),v(this,`applying_user_tags`,void 0),v(this,`applying_user_groups`,void 0),v(this,`discount_calc_type`,re.Flat),v(this,`discount_amount`,void 0),v(this,`discount_percent`,void 0),v(this,`duration`,30),v(this,`usage_count`,0),v(this,`usage_limit_per_invoice`,1),v(this,`above_invoice_amount`,void 0),v(this,`below_invoice_amount`,void 0),v(this,`is_delivery_free`,!1),v(this,`is_individual_use`,!0),v(this,`price_in_points`,void 0),v(this,`styles`,{}),v(this,`expired_at`,void 0),v(this,`auto_gen`,!1),v(this,`can_sell`,!0),v(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){v(this,`invoice_uid`,``),e&&(this.invoice_uid=e.invoice_uid)}},se=class{constructor(e){v(this,`guid`,``),v(this,`coupon`,new ae),v(this,`is_multi_stores`,!1),v(this,`usage`,new oe),v(this,`employee_uid`,``),v(this,`promo_code`,``),v(this,`is_expired`,!1),v(this,`is_redeemed`,!1),v(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(){v(this,`uid`,void 0),v(this,`updated_at`,new Date),v(this,`created_at`,new Date),v(this,`created_at_timestamp`,new Date().getTime()),v(this,`deleted_at`,null),v(this,`_timestamp`,void 0),v(this,`id_in_server`,void 0)}},S=class extends x{constructor(){super(),v(this,`name`,void 0),v(this,`name_translations`,{})}},le=class extends S{constructor(...e){super(...e),v(this,`description`,void 0),v(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(){v(this,`mode`,void 0),v(this,`base_url`,void 0),v(this,`device_uid`,void 0),v(this,`merchant_uid`,void 0),v(this,`token`,void 0),v(this,`database`,void 0)}};let pe=function(e){return e.Data=`DataMessage`,e.Event=`EventMessage`,e}({});var me=class{constructor(){v(this,`model`,``),v(this,`data`,``),v(this,`has_many`,!1),v(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(),v(this,`user_uid`,``),v(this,`started_at`,new Date),v(this,`ended_at`,new Date),v(this,`declared_amount`,0),v(this,`drawer_amount`,0),v(this,`first_invoice_number`,0),v(this,`status`,E.Open),v(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 ge=class extends x{constructor(){super(),v(this,`user_uid`,``),v(this,`shift_uid`,``),v(this,`invoice_uid`,``),v(this,`type`,D.CashDeposit),v(this,`amount`,0),v(this,`note`,``),v(this,`uid`,C.Till+t())}};let O=function(e){return e.CLOSED=`closed`,e.OPENED=`opened`,e.PAYMENT=`payment`,e}({});var _e=class extends S{constructor(){super(),v(this,`printer_id_order_list`,[]),v(this,`order_printer_uids`,[]),v(this,`receipt_printer_uid`,``),v(this,`check_printer_uid`,``),v(this,`qr_printer_uid`,``),v(this,`total`,0),v(this,`time`,0),v(this,`pax`,0),v(this,`invoice_created_at`,new Date),v(this,`child_pax`,0),v(this,`baby_pax`,0),v(this,`uid`,C.SectionItem+t()),v(this,`invoice_uid`,``),v(this,`section_uid`,``),v(this,`status`,O.CLOSED),v(this,`size_x`,0),v(this,`size_y`,0),v(this,`row`,0),v(this,`col`,0),v(this,`is_take_out`,!1),v(this,`soup_base_quota`,0),v(this,`soup_base_type`,0),v(this,`is_delete`,!1),v(this,`meta`,{}),v(this,`customer`,{})}},ve=class extends S{constructor(){super(),v(this,`sequence`,0),v(this,`uid`,C.Section+t())}},ye=class extends S{constructor(){super(),v(this,`permissions`,[]),v(this,`is_default`,!1),v(this,`uid`,C.EmployeeRole+t())}},be=class{constructor(e){v(this,`item_uid`,``),v(this,`quantity`,0),v(this,`modifiers`,[]),this.item_uid=e,this.quantity=0,this.modifiers=[]}},k=class extends le{constructor(){super(),v(this,`meta`,{}),v(this,`etc`,{}),v(this,`assets`,{}),v(this,`config`,{online_order_display_large_image:!1}),v(this,`is_internal`,!1),v(this,`color`,``),v(this,`icon`,``),v(this,`sequence`,0)}},xe=class{constructor(){v(this,`system`,Se.POS),v(this,`visible`,!1),v(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 k{constructor(){super(),v(this,`type`,Ce.Modifier),v(this,`visibility`,[]),v(this,`uid`,C.ItemModifierCategory+t()),v(this,`max_order`,0),v(this,`min_order`,0),v(this,`is_delisted`,!1)}},Te=class extends k{constructor(){super(),v(this,`image_url`,``),v(this,`image_file_path`,``),v(this,`image_thumbnail_url`,``),v(this,`image_thumbnail_file_path`,``),v(this,`has_subcategory`,!1),v(this,`name_translations`,{}),v(this,`visibility`,void 0),v(this,`printing_sequence`,0),v(this,`type`,Ce.Product),v(this,`is_delisted`,!1),v(this,`subcategories`,[]),v(this,`uid`,C.Category+t()),v(this,`max_order`,0),v(this,`min_order`,0)}},Ee=class extends k{constructor(){super(),v(this,`category_uid`,``),v(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 k{constructor(){super(),v(this,`image_url`,``),v(this,`image_file_path`,``),v(this,`image_thumbnail_url`,``),v(this,`image_thumbnail_file_path`,``),v(this,`visibility`,[]),v(this,`sku`,``),v(this,`type`,A.Modifier),v(this,`barcode`,``),v(this,`category_uid`,``),v(this,`price`,0),v(this,`original_price`,0),v(this,`prices`,[]),v(this,`stock`,1e3),v(this,`print_on_receipt`,!0),v(this,`price_adjustable`,!1),v(this,`is_sold_out`,!1),v(this,`recipe`,``),v(this,`is_remark_disabled`,!1),v(this,`uid`,C.ItemModifier+t())}},j=class extends De{constructor(){super(),v(this,`codename`,``),v(this,`sku`,``),v(this,`recipe`,``),v(this,`barcode`,``),v(this,`type`,A.ByQuantity),v(this,`add_credit`,0),v(this,`category_uid`,``),v(this,`subcategory_uid`,``),v(this,`unit`,0),v(this,`stock`,0),v(this,`is_sold_out`,!1),v(this,`sold`,0),v(this,`print_on_receipt`,!0),v(this,`price`,0),v(this,`open_editor`,!0),v(this,`price_adjustable`,!1),v(this,`minus_point`,0),v(this,`cost`,0),v(this,`discountable`,!0),v(this,`printing_sequence`,0),v(this,`recommended`,!1),v(this,`likes`,0),v(this,`dislikes`,0),v(this,`is_tax_exempt`,!1),v(this,`is_service_charge_exempt`,!1),v(this,`is_point_reward_exempt`,!1),v(this,`is_credit_reward_exempt`,!1),v(this,`is_internal`,!1),v(this,`is_delisted`,!1),v(this,`uid`,C.Item+t()),v(this,`modifiers`,void 0),v(this,`modifier_categories`,void 0),v(this,`kitchen_printers_uids`,[]),v(this,`order_printers_uids`,[]),v(this,`label_printers_uids`,[]),v(this,`open_editor_panel`,!1),v(this,`open_price_editor`,!1),v(this,`combo_groups`,[])}},Oe=class extends x{constructor(){super(),v(this,`lookup_keys`,[]),v(this,`product_uid`,``),v(this,`uid`,C.Price+t()),v(this,`amount`,0),v(this,`name`,``),v(this,`name_translations`,{})}},ke=class{constructor(){v(this,`item_uid`,``),v(this,`combo_item`,new j),v(this,`price`,0),v(this,`sequence`,0),v(this,`meta`,{})}},Ae=class{constructor(){v(this,`uid`,C.ComboGroup+t()),v(this,`name`,``),v(this,`name_translations`,{}),v(this,`min_order`,1),v(this,`max_order`,1),v(this,`combo_items`,[]),v(this,`sequence`,0),v(this,`meta`,{})}},M=class e{constructor(){v(this,`_state`,e.State.CLOSED),v(this,`cleanup`,void 0),v(this,`onData`,null),v(this,`onClose`,null),v(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}`)}}};v(M,`State`,{CLOSED:0,OPENING:1,OPENED:2,CLOSING:3}),v(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(){v(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 P.Text:if(t.item?.text){if(t.item.size===Re.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===Re.Custom&&r.raw([29,33,0])}break;case P.Table:if(t.table){if(t.table.size===Re.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===Re.Custom&&r.raw([29,33,0])}break;case P.Line:r.line(t.item?.text?.repeat(48)??`-`.repeat(48),t.item?.line_width??48);break;case P.NewLine:t.repeat=t.repeat??1;for(let e=0;e<t.repeat;e++)r.newline();break;case P.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 P.QRCode:t.qrcode&&r.qrcode(t.qrcode.data,t.qrcode.model,t.qrcode.size,t.qrcode.errorlevel);break;case P.Barcode:t.barcode&&r.barcode(t.barcode.data,t.barcode.symbology,t.barcode.height);break;case P.Cut:r.cut(t.item?.text??`full`);break;case P.Beeper:r.beeper();break;case P.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(){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}({}),Re=function(e){return e.Custom=`custom`,e.Normal=`normal`,e.Small=`small`,e}({}),P=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 ze=class{constructor(){v(this,`data`,``),v(this,`symbology`,`ean13`),v(this,`height`,0)}},Be=class{constructor(){v(this,`data`,``),v(this,`model`,2),v(this,`size`,6),v(this,`errorlevel`,`m`)}},Ve=class{constructor(){v(this,`base64_data`,``),v(this,`width`,0),v(this,`height`,0),v(this,`algorithm`,`threshold`),v(this,`threshold`,128)}};let He=function(e){return e[e.SunmiPrinter=0]=`SunmiPrinter`,e}({});var F=class{constructor(){v(this,`codepage`,N.WesternEuropeanLatin),v(this,`items`,[])}};function I(t,n){return e(t).format(n||`YYYY-MMM-DD HH:mm:ss`)}function Ue(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 We=class extends S{constructor(){super(),v(this,`machine_name`,``),v(this,`connection_id`,``),v(this,`type`,Ke.Client),v(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:``})}},Ge=class extends S{constructor(){super(),v(this,`type`,Ke.Node),v(this,`machine_name`,``),v(this,`connection_id`,``),v(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 Ke=function(e){return e.Client=`client`,e.Node=`node`,e}({}),L=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 qe=class{constructor(){v(this,`printer_name`,``),v(this,`status`,``),v(this,`port_name`,``),v(this,`error`,``)}};let Je=function(e){return e.ESCPOS=`ESC/POS`,e.TSPL=`TSPL`,e}({}),Ye=function(e){return e.USB=`USB`,e.WINDOWS_DRIVER=`WINDOWS_DRIVER`,e.ETHERNET=`ETHERNET`,e.BLUETOOTH=`BLUETOOTH`,e.BUILTIN=`BUILTIN`,e}({});var Xe=class{constructor(){v(this,`header`,``),v(this,`body`,``),v(this,`footer`,``),v(this,`commands`,``),v(this,`type`,L.ReceiptPrinter)}},R=class extends S{constructor(){super(),v(this,`header`,``),v(this,`body`,``),v(this,`footer`,``),v(this,`commands`,``),v(this,`printer_type`,L.ReceiptPrinter),v(this,`codepage`,void 0),v(this,`uid`,C.PrintTemplate+t()),v(this,`report_code_name`,``)}};let Ze=function(e){return e.Queued=`queued`,e.Printed=`printed`,e.Failed=`failed`,e.Expired=`expired`,e}({});var z=class extends S{constructor(e,n,r=!1,i=1){super(),v(this,`printer_name`,``),v(this,`driver_printer_name`,``),v(this,`printer_ip`,``),v(this,`printer_uid`,``),v(this,`printer_type`,L.ReceiptPrinter),v(this,`protocol`,Je.ESCPOS),v(this,`connection_type`,Ye.ETHERNET),v(this,`data`,new F),v(this,`status`,Ze.Queued),v(this,`retries`,0),v(this,`commands`,``),v(this,`uid`,C.PrintJob+t()),v(this,`save_only`,!1),v(this,`print_times`,1),v(this,`printed`,0),v(this,`device_uid_to_print`,``),v(this,`designated_table_section_uids`,[]),v(this,`job_id`,0),v(this,`print_sequence`,void 0),v(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 Qe=function(e){return e.Online=`online`,e.Offline=`offline`,e}({});var $e=class extends S{constructor(){super(),v(this,`device_uid`,``),v(this,`type`,L.ReceiptPrinter),v(this,`is_not_default`,!1),v(this,`driver_printer_name`,``),v(this,`fallback_printer_uid`,0),v(this,`protocol`,Je.ESCPOS),v(this,`connection_type`,Ye.ETHERNET),v(this,`print_template_uid`,``),v(this,`uid`,C.Printer+t()),v(this,`ip_address`,``),v(this,`status`,Qe.Online),v(this,`kitchen_itemized_print`,!1),v(this,`print_times`,1),v(this,`retries`,1)}},et=class{constructor(){v(this,`config`,{}),v(this,`invoice`,{}),v(this,`report_data`,{}),v(this,`section_item`,{}),v(this,`printer_name`,``),v(this,`printed_at`,new Date),v(this,`normalized_printed_at`,``),v(this,`meta`,{}),v(this,`is_cancel`,!1),this.normalized_printed_at=I(this.printed_at)}},B=class{constructor(){v(this,`printer_name`,``),v(this,`kitchen_itemized_print`,!1),v(this,`is_cancel`,!1)}},tt=class extends x{constructor(){super(),v(this,`invoice_uid`,``),v(this,`tender_amount`,0),v(this,`change_amount`,0),v(this,`payment_method_uid`,``),v(this,`payment_method_code`,``),v(this,`payment_method_name`,``),v(this,`payment_method`,new nt),v(this,`payment_method_history`,void 0),v(this,`uid`,C.Payment+t()),v(this,`updated_at`,new Date)}},nt=class extends S{constructor(){super(),v(this,`sequence`,0),v(this,`payment_currency_id`,0),v(this,`currency_code`,``),v(this,`currency_symbol`,`$`),v(this,`payment_method_code`,``),v(this,`name`,``),v(this,`codename`,``),v(this,`name_abbrev`,``),v(this,`enable_drawer`,!1),v(this,`enable_receipt`,!1),v(this,`image_url`,``),v(this,`custom_image_url`,``),v(this,`is_cash`,!1),v(this,`is_integrated`,!1),v(this,`is_disabled`,!0),v(this,`type`,0),v(this,`api_id`,``),v(this,`api_key`,``),v(this,`is_sales_exclusive`,!1),v(this,`enable_credit_validation`,!1),v(this,`enable_customer_validation`,!1),v(this,`is_cancellable`,!1),v(this,`uid`,C.PaymentMethod+t())}},rt=class extends nt{constructor(){super(),v(this,`changed_at`,new Date),v(this,`changed_by`,``)}},it=class{toPaymentMethod(){let e=new nt;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){v(this,`access_token`,null),v(this,`image_base64`,null),v(this,`error`,null),v(this,`currency_code`,null),v(this,`payment_method_code`,``),v(this,`codename`,null),v(this,`name_abbrev`,null),v(this,`name`,``),v(this,`enable_drawer`,!1),v(this,`enable_receipt`,!0),v(this,`image_url`,``),v(this,`is_cash`,!1),v(this,`is_integrated`,!1),v(this,`is_disabled`,!1),v(this,`type`,0),v(this,`api_id`,null),v(this,`api_key`,null),v(this,`timestamp_create`,Date.now()),v(this,`timestamp_update`,Date.now()),e&&Object.assign(this,e)}};let at=function(e){return e.STARTED=`payment_started`,e.COMPLETED=`payment_completed`,e.FAILED=`payment_failed`,e.CANCELLED=`payment_cancelled`,e}({});var ot=class extends S{constructor(){super()}},st=class extends ot{constructor(){super()}},ct=class extends S{constructor(){super(),v(this,`note_group_uid`,``),v(this,`related_model`,ue.Invoice),v(this,`usage`,0)}},lt=class extends ct{constructor(){super()}};let V=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(){v(this,`uid`,C.InvoiceCharge+t()),v(this,`name`,``),v(this,`percentage`,0),v(this,`amount`,0),v(this,`calc_flow`,W.AfterSubtotal)}},gt=class{constructor(){v(this,`action`,ft.Create),v(this,`action_by`,``),v(this,`device_uid`,``),v(this,`action_at`,new Date)}},_t=class{constructor(){v(this,`uid`,C.Charge+t()),v(this,`name`,``),v(this,`percent`,0),v(this,`calc_flow`,W.AfterSubtotal),v(this,`trigger_condition`,``)}},vt=class{constructor(){v(this,`calc_type`,U.Flat),v(this,`amount`,0),v(this,`percent`,0),v(this,`percent_amount`,0),v(this,`type`,mt.Custom),v(this,`calc_flow`,W.AfterSubtotal),v(this,`applying_item_uids`,[]),v(this,`name`,``),v(this,`name_translation`,{}),v(this,`voucher_uid`,``),v(this,`coupon_uid`,``),v(this,`uid`,C.InvoiceDiscount+t())}},yt=class{constructor(){v(this,`item_uid`,``),v(this,`item`,new De),v(this,`price`,0),v(this,`unit_of_measure`,pt.quantity),v(this,`quantity`,0),v(this,`sent`,0),v(this,`is_cancel_printed`,!1),v(this,`selected`,!1),v(this,`sales_user_uid`,``)}},bt=class extends x{constructor(){super(),v(this,`item_uid`,``),v(this,`price`,0),v(this,`unit_of_measure`,pt.quantity),v(this,`quantity`,0),v(this,`remark`,``),v(this,`invoice_uid`,``),v(this,`discount_calc_type`,U.Flat),v(this,`discount_amount`,0),v(this,`discount_percent`,0),v(this,`subtotal`,0),v(this,`subtotal_before_discount`,0),v(this,`item`,new j),v(this,`point`,0),v(this,`point_subtotal`,0),v(this,`up_size`,!1),v(this,`is_take_out`,!1),v(this,`is_duplicate`,!1),v(this,`is_combo`,!1),v(this,`is_combo_item`,!1),v(this,`combo_group_uid`,``),v(this,`combo_line_uid`,``),v(this,`modifiers`,[]),v(this,`duplicated_from_uid`,``),v(this,`sent`,0),v(this,`is_cancel_printed`,!1),v(this,`selected`,!1),v(this,`sales_user_uid`,``),v(this,`meta`,{})}},xt=class extends x{constructor(){super(),v(this,`ref_id`,``),v(this,`call_num`,``),v(this,`table_uid`,``),v(this,`table_name`,``),v(this,`type`,V.DineIn),v(this,`pax`,0),v(this,`adult_pax`,0),v(this,`child_pax`,0),v(this,`baby_pax`,0),v(this,`subtotal`,0),v(this,`point_subtotal`,0),v(this,`service_chargeable_subtotal`,0),v(this,`discountable_subtotal`,0),v(this,`service_charge`,0),v(this,`delivery_id`,0),v(this,`delivery_charge`,0),v(this,`delivery_type`,``),v(this,`delivery_by`,``),v(this,`use_customer_point`,!1),v(this,`add_point`,0),v(this,`minus_point`,0),v(this,`rewarded_point_rate`,0),v(this,`rewarded_point`,0),v(this,`use_customer_balance`,!1),v(this,`add_credit`,0),v(this,`minus_credit`,0),v(this,`rewarded_credit_rate`,0),v(this,`rewarded_credit`,0),v(this,`discounts`,[]),v(this,`discount_amount`,0),v(this,`tax`,0),v(this,`rounding`,0),v(this,`tip`,0),v(this,`grand_total`,0),v(this,`customer_id`,0),v(this,`remark`,``),v(this,`sales_user_uid`,``),v(this,`status`,H.Open),v(this,`paid_at`,new Date(0)),v(this,`voided_at`,new Date(0)),v(this,`humanized_paid_at`,``),v(this,`humanized_voided_at`,``),v(this,`humanized_created_at`,``),v(this,`order_id`,0),v(this,`to_address`,new te),v(this,`payment_source_method`,``),v(this,`payment_source_last4`,``),v(this,`payment_source_charge_ref`,``),v(this,`is_sales_exclusive`,!1),v(this,`etc`,{}),v(this,`action`,void 0),v(this,`lines`,[]),v(this,`deleted_lines`,[]),v(this,`payment_has_cash`,!1),v(this,`payments`,[]),v(this,`table_switch_id`,0),v(this,`employee_uid`,``),v(this,`employee_name`,``),v(this,`receipt_print_override`,!1),v(this,`customer`,new b),v(this,`is_duplicate`,!1),v(this,`kitchen_print_override`,!1),v(this,`otp`,``),v(this,`activities`,[]),v(this,`receipt_print_job_uid`,``),v(this,`kitchen_print_job_uids`,[]),v(this,`label_print_job_uids`,[]),v(this,`charges`,[]),v(this,`is_charge_triggered`,!1),v(this,`uid`,C.Invoice+t()),v(this,`meta`,{}),v(this,`price_lookup_key`,``)}},St=class extends x{constructor(){super(),v(this,`user_uid`,void 0),v(this,`name`,void 0),v(this,`email`,void 0),v(this,`password`,void 0),v(this,`uid`,C.Employee+t()),v(this,`role_uid`,``),v(this,`language`,`en`),v(this,`can_login`,!0)}},Ct=class extends x{constructor(){super(),v(this,`config`,new jt),v(this,`cache`,new wt),v(this,`storage`,{pricing_lookup_keys:[],pay_in_reasons:[],pay_out_reasons:[]})}},wt=class{constructor(){v(this,`printers`,[])}},Tt=class{constructor(){}},Et=class{constructor(){v(this,`enable_price_tiers`,!1),v(this,`rewarded_credit_rate`,0),v(this,`rewarded_point_rate`,0),v(this,`inclusive_service_charge`,!1),v(this,`inclusive_tax`,!1),v(this,`default_country_code`,`+65`)}},Dt=class{constructor(){v(this,`enabled`,!1),v(this,`full_screen_assets`,[]),v(this,`half_screen_assets`,[]),v(this,`is_logo_hidden`,!1),v(this,`order_list_font_size`,`1.875rem`),v(this,`order_modifier_font_size`,`1.25rem`)}};let Ot=function(e){return e.SmoochPay=`SPCD`,e.YeahPay=`YEAP`,e}({});var kt=class{constructor(){v(this,`takeaway_only`,!1),v(this,`guest_order_only`,!1),v(this,`disable_paynow_payment`,!1),v(this,`disable_card_payment`,!1),v(this,`landing_image`,``),v(this,`menu_banner_image`,``),v(this,`home_page_images`,[]),v(this,`paynow_method`,Mt.WyoPaynow),v(this,`card_payment_code`,Ot.SmoochPay)}},At=class{constructor(){v(this,`point`,{sms_notification:!1,above_invoice_amount:0,conversion_rate:0,inclusive_service_charge:!1,inclusive_tax:!1}),v(this,`credit`,{sms_notification:!1,above_invoice_amount:0,conversion_rate:0,inclusive_service_charge:!1,inclusive_tax:!1})}},jt=class{constructor(){v(this,`general`,new Ft),v(this,`till`,new It),v(this,`report`,new Lt),v(this,`receipt`,new Rt),v(this,`kitchen`,new zt),v(this,`kds`,new Bt),v(this,`label`,new Vt),v(this,`order`,new Ht),v(this,`ods`,new Ut),v(this,`payment`,new Wt),v(this,`user`,new Gt),v(this,`tax`,new Kt),v(this,`rounding`,new Yt),v(this,`inventory`,new Xt),v(this,`pax_config`,new Zt),v(this,`gto`,new Qt),v(this,`cash_drawer`,new $t),v(this,`marketing`,new At),v(this,`charges`,new qt),v(this,`currency`,new Jt),v(this,`cds`,new Dt),v(this,`kiosk`,new kt),v(this,`online_order`,new Nt),v(this,`loyalty_program`,new Et),v(this,`crm`,new Tt)}};let Mt=function(e){return e.FomoOnlinePaynow=`PNWO`,e.WyoPaynow=`WPPN`,e}({});var Nt=class{constructor(){v(this,`enable_membership`,!1),v(this,`login_call_to_action_text`,``),v(this,`menu_banner_image_url`,``),v(this,`paynow_method`,void 0),v(this,`disable_pay_at_counter`,!1),v(this,`disable_paynow_payment`,!1),v(this,`default_language`,`en`),v(this,`category_selector_mode`,`photo_mode`),v(this,`dynamic_order_qr`,{default_order_flow:ut.OrderFirstAndPayLater,select_order_flow:!1,select_menus:!1}),v(this,`max_dining_time`,0),v(this,`disable_logo_for_item_photo_fallback`,!1),v(this,`whatsapp_login_only`,!1),v(this,`enable_whatsapp_login`,!1)}};let Pt=function(e){return e.PROD=`prod`,e.DEV=`dev`,e}({});var Ft=class{constructor(){v(this,`company_name`,``),v(this,`company_name_alias`,``),v(this,`company_logo`,``),v(this,`company_tax_reg_no`,``),v(this,`company_postcode`,``),v(this,`company_address`,``),v(this,`company_country`,``),v(this,`company_tel`,``),v(this,`floor_plan_table_name`,`table`),v(this,`deploy_channel`,Pt.PROD),v(this,`language`,`en`),v(this,`debug`,!1),v(this,`logging`,!1),v(this,`offline_mode`,!1),v(this,`opening_schedules`,[{opening_hours:{open:`10:00`,close:`22:00`}}])}},It=class{constructor(){v(this,`control`,!0),v(this,`slip`,!0)}},Lt=class{constructor(){v(this,`itemized_consolidated`,!0),v(this,`itemized_separated`,``),v(this,`shift_itemized`,!0),v(this,`start_time`,`09:00:01`),v(this,`end_time`,`23:59:59`),v(this,`shift_print_time`,1),v(this,`shift_disable`,!1),v(this,`email`,!1)}},Rt=class{constructor(){v(this,`enabled`,!0),v(this,`show_print_dialog`,!1),v(this,`print_docket`,!1),v(this,`hide_non_price_item`,!1),v(this,`receipt_no_reset_daily`,!1),v(this,`language`,`en`),v(this,`disable_persistent_tcp`,!1)}},zt=class{constructor(){v(this,`enabled`,!0),v(this,`print_item_price`,!1),v(this,`print_cancel_slip`,!1),v(this,`print_cancel_whole_invoice`,!1),v(this,`language`,`en`)}},Bt=class{constructor(){v(this,`enabled`,!0),v(this,`display_order_after_payment`,!1),v(this,`print_slip_upon_completed`,!1)}},Vt=class{constructor(){v(this,`print`,!1),v(this,`text_to_raster`,!1)}},Ht=class{constructor(){v(this,`separation_line`,!1),v(this,`slip`,!0),v(this,`slip_font_size_ratio`,1),v(this,`max_dinning`,0),v(this,`exit_menu_after_payment`,!1),v(this,`hide_combo_item_on_receipt`,!1),v(this,`hide_combo_item_on_interactive_view`,!1),v(this,`hide_categories_when_ordering`,!1),v(this,`end_shift_with_open_tables`,!1),v(this,`datetime_format`,`YYYY-MMM-DD HH:mm:ss`),v(this,`ref_prefix`,`01`)}},Ut=class{constructor(){v(this,`enabled`,!1),v(this,`language`,`en`)}},Wt=class{constructor(){v(this,`quick_cash_payment`,!1),v(this,`notification`,!0),v(this,`quick`,!1)}},Gt=class{constructor(){v(this,`control`,!0)}},Kt=class{constructor(){v(this,`enabled`,!0),v(this,`method`,dt.Inclusive),v(this,`rate`,7),v(this,`name`,`GST`)}},qt=class{constructor(){v(this,`service_charge`,!1),v(this,`service_charge_rate`,10)}},Jt=class{constructor(){v(this,`currency_symbol`,`$`),v(this,`is_symbol_after_amount`,!1)}},Yt=class{constructor(){v(this,`base`,.1),v(this,`up`,!0),v(this,`cashless`,!1),v(this,`prepayment_rounding`,!1)}},Xt=class{constructor(){v(this,`inventory_control`,!1),v(this,`sold_out_for_today_only`,!1)}},Zt=class{constructor(){v(this,`pax`,!0),v(this,`detail`,!1)}},Qt=class{constructor(){v(this,`interface`,``),v(this,`genesis_date`,``),v(this,`upload_time`,``),v(this,`ftp_svr`,``),v(this,`ftp_usr`,``),v(this,`ftp_port`,``),v(this,`ftp_path`,``),v(this,`ftp_pwd`,``),v(this,`mall_id`,``),v(this,`machine_id`,``),v(this,`ftp_type`,`ftp`)}},$t=class{constructor(){v(this,`kick_code`,`27, 112, 48, 55, 121`),v(this,`connection_mode`,`via_receipt_printer`)}},en=class{constructor(e){v(this,`name`,``),v(this,`base64`,``),v(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(){v(this,`db`,void 0),v(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.`)}},G=class extends ln{constructor(...e){super(...e),v(this,`http`,void 0),v(this,`methodName`,void 0),v(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(){v(this,`uid`,C.ReportCategory+ +t()),v(this,`name`,``),v(this,`name_translations`,{}),v(this,`reports`,[]),v(this,`created_at`,new Date),v(this,`created_at_timestamp`,new Date().getTime()),v(this,`updated_at`,new Date),v(this,`deleted_at`,null)}},pn=class{constructor(){v(this,`uid`,C.Report+t()),v(this,`name`,``),v(this,`name_translations`,{}),v(this,`type`,void 0),v(this,`codename`,``),v(this,`created_at`,new Date),v(this,`created_at_timestamp`,new Date().getTime()),v(this,`updated_at`,new Date),v(this,`deleted_at`,null)}},mn=class extends x{constructor(){super(),v(this,`uid`,C.AppReport+t()),v(this,`reports`,[]),v(this,`version`,1)}},hn=class{constructor(){v(this,`start_datetime`,``),v(this,`humanized_start_datetime`,``),v(this,`end_datetime`,``),v(this,`humanized_end_datetime`,``),v(this,`humanized_printed_datetime`,``),v(this,`sales_summary`,new gn),v(this,`drawer_summary`,new _n),v(this,`payments_summary`,[]),v(this,`loyalty_program_summary`,new yn),v(this,`item_sales_summary`,[]),v(this,`item_sales_summary_total`,0),v(this,`item_sales_summary_total_count`,0),v(this,`item_sales_summary_by_category`,[]),v(this,`modifier_sales_summary`,[]),v(this,`modifier_sales_summary_total`,0),v(this,`modifier_sales_summary_total_count`,0),v(this,`config`,{})}},gn=class{constructor(){v(this,`sales_total`,0),v(this,`foc_sales_total`,0),v(this,`foc_sales_count`,0),v(this,`rounding_total`,0),v(this,`tax_total`,0),v(this,`service_charge_total`,0),v(this,`discount_total`,0),v(this,`voucher_total`,0),v(this,`voucher_count`,0),v(this,`coupon_total`,0),v(this,`coupon_count`,0),v(this,`paid_invoice_count`,0),v(this,`paid_invoice_total`,0),v(this,`void_invoice_count`,0),v(this,`void_invoice_total`,0),v(this,`total_pax`,0),v(this,`pax_sales_total`,0)}},_n=class{constructor(){v(this,`open_amount`,0),v(this,`declared_amount`,0),v(this,`drawer_amount`,0),v(this,`difference`,0),v(this,`pay_in_total`,0),v(this,`pay_in_count`,0),v(this,`cash_invoice_total`,0),v(this,`cash_invoice_count`,0),v(this,`pay_out_total`,0),v(this,`pay_out_count`,0)}},vn=class{constructor(){v(this,`code`,``),v(this,`name`,``),v(this,`total`,0),v(this,`count`,0)}},yn=class{constructor(){v(this,`add_credit_total`,0),v(this,`add_credit_count`,0),v(this,`topup_paid_total`,0),v(this,`topup_paid_count`,0),v(this,`rewarded_credit_total`,0),v(this,`rewarded_credit_count`,0),v(this,`minus_credit_total`,0),v(this,`minus_credit_count`,0),v(this,`rewarded_point_total`,0),v(this,`rewarded_point_count`,0),v(this,`minus_point_total`,0),v(this,`minus_point_count`,0)}},bn=class{constructor(){v(this,`item`,{}),v(this,`quantity`,0),v(this,`total_amount`,0),v(this,`modifiers`,[])}},xn=class{constructor(){v(this,`item`,{}),v(this,`quantity`,0),v(this,`total_amount`,0)}},Sn=class{constructor(){v(this,`category`,null),v(this,`items`,[]),v(this,`total_quantity`,0),v(this,`total_amount`,0)}},Cn=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,v(this,`configService`,void 0),v(this,`printJobService`,void 0),v(this,`printersFromCache`,void 0),this.configService=new Lr(e,t,n,`configs`,`config`),this.printJobService=new X(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(L.ReceiptPrinter)}async getDefaultPrinterByType(e){return this.getDefaultPrinter(e)}async getDefaultKioskPrinter(){return this.getDefaultPrinter(L.KioskPrinter)}async getDefaultCheckPrinter(){return this.getDefaultPrinter(L.CheckPrinter)}async getDefaultKitchenPrinter(){return this.getDefaultPrinter(L.KitchenPrinter)}async getDefaultOrderPrinter(){return this.getDefaultPrinter(L.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 F;t.items.push({type:P.OpenCashDrawer});let n=new z(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 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 q=(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`?q(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`?q(e,e=>`-`+e):``,jn=e=>typeof e==`string`?q(e,e=>`.`+e):``,Mn=e=>Nn(e),Nn=e=>typeof e==`string`?e.toLowerCase():``,Pn=e=>{if(typeof e!=`string`)return``;let t=q(e,e=>e.toUpperCase());return t.charAt(0).toUpperCase()+t.slice(1)},Fn=e=>typeof e==`string`?q(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`?q(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`,J=(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 J(e.every(e=>!!e),this,t)},sr=function(...e){let t=e.pop();return J(e.some(e=>!!e),this,t)},cr=function(e,t){return J(!e,this,t)},lr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),J(e===t,this,n)},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,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)},vr=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)},yr=vr,br=function(e,...t){let n=t.pop();return J(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 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 wr(e){let t=e?.handlebars||e?.hbs||ee(`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 x{constructor(){super(),v(this,`uid`,C.OrderDisplaySystem+t()),v(this,`order_number`,``),v(this,`status`,Y.Preparing)}};let Y=function(e){return e.Preparing=`preparing`,e.ReadyForPickup=`ready_for_pickup`,e}({});var Dr=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}};Tr({handlebars:f});const Or={quantity:1,price:0,remark:``};var kr=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,v(this,`tillService`,void 0),v(this,`sectionItemService`,void 0),v(this,`configService`,void 0),v(this,`printTemplateService`,void 0),v(this,`printerService`,void 0),v(this,`printJobService`,void 0),v(this,`itemService`,void 0),v(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 Jr(e,t,n,`print_templates`,`print_template`),this.printerService=new Cn(e,t,n,`printers`,`printer`),this.printJobService=new X(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,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),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===V.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==V.Delivery||e.type==V.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}}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)}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.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)}}},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==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);return r.is_duplicate=!0,r.duplicated_from_uid=n.uid,r.uid=C.InvoiceLine+t(),e.lines.push(r),e}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,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}addLineQuantity(e,t,n){if(e.lines==null||e.lines.length<=0)return e;t.quantity+=n}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.filter(e=>e.is_combo_item))if(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(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}},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==T.outdatedInvoice)throw 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=O.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=I(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 this.saveOne(e.data),f.invoice=e.data,new w(e.error);if(e.error==T.outdatedSectionItem)throw 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 this.saveOne(e.data),new w(`${e.error}, system has updated the data, please try again`);if(e.error==T.outdatedSectionItem)throw 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=O.CLOSED,this.sectionItemService.reset(t),this.addEmployeeToInvoice(e,n);let r=await this.createReceiptPrintJob(e,L.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 this.saveOne(a.data),i.invoice=a.data,new w(a.error);if(a.error==T.outdatedSectionItem)throw this.sectionItemService.saveOne(a.data),i.section_item=a.data,new w(a.error);return i}async checkInvoice(e,t,n){t.status=O.PAYMENT,this.addEmployeeToInvoice(e,n);let r=await this.createReceiptPrintJob(e,L.CheckPrinter),i=await this.createLabelPrintJobs(e),a=await this.createKitchenPrintJobs(e),o=await this.createOrderPrintJobs(e),s=[...i,...a,...o];r&&s.push(r);let c=this.sortPrintJobsByPrinterSequence(s);e.kitchen_print_job_uids||(e.kitchen_print_job_uids=[]),e.label_print_job_uids||(e.label_print_job_uids=[]);let l=e.kitchen_print_job_uids.length,u=e.label_print_job_uids.length,d=a.map(e=>e.uid),f=i.map(e=>e.uid);d.length>0&&e.kitchen_print_job_uids.push(d),f.length>0&&e.label_print_job_uids.push(f),await this.preprocessInvoice(e);let p={invoice:e,section_item:t};c.length>0&&(p.print_jobs=c);try{let e=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/check_invoice`,p);if(e.error==T.outdatedInvoice)throw this.saveOne(e.data),p.invoice=e.data,new w(e.error);if(e.error==T.outdatedSectionItem)throw this.sectionItemService.saveOne(e.data),p.section_item=e.data,new w(e.error);return p}catch(t){throw e.kitchen_print_job_uids.length=l,e.label_print_job_uids.length=u,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!=O.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=O.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 this.saveOne(a.data),i.invoice=a.data,new w(a.error);if(a.error==T.outdatedSourceSectionItem)throw this.sectionItemService.saveOne(a.data),i.source_section_item=a.data,new w(a.error);if(a.error==T.outdatedTargetSectionItem)throw this.sectionItemService.saveOne(a.data),i.target_section_item=a.data,new w(a.error);return i}async payInvoice(e,t,n,r){e.status=H.Paid,t.invoice_uid=``,t.status=O.CLOSED,this.sectionItemService.reset(t),this.addEmployeeToInvoice(e,r),e.paid_at=new Date;let i=(await this.configService.getDefaultOne()).config,a=i?.order?.datetime_format;e.humanized_paid_at=I(e.paid_at,a),e.payment_has_cash=e.payments?.some(e=>e.payment_method?.is_cash===!0);let o=await this.getStockChangeList(e,!1),s=await this.createLabelPrintJobs(e),c=await this.createReceiptPrintJob(e,L.ReceiptPrinter),l=await this.createKitchenPrintJobs(e),u=await this.createCancelKitchenPrintJobs(e,e.deleted_lines),d=await this.createOrderPrintJobs(e),f=[...s,...l,...u,...d];c&&f.push(c);let p=this.sortPrintJobsByPrinterSequence(f);e.kitchen_print_job_uids||(e.kitchen_print_job_uids=[]),e.label_print_job_uids||(e.label_print_job_uids=[]);let m=e.kitchen_print_job_uids.length,ee=e.label_print_job_uids.length,h=l.map(e=>e.uid),g=s.map(e=>e.uid);h.length>0&&e.kitchen_print_job_uids.push(h),g.length>0&&e.label_print_job_uids.push(g),await this.preprocessInvoice(e);let _={invoice:e,section_item:t,till:n};p.length>0&&(_.print_jobs=p);try{let t=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/pay_invoice`,_);if(t.error==T.outdatedInvoice)throw this.saveOne(t.data),_.invoice=t.data,new w(`${t.error}, system has updated the data and please try again`);if(t.error==T.outdatedSectionItem)throw this.sectionItemService.saveOne(t.data),_.section_item=t.data,new w(`${t.error}, system has updated the data and please try again`);if(o.length>0&&await this.itemService.changeItemsStock(o),e.call_num&&i?.ods?.enabled){let t=new Er;t.order_number=e.call_num,await this.orderDisplayService.addOne(t)}return _}catch(t){throw e.kitchen_print_job_uids.length=m,e.label_print_job_uids.length=ee,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=I(e.paid_at,s),e.created_at=new Date,e.created_at_timestamp=e.created_at.getTime(),e.humanized_created_at=I(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;r&&r.type==L.KioskPrinter?(l=await this.createReceiptPrintJob(e,L.ReceiptPrinter),u=await this.createReceiptPrintJob(e,L.KioskPrinter,!1,0,r,i)):l=await this.createReceiptPrintJob(e,L.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 ee=this.sortPrintJobsByPrinterSequence(m),h=f.map(e=>e.uid),g=d.map(e=>e.uid);h.length>0&&(e.kitchen_print_job_uids=[h]),g.length>0&&(e.label_print_job_uids=[g]),await this.preprocessInvoice(e);let _={invoice:e,till:t};ee.length>0&&(_.print_jobs=ee);let v=await this.http.put(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/direct_pay_invoice`,_);if(v.error==T.outdatedInvoice)throw this.saveOne(v.data),_.invoice=v.data,new w(v.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 _}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=I(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,L.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};if(l.length>0&&(u.print_jobs=l),e.table_uid){let t=await this.sectionItemService.getOne(e.table_uid);t.status!=O.CLOSED&&(t.invoice_uid=``,t.status=O.CLOSED,u.section_item=t)}let d=[];i==H.Paid&&(d=await this.getStockChangeList(e));let f=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/void_invoice`,u);if(f.error==T.outdatedInvoice)throw this.saveOne(f.data),u.invoice=f.data,new w(f.error);return d.length>0&&await this.itemService.changeItemsStock(d),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){if(!e?.receipt_print_job_uid)throw new w(`The invoice does not have a receipt`);let r=await this.printJobService.getOne(e.receipt_print_job_uid);if(!r){let t=new p().addParam(`uid`,`Like`,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`);r=n.results[0]}let i=await this.printerService.getOne(r.printer_uid);if(i||(i=await this.printerService.getDefaultReceiptPrinter()),!i)throw new w(`Receipt printer not found`);return r=this.printJobService.replacePrinter(r,i),r.uid=C.PrintJob+t(),r.save_only=n,r.status=Ze.Queued,r.print_times=1,r.printed=0,r.retries=0,await this.printJobService.addOne(r),r}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=Ze.Queued,r.print_times=1,r.printed=0,r.retries=0,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}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==L.ReceiptPrinter||t==L.CheckPrinter){let n=e.table_uid?await this.sectionItemService.getOne(e.table_uid):null,r=t==L.ReceiptPrinter?n?.receipt_printer_uid:n?.check_printer_uid;r&&(o=await this.printerService.getOne(r)),o||(o=t==L.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==L.ReceiptPrinter&&!s.config?.receipt?.enabled&&(n=!0);let l=await this.printTemplateService.renderPrintTemplate(e,s.config,c,{...new B,printer_name:o.name}),u=new z(o,l,n,r);return t!=L.ReceiptPrinter&&(u.printer_type=t),o.connection_type!=Ye.ETHERNET&&(u.connection_type=o.connection_type),t==L.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()}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,L.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.sortLinesByItemSequence(o),l=s.cloneDeep(e);if(t.kitchen_itemized_print)for(let e of c){l.lines=[e];let i=new z(t,await this.printTemplateService.renderPrintTemplate(l,n,a,{...new B,printer_name:t.name}),!1,t.print_times);r.push(i)}else{l.lines=c;let e=new z(t,await this.printTemplateService.renderPrintTemplate(l,n,a,{...new B,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,L.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.sortLinesByItemSequence(c),u=s.cloneDeep(e);u.lines=l;let d=new z(i,await this.printTemplateService.renderPrintTemplate(u,t,o,{...new B,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,L.LabelPrinter);if(i.length==0||r.length==0)return[];let a=await this.printerService.getPrintersByUids(i),o=s.cloneDeep(e),c=r.length,l=1;for(let e of r){if(e.meta.total_index=c,e.meta.index=l,e.modifiers?.length&&e.item.modifiers?.length){let t=new Map(e.item.modifiers.map(e=>[e.uid,e.sequence??0]));e.modifiers.sort((e,n)=>(t.get(e.item_uid)??0)-(t.get(n.item_uid)??0))}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 z(e,new F,!1,e.print_times);c.commands=s,n.push(c)}return n}filterLinesAndPrintersToPrint(e,t){let n;switch(t){case L.KitchenPrinter:n=`kitchen_printers_uids`;break;case L.OrderPrinter:n=`order_printers_uids`;break;case L.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==L.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.sortLinesByItemSequence(a),l=s.cloneDeep(e);if(t.kitchen_itemized_print)for(let e of c){l.lines=[e];let r=new z(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 z(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 be(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 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}},Pr=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`)}}},Fr=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 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 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}},Ir=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?this.updateOne(e.id_in_server,e):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?this.updateOne(e.id_in_server,e):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?this.updateOne(e.id_in_server,e):this.addOne(e),e}},Lr=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,v(this,`configFactories`,{general:()=>new Ft,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 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=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 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}},zr=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||``}}},Br=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}},Vr=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,v(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===E.Open).first();if(!n)throw new w(`No opening shift found`);let r=new ge;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 ge;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 ge;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}},Hr=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 ge;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 it(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 tt;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,v(this,`invoiceService`,void 0),v(this,`tillService`,void 0),v(this,`paymentService`,void 0),v(this,`printerService`,void 0),v(this,`printTemplateService`,void 0),v(this,`printJobService`,void 0),v(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 Jr(e,t,n,`print_templates`,`print_template`),this.printJobService=new X(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?this.updateOne(e.id_in_server,e):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),a=new z(t,await this.printTemplateService.renderReportPrintTemplate(i,r.config,n),!1,e.copies);await this.printJobService.addOne(a)}async getReportData(e,t){let n=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(),n.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();n.drawer_summary.open_amount=K(t.filter(e=>e.type==D.OpenDeposit).reduce((e,t)=>e+t.amount,0)),n.drawer_summary.pay_in_total=K(t.filter(e=>e.type==D.CashIn).reduce((e,t)=>e+t.amount,0)),n.drawer_summary.cash_invoice_total=K(t.filter(e=>e.type==D.CashInvoice).reduce((e,t)=>e+t.amount,0)),n.drawer_summary.cash_invoice_count=t.filter(e=>e.type==D.CashInvoice).length,n.drawer_summary.pay_in_count=t.filter(e=>e.type==D.CashIn).length,n.drawer_summary.pay_out_total=K(t.filter(e=>e.type==D.CashOut).reduce((e,t)=>e+t.amount,0)),n.drawer_summary.pay_out_count=t.filter(e=>e.type==D.CashOut).length,n.drawer_summary.drawer_amount=K(n.drawer_summary.open_amount+n.drawer_summary.pay_in_total+n.drawer_summary.cash_invoice_total-n.drawer_summary.pay_out_total),n.drawer_summary.difference=K(n.drawer_summary.drawer_amount-n.drawer_summary.declared_amount)}n.start_datetime=new Date(e.start_datetime).toISOString(),n.end_datetime=new Date(e.end_datetime).toISOString(),n.humanized_start_datetime=I(new Date(e.start_datetime),t),n.humanized_end_datetime=I(new Date(e.end_datetime),t),n.humanized_printed_datetime=I(new Date,t);let r=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),i=(await this.invoiceService.autoQuery(r,{timeout:6e5})).results||[];return this.processReportInvoicesData(n,i)}async processReportInvoicesData(e,t=[]){let n=new Map,r=new Map,i=await this.db.table(`categories`).toArray(),a=new Map(i.map(e=>[e.uid,e]));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 i=this.generateItemKey(t),a=n.get(i);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=r.get(t);n?(n.quantity+=e.quantity,n.total_amount=K(n.total_amount+e.price*e.quantity)):(n=new xn,n.item=e.item,n.quantity=e.quantity,n.total_amount=K(e.price*e.quantity),r.set(t,n))})):(a=new bn,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(),i=r.get(n);i?(i.quantity+=e.quantity,i.total_amount=K(i.total_amount+e.price*e.quantity)):(i=new xn,i.item=e.item,i.quantity=e.quantity,i.total_amount=K(e.price*e.quantity),r.set(n,i))}),n.set(i,a))}),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.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 o=Array.from(n.values());o.sort((e,t)=>{let n=a.get(e.item.category_uid),r=a.get(t.item.category_uid),i=n?.sequence??999999,o=r?.sequence??999999;return i===o?(e.item.sequence??999999)-(t.item.sequence??999999):i-o}),e.item_sales_summary=o;let s=0,c=0,l=new Map;o.forEach(e=>{if(s+=e.total_amount,c+=e.quantity,!e.item.category_uid)return;let t=e.item.category_uid,n=l.get(t);n||(n=new Sn,n.category=a.get(e.item.category_uid)||null,l.set(t,n)),n.items.push(e),n.total_quantity+=e.quantity,n.total_amount+=e.total_amount}),e.item_sales_summary_total=K(s),e.item_sales_summary_total_count=c;let u=Array.from(l.values());u.sort((e,t)=>(e.category?.sequence??999999)-(t.category?.sequence??999999)),u.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=u;let d=Array.from(r.values());d.sort((e,t)=>t.quantity===e.quantity?t.total_amount-e.total_amount:t.quantity-e.quantity),e.modifier_sales_summary=d;let f=0,p=0;return e.modifier_sales_summary.forEach(e=>{f+=e.total_amount,p+=e.quantity}),e.modifier_sales_summary_total=K(f),e.modifier_sales_summary_total_count=p,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}},X=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,e}},qr=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}},Jr=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,v(this,`httpClient`,void 0),v(this,`secretKey`,`tKB84ZlZRzLzA2LcglNNLquucKZwtJApRTaPKjAJHFbDd8nJRD`),this.httpClient=c.create({baseURL:`https://revopos-cdn.sgp1.digitaloceanspaces.com`,timeout:3e3})}async initialize(){if(!await this.getOneByParams({printer_type:L.ReceiptPrinter})){let e=new R;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=L.ReceiptPrinter,await this.addOne(e),console.log(`Default Receipt Template added`)}if(!await this.getOneByParams({printer_type:L.CheckPrinter})){let e=new R;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=L.CheckPrinter,await this.addOne(e),console.log(`Default Check Template added`)}if(!await this.getOneByParams({printer_type:L.OrderPrinter})){let e=new R;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=L.OrderPrinter,await this.addOne(e),console.log(`Default Order Template added`)}if(!await this.getOneByParams({printer_type:L.KitchenPrinter})){let e=new R;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=L.KitchenPrinter,await this.addOne(e),console.log(`Default Kitchen Template added`)}if(!await this.getOneByParams({printer_type:L.KioskPrinter})){let e=new R;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=L.KioskPrinter,await this.addOne(e),console.log(`Default Kiosk Template added`)}if(!await this.getOneByParams({printer_type:L.LabelPrinter})){let e=new R;e.commands=await this.getPrintTemplate(`tspl_cmds`),e.name=`Default Label Template`,e.printer_type=L.LabelPrinter,await this.addOne(e)}if(!await this.getOneByParams({printer_type:L.QrCodePrinter})){let e=new R;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=L.QrCodePrinter,await this.addOne(e)}if(!await this.getOneByParams({report_code_name:`sales_summary_report`})){let e=new R;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 R;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 R;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 R;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 B){let i=new F;n.printer_type==L.KitchenPrinter||n.printer_type==L.OrderPrinter?i.codepage=n.codepage||this.getCodepageByCountryCode(t.kitchen.language):i.codepage=n.codepage||this.getCodepageByCountryCode(t.receipt.language);let a=new et;return a.invoice=e,a.config=t,a.normalized_printed_at=I(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 B){let i=new F,a=new et;return a.report_data=e,a.config=t,a.normalized_printed_at=I(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 B){let r=new F;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,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}}},Yr=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}},Xr=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 Zr(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 Qr=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`,X],[`PrintTemplate`,Jr],[`EmployeeRole`,Nr],[`OrderDisplay`,Dr],[`Storage`,Yr],[`Menu`,qr],[`StockLog`,Xr]]),Z=`uid, updated_at, created_at, deleted_at, _timestamp, id_in_server, created_at_timestamp`,Q=`${Z}, sequence`,$r=`${Q}, status`,ei=`${Z}, till_type, shift_uid, invoice_uid`,ti=`${Q}, payment_method_code, is_disabled`,ni=`${Z}, type, status, table_uid`,ri=`${Q}, name, barcode, codename`,ii=`${Z}, status, printer_type, connection_type, protocol, save_only, device_uid_to_print`,ai=`${Z}, name, printer_type`,oi=`${Z}, order_number, status`,si=`${Z}, model`,ci={items:ri,sections:Q,section_items:Q,categories:Q,shifts:$r,tills:ei,employees:`${Z}, role_uid`,payment_methods:ti,invoices:ni,configs:Z,reports:Z,printers:Z,print_jobs:ii,print_templates:ai,employee_roles:`${Z}, name, is_default`,order_displays:oi,storages:si,menus:Z,stock_logs:`${Z}, entity_type, entity_uid, type`};var $=function(e){return e.DISCONNECTED=`disconnected`,e.CONNECTED=`connected`,e.ERROR=`error`,e}($||{}),li=class e{constructor(e,t,n=!1){this.options=e,this.win=t,v(this,`mode`,void 0),v(this,`http`,void 0),v(this,`dataSource`,void 0),v(this,`status`,$.DISCONNECTED),this.mode=e.mode,this.http=Zr(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(ci),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=Qr.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)}}};function ui(e,t,n=`export.csv`){let r=pi(fi(e,t));return new Blob([``+r],{type:`text/csv;charset=utf-8;`})}function di(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 fi(e,t){let n=[];for(let r of e){n.push({type:`category`,name:r.name,sku:``,price:void 0,stock:void 0,is_internal:r.is_internal,min_order:void 0,max_order:void 0,image_url:r.image_url||``,image_thumbnail_url:r.image_thumbnail_url||``,sequence:r.sequence});let e=t.filter(e=>e.category_uid===r.uid);for(let t of e){let e=t.type===A.Combo;if(n.push({type:e?`combo`:`product`,name:t.name,sku:t.sku||``,price:t.price,stock:di(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}),e&&t.combo_groups&&t.combo_groups.length>0){for(let e of t.combo_groups)if(n.push({type:`combo_group`,name:e.name,sku:``,price:void 0,stock:void 0,is_internal:void 0,min_order:e.min_order,max_order:e.max_order,image_url:``,image_thumbnail_url:``,sequence:e.sequence}),e.combo_items&&e.combo_items.length>0)for(let t of e.combo_items)n.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(!e&&t.modifier_categories&&t.modifier_categories.length>0){for(let e of t.modifier_categories)if(n.push({type:`modifier_category`,name:e.name,sku:``,price:void 0,stock:void 0,is_internal:void 0,min_order:e.min_order,max_order:e.max_order,image_url:``,image_thumbnail_url:``,sequence:e.sequence}),t.modifiers&&t.modifiers.length>0){let r=t.modifiers.filter(t=>t.category_uid===e.uid);for(let e of r)n.push({type:`modifier`,name:e.name,sku:e.sku||``,price:e.price,stock:di(e.stock),is_internal:e.is_internal,min_order:void 0,max_order:void 0,image_url:e.image_url||``,image_thumbnail_url:e.image_thumbnail_url||``,sequence:e.sequence})}}}}return n}function pi(e){let t=[[`Type`,`Name`,`SKU`,`Price`,`Stock`,`Is Internal`,`Min Order`,`Max Order`,`Image URL`,`Thumbnail URL`,`Sequence`,`Item UID`].join(`,`)];for(let n of e){let e=[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||``];t.push(e.join(`,`))}return t.join(`
1
+ import e from"dayjs";import{nanoid as t}from"nanoid";import n from"esc-pos-encoder-ionic";import r from"wcwidth";import 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 ee=(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 h(e){"@babel/helpers - typeof";return h=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},h(e)}function g(e,t){if(h(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(h(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function _(e){var t=g(e,`string`);return h(t)==`symbol`?t:t+``}function v(e,t,n){return(t=_(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var te=class{constructor(){v(this,`address1`,``),v(this,`address2`,``),v(this,`lat`,``),v(this,`lng`,``),v(this,`postcode`,``),v(this,`note`,``),v(this,`is_default`,!1),v(this,`name`,``),v(this,`salute`,``),v(this,`phone_number`,``)}},y=class{constructor(){v(this,`id`,0),v(this,`ref_id`,``),v(this,`image_url`,``),v(this,`stripe_token`,``),v(this,`stripe_customer_id`,``),v(this,`username`,``),v(this,`normalized_username`,``),v(this,`company`,``),v(this,`ic`,``),v(this,`display_name`,``),v(this,`full_name`,``),v(this,`birth_date`,``),v(this,`gender`,``),v(this,`address`,``),v(this,`postcode`,``),v(this,`note`,``),v(this,`language`,``),v(this,`time_zone`,``),v(this,`created_at`,new Date),v(this,`updated_at`,new Date),v(this,`license_ids`,``),v(this,`security_stamp`,``),v(this,`phone_number`,``)}},b=class extends y{constructor(){super(),v(this,`license_id`,0),v(this,`credit`,0),v(this,`point`,0),v(this,`transaction_total`,0),v(this,`transaction_time`,0),v(this,`user_group_id`,0),v(this,`user_group_name`,``),v(this,`group_expires_at`,null),v(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(){v(this,`applying_type`,ne.Inclusive),v(this,`applying_items`,[])}},ae=class{constructor(e){v(this,`guid`,``),v(this,`promo_code`,``),v(this,`is_multi_stores`,!1),v(this,`name`,``),v(this,`alias`,void 0),v(this,`description`,void 0),v(this,`description_alias`,void 0),v(this,`applying_plus`,void 0),v(this,`applying_user_tags`,void 0),v(this,`applying_user_groups`,void 0),v(this,`discount_calc_type`,re.Flat),v(this,`discount_amount`,void 0),v(this,`discount_percent`,void 0),v(this,`duration`,30),v(this,`usage_count`,0),v(this,`usage_limit_per_invoice`,1),v(this,`above_invoice_amount`,void 0),v(this,`below_invoice_amount`,void 0),v(this,`is_delivery_free`,!1),v(this,`is_individual_use`,!0),v(this,`price_in_points`,void 0),v(this,`styles`,{}),v(this,`expired_at`,void 0),v(this,`auto_gen`,!1),v(this,`can_sell`,!0),v(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){v(this,`invoice_uid`,``),e&&(this.invoice_uid=e.invoice_uid)}},se=class{constructor(e){v(this,`guid`,``),v(this,`coupon`,new ae),v(this,`is_multi_stores`,!1),v(this,`usage`,new oe),v(this,`employee_uid`,``),v(this,`promo_code`,``),v(this,`is_expired`,!1),v(this,`is_redeemed`,!1),v(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(){v(this,`uid`,void 0),v(this,`updated_at`,new Date),v(this,`created_at`,new Date),v(this,`created_at_timestamp`,new Date().getTime()),v(this,`deleted_at`,null),v(this,`_timestamp`,void 0),v(this,`id_in_server`,void 0)}},S=class extends x{constructor(){super(),v(this,`name`,void 0),v(this,`name_translations`,{})}},le=class extends S{constructor(...e){super(...e),v(this,`description`,void 0),v(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(){v(this,`mode`,void 0),v(this,`base_url`,void 0),v(this,`device_uid`,void 0),v(this,`merchant_uid`,void 0),v(this,`token`,void 0),v(this,`database`,void 0)}};let pe=function(e){return e.Data=`DataMessage`,e.Event=`EventMessage`,e}({});var me=class{constructor(){v(this,`model`,``),v(this,`data`,``),v(this,`has_many`,!1),v(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(),v(this,`user_uid`,``),v(this,`started_at`,new Date),v(this,`ended_at`,new Date),v(this,`declared_amount`,0),v(this,`drawer_amount`,0),v(this,`first_invoice_number`,0),v(this,`status`,E.Open),v(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 ge=class extends x{constructor(){super(),v(this,`user_uid`,``),v(this,`shift_uid`,``),v(this,`invoice_uid`,``),v(this,`type`,D.CashDeposit),v(this,`amount`,0),v(this,`note`,``),v(this,`uid`,C.Till+t())}};let O=function(e){return e.CLOSED=`closed`,e.OPENED=`opened`,e.PAYMENT=`payment`,e}({});var _e=class extends S{constructor(){super(),v(this,`printer_id_order_list`,[]),v(this,`order_printer_uids`,[]),v(this,`receipt_printer_uid`,``),v(this,`check_printer_uid`,``),v(this,`qr_printer_uid`,``),v(this,`total`,0),v(this,`time`,0),v(this,`pax`,0),v(this,`invoice_created_at`,new Date),v(this,`child_pax`,0),v(this,`baby_pax`,0),v(this,`uid`,C.SectionItem+t()),v(this,`invoice_uid`,``),v(this,`section_uid`,``),v(this,`status`,O.CLOSED),v(this,`size_x`,0),v(this,`size_y`,0),v(this,`row`,0),v(this,`col`,0),v(this,`is_take_out`,!1),v(this,`soup_base_quota`,0),v(this,`soup_base_type`,0),v(this,`is_delete`,!1),v(this,`meta`,{}),v(this,`customer`,{})}},ve=class extends S{constructor(){super(),v(this,`sequence`,0),v(this,`uid`,C.Section+t())}},ye=class extends S{constructor(){super(),v(this,`permissions`,[]),v(this,`is_default`,!1),v(this,`uid`,C.EmployeeRole+t())}},be=class{constructor(e){v(this,`item_uid`,``),v(this,`quantity`,0),v(this,`modifiers`,[]),this.item_uid=e,this.quantity=0,this.modifiers=[]}},k=class extends le{constructor(){super(),v(this,`meta`,{}),v(this,`etc`,{}),v(this,`assets`,{}),v(this,`config`,{online_order_display_large_image:!1}),v(this,`is_internal`,!1),v(this,`color`,``),v(this,`icon`,``),v(this,`sequence`,0)}},xe=class{constructor(){v(this,`system`,Se.POS),v(this,`visible`,!1),v(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 k{constructor(){super(),v(this,`type`,Ce.Modifier),v(this,`visibility`,[]),v(this,`uid`,C.ItemModifierCategory+t()),v(this,`max_order`,0),v(this,`min_order`,0),v(this,`is_delisted`,!1)}},Te=class extends k{constructor(){super(),v(this,`image_url`,``),v(this,`image_file_path`,``),v(this,`image_thumbnail_url`,``),v(this,`image_thumbnail_file_path`,``),v(this,`has_subcategory`,!1),v(this,`name_translations`,{}),v(this,`visibility`,void 0),v(this,`printing_sequence`,0),v(this,`type`,Ce.Product),v(this,`is_delisted`,!1),v(this,`subcategories`,[]),v(this,`uid`,C.Category+t()),v(this,`max_order`,0),v(this,`min_order`,0)}},Ee=class extends k{constructor(){super(),v(this,`category_uid`,``),v(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 k{constructor(){super(),v(this,`image_url`,``),v(this,`image_file_path`,``),v(this,`image_thumbnail_url`,``),v(this,`image_thumbnail_file_path`,``),v(this,`visibility`,[]),v(this,`sku`,``),v(this,`type`,A.Modifier),v(this,`barcode`,``),v(this,`category_uid`,``),v(this,`price`,0),v(this,`original_price`,0),v(this,`prices`,[]),v(this,`stock`,1e3),v(this,`print_on_receipt`,!0),v(this,`price_adjustable`,!1),v(this,`is_sold_out`,!1),v(this,`recipe`,``),v(this,`is_remark_disabled`,!1),v(this,`uid`,C.ItemModifier+t())}},j=class extends De{constructor(){super(),v(this,`codename`,``),v(this,`sku`,``),v(this,`recipe`,``),v(this,`barcode`,``),v(this,`type`,A.ByQuantity),v(this,`add_credit`,0),v(this,`category_uid`,``),v(this,`subcategory_uid`,``),v(this,`unit`,0),v(this,`stock`,0),v(this,`is_sold_out`,!1),v(this,`sold`,0),v(this,`print_on_receipt`,!0),v(this,`price`,0),v(this,`open_editor`,!0),v(this,`price_adjustable`,!1),v(this,`minus_point`,0),v(this,`cost`,0),v(this,`discountable`,!0),v(this,`printing_sequence`,0),v(this,`recommended`,!1),v(this,`likes`,0),v(this,`dislikes`,0),v(this,`is_tax_exempt`,!1),v(this,`is_service_charge_exempt`,!1),v(this,`is_point_reward_exempt`,!1),v(this,`is_credit_reward_exempt`,!1),v(this,`is_internal`,!1),v(this,`is_delisted`,!1),v(this,`uid`,C.Item+t()),v(this,`modifiers`,void 0),v(this,`modifier_categories`,void 0),v(this,`kitchen_printers_uids`,[]),v(this,`order_printers_uids`,[]),v(this,`label_printers_uids`,[]),v(this,`open_editor_panel`,!1),v(this,`open_price_editor`,!1),v(this,`combo_groups`,[])}},Oe=class extends x{constructor(){super(),v(this,`lookup_keys`,[]),v(this,`product_uid`,``),v(this,`uid`,C.Price+t()),v(this,`amount`,0),v(this,`name`,``),v(this,`name_translations`,{})}},ke=class{constructor(){v(this,`item_uid`,``),v(this,`combo_item`,new j),v(this,`price`,0),v(this,`sequence`,0),v(this,`meta`,{})}},Ae=class{constructor(){v(this,`uid`,C.ComboGroup+t()),v(this,`name`,``),v(this,`name_translations`,{}),v(this,`min_order`,1),v(this,`max_order`,1),v(this,`combo_items`,[]),v(this,`sequence`,0),v(this,`meta`,{})}},M=class e{constructor(){v(this,`_state`,e.State.CLOSED),v(this,`cleanup`,void 0),v(this,`onData`,null),v(this,`onClose`,null),v(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}`)}}};v(M,`State`,{CLOSED:0,OPENING:1,OPENED:2,CLOSING:3}),v(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(){v(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 P.Text:if(t.item?.text){if(t.item.size===Re.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===Re.Custom&&r.raw([29,33,0])}break;case P.Table:if(t.table){if(t.table.size===Re.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===Re.Custom&&r.raw([29,33,0])}break;case P.Line:r.line(t.item?.text?.repeat(48)??`-`.repeat(48),t.item?.line_width??48);break;case P.NewLine:t.repeat=t.repeat??1;for(let e=0;e<t.repeat;e++)r.newline();break;case P.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 P.QRCode:t.qrcode&&r.qrcode(t.qrcode.data,t.qrcode.model,t.qrcode.size,t.qrcode.errorlevel);break;case P.Barcode:t.barcode&&r.barcode(t.barcode.data,t.barcode.symbology,t.barcode.height);break;case P.Cut:r.cut(t.item?.text??`full`);break;case P.Beeper:r.beeper();break;case P.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(){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}({}),Re=function(e){return e.Custom=`custom`,e.Normal=`normal`,e.Small=`small`,e}({}),P=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 ze=class{constructor(){v(this,`data`,``),v(this,`symbology`,`ean13`),v(this,`height`,0)}},Be=class{constructor(){v(this,`data`,``),v(this,`model`,2),v(this,`size`,6),v(this,`errorlevel`,`m`)}},Ve=class{constructor(){v(this,`base64_data`,``),v(this,`width`,0),v(this,`height`,0),v(this,`algorithm`,`threshold`),v(this,`threshold`,128)}};let He=function(e){return e[e.SunmiPrinter=0]=`SunmiPrinter`,e}({});var F=class{constructor(){v(this,`codepage`,N.WesternEuropeanLatin),v(this,`items`,[])}};function I(t,n){return e(t).format(n||`YYYY-MMM-DD HH:mm:ss`)}function Ue(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 We=class extends S{constructor(){super(),v(this,`machine_name`,``),v(this,`connection_id`,``),v(this,`type`,Ke.Client),v(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:``})}},Ge=class extends S{constructor(){super(),v(this,`type`,Ke.Node),v(this,`machine_name`,``),v(this,`connection_id`,``),v(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 Ke=function(e){return e.Client=`client`,e.Node=`node`,e}({}),L=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 qe=class{constructor(){v(this,`printer_name`,``),v(this,`status`,``),v(this,`port_name`,``),v(this,`error`,``)}};let Je=function(e){return e.ESCPOS=`ESC/POS`,e.TSPL=`TSPL`,e}({}),Ye=function(e){return e.USB=`USB`,e.WINDOWS_DRIVER=`WINDOWS_DRIVER`,e.ETHERNET=`ETHERNET`,e.BLUETOOTH=`BLUETOOTH`,e.BUILTIN=`BUILTIN`,e}({});var Xe=class{constructor(){v(this,`header`,``),v(this,`body`,``),v(this,`footer`,``),v(this,`commands`,``),v(this,`type`,L.ReceiptPrinter)}},R=class extends S{constructor(){super(),v(this,`header`,``),v(this,`body`,``),v(this,`footer`,``),v(this,`commands`,``),v(this,`printer_type`,L.ReceiptPrinter),v(this,`codepage`,void 0),v(this,`uid`,C.PrintTemplate+t()),v(this,`report_code_name`,``)}};let Ze=function(e){return e.Queued=`queued`,e.Printed=`printed`,e.Failed=`failed`,e.Expired=`expired`,e}({});var z=class extends S{constructor(e,n,r=!1,i=1){super(),v(this,`printer_name`,``),v(this,`driver_printer_name`,``),v(this,`printer_ip`,``),v(this,`printer_uid`,``),v(this,`printer_type`,L.ReceiptPrinter),v(this,`protocol`,Je.ESCPOS),v(this,`connection_type`,Ye.ETHERNET),v(this,`data`,new F),v(this,`status`,Ze.Queued),v(this,`retries`,0),v(this,`commands`,``),v(this,`uid`,C.PrintJob+t()),v(this,`save_only`,!1),v(this,`print_times`,1),v(this,`printed`,0),v(this,`device_uid_to_print`,``),v(this,`designated_table_section_uids`,[]),v(this,`job_id`,0),v(this,`print_sequence`,void 0),v(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 Qe=function(e){return e.Online=`online`,e.Offline=`offline`,e}({});var $e=class extends S{constructor(){super(),v(this,`device_uid`,``),v(this,`type`,L.ReceiptPrinter),v(this,`is_not_default`,!1),v(this,`driver_printer_name`,``),v(this,`fallback_printer_uid`,0),v(this,`protocol`,Je.ESCPOS),v(this,`connection_type`,Ye.ETHERNET),v(this,`print_template_uid`,``),v(this,`uid`,C.Printer+t()),v(this,`ip_address`,``),v(this,`status`,Qe.Online),v(this,`kitchen_itemized_print`,!1),v(this,`print_times`,1),v(this,`retries`,1)}},et=class{constructor(){v(this,`config`,{}),v(this,`invoice`,{}),v(this,`report_data`,{}),v(this,`section_item`,{}),v(this,`printer_name`,``),v(this,`printed_at`,new Date),v(this,`normalized_printed_at`,``),v(this,`meta`,{}),v(this,`is_cancel`,!1),this.normalized_printed_at=I(this.printed_at)}},B=class{constructor(){v(this,`printer_name`,``),v(this,`kitchen_itemized_print`,!1),v(this,`is_cancel`,!1)}},tt=class extends x{constructor(){super(),v(this,`invoice_uid`,``),v(this,`tender_amount`,0),v(this,`change_amount`,0),v(this,`payment_method_uid`,``),v(this,`payment_method_code`,``),v(this,`payment_method_name`,``),v(this,`payment_method`,new nt),v(this,`payment_method_history`,void 0),v(this,`uid`,C.Payment+t()),v(this,`updated_at`,new Date)}},nt=class extends S{constructor(){super(),v(this,`sequence`,0),v(this,`payment_currency_id`,0),v(this,`currency_code`,``),v(this,`currency_symbol`,`$`),v(this,`payment_method_code`,``),v(this,`name`,``),v(this,`codename`,``),v(this,`name_abbrev`,``),v(this,`enable_drawer`,!1),v(this,`enable_receipt`,!1),v(this,`image_url`,``),v(this,`custom_image_url`,``),v(this,`is_cash`,!1),v(this,`is_integrated`,!1),v(this,`is_disabled`,!0),v(this,`type`,0),v(this,`api_id`,``),v(this,`api_key`,``),v(this,`is_sales_exclusive`,!1),v(this,`enable_credit_validation`,!1),v(this,`enable_customer_validation`,!1),v(this,`is_cancellable`,!1),v(this,`uid`,C.PaymentMethod+t())}},rt=class extends nt{constructor(){super(),v(this,`changed_at`,new Date),v(this,`changed_by`,``)}},it=class{toPaymentMethod(){let e=new nt;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){v(this,`access_token`,null),v(this,`image_base64`,null),v(this,`error`,null),v(this,`currency_code`,null),v(this,`payment_method_code`,``),v(this,`codename`,null),v(this,`name_abbrev`,null),v(this,`name`,``),v(this,`enable_drawer`,!1),v(this,`enable_receipt`,!0),v(this,`image_url`,``),v(this,`is_cash`,!1),v(this,`is_integrated`,!1),v(this,`is_disabled`,!1),v(this,`type`,0),v(this,`api_id`,null),v(this,`api_key`,null),v(this,`timestamp_create`,Date.now()),v(this,`timestamp_update`,Date.now()),e&&Object.assign(this,e)}};let at=function(e){return e.STARTED=`payment_started`,e.COMPLETED=`payment_completed`,e.FAILED=`payment_failed`,e.CANCELLED=`payment_cancelled`,e}({});var ot=class extends S{constructor(){super()}},st=class extends ot{constructor(){super()}},ct=class extends S{constructor(){super(),v(this,`note_group_uid`,``),v(this,`related_model`,ue.Invoice),v(this,`usage`,0)}},lt=class extends ct{constructor(){super()}};let V=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(){v(this,`uid`,C.InvoiceCharge+t()),v(this,`name`,``),v(this,`percentage`,0),v(this,`amount`,0),v(this,`calc_flow`,W.AfterSubtotal)}},gt=class{constructor(){v(this,`action`,ft.Create),v(this,`action_by`,``),v(this,`device_uid`,``),v(this,`action_at`,new Date)}},_t=class{constructor(){v(this,`uid`,C.Charge+t()),v(this,`name`,``),v(this,`percent`,0),v(this,`calc_flow`,W.AfterSubtotal),v(this,`trigger_condition`,``)}},vt=class{constructor(){v(this,`calc_type`,U.Flat),v(this,`amount`,0),v(this,`percent`,0),v(this,`percent_amount`,0),v(this,`type`,mt.Custom),v(this,`calc_flow`,W.AfterSubtotal),v(this,`applying_item_uids`,[]),v(this,`name`,``),v(this,`name_translation`,{}),v(this,`voucher_uid`,``),v(this,`coupon_uid`,``),v(this,`uid`,C.InvoiceDiscount+t())}},yt=class{constructor(){v(this,`item_uid`,``),v(this,`item`,new De),v(this,`price`,0),v(this,`unit_of_measure`,pt.quantity),v(this,`quantity`,0),v(this,`sent`,0),v(this,`is_cancel_printed`,!1),v(this,`selected`,!1),v(this,`sales_user_uid`,``)}},bt=class extends x{constructor(){super(),v(this,`item_uid`,``),v(this,`price`,0),v(this,`unit_of_measure`,pt.quantity),v(this,`quantity`,0),v(this,`remark`,``),v(this,`invoice_uid`,``),v(this,`discount_calc_type`,U.Flat),v(this,`discount_amount`,0),v(this,`discount_percent`,0),v(this,`subtotal`,0),v(this,`subtotal_before_discount`,0),v(this,`item`,new j),v(this,`point`,0),v(this,`point_subtotal`,0),v(this,`up_size`,!1),v(this,`is_take_out`,!1),v(this,`is_duplicate`,!1),v(this,`is_combo`,!1),v(this,`is_combo_item`,!1),v(this,`combo_group_uid`,``),v(this,`combo_line_uid`,``),v(this,`modifiers`,[]),v(this,`duplicated_from_uid`,``),v(this,`sent`,0),v(this,`is_cancel_printed`,!1),v(this,`selected`,!1),v(this,`sales_user_uid`,``),v(this,`meta`,{})}},xt=class extends x{constructor(){super(),v(this,`ref_id`,``),v(this,`call_num`,``),v(this,`table_uid`,``),v(this,`table_name`,``),v(this,`type`,V.DineIn),v(this,`pax`,0),v(this,`adult_pax`,0),v(this,`child_pax`,0),v(this,`baby_pax`,0),v(this,`subtotal`,0),v(this,`point_subtotal`,0),v(this,`service_chargeable_subtotal`,0),v(this,`discountable_subtotal`,0),v(this,`service_charge`,0),v(this,`delivery_id`,0),v(this,`delivery_charge`,0),v(this,`delivery_type`,``),v(this,`delivery_by`,``),v(this,`use_customer_point`,!1),v(this,`add_point`,0),v(this,`minus_point`,0),v(this,`rewarded_point_rate`,0),v(this,`rewarded_point`,0),v(this,`use_customer_balance`,!1),v(this,`add_credit`,0),v(this,`minus_credit`,0),v(this,`rewarded_credit_rate`,0),v(this,`rewarded_credit`,0),v(this,`discounts`,[]),v(this,`discount_amount`,0),v(this,`tax`,0),v(this,`rounding`,0),v(this,`tip`,0),v(this,`grand_total`,0),v(this,`customer_id`,0),v(this,`remark`,``),v(this,`sales_user_uid`,``),v(this,`status`,H.Open),v(this,`paid_at`,new Date(0)),v(this,`voided_at`,new Date(0)),v(this,`humanized_paid_at`,``),v(this,`humanized_voided_at`,``),v(this,`humanized_created_at`,``),v(this,`order_id`,0),v(this,`to_address`,new te),v(this,`payment_source_method`,``),v(this,`payment_source_last4`,``),v(this,`payment_source_charge_ref`,``),v(this,`is_sales_exclusive`,!1),v(this,`etc`,{}),v(this,`action`,void 0),v(this,`lines`,[]),v(this,`deleted_lines`,[]),v(this,`payment_has_cash`,!1),v(this,`payments`,[]),v(this,`table_switch_id`,0),v(this,`employee_uid`,``),v(this,`employee_name`,``),v(this,`receipt_print_override`,!1),v(this,`customer`,new b),v(this,`is_duplicate`,!1),v(this,`kitchen_print_override`,!1),v(this,`otp`,``),v(this,`activities`,[]),v(this,`receipt_print_job_uid`,``),v(this,`kitchen_print_job_uids`,[]),v(this,`label_print_job_uids`,[]),v(this,`charges`,[]),v(this,`is_charge_triggered`,!1),v(this,`uid`,C.Invoice+t()),v(this,`meta`,{}),v(this,`price_lookup_key`,``)}},St=class extends x{constructor(){super(),v(this,`user_uid`,void 0),v(this,`name`,void 0),v(this,`email`,void 0),v(this,`password`,void 0),v(this,`uid`,C.Employee+t()),v(this,`role_uid`,``),v(this,`language`,`en`),v(this,`can_login`,!0)}},Ct=class extends x{constructor(){super(),v(this,`config`,new jt),v(this,`cache`,new wt),v(this,`storage`,{pricing_lookup_keys:[],pay_in_reasons:[],pay_out_reasons:[]})}},wt=class{constructor(){v(this,`printers`,[])}},Tt=class{constructor(){}},Et=class{constructor(){v(this,`enable_price_tiers`,!1),v(this,`rewarded_credit_rate`,0),v(this,`rewarded_point_rate`,0),v(this,`inclusive_service_charge`,!1),v(this,`inclusive_tax`,!1),v(this,`default_country_code`,`+65`)}},Dt=class{constructor(){v(this,`enabled`,!1),v(this,`full_screen_assets`,[]),v(this,`half_screen_assets`,[]),v(this,`is_logo_hidden`,!1),v(this,`order_list_font_size`,`1.875rem`),v(this,`order_modifier_font_size`,`1.25rem`)}};let Ot=function(e){return e.SmoochPay=`SPCD`,e.YeahPay=`YEAP`,e}({});var kt=class{constructor(){v(this,`takeaway_only`,!1),v(this,`guest_order_only`,!1),v(this,`disable_paynow_payment`,!1),v(this,`disable_card_payment`,!1),v(this,`landing_image`,``),v(this,`menu_banner_image`,``),v(this,`home_page_images`,[]),v(this,`paynow_method`,Mt.WyoPaynow),v(this,`card_payment_code`,Ot.SmoochPay)}},At=class{constructor(){v(this,`point`,{sms_notification:!1,above_invoice_amount:0,conversion_rate:0,inclusive_service_charge:!1,inclusive_tax:!1}),v(this,`credit`,{sms_notification:!1,above_invoice_amount:0,conversion_rate:0,inclusive_service_charge:!1,inclusive_tax:!1})}},jt=class{constructor(){v(this,`general`,new Ft),v(this,`till`,new It),v(this,`report`,new Lt),v(this,`receipt`,new Rt),v(this,`kitchen`,new zt),v(this,`kds`,new Bt),v(this,`label`,new Vt),v(this,`order`,new Ht),v(this,`ods`,new Ut),v(this,`payment`,new Wt),v(this,`user`,new Gt),v(this,`tax`,new Kt),v(this,`rounding`,new Yt),v(this,`inventory`,new Xt),v(this,`pax_config`,new Zt),v(this,`gto`,new Qt),v(this,`cash_drawer`,new $t),v(this,`marketing`,new At),v(this,`charges`,new qt),v(this,`currency`,new Jt),v(this,`cds`,new Dt),v(this,`kiosk`,new kt),v(this,`online_order`,new Nt),v(this,`loyalty_program`,new Et),v(this,`crm`,new Tt)}};let Mt=function(e){return e.FomoOnlinePaynow=`PNWO`,e.WyoPaynow=`WPPN`,e}({});var Nt=class{constructor(){v(this,`enable_membership`,!1),v(this,`login_call_to_action_text`,``),v(this,`menu_banner_image_url`,``),v(this,`paynow_method`,void 0),v(this,`disable_pay_at_counter`,!1),v(this,`disable_paynow_payment`,!1),v(this,`default_language`,`en`),v(this,`category_selector_mode`,`photo_mode`),v(this,`dynamic_order_qr`,{default_order_flow:ut.OrderFirstAndPayLater,select_order_flow:!1,select_menus:!1}),v(this,`max_dining_time`,0),v(this,`disable_logo_for_item_photo_fallback`,!1),v(this,`whatsapp_login_only`,!1),v(this,`enable_whatsapp_login`,!1)}};let Pt=function(e){return e.PROD=`prod`,e.DEV=`dev`,e}({});var Ft=class{constructor(){v(this,`company_name`,``),v(this,`company_name_alias`,``),v(this,`company_logo`,``),v(this,`company_tax_reg_no`,``),v(this,`company_postcode`,``),v(this,`company_address`,``),v(this,`company_country`,``),v(this,`company_tel`,``),v(this,`floor_plan_table_name`,`table`),v(this,`deploy_channel`,Pt.PROD),v(this,`language`,`en`),v(this,`debug`,!1),v(this,`logging`,!1),v(this,`offline_mode`,!1),v(this,`opening_schedules`,[{opening_hours:{open:`10:00`,close:`22:00`}}])}},It=class{constructor(){v(this,`control`,!0),v(this,`slip`,!0)}},Lt=class{constructor(){v(this,`itemized_consolidated`,!0),v(this,`itemized_separated`,``),v(this,`shift_itemized`,!0),v(this,`start_time`,`09:00:01`),v(this,`end_time`,`23:59:59`),v(this,`shift_print_time`,1),v(this,`shift_disable`,!1),v(this,`email`,!1)}},Rt=class{constructor(){v(this,`enabled`,!0),v(this,`show_print_dialog`,!1),v(this,`print_docket`,!1),v(this,`hide_non_price_item`,!1),v(this,`receipt_no_reset_daily`,!1),v(this,`language`,`en`),v(this,`disable_persistent_tcp`,!1)}},zt=class{constructor(){v(this,`enabled`,!0),v(this,`print_item_price`,!1),v(this,`print_cancel_slip`,!1),v(this,`print_cancel_whole_invoice`,!1),v(this,`language`,`en`)}},Bt=class{constructor(){v(this,`enabled`,!0),v(this,`display_order_after_payment`,!1),v(this,`print_slip_upon_completed`,!1)}},Vt=class{constructor(){v(this,`print`,!1),v(this,`text_to_raster`,!1)}},Ht=class{constructor(){v(this,`separation_line`,!1),v(this,`slip`,!0),v(this,`slip_font_size_ratio`,1),v(this,`max_dinning`,0),v(this,`exit_menu_after_payment`,!1),v(this,`hide_combo_item_on_receipt`,!1),v(this,`hide_combo_item_on_interactive_view`,!1),v(this,`hide_categories_when_ordering`,!1),v(this,`end_shift_with_open_tables`,!1),v(this,`datetime_format`,`YYYY-MMM-DD HH:mm:ss`),v(this,`ref_prefix`,`01`)}},Ut=class{constructor(){v(this,`enabled`,!1),v(this,`language`,`en`)}},Wt=class{constructor(){v(this,`quick_cash_payment`,!1),v(this,`notification`,!0),v(this,`quick`,!1)}},Gt=class{constructor(){v(this,`control`,!0)}},Kt=class{constructor(){v(this,`enabled`,!0),v(this,`method`,dt.Inclusive),v(this,`rate`,7),v(this,`name`,`GST`)}},qt=class{constructor(){v(this,`service_charge`,!1),v(this,`service_charge_rate`,10)}},Jt=class{constructor(){v(this,`currency_symbol`,`$`),v(this,`is_symbol_after_amount`,!1)}},Yt=class{constructor(){v(this,`base`,.1),v(this,`up`,!0),v(this,`cashless`,!1),v(this,`prepayment_rounding`,!1)}},Xt=class{constructor(){v(this,`inventory_control`,!1),v(this,`sold_out_for_today_only`,!1)}},Zt=class{constructor(){v(this,`pax`,!0),v(this,`detail`,!1)}},Qt=class{constructor(){v(this,`interface`,``),v(this,`genesis_date`,``),v(this,`upload_time`,``),v(this,`ftp_svr`,``),v(this,`ftp_usr`,``),v(this,`ftp_port`,``),v(this,`ftp_path`,``),v(this,`ftp_pwd`,``),v(this,`mall_id`,``),v(this,`machine_id`,``),v(this,`ftp_type`,`ftp`)}},$t=class{constructor(){v(this,`kick_code`,`27, 112, 48, 55, 121`),v(this,`connection_mode`,`via_receipt_printer`)}},en=class{constructor(e){v(this,`name`,``),v(this,`base64`,``),v(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(){v(this,`db`,void 0),v(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.`)}},G=class extends ln{constructor(...e){super(...e),v(this,`http`,void 0),v(this,`methodName`,void 0),v(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(){v(this,`uid`,C.ReportCategory+ +t()),v(this,`name`,``),v(this,`name_translations`,{}),v(this,`reports`,[]),v(this,`created_at`,new Date),v(this,`created_at_timestamp`,new Date().getTime()),v(this,`updated_at`,new Date),v(this,`deleted_at`,null)}},pn=class{constructor(){v(this,`uid`,C.Report+t()),v(this,`name`,``),v(this,`name_translations`,{}),v(this,`type`,void 0),v(this,`codename`,``),v(this,`created_at`,new Date),v(this,`created_at_timestamp`,new Date().getTime()),v(this,`updated_at`,new Date),v(this,`deleted_at`,null)}},mn=class extends x{constructor(){super(),v(this,`uid`,C.AppReport+t()),v(this,`reports`,[]),v(this,`version`,1)}},hn=class{constructor(){v(this,`start_datetime`,``),v(this,`humanized_start_datetime`,``),v(this,`end_datetime`,``),v(this,`humanized_end_datetime`,``),v(this,`humanized_printed_datetime`,``),v(this,`sales_summary`,new gn),v(this,`drawer_summary`,new _n),v(this,`payments_summary`,[]),v(this,`loyalty_program_summary`,new yn),v(this,`item_sales_summary`,[]),v(this,`item_sales_summary_total`,0),v(this,`item_sales_summary_total_count`,0),v(this,`item_sales_summary_by_category`,[]),v(this,`modifier_sales_summary`,[]),v(this,`modifier_sales_summary_total`,0),v(this,`modifier_sales_summary_total_count`,0),v(this,`config`,{})}},gn=class{constructor(){v(this,`sales_total`,0),v(this,`foc_sales_total`,0),v(this,`foc_sales_count`,0),v(this,`rounding_total`,0),v(this,`tax_total`,0),v(this,`service_charge_total`,0),v(this,`discount_total`,0),v(this,`voucher_total`,0),v(this,`voucher_count`,0),v(this,`coupon_total`,0),v(this,`coupon_count`,0),v(this,`paid_invoice_count`,0),v(this,`paid_invoice_total`,0),v(this,`void_invoice_count`,0),v(this,`void_invoice_total`,0),v(this,`total_pax`,0),v(this,`pax_sales_total`,0)}},_n=class{constructor(){v(this,`open_amount`,0),v(this,`declared_amount`,0),v(this,`drawer_amount`,0),v(this,`difference`,0),v(this,`pay_in_total`,0),v(this,`pay_in_count`,0),v(this,`cash_invoice_total`,0),v(this,`cash_invoice_count`,0),v(this,`pay_out_total`,0),v(this,`pay_out_count`,0)}},vn=class{constructor(){v(this,`code`,``),v(this,`name`,``),v(this,`total`,0),v(this,`count`,0)}},yn=class{constructor(){v(this,`add_credit_total`,0),v(this,`add_credit_count`,0),v(this,`topup_paid_total`,0),v(this,`topup_paid_count`,0),v(this,`rewarded_credit_total`,0),v(this,`rewarded_credit_count`,0),v(this,`minus_credit_total`,0),v(this,`minus_credit_count`,0),v(this,`rewarded_point_total`,0),v(this,`rewarded_point_count`,0),v(this,`minus_point_total`,0),v(this,`minus_point_count`,0)}},bn=class{constructor(){v(this,`item`,{}),v(this,`quantity`,0),v(this,`total_amount`,0),v(this,`modifiers`,[])}},xn=class{constructor(){v(this,`item`,{}),v(this,`quantity`,0),v(this,`total_amount`,0)}},Sn=class{constructor(){v(this,`category`,null),v(this,`items`,[]),v(this,`total_quantity`,0),v(this,`total_amount`,0)}},Cn=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,v(this,`configService`,void 0),v(this,`printJobService`,void 0),v(this,`printersFromCache`,void 0),this.configService=new Lr(e,t,n,`configs`,`config`),this.printJobService=new X(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(L.ReceiptPrinter)}async getDefaultPrinterByType(e){return this.getDefaultPrinter(e)}async getDefaultKioskPrinter(){return this.getDefaultPrinter(L.KioskPrinter)}async getDefaultCheckPrinter(){return this.getDefaultPrinter(L.CheckPrinter)}async getDefaultKitchenPrinter(){return this.getDefaultPrinter(L.KitchenPrinter)}async getDefaultOrderPrinter(){return this.getDefaultPrinter(L.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 F;t.items.push({type:P.OpenCashDrawer});let n=new z(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 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 q=(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`?q(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`?q(e,e=>`-`+e):``,jn=e=>typeof e==`string`?q(e,e=>`.`+e):``,Mn=e=>Nn(e),Nn=e=>typeof e==`string`?e.toLowerCase():``,Pn=e=>{if(typeof e!=`string`)return``;let t=q(e,e=>e.toUpperCase());return t.charAt(0).toUpperCase()+t.slice(1)},Fn=e=>typeof e==`string`?q(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`?q(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`,J=(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 J(e.every(e=>!!e),this,t)},sr=function(...e){let t=e.pop();return J(e.some(e=>!!e),this,t)},cr=function(e,t){return J(!e,this,t)},lr=function(e,t,n){return arguments.length===2&&(n=t,t=n?.hash?.compare),J(e===t,this,n)},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,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)},vr=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)},yr=vr,br=function(e,...t){let n=t.pop();return J(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 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 wr(e){let t=e?.handlebars||e?.hbs||ee(`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 x{constructor(){super(),v(this,`uid`,C.OrderDisplaySystem+t()),v(this,`order_number`,``),v(this,`status`,Y.Preparing)}};let Y=function(e){return e.Preparing=`preparing`,e.ReadyForPickup=`ready_for_pickup`,e}({});var Dr=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}};Tr({handlebars:f});const Or={quantity:1,price:0,remark:``};var kr=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,v(this,`tillService`,void 0),v(this,`sectionItemService`,void 0),v(this,`configService`,void 0),v(this,`printTemplateService`,void 0),v(this,`printerService`,void 0),v(this,`printJobService`,void 0),v(this,`itemService`,void 0),v(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 Jr(e,t,n,`print_templates`,`print_template`),this.printerService=new Cn(e,t,n,`printers`,`printer`),this.printJobService=new X(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,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),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===V.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==V.Delivery||e.type==V.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}}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)}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.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)}}},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==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);return r.is_duplicate=!0,r.duplicated_from_uid=n.uid,r.uid=C.InvoiceLine+t(),e.lines.push(r),e}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,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}addLineQuantity(e,t,n){if(e.lines==null||e.lines.length<=0)return e;t.quantity+=n}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.filter(e=>e.is_combo_item))if(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(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}},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==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=O.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=I(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=O.CLOSED,this.sectionItemService.reset(t),this.addEmployeeToInvoice(e,n);let r=await this.createReceiptPrintJob(e,L.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){t.status=O.PAYMENT,this.addEmployeeToInvoice(e,n);let r=await this.createReceiptPrintJob(e,L.CheckPrinter),i=await this.createLabelPrintJobs(e),a=await this.createKitchenPrintJobs(e),o=await this.createOrderPrintJobs(e),s=[...i,...a,...o];r&&s.push(r);let c=this.sortPrintJobsByPrinterSequence(s);e.kitchen_print_job_uids||(e.kitchen_print_job_uids=[]),e.label_print_job_uids||(e.label_print_job_uids=[]);let l=e.kitchen_print_job_uids.length,u=e.label_print_job_uids.length,d=a.map(e=>e.uid),f=i.map(e=>e.uid);d.length>0&&e.kitchen_print_job_uids.push(d),f.length>0&&e.label_print_job_uids.push(f),await this.preprocessInvoice(e);let p={invoice:e,section_item:t};c.length>0&&(p.print_jobs=c);try{let e=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/check_invoice`,p);if(e.error==T.outdatedInvoice)throw await this.saveOne(e.data),p.invoice=e.data,new w(e.error);if(e.error==T.outdatedSectionItem)throw await this.sectionItemService.saveOne(e.data),p.section_item=e.data,new w(e.error);return p}catch(t){throw e.kitchen_print_job_uids.length=l,e.label_print_job_uids.length=u,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!=O.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=O.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){e.status=H.Paid,t.invoice_uid=``,t.status=O.CLOSED,this.sectionItemService.reset(t),this.addEmployeeToInvoice(e,r),e.paid_at=new Date;let i=(await this.configService.getDefaultOne()).config,a=i?.order?.datetime_format;e.humanized_paid_at=I(e.paid_at,a),e.payment_has_cash=e.payments?.some(e=>e.payment_method?.is_cash===!0);let o=await this.getStockChangeList(e,!1),s=await this.createLabelPrintJobs(e),c=await this.createReceiptPrintJob(e,L.ReceiptPrinter),l=await this.createKitchenPrintJobs(e),u=await this.createCancelKitchenPrintJobs(e,e.deleted_lines),d=await this.createOrderPrintJobs(e),f=[...s,...l,...u,...d];c&&f.push(c);let p=this.sortPrintJobsByPrinterSequence(f);e.kitchen_print_job_uids||(e.kitchen_print_job_uids=[]),e.label_print_job_uids||(e.label_print_job_uids=[]);let m=e.kitchen_print_job_uids.length,ee=e.label_print_job_uids.length,h=l.map(e=>e.uid),g=s.map(e=>e.uid);h.length>0&&e.kitchen_print_job_uids.push(h),g.length>0&&e.label_print_job_uids.push(g),await this.preprocessInvoice(e);let _={invoice:e,section_item:t,till:n};p.length>0&&(_.print_jobs=p);try{let t=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/pay_invoice`,_);if(t.error==T.outdatedInvoice)throw await this.saveOne(t.data),_.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),_.section_item=t.data,new w(`${t.error}, system has updated the data and please try again`);if(o.length>0&&await this.itemService.changeItemsStock(o),e.call_num&&i?.ods?.enabled){let t=new Er;t.order_number=e.call_num,await this.orderDisplayService.addOne(t)}return _}catch(t){throw e.kitchen_print_job_uids.length=m,e.label_print_job_uids.length=ee,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=I(e.paid_at,s),e.created_at=new Date,e.created_at_timestamp=e.created_at.getTime(),e.humanized_created_at=I(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;r&&r.type==L.KioskPrinter?(l=await this.createReceiptPrintJob(e,L.ReceiptPrinter),u=await this.createReceiptPrintJob(e,L.KioskPrinter,!1,0,r,i)):l=await this.createReceiptPrintJob(e,L.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 ee=this.sortPrintJobsByPrinterSequence(m),h=f.map(e=>e.uid),g=d.map(e=>e.uid);h.length>0&&(e.kitchen_print_job_uids=[h]),g.length>0&&(e.label_print_job_uids=[g]),await this.preprocessInvoice(e);let _={invoice:e,till:t};ee.length>0&&(_.print_jobs=ee);let v=await this.http.put(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/direct_pay_invoice`,_);if(v.error==T.outdatedInvoice)throw await this.saveOne(v.data),_.invoice=v.data,new w(v.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 _}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=I(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,L.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};if(l.length>0&&(u.print_jobs=l),e.table_uid){let t=await this.sectionItemService.getOne(e.table_uid);t.status!=O.CLOSED&&(t.invoice_uid=``,t.status=O.CLOSED,u.section_item=t)}let d=[];i==H.Paid&&(d=await this.getStockChangeList(e));let f=await this.http.post(`api/v5/merchants/${this.options.merchant_uid}/${this.moduleName}/void_invoice`,u);if(f.error==T.outdatedInvoice)throw await this.saveOne(f.data),u.invoice=f.data,new w(f.error);return d.length>0&&await this.itemService.changeItemsStock(d),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){if(!e?.receipt_print_job_uid)throw new w(`The invoice does not have a receipt`);let r=await this.printJobService.getOne(e.receipt_print_job_uid);if(!r){let t=new p().addParam(`uid`,`Like`,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`);r=n.results[0]}let i=await this.printerService.getOne(r.printer_uid);if(i||(i=await this.printerService.getDefaultReceiptPrinter()),!i)throw new w(`Receipt printer not found`);return r=this.printJobService.replacePrinter(r,i),r.uid=C.PrintJob+t(),r.save_only=n,r.status=Ze.Queued,r.print_times=1,r.printed=0,r.retries=0,await this.printJobService.addOne(r),r}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=Ze.Queued,r.print_times=1,r.printed=0,r.retries=0,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}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==L.ReceiptPrinter||t==L.CheckPrinter){let n=e.table_uid?await this.sectionItemService.getOne(e.table_uid):null,r=t==L.ReceiptPrinter?n?.receipt_printer_uid:n?.check_printer_uid;r&&(o=await this.printerService.getOne(r)),o||(o=t==L.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==L.ReceiptPrinter&&!s.config?.receipt?.enabled&&(n=!0);let l=await this.printTemplateService.renderPrintTemplate(e,s.config,c,{...new B,printer_name:o.name}),u=new z(o,l,n,r);return t!=L.ReceiptPrinter&&(u.printer_type=t),o.connection_type!=Ye.ETHERNET&&(u.connection_type=o.connection_type),t==L.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()}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,L.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.sortLinesByItemSequence(o),l=s.cloneDeep(e);if(t.kitchen_itemized_print)for(let e of c){l.lines=[e];let i=new z(t,await this.printTemplateService.renderPrintTemplate(l,n,a,{...new B,printer_name:t.name}),!1,t.print_times);r.push(i)}else{l.lines=c;let e=new z(t,await this.printTemplateService.renderPrintTemplate(l,n,a,{...new B,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,L.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.sortLinesByItemSequence(c),u=s.cloneDeep(e);u.lines=l;let d=new z(i,await this.printTemplateService.renderPrintTemplate(u,t,o,{...new B,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,L.LabelPrinter);if(i.length==0||r.length==0)return[];let a=await this.printerService.getPrintersByUids(i),o=s.cloneDeep(e),c=r.length,l=1;for(let e of r){if(e.meta.total_index=c,e.meta.index=l,e.modifiers?.length&&e.item.modifiers?.length){let t=new Map(e.item.modifiers.map(e=>[e.uid,e.sequence??0]));e.modifiers.sort((e,n)=>(t.get(e.item_uid)??0)-(t.get(n.item_uid)??0))}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 z(e,new F,!1,e.print_times);c.commands=s,n.push(c)}return n}filterLinesAndPrintersToPrint(e,t){let n;switch(t){case L.KitchenPrinter:n=`kitchen_printers_uids`;break;case L.OrderPrinter:n=`order_printers_uids`;break;case L.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==L.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.sortLinesByItemSequence(a),l=s.cloneDeep(e);if(t.kitchen_itemized_print)for(let e of c){l.lines=[e];let r=new z(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 z(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 be(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 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}},Pr=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`)}}},Fr=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 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 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.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}},Ir=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}},Lr=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,v(this,`configFactories`,{general:()=>new Ft,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 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=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 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}},zr=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||``}}},Br=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}},Vr=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,v(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===E.Open).first();if(!n)throw new w(`No opening shift found`);let r=new ge;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 ge;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 ge;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}},Hr=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 ge;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 it(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 tt;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,v(this,`invoiceService`,void 0),v(this,`tillService`,void 0),v(this,`paymentService`,void 0),v(this,`printerService`,void 0),v(this,`printTemplateService`,void 0),v(this,`printJobService`,void 0),v(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 Jr(e,t,n,`print_templates`,`print_template`),this.printJobService=new X(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 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),a=new z(t,await this.printTemplateService.renderReportPrintTemplate(i,r.config,n),!1,e.copies);await this.printJobService.addOne(a)}async getReportData(e,t){let n=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(),n.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();n.drawer_summary.open_amount=K(t.filter(e=>e.type==D.OpenDeposit).reduce((e,t)=>e+t.amount,0)),n.drawer_summary.pay_in_total=K(t.filter(e=>e.type==D.CashIn).reduce((e,t)=>e+t.amount,0)),n.drawer_summary.cash_invoice_total=K(t.filter(e=>e.type==D.CashInvoice).reduce((e,t)=>e+t.amount,0)),n.drawer_summary.cash_invoice_count=t.filter(e=>e.type==D.CashInvoice).length,n.drawer_summary.pay_in_count=t.filter(e=>e.type==D.CashIn).length,n.drawer_summary.pay_out_total=K(t.filter(e=>e.type==D.CashOut).reduce((e,t)=>e+t.amount,0)),n.drawer_summary.pay_out_count=t.filter(e=>e.type==D.CashOut).length,n.drawer_summary.drawer_amount=K(n.drawer_summary.open_amount+n.drawer_summary.pay_in_total+n.drawer_summary.cash_invoice_total-n.drawer_summary.pay_out_total),n.drawer_summary.difference=K(n.drawer_summary.drawer_amount-n.drawer_summary.declared_amount)}n.start_datetime=new Date(e.start_datetime).toISOString(),n.end_datetime=new Date(e.end_datetime).toISOString(),n.humanized_start_datetime=I(new Date(e.start_datetime),t),n.humanized_end_datetime=I(new Date(e.end_datetime),t),n.humanized_printed_datetime=I(new Date,t);let r=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),i=(await this.invoiceService.autoQuery(r,{timeout:6e5})).results||[];return this.processReportInvoicesData(n,i)}async processReportInvoicesData(e,t=[]){let n=new Map,r=new Map,i=await this.db.table(`categories`).toArray(),a=new Map(i.map(e=>[e.uid,e]));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 i=this.generateItemKey(t),a=n.get(i);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=r.get(t);n?(n.quantity+=e.quantity,n.total_amount=K(n.total_amount+e.price*e.quantity)):(n=new xn,n.item=e.item,n.quantity=e.quantity,n.total_amount=K(e.price*e.quantity),r.set(t,n))})):(a=new bn,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(),i=r.get(n);i?(i.quantity+=e.quantity,i.total_amount=K(i.total_amount+e.price*e.quantity)):(i=new xn,i.item=e.item,i.quantity=e.quantity,i.total_amount=K(e.price*e.quantity),r.set(n,i))}),n.set(i,a))}),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.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 o=Array.from(n.values());o.sort((e,t)=>{let n=a.get(e.item.category_uid),r=a.get(t.item.category_uid),i=n?.sequence??999999,o=r?.sequence??999999;return i===o?(e.item.sequence??999999)-(t.item.sequence??999999):i-o}),e.item_sales_summary=o;let s=0,c=0,l=new Map;o.forEach(e=>{if(s+=e.total_amount,c+=e.quantity,!e.item.category_uid)return;let t=e.item.category_uid,n=l.get(t);n||(n=new Sn,n.category=a.get(e.item.category_uid)||null,l.set(t,n)),n.items.push(e),n.total_quantity+=e.quantity,n.total_amount+=e.total_amount}),e.item_sales_summary_total=K(s),e.item_sales_summary_total_count=c;let u=Array.from(l.values());u.sort((e,t)=>(e.category?.sequence??999999)-(t.category?.sequence??999999)),u.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=u;let d=Array.from(r.values());d.sort((e,t)=>t.quantity===e.quantity?t.total_amount-e.total_amount:t.quantity-e.quantity),e.modifier_sales_summary=d;let f=0,p=0;return e.modifier_sales_summary.forEach(e=>{f+=e.total_amount,p+=e.quantity}),e.modifier_sales_summary_total=K(f),e.modifier_sales_summary_total_count=p,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}},X=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,e}},qr=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}},Jr=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,v(this,`httpClient`,void 0),v(this,`secretKey`,`tKB84ZlZRzLzA2LcglNNLquucKZwtJApRTaPKjAJHFbDd8nJRD`),this.httpClient=c.create({baseURL:`https://revopos-cdn.sgp1.digitaloceanspaces.com`,timeout:3e3})}async initialize(){if(!await this.getOneByParams({printer_type:L.ReceiptPrinter})){let e=new R;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=L.ReceiptPrinter,await this.addOne(e),console.log(`Default Receipt Template added`)}if(!await this.getOneByParams({printer_type:L.CheckPrinter})){let e=new R;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=L.CheckPrinter,await this.addOne(e),console.log(`Default Check Template added`)}if(!await this.getOneByParams({printer_type:L.OrderPrinter})){let e=new R;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=L.OrderPrinter,await this.addOne(e),console.log(`Default Order Template added`)}if(!await this.getOneByParams({printer_type:L.KitchenPrinter})){let e=new R;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=L.KitchenPrinter,await this.addOne(e),console.log(`Default Kitchen Template added`)}if(!await this.getOneByParams({printer_type:L.KioskPrinter})){let e=new R;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=L.KioskPrinter,await this.addOne(e),console.log(`Default Kiosk Template added`)}if(!await this.getOneByParams({printer_type:L.LabelPrinter})){let e=new R;e.commands=await this.getPrintTemplate(`tspl_cmds`),e.name=`Default Label Template`,e.printer_type=L.LabelPrinter,await this.addOne(e)}if(!await this.getOneByParams({printer_type:L.QrCodePrinter})){let e=new R;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=L.QrCodePrinter,await this.addOne(e)}if(!await this.getOneByParams({report_code_name:`sales_summary_report`})){let e=new R;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 R;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 R;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 R;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 B){let i=new F;n.printer_type==L.KitchenPrinter||n.printer_type==L.OrderPrinter?i.codepage=n.codepage||this.getCodepageByCountryCode(t.kitchen.language):i.codepage=n.codepage||this.getCodepageByCountryCode(t.receipt.language);let a=new et;return a.invoice=e,a.config=t,a.normalized_printed_at=I(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 B){let i=new F,a=new et;return a.report_data=e,a.config=t,a.normalized_printed_at=I(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 B){let r=new F;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,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}}},Yr=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}},Xr=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 Zr(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 Qr=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`,X],[`PrintTemplate`,Jr],[`EmployeeRole`,Nr],[`OrderDisplay`,Dr],[`Storage`,Yr],[`Menu`,qr],[`StockLog`,Xr]]),Z=`uid, updated_at, created_at, deleted_at, _timestamp, id_in_server, created_at_timestamp`,Q=`${Z}, sequence`,$r=`${Q}, status`,ei=`${Z}, till_type, shift_uid, invoice_uid`,ti=`${Q}, payment_method_code, is_disabled`,ni=`${Z}, type, status, table_uid`,ri=`${Q}, name, barcode, codename`,ii=`${Z}, status, printer_type, connection_type, protocol, save_only, device_uid_to_print`,ai=`${Z}, name, printer_type`,oi=`${Z}, order_number, status`,si=`${Z}, model`,ci={items:ri,sections:Q,section_items:Q,categories:Q,shifts:$r,tills:ei,employees:`${Z}, role_uid`,payment_methods:ti,invoices:ni,configs:Z,reports:Z,printers:Z,print_jobs:ii,print_templates:ai,employee_roles:`${Z}, name, is_default`,order_displays:oi,storages:si,menus:Z,stock_logs:`${Z}, entity_type, entity_uid, type`};var $=function(e){return e.DISCONNECTED=`disconnected`,e.CONNECTED=`connected`,e.ERROR=`error`,e}($||{}),li=class e{constructor(e,t,n=!1){this.options=e,this.win=t,v(this,`mode`,void 0),v(this,`http`,void 0),v(this,`dataSource`,void 0),v(this,`status`,$.DISCONNECTED),this.mode=e.mode,this.http=Zr(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(ci),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=Qr.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)}}};function ui(e,t,n=`export.csv`){let r=pi(fi(e,t));return new Blob([``+r],{type:`text/csv;charset=utf-8;`})}function di(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 fi(e,t){let n=[];for(let r of e){n.push({type:`category`,name:r.name,sku:``,price:void 0,stock:void 0,is_internal:r.is_internal,min_order:void 0,max_order:void 0,image_url:r.image_url||``,image_thumbnail_url:r.image_thumbnail_url||``,sequence:r.sequence});let e=t.filter(e=>e.category_uid===r.uid);for(let t of e){let e=t.type===A.Combo;if(n.push({type:e?`combo`:`product`,name:t.name,sku:t.sku||``,price:t.price,stock:di(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}),e&&t.combo_groups&&t.combo_groups.length>0){for(let e of t.combo_groups)if(n.push({type:`combo_group`,name:e.name,sku:``,price:void 0,stock:void 0,is_internal:void 0,min_order:e.min_order,max_order:e.max_order,image_url:``,image_thumbnail_url:``,sequence:e.sequence}),e.combo_items&&e.combo_items.length>0)for(let t of e.combo_items)n.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(!e&&t.modifier_categories&&t.modifier_categories.length>0){for(let e of t.modifier_categories)if(n.push({type:`modifier_category`,name:e.name,sku:``,price:void 0,stock:void 0,is_internal:void 0,min_order:e.min_order,max_order:e.max_order,image_url:``,image_thumbnail_url:``,sequence:e.sequence}),t.modifiers&&t.modifiers.length>0){let r=t.modifiers.filter(t=>t.category_uid===e.uid);for(let e of r)n.push({type:`modifier`,name:e.name,sku:e.sku||``,price:e.price,stock:di(e.stock),is_internal:e.is_internal,min_order:void 0,max_order:void 0,image_url:e.image_url||``,image_thumbnail_url:e.image_thumbnail_url||``,sequence:e.sequence})}}}}return n}function pi(e){let t=[[`Type`,`Name`,`SKU`,`Price`,`Stock`,`Is Internal`,`Min Order`,`Max Order`,`Image URL`,`Thumbnail URL`,`Sequence`,`Item UID`].join(`,`)];for(let n of e){let e=[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||``];t.push(e.join(`,`))}return t.join(`
2
2
  `)}async function mi(e){return vi(gi(await e.text()))}const hi=[`category`,`product`,`modifier_category`,`modifier`,`combo`,`combo_group`,`combo_item`];function gi(e){let t=e.replace(/^\uFEFF/,``).replace(/\r\n/g,`
3
3
  `).replace(/\r/g,`
4
4
  `).trim().split(`
@@ -0,0 +1 @@
1
+ {"uid":"inv_iWcYcdv1YNoZC0aGwQxj5","updated_at":"2026-02-14T12:32:28.321Z","created_at":"2026-02-14T12:32:38.731Z","created_at_timestamp":1771072358731,"ref_id":"01260214000001601","call_num":"601","table_uid":"sit_2hPwnc9KSpi39Sn3sFlOi","table_name":"Grab","type":"dine_in","pax":0,"adult_pax":0,"child_pax":0,"baby_pax":0,"subtotal":70000,"point_subtotal":0,"service_chargeable_subtotal":70000,"discountable_subtotal":70000,"service_charge":0,"delivery_id":0,"delivery_charge":0,"delivery_type":"","delivery_by":"","use_customer_point":false,"add_point":0,"minus_point":0,"rewarded_point_rate":0,"rewarded_point":0,"use_customer_balance":false,"add_credit":0,"minus_credit":0,"rewarded_credit_rate":0,"rewarded_credit":0,"discounts":[],"discount_amount":0,"tax":5185.19,"rounding":0,"tip":0,"grand_total":70000,"customer_id":0,"remark":"","sales_user_uid":"","status":"paid","paid_at":"2026-02-14T12:32:38.712Z","voided_at":"1970-01-01T00:00:00.000Z","humanized_paid_at":"14/02/2026 19:32:38","humanized_voided_at":"","humanized_created_at":"14/02/2026 19:32:38","order_id":0,"to_address":{"address1":"","address2":"","lat":"","lng":"","postcode":"","note":"","is_default":false,"name":"","salute":"","phone_number":""},"payment_source_method":"","payment_source_last4":"","payment_source_charge_ref":"","is_sales_exclusive":false,"etc":{},"lines":[{"uid":"iln_qLuhso1UqVWH9ox6JsfGU","updated_at":"2026-02-14T12:32:32.978Z","created_at":"2026-02-14T12:32:32.978Z","created_at_timestamp":1771072352978,"item_uid":"itm_4iQMHedTPbCp3mFokLSvx","price":70000,"unit_of_measure":"quantity","quantity":1,"remark":"","invoice_uid":"","discount_calc_type":"flat","discount_amount":0,"discount_percent":0,"subtotal":70000,"subtotal_before_discount":70000,"item":{"uid":"itm_4iQMHedTPbCp3mFokLSvx","updated_at":"2026-02-13T12:29:18.955Z","created_at":"2025-11-17T07:27:37.134Z","created_at_timestamp":1763364457134,"name":"Grab - H\u1ED3ng Tr\u00E0 S\u1EEFa","name_translations":{"en":"Grab - Black Milk Tea"},"description":"(olong green tea, roasted olong, (avocado,condensed milk,Tapioca white pearl )","description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":170011,"image_url":"https://app.posx.ai/images/93da00e8-5cda-4cbf-be37-0b483b8a99cc.jpg","image_file_path":"","image_thumbnail_url":"https://app.posx.ai/images/93da00e8-5cda-4cbf-be37-0b483b8a99cc.thumbnail.jpg","image_thumbnail_file_path":"","sku":"","type":"by_quantity","barcode":"","category_uid":"cat_nDSPXlpMaHVMyBubKEpO2","price":70000,"original_price":0,"prices":[],"stock":-34,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"codename":"","recipe":"CP003-B01-W01","add_credit":0,"subcategory_uid":"","unit":0,"sold":0,"open_editor":true,"minus_point":0,"cost":0,"discountable":true,"printing_sequence":0,"recommended":false,"likes":0,"dislikes":0,"is_tax_exempt":false,"is_service_charge_exempt":false,"is_point_reward_exempt":false,"is_credit_reward_exempt":false,"is_delisted":false,"kitchen_printers_uids":["prt_UBY9G95mCuHgtg34tnD7H"],"order_printers_uids":[],"label_printers_uids":["prt_B1R1W19J1LRa14nraxiz2"],"open_editor_panel":true,"open_price_editor":true,"combo_groups":[],"id_in_server":9375,"_timestamp":1770985758771696,"modifier_categories":[{"min_order":1,"max_order":1,"sequence":4,"name":"Sugar Level","uid":"imc_5TG1isS3rDcW-TtE9mPvP"},{"min_order":1,"max_order":1,"sequence":3,"name":"Ice","uid":"imc_MA0C7z9B2GHEAplgfMSFc"},{"min_order":1,"max_order":1,"sequence":6,"name":"Topping one","uid":"imc_vQfQFta5UdBpn9KzyItRr"},{"min_order":0,"max_order":0,"sequence":7,"name":"Topping","uid":"imc_UH7jvReaP3k2tyuMUWAm_"}],"modifiers":[{"uid":"iod_JK30rn-ELHCiYyqGy-qi8","updated_at":"2025-11-29T12:05:26.892Z","created_at":"2025-11-29T12:05:26.892Z","created_at_timestamp":1764417926892,"name":"0%","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":4001,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_5TG1isS3rDcW-TtE9mPvP","price":0,"original_price":0,"prices":[],"stock":1000,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":"T05"},{"uid":"iod_2SBZM4Yg0XmqsS3kC9JX1","updated_at":"2025-11-29T12:05:41.197Z","created_at":"2025-11-29T12:05:41.197Z","created_at_timestamp":1764417941197,"name":"30%","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":4002,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_5TG1isS3rDcW-TtE9mPvP","price":0,"original_price":0,"prices":[],"stock":999,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":"T04"},{"uid":"iod_dilkDd6CXmVxDEtoc_cyl","updated_at":"2025-11-29T12:05:51.459Z","created_at":"2025-11-29T12:05:51.459Z","created_at_timestamp":1764417951459,"name":"50%","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":4003,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_5TG1isS3rDcW-TtE9mPvP","price":0,"original_price":0,"prices":[],"stock":994,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":"T03"},{"uid":"iod_wI5ynNWhF2-e2l8wHMYo7","updated_at":"2025-11-29T12:05:59.937Z","created_at":"2025-11-29T12:05:59.937Z","created_at_timestamp":1764417959937,"name":"70%","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":4004,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_5TG1isS3rDcW-TtE9mPvP","price":0,"original_price":0,"prices":[],"stock":999,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":"T02"},{"uid":"iod_UfyyYSUwqyfa5Fek9guGA","updated_at":"2025-11-29T12:06:08.590Z","created_at":"2025-11-29T12:06:08.590Z","created_at_timestamp":1764417968590,"name":"100%","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":4005,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_5TG1isS3rDcW-TtE9mPvP","price":0,"original_price":0,"prices":[],"stock":978,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":"T01"},{"uid":"iod_Wt1BN3gK_ck1HrVeUAbDd","updated_at":"2025-11-30T07:56:42.422Z","created_at":"2025-11-30T07:56:42.422Z","created_at_timestamp":1764489402422,"name":"0%","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":3001,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_MA0C7z9B2GHEAplgfMSFc","price":0,"original_price":0,"prices":[],"stock":1000,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_mMLNAEzOKtY2epTp4gVYN","updated_at":"2025-11-30T07:56:57.428Z","created_at":"2025-11-30T07:56:57.428Z","created_at_timestamp":1764489417428,"name":"50%","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":3002,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_MA0C7z9B2GHEAplgfMSFc","price":0,"original_price":0,"prices":[],"stock":997,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_ZahQa5c3NVufqLt-J_YTw","updated_at":"2025-11-30T07:57:06.578Z","created_at":"2025-11-30T07:57:06.578Z","created_at_timestamp":1764489426578,"name":"70%","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":3003,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_MA0C7z9B2GHEAplgfMSFc","price":0,"original_price":0,"prices":[],"stock":998,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_gJcG8TTG20hD9BQLWCQGZ","updated_at":"2025-11-30T07:57:15.527Z","created_at":"2025-11-30T07:57:15.527Z","created_at_timestamp":1764489435527,"name":"100%","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":3004,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_MA0C7z9B2GHEAplgfMSFc","price":0,"original_price":0,"prices":[],"stock":975,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_gj9FzI7-W64UmxsFr5IBr","updated_at":"2025-12-01T02:43:49.893Z","created_at":"2025-12-01T02:43:49.893Z","created_at_timestamp":1764557029893,"name":"Kem Mu\u1ED1i","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":6001,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_vQfQFta5UdBpn9KzyItRr","price":0,"original_price":0,"prices":[],"stock":1000,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_qJbUtYkEmbxWCVP05oOpa","updated_at":"2025-12-01T02:44:36.158Z","created_at":"2025-12-01T02:44:36.158Z","created_at_timestamp":1764557076158,"name":"Kem Tiramisu","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":6002,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_vQfQFta5UdBpn9KzyItRr","price":0,"original_price":0,"prices":[],"stock":998,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_NC_3a3Jx4Ss67wgQ7gxku","updated_at":"2025-12-01T02:44:43.988Z","created_at":"2025-12-01T02:44:43.988Z","created_at_timestamp":1764557083988,"name":"Kem Matcha","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":6003,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_vQfQFta5UdBpn9KzyItRr","price":0,"original_price":0,"prices":[],"stock":998,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_ys_x93jxoF45IxkQdn1V5","updated_at":"2025-12-01T02:44:52.823Z","created_at":"2025-12-01T02:44:52.823Z","created_at_timestamp":1764557092823,"name":"Kem Khoai M\u00F4n","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":6004,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_vQfQFta5UdBpn9KzyItRr","price":0,"original_price":0,"prices":[],"stock":1000,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_X8sPo6TuUmiyWKUMIt2En","updated_at":"2025-12-01T02:39:12.571Z","created_at":"2025-12-01T02:39:12.571Z","created_at_timestamp":1764556752571,"name":"H\u1EA1t Sen","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":7001,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_UH7jvReaP3k2tyuMUWAm_","price":20000,"original_price":0,"prices":[],"stock":1000,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_NP_ELMackBiRKt4zUJuYm","updated_at":"2025-12-01T02:39:22.344Z","created_at":"2025-12-01T02:39:22.344Z","created_at_timestamp":1764556762344,"name":"Tr\u00E2n Ch\u00E2u Tr\u1EAFng","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":7002,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_UH7jvReaP3k2tyuMUWAm_","price":10000,"original_price":0,"prices":[],"stock":1000,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_Pv_E-aBfwnFUDobeVZQrj","updated_at":"2025-12-01T02:39:29.101Z","created_at":"2025-12-01T02:39:29.101Z","created_at_timestamp":1764556769101,"name":"Tr\u00E2n Ch\u00E2u \u0110\u01B0\u1EDDng \u0110en","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":7003,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_UH7jvReaP3k2tyuMUWAm_","price":10000,"original_price":0,"prices":[],"stock":1000,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_srhIckzDJzrX_ngNlzWEi","updated_at":"2025-12-01T02:39:38.616Z","created_at":"2025-12-01T02:39:38.616Z","created_at_timestamp":1764556778617,"name":"Th\u1EA1ch Chanh V\u00E0ng","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":7004,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_UH7jvReaP3k2tyuMUWAm_","price":10000,"original_price":0,"prices":[],"stock":999,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_tAxh_GII-A9nxPYQQ7pXH","updated_at":"2025-12-01T02:39:46.145Z","created_at":"2025-12-01T02:39:46.145Z","created_at_timestamp":1764556786145,"name":"Th\u1EA1ch Nha \u0110am","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":7005,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_UH7jvReaP3k2tyuMUWAm_","price":10000,"original_price":0,"prices":[],"stock":1000,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_DfzW0yeeEDGjfLPDyMDP9","updated_at":"2025-12-01T02:39:52.931Z","created_at":"2025-12-01T02:39:52.931Z","created_at_timestamp":1764556792931,"name":"B\u00E1nh L\u1ECDt","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":7006,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_UH7jvReaP3k2tyuMUWAm_","price":10000,"original_price":0,"prices":[],"stock":1000,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_dSHn36b5-UNatGPAXTA7-","updated_at":"2025-12-01T02:40:01.345Z","created_at":"2025-12-01T02:40:01.345Z","created_at_timestamp":1764556801345,"name":"Kh\u00FAc B\u1EA1ch","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":7007,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_UH7jvReaP3k2tyuMUWAm_","price":15000,"original_price":0,"prices":[],"stock":999,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_JwZio9Uv3BpOwQeDUgJt1","updated_at":"2025-12-01T02:40:11.646Z","created_at":"2025-12-01T02:40:11.646Z","created_at_timestamp":1764556811646,"name":"Nh\u00E3n Ng\u00E2m","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":7008,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_UH7jvReaP3k2tyuMUWAm_","price":20000,"original_price":0,"prices":[],"stock":1000,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},{"uid":"iod_mmjGhQEIMoIT_v2Aopqre","updated_at":"2025-12-01T02:40:22.943Z","created_at":"2025-12-01T02:40:22.943Z","created_at_timestamp":1764556822943,"name":"\u0110\u00E0o Mi\u1EBFng","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":7009,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_UH7jvReaP3k2tyuMUWAm_","price":20000,"original_price":0,"prices":[],"stock":1000,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""}],"print_template_uid":""},"point":0,"point_subtotal":0,"up_size":false,"is_take_out":false,"is_duplicate":false,"is_combo":false,"is_combo_item":false,"combo_group_uid":"","combo_line_uid":"","modifiers":[{"item_uid":"iod_gJcG8TTG20hD9BQLWCQGZ","item":{"uid":"iod_gJcG8TTG20hD9BQLWCQGZ","updated_at":"2025-11-30T07:57:15.527Z","created_at":"2025-11-30T07:57:15.527Z","created_at_timestamp":1764489435527,"name":"100%","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":3004,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_MA0C7z9B2GHEAplgfMSFc","price":0,"original_price":0,"prices":[],"stock":975,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":""},"price":0,"unit_of_measure":"quantity","quantity":1,"sent":0,"is_cancel_printed":false,"selected":false,"sales_user_uid":""},{"item_uid":"iod_UfyyYSUwqyfa5Fek9guGA","item":{"uid":"iod_UfyyYSUwqyfa5Fek9guGA","updated_at":"2025-11-29T12:06:08.590Z","created_at":"2025-11-29T12:06:08.590Z","created_at_timestamp":1764417968590,"name":"100%","name_translations":{},"description_translations":{},"meta":{},"etc":{},"assets":{},"config":{"online_order_display_large_image":false},"is_internal":false,"color":"","icon":"","sequence":4005,"image_url":"","image_file_path":"","image_thumbnail_url":"","image_thumbnail_file_path":"","visibility":[],"sku":"","type":"modifier","barcode":"","category_uid":"imc_5TG1isS3rDcW-TtE9mPvP","price":0,"original_price":0,"prices":[],"stock":978,"print_on_receipt":true,"price_adjustable":false,"is_sold_out":false,"recipe":"T01"},"price":0,"unit_of_measure":"quantity","quantity":1,"sent":0,"is_cancel_printed":false,"selected":false,"sales_user_uid":""}],"duplicated_from_uid":"","sent":1,"is_cancel_printed":false,"selected":false,"sales_user_uid":"","meta":{}}],"deleted_lines":[],"payment_has_cash":false,"payments":[{"uid":"pay_rqbYCVJ0tM9YqEtBBGGFg","updated_at":"2026-02-14T12:32:38.646Z","created_at":"2026-02-14T12:32:38.646Z","created_at_timestamp":1771072358646,"invoice_uid":"inv_iWcYcdv1YNoZC0aGwQxj5","tender_amount":70000,"change_amount":0,"payment_method_uid":"pmd_w5xPnDgpTeU2qufEmt9qz","payment_method_code":"ZALO","payment_method_name":"Zalo Pay","payment_method":{"uid":"pmd_w5xPnDgpTeU2qufEmt9qz","updated_at":"2026-01-24T15:20:40.450Z","created_at":"2025-11-25T06:02:37.244Z","created_at_timestamp":1764050557244,"deleted_at":null,"name":"Zalo Pay","name_translations":{},"sequence":0,"payment_currency_id":0,"currency_code":"","currency_symbol":"$","payment_method_code":"ZALO","codename":"","name_abbrev":"","enable_drawer":false,"enable_receipt":true,"image_url":"https://revopos-cdn.sgp1.digitaloceanspaces.com/4d49a465-47bb-44ca-8cdc-59f58c40e0cf.png","is_cash":false,"is_integrated":true,"is_disabled":false,"type":0,"api_id":"","api_key":"","is_sales_exclusive":false,"id_in_server":6742,"_timestamp":1768964152742600,"custom_image_url":"","enable_credit_validation":false,"enable_customer_validation":false,"is_cancellable":false},"payment_method_history":{"uid":"pmd_w5xPnDgpTeU2qufEmt9qz","updated_at":"2026-01-24T15:20:40.450Z","created_at":"2025-11-25T06:02:37.244Z","created_at_timestamp":1764050557244,"deleted_at":null,"name":"Zalo Pay","name_translations":{},"sequence":0,"payment_currency_id":0,"currency_code":"","currency_symbol":"$","payment_method_code":"ZALO","codename":"","name_abbrev":"","enable_drawer":false,"enable_receipt":true,"image_url":"https://revopos-cdn.sgp1.digitaloceanspaces.com/4d49a465-47bb-44ca-8cdc-59f58c40e0cf.png","is_cash":false,"is_integrated":true,"is_disabled":false,"type":0,"api_id":"","api_key":"","is_sales_exclusive":false,"id_in_server":6742,"_timestamp":1768964152742600,"custom_image_url":"","enable_credit_validation":false,"enable_customer_validation":false,"is_cancellable":false,"changed_at":"2026-02-14T14:34:38.555Z"}}],"table_switch_id":0,"employee_uid":"emp_ux2a3RLr1KZDYuHz_B7AP","employee_name":"Hamster","receipt_print_override":false,"customer":{"id":0,"ref_id":"","image_url":"","stripe_token":"","stripe_customer_id":"","username":"","normalized_username":"","company":"","ic":"","display_name":"","full_name":"","birth_date":"","gender":"","address":"","postcode":"","note":"","language":"","time_zone":"","created_at":"2026-02-14T12:32:28.322Z","updated_at":"2026-02-14T12:32:28.322Z","license_ids":"","security_stamp":"","phone_number":"","license_id":0,"credit":0,"point":0,"transaction_total":0,"transaction_time":0,"user_group_id":0,"user_group_name":"","error":""},"is_duplicate":false,"kitchen_print_override":false,"otp":"","activities":[],"receipt_print_job_uid":"pjb_6AY0c1t9DYoqZfiglWruH","kitchen_print_job_uids":[["pjb_6lIIH_bLvO2QJJ701v4Hx"]],"label_print_job_uids":[["pjb_TEy4QwnyPiP_ryRMpMNNB"]],"charges":[],"is_charge_triggered":false,"meta":{"total_item_quantity":1},"price_lookup_key":"","id_in_server":252475,"_timestamp":1771079680743354}
package/dev/px-cli.md CHANGED
@@ -19,7 +19,6 @@ px/
19
19
  ├── .env.example
20
20
  ├── index.ts # entry point & router (cac)
21
21
  ├── http.ts # HTTP client with x-api-key auth
22
- ├── .changes.json # staged CUD changes (auto-generated)
23
22
  └── commands/
24
23
  ├── category.ts # Category CRUD (types: ICategory)
25
24
  └── product.ts # Product CRUD (types: IItem)
@@ -50,33 +49,32 @@ px category get --id 123
50
49
  px product get --id 456
51
50
  ```
52
51
 
53
- ### CUD — two-step workflow (stage → commit)
54
-
55
- CUD operations stage changes locally before applying to server.
56
-
57
- **Step 1: Stage changes** — fetches latest data, displays diff, saves to `.changes.json`
52
+ ### CUD — direct execution with dry-run
58
53
 
59
54
  ```bash
60
- # Add (shows new record fields)
55
+ # Add
61
56
  px category add --name "Drinks" --type product --color "#ff0000" --icon "🍹"
57
+ px category add --name "Drinks" --dry-run # preview only
62
58
 
63
- # Update (fetches current record, shows oldnew diff)
64
- # Pattern: GET → merge changes → PATCH
59
+ # Update (always fetches first: GET show diff PATCH)
65
60
  px category update --id 123 --name "Beverages"
66
- px product update --id 456 --price 6.00
61
+ px product update --id 456 --price 6.00 --dry-run # preview diff
67
62
 
68
- # Delete (fetches current record, shows record to be removed)
63
+ # Delete
69
64
  px category delete --id 123
70
- px product delete --id 456
65
+ px product delete --id 456 --dry-run # preview record to be removed
71
66
  ```
72
67
 
73
- **Step 2: Review & apply**
68
+ ### Update flow
74
69
 
75
- ```bash
76
- px status # show all staged changes
77
- px commit # apply all staged changes to server
78
- px reset # discard all staged changes
79
70
  ```
71
+ 1. GET /api/v5/merchants/{uid}/product/456
72
+ 2. Show diff:
73
+ - price: 5.00 → 6.00
74
+ 3. PATCH (or skip if --dry-run)
75
+ ```
76
+
77
+ `--dry-run` 和正常执行都会先 GET,区别只在是否发送 PATCH。
80
78
 
81
79
  ## API
82
80
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posx/core",
3
- "version": "5.5.396",
3
+ "version": "5.5.398",
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.396",
3
+ "version": "5.5.398",
4
4
  "description": "POSX core libraries",
5
5
  "type": "module",
6
6
  "main": "./build/index.js",
package/px/.env.example DELETED
@@ -1,3 +0,0 @@
1
- PX_BASE_URL=https://lite-dev.posx.ai
2
- PX_API_KEY=your_api_key
3
- PX_MERCHANT_UID=your_merchant_uid
@@ -1,47 +0,0 @@
1
- import { http } from '../http'
2
- import type { ICategory } from '../../src/types/product.type'
3
- import { QueryBuilder } from '@litepos/autoquery'
4
-
5
- const MODULE = 'categories'
6
- const METHOD = 'category'
7
-
8
- export async function list(opts: Record<string, string> = {}) {
9
- const builder = new QueryBuilder<ICategory>().includeTotal(true)
10
- for (const [key, value] of Object.entries(opts))
11
- builder.addRawParam(key, value)
12
- const data = await http.autoquery(MODULE, builder.build())
13
- console.log(JSON.stringify(data, null, 2))
14
- }
15
-
16
- export async function get(id: string) {
17
- if (!id) { console.error('--id is required'); return }
18
- const data = await http.get(`${MODULE}/${id}`) as ICategory
19
- console.log(JSON.stringify(data, null, 2))
20
- }
21
-
22
- export async function add(opts: Record<string, string>) {
23
- if (!opts.name) { console.error('--name is required'); return }
24
- const body: Partial<ICategory> = { name: opts.name }
25
- if (opts.type) body.type = opts.type as any
26
- if (opts.color) body.color = opts.color
27
- if (opts.icon) body.icon = opts.icon
28
- const data = await http.put(`${MODULE}/${METHOD}`, body)
29
- console.log(JSON.stringify(data, null, 2))
30
- }
31
-
32
- export async function update(id: string, opts: Record<string, string>) {
33
- if (!id) { console.error('--id is required'); return }
34
- const body: Partial<ICategory> = {}
35
- if (opts.name) body.name = opts.name
36
- if (opts.type) body.type = opts.type as any
37
- if (opts.color) body.color = opts.color
38
- if (opts.icon) body.icon = opts.icon
39
- const data = await http.patch(`${MODULE}/${id}`, body)
40
- console.log(JSON.stringify(data, null, 2))
41
- }
42
-
43
- export async function del(id: string) {
44
- if (!id) { console.error('--id is required'); return }
45
- const data = await http.del(`${MODULE}/${id}`)
46
- console.log(JSON.stringify(data, null, 2))
47
- }
@@ -1,51 +0,0 @@
1
- import { http } from '../http'
2
- import type { IItem } from '../../src/types/product.type'
3
- import { QueryBuilder } from '@litepos/autoquery'
4
-
5
- const MODULE = 'products'
6
- const METHOD = 'product'
7
-
8
- export async function list(opts: Record<string, string> = {}) {
9
- const builder = new QueryBuilder<IItem>().includeTotal(true)
10
- for (const [key, value] of Object.entries(opts))
11
- builder.addRawParam(key, value)
12
- const data = await http.autoquery(MODULE, builder.build())
13
- console.log(JSON.stringify(data, null, 2))
14
- }
15
-
16
- export async function get(id: string) {
17
- if (!id) { console.error('--id is required'); return }
18
- const data = await http.get(`${MODULE}/${id}`) as IItem
19
- console.log(JSON.stringify(data, null, 2))
20
- }
21
-
22
- export async function add(opts: Record<string, string>) {
23
- if (!opts.name) { console.error('--name is required'); return }
24
- const body: Partial<IItem> = { name: opts.name }
25
- if (opts.price) body.price = parseFloat(opts.price)
26
- if (opts.category_uid) body.category_uid = opts.category_uid
27
- if (opts.sku) body.sku = opts.sku
28
- if (opts.type) body.type = opts.type as any
29
- if (opts.barcode) body.barcode = opts.barcode
30
- const data = await http.put(`${MODULE}/${METHOD}`, body)
31
- console.log(JSON.stringify(data, null, 2))
32
- }
33
-
34
- export async function update(id: string, opts: Record<string, string>) {
35
- if (!id) { console.error('--id is required'); return }
36
- const body: Partial<IItem> = {}
37
- if (opts.name) body.name = opts.name
38
- if (opts.price) body.price = parseFloat(opts.price)
39
- if (opts.category_uid) body.category_uid = opts.category_uid
40
- if (opts.sku) body.sku = opts.sku
41
- if (opts.type) body.type = opts.type as any
42
- if (opts.barcode) body.barcode = opts.barcode
43
- const data = await http.patch(`${MODULE}/${id}`, body)
44
- console.log(JSON.stringify(data, null, 2))
45
- }
46
-
47
- export async function del(id: string) {
48
- if (!id) { console.error('--id is required'); return }
49
- const data = await http.del(`${MODULE}/${id}`)
50
- console.log(JSON.stringify(data, null, 2))
51
- }
package/px/http.ts DELETED
@@ -1,40 +0,0 @@
1
- import type { IServiceOptions } from '../src/types/misc.type'
2
-
3
- const BASE_URL = process.env.PX_BASE_URL || 'https://lite-dev.posx.ai'
4
- const API_KEY = process.env.PX_API_KEY || ''
5
- const MERCHANT_UID = process.env.PX_MERCHANT_UID || ''
6
-
7
- if (!API_KEY) { console.error('PX_API_KEY is required'); process.exit(1) }
8
- if (!MERCHANT_UID) { console.error('PX_MERCHANT_UID is required'); process.exit(1) }
9
-
10
- export const options: Pick<IServiceOptions, 'base_url' | 'merchant_uid'> = {
11
- base_url: BASE_URL,
12
- merchant_uid: MERCHANT_UID,
13
- }
14
-
15
- const headers = { 'x-api-key': API_KEY, 'Content-Type': 'application/json' }
16
- const base = `${BASE_URL}/api/v5/merchants/${MERCHANT_UID}`
17
- const sapiBase = `${BASE_URL}/sapi/v5/merchants/${MERCHANT_UID}`
18
-
19
- async function request(method: string, url: string, body?: any) {
20
- const res = await fetch(url, {
21
- method,
22
- headers,
23
- body: body ? JSON.stringify(body) : undefined,
24
- })
25
- const data = await res.json()
26
- if (!res.ok) throw new Error(`${res.status}: ${JSON.stringify(data)}`)
27
- return data
28
- }
29
-
30
- export const http = {
31
- get: (path: string) => request('GET', `${base}/${path}`),
32
- put: (path: string, body: any) => request('PUT', `${base}/${path}`, body),
33
- patch: (path: string, body: any) => request('PATCH', `${base}/${path}`, body),
34
- del: (path: string) => request('DELETE', `${base}/${path}`),
35
- // AutoQuery endpoint using sapi base
36
- autoquery: (path: string, params: Record<string, string>) => {
37
- const qs = new URLSearchParams(params).toString()
38
- return request('GET', `${sapiBase}/${path}${qs ? `?${qs}` : ''}`)
39
- },
40
- }
package/px/index.ts DELETED
@@ -1,35 +0,0 @@
1
- import * as category from './commands/category'
2
- import * as product from './commands/product'
3
-
4
- const args = process.argv.slice(2)
5
- const entity = args[0]
6
- const action = args[1]
7
-
8
- // Parse --key value pairs into an object
9
- function parseOpts(args: string[]): Record<string, string> {
10
- const opts: Record<string, string> = {}
11
- for (let i = 2; i < args.length; i += 2)
12
- if (args[i]?.startsWith('--')) opts[args[i].slice(2)] = args[i + 1] || ''
13
- return opts
14
- }
15
-
16
- const opts = parseOpts(args)
17
- const commands: Record<string, Record<string, any>> = { category, product }
18
- const ACTIONS = ['list', 'get', 'add', 'update', 'delete']
19
-
20
- if (!entity || !commands[entity]) {
21
- console.log('Usage: bun px/index.ts <category|product> <list|get|add|update|delete> [--key value ...]')
22
- process.exit(1)
23
- }
24
- if (!action || !ACTIONS.includes(action)) {
25
- console.log(`Actions: ${ACTIONS.join(', ')}`)
26
- process.exit(1)
27
- }
28
-
29
- const mod = commands[entity]
30
- const fn = action === 'delete' ? 'del' : action
31
-
32
- if (fn === 'get' || fn === 'del') mod[fn](opts.id)
33
- else if (fn === 'update') mod[fn](opts.id, opts)
34
- else if (fn === 'add') mod[fn](opts)
35
- else mod[fn](opts)