@tabres/react 1.0.36 → 1.0.38
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/dist/components/PublicMenu/Customer/UnregisteredContact/UnregisteredContact.d.ts +2 -0
- package/dist/components/PublicMenu/Customer/UnregisteredContact/index.d.ts +1 -0
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/models/index.esm.js.map +1 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/modules/customer/hooks.d.ts +1 -0
- package/dist/models/modules/order/hooks.d.ts +3 -1
- package/dist/models/modules/order/models.d.ts +40 -0
- package/dist/models/modules/order/services.d.ts +5 -1
- package/dist/models/modules/order/utils.d.ts +2 -1
- package/dist/models/services/translation/locales/az/customer.d.ts +5 -0
- package/dist/models/services/translation/locales/az/index.d.ts +5 -0
- package/dist/models/services/translation/locales/es/customer.d.ts +5 -0
- package/dist/models/services/translation/locales/es/index.d.ts +5 -0
- package/dist/models/services/translation/locales/et/customer.d.ts +5 -0
- package/dist/models/services/translation/locales/et/index.d.ts +5 -0
- package/dist/models/services/translation/locales/hr/customer.d.ts +5 -0
- package/dist/models/services/translation/locales/hr/index.d.ts +5 -0
- package/dist/models/services/translation/locales/index.d.ts +45 -0
- package/dist/models/services/translation/locales/nl/customer.d.ts +5 -0
- package/dist/models/services/translation/locales/nl/index.d.ts +5 -0
- package/dist/models/services/translation/locales/pl/customer.d.ts +5 -0
- package/dist/models/services/translation/locales/pl/index.d.ts +5 -0
- package/dist/models/services/translation/locales/pt/customer.d.ts +5 -0
- package/dist/models/services/translation/locales/pt/index.d.ts +5 -0
- package/dist/models/services/translation/locales/ru/customer.d.ts +5 -0
- package/dist/models/services/translation/locales/ru/index.d.ts +5 -0
- package/dist/models/services/translation/locales/tr/customer.d.ts +5 -0
- package/dist/models/services/translation/locales/tr/index.d.ts +5 -0
- package/dist/models/store/order.d.ts +2 -0
- package/dist/modules/customer/hooks.d.ts +1 -0
- package/dist/modules/menu/hooks.test.d.ts +1 -0
- package/dist/modules/order/hooks.d.ts +3 -1
- package/dist/modules/order/models.d.ts +40 -0
- package/dist/modules/order/services.d.ts +5 -1
- package/dist/modules/order/services.test.d.ts +1 -0
- package/dist/modules/order/utils.d.ts +2 -1
- package/dist/services/translation/locales/az/customer.d.ts +5 -0
- package/dist/services/translation/locales/az/index.d.ts +5 -0
- package/dist/services/translation/locales/es/customer.d.ts +5 -0
- package/dist/services/translation/locales/es/index.d.ts +5 -0
- package/dist/services/translation/locales/et/customer.d.ts +5 -0
- package/dist/services/translation/locales/et/index.d.ts +5 -0
- package/dist/services/translation/locales/hr/customer.d.ts +5 -0
- package/dist/services/translation/locales/hr/index.d.ts +5 -0
- package/dist/services/translation/locales/index.d.ts +45 -0
- package/dist/services/translation/locales/nl/customer.d.ts +5 -0
- package/dist/services/translation/locales/nl/index.d.ts +5 -0
- package/dist/services/translation/locales/pl/customer.d.ts +5 -0
- package/dist/services/translation/locales/pl/index.d.ts +5 -0
- package/dist/services/translation/locales/pt/customer.d.ts +5 -0
- package/dist/services/translation/locales/pt/index.d.ts +5 -0
- package/dist/services/translation/locales/ru/customer.d.ts +5 -0
- package/dist/services/translation/locales/ru/index.d.ts +5 -0
- package/dist/services/translation/locales/tr/customer.d.ts +5 -0
- package/dist/services/translation/locales/tr/index.d.ts +5 -0
- package/dist/store/order.d.ts +2 -0
- package/dist/styles/ui.css +1 -1
- package/dist/styles/ui.css.map +1 -1
- package/dist/utils/index.esm.js +1 -1
- package/dist/utils/index.esm.js.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/modules/customer/hooks.d.ts +1 -0
- package/dist/utils/modules/order/hooks.d.ts +3 -1
- package/dist/utils/modules/order/models.d.ts +40 -0
- package/dist/utils/modules/order/services.d.ts +5 -1
- package/dist/utils/modules/order/utils.d.ts +2 -1
- package/dist/utils/services/translation/locales/az/customer.d.ts +5 -0
- package/dist/utils/services/translation/locales/az/index.d.ts +5 -0
- package/dist/utils/services/translation/locales/es/customer.d.ts +5 -0
- package/dist/utils/services/translation/locales/es/index.d.ts +5 -0
- package/dist/utils/services/translation/locales/et/customer.d.ts +5 -0
- package/dist/utils/services/translation/locales/et/index.d.ts +5 -0
- package/dist/utils/services/translation/locales/hr/customer.d.ts +5 -0
- package/dist/utils/services/translation/locales/hr/index.d.ts +5 -0
- package/dist/utils/services/translation/locales/index.d.ts +45 -0
- package/dist/utils/services/translation/locales/nl/customer.d.ts +5 -0
- package/dist/utils/services/translation/locales/nl/index.d.ts +5 -0
- package/dist/utils/services/translation/locales/pl/customer.d.ts +5 -0
- package/dist/utils/services/translation/locales/pl/index.d.ts +5 -0
- package/dist/utils/services/translation/locales/pt/customer.d.ts +5 -0
- package/dist/utils/services/translation/locales/pt/index.d.ts +5 -0
- package/dist/utils/services/translation/locales/ru/customer.d.ts +5 -0
- package/dist/utils/services/translation/locales/ru/index.d.ts +5 -0
- package/dist/utils/services/translation/locales/tr/customer.d.ts +5 -0
- package/dist/utils/services/translation/locales/tr/index.d.ts +5 -0
- package/dist/utils/store/order.d.ts +2 -0
- package/package.json +1 -1
package/dist/utils/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var E=require("@sorocraft/js-utils"),e=require("@sorocraft/ui/icons");var r,t;!function(E){E.LIST="list",E.GRID="grid"}(r||(r={})),function(E){E.PIECE="PIECE",E.WEIGHT="WEIGHT",E.VOLUME="VOLUME"}(t||(t={}));const A=E=>{var e,r;return null!==(r=null!==(e=null==E?void 0:E.listingPrice)&&void 0!==e?e:null==E?void 0:E.price)&&void 0!==r?r:0};var _;!function(E){E.SINGLE="SINGLE",E.MULTIPLE="MULTIPLE"}(_||(_={}));const T=(E,e={})=>{let r=0;for(const t of(null==E?void 0:E.addons)||[]){const{id:E,selectType:T,options:R}=t;if(!Object.prototype.hasOwnProperty.call(e,E))continue;const I=e[E],n=T===_.SINGLE?[I]:I||[];for(const E of n){const e=(R||[]).find(({id:e})=>e===E);e&&(r+=A(e))}}return r};var R,I,n,o,D,i;!function(E){E.DINE_IN="DINE_IN",E.PICK_UP="PICK_UP",E.DELIVERY="DELIVERY"}(R||(R={})),function(E){E.DRAFT="DRAFT",E.PENDING="PENDING",E.CONFIRMED="CONFIRMED",E.PREPARING="PREPARING",E.READY="READY",E.OUT_FOR_DELIVERY="OUT_FOR_DELIVERY",E.DELIVERED="DELIVERED",E.COMPLETED="COMPLETED",E.CANCELLED="CANCELLED",E.FAILED="FAILED"}(I||(I={})),function(E){E.PENDING="PENDING",E.PREPARING="PREPARING",E.READY="READY",E.SERVED="SERVED"}(n||(n={})),function(E){E.CASH="CASH",E.CARD="CARD",E.WALLET="WALLET",E.TERMINAL="TERMINAL"}(o||(o={})),function(E){E.CART="CART",E.DETAILS="DETAILS",E.COMPLETED="COMPLETED"}(D||(D={})),o.CASH,D.CART,D.DETAILS,D.COMPLETED,function(E){E.FIELD_REQUIRED_ERROR="This field is required",E.TABLE_NOT_SELECTED="Please select a table",E.ADDRESS_IS_EMPTY="Please enter an address",E.EMPTY_ITEMS="Please choose product",E.BRANCH_NOT_SELECTED="Please select a branch"}(i||(i={}));const s=E=>{var e,r;const{price:t,variant:A,addons:_,quantity:T}=E||{},R=null!==(r=null!==(e=null==A?void 0:A.price)&&void 0!==e?e:t)&&void 0!==r?r:0,I=(_||[]).reduce((E,e)=>E+((null==e?void 0:e.options)||[]).reduce((E,e)=>{var r;return E+(null!==(r=null==e?void 0:e.price)&&void 0!==r?r:0)},0),0);return(R+I)*(null!=T?T:1)};var N,a;!function(E){E.PHONE="PHONE",E.OTP="OTP",E.EMAIL="EMAIL"}(N||(N={})),function(E){E.HOME="HOME",E.WORK="WORK",E.TRAVEL="TRAVEL"}(a||(a={}));var S,O;!function(E){E.UPLOAD_VIDEO="UPLOAD_VIDEO"}(S||(S={})),function(E){E.ALPHA="ALPHA",E.BETA="BETA",E.ALL="ALL"}(O||(O={}));const l={[O.ALPHA]:[S.UPLOAD_VIDEO],[O.BETA]:[],[O.ALL]:[]},C="tabres.com",P="https://images.tabres.com",u={994:E=>{const e=["50","51","10","55","99","70","77","60"];return new RegExp(`^(${e.join("|")})\\d{7}$`).test(E)?{isValid:!0}:{isValid:!1,error:`Azerbaijani numbers must be 9 digits and start with ${e.join(", ")}`}},31:E=>/^\d{9}$/.test(E)?{isValid:!0}:{isValid:!1,error:"Dutch numbers must be exactly 9 digits"}};const c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",U=(E,e,r)=>c.charAt(E>>2)+c.charAt((3&E)<<4|e>>4)+c.charAt((15&e)<<2|r>>6)+c.charAt(63&r),d=(E,e)=>{var r,t;return(null===(t=null===(r=null==E?void 0:E.translations)||void 0===r?void 0:r.find)||void 0===t?void 0:t.call(r,E=>E.language===e))||{}};var L,V;!function(E){E.VIEW_BUSINESS="VIEW_BUSINESS",E.UPDATE_BUSINESS="UPDATE_BUSINESS",E.VIEW_BUSINESS_FINANCIALS="VIEW_BUSINESS_FINANCIALS",E.VIEW_ORDERS="VIEW_ORDERS",E.UPDATE_ORDER="UPDATE_ORDER",E.CREATE_ORDER="CREATE_ORDER",E.APPLY_DISCOUNT="APPLY_DISCOUNT",E.VIEW_QR_MENU="VIEW_QR_MENU",E.UPDATE_QR_MENU="UPDATE_QR_MENU",E.VIEW_MENU="VIEW_MENU",E.VIEW_MENU_ITEMS="VIEW_MENU_ITEMS",E.CREATE_MENU_ITEM="CREATE_MENU_ITEM",E.UPDATE_MENU_ITEM="UPDATE_MENU_ITEM",E.DELETE_MENU_ITEM="DELETE_MENU_ITEM",E.VIEW_CATEGORIES="VIEW_CATEGORIES",E.UPDATE_CATEGORY="UPDATE_CATEGORY",E.CREATE_CATEGORY="CREATE_CATEGORY",E.DELETE_CATEGORY="DELETE_CATEGORY",E.VIEW_ADDONS="VIEW_ADDONS",E.UPDATE_ADDON="UPDATE_ADDON",E.CREATE_ADDON="CREATE_ADDON",E.DELETE_ADDON="DELETE_ADDON",E.VIEW_TABLES="VIEW_TABLES",E.UPDATE_TABLE="UPDATE_TABLE",E.UPDATE_TABLE_STATUS="UPDATE_TABLE_STATUS",E.CREATE_TABLE="CREATE_TABLE",E.DELETE_TABLE="DELETE_TABLE",E.VIEW_BRANCHES="VIEW_BRANCHES",E.UPDATE_BRANCH="UPDATE_BRANCH",E.CREATE_BRANCH="CREATE_BRANCH",E.DELETE_BRANCH="DELETE_BRANCH",E.VIEW_EMPLOYEES="VIEW_EMPLOYEES",E.UPDATE_EMPLOYEE="UPDATE_EMPLOYEE",E.CREATE_EMPLOYEE="CREATE_EMPLOYEE",E.DELETE_EMPLOYEE="DELETE_EMPLOYEE",E.VIEW_ANALYTICS="VIEW_ANALYTICS",E.VIEW_SALES_REPORTS="VIEW_SALES_REPORTS",E.VIEW_SUBSCRIPTION="VIEW_SUBSCRIPTION",E.UPDATE_SUBSCRIPTION="UPDATE_SUBSCRIPTION",E.VIEW_QR_CODES="VIEW_QR_CODES",E.CREATE_QR_CODE="CREATE_QR_CODE",E.DELETE_QR_CODE="DELETE_QR_CODE",E.ALL="ALL",E.VIEW_INVENTORY="VIEW_INVENTORY",E.VIEW_PURCHASES="VIEW_PURCHASES",E.VIEW_PURCHASE_DETAIL="VIEW_PURCHASE_DETAIL",E.CREATE_PURCHASE="CREATE_PURCHASE",E.UPDATE_PURCHASE="UPDATE_PURCHASE",E.DELETE_PURCHASE="DELETE_PURCHASE",E.VIEW_INVENTORY_PRODUCTS="VIEW_INVENTORY_PRODUCTS",E.CREATE_INVENTORY_PRODUCT="CREATE_INVENTORY_PRODUCT",E.UPDATE_INVENTORY_PRODUCT="UPDATE_INVENTORY_PRODUCT",E.DELETE_INVENTORY_PRODUCT="DELETE_INVENTORY_PRODUCT",E.VIEW_BUSINESS_BALANCE="VIEW_BUSINESS_BALANCE",E.VIEW_BRANCH_BALANCE="VIEW_BRANCH_BALANCE",E.UPDATE_PRODUCT_INGREDIENTS="UPDATE_PRODUCT_INGREDIENTS",E.DELETE_PRODUCT_INGREDIENTS="DELETE_PRODUCT_INGREDIENTS",E.AI_ASSISTANT="AI_ASSISTANT",E.VIEW_PAYMENTS="VIEW_PAYMENTS",E.TAKE_PAYMENT="TAKE_PAYMENT",E.REFUND_PAYMENT="REFUND_PAYMENT",E.PAYMENT_COMP="COMP"}(L||(L={})),function(E){E.OWNER="OWNER",E.BRANCH_MANAGER="BRANCH_MANAGER",E.GENERAL_MANAGER="GENERAL_MANAGER",E.CHEF="CHEF",E.SOUS_CHEF="SOUS_CHEF",E.PASTRY_CHEF="PASTRY_CHEF",E.LINE_COOK="LINE_COOK",E.PREP_COOK="PREP_COOK",E.KITCHEN_ASSISTANT="KITCHEN_ASSISTANT",E.DISHWASHER="DISHWASHER",E.HEAD_WAITER="HEAD_WAITER",E.WAITER="WAITER",E.RUNNER="RUNNER",E.BARISTA="BARISTA",E.BARTENDER="BARTENDER",E.SOMMELIER="SOMMELIER",E.ACCOUNTANT="ACCOUNTANT",E.ROOM_SERVICE_STAFF="ROOM_SERVICE_STAFF",E.DELIVERY_DRIVER="DELIVERY_DRIVER",E.INVENTORY_MANAGER="INVENTORY_MANAGER",E.PURCHASING_MANAGER="PURCHASING_MANAGER",E.WAREHOUSE_STAFF="WAREHOUSE_STAFF",E.CASHIER="CASHIER"}(V||(V={}));exports.adjustLightness=(E,e)=>{const r=parseInt(E.replace("#",""),16),t=(r>>16&255)/255,A=(r>>8&255)/255,_=(255&r)/255,T=Math.max(t,A,_),R=Math.min(t,A,_),I=(T+R)/2;let n=0,o=0;if(T!==R){const E=T-R;switch(o=I>.5?E/(2-T-R):E/(T+R),T){case t:n=(A-_)/E+(A<_?6:0);break;case A:n=(_-t)/E+2;break;case _:n=(t-A)/E+4}n/=6}const D=Math.max(0,Math.min(1,I+e/100)),i=(E,e,r)=>(r<0&&(r+=1),r>1&&(r-=1),r<1/6?E+6*(e-E)*r:r<.5?e:r<2/3?E+(e-E)*(2/3-r)*6:E);let s=D,N=D,a=D;if(0!==o){const E=D<.5?D*(1+o):D+o-D*o,e=2*D-E;s=i(e,E,n+1/3),N=i(e,E,n),a=i(e,E,n-1/3)}const S=E=>Math.round(255*E).toString(16).padStart(2,"0");return`#${S(s)}${S(N)}${S(a)}`},exports.buildSelectedAddonsPayload=(e=[],r={})=>Object.entries(r).map(([r,t])=>{const A=Number(r),_=Array.isArray(t)?t:[t],T=e.find(E=>E.id===A);if(E.isEmpty(T))return{addonId:A,options:[]};const R=(T.options||[]).filter(E=>_.includes(E.id)).map(E=>{var e;return{optionId:E.id,price:null!==(e=E.listingPrice)&&void 0!==e?e:E.price}});return{addonId:A,options:R}}),exports.formatAddressLine=(E,e,r)=>[E,[e,r].filter(Boolean).join("/")].filter(Boolean).join(" "),exports.formatCityLine=E=>(E||[]).filter(Boolean).join(", "),exports.generateOrderItemsId=(e,r,t)=>{if(!e)throw new Error("Product ID is required");let A=`${e}`;r&&(A+=`-${r}`);const _=Object.entries(t||{}).map(([e,r])=>{if(!e||!r)return null;const t=Array.isArray(r)?E.sortNumbers(r).filter(Boolean).join("-"):`${r}`;return t?`${e}-${t}`:null}).filter(Boolean).join("-");return _&&(A+=`-${_}`),A},exports.getAddonOptionTranslation=(E,e)=>{var r;return(null===(r=null==E?void 0:E.title)||void 0===r?void 0:r[e])||""},exports.getAddonTitle=(E,e)=>{var r;return(null===(r=null==E?void 0:E.title)||void 0===r?void 0:r[e])||""},exports.getAddonTranslation=(E,e)=>{var r;return(null===(r=null==E?void 0:E.title)||void 0===r?void 0:r[e])||""},exports.getAllSelectedOptionsListingPrice=T,exports.getBaseUrl=(E,e)=>{const r=e||"en";return"localhost:3000"===E?{url:`http://localhost:3000/${r}`,domain:C}:{url:`https://${C}/${r}`,domain:C}},exports.getCategoryNameById=(e,r,t)=>{var A;const _=null===(A=null==r?void 0:r.find)||void 0===A?void 0:A.call(r,({id:E})=>E===e);if(E.isEmpty(_))return"";const{name:T}=d(_,t);return T||""},exports.getCategoryTranslation=d,exports.getCoverPhotoSource=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${P}/${E}`:"https://images.tabres.com/tabres-doodle.webp",exports.getDefaultOrderType=(E,e,r)=>{if(!E)return null;const{deliveryOrderEnabled:t,dineInOrderEnabled:A,pickupOrderEnabled:_}=E;return t&&r?R.DELIVERY:A&&e?R.DINE_IN:_&&e?R.PICK_UP:null},exports.getHasUserPermission=(e,r)=>!!E.isEmpty(e)||!E.isEmpty(r)&&(!!r.includes(L.ALL)||e.some(E=>r.includes(E))),exports.getImageSource=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${P}/${E}`:"",exports.getIsFeatureActive=(e,r)=>{if("1"===E.getQueryParam(e))return!0;return(r===O.ALPHA?[O.ALPHA,O.BETA,O.ALL]:r===O.BETA?[O.BETA,O.ALL]:[O.ALL]).some(E=>{var r;return null===(r=l[E])||void 0===r?void 0:r.includes(e)})},exports.getLogoImageSource=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${P}/${E}`:"https://images.tabres.com/no-photo-128.webp",exports.getOptionListingPrice=(e,r,t)=>{const _=A(e);return E.priceFormatter(_,r,t)},exports.getOptionTitles=(E,e,r)=>{var t;if(Array.isArray(e))return(E||[]).filter(({id:E})=>e.includes(E)).map(({title:E})=>(null==E?void 0:E[r])||"").filter(Boolean).join(", ");{const A=(E||[]).find(({id:E})=>E===e);return(null===(t=null==A?void 0:A.title)||void 0===t?void 0:t[r])||""}},exports.getOrderErrorMessages=E=>{switch(E){case"customer":return i.ADDRESS_IS_EMPTY;case"tableId":return i.TABLE_NOT_SELECTED;case"items":return i.EMPTY_ITEMS;case"branchId":return i.BRANCH_NOT_SELECTED;default:return i.FIELD_REQUIRED_ERROR}},exports.getOrderItemListingPrice=(e,r,t)=>{const A=s(e);return E.priceFormatter(A,r,t)},exports.getOrderItemListingRawPrice=s,exports.getPermissionsByRole=E=>{switch(E){case V.OWNER:return[L.ALL];case V.GENERAL_MANAGER:return[L.VIEW_BUSINESS,L.UPDATE_BUSINESS,L.VIEW_ORDERS,L.UPDATE_ORDER,L.CREATE_ORDER,L.VIEW_QR_MENU,L.VIEW_QR_CODES,L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.UPDATE_MENU_ITEM,L.CREATE_MENU_ITEM,L.DELETE_MENU_ITEM,L.VIEW_CATEGORIES,L.UPDATE_CATEGORY,L.CREATE_CATEGORY,L.DELETE_CATEGORY,L.VIEW_ADDONS,L.UPDATE_ADDON,L.CREATE_ADDON,L.DELETE_ADDON,L.VIEW_TABLES,L.UPDATE_TABLE,L.CREATE_TABLE,L.DELETE_TABLE,L.VIEW_BRANCHES,L.UPDATE_BRANCH,L.CREATE_BRANCH,L.DELETE_BRANCH,L.VIEW_EMPLOYEES,L.UPDATE_EMPLOYEE,L.CREATE_EMPLOYEE,L.DELETE_EMPLOYEE,L.VIEW_ANALYTICS,L.VIEW_SALES_REPORTS,L.VIEW_SUBSCRIPTION,L.CREATE_QR_CODE,L.DELETE_QR_CODE,L.AI_ASSISTANT];case V.BRANCH_MANAGER:return[L.VIEW_BUSINESS,L.VIEW_ORDERS,L.UPDATE_ORDER,L.CREATE_ORDER,L.VIEW_QR_MENU,L.VIEW_QR_CODES,L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.UPDATE_MENU_ITEM,L.CREATE_MENU_ITEM,L.DELETE_MENU_ITEM,L.VIEW_CATEGORIES,L.UPDATE_CATEGORY,L.CREATE_CATEGORY,L.DELETE_CATEGORY,L.VIEW_ADDONS,L.UPDATE_ADDON,L.CREATE_ADDON,L.DELETE_ADDON,L.VIEW_TABLES,L.UPDATE_TABLE,L.CREATE_TABLE,L.DELETE_TABLE,L.VIEW_EMPLOYEES,L.UPDATE_EMPLOYEE,L.VIEW_ANALYTICS,L.VIEW_SALES_REPORTS,L.CREATE_QR_CODE,L.DELETE_QR_CODE,L.AI_ASSISTANT];case V.CHEF:return[L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.UPDATE_MENU_ITEM,L.VIEW_CATEGORIES,L.UPDATE_CATEGORY,L.VIEW_ADDONS,L.UPDATE_ADDON,L.VIEW_ORDERS,L.UPDATE_ORDER];case V.SOUS_CHEF:return[L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.VIEW_CATEGORIES,L.VIEW_ADDONS,L.VIEW_ORDERS,L.UPDATE_ORDER];case V.PASTRY_CHEF:return[L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.UPDATE_MENU_ITEM,L.VIEW_ORDERS,L.UPDATE_ORDER];case V.LINE_COOK:case V.PREP_COOK:case V.KITCHEN_ASSISTANT:return[L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.VIEW_ORDERS,L.UPDATE_ORDER];case V.HEAD_WAITER:return[L.VIEW_ORDERS,L.CREATE_ORDER,L.UPDATE_ORDER,L.VIEW_TABLES,L.UPDATE_TABLE_STATUS,L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.VIEW_CATEGORIES,L.VIEW_ADDONS,L.VIEW_QR_MENU,L.VIEW_QR_CODES];case V.WAITER:return[L.VIEW_ORDERS,L.CREATE_ORDER,L.UPDATE_ORDER,L.VIEW_TABLES,L.UPDATE_TABLE_STATUS,L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.VIEW_CATEGORIES,L.VIEW_ADDONS];case V.RUNNER:return[L.VIEW_ORDERS,L.UPDATE_ORDER];case V.BARISTA:case V.BARTENDER:case V.SOMMELIER:case V.ROOM_SERVICE_STAFF:return[L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.VIEW_ORDERS,L.CREATE_ORDER,L.UPDATE_ORDER];case V.ACCOUNTANT:return[L.VIEW_ANALYTICS,L.VIEW_SALES_REPORTS,L.VIEW_SUBSCRIPTION];case V.DELIVERY_DRIVER:return[L.VIEW_ORDERS,L.UPDATE_ORDER];case V.INVENTORY_MANAGER:return[L.VIEW_CATEGORIES,L.UPDATE_CATEGORY,L.CREATE_CATEGORY,L.DELETE_CATEGORY,L.VIEW_ADDONS,L.UPDATE_ADDON,L.CREATE_ADDON,L.DELETE_ADDON,L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.UPDATE_MENU_ITEM,L.CREATE_MENU_ITEM,L.DELETE_MENU_ITEM,L.VIEW_PURCHASES,L.CREATE_PURCHASE,L.UPDATE_PURCHASE,L.DELETE_PURCHASE,L.VIEW_INVENTORY,L.VIEW_INVENTORY_PRODUCTS,L.CREATE_INVENTORY_PRODUCT,L.UPDATE_INVENTORY_PRODUCT,L.DELETE_INVENTORY_PRODUCT,L.VIEW_PURCHASE_DETAIL,L.VIEW_BRANCH_BALANCE,L.UPDATE_PRODUCT_INGREDIENTS,L.DELETE_PRODUCT_INGREDIENTS];case V.PURCHASING_MANAGER:return[L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.VIEW_CATEGORIES,L.CREATE_CATEGORY,L.UPDATE_CATEGORY,L.VIEW_ADDONS,L.CREATE_ADDON,L.UPDATE_ADDON];case V.WAREHOUSE_STAFF:return[L.VIEW_CATEGORIES,L.VIEW_ADDONS,L.VIEW_MENU,L.VIEW_MENU_ITEMS];default:return[]}},exports.getPriceSuffix=E=>{switch(E){case t.WEIGHT:return" / kg";case t.VOLUME:return" / l";default:return""}},exports.getProductAddon=(E,e)=>((null==E?void 0:E.addons)||[]).find(({id:E})=>E===e)||{},exports.getProductListingPrice=(e,r,t)=>{const _=A(e);return E.priceFormatter(_,r,t)},exports.getProductOrderPrice=({product:e,quantity:r,language:t,currency:_,variantId:R,selectedAddons:I})=>{if(!e||0===Object.keys(e).length)return E.priceFormatter(0,_,t);const n=R?(e.variants||[]).find(({id:E})=>E===R):void 0,o=(A(R?n:e)+T(e,I))*r;return E.priceFormatter(o,_,t)},exports.getProductSellUnitShortCuts=E=>{switch(E){case t.WEIGHT:return{"50gr":.05,"100gr":.1,"150gr":.15,"200gr":.2,"250gr":.25,"300gr":.3,"350gr":.35,"400gr":.4,"450gr":.45,"500gr":.5,"600gr":.6,"700gr":.7,"750gr":.75,"800gr":.8,"850gr":.85,"900gr":.9,"950gr":.95,"1kg":1,"2kg":2,"5kg":5,"10kg":10,"20kg":20};case t.VOLUME:return{"50ml":.05,"100ml":.1,"150ml":.15,"200ml":.2,"250ml":.25,"300ml":.3,"350ml":.35,"400ml":.4,"450ml":.45,"500ml":.5,"600ml":.6,"700ml":.7,"750ml":.75,"800ml":.8,"850ml":.85,"900ml":.9,"950ml":.95,"1l":1,"2l":2,"5l":5,"10l":10,"20l":20};default:return{}}},exports.getProductTranslation=(E,e)=>{var r;return(null===(r=null==E?void 0:E.translations)||void 0===r?void 0:r[e])||{}},exports.getProductVariant=(E,e)=>{var r,t;return(null===(t=null===(r=null==E?void 0:E.variants)||void 0===r?void 0:r.find)||void 0===t?void 0:t.call(r,E=>E.id===e))||{}},exports.getProductVariantTranslation=(E,e)=>{var r;return(null===(r=null==E?void 0:E.title)||void 0===r?void 0:r[e])||""},exports.getRegisterUrl=(E,e)=>`https://app.tabres.com/auth/register?lang=${E}&utm_source=${e}`,exports.getSelectedAddonsFromOrderItems=E=>{const e={};for(const{addonId:r,options:t=[]}of E.addons||[]){const E=t.map(({optionId:E})=>E);e[r]=1===E.length?E[0]:E}return e},exports.getStatusIcon=E=>{switch(E){case I.COMPLETED:return e.Check;case I.DELIVERED:return e.BagCheck;case I.OUT_FOR_DELIVERY:return e.Delivery;case I.PREPARING:return e.Chef;case I.CONFIRMED:return e.FileCheck;case I.PENDING:default:return e.HourglassHalf}},exports.getUnitListingPrice=A,exports.getVariantListingPrice=(e,r,t)=>{const _=A(e);return E.priceFormatter(_,r,t)},exports.getVideoSource=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${P}/${E}`:"",exports.isValidPreviewResponse=E=>{if(!E||"object"!=typeof E)return!1;const e=E;return"number"==typeof e.totalPriceWithoutTax&&"number"==typeof e.totalPriceWithTax&&"number"==typeof e.totalPriceWithTaxAndFees&&"number"==typeof e.totalTax&&"number"==typeof e.deliveryFee&&"number"==typeof e.serviceFee&&Array.isArray(e.items)&&Array.isArray(e.taxes)},exports.prepareCategoryAndProductMap=(E,e)=>{const r=e.reduce((E,e)=>{if(!e.visible)return E;const r=Number(e.categoryId);return E[r]||(E[r]=[]),E[r].push(e),E},{});return E.map(E=>Object.assign(Object.assign({},E),{products:r[Number(E.id)]||[]})).filter(E=>{var e;return(null===(e=null==E?void 0:E.products)||void 0===e?void 0:e.length)>0})},exports.preparePhoneNumber=E=>`${E.countryCode}${E.phoneNumber}`.replaceAll("+",""),exports.rgbDataURL=(E,e,r)=>`data:image/gif;base64,R0lGODlhAQABAPAA${U(0,E,e)+U(r,255,255)}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`,exports.validateAddressForm=E=>{const e={},{countryCode:r,cityName:t,street:A,houseNumber:_}=E||{};return r||(e.countryCode="COUNTRY_REQUIRED"),t||(e.cityName="CITY_REQUIRED"),A||(e.street="STREET_REQUIRED"),_||(e.houseNumber="STREET_NUMBER_REQUIRED"),e},exports.validateForm=(e,r)=>{const t={},{email:A,otp:_}=e||{};switch(r){case N.OTP:A&&E.checkIsValidEmail(A)||(t.email="Invalid Email Address"),_&&6===_.length||(t.otp="Invalid OTP");break;case N.EMAIL:A&&E.checkIsValidEmail(A)||(t.email="Invalid Email Address")}return t},exports.validatePhoneNumber=function(E){if(!E)return{isValid:!1,error:"FIELD_REQUIRED"};const e=E.replace(/\D/g,""),r=e.startsWith("994")?"994":e.startsWith("31")?"31":null;if(!r)return{isValid:!1,error:"Unsupported country code"};const t=e.slice(r.length);return(0,u[r])(t)};
|
|
1
|
+
"use strict";var E=require("@sorocraft/js-utils"),e=require("@sorocraft/ui/icons");var t,r;!function(E){E.LIST="list",E.GRID="grid"}(t||(t={})),function(E){E.PIECE="PIECE",E.WEIGHT="WEIGHT",E.VOLUME="VOLUME"}(r||(r={}));const A=E=>{var e,t;return null!==(t=null!==(e=null==E?void 0:E.listingPrice)&&void 0!==e?e:null==E?void 0:E.price)&&void 0!==t?t:0};var _;!function(E){E.SINGLE="SINGLE",E.MULTIPLE="MULTIPLE"}(_||(_={}));const T=(E,e={})=>{let t=0;for(const r of(null==E?void 0:E.addons)||[]){const{id:E,selectType:T,options:R}=r;if(!Object.prototype.hasOwnProperty.call(e,E))continue;const n=e[E],I=T===_.SINGLE?[n]:n||[];for(const E of I){const e=(R||[]).find(({id:e})=>e===E);e&&(t+=A(e))}}return t};var R,n,I,o,i,s;"function"==typeof SuppressedError&&SuppressedError,function(E){E.DINE_IN="DINE_IN",E.PICK_UP="PICK_UP",E.DELIVERY="DELIVERY"}(R||(R={})),function(E){E.DRAFT="DRAFT",E.PENDING="PENDING",E.CONFIRMED="CONFIRMED",E.PREPARING="PREPARING",E.READY="READY",E.OUT_FOR_DELIVERY="OUT_FOR_DELIVERY",E.DELIVERED="DELIVERED",E.COMPLETED="COMPLETED",E.CANCELLED="CANCELLED",E.FAILED="FAILED"}(n||(n={})),function(E){E.PENDING="PENDING",E.PREPARING="PREPARING",E.READY="READY",E.SERVED="SERVED"}(I||(I={})),function(E){E.CASH="CASH",E.CARD="CARD",E.WALLET="WALLET",E.TERMINAL="TERMINAL"}(o||(o={})),function(E){E.CART="CART",E.DETAILS="DETAILS",E.COMPLETED="COMPLETED"}(i||(i={})),o.CASH,i.CART,i.DETAILS,i.COMPLETED,function(E){E.FIELD_REQUIRED_ERROR="This field is required",E.TABLE_NOT_SELECTED="Please select a table",E.ADDRESS_IS_EMPTY="Please enter an address",E.EMPTY_ITEMS="Please choose product",E.BRANCH_NOT_SELECTED="Please select a branch"}(s||(s={}));const D=E=>{var e,t;const{price:r,variant:A,addons:_,quantity:T}=E||{},R=null!==(t=null!==(e=null==A?void 0:A.price)&&void 0!==e?e:r)&&void 0!==t?t:0,n=(_||[]).reduce((E,e)=>E+((null==e?void 0:e.options)||[]).reduce((E,e)=>{var t;return E+(null!==(t=null==e?void 0:e.price)&&void 0!==t?t:0)},0),0);return(R+n)*(null!=T?T:1)};var a,N;!function(E){E.PHONE="PHONE",E.OTP="OTP",E.EMAIL="EMAIL"}(a||(a={})),function(E){E.HOME="HOME",E.WORK="WORK",E.TRAVEL="TRAVEL"}(N||(N={}));var l,O;!function(E){E.UPLOAD_VIDEO="UPLOAD_VIDEO"}(l||(l={})),function(E){E.ALPHA="ALPHA",E.BETA="BETA",E.ALL="ALL"}(O||(O={}));const S={[O.ALPHA]:[l.UPLOAD_VIDEO],[O.BETA]:[],[O.ALL]:[]},u="tabres.com",c="https://images.tabres.com",C={994:E=>{const e=["50","51","10","55","99","70","77","60"];return new RegExp(`^(${e.join("|")})\\d{7}$`).test(E)?{isValid:!0}:{isValid:!1,error:`Azerbaijani numbers must be 9 digits and start with ${e.join(", ")}`}},31:E=>/^\d{9}$/.test(E)?{isValid:!0}:{isValid:!1,error:"Dutch numbers must be exactly 9 digits"}};const P="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",d=(E,e,t)=>P.charAt(E>>2)+P.charAt((3&E)<<4|e>>4)+P.charAt((15&e)<<2|t>>6)+P.charAt(63&t),U=(E,e)=>{var t,r;return(null===(r=null===(t=null==E?void 0:E.translations)||void 0===t?void 0:t.find)||void 0===r?void 0:r.call(t,E=>E.language===e))||{}};var L,V;!function(E){E.VIEW_BUSINESS="VIEW_BUSINESS",E.UPDATE_BUSINESS="UPDATE_BUSINESS",E.VIEW_BUSINESS_FINANCIALS="VIEW_BUSINESS_FINANCIALS",E.VIEW_ORDERS="VIEW_ORDERS",E.UPDATE_ORDER="UPDATE_ORDER",E.CREATE_ORDER="CREATE_ORDER",E.APPLY_DISCOUNT="APPLY_DISCOUNT",E.VIEW_QR_MENU="VIEW_QR_MENU",E.UPDATE_QR_MENU="UPDATE_QR_MENU",E.VIEW_MENU="VIEW_MENU",E.VIEW_MENU_ITEMS="VIEW_MENU_ITEMS",E.CREATE_MENU_ITEM="CREATE_MENU_ITEM",E.UPDATE_MENU_ITEM="UPDATE_MENU_ITEM",E.DELETE_MENU_ITEM="DELETE_MENU_ITEM",E.VIEW_CATEGORIES="VIEW_CATEGORIES",E.UPDATE_CATEGORY="UPDATE_CATEGORY",E.CREATE_CATEGORY="CREATE_CATEGORY",E.DELETE_CATEGORY="DELETE_CATEGORY",E.VIEW_ADDONS="VIEW_ADDONS",E.UPDATE_ADDON="UPDATE_ADDON",E.CREATE_ADDON="CREATE_ADDON",E.DELETE_ADDON="DELETE_ADDON",E.VIEW_TABLES="VIEW_TABLES",E.UPDATE_TABLE="UPDATE_TABLE",E.UPDATE_TABLE_STATUS="UPDATE_TABLE_STATUS",E.CREATE_TABLE="CREATE_TABLE",E.DELETE_TABLE="DELETE_TABLE",E.VIEW_BRANCHES="VIEW_BRANCHES",E.UPDATE_BRANCH="UPDATE_BRANCH",E.CREATE_BRANCH="CREATE_BRANCH",E.DELETE_BRANCH="DELETE_BRANCH",E.VIEW_EMPLOYEES="VIEW_EMPLOYEES",E.UPDATE_EMPLOYEE="UPDATE_EMPLOYEE",E.CREATE_EMPLOYEE="CREATE_EMPLOYEE",E.DELETE_EMPLOYEE="DELETE_EMPLOYEE",E.VIEW_ANALYTICS="VIEW_ANALYTICS",E.VIEW_SALES_REPORTS="VIEW_SALES_REPORTS",E.VIEW_SUBSCRIPTION="VIEW_SUBSCRIPTION",E.UPDATE_SUBSCRIPTION="UPDATE_SUBSCRIPTION",E.VIEW_QR_CODES="VIEW_QR_CODES",E.CREATE_QR_CODE="CREATE_QR_CODE",E.DELETE_QR_CODE="DELETE_QR_CODE",E.ALL="ALL",E.VIEW_INVENTORY="VIEW_INVENTORY",E.VIEW_PURCHASES="VIEW_PURCHASES",E.VIEW_PURCHASE_DETAIL="VIEW_PURCHASE_DETAIL",E.CREATE_PURCHASE="CREATE_PURCHASE",E.UPDATE_PURCHASE="UPDATE_PURCHASE",E.DELETE_PURCHASE="DELETE_PURCHASE",E.VIEW_INVENTORY_PRODUCTS="VIEW_INVENTORY_PRODUCTS",E.CREATE_INVENTORY_PRODUCT="CREATE_INVENTORY_PRODUCT",E.UPDATE_INVENTORY_PRODUCT="UPDATE_INVENTORY_PRODUCT",E.DELETE_INVENTORY_PRODUCT="DELETE_INVENTORY_PRODUCT",E.VIEW_BUSINESS_BALANCE="VIEW_BUSINESS_BALANCE",E.VIEW_BRANCH_BALANCE="VIEW_BRANCH_BALANCE",E.UPDATE_PRODUCT_INGREDIENTS="UPDATE_PRODUCT_INGREDIENTS",E.DELETE_PRODUCT_INGREDIENTS="DELETE_PRODUCT_INGREDIENTS",E.AI_ASSISTANT="AI_ASSISTANT",E.VIEW_PAYMENTS="VIEW_PAYMENTS",E.TAKE_PAYMENT="TAKE_PAYMENT",E.REFUND_PAYMENT="REFUND_PAYMENT",E.PAYMENT_COMP="COMP"}(L||(L={})),function(E){E.OWNER="OWNER",E.BRANCH_MANAGER="BRANCH_MANAGER",E.GENERAL_MANAGER="GENERAL_MANAGER",E.CHEF="CHEF",E.SOUS_CHEF="SOUS_CHEF",E.PASTRY_CHEF="PASTRY_CHEF",E.LINE_COOK="LINE_COOK",E.PREP_COOK="PREP_COOK",E.KITCHEN_ASSISTANT="KITCHEN_ASSISTANT",E.DISHWASHER="DISHWASHER",E.HEAD_WAITER="HEAD_WAITER",E.WAITER="WAITER",E.RUNNER="RUNNER",E.BARISTA="BARISTA",E.BARTENDER="BARTENDER",E.SOMMELIER="SOMMELIER",E.ACCOUNTANT="ACCOUNTANT",E.ROOM_SERVICE_STAFF="ROOM_SERVICE_STAFF",E.DELIVERY_DRIVER="DELIVERY_DRIVER",E.INVENTORY_MANAGER="INVENTORY_MANAGER",E.PURCHASING_MANAGER="PURCHASING_MANAGER",E.WAREHOUSE_STAFF="WAREHOUSE_STAFF",E.CASHIER="CASHIER"}(V||(V={}));exports.adjustLightness=(E,e)=>{const t=parseInt(E.replace("#",""),16),r=(t>>16&255)/255,A=(t>>8&255)/255,_=(255&t)/255,T=Math.max(r,A,_),R=Math.min(r,A,_),n=(T+R)/2;let I=0,o=0;if(T!==R){const E=T-R;switch(o=n>.5?E/(2-T-R):E/(T+R),T){case r:I=(A-_)/E+(A<_?6:0);break;case A:I=(_-r)/E+2;break;case _:I=(r-A)/E+4}I/=6}const i=Math.max(0,Math.min(1,n+e/100)),s=(E,e,t)=>(t<0&&(t+=1),t>1&&(t-=1),t<1/6?E+6*(e-E)*t:t<.5?e:t<2/3?E+(e-E)*(2/3-t)*6:E);let D=i,a=i,N=i;if(0!==o){const E=i<.5?i*(1+o):i+o-i*o,e=2*i-E;D=s(e,E,I+1/3),a=s(e,E,I),N=s(e,E,I-1/3)}const l=E=>Math.round(255*E).toString(16).padStart(2,"0");return`#${l(D)}${l(a)}${l(N)}`},exports.buildGuestContactRequest=e=>{if(E.isEmpty(e))return;const t=Object.entries(e).filter(([,E])=>null!=E&&""!==E);if(0===t.length)return;const r=Object.fromEntries(t),{latitude:A,longitude:_,floor:T}=r,R=function(E,e){var t={};for(var r in E)Object.prototype.hasOwnProperty.call(E,r)&&e.indexOf(r)<0&&(t[r]=E[r]);if(null!=E&&"function"==typeof Object.getOwnPropertySymbols){var A=0;for(r=Object.getOwnPropertySymbols(E);A<r.length;A++)e.indexOf(r[A])<0&&Object.prototype.propertyIsEnumerable.call(E,r[A])&&(t[r[A]]=E[r[A]])}return t}(r,["latitude","longitude","floor"]);return Object.assign(Object.assign(Object.assign(Object.assign({},R),null!=T?{floor:Number(T)}:{}),null!=A?{latitude:`${A}`}:{}),null!=_?{longitude:`${_}`}:{})},exports.buildSelectedAddonsPayload=(e=[],t={})=>Object.entries(t).map(([t,r])=>{const A=Number(t),_=Array.isArray(r)?r:[r],T=e.find(E=>E.id===A);if(E.isEmpty(T))return{addonId:A,options:[]};const R=(T.options||[]).filter(E=>_.includes(E.id)).map(E=>{var e;return{optionId:E.id,price:null!==(e=E.listingPrice)&&void 0!==e?e:E.price}});return{addonId:A,options:R}}),exports.formatAddressLine=(E,e,t)=>[E,[e,t].filter(Boolean).join("/")].filter(Boolean).join(" "),exports.formatCityLine=E=>(E||[]).filter(Boolean).join(", "),exports.generateOrderItemsId=(e,t,r)=>{if(!e)throw new Error("Product ID is required");let A=`${e}`;t&&(A+=`-${t}`);const _=Object.entries(r||{}).map(([e,t])=>{if(!e||!t)return null;const r=Array.isArray(t)?E.sortNumbers(t).filter(Boolean).join("-"):`${t}`;return r?`${e}-${r}`:null}).filter(Boolean).join("-");return _&&(A+=`-${_}`),A},exports.getAddonOptionTranslation=(E,e)=>{var t;return(null===(t=null==E?void 0:E.title)||void 0===t?void 0:t[e])||""},exports.getAddonTitle=(E,e)=>{var t;return(null===(t=null==E?void 0:E.title)||void 0===t?void 0:t[e])||""},exports.getAddonTranslation=(E,e)=>{var t;return(null===(t=null==E?void 0:E.title)||void 0===t?void 0:t[e])||""},exports.getAllSelectedOptionsListingPrice=T,exports.getBaseUrl=(E,e)=>{const t=e||"en";return"localhost:3000"===E?{url:`http://localhost:3000/${t}`,domain:u}:{url:`https://${u}/${t}`,domain:u}},exports.getCategoryNameById=(e,t,r)=>{var A;const _=null===(A=null==t?void 0:t.find)||void 0===A?void 0:A.call(t,({id:E})=>E===e);if(E.isEmpty(_))return"";const{name:T}=U(_,r);return T||""},exports.getCategoryTranslation=U,exports.getCoverPhotoSource=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${c}/${E}`:"https://images.tabres.com/tabres-doodle.webp",exports.getDefaultOrderType=(E,e,t)=>{if(!E)return null;const{deliveryOrderEnabled:r,dineInOrderEnabled:A,pickupOrderEnabled:_}=E;return r&&t?R.DELIVERY:A&&e?R.DINE_IN:_&&e?R.PICK_UP:null},exports.getHasUserPermission=(e,t)=>!!E.isEmpty(e)||!E.isEmpty(t)&&(!!t.includes(L.ALL)||e.some(E=>t.includes(E))),exports.getImageSource=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${c}/${E}`:"",exports.getIsFeatureActive=(e,t)=>{if("1"===E.getQueryParam(e))return!0;return(t===O.ALPHA?[O.ALPHA,O.BETA,O.ALL]:t===O.BETA?[O.BETA,O.ALL]:[O.ALL]).some(E=>{var t;return null===(t=S[E])||void 0===t?void 0:t.includes(e)})},exports.getLogoImageSource=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${c}/${E}`:"https://images.tabres.com/no-photo-128.webp",exports.getOptionListingPrice=(e,t,r)=>{const _=A(e);return E.priceFormatter(_,t,r)},exports.getOptionTitles=(E,e,t)=>{var r;if(Array.isArray(e))return(E||[]).filter(({id:E})=>e.includes(E)).map(({title:E})=>(null==E?void 0:E[t])||"").filter(Boolean).join(", ");{const A=(E||[]).find(({id:E})=>E===e);return(null===(r=null==A?void 0:A.title)||void 0===r?void 0:r[t])||""}},exports.getOrderErrorMessages=E=>{switch(E){case"customer":return s.ADDRESS_IS_EMPTY;case"tableId":return s.TABLE_NOT_SELECTED;case"items":return s.EMPTY_ITEMS;case"branchId":return s.BRANCH_NOT_SELECTED;default:return s.FIELD_REQUIRED_ERROR}},exports.getOrderItemListingPrice=(e,t,r)=>{const A=D(e);return E.priceFormatter(A,t,r)},exports.getOrderItemListingRawPrice=D,exports.getPermissionsByRole=E=>{switch(E){case V.OWNER:return[L.ALL];case V.GENERAL_MANAGER:return[L.VIEW_BUSINESS,L.UPDATE_BUSINESS,L.VIEW_ORDERS,L.UPDATE_ORDER,L.CREATE_ORDER,L.VIEW_QR_MENU,L.VIEW_QR_CODES,L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.UPDATE_MENU_ITEM,L.CREATE_MENU_ITEM,L.DELETE_MENU_ITEM,L.VIEW_CATEGORIES,L.UPDATE_CATEGORY,L.CREATE_CATEGORY,L.DELETE_CATEGORY,L.VIEW_ADDONS,L.UPDATE_ADDON,L.CREATE_ADDON,L.DELETE_ADDON,L.VIEW_TABLES,L.UPDATE_TABLE,L.CREATE_TABLE,L.DELETE_TABLE,L.VIEW_BRANCHES,L.UPDATE_BRANCH,L.CREATE_BRANCH,L.DELETE_BRANCH,L.VIEW_EMPLOYEES,L.UPDATE_EMPLOYEE,L.CREATE_EMPLOYEE,L.DELETE_EMPLOYEE,L.VIEW_ANALYTICS,L.VIEW_SALES_REPORTS,L.VIEW_SUBSCRIPTION,L.CREATE_QR_CODE,L.DELETE_QR_CODE,L.AI_ASSISTANT];case V.BRANCH_MANAGER:return[L.VIEW_BUSINESS,L.VIEW_ORDERS,L.UPDATE_ORDER,L.CREATE_ORDER,L.VIEW_QR_MENU,L.VIEW_QR_CODES,L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.UPDATE_MENU_ITEM,L.CREATE_MENU_ITEM,L.DELETE_MENU_ITEM,L.VIEW_CATEGORIES,L.UPDATE_CATEGORY,L.CREATE_CATEGORY,L.DELETE_CATEGORY,L.VIEW_ADDONS,L.UPDATE_ADDON,L.CREATE_ADDON,L.DELETE_ADDON,L.VIEW_TABLES,L.UPDATE_TABLE,L.CREATE_TABLE,L.DELETE_TABLE,L.VIEW_EMPLOYEES,L.UPDATE_EMPLOYEE,L.VIEW_ANALYTICS,L.VIEW_SALES_REPORTS,L.CREATE_QR_CODE,L.DELETE_QR_CODE,L.AI_ASSISTANT];case V.CHEF:return[L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.UPDATE_MENU_ITEM,L.VIEW_CATEGORIES,L.UPDATE_CATEGORY,L.VIEW_ADDONS,L.UPDATE_ADDON,L.VIEW_ORDERS,L.UPDATE_ORDER];case V.SOUS_CHEF:return[L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.VIEW_CATEGORIES,L.VIEW_ADDONS,L.VIEW_ORDERS,L.UPDATE_ORDER];case V.PASTRY_CHEF:return[L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.UPDATE_MENU_ITEM,L.VIEW_ORDERS,L.UPDATE_ORDER];case V.LINE_COOK:case V.PREP_COOK:case V.KITCHEN_ASSISTANT:return[L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.VIEW_ORDERS,L.UPDATE_ORDER];case V.HEAD_WAITER:return[L.VIEW_ORDERS,L.CREATE_ORDER,L.UPDATE_ORDER,L.VIEW_TABLES,L.UPDATE_TABLE_STATUS,L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.VIEW_CATEGORIES,L.VIEW_ADDONS,L.VIEW_QR_MENU,L.VIEW_QR_CODES];case V.WAITER:return[L.VIEW_ORDERS,L.CREATE_ORDER,L.UPDATE_ORDER,L.VIEW_TABLES,L.UPDATE_TABLE_STATUS,L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.VIEW_CATEGORIES,L.VIEW_ADDONS];case V.RUNNER:return[L.VIEW_ORDERS,L.UPDATE_ORDER];case V.BARISTA:case V.BARTENDER:case V.SOMMELIER:case V.ROOM_SERVICE_STAFF:return[L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.VIEW_ORDERS,L.CREATE_ORDER,L.UPDATE_ORDER];case V.ACCOUNTANT:return[L.VIEW_ANALYTICS,L.VIEW_SALES_REPORTS,L.VIEW_SUBSCRIPTION];case V.DELIVERY_DRIVER:return[L.VIEW_ORDERS,L.UPDATE_ORDER];case V.INVENTORY_MANAGER:return[L.VIEW_CATEGORIES,L.UPDATE_CATEGORY,L.CREATE_CATEGORY,L.DELETE_CATEGORY,L.VIEW_ADDONS,L.UPDATE_ADDON,L.CREATE_ADDON,L.DELETE_ADDON,L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.UPDATE_MENU_ITEM,L.CREATE_MENU_ITEM,L.DELETE_MENU_ITEM,L.VIEW_PURCHASES,L.CREATE_PURCHASE,L.UPDATE_PURCHASE,L.DELETE_PURCHASE,L.VIEW_INVENTORY,L.VIEW_INVENTORY_PRODUCTS,L.CREATE_INVENTORY_PRODUCT,L.UPDATE_INVENTORY_PRODUCT,L.DELETE_INVENTORY_PRODUCT,L.VIEW_PURCHASE_DETAIL,L.VIEW_BRANCH_BALANCE,L.UPDATE_PRODUCT_INGREDIENTS,L.DELETE_PRODUCT_INGREDIENTS];case V.PURCHASING_MANAGER:return[L.VIEW_MENU,L.VIEW_MENU_ITEMS,L.VIEW_CATEGORIES,L.CREATE_CATEGORY,L.UPDATE_CATEGORY,L.VIEW_ADDONS,L.CREATE_ADDON,L.UPDATE_ADDON];case V.WAREHOUSE_STAFF:return[L.VIEW_CATEGORIES,L.VIEW_ADDONS,L.VIEW_MENU,L.VIEW_MENU_ITEMS];default:return[]}},exports.getPriceSuffix=E=>{switch(E){case r.WEIGHT:return" / kg";case r.VOLUME:return" / l";default:return""}},exports.getProductAddon=(E,e)=>((null==E?void 0:E.addons)||[]).find(({id:E})=>E===e)||{},exports.getProductListingPrice=(e,t,r)=>{const _=A(e);return E.priceFormatter(_,t,r)},exports.getProductOrderPrice=({product:e,quantity:t,language:r,currency:_,variantId:R,selectedAddons:n})=>{if(!e||0===Object.keys(e).length)return E.priceFormatter(0,_,r);const I=R?(e.variants||[]).find(({id:E})=>E===R):void 0,o=(A(R?I:e)+T(e,n))*t;return E.priceFormatter(o,_,r)},exports.getProductSellUnitShortCuts=E=>{switch(E){case r.WEIGHT:return{"50gr":.05,"100gr":.1,"150gr":.15,"200gr":.2,"250gr":.25,"300gr":.3,"350gr":.35,"400gr":.4,"450gr":.45,"500gr":.5,"600gr":.6,"700gr":.7,"750gr":.75,"800gr":.8,"850gr":.85,"900gr":.9,"950gr":.95,"1kg":1,"2kg":2,"5kg":5,"10kg":10,"20kg":20};case r.VOLUME:return{"50ml":.05,"100ml":.1,"150ml":.15,"200ml":.2,"250ml":.25,"300ml":.3,"350ml":.35,"400ml":.4,"450ml":.45,"500ml":.5,"600ml":.6,"700ml":.7,"750ml":.75,"800ml":.8,"850ml":.85,"900ml":.9,"950ml":.95,"1l":1,"2l":2,"5l":5,"10l":10,"20l":20};default:return{}}},exports.getProductTranslation=(E,e)=>{var t;return(null===(t=null==E?void 0:E.translations)||void 0===t?void 0:t[e])||{}},exports.getProductVariant=(E,e)=>{var t,r;return(null===(r=null===(t=null==E?void 0:E.variants)||void 0===t?void 0:t.find)||void 0===r?void 0:r.call(t,E=>E.id===e))||{}},exports.getProductVariantTranslation=(E,e)=>{var t;return(null===(t=null==E?void 0:E.title)||void 0===t?void 0:t[e])||""},exports.getRegisterUrl=(E,e)=>`https://app.tabres.com/auth/register?lang=${E}&utm_source=${e}`,exports.getSelectedAddonsFromOrderItems=E=>{const e={};for(const{addonId:t,options:r=[]}of E.addons||[]){const E=r.map(({optionId:E})=>E);e[t]=1===E.length?E[0]:E}return e},exports.getStatusIcon=E=>{switch(E){case n.COMPLETED:return e.Check;case n.DELIVERED:return e.BagCheck;case n.OUT_FOR_DELIVERY:return e.Delivery;case n.PREPARING:return e.Chef;case n.CONFIRMED:return e.FileCheck;case n.PENDING:default:return e.HourglassHalf}},exports.getUnitListingPrice=A,exports.getVariantListingPrice=(e,t,r)=>{const _=A(e);return E.priceFormatter(_,t,r)},exports.getVideoSource=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${c}/${E}`:"",exports.isValidPreviewResponse=E=>{if(!E||"object"!=typeof E)return!1;const e=E;return"number"==typeof e.totalPriceWithoutTax&&"number"==typeof e.totalPriceWithTax&&"number"==typeof e.totalPriceWithTaxAndFees&&"number"==typeof e.totalTax&&"number"==typeof e.deliveryFee&&"number"==typeof e.serviceFee&&Array.isArray(e.items)&&Array.isArray(e.taxes)},exports.prepareCategoryAndProductMap=(E,e)=>{const t=e.reduce((E,e)=>{if(!e.visible)return E;const t=Number(e.categoryId);return E[t]||(E[t]=[]),E[t].push(e),E},{});return E.map(E=>Object.assign(Object.assign({},E),{products:t[Number(E.id)]||[]})).filter(E=>{var e;return(null===(e=null==E?void 0:E.products)||void 0===e?void 0:e.length)>0})},exports.preparePhoneNumber=E=>`${E.countryCode}${E.phoneNumber}`.replaceAll("+",""),exports.rgbDataURL=(E,e,t)=>`data:image/gif;base64,R0lGODlhAQABAPAA${d(0,E,e)+d(t,255,255)}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`,exports.validateAddressForm=E=>{const e={},{countryCode:t,cityName:r,street:A,houseNumber:_}=E||{};return t||(e.countryCode="COUNTRY_REQUIRED"),r||(e.cityName="CITY_REQUIRED"),A||(e.street="STREET_REQUIRED"),_||(e.houseNumber="STREET_NUMBER_REQUIRED"),e},exports.validateForm=(e,t)=>{const r={},{email:A,otp:_}=e||{};switch(t){case a.OTP:A&&E.checkIsValidEmail(A)||(r.email="Invalid Email Address"),_&&6===_.length||(r.otp="Invalid OTP");break;case a.EMAIL:A&&E.checkIsValidEmail(A)||(r.email="Invalid Email Address")}return r},exports.validatePhoneNumber=function(E){if(!E)return{isValid:!1,error:"FIELD_REQUIRED"};const e=E.replace(/\D/g,""),t=e.startsWith("994")?"994":e.startsWith("31")?"31":null;if(!t)return{isValid:!1,error:"Unsupported country code"};const r=e.slice(t.length);return(0,C[t])(r)};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/modules/product/models.ts","../../../src/modules/product/utils/listing-price.ts","../../../src/modules/addon/models.ts","../../../src/modules/product/utils/order-price.ts","../../../src/modules/order/models.ts","../../../src/modules/order/constants.ts","../../../src/modules/order/utils/item-price.ts","../../../src/modules/customer/models.ts","../../../src/modules/feature/models.ts","../../../src/modules/feature/constants.ts","../../../src/modules/view/constants.ts","../../../src/modules/view/utils.ts","../../../src/modules/category/utils.ts","../../../src/modules/user/models.ts","../../../src/modules/order/utils.ts","../../../src/modules/customer/utils.ts","../../../src/modules/addon/utils.ts","../../../src/modules/user/utils.ts","../../../src/modules/feature/utils.ts","../../../src/modules/product/utils.ts","../../../src/modules/menu/utils.ts"],"sourcesContent":["import { MenuAddon } from \"../addon/models\";\n\nexport interface LocalizedContent {\n\tname: string;\n\tdescription: string;\n}\n\nexport interface ProductVariant {\n\tid?: number;\n\t/** Net price (tax-exclusive) — server-of-record value. */\n\tprice: number;\n\t/**\n\t * Gross price for menu display: net price plus any branch taxes flagged\n\t * `addToListingPrice`. Equals `price` when no branch context is supplied.\n\t */\n\tlistingPrice: number;\n\t/** Title keyed by language code, e.g. { en: \"Large\", az: \"Böyük\" }. */\n\ttitle: Record<string, string>;\n\tproductId?: number;\n\tremove?: boolean;\n}\n\nexport interface Product {\n\tid: number;\n\tcategoryId: number;\n\t/** Net price (tax-exclusive). Nullable when the product has no own price (variant-only). */\n\tprice: number;\n\t/**\n\t * Gross price for menu display: net price plus any branch taxes flagged\n\t * `addToListingPrice`. Equals `price` when no branch context is supplied,\n\t * and is null when `price` itself is null.\n\t */\n\tlistingPrice?: number | null;\n\tvolume?: string; // 100qr/250ml/1kq\n\timage160?: string;\n\timage580?: string;\n\timage1024?: string;\n\ttranslations: Record<string, LocalizedContent>;\n\tvariants: ProductVariant[];\n\taddons: MenuAddon[];\n\tavailable?: boolean;\n\tvisible?: boolean;\n\tposition?: number;\n\tvideoUrl?: string;\n\tsellUnitType?: SellUnitType;\n\ttaxClassId?: number | null;\n}\n\nexport enum ProductView {\n\tLIST = \"list\",\n\tGRID = \"grid\",\n}\n\nexport interface DashboardProduct extends Omit<Product, \"addons\"> {\n\taddons: number[];\n}\n\nexport enum SellUnitType {\n\tPIECE = \"PIECE\",\n\tWEIGHT = \"WEIGHT\",\n\tVOLUME = \"VOLUME\",\n}\n","import { priceFormatter } from \"@sorocraft/js-utils\";\nimport { Product, ProductVariant } from \"../models\";\nimport { MenuAddonOption } from \"src/models\";\n\nexport const getUnitListingPrice = (item: {\n\tprice?: number | null;\n\tlistingPrice?: number | null;\n}) => item?.listingPrice ?? item?.price ?? 0;\n\nexport const getProductListingPrice = (product: Product, currency: string, language: string) => {\n\tconst listingPrice = getUnitListingPrice(product);\n\treturn priceFormatter(listingPrice, currency, language);\n};\n\nexport const getVariantListingPrice = (\n\tvariant: ProductVariant,\n\tcurrency: string,\n\tlanguage: string,\n) => {\n\tconst listingPrice = getUnitListingPrice(variant);\n\treturn priceFormatter(listingPrice, currency, language);\n};\n\nexport const getOptionListingPrice = (\n\toption: MenuAddonOption,\n\tcurrency: string,\n\tlanguage: string,\n) => {\n\tconst listingPrice = getUnitListingPrice(option);\n\treturn priceFormatter(listingPrice, currency, language);\n};\n","export enum MenuAddonSelectType {\n\tSINGLE = \"SINGLE\",\n\tMULTIPLE = \"MULTIPLE\",\n}\n\nexport interface MenuAddonOption {\n\tid?: number;\n\t/** Net price (tax-exclusive) — server-of-record value. */\n\tprice: number;\n\t/**\n\t * Gross price for menu display: net price plus the parent product's\n\t * `addToListingPrice` taxes. Equals `price` when no branch context is\n\t * supplied (e.g. addon detached from a branch tax setup).\n\t */\n\tlistingPrice: number;\n\ttitle: Record<string, string>;\n\tremove?: boolean;\n}\n\nexport interface MenuAddon {\n\tid?: number;\n\tselectType: MenuAddonSelectType;\n\toptions: MenuAddonOption[];\n\tbusinessId?: number;\n\ttitle: Record<string, string>;\n}\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { MenuAddonSelectType } from \"src/modules/addon/models\";\nimport * as orderModels from \"src/modules/order/models\";\n\nimport { Product } from \"../models\";\nimport { getUnitListingPrice } from \"./listing-price\";\n\nexport const getAllSelectedOptionsListingPrice = (\n\tproduct: Pick<Product, \"addons\">,\n\tselectedAddons: orderModels.SelectedAddons = {},\n): number => {\n\tlet total = 0;\n\n\tfor (const addon of product?.addons || []) {\n\t\tconst { id: addonId, selectType, options } = addon;\n\n\t\tif (!Object.prototype.hasOwnProperty.call(selectedAddons, addonId)) continue;\n\n\t\tconst selection = selectedAddons[addonId];\n\t\tconst selectedOptionIds =\n\t\t\tselectType === MenuAddonSelectType.SINGLE\n\t\t\t\t? [selection as number]\n\t\t\t\t: ((selection || []) as number[]);\n\n\t\tfor (const optionId of selectedOptionIds) {\n\t\t\tconst option = (options || []).find(({ id }) => id === optionId);\n\t\t\tif (option) total += getUnitListingPrice(option);\n\t\t}\n\t}\n\n\treturn total;\n};\n\nexport const getProductOrderPrice = ({\n\tproduct,\n\tquantity,\n\tlanguage,\n\tcurrency,\n\tvariantId,\n\tselectedAddons,\n}: {\n\tproduct: Product;\n\tquantity: number;\n\tlanguage: string;\n\tcurrency: string;\n\tvariantId?: number;\n\tselectedAddons?: Record<number, number | number[]>;\n}) => {\n\tif (!product || Object.keys(product).length === 0) {\n\t\treturn priceFormatter(0, currency, language);\n\t}\n\n\tconst variant = variantId\n\t\t? (product.variants || []).find(({ id }) => id === variantId)\n\t\t: undefined;\n\n\tconst baseUnitPrice = variantId ? getUnitListingPrice(variant) : getUnitListingPrice(product);\n\tconst optionsUnitPrice = getAllSelectedOptionsListingPrice(product, selectedAddons);\n\n\tconst totalPrice = (baseUnitPrice + optionsUnitPrice) * quantity;\n\n\treturn priceFormatter(totalPrice, currency, language);\n};\n","import * as customerModels from \"../customer/models\";\nimport * as productModels from \"../product/models\";\n\nexport enum OrderType {\n\tDINE_IN = \"DINE_IN\",\n\tPICK_UP = \"PICK_UP\",\n\tDELIVERY = \"DELIVERY\",\n}\n\nexport enum OrderStatus {\n\tDRAFT = \"DRAFT\",\n\tPENDING = \"PENDING\",\n\tCONFIRMED = \"CONFIRMED\",\n\tPREPARING = \"PREPARING\",\n\tREADY = \"READY\",\n\tOUT_FOR_DELIVERY = \"OUT_FOR_DELIVERY\",\n\tDELIVERED = \"DELIVERED\",\n\tCOMPLETED = \"COMPLETED\",\n\tCANCELLED = \"CANCELLED\",\n\tFAILED = \"FAILED\",\n}\n\nexport enum OrderItemStatus {\n\tPENDING = \"PENDING\",\n\tPREPARING = \"PREPARING\",\n\tREADY = \"READY\",\n\tSERVED = \"SERVED\",\n}\n\nexport enum PaymentMethod {\n\tCASH = \"CASH\",\n\tCARD = \"CARD\",\n\tWALLET = \"WALLET\",\n\tTERMINAL = \"TERMINAL\",\n}\n\nexport interface OrderAddonOption {\n\toptionId: number;\n\t/** Gross unit price (listingPrice from the menu listing). */\n\tprice: number;\n}\n\nexport interface OrderAddon {\n\tid?: number;\n\taddonId: number;\n\toptions: OrderAddonOption[];\n}\n\nexport interface SelectedAddons {\n\t[key: number]: number | number[];\n}\n\nexport interface OrderItemVariant {\n\tid?: number;\n\tvariantId: number;\n\t/** Gross unit price (listingPrice from the menu listing). */\n\tprice: number;\n}\n\nexport interface OrderItem {\n\tid?: number;\n\tproductId: number;\n\torderId?: number;\n\tquantity: number;\n\t/**\n\t * Gross unit price (listingPrice) at the moment the line was added. The\n\t * server recomputes authoritative totals on create/preview; this value is\n\t * what the cart UI displays.\n\t */\n\tprice?: number;\n\tvariant?: OrderItemVariant;\n\taddons: OrderAddon[];\n\tnote?: string;\n\tstatus?: OrderItemStatus;\n\tisPaid?: boolean;\n\tsellUnitType: productModels.SellUnitType;\n}\n\nexport interface Order {\n\tid?: number;\n\tbusinessId?: number;\n\tbranchId?: number;\n\tworkingDayId?: number;\n\ttableId?: number;\n\temployeeId?: number;\n\torderType: OrderType;\n\titems: OrderItem[];\n\tstatus?: OrderStatus;\n\tpreferredPaymentMethod?: PaymentMethod;\n\tnote?: string;\n\tcreatedAt?: number;\n\tupdatedAt?: number;\n\tcustomer?: customerModels.Customer;\n\tcurrency?: string;\n\ttrackingId?: string;\n}\n\nexport interface OrderItems {\n\t[key: string]: OrderItem;\n}\n\nexport enum OrderStep {\n\tCART = \"CART\",\n\tDETAILS = \"DETAILS\",\n\tCOMPLETED = \"COMPLETED\",\n}\n\nexport interface OrderPayload extends Order {\n\tcustomerAddressId: number;\n\tcustomerId: number;\n\tlanguage?: string;\n}\n\nexport interface CalculatePreviewItemRequest {\n\torderItemsId: string;\n\tproductId: number;\n\tquantity: number;\n\tvariant?: { variantId: number };\n\taddons?: Array<{\n\t\taddonId: number;\n\t\toptions: Array<{ optionId: number }>;\n\t}>;\n}\n\nexport interface CalculatePreviewRequest {\n\tbusinessId?: number;\n\tbranchId: number;\n\torderType: OrderType;\n\titems: CalculatePreviewItemRequest[];\n}\n\nexport interface CalculatePreviewTax {\n\tbranchTaxId: number;\n\tname: Record<string, string>;\n\trate: number;\n\ttype: \"percentage\" | \"fixed\";\n\taddToListingPrice: boolean;\n\tamount: number;\n}\n\nexport interface CalculatePreviewLine {\n\torderItemsId: string;\n\tproductId: number;\n\tquantity: number;\n\tprice: number;\n\ttaxes: CalculatePreviewTax[];\n}\n\nexport interface CalculatePreviewResponse {\n\ttotalPriceWithoutTax: number;\n\ttotalPriceWithTax: number;\n\ttotalPriceWithTaxAndFees: number;\n\ttotalTax: number;\n\tdeliveryFee: number;\n\tserviceFee: number;\n\titems: CalculatePreviewLine[];\n\ttaxes: CalculatePreviewTax[];\n}\n\nexport interface OrderPreviewState {\n\tdata: CalculatePreviewResponse | null;\n\tisLoading: boolean;\n\terror: string | null;\n}\n","import { OrderPreviewState, OrderStep, PaymentMethod } from \"./models\";\n\nexport const initialOrder = {\n\torderType: null,\n\tpreferredPaymentMethod: PaymentMethod.CASH,\n};\n\nexport const ORDER_STEPS = [OrderStep.CART, OrderStep.DETAILS, OrderStep.COMPLETED];\n\nexport const initialPreviewState: OrderPreviewState = {\n\tdata: null,\n\tisLoading: false,\n\terror: null,\n};\n\nexport enum OrderErrors {\n\tFIELD_REQUIRED_ERROR = \"This field is required\",\n\tTABLE_NOT_SELECTED = \"Please select a table\",\n\tADDRESS_IS_EMPTY = \"Please enter an address\",\n\tEMPTY_ITEMS = \"Please choose product\",\n\tBRANCH_NOT_SELECTED = \"Please select a branch\",\n}\n","import { priceFormatter } from \"@sorocraft/js-utils\";\nimport { OrderItem } from \"../models\";\n\nexport const getOrderItemListingRawPrice = (orderItem: OrderItem) => {\n\tconst { price, variant, addons, quantity } = orderItem || {};\n\n\tconst baseUnitPrice = variant?.price ?? price ?? 0;\n\n\tconst addonsUnitPrice = (addons || []).reduce(\n\t\t(addonSum, addon) =>\n\t\t\taddonSum +\n\t\t\t(addon?.options || []).reduce((optionSum, option) => optionSum + (option?.price ?? 0), 0),\n\t\t0,\n\t);\n\n\tconst unitPrice = baseUnitPrice + addonsUnitPrice;\n\treturn unitPrice * (quantity ?? 1);\n};\n\nexport const getOrderItemListingPrice = (\n\torderItem: OrderItem,\n\tcurrency: string,\n\tlanguage: string,\n) => {\n\tconst totalPrice = getOrderItemListingRawPrice(orderItem);\n\n\treturn priceFormatter(totalPrice, currency, language);\n};\n","export enum CustomerAuthStep {\n\tPHONE = \"PHONE\",\n\tOTP = \"OTP\",\n\tEMAIL = \"EMAIL\",\n}\n\nexport enum CustomerAddressType {\n\tHOME = \"HOME\",\n\tWORK = \"WORK\",\n\tTRAVEL = \"TRAVEL\",\n}\n\nexport interface CustomerAddress {\n\tid?: number;\n\taddressId?: number; // Update address temporary\n\tcountryCode: string;\n\tcityName: string;\n\tstreet: string;\n\thouseNumber: string;\n\tadditionalNumber?: string;\n\tpostCode?: string;\n\tinstructions?: string;\n\tfloor?: number;\n\tlongitude?: number;\n\tlatitude?: number;\n\ttitle?: string;\n\ttype?: CustomerAddressType;\n}\n\nexport interface CustomerAuthForm {\n\totp: string;\n\temail: string;\n}\n\nexport interface CustomerAuthPhoneForm {\n\tcountryCode: string;\n\tphoneNumber: string;\n}\n\nexport interface AuthResponse {\n\taccessToken: string;\n\trefreshToken: string;\n}\n\nexport interface Customer {\n\tid?: number;\n\temail: string;\n\tphoneNumber: string;\n\tfullName: string;\n\tsmsVerified?: boolean;\n\temailVerified?: boolean;\n\taddress?: CustomerAddress;\n\taddresses?: CustomerAddress[];\n}\n\nexport type CustomerUpdatePayload = Partial<Customer>;\n","export enum Feature {\n\tUPLOAD_VIDEO = \"UPLOAD_VIDEO\",\n}\nexport enum FeatureSegment {\n\tALPHA = \"ALPHA\",\n\tBETA = \"BETA\",\n\tALL = \"ALL\",\n}\n","import { Feature, FeatureSegment } from \"./models\";\n\nexport const FEATURES_LIST: { [key in FeatureSegment]: Feature[] } = {\n\t[FeatureSegment.ALPHA]: [Feature.UPLOAD_VIDEO],\n\t[FeatureSegment.BETA]: [],\n\t[FeatureSegment.ALL]: [],\n};\n","export const MODALS = {\n\tADD_UPDATE_NOTES: \"ADD_UPDATE_NOTES\",\n\tAUTH: \"AUTH\",\n\tADD_UPDATE_ADDRESS: \"ADD_UPDATE_ADDRESS\",\n\tBRANCH_BUSINESS_HOURS: \"BRANCH_BUSINESS_HOURS\",\n\tPRODUCT_DETAILS: \"PRODUCT_DETAILS\",\n};\n\nexport const SUPPORTED_LOCALES = [\"en\", \"az\", \"nl\", \"et\", \"tr\", \"ru\", \"pl\", \"pt\", \"hr\"];\nexport const SUPPORTED_COUNTRIES = [\n\t{\n\t\tname: \"Azerbaijan\",\n\t\tcode: \"AZ\",\n\t\tphoneCode: \"+994\",\n\t},\n];\n\nexport const DOMAIN = \"tabres.com\";\n\nexport const DEFAULT_HOSTNAME = DOMAIN;\n\nexport const IMAGE_BASE_URL = \"https://images.tabres.com\";\n","import { DOMAIN, IMAGE_BASE_URL } from \"./constants\";\n\ninterface ValidationResult {\n\tisValid: boolean;\n\terror?: string;\n}\n\ntype Validator = (cleanedNumber: string) => ValidationResult;\n\nconst validators: Record<string, Validator> = {\n\t\"994\": (number) => {\n\t\tconst AZERBAIJANI_PREFIXES = [\"50\", \"51\", \"10\", \"55\", \"99\", \"70\", \"77\", \"60\"];\n\t\tconst pattern = new RegExp(`^(${AZERBAIJANI_PREFIXES.join(\"|\")})\\\\d{7}$`);\n\n\t\tif (!pattern.test(number)) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\terror: `Azerbaijani numbers must be 9 digits and start with ${AZERBAIJANI_PREFIXES.join(\n\t\t\t\t\t\", \"\n\t\t\t\t)}`,\n\t\t\t};\n\t\t}\n\n\t\treturn { isValid: true };\n\t},\n\n\t\"31\": (number) => {\n\t\tconst pattern = /^\\d{9}$/;\n\n\t\tif (!pattern.test(number)) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\terror: \"Dutch numbers must be exactly 9 digits\",\n\t\t\t};\n\t\t}\n\n\t\treturn { isValid: true };\n\t},\n};\n\nexport function validatePhoneNumber(phoneNumber: string): ValidationResult {\n\tif (!phoneNumber) {\n\t\treturn { isValid: false, error: \"FIELD_REQUIRED\" };\n\t}\n\n\tconst cleaned = phoneNumber.replace(/\\D/g, \"\");\n\n\tconst countryCode = cleaned.startsWith(\"994\") ? \"994\" : cleaned.startsWith(\"31\") ? \"31\" : null;\n\n\tif (!countryCode) {\n\t\treturn { isValid: false, error: \"Unsupported country code\" };\n\t}\n\n\tconst nationalNumber = cleaned.slice(countryCode.length);\n\tconst validator = validators[countryCode];\n\n\treturn validator(nationalNumber);\n}\n\nexport const getBaseUrl = (hostname: string, language: string) => {\n\tconst locale = language || \"en\";\n\t// Local env\n\tif (hostname === \"localhost:3000\") {\n\t\treturn { url: `http://localhost:3000/${locale}`, domain: DOMAIN };\n\t}\n\t// Prod env\n\treturn { url: `https://${DOMAIN}/${locale}`, domain: DOMAIN };\n};\n\nexport const getRegisterUrl = (language: string, source: string) => {\n\treturn `https://app.tabres.com/auth/register?lang=${language}&utm_source=${source}`;\n};\n\nexport const getImageSource = (image?: string) => {\n\tif (!image) return \"\";\n\n\tif (image.includes(\"base64\") || image.startsWith(\"https://\")) return image;\n\n\treturn `${IMAGE_BASE_URL}/${image}`;\n};\n\nexport const getLogoImageSource = (logoImage?: string) => {\n\tif (!logoImage) return \"https://images.tabres.com/no-photo-128.webp\";\n\n\tif (logoImage.includes(\"base64\") || logoImage.startsWith(\"https://\")) return logoImage;\n\n\treturn `${IMAGE_BASE_URL}/${logoImage}`;\n};\n\nexport const getCoverPhotoSource = (coverPhoto?: string) => {\n\tif (!coverPhoto) return \"https://images.tabres.com/tabres-doodle.webp\";\n\n\tif (coverPhoto.includes(\"base64\") || coverPhoto.startsWith(\"https://\")) return coverPhoto;\n\n\treturn `${IMAGE_BASE_URL}/${coverPhoto}`;\n};\n\nconst keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nconst triplet = (e1: number, e2: number, e3: number) =>\n\tkeyStr.charAt(e1 >> 2) +\n\tkeyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +\n\tkeyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +\n\tkeyStr.charAt(e3 & 63);\n\nexport const rgbDataURL = (r: number, g: number, b: number) =>\n\t`data:image/gif;base64,R0lGODlhAQABAPAA${\n\t\ttriplet(0, r, g) + triplet(b, 255, 255)\n\t}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;\n\nexport const getVideoSource = (video?: string) => {\n\tif (!video) return \"\";\n\n\tif (video.includes(\"base64\") || video.startsWith(\"https://\")) return video;\n\n\treturn `${IMAGE_BASE_URL}/${video}`;\n};\n\nexport const adjustLightness = (hex: string, deltaPct: number) => {\n\tconst n = parseInt(hex.replace(\"#\", \"\"), 16);\n\tconst r = ((n >> 16) & 0xff) / 255;\n\tconst g = ((n >> 8) & 0xff) / 255;\n\tconst b = (n & 0xff) / 255;\n\n\tconst max = Math.max(r, g, b);\n\tconst min = Math.min(r, g, b);\n\tconst l = (max + min) / 2;\n\tlet h = 0;\n\tlet s = 0;\n\tif (max !== min) {\n\t\tconst d = max - min;\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\tswitch (max) {\n\t\t\tcase r:\n\t\t\t\th = (g - b) / d + (g < b ? 6 : 0);\n\t\t\t\tbreak;\n\t\t\tcase g:\n\t\t\t\th = (b - r) / d + 2;\n\t\t\t\tbreak;\n\t\t\tcase b:\n\t\t\t\th = (r - g) / d + 4;\n\t\t\t\tbreak;\n\t\t}\n\t\th /= 6;\n\t}\n\n\tconst newL = Math.max(0, Math.min(1, l + deltaPct / 100));\n\n\tconst hueToRgb = (p: number, q: number, t: number) => {\n\t\tif (t < 0) t += 1;\n\t\tif (t > 1) t -= 1;\n\t\tif (t < 1 / 6) return p + (q - p) * 6 * t;\n\t\tif (t < 1 / 2) return q;\n\t\tif (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n\t\treturn p;\n\t};\n\n\tlet r2 = newL;\n\tlet g2 = newL;\n\tlet b2 = newL;\n\tif (s !== 0) {\n\t\tconst q = newL < 0.5 ? newL * (1 + s) : newL + s - newL * s;\n\t\tconst p = 2 * newL - q;\n\t\tr2 = hueToRgb(p, q, h + 1 / 3);\n\t\tg2 = hueToRgb(p, q, h);\n\t\tb2 = hueToRgb(p, q, h - 1 / 3);\n\t}\n\n\tconst toHex = (x: number) =>\n\t\tMath.round(x * 255)\n\t\t\t.toString(16)\n\t\t\t.padStart(2, \"0\");\n\treturn `#${toHex(r2)}${toHex(g2)}${toHex(b2)}`;\n};\n","import { isEmpty } from \"@sorocraft/js-utils\";\nimport { Category, CategoryTranslation } from \"./models\";\n\nexport const getCategoryTranslation = (\n\tcategory: Category,\n\tlanguage: string\n): CategoryTranslation => {\n\treturn (category?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as CategoryTranslation;\n};\n\nexport const getCategoryNameById = (\n\tcategoryId: number,\n\tcategories: Category[],\n\tlanguage: string\n): string => {\n\tconst category = categories?.find?.(({ id }) => id === categoryId);\n\n\tif (isEmpty(category)) return \"\";\n\n\tconst { name } = getCategoryTranslation(category, language);\n\n\treturn name || \"\";\n};\n","export enum EmployeePermission {\n\tVIEW_BUSINESS = \"VIEW_BUSINESS\",\n\tUPDATE_BUSINESS = \"UPDATE_BUSINESS\",\n\tVIEW_BUSINESS_FINANCIALS = \"VIEW_BUSINESS_FINANCIALS\",\n\tVIEW_ORDERS = \"VIEW_ORDERS\",\n\tUPDATE_ORDER = \"UPDATE_ORDER\",\n\tCREATE_ORDER = \"CREATE_ORDER\",\n\tAPPLY_DISCOUNT = \"APPLY_DISCOUNT\",\n\tVIEW_QR_MENU = \"VIEW_QR_MENU\",\n\tUPDATE_QR_MENU = \"UPDATE_QR_MENU\",\n\tVIEW_MENU = \"VIEW_MENU\",\n\tVIEW_MENU_ITEMS = \"VIEW_MENU_ITEMS\",\n\tCREATE_MENU_ITEM = \"CREATE_MENU_ITEM\",\n\tUPDATE_MENU_ITEM = \"UPDATE_MENU_ITEM\",\n\tDELETE_MENU_ITEM = \"DELETE_MENU_ITEM\",\n\tVIEW_CATEGORIES = \"VIEW_CATEGORIES\",\n\tUPDATE_CATEGORY = \"UPDATE_CATEGORY\",\n\tCREATE_CATEGORY = \"CREATE_CATEGORY\",\n\tDELETE_CATEGORY = \"DELETE_CATEGORY\",\n\tVIEW_ADDONS = \"VIEW_ADDONS\",\n\tUPDATE_ADDON = \"UPDATE_ADDON\",\n\tCREATE_ADDON = \"CREATE_ADDON\",\n\tDELETE_ADDON = \"DELETE_ADDON\",\n\tVIEW_TABLES = \"VIEW_TABLES\",\n\tUPDATE_TABLE = \"UPDATE_TABLE\",\n\tUPDATE_TABLE_STATUS = \"UPDATE_TABLE_STATUS\",\n\tCREATE_TABLE = \"CREATE_TABLE\",\n\tDELETE_TABLE = \"DELETE_TABLE\",\n\tVIEW_BRANCHES = \"VIEW_BRANCHES\",\n\tUPDATE_BRANCH = \"UPDATE_BRANCH\",\n\tCREATE_BRANCH = \"CREATE_BRANCH\",\n\tDELETE_BRANCH = \"DELETE_BRANCH\",\n\tVIEW_EMPLOYEES = \"VIEW_EMPLOYEES\",\n\tUPDATE_EMPLOYEE = \"UPDATE_EMPLOYEE\",\n\tCREATE_EMPLOYEE = \"CREATE_EMPLOYEE\",\n\tDELETE_EMPLOYEE = \"DELETE_EMPLOYEE\",\n\tVIEW_ANALYTICS = \"VIEW_ANALYTICS\",\n\tVIEW_SALES_REPORTS = \"VIEW_SALES_REPORTS\",\n\tVIEW_SUBSCRIPTION = \"VIEW_SUBSCRIPTION\",\n\tUPDATE_SUBSCRIPTION = \"UPDATE_SUBSCRIPTION\",\n\tVIEW_QR_CODES = \"VIEW_QR_CODES\",\n\tCREATE_QR_CODE = \"CREATE_QR_CODE\",\n\tDELETE_QR_CODE = \"DELETE_QR_CODE\",\n\tALL = \"ALL\",\n\t// Inventory\n\tVIEW_INVENTORY = \"VIEW_INVENTORY\",\n\tVIEW_PURCHASES = \"VIEW_PURCHASES\",\n\tVIEW_PURCHASE_DETAIL = \"VIEW_PURCHASE_DETAIL\",\n\tCREATE_PURCHASE = \"CREATE_PURCHASE\",\n\tUPDATE_PURCHASE = \"UPDATE_PURCHASE\",\n\tDELETE_PURCHASE = \"DELETE_PURCHASE\",\n\tVIEW_INVENTORY_PRODUCTS = \"VIEW_INVENTORY_PRODUCTS\",\n\tCREATE_INVENTORY_PRODUCT = \"CREATE_INVENTORY_PRODUCT\",\n\tUPDATE_INVENTORY_PRODUCT = \"UPDATE_INVENTORY_PRODUCT\",\n\tDELETE_INVENTORY_PRODUCT = \"DELETE_INVENTORY_PRODUCT\",\n\tVIEW_BUSINESS_BALANCE = \"VIEW_BUSINESS_BALANCE\",\n\tVIEW_BRANCH_BALANCE = \"VIEW_BRANCH_BALANCE\",\n\tUPDATE_PRODUCT_INGREDIENTS = \"UPDATE_PRODUCT_INGREDIENTS\",\n\tDELETE_PRODUCT_INGREDIENTS = \"DELETE_PRODUCT_INGREDIENTS\",\n\tAI_ASSISTANT = \"AI_ASSISTANT\",\n\tVIEW_PAYMENTS = \"VIEW_PAYMENTS\",\n\tTAKE_PAYMENT = \"TAKE_PAYMENT\",\n\tREFUND_PAYMENT = \"REFUND_PAYMENT\",\n\tPAYMENT_COMP = \"COMP\",\n}\n\nexport enum UserRole {\n\tOWNER = \"OWNER\",\n\tBRANCH_MANAGER = \"BRANCH_MANAGER\",\n\tGENERAL_MANAGER = \"GENERAL_MANAGER\",\n\tCHEF = \"CHEF\",\n\tSOUS_CHEF = \"SOUS_CHEF\",\n\tPASTRY_CHEF = \"PASTRY_CHEF\",\n\tLINE_COOK = \"LINE_COOK\",\n\tPREP_COOK = \"PREP_COOK\",\n\tKITCHEN_ASSISTANT = \"KITCHEN_ASSISTANT\",\n\tDISHWASHER = \"DISHWASHER\",\n\tHEAD_WAITER = \"HEAD_WAITER\",\n\tWAITER = \"WAITER\",\n\tRUNNER = \"RUNNER\",\n\tBARISTA = \"BARISTA\",\n\tBARTENDER = \"BARTENDER\",\n\tSOMMELIER = \"SOMMELIER\",\n\tACCOUNTANT = \"ACCOUNTANT\",\n\tROOM_SERVICE_STAFF = \"ROOM_SERVICE_STAFF\",\n\tDELIVERY_DRIVER = \"DELIVERY_DRIVER\",\n\tINVENTORY_MANAGER = \"INVENTORY_MANAGER\",\n\tPURCHASING_MANAGER = \"PURCHASING_MANAGER\",\n\tWAREHOUSE_STAFF = \"WAREHOUSE_STAFF\",\n\tCASHIER = \"CASHIER\"\n}\n\nexport interface User {\n\tid?: number;\n\temail: string;\n\tfullName: string;\n\trole?: UserRole;\n\tavatar64?: string | null;\n\tavatar128?: string | null;\n\tavatar256?: string | null;\n\tbusinessId?: number;\n\tbranchId?: number | null;\n\tcreatedAt: string;\n\temailVerified?: boolean;\n\tpermissions?: EmployeePermission[];\n}\n","import { isEmpty, sortNumbers } from \"@sorocraft/js-utils\";\nimport { IconType } from \"@sorocraft/ui\";\nimport { Check, BagCheck, Delivery, Chef, FileCheck, HourglassHalf } from \"@sorocraft/ui/icons\";\n\nimport {\n\tCalculatePreviewResponse,\n\tOrder,\n\tOrderAddon,\n\tOrderAddonOption,\n\tOrderItem,\n\tOrderStatus,\n\tOrderType,\n\tSelectedAddons,\n} from \"./models\";\n\nimport * as addonModels from \"../addon/models\";\nimport * as branchModels from \"../branch/models\";\nimport { OrderErrors } from \"./constants\";\n\nexport const generateOrderItemsId = (\n\tproductId: number,\n\tvariantId: number | null,\n\tselectedAddons?: SelectedAddons,\n): string => {\n\tif (!productId) throw new Error(\"Product ID is required\");\n\n\t// Build the order items ID base with productId and variantId\n\tlet orderItemsId = `${productId}`;\n\tif (variantId) {\n\t\torderItemsId += `-${variantId}`;\n\t}\n\n\t// Build the addon part of the ID\n\tconst addonIdsPart = Object.entries(selectedAddons || {})\n\t\t.map(([addonId, option]) => {\n\t\t\tif (!addonId || !option) return null; // Skip invalid entries\n\t\t\tconst optionIds = Array.isArray(option)\n\t\t\t\t? sortNumbers(option).filter(Boolean).join(\"-\")\n\t\t\t\t: `${option}`;\n\t\t\tif (!optionIds) return null;\n\t\t\treturn `${addonId}-${optionIds}`;\n\t\t})\n\t\t.filter(Boolean) // Remove null/undefined values\n\t\t.join(\"-\");\n\n\t// Append addonIdsPart if it's not empty\n\tif (addonIdsPart) {\n\t\torderItemsId += `-${addonIdsPart}`;\n\t}\n\n\treturn orderItemsId;\n};\n\nexport const getSelectedAddonsFromOrderItems = (item: OrderItem): SelectedAddons => {\n\tconst selectedAddons: SelectedAddons = {};\n\n\tfor (const { addonId, options = [] } of item.addons || []) {\n\t\tconst optionIds = options.map(({ optionId }) => optionId);\n\t\tselectedAddons[addonId] = optionIds.length === 1 ? optionIds[0] : optionIds;\n\t}\n\n\treturn selectedAddons;\n};\n\nexport const getStatusIcon = (status: OrderStatus): IconType => {\n\tswitch (status) {\n\t\tcase OrderStatus.COMPLETED:\n\t\t\treturn Check;\n\t\tcase OrderStatus.DELIVERED:\n\t\t\treturn BagCheck;\n\t\tcase OrderStatus.OUT_FOR_DELIVERY:\n\t\t\treturn Delivery;\n\t\tcase OrderStatus.PREPARING:\n\t\t\treturn Chef;\n\t\tcase OrderStatus.CONFIRMED:\n\t\t\treturn FileCheck;\n\t\tcase OrderStatus.PENDING:\n\t\t\treturn HourglassHalf;\n\n\t\tdefault:\n\t\t\treturn HourglassHalf;\n\t}\n};\n\nexport const buildSelectedAddonsPayload = (\n\tproductAddons: addonModels.MenuAddon[] = [],\n\tselectedAddons: SelectedAddons = {},\n): OrderAddon[] => {\n\treturn Object.entries(selectedAddons).map(([addonIdStr, selected]) => {\n\t\tconst addonId = Number(addonIdStr);\n\t\tconst selectedOptionIds = Array.isArray(selected) ? selected : [selected];\n\n\t\tconst addon = productAddons.find((addon) => addon.id === addonId);\n\t\tif (isEmpty(addon)) {\n\t\t\treturn {\n\t\t\t\taddonId,\n\t\t\t\toptions: [],\n\t\t\t};\n\t\t}\n\n\t\tconst options: OrderAddonOption[] = (addon.options || [])\n\t\t\t.filter((option) => selectedOptionIds.includes(option.id))\n\t\t\t.map((option) => ({\n\t\t\t\toptionId: option.id,\n\t\t\t\tprice: option.listingPrice ?? option.price,\n\t\t\t}));\n\n\t\treturn {\n\t\t\taddonId,\n\t\t\toptions,\n\t\t};\n\t});\n};\n\nexport const getDefaultOrderType = (\n\tsettings: branchModels.BranchSettings,\n\tisOpen: boolean,\n\tisDelivering: boolean,\n): OrderType | null => {\n\tif (!settings) return null;\n\n\tconst { deliveryOrderEnabled, dineInOrderEnabled, pickupOrderEnabled } = settings;\n\n\tif (deliveryOrderEnabled && isDelivering) {\n\t\treturn OrderType.DELIVERY;\n\t}\n\n\tif (dineInOrderEnabled && isOpen) {\n\t\treturn OrderType.DINE_IN;\n\t}\n\n\tif (pickupOrderEnabled && isOpen) {\n\t\treturn OrderType.PICK_UP;\n\t}\n\n\treturn null;\n};\n\n// Defensive shape check for the /order/calculate response. The service is\n// typed as CalculatePreviewResponse, but the network can return malformed\n// payloads (empty body, HTML error page) that would corrupt preview state\n// and break price-line lookups downstream.\nexport const isValidPreviewResponse = (data: unknown): data is CalculatePreviewResponse => {\n\tif (!data || typeof data !== \"object\") return false;\n\tconst d = data as Partial<CalculatePreviewResponse>;\n\treturn (\n\t\ttypeof d.totalPriceWithoutTax === \"number\" &&\n\t\ttypeof d.totalPriceWithTax === \"number\" &&\n\t\ttypeof d.totalPriceWithTaxAndFees === \"number\" &&\n\t\ttypeof d.totalTax === \"number\" &&\n\t\ttypeof d.deliveryFee === \"number\" &&\n\t\ttypeof d.serviceFee === \"number\" &&\n\t\tArray.isArray(d.items) &&\n\t\tArray.isArray(d.taxes)\n\t);\n};\n\nexport const getOrderErrorMessages = (field: keyof Order) => {\n\tswitch (field) {\n\t\tcase \"customer\":\n\t\t\treturn OrderErrors.ADDRESS_IS_EMPTY;\n\n\t\tcase \"tableId\":\n\t\t\treturn OrderErrors.TABLE_NOT_SELECTED;\n\n\t\tcase \"items\":\n\t\t\treturn OrderErrors.EMPTY_ITEMS;\n\n\t\tcase \"branchId\":\n\t\t\treturn OrderErrors.BRANCH_NOT_SELECTED;\n\n\t\tdefault:\n\t\t\treturn OrderErrors.FIELD_REQUIRED_ERROR;\n\t}\n};\n\nexport * from \"./utils/item-price\";\n","import { FormErrors } from \"@sorocraft/ui\";\nimport { checkIsValidEmail } from \"@sorocraft/js-utils\";\n\nimport {\n\tCustomerAddress,\n\tCustomerAuthForm,\n\tCustomerAuthPhoneForm,\n\tCustomerAuthStep,\n} from \"./models\";\n\nexport const preparePhoneNumber = (form: CustomerAuthPhoneForm) => {\n\tconst phoneNumber = `${form.countryCode}${form.phoneNumber}`.replaceAll(\"+\", \"\");\n\n\treturn phoneNumber;\n};\n\nexport const validateForm = (form: CustomerAuthForm, step: CustomerAuthStep): FormErrors => {\n\tconst errors: FormErrors = {};\n\tconst { email, otp } = form || {};\n\n\tswitch (step) {\n\t\tcase CustomerAuthStep.OTP: {\n\t\t\tif (!email || !checkIsValidEmail(email)) {\n\t\t\t\terrors.email = \"Invalid Email Address\";\n\t\t\t}\n\n\t\t\tif (!otp || otp.length !== 6) {\n\t\t\t\terrors.otp = \"Invalid OTP\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase CustomerAuthStep.EMAIL: {\n\t\t\tif (!email || !checkIsValidEmail(email)) {\n\t\t\t\terrors.email = \"Invalid Email Address\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn errors;\n};\n\nexport const validateAddressForm = (form: CustomerAddress): FormErrors => {\n\tconst errors: FormErrors = {};\n\tconst { countryCode, cityName, street, houseNumber } = form || {};\n\n\tif (!countryCode) errors.countryCode = \"COUNTRY_REQUIRED\";\n\tif (!cityName) errors.cityName = \"CITY_REQUIRED\";\n\tif (!street) errors.street = \"STREET_REQUIRED\";\n\tif (!houseNumber) errors.houseNumber = \"STREET_NUMBER_REQUIRED\";\n\n\treturn errors;\n};\n\nexport const formatCityLine = (fields: (string | undefined)[]) => {\n\treturn (fields || []).filter(Boolean).join(\", \");\n};\n\nexport const formatAddressLine = (\n\tstreet: string,\n\thouseNumber: string,\n\tadditionalNumber: string,\n) => {\n\tconst house = [houseNumber, additionalNumber].filter(Boolean).join(\"/\");\n\tconst fullAddress = [street, house].filter(Boolean).join(\" \");\n\n\treturn fullAddress;\n};\n","import { MenuAddon, MenuAddonOption } from \"./models\";\n\nexport const getAddonTranslation = (addon: MenuAddon, language: string): string => {\n\treturn addon?.title?.[language] || \"\";\n};\n\nexport const getAddonOptionTranslation = (option: MenuAddonOption, language: string): string => {\n\treturn option?.title?.[language] || \"\";\n};\n\nexport const getOptionTitles = (\n\toptions: MenuAddonOption[],\n\toptionIds: number | number[],\n\tlanguage: string,\n): string => {\n\tif (Array.isArray(optionIds)) {\n\t\treturn (options || [])\n\t\t\t.filter(({ id }) => optionIds.includes(id))\n\t\t\t.map(({ title }) => title?.[language] || \"\")\n\t\t\t.filter(Boolean)\n\t\t\t.join(\", \");\n\t} else {\n\t\tconst option = (options || []).find(({ id }) => id === optionIds);\n\t\treturn option?.title?.[language] || \"\";\n\t}\n};\n\nexport const getAddonTitle = (addon: MenuAddon, language: string): string => {\n\treturn addon?.title?.[language] || \"\";\n};\n","import { isEmpty } from \"@sorocraft/js-utils\";\n\nimport { EmployeePermission, UserRole } from \"./models\";\n\nexport const getPermissionsByRole = (role?: UserRole) => {\n\tswitch (role) {\n\t\t/** Owner - Has every permission */\n\t\tcase UserRole.OWNER:\n\t\t\treturn [EmployeePermission.ALL];\n\n\t\t/** General Manager - All except subscription updates */\n\t\tcase UserRole.GENERAL_MANAGER:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_BUSINESS,\n\t\t\t\tEmployeePermission.UPDATE_BUSINESS,\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t\tEmployeePermission.CREATE_ORDER,\n\t\t\t\tEmployeePermission.VIEW_QR_MENU,\n\t\t\t\tEmployeePermission.VIEW_QR_CODES,\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.UPDATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.CREATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.DELETE_MENU_ITEM,\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.UPDATE_CATEGORY,\n\t\t\t\tEmployeePermission.CREATE_CATEGORY,\n\t\t\t\tEmployeePermission.DELETE_CATEGORY,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.UPDATE_ADDON,\n\t\t\t\tEmployeePermission.CREATE_ADDON,\n\t\t\t\tEmployeePermission.DELETE_ADDON,\n\t\t\t\tEmployeePermission.VIEW_TABLES,\n\t\t\t\tEmployeePermission.UPDATE_TABLE,\n\t\t\t\tEmployeePermission.CREATE_TABLE,\n\t\t\t\tEmployeePermission.DELETE_TABLE,\n\t\t\t\tEmployeePermission.VIEW_BRANCHES,\n\t\t\t\tEmployeePermission.UPDATE_BRANCH,\n\t\t\t\tEmployeePermission.CREATE_BRANCH,\n\t\t\t\tEmployeePermission.DELETE_BRANCH,\n\t\t\t\tEmployeePermission.VIEW_EMPLOYEES,\n\t\t\t\tEmployeePermission.UPDATE_EMPLOYEE,\n\t\t\t\tEmployeePermission.CREATE_EMPLOYEE,\n\t\t\t\tEmployeePermission.DELETE_EMPLOYEE,\n\t\t\t\tEmployeePermission.VIEW_ANALYTICS,\n\t\t\t\tEmployeePermission.VIEW_SALES_REPORTS,\n\t\t\t\tEmployeePermission.VIEW_SUBSCRIPTION,\n\t\t\t\tEmployeePermission.CREATE_QR_CODE,\n\t\t\t\tEmployeePermission.DELETE_QR_CODE,\n\t\t\t\tEmployeePermission.AI_ASSISTANT,\n\t\t\t];\n\n\t\t/** Branch Manager - Controls operations within one branch */\n\t\tcase UserRole.BRANCH_MANAGER:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_BUSINESS,\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t\tEmployeePermission.CREATE_ORDER,\n\t\t\t\tEmployeePermission.VIEW_QR_MENU,\n\t\t\t\tEmployeePermission.VIEW_QR_CODES,\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.UPDATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.CREATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.DELETE_MENU_ITEM,\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.UPDATE_CATEGORY,\n\t\t\t\tEmployeePermission.CREATE_CATEGORY,\n\t\t\t\tEmployeePermission.DELETE_CATEGORY,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.UPDATE_ADDON,\n\t\t\t\tEmployeePermission.CREATE_ADDON,\n\t\t\t\tEmployeePermission.DELETE_ADDON,\n\t\t\t\tEmployeePermission.VIEW_TABLES,\n\t\t\t\tEmployeePermission.UPDATE_TABLE,\n\t\t\t\tEmployeePermission.CREATE_TABLE,\n\t\t\t\tEmployeePermission.DELETE_TABLE,\n\t\t\t\tEmployeePermission.VIEW_EMPLOYEES,\n\t\t\t\tEmployeePermission.UPDATE_EMPLOYEE,\n\t\t\t\tEmployeePermission.VIEW_ANALYTICS,\n\t\t\t\tEmployeePermission.VIEW_SALES_REPORTS,\n\t\t\t\tEmployeePermission.CREATE_QR_CODE,\n\t\t\t\tEmployeePermission.DELETE_QR_CODE,\n\t\t\t\tEmployeePermission.AI_ASSISTANT,\n\t\t\t];\n\n\t\t/** Chef - Manages menu and kitchen orders */\n\t\tcase UserRole.CHEF:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.UPDATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.UPDATE_CATEGORY,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.UPDATE_ADDON,\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t];\n\n\t\t/** Sous Chef - Assists chef with orders and menu */\n\t\tcase UserRole.SOUS_CHEF:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t];\n\n\t\t/** Pastry Chef - Limited to dessert menu items */\n\t\tcase UserRole.PASTRY_CHEF:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.UPDATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t];\n\n\t\t/** Line Cook / Prep Cook / Kitchen Assistant - Read-only menu & order updates */\n\t\tcase UserRole.LINE_COOK:\n\t\tcase UserRole.PREP_COOK:\n\t\tcase UserRole.KITCHEN_ASSISTANT:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t];\n\n\t\t/** Head Waiter - Full service control */\n\t\tcase UserRole.HEAD_WAITER:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.CREATE_ORDER,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t\tEmployeePermission.VIEW_TABLES,\n\t\t\t\tEmployeePermission.UPDATE_TABLE_STATUS,\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.VIEW_QR_MENU,\n\t\t\t\tEmployeePermission.VIEW_QR_CODES,\n\t\t\t];\n\n\t\t/** Waiter - Handles orders and table service */\n\t\tcase UserRole.WAITER:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.CREATE_ORDER,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t\tEmployeePermission.VIEW_TABLES,\n\t\t\t\tEmployeePermission.UPDATE_TABLE_STATUS,\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t];\n\n\t\t/** Runner - Sees and updates order delivery progress */\n\t\tcase UserRole.RUNNER:\n\t\t\treturn [EmployeePermission.VIEW_ORDERS, EmployeePermission.UPDATE_ORDER];\n\n\t\t/** ☕ Barista / Bartender / Sommelier / Room Service */\n\t\tcase UserRole.BARISTA:\n\t\tcase UserRole.BARTENDER:\n\t\tcase UserRole.SOMMELIER:\n\t\tcase UserRole.ROOM_SERVICE_STAFF:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.CREATE_ORDER,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t];\n\n\t\t/** Accountant - Analytics, reports, subscriptions */\n\t\tcase UserRole.ACCOUNTANT:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_ANALYTICS,\n\t\t\t\tEmployeePermission.VIEW_SALES_REPORTS,\n\t\t\t\tEmployeePermission.VIEW_SUBSCRIPTION,\n\t\t\t];\n\n\t\t/** Delivery Driver - Delivery orders only */\n\t\tcase UserRole.DELIVERY_DRIVER:\n\t\t\treturn [EmployeePermission.VIEW_ORDERS, EmployeePermission.UPDATE_ORDER];\n\n\t\t/** Inventory Manager - Controls menu stock-related items */\n\t\tcase UserRole.INVENTORY_MANAGER:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.UPDATE_CATEGORY,\n\t\t\t\tEmployeePermission.CREATE_CATEGORY,\n\t\t\t\tEmployeePermission.DELETE_CATEGORY,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.UPDATE_ADDON,\n\t\t\t\tEmployeePermission.CREATE_ADDON,\n\t\t\t\tEmployeePermission.DELETE_ADDON,\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.UPDATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.CREATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.DELETE_MENU_ITEM,\n\t\t\t\tEmployeePermission.VIEW_PURCHASES,\n\t\t\t\tEmployeePermission.CREATE_PURCHASE,\n\t\t\t\tEmployeePermission.UPDATE_PURCHASE,\n\t\t\t\tEmployeePermission.DELETE_PURCHASE,\n\t\t\t\tEmployeePermission.VIEW_INVENTORY,\n\t\t\t\tEmployeePermission.VIEW_INVENTORY_PRODUCTS,\n\t\t\t\tEmployeePermission.CREATE_INVENTORY_PRODUCT,\n\t\t\t\tEmployeePermission.UPDATE_INVENTORY_PRODUCT,\n\t\t\t\tEmployeePermission.DELETE_INVENTORY_PRODUCT,\n\t\t\t\tEmployeePermission.VIEW_PURCHASE_DETAIL,\n\t\t\t\tEmployeePermission.VIEW_BRANCH_BALANCE,\n\t\t\t\tEmployeePermission.UPDATE_PRODUCT_INGREDIENTS,\n\t\t\t\tEmployeePermission.DELETE_PRODUCT_INGREDIENTS,\n\t\t\t];\n\n\t\t/** Purchasing Manager - Similar to inventory but more on creation/deletion */\n\t\tcase UserRole.PURCHASING_MANAGER:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.CREATE_CATEGORY,\n\t\t\t\tEmployeePermission.UPDATE_CATEGORY,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.CREATE_ADDON,\n\t\t\t\tEmployeePermission.UPDATE_ADDON,\n\t\t\t];\n\n\t\t/** Warehouse Staff - View only */\n\t\tcase UserRole.WAREHOUSE_STAFF:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t];\n\n\t\tdefault:\n\t\t\treturn [];\n\t}\n};\n\nexport const getHasUserPermission = (\n\trequiredPermissions: EmployeePermission[],\n\tuserPermissions: EmployeePermission[],\n) => {\n\tif (isEmpty(requiredPermissions)) return true;\n\tif (isEmpty(userPermissions)) return false;\n\tif (userPermissions.includes(EmployeePermission.ALL)) return true;\n\n\treturn requiredPermissions.some((permission) => userPermissions.includes(permission));\n};\n","import { getQueryParam } from \"@sorocraft/js-utils\";\n\nimport { FeatureSegment, type Feature } from \"./models\";\n\nimport { FEATURES_LIST } from \"./constants\";\n\nexport const getIsFeatureActive = (feature: Feature, businessSegment: FeatureSegment): boolean => {\n\t// Feature is force-enabled via query param\n\tif (getQueryParam(feature) === \"1\") return true;\n\n\t// Build the list of enabled segments for the current businessSegment\n\tconst enabledSegments: FeatureSegment[] =\n\t\tbusinessSegment === FeatureSegment.ALPHA\n\t\t\t? [FeatureSegment.ALPHA, FeatureSegment.BETA, FeatureSegment.ALL]\n\t\t\t: businessSegment === FeatureSegment.BETA\n\t\t\t? [FeatureSegment.BETA, FeatureSegment.ALL]\n\t\t\t: [FeatureSegment.ALL];\n\n\t// Check if feature exists in any of the enabled segments\n\treturn enabledSegments.some((segment) => FEATURES_LIST[segment]?.includes(feature));\n};\n","import { LocalizedContent, Product, ProductVariant, SellUnitType } from \"./models\";\n\nimport { MenuAddon } from \"src/modules/addon/models\";\n\nexport const getProductTranslation = (\n\tproduct: Pick<Product, \"translations\">,\n\tlanguage: string,\n): LocalizedContent => {\n\treturn product?.translations?.[language] || ({} as LocalizedContent);\n};\n\nexport const getProductVariant = (\n\tproduct: Pick<Product, \"variants\">,\n\tvariantId: number,\n): ProductVariant => {\n\treturn product?.variants?.find?.((item) => item.id === variantId) || ({} as ProductVariant);\n};\n\nexport const getProductVariantTranslation = (variant: ProductVariant, language: string): string => {\n\treturn variant?.title?.[language] || \"\";\n};\n\nexport const getProductAddon = (product: Product, addonId: number): MenuAddon => {\n\treturn (product?.addons || []).find(({ id }) => id === addonId) || ({} as MenuAddon);\n};\n\nexport const getPriceSuffix = (sellUnitType: SellUnitType) => {\n\tswitch (sellUnitType) {\n\t\tcase SellUnitType.WEIGHT:\n\t\t\treturn \" / kg\";\n\t\tcase SellUnitType.VOLUME:\n\t\t\treturn \" / l\";\n\n\t\tdefault:\n\t\t\treturn \"\";\n\t}\n};\n\nexport const getProductSellUnitShortCuts = (sellUnitType: SellUnitType) => {\n\tswitch (sellUnitType) {\n\t\tcase SellUnitType.WEIGHT:\n\t\t\treturn {\n\t\t\t\t\"50gr\": 0.05,\n\t\t\t\t\"100gr\": 0.1,\n\t\t\t\t\"150gr\": 0.15,\n\t\t\t\t\"200gr\": 0.2,\n\t\t\t\t\"250gr\": 0.25,\n\t\t\t\t\"300gr\": 0.3,\n\t\t\t\t\"350gr\": 0.35,\n\t\t\t\t\"400gr\": 0.4,\n\t\t\t\t\"450gr\": 0.45,\n\t\t\t\t\"500gr\": 0.5,\n\t\t\t\t\"600gr\": 0.6,\n\t\t\t\t\"700gr\": 0.7,\n\t\t\t\t\"750gr\": 0.75,\n\t\t\t\t\"800gr\": 0.8,\n\t\t\t\t\"850gr\": 0.85,\n\t\t\t\t\"900gr\": 0.9,\n\t\t\t\t\"950gr\": 0.95,\n\t\t\t\t\"1kg\": 1,\n\t\t\t\t\"2kg\": 2,\n\t\t\t\t\"5kg\": 5,\n\t\t\t\t\"10kg\": 10,\n\t\t\t\t\"20kg\": 20,\n\t\t\t};\n\t\tcase SellUnitType.VOLUME:\n\t\t\treturn {\n\t\t\t\t\"50ml\": 0.05,\n\t\t\t\t\"100ml\": 0.1,\n\t\t\t\t\"150ml\": 0.15,\n\t\t\t\t\"200ml\": 0.2,\n\t\t\t\t\"250ml\": 0.25,\n\t\t\t\t\"300ml\": 0.3,\n\t\t\t\t\"350ml\": 0.35,\n\t\t\t\t\"400ml\": 0.4,\n\t\t\t\t\"450ml\": 0.45,\n\t\t\t\t\"500ml\": 0.5,\n\t\t\t\t\"600ml\": 0.6,\n\t\t\t\t\"700ml\": 0.7,\n\t\t\t\t\"750ml\": 0.75,\n\t\t\t\t\"800ml\": 0.8,\n\t\t\t\t\"850ml\": 0.85,\n\t\t\t\t\"900ml\": 0.9,\n\t\t\t\t\"950ml\": 0.95,\n\t\t\t\t\"1l\": 1,\n\t\t\t\t\"2l\": 2,\n\t\t\t\t\"5l\": 5,\n\t\t\t\t\"10l\": 10,\n\t\t\t\t\"20l\": 20,\n\t\t\t};\n\t\tdefault:\n\t\t\treturn {};\n\t}\n};\n\nexport * from \"./utils/listing-price\";\nexport * from \"./utils/order-price\";\n","import * as categoryModels from \"src/modules/category/models\";\nimport * as productModels from \"src/modules/product/models\";\n\nimport { CategoryProductMap } from \"./models\";\n\nexport const prepareCategoryAndProductMap = (\n\tcategories: categoryModels.Category[],\n\tproducts: productModels.Product[]\n): CategoryProductMap[] => {\n\tconst productMap = products.reduce<Record<number, productModels.Product[]>>((map, product) => {\n\t\tif (!product.visible) return map;\n\n\t\tconst categoryId = Number(product.categoryId);\n\t\tif (!map[categoryId]) {\n\t\t\tmap[categoryId] = [];\n\t\t}\n\t\tmap[categoryId].push(product);\n\t\treturn map;\n\t}, {});\n\n\treturn categories\n\t\t.map((category) => ({\n\t\t\t...category,\n\t\t\tproducts: (productMap[Number(category.id)] || []) as productModels.Product[],\n\t\t}))\n\t\t.filter((category) => category?.products?.length > 0);\n};\n"],"names":["ProductView","SellUnitType","getUnitListingPrice","item","_a","_b","listingPrice","price","MenuAddonSelectType","getAllSelectedOptionsListingPrice","product","selectedAddons","total","addon","addons","id","addonId","selectType","options","Object","prototype","hasOwnProperty","call","selection","selectedOptionIds","SINGLE","optionId","option","find","OrderType","OrderStatus","OrderItemStatus","PaymentMethod","OrderStep","OrderErrors","CASH","CART","DETAILS","COMPLETED","getOrderItemListingRawPrice","orderItem","variant","quantity","baseUnitPrice","addonsUnitPrice","reduce","addonSum","optionSum","CustomerAuthStep","CustomerAddressType","Feature","FeatureSegment","FEATURES_LIST","ALPHA","UPLOAD_VIDEO","BETA","ALL","DOMAIN","IMAGE_BASE_URL","validators","number","AZERBAIJANI_PREFIXES","RegExp","join","test","isValid","error","keyStr","triplet","e1","e2","e3","charAt","getCategoryTranslation","category","language","translations","EmployeePermission","UserRole","hex","deltaPct","n","parseInt","replace","r","g","b","max","Math","min","l","h","s","d","newL","hueToRgb","p","q","t","r2","g2","b2","toHex","x","round","toString","padStart","productAddons","entries","map","addonIdStr","selected","Number","Array","isArray","isEmpty","filter","includes","street","houseNumber","additionalNumber","Boolean","fields","productId","variantId","Error","orderItemsId","addonIdsPart","optionIds","sortNumbers","title","hostname","locale","url","domain","categoryId","categories","name","coverPhoto","startsWith","settings","isOpen","isDelivering","deliveryOrderEnabled","dineInOrderEnabled","pickupOrderEnabled","DELIVERY","DINE_IN","PICK_UP","requiredPermissions","userPermissions","some","permission","image","feature","businessSegment","getQueryParam","segment","logoImage","currency","priceFormatter","field","ADDRESS_IS_EMPTY","TABLE_NOT_SELECTED","EMPTY_ITEMS","BRANCH_NOT_SELECTED","FIELD_REQUIRED_ERROR","totalPrice","role","OWNER","GENERAL_MANAGER","VIEW_BUSINESS","UPDATE_BUSINESS","VIEW_ORDERS","UPDATE_ORDER","CREATE_ORDER","VIEW_QR_MENU","VIEW_QR_CODES","VIEW_MENU","VIEW_MENU_ITEMS","UPDATE_MENU_ITEM","CREATE_MENU_ITEM","DELETE_MENU_ITEM","VIEW_CATEGORIES","UPDATE_CATEGORY","CREATE_CATEGORY","DELETE_CATEGORY","VIEW_ADDONS","UPDATE_ADDON","CREATE_ADDON","DELETE_ADDON","VIEW_TABLES","UPDATE_TABLE","CREATE_TABLE","DELETE_TABLE","VIEW_BRANCHES","UPDATE_BRANCH","CREATE_BRANCH","DELETE_BRANCH","VIEW_EMPLOYEES","UPDATE_EMPLOYEE","CREATE_EMPLOYEE","DELETE_EMPLOYEE","VIEW_ANALYTICS","VIEW_SALES_REPORTS","VIEW_SUBSCRIPTION","CREATE_QR_CODE","DELETE_QR_CODE","AI_ASSISTANT","BRANCH_MANAGER","CHEF","SOUS_CHEF","PASTRY_CHEF","LINE_COOK","PREP_COOK","KITCHEN_ASSISTANT","HEAD_WAITER","UPDATE_TABLE_STATUS","WAITER","RUNNER","BARISTA","BARTENDER","SOMMELIER","ROOM_SERVICE_STAFF","ACCOUNTANT","DELIVERY_DRIVER","INVENTORY_MANAGER","VIEW_PURCHASES","CREATE_PURCHASE","UPDATE_PURCHASE","DELETE_PURCHASE","VIEW_INVENTORY","VIEW_INVENTORY_PRODUCTS","CREATE_INVENTORY_PRODUCT","UPDATE_INVENTORY_PRODUCT","DELETE_INVENTORY_PRODUCT","VIEW_PURCHASE_DETAIL","VIEW_BRANCH_BALANCE","UPDATE_PRODUCT_INGREDIENTS","DELETE_PRODUCT_INGREDIENTS","PURCHASING_MANAGER","WAREHOUSE_STAFF","sellUnitType","WEIGHT","VOLUME","keys","length","variants","undefined","source","status","Check","DELIVERED","BagCheck","OUT_FOR_DELIVERY","Delivery","PREPARING","Chef","CONFIRMED","FileCheck","PENDING","HourglassHalf","video","data","totalPriceWithoutTax","totalPriceWithTax","totalPriceWithTaxAndFees","totalTax","deliveryFee","serviceFee","items","taxes","products","productMap","visible","push","assign","form","countryCode","phoneNumber","replaceAll","errors","cityName","step","email","otp","OTP","checkIsValidEmail","EMAIL","cleaned","nationalNumber","slice","validator"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/modules/product/models.ts","../../../src/modules/product/utils/listing-price.ts","../../../src/modules/addon/models.ts","../../../src/modules/product/utils/order-price.ts","../../../src/modules/order/models.ts","../../../src/modules/order/constants.ts","../../node_modules/tslib/tslib.es6.js","../../../src/modules/order/utils/item-price.ts","../../../src/modules/customer/models.ts","../../../src/modules/feature/models.ts","../../../src/modules/feature/constants.ts","../../../src/modules/view/constants.ts","../../../src/modules/view/utils.ts","../../../src/modules/category/utils.ts","../../../src/modules/user/models.ts","../../../src/modules/order/utils.ts","../../../src/modules/customer/utils.ts","../../../src/modules/addon/utils.ts","../../../src/modules/user/utils.ts","../../../src/modules/feature/utils.ts","../../../src/modules/product/utils.ts","../../../src/modules/menu/utils.ts"],"sourcesContent":["import { MenuAddon } from \"../addon/models\";\n\nexport interface LocalizedContent {\n\tname: string;\n\tdescription: string;\n}\n\nexport interface ProductVariant {\n\tid?: number;\n\t/** Net price (tax-exclusive) — server-of-record value. */\n\tprice: number;\n\t/**\n\t * Gross price for menu display: net price plus any branch taxes flagged\n\t * `addToListingPrice`. Equals `price` when no branch context is supplied.\n\t */\n\tlistingPrice: number;\n\t/** Title keyed by language code, e.g. { en: \"Large\", az: \"Böyük\" }. */\n\ttitle: Record<string, string>;\n\tproductId?: number;\n\tremove?: boolean;\n}\n\nexport interface Product {\n\tid: number;\n\tcategoryId: number;\n\t/** Net price (tax-exclusive). Nullable when the product has no own price (variant-only). */\n\tprice: number;\n\t/**\n\t * Gross price for menu display: net price plus any branch taxes flagged\n\t * `addToListingPrice`. Equals `price` when no branch context is supplied,\n\t * and is null when `price` itself is null.\n\t */\n\tlistingPrice?: number | null;\n\tvolume?: string; // 100qr/250ml/1kq\n\timage160?: string;\n\timage580?: string;\n\timage1024?: string;\n\ttranslations: Record<string, LocalizedContent>;\n\tvariants: ProductVariant[];\n\taddons: MenuAddon[];\n\tavailable?: boolean;\n\tvisible?: boolean;\n\tposition?: number;\n\tvideoUrl?: string;\n\tsellUnitType?: SellUnitType;\n\ttaxClassId?: number | null;\n}\n\nexport enum ProductView {\n\tLIST = \"list\",\n\tGRID = \"grid\",\n}\n\nexport interface DashboardProduct extends Omit<Product, \"addons\"> {\n\taddons: number[];\n}\n\nexport enum SellUnitType {\n\tPIECE = \"PIECE\",\n\tWEIGHT = \"WEIGHT\",\n\tVOLUME = \"VOLUME\",\n}\n","import { priceFormatter } from \"@sorocraft/js-utils\";\nimport { Product, ProductVariant } from \"../models\";\nimport { MenuAddonOption } from \"src/models\";\n\nexport const getUnitListingPrice = (item: {\n\tprice?: number | null;\n\tlistingPrice?: number | null;\n}) => item?.listingPrice ?? item?.price ?? 0;\n\nexport const getProductListingPrice = (product: Product, currency: string, language: string) => {\n\tconst listingPrice = getUnitListingPrice(product);\n\treturn priceFormatter(listingPrice, currency, language);\n};\n\nexport const getVariantListingPrice = (\n\tvariant: ProductVariant,\n\tcurrency: string,\n\tlanguage: string,\n) => {\n\tconst listingPrice = getUnitListingPrice(variant);\n\treturn priceFormatter(listingPrice, currency, language);\n};\n\nexport const getOptionListingPrice = (\n\toption: MenuAddonOption,\n\tcurrency: string,\n\tlanguage: string,\n) => {\n\tconst listingPrice = getUnitListingPrice(option);\n\treturn priceFormatter(listingPrice, currency, language);\n};\n","export enum MenuAddonSelectType {\n\tSINGLE = \"SINGLE\",\n\tMULTIPLE = \"MULTIPLE\",\n}\n\nexport interface MenuAddonOption {\n\tid?: number;\n\t/** Net price (tax-exclusive) — server-of-record value. */\n\tprice: number;\n\t/**\n\t * Gross price for menu display: net price plus the parent product's\n\t * `addToListingPrice` taxes. Equals `price` when no branch context is\n\t * supplied (e.g. addon detached from a branch tax setup).\n\t */\n\tlistingPrice: number;\n\ttitle: Record<string, string>;\n\tremove?: boolean;\n}\n\nexport interface MenuAddon {\n\tid?: number;\n\tselectType: MenuAddonSelectType;\n\toptions: MenuAddonOption[];\n\tbusinessId?: number;\n\ttitle: Record<string, string>;\n}\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { MenuAddonSelectType } from \"src/modules/addon/models\";\nimport * as orderModels from \"src/modules/order/models\";\n\nimport { Product } from \"../models\";\nimport { getUnitListingPrice } from \"./listing-price\";\n\nexport const getAllSelectedOptionsListingPrice = (\n\tproduct: Pick<Product, \"addons\">,\n\tselectedAddons: orderModels.SelectedAddons = {},\n): number => {\n\tlet total = 0;\n\n\tfor (const addon of product?.addons || []) {\n\t\tconst { id: addonId, selectType, options } = addon;\n\n\t\tif (!Object.prototype.hasOwnProperty.call(selectedAddons, addonId)) continue;\n\n\t\tconst selection = selectedAddons[addonId];\n\t\tconst selectedOptionIds =\n\t\t\tselectType === MenuAddonSelectType.SINGLE\n\t\t\t\t? [selection as number]\n\t\t\t\t: ((selection || []) as number[]);\n\n\t\tfor (const optionId of selectedOptionIds) {\n\t\t\tconst option = (options || []).find(({ id }) => id === optionId);\n\t\t\tif (option) total += getUnitListingPrice(option);\n\t\t}\n\t}\n\n\treturn total;\n};\n\nexport const getProductOrderPrice = ({\n\tproduct,\n\tquantity,\n\tlanguage,\n\tcurrency,\n\tvariantId,\n\tselectedAddons,\n}: {\n\tproduct: Product;\n\tquantity: number;\n\tlanguage: string;\n\tcurrency: string;\n\tvariantId?: number;\n\tselectedAddons?: Record<number, number | number[]>;\n}) => {\n\tif (!product || Object.keys(product).length === 0) {\n\t\treturn priceFormatter(0, currency, language);\n\t}\n\n\tconst variant = variantId\n\t\t? (product.variants || []).find(({ id }) => id === variantId)\n\t\t: undefined;\n\n\tconst baseUnitPrice = variantId ? getUnitListingPrice(variant) : getUnitListingPrice(product);\n\tconst optionsUnitPrice = getAllSelectedOptionsListingPrice(product, selectedAddons);\n\n\tconst totalPrice = (baseUnitPrice + optionsUnitPrice) * quantity;\n\n\treturn priceFormatter(totalPrice, currency, language);\n};\n","import * as customerModels from \"../customer/models\";\nimport * as productModels from \"../product/models\";\n\nexport enum OrderType {\n\tDINE_IN = \"DINE_IN\",\n\tPICK_UP = \"PICK_UP\",\n\tDELIVERY = \"DELIVERY\",\n}\n\nexport enum OrderStatus {\n\tDRAFT = \"DRAFT\",\n\tPENDING = \"PENDING\",\n\tCONFIRMED = \"CONFIRMED\",\n\tPREPARING = \"PREPARING\",\n\tREADY = \"READY\",\n\tOUT_FOR_DELIVERY = \"OUT_FOR_DELIVERY\",\n\tDELIVERED = \"DELIVERED\",\n\tCOMPLETED = \"COMPLETED\",\n\tCANCELLED = \"CANCELLED\",\n\tFAILED = \"FAILED\",\n}\n\nexport enum OrderItemStatus {\n\tPENDING = \"PENDING\",\n\tPREPARING = \"PREPARING\",\n\tREADY = \"READY\",\n\tSERVED = \"SERVED\",\n}\n\nexport enum PaymentMethod {\n\tCASH = \"CASH\",\n\tCARD = \"CARD\",\n\tWALLET = \"WALLET\",\n\tTERMINAL = \"TERMINAL\",\n}\n\nexport interface OrderAddonOption {\n\toptionId: number;\n\t/** Gross unit price (listingPrice from the menu listing). */\n\tprice: number;\n}\n\nexport interface OrderAddon {\n\tid?: number;\n\taddonId: number;\n\toptions: OrderAddonOption[];\n}\n\nexport interface SelectedAddons {\n\t[key: number]: number | number[];\n}\n\nexport interface OrderItemVariant {\n\tid?: number;\n\tvariantId: number;\n\t/** Gross unit price (listingPrice from the menu listing). */\n\tprice: number;\n}\n\nexport interface OrderItem {\n\tid?: number;\n\tproductId: number;\n\torderId?: number;\n\tquantity: number;\n\t/**\n\t * Gross unit price (listingPrice) at the moment the line was added. The\n\t * server recomputes authoritative totals on create/preview; this value is\n\t * what the cart UI displays.\n\t */\n\tprice?: number;\n\tvariant?: OrderItemVariant;\n\taddons: OrderAddon[];\n\tnote?: string;\n\tstatus?: OrderItemStatus;\n\tisPaid?: boolean;\n\tsellUnitType: productModels.SellUnitType;\n}\n\nexport interface Order {\n\tid?: number;\n\tbusinessId?: number;\n\tbranchId?: number;\n\tworkingDayId?: number;\n\ttableId?: number;\n\temployeeId?: number;\n\torderType: OrderType;\n\titems: OrderItem[];\n\tstatus?: OrderStatus;\n\tpreferredPaymentMethod?: PaymentMethod;\n\tnote?: string;\n\tcreatedAt?: number;\n\tupdatedAt?: number;\n\tcustomer?: customerModels.Customer;\n\tcurrency?: string;\n\ttrackingId?: string;\n}\n\nexport interface OrderItems {\n\t[key: string]: OrderItem;\n}\n\nexport enum OrderStep {\n\tCART = \"CART\",\n\tDETAILS = \"DETAILS\",\n\tCOMPLETED = \"COMPLETED\",\n}\n\nexport interface OrderPayload extends Order {\n\tcustomerAddressId: number;\n\tcustomerId: number;\n\tlanguage?: string;\n}\n\n/**\n * Contact + delivery snapshot an unregistered (\"guest\") visitor enters at\n * checkout. Mirrors the backend GuestContact: every field is optional, and an\n * address is only meaningful for DELIVERY orders. latitude/longitude are kept\n * as numbers here for the UI (they come from the address autocomplete); they're\n * serialized to strings in the wire payload — see GuestContactRequest.\n */\nexport interface GuestContact {\n\tfullName?: string;\n\tphoneNumber?: string;\n\temail?: string;\n\tstreet?: string;\n\thouseNumber?: string;\n\tadditionalNumber?: string;\n\tfloor?: number;\n\tlatitude?: number;\n\tlongitude?: number;\n\tcityName?: string;\n\tcountryCode?: string;\n\tpostCode?: string;\n\tinstructions?: string;\n}\n\n/**\n * Wire shape of the contact sent to POST /order/public. Matches the backend\n * GuestContact, where latitude/longitude are strings.\n */\nexport interface GuestContactRequest\n\textends Omit<GuestContact, \"latitude\" | \"longitude\"> {\n\tlatitude?: string;\n\tlongitude?: string;\n}\n\n/**\n * Payload for the public, non-authenticated create path (POST /order/public).\n * Unlike OrderPayload it carries no customerId/customerAddressId — an\n * unregistered visitor has no account or stored address book; the delivery\n * address (when given) travels inside the contact snapshot.\n */\nexport interface GuestOrderPayload extends Order {\n\tlanguage?: string;\n\tcontact?: GuestContactRequest;\n}\n\nexport interface CalculatePreviewItemRequest {\n\torderItemsId: string;\n\tproductId: number;\n\tquantity: number;\n\tvariant?: { variantId: number };\n\taddons?: Array<{\n\t\taddonId: number;\n\t\toptions: Array<{ optionId: number }>;\n\t}>;\n}\n\nexport interface CalculatePreviewRequest {\n\tbusinessId?: number;\n\tbranchId: number;\n\torderType: OrderType;\n\titems: CalculatePreviewItemRequest[];\n}\n\nexport interface CalculatePreviewTax {\n\tbranchTaxId: number;\n\tname: Record<string, string>;\n\trate: number;\n\ttype: \"percentage\" | \"fixed\";\n\taddToListingPrice: boolean;\n\tamount: number;\n}\n\nexport interface CalculatePreviewLine {\n\torderItemsId: string;\n\tproductId: number;\n\tquantity: number;\n\tprice: number;\n\ttaxes: CalculatePreviewTax[];\n}\n\nexport interface CalculatePreviewResponse {\n\ttotalPriceWithoutTax: number;\n\ttotalPriceWithTax: number;\n\ttotalPriceWithTaxAndFees: number;\n\ttotalTax: number;\n\tdeliveryFee: number;\n\tserviceFee: number;\n\titems: CalculatePreviewLine[];\n\ttaxes: CalculatePreviewTax[];\n}\n\nexport interface OrderPreviewState {\n\tdata: CalculatePreviewResponse | null;\n\tisLoading: boolean;\n\terror: string | null;\n}\n","import { OrderPreviewState, OrderStep, PaymentMethod } from \"./models\";\n\nexport const initialOrder = {\n\torderType: null,\n\tpreferredPaymentMethod: PaymentMethod.CASH,\n};\n\nexport const ORDER_STEPS = [OrderStep.CART, OrderStep.DETAILS, OrderStep.COMPLETED];\n\nexport const initialPreviewState: OrderPreviewState = {\n\tdata: null,\n\tisLoading: false,\n\terror: null,\n};\n\nexport enum OrderErrors {\n\tFIELD_REQUIRED_ERROR = \"This field is required\",\n\tTABLE_NOT_SELECTED = \"Please select a table\",\n\tADDRESS_IS_EMPTY = \"Please enter an address\",\n\tEMPTY_ITEMS = \"Please choose product\",\n\tBRANCH_NOT_SELECTED = \"Please select a branch\",\n}\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { priceFormatter } from \"@sorocraft/js-utils\";\nimport { OrderItem } from \"../models\";\n\nexport const getOrderItemListingRawPrice = (orderItem: OrderItem) => {\n\tconst { price, variant, addons, quantity } = orderItem || {};\n\n\tconst baseUnitPrice = variant?.price ?? price ?? 0;\n\n\tconst addonsUnitPrice = (addons || []).reduce(\n\t\t(addonSum, addon) =>\n\t\t\taddonSum +\n\t\t\t(addon?.options || []).reduce((optionSum, option) => optionSum + (option?.price ?? 0), 0),\n\t\t0,\n\t);\n\n\tconst unitPrice = baseUnitPrice + addonsUnitPrice;\n\treturn unitPrice * (quantity ?? 1);\n};\n\nexport const getOrderItemListingPrice = (\n\torderItem: OrderItem,\n\tcurrency: string,\n\tlanguage: string,\n) => {\n\tconst totalPrice = getOrderItemListingRawPrice(orderItem);\n\n\treturn priceFormatter(totalPrice, currency, language);\n};\n","export enum CustomerAuthStep {\n\tPHONE = \"PHONE\",\n\tOTP = \"OTP\",\n\tEMAIL = \"EMAIL\",\n}\n\nexport enum CustomerAddressType {\n\tHOME = \"HOME\",\n\tWORK = \"WORK\",\n\tTRAVEL = \"TRAVEL\",\n}\n\nexport interface CustomerAddress {\n\tid?: number;\n\taddressId?: number; // Update address temporary\n\tcountryCode: string;\n\tcityName: string;\n\tstreet: string;\n\thouseNumber: string;\n\tadditionalNumber?: string;\n\tpostCode?: string;\n\tinstructions?: string;\n\tfloor?: number;\n\tlongitude?: number;\n\tlatitude?: number;\n\ttitle?: string;\n\ttype?: CustomerAddressType;\n}\n\nexport interface CustomerAuthForm {\n\totp: string;\n\temail: string;\n}\n\nexport interface CustomerAuthPhoneForm {\n\tcountryCode: string;\n\tphoneNumber: string;\n}\n\nexport interface AuthResponse {\n\taccessToken: string;\n\trefreshToken: string;\n}\n\nexport interface Customer {\n\tid?: number;\n\temail: string;\n\tphoneNumber: string;\n\tfullName: string;\n\tsmsVerified?: boolean;\n\temailVerified?: boolean;\n\taddress?: CustomerAddress;\n\taddresses?: CustomerAddress[];\n}\n\nexport type CustomerUpdatePayload = Partial<Customer>;\n","export enum Feature {\n\tUPLOAD_VIDEO = \"UPLOAD_VIDEO\",\n}\nexport enum FeatureSegment {\n\tALPHA = \"ALPHA\",\n\tBETA = \"BETA\",\n\tALL = \"ALL\",\n}\n","import { Feature, FeatureSegment } from \"./models\";\n\nexport const FEATURES_LIST: { [key in FeatureSegment]: Feature[] } = {\n\t[FeatureSegment.ALPHA]: [Feature.UPLOAD_VIDEO],\n\t[FeatureSegment.BETA]: [],\n\t[FeatureSegment.ALL]: [],\n};\n","export const MODALS = {\n\tADD_UPDATE_NOTES: \"ADD_UPDATE_NOTES\",\n\tAUTH: \"AUTH\",\n\tADD_UPDATE_ADDRESS: \"ADD_UPDATE_ADDRESS\",\n\tBRANCH_BUSINESS_HOURS: \"BRANCH_BUSINESS_HOURS\",\n\tPRODUCT_DETAILS: \"PRODUCT_DETAILS\",\n};\n\nexport const SUPPORTED_LOCALES = [\"en\", \"az\", \"nl\", \"et\", \"tr\", \"ru\", \"pl\", \"pt\", \"hr\"];\nexport const SUPPORTED_COUNTRIES = [\n\t{\n\t\tname: \"Azerbaijan\",\n\t\tcode: \"AZ\",\n\t\tphoneCode: \"+994\",\n\t},\n];\n\nexport const DOMAIN = \"tabres.com\";\n\nexport const DEFAULT_HOSTNAME = DOMAIN;\n\nexport const IMAGE_BASE_URL = \"https://images.tabres.com\";\n","import { DOMAIN, IMAGE_BASE_URL } from \"./constants\";\n\ninterface ValidationResult {\n\tisValid: boolean;\n\terror?: string;\n}\n\ntype Validator = (cleanedNumber: string) => ValidationResult;\n\nconst validators: Record<string, Validator> = {\n\t\"994\": (number) => {\n\t\tconst AZERBAIJANI_PREFIXES = [\"50\", \"51\", \"10\", \"55\", \"99\", \"70\", \"77\", \"60\"];\n\t\tconst pattern = new RegExp(`^(${AZERBAIJANI_PREFIXES.join(\"|\")})\\\\d{7}$`);\n\n\t\tif (!pattern.test(number)) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\terror: `Azerbaijani numbers must be 9 digits and start with ${AZERBAIJANI_PREFIXES.join(\n\t\t\t\t\t\", \"\n\t\t\t\t)}`,\n\t\t\t};\n\t\t}\n\n\t\treturn { isValid: true };\n\t},\n\n\t\"31\": (number) => {\n\t\tconst pattern = /^\\d{9}$/;\n\n\t\tif (!pattern.test(number)) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\terror: \"Dutch numbers must be exactly 9 digits\",\n\t\t\t};\n\t\t}\n\n\t\treturn { isValid: true };\n\t},\n};\n\nexport function validatePhoneNumber(phoneNumber: string): ValidationResult {\n\tif (!phoneNumber) {\n\t\treturn { isValid: false, error: \"FIELD_REQUIRED\" };\n\t}\n\n\tconst cleaned = phoneNumber.replace(/\\D/g, \"\");\n\n\tconst countryCode = cleaned.startsWith(\"994\") ? \"994\" : cleaned.startsWith(\"31\") ? \"31\" : null;\n\n\tif (!countryCode) {\n\t\treturn { isValid: false, error: \"Unsupported country code\" };\n\t}\n\n\tconst nationalNumber = cleaned.slice(countryCode.length);\n\tconst validator = validators[countryCode];\n\n\treturn validator(nationalNumber);\n}\n\nexport const getBaseUrl = (hostname: string, language: string) => {\n\tconst locale = language || \"en\";\n\t// Local env\n\tif (hostname === \"localhost:3000\") {\n\t\treturn { url: `http://localhost:3000/${locale}`, domain: DOMAIN };\n\t}\n\t// Prod env\n\treturn { url: `https://${DOMAIN}/${locale}`, domain: DOMAIN };\n};\n\nexport const getRegisterUrl = (language: string, source: string) => {\n\treturn `https://app.tabres.com/auth/register?lang=${language}&utm_source=${source}`;\n};\n\nexport const getImageSource = (image?: string) => {\n\tif (!image) return \"\";\n\n\tif (image.includes(\"base64\") || image.startsWith(\"https://\")) return image;\n\n\treturn `${IMAGE_BASE_URL}/${image}`;\n};\n\nexport const getLogoImageSource = (logoImage?: string) => {\n\tif (!logoImage) return \"https://images.tabres.com/no-photo-128.webp\";\n\n\tif (logoImage.includes(\"base64\") || logoImage.startsWith(\"https://\")) return logoImage;\n\n\treturn `${IMAGE_BASE_URL}/${logoImage}`;\n};\n\nexport const getCoverPhotoSource = (coverPhoto?: string) => {\n\tif (!coverPhoto) return \"https://images.tabres.com/tabres-doodle.webp\";\n\n\tif (coverPhoto.includes(\"base64\") || coverPhoto.startsWith(\"https://\")) return coverPhoto;\n\n\treturn `${IMAGE_BASE_URL}/${coverPhoto}`;\n};\n\nconst keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nconst triplet = (e1: number, e2: number, e3: number) =>\n\tkeyStr.charAt(e1 >> 2) +\n\tkeyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +\n\tkeyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +\n\tkeyStr.charAt(e3 & 63);\n\nexport const rgbDataURL = (r: number, g: number, b: number) =>\n\t`data:image/gif;base64,R0lGODlhAQABAPAA${\n\t\ttriplet(0, r, g) + triplet(b, 255, 255)\n\t}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;\n\nexport const getVideoSource = (video?: string) => {\n\tif (!video) return \"\";\n\n\tif (video.includes(\"base64\") || video.startsWith(\"https://\")) return video;\n\n\treturn `${IMAGE_BASE_URL}/${video}`;\n};\n\nexport const adjustLightness = (hex: string, deltaPct: number) => {\n\tconst n = parseInt(hex.replace(\"#\", \"\"), 16);\n\tconst r = ((n >> 16) & 0xff) / 255;\n\tconst g = ((n >> 8) & 0xff) / 255;\n\tconst b = (n & 0xff) / 255;\n\n\tconst max = Math.max(r, g, b);\n\tconst min = Math.min(r, g, b);\n\tconst l = (max + min) / 2;\n\tlet h = 0;\n\tlet s = 0;\n\tif (max !== min) {\n\t\tconst d = max - min;\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\tswitch (max) {\n\t\t\tcase r:\n\t\t\t\th = (g - b) / d + (g < b ? 6 : 0);\n\t\t\t\tbreak;\n\t\t\tcase g:\n\t\t\t\th = (b - r) / d + 2;\n\t\t\t\tbreak;\n\t\t\tcase b:\n\t\t\t\th = (r - g) / d + 4;\n\t\t\t\tbreak;\n\t\t}\n\t\th /= 6;\n\t}\n\n\tconst newL = Math.max(0, Math.min(1, l + deltaPct / 100));\n\n\tconst hueToRgb = (p: number, q: number, t: number) => {\n\t\tif (t < 0) t += 1;\n\t\tif (t > 1) t -= 1;\n\t\tif (t < 1 / 6) return p + (q - p) * 6 * t;\n\t\tif (t < 1 / 2) return q;\n\t\tif (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n\t\treturn p;\n\t};\n\n\tlet r2 = newL;\n\tlet g2 = newL;\n\tlet b2 = newL;\n\tif (s !== 0) {\n\t\tconst q = newL < 0.5 ? newL * (1 + s) : newL + s - newL * s;\n\t\tconst p = 2 * newL - q;\n\t\tr2 = hueToRgb(p, q, h + 1 / 3);\n\t\tg2 = hueToRgb(p, q, h);\n\t\tb2 = hueToRgb(p, q, h - 1 / 3);\n\t}\n\n\tconst toHex = (x: number) =>\n\t\tMath.round(x * 255)\n\t\t\t.toString(16)\n\t\t\t.padStart(2, \"0\");\n\treturn `#${toHex(r2)}${toHex(g2)}${toHex(b2)}`;\n};\n","import { isEmpty } from \"@sorocraft/js-utils\";\nimport { Category, CategoryTranslation } from \"./models\";\n\nexport const getCategoryTranslation = (\n\tcategory: Category,\n\tlanguage: string\n): CategoryTranslation => {\n\treturn (category?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as CategoryTranslation;\n};\n\nexport const getCategoryNameById = (\n\tcategoryId: number,\n\tcategories: Category[],\n\tlanguage: string\n): string => {\n\tconst category = categories?.find?.(({ id }) => id === categoryId);\n\n\tif (isEmpty(category)) return \"\";\n\n\tconst { name } = getCategoryTranslation(category, language);\n\n\treturn name || \"\";\n};\n","export enum EmployeePermission {\n\tVIEW_BUSINESS = \"VIEW_BUSINESS\",\n\tUPDATE_BUSINESS = \"UPDATE_BUSINESS\",\n\tVIEW_BUSINESS_FINANCIALS = \"VIEW_BUSINESS_FINANCIALS\",\n\tVIEW_ORDERS = \"VIEW_ORDERS\",\n\tUPDATE_ORDER = \"UPDATE_ORDER\",\n\tCREATE_ORDER = \"CREATE_ORDER\",\n\tAPPLY_DISCOUNT = \"APPLY_DISCOUNT\",\n\tVIEW_QR_MENU = \"VIEW_QR_MENU\",\n\tUPDATE_QR_MENU = \"UPDATE_QR_MENU\",\n\tVIEW_MENU = \"VIEW_MENU\",\n\tVIEW_MENU_ITEMS = \"VIEW_MENU_ITEMS\",\n\tCREATE_MENU_ITEM = \"CREATE_MENU_ITEM\",\n\tUPDATE_MENU_ITEM = \"UPDATE_MENU_ITEM\",\n\tDELETE_MENU_ITEM = \"DELETE_MENU_ITEM\",\n\tVIEW_CATEGORIES = \"VIEW_CATEGORIES\",\n\tUPDATE_CATEGORY = \"UPDATE_CATEGORY\",\n\tCREATE_CATEGORY = \"CREATE_CATEGORY\",\n\tDELETE_CATEGORY = \"DELETE_CATEGORY\",\n\tVIEW_ADDONS = \"VIEW_ADDONS\",\n\tUPDATE_ADDON = \"UPDATE_ADDON\",\n\tCREATE_ADDON = \"CREATE_ADDON\",\n\tDELETE_ADDON = \"DELETE_ADDON\",\n\tVIEW_TABLES = \"VIEW_TABLES\",\n\tUPDATE_TABLE = \"UPDATE_TABLE\",\n\tUPDATE_TABLE_STATUS = \"UPDATE_TABLE_STATUS\",\n\tCREATE_TABLE = \"CREATE_TABLE\",\n\tDELETE_TABLE = \"DELETE_TABLE\",\n\tVIEW_BRANCHES = \"VIEW_BRANCHES\",\n\tUPDATE_BRANCH = \"UPDATE_BRANCH\",\n\tCREATE_BRANCH = \"CREATE_BRANCH\",\n\tDELETE_BRANCH = \"DELETE_BRANCH\",\n\tVIEW_EMPLOYEES = \"VIEW_EMPLOYEES\",\n\tUPDATE_EMPLOYEE = \"UPDATE_EMPLOYEE\",\n\tCREATE_EMPLOYEE = \"CREATE_EMPLOYEE\",\n\tDELETE_EMPLOYEE = \"DELETE_EMPLOYEE\",\n\tVIEW_ANALYTICS = \"VIEW_ANALYTICS\",\n\tVIEW_SALES_REPORTS = \"VIEW_SALES_REPORTS\",\n\tVIEW_SUBSCRIPTION = \"VIEW_SUBSCRIPTION\",\n\tUPDATE_SUBSCRIPTION = \"UPDATE_SUBSCRIPTION\",\n\tVIEW_QR_CODES = \"VIEW_QR_CODES\",\n\tCREATE_QR_CODE = \"CREATE_QR_CODE\",\n\tDELETE_QR_CODE = \"DELETE_QR_CODE\",\n\tALL = \"ALL\",\n\t// Inventory\n\tVIEW_INVENTORY = \"VIEW_INVENTORY\",\n\tVIEW_PURCHASES = \"VIEW_PURCHASES\",\n\tVIEW_PURCHASE_DETAIL = \"VIEW_PURCHASE_DETAIL\",\n\tCREATE_PURCHASE = \"CREATE_PURCHASE\",\n\tUPDATE_PURCHASE = \"UPDATE_PURCHASE\",\n\tDELETE_PURCHASE = \"DELETE_PURCHASE\",\n\tVIEW_INVENTORY_PRODUCTS = \"VIEW_INVENTORY_PRODUCTS\",\n\tCREATE_INVENTORY_PRODUCT = \"CREATE_INVENTORY_PRODUCT\",\n\tUPDATE_INVENTORY_PRODUCT = \"UPDATE_INVENTORY_PRODUCT\",\n\tDELETE_INVENTORY_PRODUCT = \"DELETE_INVENTORY_PRODUCT\",\n\tVIEW_BUSINESS_BALANCE = \"VIEW_BUSINESS_BALANCE\",\n\tVIEW_BRANCH_BALANCE = \"VIEW_BRANCH_BALANCE\",\n\tUPDATE_PRODUCT_INGREDIENTS = \"UPDATE_PRODUCT_INGREDIENTS\",\n\tDELETE_PRODUCT_INGREDIENTS = \"DELETE_PRODUCT_INGREDIENTS\",\n\tAI_ASSISTANT = \"AI_ASSISTANT\",\n\tVIEW_PAYMENTS = \"VIEW_PAYMENTS\",\n\tTAKE_PAYMENT = \"TAKE_PAYMENT\",\n\tREFUND_PAYMENT = \"REFUND_PAYMENT\",\n\tPAYMENT_COMP = \"COMP\",\n}\n\nexport enum UserRole {\n\tOWNER = \"OWNER\",\n\tBRANCH_MANAGER = \"BRANCH_MANAGER\",\n\tGENERAL_MANAGER = \"GENERAL_MANAGER\",\n\tCHEF = \"CHEF\",\n\tSOUS_CHEF = \"SOUS_CHEF\",\n\tPASTRY_CHEF = \"PASTRY_CHEF\",\n\tLINE_COOK = \"LINE_COOK\",\n\tPREP_COOK = \"PREP_COOK\",\n\tKITCHEN_ASSISTANT = \"KITCHEN_ASSISTANT\",\n\tDISHWASHER = \"DISHWASHER\",\n\tHEAD_WAITER = \"HEAD_WAITER\",\n\tWAITER = \"WAITER\",\n\tRUNNER = \"RUNNER\",\n\tBARISTA = \"BARISTA\",\n\tBARTENDER = \"BARTENDER\",\n\tSOMMELIER = \"SOMMELIER\",\n\tACCOUNTANT = \"ACCOUNTANT\",\n\tROOM_SERVICE_STAFF = \"ROOM_SERVICE_STAFF\",\n\tDELIVERY_DRIVER = \"DELIVERY_DRIVER\",\n\tINVENTORY_MANAGER = \"INVENTORY_MANAGER\",\n\tPURCHASING_MANAGER = \"PURCHASING_MANAGER\",\n\tWAREHOUSE_STAFF = \"WAREHOUSE_STAFF\",\n\tCASHIER = \"CASHIER\"\n}\n\nexport interface User {\n\tid?: number;\n\temail: string;\n\tfullName: string;\n\trole?: UserRole;\n\tavatar64?: string | null;\n\tavatar128?: string | null;\n\tavatar256?: string | null;\n\tbusinessId?: number;\n\tbranchId?: number | null;\n\tcreatedAt: string;\n\temailVerified?: boolean;\n\tpermissions?: EmployeePermission[];\n}\n","import { isEmpty, sortNumbers } from \"@sorocraft/js-utils\";\nimport { IconType } from \"@sorocraft/ui\";\nimport { Check, BagCheck, Delivery, Chef, FileCheck, HourglassHalf } from \"@sorocraft/ui/icons\";\n\nimport {\n\tCalculatePreviewResponse,\n\tGuestContact,\n\tGuestContactRequest,\n\tOrder,\n\tOrderAddon,\n\tOrderAddonOption,\n\tOrderItem,\n\tOrderStatus,\n\tOrderType,\n\tSelectedAddons,\n} from \"./models\";\n\nimport * as addonModels from \"../addon/models\";\nimport * as branchModels from \"../branch/models\";\nimport { OrderErrors } from \"./constants\";\n\nexport const generateOrderItemsId = (\n\tproductId: number,\n\tvariantId: number | null,\n\tselectedAddons?: SelectedAddons,\n): string => {\n\tif (!productId) throw new Error(\"Product ID is required\");\n\n\t// Build the order items ID base with productId and variantId\n\tlet orderItemsId = `${productId}`;\n\tif (variantId) {\n\t\torderItemsId += `-${variantId}`;\n\t}\n\n\t// Build the addon part of the ID\n\tconst addonIdsPart = Object.entries(selectedAddons || {})\n\t\t.map(([addonId, option]) => {\n\t\t\tif (!addonId || !option) return null; // Skip invalid entries\n\t\t\tconst optionIds = Array.isArray(option)\n\t\t\t\t? sortNumbers(option).filter(Boolean).join(\"-\")\n\t\t\t\t: `${option}`;\n\t\t\tif (!optionIds) return null;\n\t\t\treturn `${addonId}-${optionIds}`;\n\t\t})\n\t\t.filter(Boolean) // Remove null/undefined values\n\t\t.join(\"-\");\n\n\t// Append addonIdsPart if it's not empty\n\tif (addonIdsPart) {\n\t\torderItemsId += `-${addonIdsPart}`;\n\t}\n\n\treturn orderItemsId;\n};\n\nexport const getSelectedAddonsFromOrderItems = (item: OrderItem): SelectedAddons => {\n\tconst selectedAddons: SelectedAddons = {};\n\n\tfor (const { addonId, options = [] } of item.addons || []) {\n\t\tconst optionIds = options.map(({ optionId }) => optionId);\n\t\tselectedAddons[addonId] = optionIds.length === 1 ? optionIds[0] : optionIds;\n\t}\n\n\treturn selectedAddons;\n};\n\nexport const getStatusIcon = (status: OrderStatus): IconType => {\n\tswitch (status) {\n\t\tcase OrderStatus.COMPLETED:\n\t\t\treturn Check;\n\t\tcase OrderStatus.DELIVERED:\n\t\t\treturn BagCheck;\n\t\tcase OrderStatus.OUT_FOR_DELIVERY:\n\t\t\treturn Delivery;\n\t\tcase OrderStatus.PREPARING:\n\t\t\treturn Chef;\n\t\tcase OrderStatus.CONFIRMED:\n\t\t\treturn FileCheck;\n\t\tcase OrderStatus.PENDING:\n\t\t\treturn HourglassHalf;\n\n\t\tdefault:\n\t\t\treturn HourglassHalf;\n\t}\n};\n\nexport const buildSelectedAddonsPayload = (\n\tproductAddons: addonModels.MenuAddon[] = [],\n\tselectedAddons: SelectedAddons = {},\n): OrderAddon[] => {\n\treturn Object.entries(selectedAddons).map(([addonIdStr, selected]) => {\n\t\tconst addonId = Number(addonIdStr);\n\t\tconst selectedOptionIds = Array.isArray(selected) ? selected : [selected];\n\n\t\tconst addon = productAddons.find((addon) => addon.id === addonId);\n\t\tif (isEmpty(addon)) {\n\t\t\treturn {\n\t\t\t\taddonId,\n\t\t\t\toptions: [],\n\t\t\t};\n\t\t}\n\n\t\tconst options: OrderAddonOption[] = (addon.options || [])\n\t\t\t.filter((option) => selectedOptionIds.includes(option.id))\n\t\t\t.map((option) => ({\n\t\t\t\toptionId: option.id,\n\t\t\t\tprice: option.listingPrice ?? option.price,\n\t\t\t}));\n\n\t\treturn {\n\t\t\taddonId,\n\t\t\toptions,\n\t\t};\n\t});\n};\n\nexport const getDefaultOrderType = (\n\tsettings: branchModels.BranchSettings,\n\tisOpen: boolean,\n\tisDelivering: boolean,\n): OrderType | null => {\n\tif (!settings) return null;\n\n\tconst { deliveryOrderEnabled, dineInOrderEnabled, pickupOrderEnabled } = settings;\n\n\tif (deliveryOrderEnabled && isDelivering) {\n\t\treturn OrderType.DELIVERY;\n\t}\n\n\tif (dineInOrderEnabled && isOpen) {\n\t\treturn OrderType.DINE_IN;\n\t}\n\n\tif (pickupOrderEnabled && isOpen) {\n\t\treturn OrderType.PICK_UP;\n\t}\n\n\treturn null;\n};\n\n// Defensive shape check for the /order/calculate response. The service is\n// typed as CalculatePreviewResponse, but the network can return malformed\n// payloads (empty body, HTML error page) that would corrupt preview state\n// and break price-line lookups downstream.\nexport const isValidPreviewResponse = (data: unknown): data is CalculatePreviewResponse => {\n\tif (!data || typeof data !== \"object\") return false;\n\tconst d = data as Partial<CalculatePreviewResponse>;\n\treturn (\n\t\ttypeof d.totalPriceWithoutTax === \"number\" &&\n\t\ttypeof d.totalPriceWithTax === \"number\" &&\n\t\ttypeof d.totalPriceWithTaxAndFees === \"number\" &&\n\t\ttypeof d.totalTax === \"number\" &&\n\t\ttypeof d.deliveryFee === \"number\" &&\n\t\ttypeof d.serviceFee === \"number\" &&\n\t\tArray.isArray(d.items) &&\n\t\tArray.isArray(d.taxes)\n\t);\n};\n\n// Build the contact snapshot sent to POST /order/public from the in-memory\n// guest contact. Drops empty/blank fields so a guest who entered nothing\n// produces no contact at all, and serializes lat/long to strings (and floor to\n// a number) to match the backend GuestContact shape.\nexport const buildGuestContactRequest = (\n\tcontact?: GuestContact,\n): GuestContactRequest | undefined => {\n\tif (isEmpty(contact)) return undefined;\n\n\tconst populated = Object.entries(contact).filter(\n\t\t([, value]) => value !== undefined && value !== null && value !== \"\",\n\t);\n\tif (populated.length === 0) return undefined;\n\n\tconst { latitude, longitude, floor, ...rest } = Object.fromEntries(\n\t\tpopulated,\n\t) as GuestContact;\n\n\treturn {\n\t\t...rest,\n\t\t...(floor != null ? { floor: Number(floor) } : {}),\n\t\t...(latitude != null ? { latitude: `${latitude}` } : {}),\n\t\t...(longitude != null ? { longitude: `${longitude}` } : {}),\n\t};\n};\n\nexport const getOrderErrorMessages = (field: keyof Order) => {\n\tswitch (field) {\n\t\tcase \"customer\":\n\t\t\treturn OrderErrors.ADDRESS_IS_EMPTY;\n\n\t\tcase \"tableId\":\n\t\t\treturn OrderErrors.TABLE_NOT_SELECTED;\n\n\t\tcase \"items\":\n\t\t\treturn OrderErrors.EMPTY_ITEMS;\n\n\t\tcase \"branchId\":\n\t\t\treturn OrderErrors.BRANCH_NOT_SELECTED;\n\n\t\tdefault:\n\t\t\treturn OrderErrors.FIELD_REQUIRED_ERROR;\n\t}\n};\n\nexport * from \"./utils/item-price\";\n","import { FormErrors } from \"@sorocraft/ui\";\nimport { checkIsValidEmail } from \"@sorocraft/js-utils\";\n\nimport {\n\tCustomerAddress,\n\tCustomerAuthForm,\n\tCustomerAuthPhoneForm,\n\tCustomerAuthStep,\n} from \"./models\";\n\nexport const preparePhoneNumber = (form: CustomerAuthPhoneForm) => {\n\tconst phoneNumber = `${form.countryCode}${form.phoneNumber}`.replaceAll(\"+\", \"\");\n\n\treturn phoneNumber;\n};\n\nexport const validateForm = (form: CustomerAuthForm, step: CustomerAuthStep): FormErrors => {\n\tconst errors: FormErrors = {};\n\tconst { email, otp } = form || {};\n\n\tswitch (step) {\n\t\tcase CustomerAuthStep.OTP: {\n\t\t\tif (!email || !checkIsValidEmail(email)) {\n\t\t\t\terrors.email = \"Invalid Email Address\";\n\t\t\t}\n\n\t\t\tif (!otp || otp.length !== 6) {\n\t\t\t\terrors.otp = \"Invalid OTP\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase CustomerAuthStep.EMAIL: {\n\t\t\tif (!email || !checkIsValidEmail(email)) {\n\t\t\t\terrors.email = \"Invalid Email Address\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn errors;\n};\n\nexport const validateAddressForm = (form: CustomerAddress): FormErrors => {\n\tconst errors: FormErrors = {};\n\tconst { countryCode, cityName, street, houseNumber } = form || {};\n\n\tif (!countryCode) errors.countryCode = \"COUNTRY_REQUIRED\";\n\tif (!cityName) errors.cityName = \"CITY_REQUIRED\";\n\tif (!street) errors.street = \"STREET_REQUIRED\";\n\tif (!houseNumber) errors.houseNumber = \"STREET_NUMBER_REQUIRED\";\n\n\treturn errors;\n};\n\nexport const formatCityLine = (fields: (string | undefined)[]) => {\n\treturn (fields || []).filter(Boolean).join(\", \");\n};\n\nexport const formatAddressLine = (\n\tstreet: string,\n\thouseNumber: string,\n\tadditionalNumber: string,\n) => {\n\tconst house = [houseNumber, additionalNumber].filter(Boolean).join(\"/\");\n\tconst fullAddress = [street, house].filter(Boolean).join(\" \");\n\n\treturn fullAddress;\n};\n","import { MenuAddon, MenuAddonOption } from \"./models\";\n\nexport const getAddonTranslation = (addon: MenuAddon, language: string): string => {\n\treturn addon?.title?.[language] || \"\";\n};\n\nexport const getAddonOptionTranslation = (option: MenuAddonOption, language: string): string => {\n\treturn option?.title?.[language] || \"\";\n};\n\nexport const getOptionTitles = (\n\toptions: MenuAddonOption[],\n\toptionIds: number | number[],\n\tlanguage: string,\n): string => {\n\tif (Array.isArray(optionIds)) {\n\t\treturn (options || [])\n\t\t\t.filter(({ id }) => optionIds.includes(id))\n\t\t\t.map(({ title }) => title?.[language] || \"\")\n\t\t\t.filter(Boolean)\n\t\t\t.join(\", \");\n\t} else {\n\t\tconst option = (options || []).find(({ id }) => id === optionIds);\n\t\treturn option?.title?.[language] || \"\";\n\t}\n};\n\nexport const getAddonTitle = (addon: MenuAddon, language: string): string => {\n\treturn addon?.title?.[language] || \"\";\n};\n","import { isEmpty } from \"@sorocraft/js-utils\";\n\nimport { EmployeePermission, UserRole } from \"./models\";\n\nexport const getPermissionsByRole = (role?: UserRole) => {\n\tswitch (role) {\n\t\t/** Owner - Has every permission */\n\t\tcase UserRole.OWNER:\n\t\t\treturn [EmployeePermission.ALL];\n\n\t\t/** General Manager - All except subscription updates */\n\t\tcase UserRole.GENERAL_MANAGER:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_BUSINESS,\n\t\t\t\tEmployeePermission.UPDATE_BUSINESS,\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t\tEmployeePermission.CREATE_ORDER,\n\t\t\t\tEmployeePermission.VIEW_QR_MENU,\n\t\t\t\tEmployeePermission.VIEW_QR_CODES,\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.UPDATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.CREATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.DELETE_MENU_ITEM,\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.UPDATE_CATEGORY,\n\t\t\t\tEmployeePermission.CREATE_CATEGORY,\n\t\t\t\tEmployeePermission.DELETE_CATEGORY,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.UPDATE_ADDON,\n\t\t\t\tEmployeePermission.CREATE_ADDON,\n\t\t\t\tEmployeePermission.DELETE_ADDON,\n\t\t\t\tEmployeePermission.VIEW_TABLES,\n\t\t\t\tEmployeePermission.UPDATE_TABLE,\n\t\t\t\tEmployeePermission.CREATE_TABLE,\n\t\t\t\tEmployeePermission.DELETE_TABLE,\n\t\t\t\tEmployeePermission.VIEW_BRANCHES,\n\t\t\t\tEmployeePermission.UPDATE_BRANCH,\n\t\t\t\tEmployeePermission.CREATE_BRANCH,\n\t\t\t\tEmployeePermission.DELETE_BRANCH,\n\t\t\t\tEmployeePermission.VIEW_EMPLOYEES,\n\t\t\t\tEmployeePermission.UPDATE_EMPLOYEE,\n\t\t\t\tEmployeePermission.CREATE_EMPLOYEE,\n\t\t\t\tEmployeePermission.DELETE_EMPLOYEE,\n\t\t\t\tEmployeePermission.VIEW_ANALYTICS,\n\t\t\t\tEmployeePermission.VIEW_SALES_REPORTS,\n\t\t\t\tEmployeePermission.VIEW_SUBSCRIPTION,\n\t\t\t\tEmployeePermission.CREATE_QR_CODE,\n\t\t\t\tEmployeePermission.DELETE_QR_CODE,\n\t\t\t\tEmployeePermission.AI_ASSISTANT,\n\t\t\t];\n\n\t\t/** Branch Manager - Controls operations within one branch */\n\t\tcase UserRole.BRANCH_MANAGER:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_BUSINESS,\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t\tEmployeePermission.CREATE_ORDER,\n\t\t\t\tEmployeePermission.VIEW_QR_MENU,\n\t\t\t\tEmployeePermission.VIEW_QR_CODES,\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.UPDATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.CREATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.DELETE_MENU_ITEM,\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.UPDATE_CATEGORY,\n\t\t\t\tEmployeePermission.CREATE_CATEGORY,\n\t\t\t\tEmployeePermission.DELETE_CATEGORY,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.UPDATE_ADDON,\n\t\t\t\tEmployeePermission.CREATE_ADDON,\n\t\t\t\tEmployeePermission.DELETE_ADDON,\n\t\t\t\tEmployeePermission.VIEW_TABLES,\n\t\t\t\tEmployeePermission.UPDATE_TABLE,\n\t\t\t\tEmployeePermission.CREATE_TABLE,\n\t\t\t\tEmployeePermission.DELETE_TABLE,\n\t\t\t\tEmployeePermission.VIEW_EMPLOYEES,\n\t\t\t\tEmployeePermission.UPDATE_EMPLOYEE,\n\t\t\t\tEmployeePermission.VIEW_ANALYTICS,\n\t\t\t\tEmployeePermission.VIEW_SALES_REPORTS,\n\t\t\t\tEmployeePermission.CREATE_QR_CODE,\n\t\t\t\tEmployeePermission.DELETE_QR_CODE,\n\t\t\t\tEmployeePermission.AI_ASSISTANT,\n\t\t\t];\n\n\t\t/** Chef - Manages menu and kitchen orders */\n\t\tcase UserRole.CHEF:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.UPDATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.UPDATE_CATEGORY,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.UPDATE_ADDON,\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t];\n\n\t\t/** Sous Chef - Assists chef with orders and menu */\n\t\tcase UserRole.SOUS_CHEF:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t];\n\n\t\t/** Pastry Chef - Limited to dessert menu items */\n\t\tcase UserRole.PASTRY_CHEF:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.UPDATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t];\n\n\t\t/** Line Cook / Prep Cook / Kitchen Assistant - Read-only menu & order updates */\n\t\tcase UserRole.LINE_COOK:\n\t\tcase UserRole.PREP_COOK:\n\t\tcase UserRole.KITCHEN_ASSISTANT:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t];\n\n\t\t/** Head Waiter - Full service control */\n\t\tcase UserRole.HEAD_WAITER:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.CREATE_ORDER,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t\tEmployeePermission.VIEW_TABLES,\n\t\t\t\tEmployeePermission.UPDATE_TABLE_STATUS,\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.VIEW_QR_MENU,\n\t\t\t\tEmployeePermission.VIEW_QR_CODES,\n\t\t\t];\n\n\t\t/** Waiter - Handles orders and table service */\n\t\tcase UserRole.WAITER:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.CREATE_ORDER,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t\tEmployeePermission.VIEW_TABLES,\n\t\t\t\tEmployeePermission.UPDATE_TABLE_STATUS,\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t];\n\n\t\t/** Runner - Sees and updates order delivery progress */\n\t\tcase UserRole.RUNNER:\n\t\t\treturn [EmployeePermission.VIEW_ORDERS, EmployeePermission.UPDATE_ORDER];\n\n\t\t/** ☕ Barista / Bartender / Sommelier / Room Service */\n\t\tcase UserRole.BARISTA:\n\t\tcase UserRole.BARTENDER:\n\t\tcase UserRole.SOMMELIER:\n\t\tcase UserRole.ROOM_SERVICE_STAFF:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.VIEW_ORDERS,\n\t\t\t\tEmployeePermission.CREATE_ORDER,\n\t\t\t\tEmployeePermission.UPDATE_ORDER,\n\t\t\t];\n\n\t\t/** Accountant - Analytics, reports, subscriptions */\n\t\tcase UserRole.ACCOUNTANT:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_ANALYTICS,\n\t\t\t\tEmployeePermission.VIEW_SALES_REPORTS,\n\t\t\t\tEmployeePermission.VIEW_SUBSCRIPTION,\n\t\t\t];\n\n\t\t/** Delivery Driver - Delivery orders only */\n\t\tcase UserRole.DELIVERY_DRIVER:\n\t\t\treturn [EmployeePermission.VIEW_ORDERS, EmployeePermission.UPDATE_ORDER];\n\n\t\t/** Inventory Manager - Controls menu stock-related items */\n\t\tcase UserRole.INVENTORY_MANAGER:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.UPDATE_CATEGORY,\n\t\t\t\tEmployeePermission.CREATE_CATEGORY,\n\t\t\t\tEmployeePermission.DELETE_CATEGORY,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.UPDATE_ADDON,\n\t\t\t\tEmployeePermission.CREATE_ADDON,\n\t\t\t\tEmployeePermission.DELETE_ADDON,\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.UPDATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.CREATE_MENU_ITEM,\n\t\t\t\tEmployeePermission.DELETE_MENU_ITEM,\n\t\t\t\tEmployeePermission.VIEW_PURCHASES,\n\t\t\t\tEmployeePermission.CREATE_PURCHASE,\n\t\t\t\tEmployeePermission.UPDATE_PURCHASE,\n\t\t\t\tEmployeePermission.DELETE_PURCHASE,\n\t\t\t\tEmployeePermission.VIEW_INVENTORY,\n\t\t\t\tEmployeePermission.VIEW_INVENTORY_PRODUCTS,\n\t\t\t\tEmployeePermission.CREATE_INVENTORY_PRODUCT,\n\t\t\t\tEmployeePermission.UPDATE_INVENTORY_PRODUCT,\n\t\t\t\tEmployeePermission.DELETE_INVENTORY_PRODUCT,\n\t\t\t\tEmployeePermission.VIEW_PURCHASE_DETAIL,\n\t\t\t\tEmployeePermission.VIEW_BRANCH_BALANCE,\n\t\t\t\tEmployeePermission.UPDATE_PRODUCT_INGREDIENTS,\n\t\t\t\tEmployeePermission.DELETE_PRODUCT_INGREDIENTS,\n\t\t\t];\n\n\t\t/** Purchasing Manager - Similar to inventory but more on creation/deletion */\n\t\tcase UserRole.PURCHASING_MANAGER:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.CREATE_CATEGORY,\n\t\t\t\tEmployeePermission.UPDATE_CATEGORY,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.CREATE_ADDON,\n\t\t\t\tEmployeePermission.UPDATE_ADDON,\n\t\t\t];\n\n\t\t/** Warehouse Staff - View only */\n\t\tcase UserRole.WAREHOUSE_STAFF:\n\t\t\treturn [\n\t\t\t\tEmployeePermission.VIEW_CATEGORIES,\n\t\t\t\tEmployeePermission.VIEW_ADDONS,\n\t\t\t\tEmployeePermission.VIEW_MENU,\n\t\t\t\tEmployeePermission.VIEW_MENU_ITEMS,\n\t\t\t];\n\n\t\tdefault:\n\t\t\treturn [];\n\t}\n};\n\nexport const getHasUserPermission = (\n\trequiredPermissions: EmployeePermission[],\n\tuserPermissions: EmployeePermission[],\n) => {\n\tif (isEmpty(requiredPermissions)) return true;\n\tif (isEmpty(userPermissions)) return false;\n\tif (userPermissions.includes(EmployeePermission.ALL)) return true;\n\n\treturn requiredPermissions.some((permission) => userPermissions.includes(permission));\n};\n","import { getQueryParam } from \"@sorocraft/js-utils\";\n\nimport { FeatureSegment, type Feature } from \"./models\";\n\nimport { FEATURES_LIST } from \"./constants\";\n\nexport const getIsFeatureActive = (feature: Feature, businessSegment: FeatureSegment): boolean => {\n\t// Feature is force-enabled via query param\n\tif (getQueryParam(feature) === \"1\") return true;\n\n\t// Build the list of enabled segments for the current businessSegment\n\tconst enabledSegments: FeatureSegment[] =\n\t\tbusinessSegment === FeatureSegment.ALPHA\n\t\t\t? [FeatureSegment.ALPHA, FeatureSegment.BETA, FeatureSegment.ALL]\n\t\t\t: businessSegment === FeatureSegment.BETA\n\t\t\t? [FeatureSegment.BETA, FeatureSegment.ALL]\n\t\t\t: [FeatureSegment.ALL];\n\n\t// Check if feature exists in any of the enabled segments\n\treturn enabledSegments.some((segment) => FEATURES_LIST[segment]?.includes(feature));\n};\n","import { LocalizedContent, Product, ProductVariant, SellUnitType } from \"./models\";\n\nimport { MenuAddon } from \"src/modules/addon/models\";\n\nexport const getProductTranslation = (\n\tproduct: Pick<Product, \"translations\">,\n\tlanguage: string,\n): LocalizedContent => {\n\treturn product?.translations?.[language] || ({} as LocalizedContent);\n};\n\nexport const getProductVariant = (\n\tproduct: Pick<Product, \"variants\">,\n\tvariantId: number,\n): ProductVariant => {\n\treturn product?.variants?.find?.((item) => item.id === variantId) || ({} as ProductVariant);\n};\n\nexport const getProductVariantTranslation = (variant: ProductVariant, language: string): string => {\n\treturn variant?.title?.[language] || \"\";\n};\n\nexport const getProductAddon = (product: Product, addonId: number): MenuAddon => {\n\treturn (product?.addons || []).find(({ id }) => id === addonId) || ({} as MenuAddon);\n};\n\nexport const getPriceSuffix = (sellUnitType: SellUnitType) => {\n\tswitch (sellUnitType) {\n\t\tcase SellUnitType.WEIGHT:\n\t\t\treturn \" / kg\";\n\t\tcase SellUnitType.VOLUME:\n\t\t\treturn \" / l\";\n\n\t\tdefault:\n\t\t\treturn \"\";\n\t}\n};\n\nexport const getProductSellUnitShortCuts = (sellUnitType: SellUnitType) => {\n\tswitch (sellUnitType) {\n\t\tcase SellUnitType.WEIGHT:\n\t\t\treturn {\n\t\t\t\t\"50gr\": 0.05,\n\t\t\t\t\"100gr\": 0.1,\n\t\t\t\t\"150gr\": 0.15,\n\t\t\t\t\"200gr\": 0.2,\n\t\t\t\t\"250gr\": 0.25,\n\t\t\t\t\"300gr\": 0.3,\n\t\t\t\t\"350gr\": 0.35,\n\t\t\t\t\"400gr\": 0.4,\n\t\t\t\t\"450gr\": 0.45,\n\t\t\t\t\"500gr\": 0.5,\n\t\t\t\t\"600gr\": 0.6,\n\t\t\t\t\"700gr\": 0.7,\n\t\t\t\t\"750gr\": 0.75,\n\t\t\t\t\"800gr\": 0.8,\n\t\t\t\t\"850gr\": 0.85,\n\t\t\t\t\"900gr\": 0.9,\n\t\t\t\t\"950gr\": 0.95,\n\t\t\t\t\"1kg\": 1,\n\t\t\t\t\"2kg\": 2,\n\t\t\t\t\"5kg\": 5,\n\t\t\t\t\"10kg\": 10,\n\t\t\t\t\"20kg\": 20,\n\t\t\t};\n\t\tcase SellUnitType.VOLUME:\n\t\t\treturn {\n\t\t\t\t\"50ml\": 0.05,\n\t\t\t\t\"100ml\": 0.1,\n\t\t\t\t\"150ml\": 0.15,\n\t\t\t\t\"200ml\": 0.2,\n\t\t\t\t\"250ml\": 0.25,\n\t\t\t\t\"300ml\": 0.3,\n\t\t\t\t\"350ml\": 0.35,\n\t\t\t\t\"400ml\": 0.4,\n\t\t\t\t\"450ml\": 0.45,\n\t\t\t\t\"500ml\": 0.5,\n\t\t\t\t\"600ml\": 0.6,\n\t\t\t\t\"700ml\": 0.7,\n\t\t\t\t\"750ml\": 0.75,\n\t\t\t\t\"800ml\": 0.8,\n\t\t\t\t\"850ml\": 0.85,\n\t\t\t\t\"900ml\": 0.9,\n\t\t\t\t\"950ml\": 0.95,\n\t\t\t\t\"1l\": 1,\n\t\t\t\t\"2l\": 2,\n\t\t\t\t\"5l\": 5,\n\t\t\t\t\"10l\": 10,\n\t\t\t\t\"20l\": 20,\n\t\t\t};\n\t\tdefault:\n\t\t\treturn {};\n\t}\n};\n\nexport * from \"./utils/listing-price\";\nexport * from \"./utils/order-price\";\n","import * as categoryModels from \"src/modules/category/models\";\nimport * as productModels from \"src/modules/product/models\";\n\nimport { CategoryProductMap } from \"./models\";\n\nexport const prepareCategoryAndProductMap = (\n\tcategories: categoryModels.Category[],\n\tproducts: productModels.Product[]\n): CategoryProductMap[] => {\n\tconst productMap = products.reduce<Record<number, productModels.Product[]>>((map, product) => {\n\t\tif (!product.visible) return map;\n\n\t\tconst categoryId = Number(product.categoryId);\n\t\tif (!map[categoryId]) {\n\t\t\tmap[categoryId] = [];\n\t\t}\n\t\tmap[categoryId].push(product);\n\t\treturn map;\n\t}, {});\n\n\treturn categories\n\t\t.map((category) => ({\n\t\t\t...category,\n\t\t\tproducts: (productMap[Number(category.id)] || []) as productModels.Product[],\n\t\t}))\n\t\t.filter((category) => category?.products?.length > 0);\n};\n"],"names":["ProductView","SellUnitType","getUnitListingPrice","item","_a","_b","listingPrice","price","MenuAddonSelectType","getAllSelectedOptionsListingPrice","product","selectedAddons","total","addon","addons","id","addonId","selectType","options","Object","prototype","hasOwnProperty","call","selection","selectedOptionIds","SINGLE","optionId","option","find","OrderType","OrderStatus","OrderItemStatus","PaymentMethod","OrderStep","OrderErrors","SuppressedError","CASH","CART","DETAILS","COMPLETED","getOrderItemListingRawPrice","orderItem","variant","quantity","baseUnitPrice","addonsUnitPrice","reduce","addonSum","optionSum","CustomerAuthStep","CustomerAddressType","Feature","FeatureSegment","FEATURES_LIST","ALPHA","UPLOAD_VIDEO","BETA","ALL","DOMAIN","IMAGE_BASE_URL","validators","number","AZERBAIJANI_PREFIXES","RegExp","join","test","isValid","error","keyStr","triplet","e1","e2","e3","charAt","getCategoryTranslation","category","language","translations","EmployeePermission","UserRole","hex","deltaPct","n","parseInt","replace","r","g","b","max","Math","min","l","h","s","d","newL","hueToRgb","p","q","t","r2","g2","b2","toHex","x","round","toString","padStart","contact","isEmpty","populated","entries","filter","value","length","fromEntries","latitude","longitude","floor","rest","e","indexOf","getOwnPropertySymbols","i","propertyIsEnumerable","__rest","assign","Number","productAddons","map","addonIdStr","selected","Array","isArray","includes","street","houseNumber","additionalNumber","Boolean","fields","productId","variantId","Error","orderItemsId","addonIdsPart","optionIds","sortNumbers","title","hostname","locale","url","domain","categoryId","categories","name","coverPhoto","startsWith","settings","isOpen","isDelivering","deliveryOrderEnabled","dineInOrderEnabled","pickupOrderEnabled","DELIVERY","DINE_IN","PICK_UP","requiredPermissions","userPermissions","some","permission","image","feature","businessSegment","getQueryParam","segment","logoImage","currency","priceFormatter","field","ADDRESS_IS_EMPTY","TABLE_NOT_SELECTED","EMPTY_ITEMS","BRANCH_NOT_SELECTED","FIELD_REQUIRED_ERROR","totalPrice","role","OWNER","GENERAL_MANAGER","VIEW_BUSINESS","UPDATE_BUSINESS","VIEW_ORDERS","UPDATE_ORDER","CREATE_ORDER","VIEW_QR_MENU","VIEW_QR_CODES","VIEW_MENU","VIEW_MENU_ITEMS","UPDATE_MENU_ITEM","CREATE_MENU_ITEM","DELETE_MENU_ITEM","VIEW_CATEGORIES","UPDATE_CATEGORY","CREATE_CATEGORY","DELETE_CATEGORY","VIEW_ADDONS","UPDATE_ADDON","CREATE_ADDON","DELETE_ADDON","VIEW_TABLES","UPDATE_TABLE","CREATE_TABLE","DELETE_TABLE","VIEW_BRANCHES","UPDATE_BRANCH","CREATE_BRANCH","DELETE_BRANCH","VIEW_EMPLOYEES","UPDATE_EMPLOYEE","CREATE_EMPLOYEE","DELETE_EMPLOYEE","VIEW_ANALYTICS","VIEW_SALES_REPORTS","VIEW_SUBSCRIPTION","CREATE_QR_CODE","DELETE_QR_CODE","AI_ASSISTANT","BRANCH_MANAGER","CHEF","SOUS_CHEF","PASTRY_CHEF","LINE_COOK","PREP_COOK","KITCHEN_ASSISTANT","HEAD_WAITER","UPDATE_TABLE_STATUS","WAITER","RUNNER","BARISTA","BARTENDER","SOMMELIER","ROOM_SERVICE_STAFF","ACCOUNTANT","DELIVERY_DRIVER","INVENTORY_MANAGER","VIEW_PURCHASES","CREATE_PURCHASE","UPDATE_PURCHASE","DELETE_PURCHASE","VIEW_INVENTORY","VIEW_INVENTORY_PRODUCTS","CREATE_INVENTORY_PRODUCT","UPDATE_INVENTORY_PRODUCT","DELETE_INVENTORY_PRODUCT","VIEW_PURCHASE_DETAIL","VIEW_BRANCH_BALANCE","UPDATE_PRODUCT_INGREDIENTS","DELETE_PRODUCT_INGREDIENTS","PURCHASING_MANAGER","WAREHOUSE_STAFF","sellUnitType","WEIGHT","VOLUME","keys","variants","undefined","source","status","Check","DELIVERED","BagCheck","OUT_FOR_DELIVERY","Delivery","PREPARING","Chef","CONFIRMED","FileCheck","PENDING","HourglassHalf","video","data","totalPriceWithoutTax","totalPriceWithTax","totalPriceWithTaxAndFees","totalTax","deliveryFee","serviceFee","items","taxes","products","productMap","visible","push","form","countryCode","phoneNumber","replaceAll","errors","cityName","step","email","otp","OTP","checkIsValidEmail","EMAIL","cleaned","nationalNumber","slice","validator"],"mappings":"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","x_google_ignoreList":[6]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Customer, CustomerAddress } from "./models";
|
|
2
2
|
export declare const useAvailableCustomer: () => Customer;
|
|
3
3
|
export declare const useCustomerAddress: () => CustomerAddress;
|
|
4
|
+
export declare const useDeliveryAddress: () => CustomerAddress;
|
|
4
5
|
export declare const useCustomerId: () => number;
|
|
5
6
|
export declare const useCustomerEmail: () => string;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { Order, OrderPayload, SelectedAddons } from "./models";
|
|
1
|
+
import { GuestOrderPayload, Order, OrderPayload, SelectedAddons } from "./models";
|
|
2
2
|
export declare const useOrderTotalRawPriceWithTax: () => number;
|
|
3
3
|
export declare const useOrderTotalPriceWithTax: () => string;
|
|
4
4
|
export declare const usePrepareOrder: (existingOrderData?: Partial<Order>) => OrderPayload;
|
|
5
|
+
export declare const useIsUnregisteredOrder: () => boolean;
|
|
6
|
+
export declare const usePrepareGuestOrder: (existingOrderData?: Partial<Order>) => GuestOrderPayload;
|
|
5
7
|
export declare const useTotalOrderItemsCount: () => number;
|
|
6
8
|
export declare const useProductQuantityInOrder: ({ productId, variantId, selectedAddons, }: {
|
|
7
9
|
productId: number;
|
|
@@ -97,6 +97,46 @@ export interface OrderPayload extends Order {
|
|
|
97
97
|
customerId: number;
|
|
98
98
|
language?: string;
|
|
99
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Contact + delivery snapshot an unregistered ("guest") visitor enters at
|
|
102
|
+
* checkout. Mirrors the backend GuestContact: every field is optional, and an
|
|
103
|
+
* address is only meaningful for DELIVERY orders. latitude/longitude are kept
|
|
104
|
+
* as numbers here for the UI (they come from the address autocomplete); they're
|
|
105
|
+
* serialized to strings in the wire payload — see GuestContactRequest.
|
|
106
|
+
*/
|
|
107
|
+
export interface GuestContact {
|
|
108
|
+
fullName?: string;
|
|
109
|
+
phoneNumber?: string;
|
|
110
|
+
email?: string;
|
|
111
|
+
street?: string;
|
|
112
|
+
houseNumber?: string;
|
|
113
|
+
additionalNumber?: string;
|
|
114
|
+
floor?: number;
|
|
115
|
+
latitude?: number;
|
|
116
|
+
longitude?: number;
|
|
117
|
+
cityName?: string;
|
|
118
|
+
countryCode?: string;
|
|
119
|
+
postCode?: string;
|
|
120
|
+
instructions?: string;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Wire shape of the contact sent to POST /order/public. Matches the backend
|
|
124
|
+
* GuestContact, where latitude/longitude are strings.
|
|
125
|
+
*/
|
|
126
|
+
export interface GuestContactRequest extends Omit<GuestContact, "latitude" | "longitude"> {
|
|
127
|
+
latitude?: string;
|
|
128
|
+
longitude?: string;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Payload for the public, non-authenticated create path (POST /order/public).
|
|
132
|
+
* Unlike OrderPayload it carries no customerId/customerAddressId — an
|
|
133
|
+
* unregistered visitor has no account or stored address book; the delivery
|
|
134
|
+
* address (when given) travels inside the contact snapshot.
|
|
135
|
+
*/
|
|
136
|
+
export interface GuestOrderPayload extends Order {
|
|
137
|
+
language?: string;
|
|
138
|
+
contact?: GuestContactRequest;
|
|
139
|
+
}
|
|
100
140
|
export interface CalculatePreviewItemRequest {
|
|
101
141
|
orderItemsId: string;
|
|
102
142
|
productId: number;
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { CalculatePreviewRequest, CalculatePreviewResponse, OrderPayload } from "./models";
|
|
1
|
+
import { CalculatePreviewRequest, CalculatePreviewResponse, GuestOrderPayload, OrderPayload } from "./models";
|
|
2
2
|
export declare const createOrder: (order: OrderPayload) => Promise<{
|
|
3
3
|
trackingId: string;
|
|
4
4
|
}>;
|
|
5
|
+
export declare const createGuestOrder: (order: GuestOrderPayload) => Promise<{
|
|
6
|
+
trackingId: string;
|
|
7
|
+
}>;
|
|
5
8
|
export declare const calculate: (payload: CalculatePreviewRequest, signal?: AbortSignal) => Promise<CalculatePreviewResponse>;
|
|
9
|
+
export declare const calculateGuest: (payload: CalculatePreviewRequest, signal?: AbortSignal) => Promise<CalculatePreviewResponse>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IconType } from "@sorocraft/ui";
|
|
2
|
-
import { CalculatePreviewResponse, Order, OrderAddon, OrderItem, OrderStatus, OrderType, SelectedAddons } from "./models";
|
|
2
|
+
import { CalculatePreviewResponse, GuestContact, GuestContactRequest, Order, OrderAddon, OrderItem, OrderStatus, OrderType, SelectedAddons } from "./models";
|
|
3
3
|
import * as addonModels from "../addon/models";
|
|
4
4
|
import * as branchModels from "../branch/models";
|
|
5
5
|
import { OrderErrors } from "./constants";
|
|
@@ -9,5 +9,6 @@ export declare const getStatusIcon: (status: OrderStatus) => IconType;
|
|
|
9
9
|
export declare const buildSelectedAddonsPayload: (productAddons?: addonModels.MenuAddon[], selectedAddons?: SelectedAddons) => OrderAddon[];
|
|
10
10
|
export declare const getDefaultOrderType: (settings: branchModels.BranchSettings, isOpen: boolean, isDelivering: boolean) => OrderType | null;
|
|
11
11
|
export declare const isValidPreviewResponse: (data: unknown) => data is CalculatePreviewResponse;
|
|
12
|
+
export declare const buildGuestContactRequest: (contact?: GuestContact) => GuestContactRequest | undefined;
|
|
12
13
|
export declare const getOrderErrorMessages: (field: keyof Order) => OrderErrors;
|
|
13
14
|
export * from "./utils/item-price";
|