@tabres/react 1.0.19 → 1.0.23
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/OrderDrawer/OrderDrawerDetails.d.ts +2 -2
- package/dist/components/PublicMenu/ProductVariants/ProductVariants.d.ts +1 -1
- package/dist/constants/constants/env.d.ts +1 -1
- package/dist/constants/env.d.ts +1 -1
- package/dist/index.d.ts +0 -1
- 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/constants/env.d.ts +1 -1
- package/dist/models/index.esm.js.map +1 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/modules/addon/models.d.ts +7 -0
- package/dist/models/modules/customer/services.d.ts +3 -1
- package/dist/models/modules/order/constants.d.ts +2 -5
- package/dist/models/modules/order/hooks.d.ts +3 -7
- package/dist/models/modules/order/models.d.ts +55 -18
- package/dist/models/modules/order/services.d.ts +2 -1
- package/dist/models/modules/order/utils/item-price.d.ts +3 -0
- package/dist/models/modules/order/utils.d.ts +3 -19
- package/dist/models/modules/product/models.d.ts +13 -1
- package/dist/models/modules/product/utils/listing-price.d.ts +9 -0
- package/dist/models/modules/product/utils/order-price.d.ts +11 -0
- package/dist/models/modules/product/utils.d.ts +2 -42
- package/dist/models/services/api/client.d.ts +3 -0
- package/dist/modules/addon/models.d.ts +7 -0
- package/dist/modules/addon/utils.d.ts +0 -9
- package/dist/modules/customer/services.d.ts +3 -1
- package/dist/modules/order/constants.d.ts +2 -5
- package/dist/modules/order/hooks.d.ts +3 -7
- package/dist/modules/order/hooks.price.test.d.ts +1 -0
- package/dist/modules/order/models.d.ts +55 -18
- package/dist/modules/order/preview.d.ts +8 -0
- package/dist/modules/order/preview.test.d.ts +1 -0
- package/dist/modules/order/services.d.ts +2 -1
- package/dist/modules/order/utils/item-price.d.ts +3 -0
- package/dist/modules/order/utils/item-price.test.d.ts +1 -0
- package/dist/modules/order/utils.d.ts +3 -19
- package/dist/modules/product/models.d.ts +13 -1
- package/dist/modules/product/utils/listing-price.d.ts +9 -0
- package/dist/modules/product/utils/listing-price.test.d.ts +1 -0
- package/dist/modules/product/utils/order-price.d.ts +11 -0
- package/dist/modules/product/utils/order-price.test.d.ts +1 -0
- package/dist/modules/product/utils.d.ts +2 -42
- package/dist/services/api/client.d.ts +3 -0
- package/dist/styles/ui.css +1 -1
- package/dist/styles/ui.css.map +1 -1
- package/dist/utils/components/PublicMenu/OrderMethods/OrderMethods.types.d.ts +9 -0
- package/dist/utils/components/PublicMenu/ProductsGridItem/ProductsGridItem.types.d.ts +13 -0
- package/dist/utils/constants/env.d.ts +1 -0
- package/dist/utils/hooks/translation.d.ts +5 -0
- 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/models/index.d.ts +16 -0
- package/dist/utils/modules/addon/models.d.ts +7 -0
- package/dist/utils/modules/addon/utils.d.ts +0 -9
- package/dist/utils/modules/branch/hooks.d.ts +16 -0
- package/dist/utils/modules/branch/utils.d.ts +7 -0
- package/dist/utils/modules/business/constants.d.ts +2 -0
- package/dist/utils/modules/business/hooks.d.ts +15 -0
- package/dist/utils/modules/common/services.d.ts +1 -0
- package/dist/utils/modules/customer/hooks.d.ts +5 -0
- package/dist/utils/modules/customer/services.d.ts +11 -0
- package/dist/utils/modules/menu/hooks.d.ts +1 -0
- package/dist/utils/modules/menu/index.d.ts +3 -0
- package/dist/utils/modules/order/constants.d.ts +2 -5
- package/dist/utils/modules/order/hooks.d.ts +14 -0
- package/dist/utils/modules/order/index.d.ts +5 -0
- package/dist/utils/modules/order/models.d.ts +55 -18
- package/dist/utils/modules/order/services.d.ts +5 -0
- package/dist/utils/modules/order/utils/item-price.d.ts +3 -0
- package/dist/utils/modules/order/utils.d.ts +3 -19
- package/dist/utils/modules/product/hooks.d.ts +9 -0
- package/dist/utils/modules/product/index.d.ts +3 -0
- package/dist/utils/modules/product/models.d.ts +13 -1
- package/dist/utils/modules/product/utils/listing-price.d.ts +9 -0
- package/dist/utils/modules/product/utils/order-price.d.ts +11 -0
- package/dist/utils/modules/product/utils.d.ts +3 -43
- package/dist/utils/modules/store/hooks.d.ts +6 -0
- package/dist/utils/modules/table/hooks.d.ts +4 -0
- package/dist/utils/modules/view/hooks.d.ts +2 -0
- package/dist/utils/modules/view/index.d.ts +4 -0
- package/dist/utils/modules/view/models.d.ts +7 -0
- package/dist/utils/modules/view/services.d.ts +2 -0
- package/dist/utils/services/api/client.d.ts +3 -0
- package/dist/utils/services/translation/index.d.ts +3 -0
- package/dist/utils/services/translation/locales/az/auth.d.ts +7 -0
- package/dist/utils/services/translation/locales/az/branch.d.ts +14 -0
- package/dist/utils/services/translation/locales/az/common.d.ts +6 -0
- package/dist/utils/services/translation/locales/az/customer.d.ts +17 -0
- package/dist/utils/services/translation/locales/az/error.d.ts +20 -0
- package/dist/utils/services/translation/locales/az/events.d.ts +8 -0
- package/dist/utils/services/translation/locales/az/index.d.ts +149 -0
- package/dist/utils/services/translation/locales/az/order.d.ts +47 -0
- package/dist/utils/services/translation/locales/az/pricing.d.ts +35 -0
- package/dist/utils/services/translation/locales/en/auth.d.ts +2 -0
- package/dist/utils/services/translation/locales/en/branch.d.ts +10 -0
- package/dist/utils/services/translation/locales/en/common.d.ts +2 -0
- package/dist/utils/services/translation/locales/en/customer.d.ts +2 -0
- package/dist/utils/services/translation/locales/en/error.d.ts +17 -0
- package/dist/utils/services/translation/locales/en/events.d.ts +2 -0
- package/dist/utils/services/translation/locales/en/index.d.ts +34 -0
- package/dist/utils/services/translation/locales/en/order.d.ts +2 -0
- package/dist/utils/services/translation/locales/en/pricing.d.ts +2 -0
- package/dist/utils/services/translation/locales/et/auth.d.ts +7 -0
- package/dist/utils/services/translation/locales/et/branch.d.ts +13 -0
- package/dist/utils/services/translation/locales/et/common.d.ts +6 -0
- package/dist/utils/services/translation/locales/et/customer.d.ts +17 -0
- package/dist/utils/services/translation/locales/et/error.d.ts +20 -0
- package/dist/utils/services/translation/locales/et/events.d.ts +8 -0
- package/dist/utils/services/translation/locales/et/index.d.ts +147 -0
- package/dist/utils/services/translation/locales/et/order.d.ts +46 -0
- package/dist/utils/services/translation/locales/et/pricing.d.ts +35 -0
- package/dist/utils/services/translation/locales/hr/auth.d.ts +7 -0
- package/dist/utils/services/translation/locales/hr/branch.d.ts +14 -0
- package/dist/utils/services/translation/locales/hr/common.d.ts +6 -0
- package/dist/utils/services/translation/locales/hr/customer.d.ts +17 -0
- package/dist/utils/services/translation/locales/hr/error.d.ts +20 -0
- package/dist/utils/services/translation/locales/hr/events.d.ts +8 -0
- package/dist/utils/services/translation/locales/hr/index.d.ts +149 -0
- package/dist/utils/services/translation/locales/hr/order.d.ts +47 -0
- package/dist/utils/services/translation/locales/hr/pricing.d.ts +35 -0
- package/dist/utils/services/translation/locales/index.d.ts +1212 -0
- package/dist/utils/services/translation/locales/nl/auth.d.ts +7 -0
- package/dist/utils/services/translation/locales/nl/branch.d.ts +13 -0
- package/dist/utils/services/translation/locales/nl/common.d.ts +6 -0
- package/dist/utils/services/translation/locales/nl/customer.d.ts +17 -0
- package/dist/utils/services/translation/locales/nl/error.d.ts +20 -0
- package/dist/utils/services/translation/locales/nl/events.d.ts +8 -0
- package/dist/utils/services/translation/locales/nl/index.d.ts +147 -0
- package/dist/utils/services/translation/locales/nl/order.d.ts +46 -0
- package/dist/utils/services/translation/locales/nl/pricing.d.ts +35 -0
- package/dist/utils/services/translation/locales/pl/auth.d.ts +7 -0
- package/dist/utils/services/translation/locales/pl/branch.d.ts +14 -0
- package/dist/utils/services/translation/locales/pl/common.d.ts +6 -0
- package/dist/utils/services/translation/locales/pl/customer.d.ts +17 -0
- package/dist/utils/services/translation/locales/pl/error.d.ts +20 -0
- package/dist/utils/services/translation/locales/pl/events.d.ts +8 -0
- package/dist/utils/services/translation/locales/pl/index.d.ts +149 -0
- package/dist/utils/services/translation/locales/pl/order.d.ts +47 -0
- package/dist/utils/services/translation/locales/pl/pricing.d.ts +35 -0
- package/dist/utils/services/translation/locales/pt/auth.d.ts +7 -0
- package/dist/utils/services/translation/locales/pt/branch.d.ts +14 -0
- package/dist/utils/services/translation/locales/pt/common.d.ts +6 -0
- package/dist/utils/services/translation/locales/pt/customer.d.ts +17 -0
- package/dist/utils/services/translation/locales/pt/error.d.ts +20 -0
- package/dist/utils/services/translation/locales/pt/events.d.ts +8 -0
- package/dist/utils/services/translation/locales/pt/index.d.ts +149 -0
- package/dist/utils/services/translation/locales/pt/order.d.ts +47 -0
- package/dist/utils/services/translation/locales/pt/pricing.d.ts +35 -0
- package/dist/utils/services/translation/locales/ru/auth.d.ts +7 -0
- package/dist/utils/services/translation/locales/ru/branch.d.ts +13 -0
- package/dist/utils/services/translation/locales/ru/common.d.ts +6 -0
- package/dist/utils/services/translation/locales/ru/customer.d.ts +17 -0
- package/dist/utils/services/translation/locales/ru/error.d.ts +20 -0
- package/dist/utils/services/translation/locales/ru/events.d.ts +8 -0
- package/dist/utils/services/translation/locales/ru/index.d.ts +147 -0
- package/dist/utils/services/translation/locales/ru/order.d.ts +46 -0
- package/dist/utils/services/translation/locales/ru/pricing.d.ts +35 -0
- package/dist/utils/services/translation/locales/tr/auth.d.ts +7 -0
- package/dist/utils/services/translation/locales/tr/branch.d.ts +13 -0
- package/dist/utils/services/translation/locales/tr/common.d.ts +6 -0
- package/dist/utils/services/translation/locales/tr/customer.d.ts +17 -0
- package/dist/utils/services/translation/locales/tr/error.d.ts +20 -0
- package/dist/utils/services/translation/locales/tr/events.d.ts +8 -0
- package/dist/utils/services/translation/locales/tr/index.d.ts +147 -0
- package/dist/utils/services/translation/locales/tr/order.d.ts +46 -0
- package/dist/utils/services/translation/locales/tr/pricing.d.ts +35 -0
- package/dist/utils/store/index.d.ts +7 -0
- package/dist/utils/store/order.d.ts +42 -0
- package/package.json +1 -1
- package/dist/components/Pricing/Pricing.d.ts +0 -11
- package/dist/components/Pricing/PricingPlanAmount.d.ts +0 -9
- package/dist/components/Pricing/index.d.ts +0 -1
- package/dist/models/modules/addon/utils.d.ts +0 -14
- package/dist/models/services/api/index.d.ts +0 -5
- package/dist/services/api/index.d.ts +0 -5
package/dist/utils/index.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{priceFormatter as E,isEmpty as A,sortNumbers as _,checkIsValidEmail as t,getQueryParam as T}from"@sorocraft/js-utils";import{HourglassHalf as R,FileCheck as r,Chef as e,Delivery as I,BagCheck as n,Check as D}from"@sorocraft/ui/icons";const N=(E,A)=>{var _;return(null===(_=null==E?void 0:E.title)||void 0===_?void 0:_[A])||""},i=(E,A)=>{var _;return(null===(_=null==E?void 0:E.title)||void 0===_?void 0:_[A])||""},o=({option:A,currency:_,language:t})=>{const{price:T}=A||{};return{totalPrice:T,formattedTotalPrice:E(T,_||"USD",t||"en")}},a=(E,A)=>{var _;return(null===(_=((null==E?void 0:E.options)||[]).find(({id:E})=>E===A))||void 0===_?void 0:_.price)||0},O=(E,A,_)=>{var t;if(Array.isArray(A))return(E||[]).filter(({id:E})=>A.includes(E)).map(({title:E})=>(null==E?void 0:E[_])||"").filter(Boolean).join(", ");{const T=(E||[]).find(({id:E})=>E===A);return(null===(t=null==T?void 0:T.title)||void 0===t?void 0:t[_])||""}},S=(E,A)=>{var _;return(null===(_=null==E?void 0:E.title)||void 0===_?void 0:_[A])||""};var s,l,C;!function(E){E.LIST="list",E.GRID="grid"}(s||(s={})),function(E){E.PIECE="PIECE",E.WEIGHT="WEIGHT",E.VOLUME="VOLUME"}(l||(l={})),function(E){E.SINGLE="SINGLE",E.MULTIPLE="MULTIPLE"}(C||(C={}));const c=(E=0,A=1,_=0)=>E*A*(1+_/100),u=(E,A)=>{var _;return(null===(_=null==E?void 0:E.translations)||void 0===_?void 0:_[A])||{}},U=(E,A=1)=>{const{price:_=0,vat:t=0}=E||{};return c(_,A,t)},P=(A,_,t,T=1)=>{const R=U(A,T);return{totalPrice:R,formattedTotalPrice:E(R,_,t)}},L=(E,A)=>{var _,t;return(null===(t=null===(_=null==E?void 0:E.variants)||void 0===_?void 0:_.find)||void 0===t?void 0:t.call(_,E=>E.id===A))||{}},d=(E,A={},_)=>((null==E?void 0:E.addons)||[]).filter(E=>Object.prototype.hasOwnProperty.call(A,E.id)).reduce((E,_)=>{const{id:t,selectType:T}=_;if(T===C.SINGLE){const T=A[t];return E+a(_,T)}return E+(A[t]||[]).reduce((E,A)=>E+a(_,A),0)},0)*_,V=(E,A,_)=>{const t=L(A,E),{vat:T}=A||{},{price:R}=t||{};return c(R,_,T)},W=({variantId:A,currency:_="USD",language:t="en",product:T,quantity:R=1})=>{const r=V(A,T,R);return{totalPrice:r,formattedTotalPrice:E(r,_,t)}},M=(E,A)=>{var _;return(null===(_=null==E?void 0:E.title)||void 0===_?void 0:_[A])||""},B=({product:E,variantId:_,quantity:t=1,selectedAddons:T,noVat:R=!1})=>{if(A(E))return{price:0,optionsPrice:0,total:0};const r=Object.assign(Object.assign({},E),{vat:R?0:E.vat}),e=d(r,T,t),I=_?V(_,r,t):U(r,t);return{price:I,optionsPrice:e,total:I+e}},v=({product:A,variantId:_,quantity:t=1,currency:T,language:R,selectedAddons:r,noVat:e=!1})=>{const{total:I}=B({product:A,variantId:_,quantity:t,selectedAddons:r,noVat:e});return{totalPrice:I,formattedTotalPrice:E(I,T,R)}},H=(E,A)=>((null==E?void 0:E.addons)||[]).find(({id:E})=>E===A)||{},Y=E=>{switch(E){case l.WEIGHT:return" / kg";case l.VOLUME:return" / l";default:return""}},m=E=>{switch(E){case l.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 l.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{}}};var G,p,f,h,g,b;!function(E){E.DINE_IN="DINE_IN",E.PICK_UP="PICK_UP",E.DELIVERY="DELIVERY"}(G||(G={})),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"}(p||(p={})),function(E){E.PENDING="PENDING",E.PREPARING="PREPARING",E.READY="READY",E.SERVED="SERVED"}(f||(f={})),function(E){E.CASH="CASH",E.CARD="CARD",E.WALLET="WALLET",E.TERMINAL="TERMINAL"}(h||(h={})),function(E){E.CART="CART",E.DETAILS="DETAILS",E.COMPLETED="COMPLETED"}(g||(g={})),h.CASH,g.CART,g.DETAILS,g.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"}(b||(b={}));const F=E=>E.options.reduce((E,A)=>E+A.price,0);function y(E=[],A=1){return A*E.reduce((E,A)=>E+F(A),0)}const $=(A,_,t)=>{const T=(E,A,_)=>A*E+y(_,A);let R=0,r=0;for(const E of A.items){const _=T(E.price,E.quantity,E.addons);R+=_,void 0===A.vat&&E.vat&&(r+=_*E.vat/100)}void 0!==A.vat&&(r=R*A.vat/100);const e=R+r;return{totalWithoutTax:R,totalWithoutTaxFormatted:E(R,_,t),totalTax:r,totalTaxFormatted:E(r,_,t),totalWithTax:e,totalWithTaxFormatted:E(e,_,t)}},Q=(E,A,t)=>{if(!E)throw new Error("Product ID is required");let T=`${E}`;A&&(T+=`-${A}`);const R=Object.entries(t||{}).map(([E,A])=>{if(!E||!A)return null;const t=Array.isArray(A)?_(A).filter(Boolean).join("-"):`${A}`;return t?`${E}-${t}`:null}).filter(Boolean).join("-");return R&&(T+=`-${R}`),T},j=E=>{var A;const{price:_,variant:t,addons:T,quantity:R,vat:r}=E||{},e=null!==(A=null==t?void 0:t.price)&&void 0!==A?A:_,I=e+y(T,1),n=e*(r/100),D=I+n;return{totalGross:D*R,totalNet:I*R,totalTax:n*R,itemGrossPrice:D,itemNetPrice:I,itemTax:n}},w=E=>{const A={};for(const{addonId:_,options:t=[]}of E.addons||[]){const E=t.map(({optionId:E})=>E);A[_]=1===E.length?E[0]:E}return A},K=E=>{switch(E){case p.COMPLETED:return D;case p.DELIVERED:return n;case p.OUT_FOR_DELIVERY:return I;case p.PREPARING:return e;case p.CONFIRMED:return r;case p.PENDING:default:return R}},x=(E=[],_={})=>Object.entries(_).map(([_,t])=>{const T=Number(_),R=Array.isArray(t)?t:[t],r=E.find(E=>E.id===T);if(A(r))return{addonId:T,options:[]};const e=(r.options||[]).filter(E=>R.includes(E.id)).map(E=>({optionId:E.id,price:E.price}));return{addonId:T,options:e}}),k=(E,A,_)=>{if(!E)return null;const{deliveryOrderEnabled:t,dineInOrderEnabled:T,pickupOrderEnabled:R}=E;return t&&_?G.DELIVERY:T&&A?G.DINE_IN:R&&A?G.PICK_UP:null},q=E=>{switch(E){case"customer":return b.ADDRESS_IS_EMPTY;case"tableId":return b.TABLE_NOT_SELECTED;case"items":return b.EMPTY_ITEMS;case"branchId":return b.BRANCH_NOT_SELECTED;default:return b.FIELD_REQUIRED_ERROR}};var z,J;!function(E){E.PHONE="PHONE",E.OTP="OTP",E.EMAIL="EMAIL"}(z||(z={})),function(E){E.HOME="HOME",E.WORK="WORK",E.TRAVEL="TRAVEL"}(J||(J={}));const X=E=>`${E.countryCode}${E.phoneNumber}`.replaceAll("+",""),Z=(E,A)=>{const _={},{email:T,otp:R}=E||{};switch(A){case z.OTP:T&&t(T)||(_.email="Invalid Email Address"),R&&6===R.length||(_.otp="Invalid OTP");break;case z.EMAIL:T&&t(T)||(_.email="Invalid Email Address")}return _},EE=E=>{const A={},{countryCode:_,cityName:t,street:T,houseNumber:R}=E||{};return _||(A.countryCode="COUNTRY_REQUIRED"),t||(A.cityName="CITY_REQUIRED"),T||(A.street="STREET_REQUIRED"),R||(A.houseNumber="STREET_NUMBER_REQUIRED"),A},AE=E=>(E||[]).filter(Boolean).join(", "),_E=(E,A,_)=>[E,[A,_].filter(Boolean).join("/")].filter(Boolean).join(" ");var tE,TE;!function(E){E.UPLOAD_VIDEO="UPLOAD_VIDEO"}(tE||(tE={})),function(E){E.ALPHA="ALPHA",E.BETA="BETA",E.ALL="ALL"}(TE||(TE={}));const RE={[TE.ALPHA]:[tE.UPLOAD_VIDEO],[TE.BETA]:[],[TE.ALL]:[]},rE=(E,A)=>{if("1"===T(E))return!0;return(A===TE.ALPHA?[TE.ALPHA,TE.BETA,TE.ALL]:A===TE.BETA?[TE.BETA,TE.ALL]:[TE.ALL]).some(A=>{var _;return null===(_=RE[A])||void 0===_?void 0:_.includes(E)})},eE="tabres.com",IE="https://images.tabres.com",nE={994:E=>{const A=["50","51","10","55","99","70","77","60"];return new RegExp(`^(${A.join("|")})\\d{7}$`).test(E)?{isValid:!0}:{isValid:!1,error:`Azerbaijani numbers must be 9 digits and start with ${A.join(", ")}`}},31:E=>/^\d{9}$/.test(E)?{isValid:!0}:{isValid:!1,error:"Dutch numbers must be exactly 9 digits"}};function DE(E){if(!E)return{isValid:!1,error:"FIELD_REQUIRED"};const A=E.replace(/\D/g,""),_=A.startsWith("994")?"994":A.startsWith("31")?"31":null;if(!_)return{isValid:!1,error:"Unsupported country code"};const t=A.slice(_.length);return(0,nE[_])(t)}const NE=(E,A)=>{const _=A||"en";return"localhost:3000"===E?{url:`http://localhost:3000/${_}`,domain:eE}:{url:`https://${eE}/${_}`,domain:eE}},iE=(E,A)=>`https://app.tabres.com/auth/register?lang=${E}&utm_source=${A}`,oE=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${IE}/${E}`:"",aE=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${IE}/${E}`:"https://images.tabres.com/no-photo-128.webp",OE=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${IE}/${E}`:"https://images.tabres.com/tabres-doodle.webp",SE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",sE=(E,A,_)=>SE.charAt(E>>2)+SE.charAt((3&E)<<4|A>>4)+SE.charAt((15&A)<<2|_>>6)+SE.charAt(63&_),lE=(E,A,_)=>`data:image/gif;base64,R0lGODlhAQABAPAA${sE(0,E,A)+sE(_,255,255)}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`,CE=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${IE}/${E}`:"",cE=(E,A)=>{const _=parseInt(E.replace("#",""),16),t=(_>>16&255)/255,T=(_>>8&255)/255,R=(255&_)/255,r=Math.max(t,T,R),e=Math.min(t,T,R),I=(r+e)/2;let n=0,D=0;if(r!==e){const E=r-e;switch(D=I>.5?E/(2-r-e):E/(r+e),r){case t:n=(T-R)/E+(T<R?6:0);break;case T:n=(R-t)/E+2;break;case R:n=(t-T)/E+4}n/=6}const N=Math.max(0,Math.min(1,I+A/100)),i=(E,A,_)=>(_<0&&(_+=1),_>1&&(_-=1),_<1/6?E+6*(A-E)*_:_<.5?A:_<2/3?E+(A-E)*(2/3-_)*6:E);let o=N,a=N,O=N;if(0!==D){const E=N<.5?N*(1+D):N+D-N*D,A=2*N-E;o=i(A,E,n+1/3),a=i(A,E,n),O=i(A,E,n-1/3)}const S=E=>Math.round(255*E).toString(16).padStart(2,"0");return`#${S(o)}${S(a)}${S(O)}`},uE=(E,A)=>{var _,t;return(null===(t=null===(_=null==E?void 0:E.translations)||void 0===_?void 0:_.find)||void 0===t?void 0:t.call(_,E=>E.language===A))||{}},UE=(E,_,t)=>{var T;const R=null===(T=null==_?void 0:_.find)||void 0===T?void 0:T.call(_,({id:A})=>A===E);if(A(R))return"";const{name:r}=uE(R,t);return r||""},PE=(E,A)=>{const _=A.reduce((E,A)=>{if(!A.visible)return E;const _=Number(A.categoryId);return E[_]||(E[_]=[]),E[_].push(A),E},{});return E.map(E=>Object.assign(Object.assign({},E),{products:_[Number(E.id)]||[]})).filter(E=>{var A;return(null===(A=null==E?void 0:E.products)||void 0===A?void 0:A.length)>0})};var LE,dE;!function(E){E.VIEW_BUSINESS="VIEW_BUSINESS",E.UPDATE_BUSINESS="UPDATE_BUSINESS",E.VIEW_ORDERS="VIEW_ORDERS",E.UPDATE_ORDER="UPDATE_ORDER",E.CREATE_ORDER="CREATE_ORDER",E.VIEW_QR_MENU="VIEW_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"}(LE||(LE={})),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"}(dE||(dE={}));const VE=E=>{switch(E){case dE.OWNER:return[LE.ALL];case dE.GENERAL_MANAGER:return[LE.VIEW_BUSINESS,LE.UPDATE_BUSINESS,LE.VIEW_ORDERS,LE.UPDATE_ORDER,LE.CREATE_ORDER,LE.VIEW_QR_MENU,LE.VIEW_QR_CODES,LE.VIEW_MENU,LE.VIEW_MENU_ITEMS,LE.UPDATE_MENU_ITEM,LE.CREATE_MENU_ITEM,LE.DELETE_MENU_ITEM,LE.VIEW_CATEGORIES,LE.UPDATE_CATEGORY,LE.CREATE_CATEGORY,LE.DELETE_CATEGORY,LE.VIEW_ADDONS,LE.UPDATE_ADDON,LE.CREATE_ADDON,LE.DELETE_ADDON,LE.VIEW_TABLES,LE.UPDATE_TABLE,LE.CREATE_TABLE,LE.DELETE_TABLE,LE.VIEW_BRANCHES,LE.UPDATE_BRANCH,LE.CREATE_BRANCH,LE.DELETE_BRANCH,LE.VIEW_EMPLOYEES,LE.UPDATE_EMPLOYEE,LE.CREATE_EMPLOYEE,LE.DELETE_EMPLOYEE,LE.VIEW_ANALYTICS,LE.VIEW_SALES_REPORTS,LE.VIEW_SUBSCRIPTION,LE.CREATE_QR_CODE,LE.DELETE_QR_CODE,LE.AI_ASSISTANT];case dE.BRANCH_MANAGER:return[LE.VIEW_BUSINESS,LE.VIEW_ORDERS,LE.UPDATE_ORDER,LE.CREATE_ORDER,LE.VIEW_QR_MENU,LE.VIEW_QR_CODES,LE.VIEW_MENU,LE.VIEW_MENU_ITEMS,LE.UPDATE_MENU_ITEM,LE.CREATE_MENU_ITEM,LE.DELETE_MENU_ITEM,LE.VIEW_CATEGORIES,LE.UPDATE_CATEGORY,LE.CREATE_CATEGORY,LE.DELETE_CATEGORY,LE.VIEW_ADDONS,LE.UPDATE_ADDON,LE.CREATE_ADDON,LE.DELETE_ADDON,LE.VIEW_TABLES,LE.UPDATE_TABLE,LE.CREATE_TABLE,LE.DELETE_TABLE,LE.VIEW_EMPLOYEES,LE.UPDATE_EMPLOYEE,LE.VIEW_ANALYTICS,LE.VIEW_SALES_REPORTS,LE.CREATE_QR_CODE,LE.DELETE_QR_CODE,LE.AI_ASSISTANT];case dE.CHEF:return[LE.VIEW_MENU,LE.VIEW_MENU_ITEMS,LE.UPDATE_MENU_ITEM,LE.VIEW_CATEGORIES,LE.UPDATE_CATEGORY,LE.VIEW_ADDONS,LE.UPDATE_ADDON,LE.VIEW_ORDERS,LE.UPDATE_ORDER];case dE.SOUS_CHEF:return[LE.VIEW_MENU,LE.VIEW_MENU_ITEMS,LE.VIEW_CATEGORIES,LE.VIEW_ADDONS,LE.VIEW_ORDERS,LE.UPDATE_ORDER];case dE.PASTRY_CHEF:return[LE.VIEW_MENU,LE.VIEW_MENU_ITEMS,LE.UPDATE_MENU_ITEM,LE.VIEW_ORDERS,LE.UPDATE_ORDER];case dE.LINE_COOK:case dE.PREP_COOK:case dE.KITCHEN_ASSISTANT:return[LE.VIEW_MENU,LE.VIEW_MENU_ITEMS,LE.VIEW_ORDERS,LE.UPDATE_ORDER];case dE.HEAD_WAITER:return[LE.VIEW_ORDERS,LE.CREATE_ORDER,LE.UPDATE_ORDER,LE.VIEW_TABLES,LE.UPDATE_TABLE_STATUS,LE.VIEW_MENU,LE.VIEW_MENU_ITEMS,LE.VIEW_CATEGORIES,LE.VIEW_ADDONS,LE.VIEW_QR_MENU,LE.VIEW_QR_CODES];case dE.WAITER:return[LE.VIEW_ORDERS,LE.CREATE_ORDER,LE.UPDATE_ORDER,LE.VIEW_TABLES,LE.UPDATE_TABLE_STATUS,LE.VIEW_MENU,LE.VIEW_MENU_ITEMS,LE.VIEW_CATEGORIES,LE.VIEW_ADDONS];case dE.RUNNER:return[LE.VIEW_ORDERS,LE.UPDATE_ORDER];case dE.BARISTA:case dE.BARTENDER:case dE.SOMMELIER:case dE.ROOM_SERVICE_STAFF:return[LE.VIEW_MENU,LE.VIEW_MENU_ITEMS,LE.VIEW_ORDERS,LE.CREATE_ORDER,LE.UPDATE_ORDER];case dE.ACCOUNTANT:return[LE.VIEW_ANALYTICS,LE.VIEW_SALES_REPORTS,LE.VIEW_SUBSCRIPTION];case dE.DELIVERY_DRIVER:return[LE.VIEW_ORDERS,LE.UPDATE_ORDER];case dE.INVENTORY_MANAGER:return[LE.VIEW_CATEGORIES,LE.UPDATE_CATEGORY,LE.CREATE_CATEGORY,LE.DELETE_CATEGORY,LE.VIEW_ADDONS,LE.UPDATE_ADDON,LE.CREATE_ADDON,LE.DELETE_ADDON,LE.VIEW_MENU,LE.VIEW_MENU_ITEMS,LE.UPDATE_MENU_ITEM,LE.CREATE_MENU_ITEM,LE.DELETE_MENU_ITEM,LE.VIEW_PURCHASES,LE.CREATE_PURCHASE,LE.UPDATE_PURCHASE,LE.DELETE_PURCHASE,LE.VIEW_INVENTORY,LE.VIEW_INVENTORY_PRODUCTS,LE.CREATE_INVENTORY_PRODUCT,LE.UPDATE_INVENTORY_PRODUCT,LE.DELETE_INVENTORY_PRODUCT,LE.VIEW_PURCHASE_DETAIL,LE.VIEW_BRANCH_BALANCE,LE.UPDATE_PRODUCT_INGREDIENTS,LE.DELETE_PRODUCT_INGREDIENTS];case dE.PURCHASING_MANAGER:return[LE.VIEW_MENU,LE.VIEW_MENU_ITEMS,LE.VIEW_CATEGORIES,LE.CREATE_CATEGORY,LE.UPDATE_CATEGORY,LE.VIEW_ADDONS,LE.CREATE_ADDON,LE.UPDATE_ADDON];case dE.WAREHOUSE_STAFF:return[LE.VIEW_CATEGORIES,LE.VIEW_ADDONS,LE.VIEW_MENU,LE.VIEW_MENU_ITEMS];default:return[]}},WE=(E,_)=>!!A(E)||!A(_)&&(!!_.includes(LE.ALL)||E.some(E=>_.includes(E)));export{cE as adjustLightness,x as buildSelectedAddonsPayload,F as calculatSingleAddonTotalPrice,y as calculateTotalAddonPrice,c as calculateTotalPrice,_E as formatAddressLine,AE as formatCityLine,Q as generateOrderItemsId,a as getAddonOptionRawPrice,i as getAddonOptionTranslation,S as getAddonTitle,N as getAddonTranslation,NE as getBaseUrl,UE as getCategoryNameById,uE as getCategoryTranslation,OE as getCoverPhotoSource,k as getDefaultOrderType,WE as getHasUserPermission,oE as getImageSource,rE as getIsFeatureActive,aE as getLogoImageSource,o as getOptionPrice,O as getOptionTitles,q as getOrderErrorMessages,j as getOrderItemPrice,$ as getOrderPrice,VE as getPermissionsByRole,Y as getPriceSuffix,H as getProductAddon,v as getProductOrderPrice,B as getProductOrderRawPrice,P as getProductPrice,U as getProductRawPrice,m as getProductSellUnitShortCuts,u as getProductTranslation,L as getProductVariant,W as getProductVariantPrice,V as getProductVariantRawPrice,M as getProductVariantTranslation,iE as getRegisterUrl,w as getSelectedAddonsFromOrderItems,d as getSelectedOptionsTotalPrice,K as getStatusIcon,CE as getVideoSource,PE as prepareCategoryAndProductMap,X as preparePhoneNumber,lE as rgbDataURL,EE as validateAddressForm,Z as validateForm,DE as validatePhoneNumber};
|
|
1
|
+
import{priceFormatter as E,isEmpty as A,sortNumbers as _,checkIsValidEmail as T,getQueryParam as R}from"@sorocraft/js-utils";import{HourglassHalf as r,FileCheck as t,Chef as I,Delivery as e,BagCheck as D,Check as n}from"@sorocraft/ui/icons";const N=(E,A)=>{var _;return(null===(_=null==E?void 0:E.title)||void 0===_?void 0:_[A])||""},i=(E,A)=>{var _;return(null===(_=null==E?void 0:E.title)||void 0===_?void 0:_[A])||""},O=(E,A,_)=>{var T;if(Array.isArray(A))return(E||[]).filter(({id:E})=>A.includes(E)).map(({title:E})=>(null==E?void 0:E[_])||"").filter(Boolean).join(", ");{const R=(E||[]).find(({id:E})=>E===A);return(null===(T=null==R?void 0:R.title)||void 0===T?void 0:T[_])||""}},S=(E,A)=>{var _;return(null===(_=null==E?void 0:E.title)||void 0===_?void 0:_[A])||""};var o,s;!function(E){E.LIST="list",E.GRID="grid"}(o||(o={})),function(E){E.PIECE="PIECE",E.WEIGHT="WEIGHT",E.VOLUME="VOLUME"}(s||(s={}));const l=E=>{var A,_;return null!==(_=null!==(A=null==E?void 0:E.listingPrice)&&void 0!==A?A:null==E?void 0:E.price)&&void 0!==_?_:0},C=(A,_,T)=>{const R=l(A);return E(R,_,T)},a=(A,_,T)=>{const R=l(A);return E(R,_,T)},u=(A,_,T)=>{const R=l(A);return E(R,_,T)};var U;!function(E){E.SINGLE="SINGLE",E.MULTIPLE="MULTIPLE"}(U||(U={}));const P=(E,A={})=>{let _=0;for(const T of(null==E?void 0:E.addons)||[]){const{id:E,selectType:R,options:r}=T;if(!Object.prototype.hasOwnProperty.call(A,E))continue;const t=A[E],I=R===U.SINGLE?[t]:t||[];for(const E of I){const A=(r||[]).find(({id:A})=>A===E);A&&(_+=l(A))}}return _},L=({product:A,quantity:_,language:T,currency:R,variantId:r,selectedAddons:t})=>{if(!A||0===Object.keys(A).length)return E(0,R,T);const I=r?(A.variants||[]).find(({id:E})=>E===r):void 0,e=l(r?I:A),D=P(A,t);return E((e+D)*_,R,T)},c=(E,A)=>{var _;return(null===(_=null==E?void 0:E.translations)||void 0===_?void 0:_[A])||{}},V=(E,A)=>{var _,T;return(null===(T=null===(_=null==E?void 0:E.variants)||void 0===_?void 0:_.find)||void 0===T?void 0:T.call(_,E=>E.id===A))||{}},d=(E,A)=>{var _;return(null===(_=null==E?void 0:E.title)||void 0===_?void 0:_[A])||""},W=(E,A)=>((null==E?void 0:E.addons)||[]).find(({id:E})=>E===A)||{},M=E=>{switch(E){case s.WEIGHT:return" / kg";case s.VOLUME:return" / l";default:return""}},B=E=>{switch(E){case s.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 s.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{}}};var v,H,Y,f,m,G;!function(E){E.DINE_IN="DINE_IN",E.PICK_UP="PICK_UP",E.DELIVERY="DELIVERY"}(v||(v={})),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"}(H||(H={})),function(E){E.PENDING="PENDING",E.PREPARING="PREPARING",E.READY="READY",E.SERVED="SERVED"}(Y||(Y={})),function(E){E.CASH="CASH",E.CARD="CARD",E.WALLET="WALLET",E.TERMINAL="TERMINAL"}(f||(f={})),function(E){E.CART="CART",E.DETAILS="DETAILS",E.COMPLETED="COMPLETED"}(m||(m={})),f.CASH,m.CART,m.DETAILS,m.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"}(G||(G={}));const p=E=>{var A,_;const{price:T,variant:R,addons:r,quantity:t}=E||{},I=null!==(_=null!==(A=null==R?void 0:R.price)&&void 0!==A?A:T)&&void 0!==_?_:0,e=(r||[]).reduce((E,A)=>E+((null==A?void 0:A.options)||[]).reduce((E,A)=>{var _;return E+(null!==(_=null==A?void 0:A.price)&&void 0!==_?_:0)},0),0);return(I+e)*(null!=t?t:1)},h=(A,_,T)=>{const R=p(A);return E(R,_,T)},g=(E,A,T)=>{if(!E)throw new Error("Product ID is required");let R=`${E}`;A&&(R+=`-${A}`);const r=Object.entries(T||{}).map(([E,A])=>{if(!E||!A)return null;const T=Array.isArray(A)?_(A).filter(Boolean).join("-"):`${A}`;return T?`${E}-${T}`:null}).filter(Boolean).join("-");return r&&(R+=`-${r}`),R},b=E=>{const A={};for(const{addonId:_,options:T=[]}of E.addons||[]){const E=T.map(({optionId:E})=>E);A[_]=1===E.length?E[0]:E}return A},F=E=>{switch(E){case H.COMPLETED:return n;case H.DELIVERED:return D;case H.OUT_FOR_DELIVERY:return e;case H.PREPARING:return I;case H.CONFIRMED:return t;case H.PENDING:default:return r}},y=(E=[],_={})=>Object.entries(_).map(([_,T])=>{const R=Number(_),r=Array.isArray(T)?T:[T],t=E.find(E=>E.id===R);if(A(t))return{addonId:R,options:[]};const I=(t.options||[]).filter(E=>r.includes(E.id)).map(E=>{var A;return{optionId:E.id,price:null!==(A=E.listingPrice)&&void 0!==A?A:E.price}});return{addonId:R,options:I}}),$=(E,A,_)=>{if(!E)return null;const{deliveryOrderEnabled:T,dineInOrderEnabled:R,pickupOrderEnabled:r}=E;return T&&_?v.DELIVERY:R&&A?v.DINE_IN:r&&A?v.PICK_UP:null},Q=E=>{if(!E||"object"!=typeof E)return!1;const A=E;return"number"==typeof A.totalPriceWithoutTax&&"number"==typeof A.totalPriceWithTax&&"number"==typeof A.totalPriceWithTaxAndFees&&"number"==typeof A.totalTax&&"number"==typeof A.deliveryFee&&"number"==typeof A.serviceFee&&Array.isArray(A.items)&&Array.isArray(A.taxes)},j=E=>{switch(E){case"customer":return G.ADDRESS_IS_EMPTY;case"tableId":return G.TABLE_NOT_SELECTED;case"items":return G.EMPTY_ITEMS;case"branchId":return G.BRANCH_NOT_SELECTED;default:return G.FIELD_REQUIRED_ERROR}};var w,K;!function(E){E.PHONE="PHONE",E.OTP="OTP",E.EMAIL="EMAIL"}(w||(w={})),function(E){E.HOME="HOME",E.WORK="WORK",E.TRAVEL="TRAVEL"}(K||(K={}));const k=E=>`${E.countryCode}${E.phoneNumber}`.replaceAll("+",""),x=(E,A)=>{const _={},{email:R,otp:r}=E||{};switch(A){case w.OTP:R&&T(R)||(_.email="Invalid Email Address"),r&&6===r.length||(_.otp="Invalid OTP");break;case w.EMAIL:R&&T(R)||(_.email="Invalid Email Address")}return _},q=E=>{const A={},{countryCode:_,cityName:T,street:R,houseNumber:r}=E||{};return _||(A.countryCode="COUNTRY_REQUIRED"),T||(A.cityName="CITY_REQUIRED"),R||(A.street="STREET_REQUIRED"),r||(A.houseNumber="STREET_NUMBER_REQUIRED"),A},z=E=>(E||[]).filter(Boolean).join(", "),J=(E,A,_)=>[E,[A,_].filter(Boolean).join("/")].filter(Boolean).join(" ");var X,Z;!function(E){E.UPLOAD_VIDEO="UPLOAD_VIDEO"}(X||(X={})),function(E){E.ALPHA="ALPHA",E.BETA="BETA",E.ALL="ALL"}(Z||(Z={}));const EE={[Z.ALPHA]:[X.UPLOAD_VIDEO],[Z.BETA]:[],[Z.ALL]:[]},AE=(E,A)=>{if("1"===R(E))return!0;return(A===Z.ALPHA?[Z.ALPHA,Z.BETA,Z.ALL]:A===Z.BETA?[Z.BETA,Z.ALL]:[Z.ALL]).some(A=>{var _;return null===(_=EE[A])||void 0===_?void 0:_.includes(E)})},_E="tabres.com",TE="https://images.tabres.com",RE={994:E=>{const A=["50","51","10","55","99","70","77","60"];return new RegExp(`^(${A.join("|")})\\d{7}$`).test(E)?{isValid:!0}:{isValid:!1,error:`Azerbaijani numbers must be 9 digits and start with ${A.join(", ")}`}},31:E=>/^\d{9}$/.test(E)?{isValid:!0}:{isValid:!1,error:"Dutch numbers must be exactly 9 digits"}};function rE(E){if(!E)return{isValid:!1,error:"FIELD_REQUIRED"};const A=E.replace(/\D/g,""),_=A.startsWith("994")?"994":A.startsWith("31")?"31":null;if(!_)return{isValid:!1,error:"Unsupported country code"};const T=A.slice(_.length);return(0,RE[_])(T)}const tE=(E,A)=>{const _=A||"en";return"localhost:3000"===E?{url:`http://localhost:3000/${_}`,domain:_E}:{url:`https://${_E}/${_}`,domain:_E}},IE=(E,A)=>`https://app.tabres.com/auth/register?lang=${E}&utm_source=${A}`,eE=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${TE}/${E}`:"",DE=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${TE}/${E}`:"https://images.tabres.com/no-photo-128.webp",nE=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${TE}/${E}`:"https://images.tabres.com/tabres-doodle.webp",NE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",iE=(E,A,_)=>NE.charAt(E>>2)+NE.charAt((3&E)<<4|A>>4)+NE.charAt((15&A)<<2|_>>6)+NE.charAt(63&_),OE=(E,A,_)=>`data:image/gif;base64,R0lGODlhAQABAPAA${iE(0,E,A)+iE(_,255,255)}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`,SE=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${TE}/${E}`:"",oE=(E,A)=>{const _=parseInt(E.replace("#",""),16),T=(_>>16&255)/255,R=(_>>8&255)/255,r=(255&_)/255,t=Math.max(T,R,r),I=Math.min(T,R,r),e=(t+I)/2;let D=0,n=0;if(t!==I){const E=t-I;switch(n=e>.5?E/(2-t-I):E/(t+I),t){case T:D=(R-r)/E+(R<r?6:0);break;case R:D=(r-T)/E+2;break;case r:D=(T-R)/E+4}D/=6}const N=Math.max(0,Math.min(1,e+A/100)),i=(E,A,_)=>(_<0&&(_+=1),_>1&&(_-=1),_<1/6?E+6*(A-E)*_:_<.5?A:_<2/3?E+(A-E)*(2/3-_)*6:E);let O=N,S=N,o=N;if(0!==n){const E=N<.5?N*(1+n):N+n-N*n,A=2*N-E;O=i(A,E,D+1/3),S=i(A,E,D),o=i(A,E,D-1/3)}const s=E=>Math.round(255*E).toString(16).padStart(2,"0");return`#${s(O)}${s(S)}${s(o)}`},sE=(E,A)=>{var _,T;return(null===(T=null===(_=null==E?void 0:E.translations)||void 0===_?void 0:_.find)||void 0===T?void 0:T.call(_,E=>E.language===A))||{}},lE=(E,_,T)=>{var R;const r=null===(R=null==_?void 0:_.find)||void 0===R?void 0:R.call(_,({id:A})=>A===E);if(A(r))return"";const{name:t}=sE(r,T);return t||""},CE=(E,A)=>{const _=A.reduce((E,A)=>{if(!A.visible)return E;const _=Number(A.categoryId);return E[_]||(E[_]=[]),E[_].push(A),E},{});return E.map(E=>Object.assign(Object.assign({},E),{products:_[Number(E.id)]||[]})).filter(E=>{var A;return(null===(A=null==E?void 0:E.products)||void 0===A?void 0:A.length)>0})};var aE,uE;!function(E){E.VIEW_BUSINESS="VIEW_BUSINESS",E.UPDATE_BUSINESS="UPDATE_BUSINESS",E.VIEW_ORDERS="VIEW_ORDERS",E.UPDATE_ORDER="UPDATE_ORDER",E.CREATE_ORDER="CREATE_ORDER",E.VIEW_QR_MENU="VIEW_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"}(aE||(aE={})),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"}(uE||(uE={}));const UE=E=>{switch(E){case uE.OWNER:return[aE.ALL];case uE.GENERAL_MANAGER:return[aE.VIEW_BUSINESS,aE.UPDATE_BUSINESS,aE.VIEW_ORDERS,aE.UPDATE_ORDER,aE.CREATE_ORDER,aE.VIEW_QR_MENU,aE.VIEW_QR_CODES,aE.VIEW_MENU,aE.VIEW_MENU_ITEMS,aE.UPDATE_MENU_ITEM,aE.CREATE_MENU_ITEM,aE.DELETE_MENU_ITEM,aE.VIEW_CATEGORIES,aE.UPDATE_CATEGORY,aE.CREATE_CATEGORY,aE.DELETE_CATEGORY,aE.VIEW_ADDONS,aE.UPDATE_ADDON,aE.CREATE_ADDON,aE.DELETE_ADDON,aE.VIEW_TABLES,aE.UPDATE_TABLE,aE.CREATE_TABLE,aE.DELETE_TABLE,aE.VIEW_BRANCHES,aE.UPDATE_BRANCH,aE.CREATE_BRANCH,aE.DELETE_BRANCH,aE.VIEW_EMPLOYEES,aE.UPDATE_EMPLOYEE,aE.CREATE_EMPLOYEE,aE.DELETE_EMPLOYEE,aE.VIEW_ANALYTICS,aE.VIEW_SALES_REPORTS,aE.VIEW_SUBSCRIPTION,aE.CREATE_QR_CODE,aE.DELETE_QR_CODE,aE.AI_ASSISTANT];case uE.BRANCH_MANAGER:return[aE.VIEW_BUSINESS,aE.VIEW_ORDERS,aE.UPDATE_ORDER,aE.CREATE_ORDER,aE.VIEW_QR_MENU,aE.VIEW_QR_CODES,aE.VIEW_MENU,aE.VIEW_MENU_ITEMS,aE.UPDATE_MENU_ITEM,aE.CREATE_MENU_ITEM,aE.DELETE_MENU_ITEM,aE.VIEW_CATEGORIES,aE.UPDATE_CATEGORY,aE.CREATE_CATEGORY,aE.DELETE_CATEGORY,aE.VIEW_ADDONS,aE.UPDATE_ADDON,aE.CREATE_ADDON,aE.DELETE_ADDON,aE.VIEW_TABLES,aE.UPDATE_TABLE,aE.CREATE_TABLE,aE.DELETE_TABLE,aE.VIEW_EMPLOYEES,aE.UPDATE_EMPLOYEE,aE.VIEW_ANALYTICS,aE.VIEW_SALES_REPORTS,aE.CREATE_QR_CODE,aE.DELETE_QR_CODE,aE.AI_ASSISTANT];case uE.CHEF:return[aE.VIEW_MENU,aE.VIEW_MENU_ITEMS,aE.UPDATE_MENU_ITEM,aE.VIEW_CATEGORIES,aE.UPDATE_CATEGORY,aE.VIEW_ADDONS,aE.UPDATE_ADDON,aE.VIEW_ORDERS,aE.UPDATE_ORDER];case uE.SOUS_CHEF:return[aE.VIEW_MENU,aE.VIEW_MENU_ITEMS,aE.VIEW_CATEGORIES,aE.VIEW_ADDONS,aE.VIEW_ORDERS,aE.UPDATE_ORDER];case uE.PASTRY_CHEF:return[aE.VIEW_MENU,aE.VIEW_MENU_ITEMS,aE.UPDATE_MENU_ITEM,aE.VIEW_ORDERS,aE.UPDATE_ORDER];case uE.LINE_COOK:case uE.PREP_COOK:case uE.KITCHEN_ASSISTANT:return[aE.VIEW_MENU,aE.VIEW_MENU_ITEMS,aE.VIEW_ORDERS,aE.UPDATE_ORDER];case uE.HEAD_WAITER:return[aE.VIEW_ORDERS,aE.CREATE_ORDER,aE.UPDATE_ORDER,aE.VIEW_TABLES,aE.UPDATE_TABLE_STATUS,aE.VIEW_MENU,aE.VIEW_MENU_ITEMS,aE.VIEW_CATEGORIES,aE.VIEW_ADDONS,aE.VIEW_QR_MENU,aE.VIEW_QR_CODES];case uE.WAITER:return[aE.VIEW_ORDERS,aE.CREATE_ORDER,aE.UPDATE_ORDER,aE.VIEW_TABLES,aE.UPDATE_TABLE_STATUS,aE.VIEW_MENU,aE.VIEW_MENU_ITEMS,aE.VIEW_CATEGORIES,aE.VIEW_ADDONS];case uE.RUNNER:return[aE.VIEW_ORDERS,aE.UPDATE_ORDER];case uE.BARISTA:case uE.BARTENDER:case uE.SOMMELIER:case uE.ROOM_SERVICE_STAFF:return[aE.VIEW_MENU,aE.VIEW_MENU_ITEMS,aE.VIEW_ORDERS,aE.CREATE_ORDER,aE.UPDATE_ORDER];case uE.ACCOUNTANT:return[aE.VIEW_ANALYTICS,aE.VIEW_SALES_REPORTS,aE.VIEW_SUBSCRIPTION];case uE.DELIVERY_DRIVER:return[aE.VIEW_ORDERS,aE.UPDATE_ORDER];case uE.INVENTORY_MANAGER:return[aE.VIEW_CATEGORIES,aE.UPDATE_CATEGORY,aE.CREATE_CATEGORY,aE.DELETE_CATEGORY,aE.VIEW_ADDONS,aE.UPDATE_ADDON,aE.CREATE_ADDON,aE.DELETE_ADDON,aE.VIEW_MENU,aE.VIEW_MENU_ITEMS,aE.UPDATE_MENU_ITEM,aE.CREATE_MENU_ITEM,aE.DELETE_MENU_ITEM,aE.VIEW_PURCHASES,aE.CREATE_PURCHASE,aE.UPDATE_PURCHASE,aE.DELETE_PURCHASE,aE.VIEW_INVENTORY,aE.VIEW_INVENTORY_PRODUCTS,aE.CREATE_INVENTORY_PRODUCT,aE.UPDATE_INVENTORY_PRODUCT,aE.DELETE_INVENTORY_PRODUCT,aE.VIEW_PURCHASE_DETAIL,aE.VIEW_BRANCH_BALANCE,aE.UPDATE_PRODUCT_INGREDIENTS,aE.DELETE_PRODUCT_INGREDIENTS];case uE.PURCHASING_MANAGER:return[aE.VIEW_MENU,aE.VIEW_MENU_ITEMS,aE.VIEW_CATEGORIES,aE.CREATE_CATEGORY,aE.UPDATE_CATEGORY,aE.VIEW_ADDONS,aE.CREATE_ADDON,aE.UPDATE_ADDON];case uE.WAREHOUSE_STAFF:return[aE.VIEW_CATEGORIES,aE.VIEW_ADDONS,aE.VIEW_MENU,aE.VIEW_MENU_ITEMS];default:return[]}},PE=(E,_)=>!!A(E)||!A(_)&&(!!_.includes(aE.ALL)||E.some(E=>_.includes(E)));export{oE as adjustLightness,y as buildSelectedAddonsPayload,J as formatAddressLine,z as formatCityLine,g as generateOrderItemsId,i as getAddonOptionTranslation,S as getAddonTitle,N as getAddonTranslation,P as getAllSelectedOptionsListingPrice,tE as getBaseUrl,lE as getCategoryNameById,sE as getCategoryTranslation,nE as getCoverPhotoSource,$ as getDefaultOrderType,PE as getHasUserPermission,eE as getImageSource,AE as getIsFeatureActive,DE as getLogoImageSource,u as getOptionListingPrice,O as getOptionTitles,j as getOrderErrorMessages,h as getOrderItemListingPrice,p as getOrderItemListingRawPrice,UE as getPermissionsByRole,M as getPriceSuffix,W as getProductAddon,C as getProductListingPrice,L as getProductOrderPrice,B as getProductSellUnitShortCuts,c as getProductTranslation,V as getProductVariant,d as getProductVariantTranslation,IE as getRegisterUrl,b as getSelectedAddonsFromOrderItems,F as getStatusIcon,l as getUnitListingPrice,a as getVariantListingPrice,SE as getVideoSource,Q as isValidPreviewResponse,CE as prepareCategoryAndProductMap,k as preparePhoneNumber,OE as rgbDataURL,q as validateAddressForm,x as validateForm,rE as validatePhoneNumber};
|
|
2
2
|
//# sourceMappingURL=index.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../../../src/modules/addon/utils.ts","../../../src/modules/product/models.ts","../../../src/modules/addon/models.ts","../../../src/modules/product/utils.ts","../../../src/modules/order/models.ts","../../../src/modules/order/constants.ts","../../../src/modules/order/utils.ts","../../../src/modules/customer/models.ts","../../../src/modules/customer/utils.ts","../../../src/modules/feature/models.ts","../../../src/modules/feature/constants.ts","../../../src/modules/feature/utils.ts","../../../src/modules/view/constants.ts","../../../src/modules/view/utils.ts","../../../src/modules/category/utils.ts","../../../src/modules/menu/utils.ts","../../../src/modules/user/models.ts","../../../src/modules/user/utils.ts"],"sourcesContent":["import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { 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 getOptionPrice = ({\n\toption,\n\tcurrency,\n\tlanguage,\n}: {\n\toption: MenuAddonOption;\n\tcurrency?: string;\n\tlanguage?: string;\n}) => {\n\tconst { price } = option || {};\n\n\treturn {\n\t\ttotalPrice: price,\n\t\tformattedTotalPrice: priceFormatter(price, currency || \"USD\", language || \"en\"),\n\t};\n};\n\nexport const getAddonOptionRawPrice = (addon: MenuAddon, optionId: number): number => {\n\treturn (addon?.options || []).find(({ id }) => id === optionId)?.price || 0;\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 { MenuAddon } from \"../addon/models\";\n\nexport interface LocalizedContent {\n\tname: string;\n\tdescription: string;\n}\n\nexport interface ProductVariant {\n\tid?: number;\n\tprice: 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\tvat?: number;\n\tprice: number;\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","export enum MenuAddonSelectType {\n\tSINGLE = \"SINGLE\",\n\tMULTIPLE = \"MULTIPLE\",\n}\n\nexport interface MenuAddonOption {\n\tid?: number;\n\tprice: 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 { isEmpty, priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { LocalizedContent, Product, ProductVariant, SellUnitType } from \"./models\";\n\nimport { MenuAddon, MenuAddonSelectType } from \"src/modules/addon/models\";\nimport { getAddonOptionRawPrice } from \"src/modules/addon/utils\";\nimport * as orderModels from \"src/modules/order/models\";\n\nexport const calculateTotalPrice = (price: number = 0, quantity: number = 1, vat: number = 0) => {\n\treturn price * quantity * (1 + vat / 100);\n};\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 getProductRawPrice = (\n\tproduct: Pick<Product, \"price\" | \"vat\">,\n\tquantity: number = 1,\n) => {\n\tconst { price = 0, vat = 0 } = product || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductPrice = (\n\tproduct: Pick<Product, \"price\" | \"vat\">,\n\tcurrency: string,\n\tlanguage: string,\n\tquantity: number = 1,\n) => {\n\tconst totalPrice = getProductRawPrice(product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\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 getSelectedOptionsTotalPrice = (\n\tproduct: Product,\n\tselectedAddons: orderModels.SelectedAddons = {},\n\tquantity: number,\n): number => {\n\t// Filter addons that are selected by the user\n\tconst selectedAddonsList = (product?.addons || []).filter((addon) =>\n\t\tObject.prototype.hasOwnProperty.call(selectedAddons, addon.id),\n\t);\n\n\t// Calculate the total price\n\tconst optionsTotalPrice = selectedAddonsList.reduce((total: number, addon: MenuAddon) => {\n\t\tconst { id: addonId, selectType } = addon;\n\n\t\t// Handle SINGLE selection\n\t\tif (selectType === MenuAddonSelectType.SINGLE) {\n\t\t\tconst selectedOptionId = selectedAddons[addonId] as number;\n\t\t\treturn total + getAddonOptionRawPrice(addon, selectedOptionId);\n\t\t}\n\n\t\t// Handle MULTIPLE selection\n\t\tconst selectedOptionIds = (selectedAddons[addonId] || []) as number[];\n\t\tconst multipleOptionsPrice = selectedOptionIds.reduce(\n\t\t\t(multipleTotal, optionId) => multipleTotal + getAddonOptionRawPrice(addon, optionId),\n\t\t\t0,\n\t\t);\n\n\t\treturn total + multipleOptionsPrice;\n\t}, 0);\n\n\treturn optionsTotalPrice * quantity;\n};\n\nexport const getProductVariantRawPrice = (\n\tvariantId: number,\n\tproduct: Pick<Product, \"variants\" | \"vat\">,\n\tquantity?: number,\n) => {\n\tconst variant = getProductVariant(product, variantId);\n\tconst { vat } = product || {};\n\tconst { price } = variant || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductVariantPrice = ({\n\tvariantId,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n\tproduct,\n\tquantity = 1,\n}: {\n\tvariantId: number;\n\tcurrency?: string;\n\tlanguage?: string;\n\tproduct: Pick<Product, \"variants\" | \"vat\">;\n\tquantity?: number;\n}) => {\n\tconst totalPrice = getProductVariantRawPrice(variantId, product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariantTranslation = (variant: ProductVariant, language: string): string => {\n\treturn variant?.title?.[language] || \"\";\n};\n\nexport const getProductOrderRawPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tselectedAddons: orderModels.SelectedAddons;\n\tnoVat?: boolean;\n}): { price: number; optionsPrice: number; total: number } => {\n\tif (isEmpty(product)) return { price: 0, optionsPrice: 0, total: 0 };\n\n\tconst productData: Product = { ...product, vat: noVat ? 0 : product.vat };\n\tconst selectedOptionsTotalPrice = getSelectedOptionsTotalPrice(\n\t\tproductData,\n\t\tselectedAddons,\n\t\tquantity,\n\t);\n\tconst price = variantId\n\t\t? getProductVariantRawPrice(variantId, productData, quantity)\n\t\t: getProductRawPrice(productData, quantity);\n\n\treturn {\n\t\tprice,\n\t\toptionsPrice: selectedOptionsTotalPrice,\n\t\ttotal: price + selectedOptionsTotalPrice,\n\t};\n};\n\nexport const getProductOrderPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tcurrency,\n\tlanguage,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tcurrency: string;\n\tlanguage: string;\n\tselectedAddons: orderModels.SelectedAddons;\n\tnoVat?: boolean;\n}) => {\n\tconst { total } = getProductOrderRawPrice({\n\t\tproduct,\n\t\tvariantId,\n\t\tquantity,\n\t\tselectedAddons,\n\t\tnoVat,\n\t});\n\n\treturn {\n\t\ttotalPrice: total,\n\t\tformattedTotalPrice: priceFormatter(total, currency, language),\n\t};\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","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\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\tprice: number;\n}\n\nexport interface OrderItem {\n\tid?: number;\n\tproductId: number;\n\torderId?: number;\n\tquantity: number;\n\tprice: number;\n\tvariant?: OrderItemVariant;\n\taddons: OrderAddon[];\n\tnote?: string;\n\tstatus?: OrderItemStatus;\n\tvat?: number;\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\ttotalPriceWithTax: number;\n\ttotalPriceWithTaxAndFees?: number;\n\ttotalPriceWithoutTax: number;\n\ttotalTax: number;\n\titems: OrderItem[];\n\tstatus?: OrderStatus;\n\tvat?: number;\n\tpaymentMethod?: PaymentMethod;\n\tnote?: string;\n\tcreatedAt?: number;\n\tupdatedAt?: number;\n\tcustomer?: customerModels.Customer;\n\tdeliveryFee?: number;\n\tserviceFee?: number;\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 type OrderPriceDetails = {\n\ttotalPriceWithTax: number;\n\ttotalPriceWithTaxAndFees: number;\n\ttotalPriceWithoutTax: number;\n\ttotalTax: number;\n};\n\nexport type OrderFormattedPriceDetails = {\n\ttotalPriceWithTax: string;\n\ttotalPriceWithTaxAndFees: string;\n\ttotalPriceWithoutTax: string;\n\ttotalTax: string;\n};\n","import { OrderStep, PaymentMethod } from \"./models\";\n\nexport const initialOrder = {\n\torderType: null,\n\ttotalPriceWithTax: 0,\n\ttotalPriceWithoutTax: 0,\n\ttotalTax: 0,\n\tvat: 0,\n\tpaymentMethod: PaymentMethod.CASH,\n};\n\nexport const ORDER_STEPS = [OrderStep.CART, OrderStep.DETAILS, OrderStep.COMPLETED];\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 { isEmpty, priceFormatter, sortNumbers } from \"@sorocraft/js-utils\";\nimport { IconType } from \"@sorocraft/ui\";\nimport { Check, BagCheck, Delivery, Chef, FileCheck, HourglassHalf } from \"@sorocraft/ui/icons\";\n\nimport {\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 calculatSingleAddonTotalPrice = (addon: OrderAddon) => {\n\treturn addon.options.reduce((sum, option) => sum + option.price, 0);\n};\n\nexport function calculateTotalAddonPrice(addons: OrderAddon[] = [], quantity: number = 1): number {\n\tconst totalAddonsPriceForSingleItem = addons.reduce((total, addon) => {\n\t\tconst addonTotal = calculatSingleAddonTotalPrice(addon);\n\t\treturn total + addonTotal;\n\t}, 0);\n\n\treturn quantity * totalAddonsPriceForSingleItem;\n}\n\nexport const getOrderPrice = (order: Order, currency: string, language: string) => {\n\tconst calculateItemTotal = (price: number, quantity: number, addons: OrderAddon[]) => {\n\t\treturn quantity * price + calculateTotalAddonPrice(addons, quantity);\n\t};\n\n\tlet totalWithoutTax = 0;\n\tlet totalTax = 0;\n\n\tfor (const item of order.items) {\n\t\tconst itemTotal = calculateItemTotal(item.price, item.quantity, item.addons);\n\t\ttotalWithoutTax += itemTotal;\n\n\t\tif (order.vat === undefined && item.vat) {\n\t\t\ttotalTax += (itemTotal * item.vat) / 100;\n\t\t}\n\t}\n\n\tif (order.vat !== undefined) {\n\t\ttotalTax = (totalWithoutTax * order.vat) / 100;\n\t}\n\n\tconst totalWithTax = totalWithoutTax + totalTax;\n\n\treturn {\n\t\ttotalWithoutTax,\n\t\ttotalWithoutTaxFormatted: priceFormatter(totalWithoutTax, currency, language),\n\t\ttotalTax,\n\t\ttotalTaxFormatted: priceFormatter(totalTax, currency, language),\n\t\ttotalWithTax,\n\t\ttotalWithTaxFormatted: priceFormatter(totalWithTax, currency, language),\n\t};\n};\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 getOrderItemPrice = (orderItem: OrderItem) => {\n\tconst { price, variant, addons, quantity, vat } = orderItem || {};\n\tconst basePrice = variant?.price ?? price;\n\tconst addonsPrice = calculateTotalAddonPrice(addons, 1); // single item's addon price\n\n\tconst itemNetPrice = basePrice + addonsPrice;\n\t// Currently VAT is applied only on basePrice, not on addons\n\t// TODO: Re-evaluate for European market where tax may apply to addons too\n\tconst itemTax = basePrice * (vat / 100);\n\tconst itemGrossPrice = itemNetPrice + itemTax;\n\n\tconst totalNet = itemNetPrice * quantity;\n\tconst totalTax = itemTax * quantity;\n\tconst totalGross = itemGrossPrice * quantity;\n\n\treturn {\n\t\ttotalGross,\n\t\ttotalNet,\n\t\ttotalTax,\n\t\titemGrossPrice,\n\t\titemNetPrice,\n\t\titemTax,\n\t};\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.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\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","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","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","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","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","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","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","export enum EmployeePermission {\n\tVIEW_BUSINESS = \"VIEW_BUSINESS\",\n\tUPDATE_BUSINESS = \"UPDATE_BUSINESS\",\n\tVIEW_ORDERS = \"VIEW_ORDERS\",\n\tUPDATE_ORDER = \"UPDATE_ORDER\",\n\tCREATE_ORDER = \"CREATE_ORDER\",\n\tVIEW_QR_MENU = \"VIEW_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}\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}\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 } 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"],"names":["getAddonTranslation","addon","language","_a","title","getAddonOptionTranslation","option","getOptionPrice","currency","price","totalPrice","formattedTotalPrice","priceFormatter","getAddonOptionRawPrice","optionId","options","find","id","getOptionTitles","optionIds","Array","isArray","filter","includes","map","Boolean","join","getAddonTitle","ProductView","SellUnitType","MenuAddonSelectType","calculateTotalPrice","quantity","vat","getProductTranslation","product","translations","getProductRawPrice","getProductPrice","getProductVariant","variantId","_b","variants","call","item","getSelectedOptionsTotalPrice","selectedAddons","addons","Object","prototype","hasOwnProperty","reduce","total","addonId","selectType","SINGLE","selectedOptionId","multipleTotal","getProductVariantRawPrice","variant","getProductVariantPrice","getProductVariantTranslation","getProductOrderRawPrice","noVat","isEmpty","optionsPrice","productData","assign","selectedOptionsTotalPrice","getProductOrderPrice","getProductAddon","getPriceSuffix","sellUnitType","WEIGHT","VOLUME","getProductSellUnitShortCuts","OrderType","OrderStatus","OrderItemStatus","PaymentMethod","OrderStep","OrderErrors","CASH","CART","DETAILS","COMPLETED","calculatSingleAddonTotalPrice","sum","calculateTotalAddonPrice","getOrderPrice","order","calculateItemTotal","totalWithoutTax","totalTax","items","itemTotal","undefined","totalWithTax","totalWithoutTaxFormatted","totalTaxFormatted","totalWithTaxFormatted","generateOrderItemsId","productId","Error","orderItemsId","addonIdsPart","entries","sortNumbers","getOrderItemPrice","orderItem","basePrice","itemNetPrice","itemTax","itemGrossPrice","totalGross","totalNet","getSelectedAddonsFromOrderItems","length","getStatusIcon","status","Check","DELIVERED","BagCheck","OUT_FOR_DELIVERY","Delivery","PREPARING","Chef","CONFIRMED","FileCheck","PENDING","HourglassHalf","buildSelectedAddonsPayload","productAddons","addonIdStr","selected","Number","selectedOptionIds","getDefaultOrderType","settings","isOpen","isDelivering","deliveryOrderEnabled","dineInOrderEnabled","pickupOrderEnabled","DELIVERY","DINE_IN","PICK_UP","getOrderErrorMessages","field","ADDRESS_IS_EMPTY","TABLE_NOT_SELECTED","EMPTY_ITEMS","BRANCH_NOT_SELECTED","FIELD_REQUIRED_ERROR","CustomerAuthStep","CustomerAddressType","preparePhoneNumber","form","countryCode","phoneNumber","replaceAll","validateForm","step","errors","email","otp","OTP","checkIsValidEmail","EMAIL","validateAddressForm","cityName","street","houseNumber","formatCityLine","fields","formatAddressLine","additionalNumber","Feature","FeatureSegment","FEATURES_LIST","ALPHA","UPLOAD_VIDEO","BETA","ALL","getIsFeatureActive","feature","businessSegment","getQueryParam","some","segment","DOMAIN","IMAGE_BASE_URL","validators","number","AZERBAIJANI_PREFIXES","RegExp","test","isValid","error","validatePhoneNumber","cleaned","replace","startsWith","nationalNumber","slice","validator","getBaseUrl","hostname","locale","url","domain","getRegisterUrl","source","getImageSource","image","getLogoImageSource","logoImage","getCoverPhotoSource","coverPhoto","keyStr","triplet","e1","e2","e3","charAt","rgbDataURL","r","g","b","getVideoSource","video","adjustLightness","hex","deltaPct","n","parseInt","max","Math","min","l","h","s","d","newL","hueToRgb","p","q","t","r2","g2","b2","toHex","x","round","toString","padStart","getCategoryTranslation","category","getCategoryNameById","categoryId","categories","name","prepareCategoryAndProductMap","products","productMap","visible","push","EmployeePermission","UserRole","getPermissionsByRole","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","getHasUserPermission","requiredPermissions","userPermissions","permission"],"mappings":"uPAIaA,EAAsB,CAACC,EAAkBC,WACrD,OAAmB,QAAZC,EAAAF,aAAK,EAALA,EAAOG,aAAK,IAAAD,OAAA,EAAAA,EAAGD,KAAa,IAGvBG,EAA4B,CAACC,EAAyBJ,WAClE,OAAoB,QAAbC,EAAAG,aAAM,EAANA,EAAQF,aAAK,IAAAD,OAAA,EAAAA,EAAGD,KAAa,IAGxBK,EAAiB,EAC7BD,SACAE,WACAN,eAMA,MAAMO,MAAEA,GAAUH,GAAU,CAAA,EAE5B,MAAO,CACNI,WAAYD,EACZE,oBAAqBC,EAAeH,EAAOD,GAAY,MAAON,GAAY,QAI/DW,EAAyB,CAACZ,EAAkBa,WACxD,OAA+D,QAAxDX,IAACF,aAAK,EAALA,EAAOc,UAAW,IAAIC,KAAK,EAAGC,QAASA,IAAOH,UAAS,IAAAX,OAAA,EAAAA,EAAEM,QAAS,GAG9DS,EAAkB,CAC9BH,EACAI,EACAjB,WAEA,GAAIkB,MAAMC,QAAQF,GACjB,OAAQJ,GAAW,IACjBO,OAAO,EAAGL,QAASE,EAAUI,SAASN,IACtCO,IAAI,EAAGpB,YAAYA,eAAAA,EAAQF,KAAa,IACxCoB,OAAOG,SACPC,KAAK,MACD,CACN,MAAMpB,GAAUS,GAAW,IAAIC,KAAK,EAAGC,QAASA,IAAOE,GACvD,OAAoB,QAAbhB,EAAAG,aAAM,EAANA,EAAQF,aAAK,IAAAD,OAAA,EAAAA,EAAGD,KAAa,EACrC,GAGYyB,EAAgB,CAAC1B,EAAkBC,WAC/C,OAAmB,QAAZC,EAAAF,aAAK,EAALA,EAAOG,aAAK,IAAAD,OAAA,EAAAA,EAAGD,KAAa,ICfpC,IAAY0B,EASAC,EC7CAC,GDoCZ,SAAYF,GACXA,EAAA,KAAA,OACAA,EAAA,KAAA,MACA,CAHD,CAAYA,IAAAA,EAAW,CAAA,IASvB,SAAYC,GACXA,EAAA,MAAA,QACAA,EAAA,OAAA,SACAA,EAAA,OAAA,QACA,CAJD,CAAYA,IAAAA,EAAY,CAAA,IC7CxB,SAAYC,GACXA,EAAA,OAAA,SACAA,EAAA,SAAA,UACA,CAHD,CAAYA,IAAAA,EAAmB,CAAA,ICQxB,MAAMC,EAAsB,CAACtB,EAAgB,EAAGuB,EAAmB,EAAGC,EAAc,IACnFxB,EAAQuB,GAAY,EAAIC,EAAM,KAGzBC,EAAwB,CACpCC,EACAjC,WAEA,OAA4B,QAArBC,EAAAgC,aAAO,EAAPA,EAASC,oBAAY,IAAAjC,OAAA,EAAAA,EAAGD,KAAc,CAAA,GAGjCmC,EAAqB,CACjCF,EACAH,EAAmB,KAEnB,MAAMvB,MAAEA,EAAQ,EAACwB,IAAEA,EAAM,GAAME,GAAW,CAAA,EAC1C,OAAOJ,EAAoBtB,EAAOuB,EAAUC,IAGhCK,EAAkB,CAC9BH,EACA3B,EACAN,EACA8B,EAAmB,KAEnB,MAAMtB,EAAa2B,EAAmBF,EAASH,GAE/C,MAAO,CACNtB,WAAYA,EACZC,oBAAqBC,EAAeF,EAAYF,EAAUN,KAI/CqC,EAAoB,CAChCJ,EACAK,aAEA,OAA8B,QAAvBC,EAAiB,QAAjBtC,EAAAgC,aAAO,EAAPA,EAASO,gBAAQ,IAAAvC,OAAA,EAAAA,EAAEa,YAAI,IAAAyB,OAAA,EAAAA,EAAAE,KAAAxC,EAAIyC,GAASA,EAAK3B,KAAOuB,KAAe,CAAA,GAG1DK,EAA+B,CAC3CV,EACAW,EAA6C,CAAA,EAC7Cd,MAG4BG,aAAO,EAAPA,EAASY,SAAU,IAAIzB,OAAQrB,GAC1D+C,OAAOC,UAAUC,eAAeP,KAAKG,EAAgB7C,EAAMgB,KAIfkC,OAAO,CAACC,EAAenD,KACnE,MAAQgB,GAAIoC,EAAOC,WAAEA,GAAerD,EAGpC,GAAIqD,IAAexB,EAAoByB,OAAQ,CAC9C,MAAMC,EAAmBV,EAAeO,GACxC,OAAOD,EAAQvC,EAAuBZ,EAAOuD,EAC9C,CASA,OAAOJ,GANoBN,EAAeO,IAAY,IACPF,OAC9C,CAACM,EAAe3C,IAAa2C,EAAgB5C,EAAuBZ,EAAOa,GAC3E,IAIC,GAEwBkB,EAGf0B,EAA4B,CACxClB,EACAL,EACAH,KAEA,MAAM2B,EAAUpB,EAAkBJ,EAASK,IACrCP,IAAEA,GAAQE,GAAW,CAAA,GACrB1B,MAAEA,GAAUkD,GAAW,CAAA,EAC7B,OAAO5B,EAAoBtB,EAAOuB,EAAUC,IAGhC2B,EAAyB,EACrCpB,YACAhC,WAAW,MACXN,WAAW,KACXiC,UACAH,WAAW,MAQX,MAAMtB,EAAagD,EAA0BlB,EAAWL,EAASH,GAEjE,MAAO,CACNtB,WAAYA,EACZC,oBAAqBC,EAAeF,EAAYF,EAAUN,KAI/C2D,EAA+B,CAACF,EAAyBzD,WACrE,OAAqB,QAAdC,EAAAwD,aAAO,EAAPA,EAASvD,aAAK,IAAAD,OAAA,EAAAA,EAAGD,KAAa,IAGzB4D,EAA0B,EACtC3B,UACAK,YACAR,WAAW,EACXc,iBACAiB,SAAQ,MAQR,GAAIC,EAAQ7B,GAAU,MAAO,CAAE1B,MAAO,EAAGwD,aAAc,EAAGb,MAAO,GAEjE,MAAMc,EAAWlB,OAAAmB,OAAAnB,OAAAmB,OAAA,CAAA,EAAiBhC,IAASF,IAAK8B,EAAQ,EAAI5B,EAAQF,MAC9DmC,EAA4BvB,EACjCqB,EACApB,EACAd,GAEKvB,EAAQ+B,EACXkB,EAA0BlB,EAAW0B,EAAalC,GAClDK,EAAmB6B,EAAalC,GAEnC,MAAO,CACNvB,QACAwD,aAAcG,EACdhB,MAAO3C,EAAQ2D,IAIJC,EAAuB,EACnClC,UACAK,YACAR,WAAW,EACXxB,WACAN,WACA4C,iBACAiB,SAAQ,MAUR,MAAMX,MAAEA,GAAUU,EAAwB,CACzC3B,UACAK,YACAR,WACAc,iBACAiB,UAGD,MAAO,CACNrD,WAAY0C,EACZzC,oBAAqBC,EAAewC,EAAO5C,EAAUN,KAI1CoE,EAAkB,CAACnC,EAAkBkB,MACzClB,aAAO,EAAPA,EAASY,SAAU,IAAI/B,KAAK,EAAGC,QAASA,IAAOoC,IAAa,CAAA,EAGxDkB,EAAkBC,IAC9B,OAAQA,GACP,KAAK3C,EAAa4C,OACjB,MAAO,QACR,KAAK5C,EAAa6C,OACjB,MAAO,OAER,QACC,MAAO,KAIGC,EAA+BH,IAC3C,OAAQA,GACP,KAAK3C,EAAa4C,OACjB,MAAO,CACN,OAAQ,IACR,QAAS,GACT,QAAS,IACT,QAAS,GACT,QAAS,IACT,QAAS,GACT,QAAS,IACT,QAAS,GACT,QAAS,IACT,QAAS,GACT,QAAS,GACT,QAAS,GACT,QAAS,IACT,QAAS,GACT,QAAS,IACT,QAAS,GACT,QAAS,IACT,MAAO,EACP,MAAO,EACP,MAAO,EACP,OAAQ,GACR,OAAQ,IAEV,KAAK5C,EAAa6C,OACjB,MAAO,CACN,OAAQ,IACR,QAAS,GACT,QAAS,IACT,QAAS,GACT,QAAS,IACT,QAAS,GACT,QAAS,IACT,QAAS,GACT,QAAS,IACT,QAAS,GACT,QAAS,GACT,QAAS,GACT,QAAS,IACT,QAAS,GACT,QAAS,IACT,QAAS,GACT,QAAS,IACT,KAAM,EACN,KAAM,EACN,KAAM,EACN,MAAO,GACP,MAAO,IAET,QACC,MAAO,CAAA,ICtPV,IAAYE,EAMAC,EAaAC,EAOAC,EAyEAC,ECzFAC,GDVZ,SAAYL,GACXA,EAAA,QAAA,UACAA,EAAA,QAAA,UACAA,EAAA,SAAA,UACA,CAJD,CAAYA,IAAAA,EAAS,CAAA,IAMrB,SAAYC,GACXA,EAAA,MAAA,QACAA,EAAA,QAAA,UACAA,EAAA,UAAA,YACAA,EAAA,UAAA,YACAA,EAAA,MAAA,QACAA,EAAA,iBAAA,mBACAA,EAAA,UAAA,YACAA,EAAA,UAAA,YACAA,EAAA,UAAA,YACAA,EAAA,OAAA,QACA,CAXD,CAAYA,IAAAA,EAAW,CAAA,IAavB,SAAYC,GACXA,EAAA,QAAA,UACAA,EAAA,UAAA,YACAA,EAAA,MAAA,QACAA,EAAA,OAAA,QACA,CALD,CAAYA,IAAAA,EAAe,CAAA,IAO3B,SAAYC,GACXA,EAAA,KAAA,OACAA,EAAA,KAAA,OACAA,EAAA,OAAA,SACAA,EAAA,SAAA,UACA,CALD,CAAYA,IAAAA,EAAa,CAAA,IAyEzB,SAAYC,GACXA,EAAA,KAAA,OACAA,EAAA,QAAA,UACAA,EAAA,UAAA,WACA,CAJD,CAAYA,IAAAA,EAAS,CAAA,IC9FLD,EAAcG,KAGFF,EAAUG,KAAMH,EAAUI,QAASJ,EAAUK,UAEzE,SAAYJ,GACXA,EAAA,qBAAA,yBACAA,EAAA,mBAAA,wBACAA,EAAA,iBAAA,0BACAA,EAAA,YAAA,wBACAA,EAAA,oBAAA,wBACA,CAND,CAAYA,IAAAA,EAAW,CAAA,ICKhB,MAAMK,EAAiCrF,GACtCA,EAAMc,QAAQoC,OAAO,CAACoC,EAAKjF,IAAWiF,EAAMjF,EAAOG,MAAO,YAGlD+E,EAAyBzC,EAAuB,GAAIf,EAAmB,GAMtF,OAAOA,EAL+Be,EAAOI,OAAO,CAACC,EAAOnD,IAEpDmD,EADYkC,EAA8BrF,GAE/C,EAGJ,CAEO,MAAMwF,EAAgB,CAACC,EAAclF,EAAkBN,KAC7D,MAAMyF,EAAqB,CAAClF,EAAeuB,EAAkBe,IACrDf,EAAWvB,EAAQ+E,EAAyBzC,EAAQf,GAG5D,IAAI4D,EAAkB,EAClBC,EAAW,EAEf,IAAK,MAAMjD,KAAQ8C,EAAMI,MAAO,CAC/B,MAAMC,EAAYJ,EAAmB/C,EAAKnC,MAAOmC,EAAKZ,SAAUY,EAAKG,QACrE6C,GAAmBG,OAEDC,IAAdN,EAAMzD,KAAqBW,EAAKX,MACnC4D,GAAaE,EAAYnD,EAAKX,IAAO,IAEvC,MAEkB+D,IAAdN,EAAMzD,MACT4D,EAAYD,EAAkBF,EAAMzD,IAAO,KAG5C,MAAMgE,EAAeL,EAAkBC,EAEvC,MAAO,CACND,kBACAM,yBAA0BtF,EAAegF,EAAiBpF,EAAUN,GACpE2F,WACAM,kBAAmBvF,EAAeiF,EAAUrF,EAAUN,GACtD+F,eACAG,sBAAuBxF,EAAeqF,EAAczF,EAAUN,KAInDmG,EAAuB,CACnCC,EACA9D,EACAM,KAEA,IAAKwD,EAAW,MAAM,IAAIC,MAAM,0BAGhC,IAAIC,EAAe,GAAGF,IAClB9D,IACHgE,GAAgB,IAAIhE,KAIrB,MAAMiE,EAAezD,OAAO0D,QAAQ5D,GAAkB,CAAA,GACpDtB,IAAI,EAAE6B,EAAS/C,MACf,IAAK+C,IAAY/C,EAAQ,OAAO,KAChC,MAAMa,EAAYC,MAAMC,QAAQf,GAC7BqG,EAAYrG,GAAQgB,OAAOG,SAASC,KAAK,KACzC,GAAGpB,IACN,OAAKa,EACE,GAAGkC,KAAWlC,IADE,OAGvBG,OAAOG,SACPC,KAAK,KAOP,OAJI+E,IACHD,GAAgB,IAAIC,KAGdD,GAGKI,EAAqBC,UACjC,MAAMpG,MAAEA,EAAKkD,QAAEA,EAAOZ,OAAEA,EAAMf,SAAEA,EAAQC,IAAEA,GAAQ4E,GAAa,CAAA,EACzDC,EAA0B,QAAd3G,EAAAwD,aAAO,EAAPA,EAASlD,aAAK,IAAAN,EAAAA,EAAIM,EAG9BsG,EAAeD,EAFDtB,EAAyBzC,EAAQ,GAK/CiE,EAAUF,GAAa7E,EAAM,KAC7BgF,EAAiBF,EAAeC,EAMtC,MAAO,CACNE,WAHkBD,EAAiBjF,EAInCmF,SANgBJ,EAAe/E,EAO/B6D,SANgBmB,EAAUhF,EAO1BiF,iBACAF,eACAC,YAIWI,EAAmCxE,IAC/C,MAAME,EAAiC,CAAA,EAEvC,IAAK,MAAMO,QAAEA,EAAOtC,QAAEA,EAAU,MAAQ6B,EAAKG,QAAU,GAAI,CAC1D,MAAM5B,EAAYJ,EAAQS,IAAI,EAAGV,cAAeA,GAChDgC,EAAeO,GAAgC,IAArBlC,EAAUkG,OAAelG,EAAU,GAAKA,CACnE,CAEA,OAAO2B,GAGKwE,EAAiBC,IAC7B,OAAQA,GACP,KAAK1C,EAAYQ,UAChB,OAAOmC,EACR,KAAK3C,EAAY4C,UAChB,OAAOC,EACR,KAAK7C,EAAY8C,iBAChB,OAAOC,EACR,KAAK/C,EAAYgD,UAChB,OAAOC,EACR,KAAKjD,EAAYkD,UAChB,OAAOC,EACR,KAAKnD,EAAYoD,QAGjB,QACC,OAAOC,IAIGC,EAA6B,CACzCC,EAAyC,GACzCtF,EAAiC,CAAA,IAE1BE,OAAO0D,QAAQ5D,GAAgBtB,IAAI,EAAE6G,EAAYC,MACvD,MAAMjF,EAAUkF,OAAOF,GACjBG,EAAoBpH,MAAMC,QAAQiH,GAAYA,EAAW,CAACA,GAE1DrI,EAAQmI,EAAcpH,KAAMf,GAAUA,EAAMgB,KAAOoC,GACzD,GAAIW,EAAQ/D,GACX,MAAO,CACNoD,UACAtC,QAAS,IAIX,MAAMA,GAA+Bd,EAAMc,SAAW,IACpDO,OAAQhB,GAAWkI,EAAkBjH,SAASjB,EAAOW,KACrDO,IAAKlB,IAAM,CACXQ,SAAUR,EAAOW,GACjBR,MAAOH,EAAOG,SAGhB,MAAO,CACN4C,UACAtC,aAKU0H,EAAsB,CAClCC,EACAC,EACAC,KAEA,IAAKF,EAAU,OAAO,KAEtB,MAAMG,qBAAEA,EAAoBC,mBAAEA,EAAkBC,mBAAEA,GAAuBL,EAEzE,OAAIG,GAAwBD,EACpBhE,EAAUoE,SAGdF,GAAsBH,EAClB/D,EAAUqE,QAGdF,GAAsBJ,EAClB/D,EAAUsE,QAGX,MAGKC,EAAyBC,IACrC,OAAQA,GACP,IAAK,WACJ,OAAOnE,EAAYoE,iBAEpB,IAAK,UACJ,OAAOpE,EAAYqE,mBAEpB,IAAK,QACJ,OAAOrE,EAAYsE,YAEpB,IAAK,WACJ,OAAOtE,EAAYuE,oBAEpB,QACC,OAAOvE,EAAYwE,uBC/NtB,IAAYC,EAMAC,GANZ,SAAYD,GACXA,EAAA,MAAA,QACAA,EAAA,IAAA,MACAA,EAAA,MAAA,OACA,CAJD,CAAYA,IAAAA,EAAgB,CAAA,IAM5B,SAAYC,GACXA,EAAA,KAAA,OACAA,EAAA,KAAA,OACAA,EAAA,OAAA,QACA,CAJD,CAAYA,IAAAA,EAAmB,CAAA,ICIxB,MAAMC,EAAsBC,GACd,GAAGA,EAAKC,cAAcD,EAAKE,cAAcC,WAAW,IAAK,IAKjEC,EAAe,CAACJ,EAAwBK,KACpD,MAAMC,EAAqB,CAAA,GACrBC,MAAEA,EAAKC,IAAEA,GAAQR,GAAQ,CAAA,EAE/B,OAAQK,GACP,KAAKR,EAAiBY,IAChBF,GAAUG,EAAkBH,KAChCD,EAAOC,MAAQ,yBAGXC,GAAsB,IAAfA,EAAIhD,SACf8C,EAAOE,IAAM,eAEd,MAGD,KAAKX,EAAiBc,MAChBJ,GAAUG,EAAkBH,KAChCD,EAAOC,MAAQ,yBASlB,OAAOD,GAGKM,GAAuBZ,IACnC,MAAMM,EAAqB,CAAA,GACrBL,YAAEA,EAAWY,SAAEA,EAAQC,OAAEA,EAAMC,YAAEA,GAAgBf,GAAQ,CAAA,EAO/D,OALKC,IAAaK,EAAOL,YAAc,oBAClCY,IAAUP,EAAOO,SAAW,iBAC5BC,IAAQR,EAAOQ,OAAS,mBACxBC,IAAaT,EAAOS,YAAc,0BAEhCT,GAGKU,GAAkBC,IACtBA,GAAU,IAAIxJ,OAAOG,SAASC,KAAK,MAG/BqJ,GAAoB,CAChCJ,EACAC,EACAI,IAGoB,CAACL,EADP,CAACC,EAAaI,GAAkB1J,OAAOG,SAASC,KAAK,MAC/BJ,OAAOG,SAASC,KAAK,KCpE1D,IAAYuJ,GAGAC,IAHZ,SAAYD,GACXA,EAAA,aAAA,cACA,CAFD,CAAYA,KAAAA,GAAO,CAAA,IAGnB,SAAYC,GACXA,EAAA,MAAA,QACAA,EAAA,KAAA,OACAA,EAAA,IAAA,KACA,CAJD,CAAYA,KAAAA,GAAc,CAAA,ICDnB,MAAMC,GAAwD,CACpE,CAACD,GAAeE,OAAQ,CAACH,GAAQI,cACjC,CAACH,GAAeI,MAAO,GACvB,CAACJ,GAAeK,KAAM,ICCVC,GAAqB,CAACC,EAAkBC,KAEpD,GAA+B,MAA3BC,EAAcF,GAAkB,OAAO,EAW3C,OAPCC,IAAoBR,GAAeE,MAChC,CAACF,GAAeE,MAAOF,GAAeI,KAAMJ,GAAeK,KAC3DG,IAAoBR,GAAeI,KACnC,CAACJ,GAAeI,KAAMJ,GAAeK,KACrC,CAACL,GAAeK,MAGGK,KAAMC,IAAW,IAAA1L,EAAC,OAAsB,QAAtBA,EAAAgL,GAAcU,UAAQ,IAAA1L,OAAA,EAAAA,EAAEoB,SAASkK,MCF9DK,GAAS,aAITC,GAAiB,4BCZxBC,GAAwC,CAC7C,IAAQC,IACP,MAAMC,EAAuB,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAGxE,OAFgB,IAAIC,OAAO,KAAKD,EAAqBxK,KAAK,gBAE7C0K,KAAKH,GASX,CAAEI,SAAS,GARV,CACNA,SAAS,EACTC,MAAO,uDAAuDJ,EAAqBxK,KAClF,UAQJ,GAAOuK,GACU,UAEHG,KAAKH,GAOX,CAAEI,SAAS,GANV,CACNA,SAAS,EACTC,MAAO,2CAQL,SAAUC,GAAoBxC,GACnC,IAAKA,EACJ,MAAO,CAAEsC,SAAS,EAAOC,MAAO,kBAGjC,MAAME,EAAUzC,EAAY0C,QAAQ,MAAO,IAErC3C,EAAc0C,EAAQE,WAAW,OAAS,MAAQF,EAAQE,WAAW,MAAQ,KAAO,KAE1F,IAAK5C,EACJ,MAAO,CAAEuC,SAAS,EAAOC,MAAO,4BAGjC,MAAMK,EAAiBH,EAAQI,MAAM9C,EAAYzC,QAGjD,OAAOwF,EAFWb,GAAWlC,IAEZ6C,EAClB,OAEaG,GAAa,CAACC,EAAkB7M,KAC5C,MAAM8M,EAAS9M,GAAY,KAE3B,MAAiB,mBAAb6M,EACI,CAAEE,IAAK,yBAAyBD,IAAUE,OAAQpB,IAGnD,CAAEmB,IAAK,WAAWnB,MAAUkB,IAAUE,OAAQpB,KAGzCqB,GAAiB,CAACjN,EAAkBkN,IACzC,6CAA6ClN,gBAAuBkN,IAG/DC,GAAkBC,GACzBA,EAEDA,EAAM/L,SAAS,WAAa+L,EAAMZ,WAAW,YAAoBY,EAE9D,GAAGvB,MAAkBuB,IAJT,GAOPC,GAAsBC,GAC7BA,EAEDA,EAAUjM,SAAS,WAAaiM,EAAUd,WAAW,YAAoBc,EAEtE,GAAGzB,MAAkByB,IAJL,8CAOXC,GAAuBC,GAC9BA,EAEDA,EAAWnM,SAAS,WAAamM,EAAWhB,WAAW,YAAoBgB,EAExE,GAAG3B,MAAkB2B,IAJJ,+CAOnBC,GAAS,oEAETC,GAAU,CAACC,EAAYC,EAAYC,IACxCJ,GAAOK,OAAOH,GAAM,GACpBF,GAAOK,QAAc,EAALH,IAAW,EAAMC,GAAM,GACvCH,GAAOK,QAAc,GAALF,IAAY,EAAMC,GAAM,GACxCJ,GAAOK,OAAY,GAALD,GAEFE,GAAa,CAACC,EAAWC,EAAWC,IAChD,yCACCR,GAAQ,EAAGM,EAAGC,GAAKP,GAAQQ,EAAG,IAAK,2CAGxBC,GAAkBC,GACzBA,EAEDA,EAAM/M,SAAS,WAAa+M,EAAM5B,WAAW,YAAoB4B,EAE9D,GAAGvC,MAAkBuC,IAJT,GAOPC,GAAkB,CAACC,EAAaC,KAC5C,MAAMC,EAAIC,SAASH,EAAI/B,QAAQ,IAAK,IAAK,IACnCyB,GAAMQ,GAAK,GAAM,KAAQ,IACzBP,GAAMO,GAAK,EAAK,KAAQ,IACxBN,GAAS,IAAJM,GAAY,IAEjBE,EAAMC,KAAKD,IAAIV,EAAGC,EAAGC,GACrBU,EAAMD,KAAKC,IAAIZ,EAAGC,EAAGC,GACrBW,GAAKH,EAAME,GAAO,EACxB,IAAIE,EAAI,EACJC,EAAI,EACR,GAAIL,IAAQE,EAAK,CAChB,MAAMI,EAAIN,EAAME,EAEhB,OADAG,EAAIF,EAAI,GAAMG,GAAK,EAAIN,EAAME,GAAOI,GAAKN,EAAME,GACvCF,GACP,KAAKV,EACJc,GAAKb,EAAIC,GAAKc,GAAKf,EAAIC,EAAI,EAAI,GAC/B,MACD,KAAKD,EACJa,GAAKZ,EAAIF,GAAKgB,EAAI,EAClB,MACD,KAAKd,EACJY,GAAKd,EAAIC,GAAKe,EAAI,EAGpBF,GAAK,CACN,CAEA,MAAMG,EAAON,KAAKD,IAAI,EAAGC,KAAKC,IAAI,EAAGC,EAAIN,EAAW,MAE9CW,EAAW,CAACC,EAAWC,EAAWC,KACnCA,EAAI,IAAGA,GAAK,GACZA,EAAI,IAAGA,GAAK,GACZA,EAAI,EAAI,EAAUF,EAAc,GAATC,EAAID,GAASE,EACpCA,EAAI,GAAcD,EAClBC,EAAI,EAAI,EAAUF,GAAKC,EAAID,IAAM,EAAI,EAAIE,GAAK,EAC3CF,GAGR,IAAIG,EAAKL,EACLM,EAAKN,EACLO,EAAKP,EACT,GAAU,IAANF,EAAS,CACZ,MAAMK,EAAIH,EAAO,GAAMA,GAAQ,EAAIF,GAAKE,EAAOF,EAAIE,EAAOF,EACpDI,EAAI,EAAIF,EAAOG,EACrBE,EAAKJ,EAASC,EAAGC,EAAGN,EAAI,EAAI,GAC5BS,EAAKL,EAASC,EAAGC,EAAGN,GACpBU,EAAKN,EAASC,EAAGC,EAAGN,EAAI,EAAI,EAC7B,CAEA,MAAMW,EAASC,GACdf,KAAKgB,MAAU,IAAJD,GACTE,SAAS,IACTC,SAAS,EAAG,KACf,MAAO,IAAIJ,EAAMH,KAAMG,EAAMF,KAAME,EAAMD,MCzK7BM,GAAyB,CACrCC,EACA/P,aAEA,OAAoC,QAA5BuC,EAAsB,QAAtBtC,EAAA8P,aAAQ,EAARA,EAAU7N,oBAAY,IAAAjC,OAAA,EAAAA,EAAEa,YAAI,IAAAyB,OAAA,EAAAA,EAAAE,KAAAxC,EAAIyC,GAASA,EAAK1C,WAAaA,KAClE,CAAA,GAGWgQ,GAAsB,CAClCC,EACAC,EACAlQ,WAEA,MAAM+P,EAA2B,QAAhB9P,EAAAiQ,aAAU,EAAVA,EAAYpP,YAAI,IAAAb,OAAA,EAAAA,EAAAwC,KAAAyN,EAAG,EAAGnP,QAASA,IAAOkP,GAEvD,GAAInM,EAAQiM,GAAW,MAAO,GAE9B,MAAMI,KAAEA,GAASL,GAAuBC,EAAU/P,GAElD,OAAOmQ,GAAQ,ICjBHC,GAA+B,CAC3CF,EACAG,KAEA,MAAMC,EAAaD,EAASpN,OAAgD,CAAC3B,EAAKW,KACjF,IAAKA,EAAQsO,QAAS,OAAOjP,EAE7B,MAAM2O,EAAa5H,OAAOpG,EAAQgO,YAKlC,OAJK3O,EAAI2O,KACR3O,EAAI2O,GAAc,IAEnB3O,EAAI2O,GAAYO,KAAKvO,GACdX,GACL,CAAA,GAEH,OAAO4O,EACL5O,IAAKyO,GAAajN,OAAAmB,OAAAnB,OAAAmB,OAAA,CAAA,EACf8L,GAAQ,CACXM,SAAWC,EAAWjI,OAAO0H,EAAShP,MAAQ,MAE9CK,OAAQ2O,IAAY,IAAA9P,EAAC,OAAkB,QAAlBA,EAAA8P,aAAQ,EAARA,EAAUM,gBAAQ,IAAApQ,OAAA,EAAAA,EAAEkH,QAAS,KCzBrD,IAAYsJ,GA2DAC,IA3DZ,SAAYD,GACXA,EAAA,cAAA,gBACAA,EAAA,gBAAA,kBACAA,EAAA,YAAA,cACAA,EAAA,aAAA,eACAA,EAAA,aAAA,eACAA,EAAA,aAAA,eACAA,EAAA,UAAA,YACAA,EAAA,gBAAA,kBACAA,EAAA,iBAAA,mBACAA,EAAA,iBAAA,mBACAA,EAAA,iBAAA,mBACAA,EAAA,gBAAA,kBACAA,EAAA,gBAAA,kBACAA,EAAA,gBAAA,kBACAA,EAAA,gBAAA,kBACAA,EAAA,YAAA,cACAA,EAAA,aAAA,eACAA,EAAA,aAAA,eACAA,EAAA,aAAA,eACAA,EAAA,YAAA,cACAA,EAAA,aAAA,eACAA,EAAA,oBAAA,sBACAA,EAAA,aAAA,eACAA,EAAA,aAAA,eACAA,EAAA,cAAA,gBACAA,EAAA,cAAA,gBACAA,EAAA,cAAA,gBACAA,EAAA,cAAA,gBACAA,EAAA,eAAA,iBACAA,EAAA,gBAAA,kBACAA,EAAA,gBAAA,kBACAA,EAAA,gBAAA,kBACAA,EAAA,eAAA,iBACAA,EAAA,mBAAA,qBACAA,EAAA,kBAAA,oBACAA,EAAA,oBAAA,sBACAA,EAAA,cAAA,gBACAA,EAAA,eAAA,iBACAA,EAAA,eAAA,iBACAA,EAAA,IAAA,MAEAA,EAAA,eAAA,iBACAA,EAAA,eAAA,iBACAA,EAAA,qBAAA,uBACAA,EAAA,gBAAA,kBACAA,EAAA,gBAAA,kBACAA,EAAA,gBAAA,kBACAA,EAAA,wBAAA,0BACAA,EAAA,yBAAA,2BACAA,EAAA,yBAAA,2BACAA,EAAA,yBAAA,2BACAA,EAAA,sBAAA,wBACAA,EAAA,oBAAA,sBACAA,EAAA,2BAAA,6BACAA,EAAA,2BAAA,6BACAA,EAAA,aAAA,cACA,CAzDD,CAAYA,KAAAA,GAAkB,CAAA,IA2D9B,SAAYC,GACXA,EAAA,MAAA,QACAA,EAAA,eAAA,iBACAA,EAAA,gBAAA,kBACAA,EAAA,KAAA,OACAA,EAAA,UAAA,YACAA,EAAA,YAAA,cACAA,EAAA,UAAA,YACAA,EAAA,UAAA,YACAA,EAAA,kBAAA,oBACAA,EAAA,WAAA,aACAA,EAAA,YAAA,cACAA,EAAA,OAAA,SACAA,EAAA,OAAA,SACAA,EAAA,QAAA,UACAA,EAAA,UAAA,YACAA,EAAA,UAAA,YACAA,EAAA,WAAA,aACAA,EAAA,mBAAA,qBACAA,EAAA,gBAAA,kBACAA,EAAA,kBAAA,oBACAA,EAAA,mBAAA,qBACAA,EAAA,gBAAA,iBACA,CAvBD,CAAYA,KAAAA,GAAQ,CAAA,ICvDb,MAAMC,GAAwBC,IACpC,OAAQA,GAEP,KAAKF,GAASG,MACb,MAAO,CAACJ,GAAmBpF,KAG5B,KAAKqF,GAASI,gBACb,MAAO,CACNL,GAAmBM,cACnBN,GAAmBO,gBACnBP,GAAmBQ,YACnBR,GAAmBS,aACnBT,GAAmBU,aACnBV,GAAmBW,aACnBX,GAAmBY,cACnBZ,GAAmBa,UACnBb,GAAmBc,gBACnBd,GAAmBe,iBACnBf,GAAmBgB,iBACnBhB,GAAmBiB,iBACnBjB,GAAmBkB,gBACnBlB,GAAmBmB,gBACnBnB,GAAmBoB,gBACnBpB,GAAmBqB,gBACnBrB,GAAmBsB,YACnBtB,GAAmBuB,aACnBvB,GAAmBwB,aACnBxB,GAAmByB,aACnBzB,GAAmB0B,YACnB1B,GAAmB2B,aACnB3B,GAAmB4B,aACnB5B,GAAmB6B,aACnB7B,GAAmB8B,cACnB9B,GAAmB+B,cACnB/B,GAAmBgC,cACnBhC,GAAmBiC,cACnBjC,GAAmBkC,eACnBlC,GAAmBmC,gBACnBnC,GAAmBoC,gBACnBpC,GAAmBqC,gBACnBrC,GAAmBsC,eACnBtC,GAAmBuC,mBACnBvC,GAAmBwC,kBACnBxC,GAAmByC,eACnBzC,GAAmB0C,eACnB1C,GAAmB2C,cAIrB,KAAK1C,GAAS2C,eACb,MAAO,CACN5C,GAAmBM,cACnBN,GAAmBQ,YACnBR,GAAmBS,aACnBT,GAAmBU,aACnBV,GAAmBW,aACnBX,GAAmBY,cACnBZ,GAAmBa,UACnBb,GAAmBc,gBACnBd,GAAmBe,iBACnBf,GAAmBgB,iBACnBhB,GAAmBiB,iBACnBjB,GAAmBkB,gBACnBlB,GAAmBmB,gBACnBnB,GAAmBoB,gBACnBpB,GAAmBqB,gBACnBrB,GAAmBsB,YACnBtB,GAAmBuB,aACnBvB,GAAmBwB,aACnBxB,GAAmByB,aACnBzB,GAAmB0B,YACnB1B,GAAmB2B,aACnB3B,GAAmB4B,aACnB5B,GAAmB6B,aACnB7B,GAAmBkC,eACnBlC,GAAmBmC,gBACnBnC,GAAmBsC,eACnBtC,GAAmBuC,mBACnBvC,GAAmByC,eACnBzC,GAAmB0C,eACnB1C,GAAmB2C,cAIrB,KAAK1C,GAAS4C,KACb,MAAO,CACN7C,GAAmBa,UACnBb,GAAmBc,gBACnBd,GAAmBe,iBACnBf,GAAmBkB,gBACnBlB,GAAmBmB,gBACnBnB,GAAmBsB,YACnBtB,GAAmBuB,aACnBvB,GAAmBQ,YACnBR,GAAmBS,cAIrB,KAAKR,GAAS6C,UACb,MAAO,CACN9C,GAAmBa,UACnBb,GAAmBc,gBACnBd,GAAmBkB,gBACnBlB,GAAmBsB,YACnBtB,GAAmBQ,YACnBR,GAAmBS,cAIrB,KAAKR,GAAS8C,YACb,MAAO,CACN/C,GAAmBa,UACnBb,GAAmBc,gBACnBd,GAAmBe,iBACnBf,GAAmBQ,YACnBR,GAAmBS,cAIrB,KAAKR,GAAS+C,UACd,KAAK/C,GAASgD,UACd,KAAKhD,GAASiD,kBACb,MAAO,CACNlD,GAAmBa,UACnBb,GAAmBc,gBACnBd,GAAmBQ,YACnBR,GAAmBS,cAIrB,KAAKR,GAASkD,YACb,MAAO,CACNnD,GAAmBQ,YACnBR,GAAmBU,aACnBV,GAAmBS,aACnBT,GAAmB0B,YACnB1B,GAAmBoD,oBACnBpD,GAAmBa,UACnBb,GAAmBc,gBACnBd,GAAmBkB,gBACnBlB,GAAmBsB,YACnBtB,GAAmBW,aACnBX,GAAmBY,eAIrB,KAAKX,GAASoD,OACb,MAAO,CACNrD,GAAmBQ,YACnBR,GAAmBU,aACnBV,GAAmBS,aACnBT,GAAmB0B,YACnB1B,GAAmBoD,oBACnBpD,GAAmBa,UACnBb,GAAmBc,gBACnBd,GAAmBkB,gBACnBlB,GAAmBsB,aAIrB,KAAKrB,GAASqD,OACb,MAAO,CAACtD,GAAmBQ,YAAaR,GAAmBS,cAG5D,KAAKR,GAASsD,QACd,KAAKtD,GAASuD,UACd,KAAKvD,GAASwD,UACd,KAAKxD,GAASyD,mBACb,MAAO,CACN1D,GAAmBa,UACnBb,GAAmBc,gBACnBd,GAAmBQ,YACnBR,GAAmBU,aACnBV,GAAmBS,cAIrB,KAAKR,GAAS0D,WACb,MAAO,CACN3D,GAAmBsC,eACnBtC,GAAmBuC,mBACnBvC,GAAmBwC,mBAIrB,KAAKvC,GAAS2D,gBACb,MAAO,CAAC5D,GAAmBQ,YAAaR,GAAmBS,cAG5D,KAAKR,GAAS4D,kBACb,MAAO,CACN7D,GAAmBkB,gBACnBlB,GAAmBmB,gBACnBnB,GAAmBoB,gBACnBpB,GAAmBqB,gBACnBrB,GAAmBsB,YACnBtB,GAAmBuB,aACnBvB,GAAmBwB,aACnBxB,GAAmByB,aACnBzB,GAAmBa,UACnBb,GAAmBc,gBACnBd,GAAmBe,iBACnBf,GAAmBgB,iBACnBhB,GAAmBiB,iBACnBjB,GAAmB8D,eACnB9D,GAAmB+D,gBACnB/D,GAAmBgE,gBACnBhE,GAAmBiE,gBACnBjE,GAAmBkE,eACnBlE,GAAmBmE,wBACnBnE,GAAmBoE,yBACnBpE,GAAmBqE,yBACnBrE,GAAmBsE,yBACnBtE,GAAmBuE,qBACnBvE,GAAmBwE,oBACnBxE,GAAmByE,2BACnBzE,GAAmB0E,4BAIrB,KAAKzE,GAAS0E,mBACb,MAAO,CACN3E,GAAmBa,UACnBb,GAAmBc,gBACnBd,GAAmBkB,gBACnBlB,GAAmBoB,gBACnBpB,GAAmBmB,gBACnBnB,GAAmBsB,YACnBtB,GAAmBwB,aACnBxB,GAAmBuB,cAIrB,KAAKtB,GAAS2E,gBACb,MAAO,CACN5E,GAAmBkB,gBACnBlB,GAAmBsB,YACnBtB,GAAmBa,UACnBb,GAAmBc,iBAGrB,QACC,MAAO,KAIG+D,GAAuB,CACnCC,EACAC,MAEI1R,EAAQyR,KACRzR,EAAQ0R,OACRA,EAAgBnU,SAASoP,GAAmBpF,MAEzCkK,EAAoB7J,KAAM+J,GAAeD,EAAgBnU,SAASoU"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../../src/modules/addon/utils.ts","../../../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/product/utils.ts","../../../src/modules/order/models.ts","../../../src/modules/order/constants.ts","../../../src/modules/order/utils/item-price.ts","../../../src/modules/order/utils.ts","../../../src/modules/customer/models.ts","../../../src/modules/customer/utils.ts","../../../src/modules/feature/models.ts","../../../src/modules/feature/constants.ts","../../../src/modules/feature/utils.ts","../../../src/modules/view/constants.ts","../../../src/modules/view/utils.ts","../../../src/modules/category/utils.ts","../../../src/modules/menu/utils.ts","../../../src/modules/user/models.ts","../../../src/modules/user/utils.ts"],"sourcesContent":["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 { 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 { 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 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\tpaymentMethod?: 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\tpaymentMethod: 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","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","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","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","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","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","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","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","export enum EmployeePermission {\n\tVIEW_BUSINESS = \"VIEW_BUSINESS\",\n\tUPDATE_BUSINESS = \"UPDATE_BUSINESS\",\n\tVIEW_ORDERS = \"VIEW_ORDERS\",\n\tUPDATE_ORDER = \"UPDATE_ORDER\",\n\tCREATE_ORDER = \"CREATE_ORDER\",\n\tVIEW_QR_MENU = \"VIEW_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}\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}\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 } 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"],"names":["getAddonTranslation","addon","language","_a","title","getAddonOptionTranslation","option","getOptionTitles","options","optionIds","Array","isArray","filter","id","includes","map","Boolean","join","find","getAddonTitle","ProductView","SellUnitType","getUnitListingPrice","item","_b","listingPrice","price","getProductListingPrice","product","currency","priceFormatter","getVariantListingPrice","variant","getOptionListingPrice","MenuAddonSelectType","getAllSelectedOptionsListingPrice","selectedAddons","total","addons","addonId","selectType","Object","prototype","hasOwnProperty","call","selection","selectedOptionIds","SINGLE","optionId","getProductOrderPrice","quantity","variantId","keys","length","variants","undefined","baseUnitPrice","optionsUnitPrice","getProductTranslation","translations","getProductVariant","getProductVariantTranslation","getProductAddon","getPriceSuffix","sellUnitType","WEIGHT","VOLUME","getProductSellUnitShortCuts","OrderType","OrderStatus","OrderItemStatus","PaymentMethod","OrderStep","OrderErrors","CASH","CART","DETAILS","COMPLETED","getOrderItemListingRawPrice","orderItem","addonsUnitPrice","reduce","addonSum","optionSum","getOrderItemListingPrice","totalPrice","generateOrderItemsId","productId","Error","orderItemsId","addonIdsPart","entries","sortNumbers","getSelectedAddonsFromOrderItems","getStatusIcon","status","Check","DELIVERED","BagCheck","OUT_FOR_DELIVERY","Delivery","PREPARING","Chef","CONFIRMED","FileCheck","PENDING","HourglassHalf","buildSelectedAddonsPayload","productAddons","addonIdStr","selected","Number","isEmpty","getDefaultOrderType","settings","isOpen","isDelivering","deliveryOrderEnabled","dineInOrderEnabled","pickupOrderEnabled","DELIVERY","DINE_IN","PICK_UP","isValidPreviewResponse","data","d","totalPriceWithoutTax","totalPriceWithTax","totalPriceWithTaxAndFees","totalTax","deliveryFee","serviceFee","items","taxes","getOrderErrorMessages","field","ADDRESS_IS_EMPTY","TABLE_NOT_SELECTED","EMPTY_ITEMS","BRANCH_NOT_SELECTED","FIELD_REQUIRED_ERROR","CustomerAuthStep","CustomerAddressType","preparePhoneNumber","form","countryCode","phoneNumber","replaceAll","validateForm","step","errors","email","otp","OTP","checkIsValidEmail","EMAIL","validateAddressForm","cityName","street","houseNumber","formatCityLine","fields","formatAddressLine","additionalNumber","Feature","FeatureSegment","FEATURES_LIST","ALPHA","UPLOAD_VIDEO","BETA","ALL","getIsFeatureActive","feature","businessSegment","getQueryParam","some","segment","DOMAIN","IMAGE_BASE_URL","validators","number","AZERBAIJANI_PREFIXES","RegExp","test","isValid","error","validatePhoneNumber","cleaned","replace","startsWith","nationalNumber","slice","validator","getBaseUrl","hostname","locale","url","domain","getRegisterUrl","source","getImageSource","image","getLogoImageSource","logoImage","getCoverPhotoSource","coverPhoto","keyStr","triplet","e1","e2","e3","charAt","rgbDataURL","r","g","b","getVideoSource","video","adjustLightness","hex","deltaPct","n","parseInt","max","Math","min","l","h","s","newL","hueToRgb","p","q","t","r2","g2","b2","toHex","x","round","toString","padStart","getCategoryTranslation","category","getCategoryNameById","categoryId","categories","name","prepareCategoryAndProductMap","products","productMap","visible","push","assign","EmployeePermission","UserRole","getPermissionsByRole","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","getHasUserPermission","requiredPermissions","userPermissions","permission"],"mappings":"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"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var E=require("@sorocraft/js-utils"),t=require("@sorocraft/ui/icons");const e=(E,t)=>{var e;return(null===(e=((null==E?void 0:E.options)||[]).find(({id:E})=>E===t))||void 0===e?void 0:e.price)||0};var r,A,_;!function(E){E.LIST="list",E.GRID="grid"}(r||(r={})),function(E){E.PIECE="PIECE",E.WEIGHT="WEIGHT",E.VOLUME="VOLUME"}(A||(A={})),function(E){E.SINGLE="SINGLE",E.MULTIPLE="MULTIPLE"}(_||(_={}));const T=(E=0,t=1,e=0)=>E*t*(1+e/100),R=(E,t=1)=>{const{price:e=0,vat:r=0}=E||{};return T(e,t,r)},o=(E,t)=>{var e,r;return(null===(r=null===(e=null==E?void 0:E.variants)||void 0===e?void 0:e.find)||void 0===r?void 0:r.call(e,E=>E.id===t))||{}},I=(E,t={},r)=>((null==E?void 0:E.addons)||[]).filter(E=>Object.prototype.hasOwnProperty.call(t,E.id)).reduce((E,r)=>{const{id:A,selectType:T}=r;if(T===_.SINGLE){const _=t[A];return E+e(r,_)}return E+(t[A]||[]).reduce((E,t)=>E+e(r,t),0)},0)*r,n=(E,t,e)=>{const r=o(t,E),{vat:A}=t||{},{price:_}=r||{};return T(_,e,A)},a=({product:t,variantId:e,quantity:r=1,selectedAddons:A,noVat:_=!1})=>{if(E.isEmpty(t))return{price:0,optionsPrice:0,total:0};const T=Object.assign(Object.assign({},t),{vat:_?0:t.vat}),o=I(T,A,r),a=e?n(e,T,r):R(T,r);return{price:a,optionsPrice:o,total:a+o}};var i,s,D,N,c,O;!function(E){E.DINE_IN="DINE_IN",E.PICK_UP="PICK_UP",E.DELIVERY="DELIVERY"}(i||(i={})),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"}(s||(s={})),function(E){E.PENDING="PENDING",E.PREPARING="PREPARING",E.READY="READY",E.SERVED="SERVED"}(D||(D={})),function(E){E.CASH="CASH",E.CARD="CARD",E.WALLET="WALLET",E.TERMINAL="TERMINAL"}(N||(N={})),function(E){E.CART="CART",E.DETAILS="DETAILS",E.COMPLETED="COMPLETED"}(c||(c={})),N.CASH,c.CART,c.DETAILS,c.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"}(O||(O={}));const l=E=>E.options.reduce((E,t)=>E+t.price,0);function S(E=[],t=1){return t*E.reduce((E,t)=>E+l(t),0)}var u,d;!function(E){E.PHONE="PHONE",E.OTP="OTP",E.EMAIL="EMAIL"}(u||(u={})),function(E){E.HOME="HOME",E.WORK="WORK",E.TRAVEL="TRAVEL"}(d||(d={}));var P,C;!function(E){E.UPLOAD_VIDEO="UPLOAD_VIDEO"}(P||(P={})),function(E){E.ALPHA="ALPHA",E.BETA="BETA",E.ALL="ALL"}(C||(C={}));const U={[C.ALPHA]:[P.UPLOAD_VIDEO],[C.BETA]:[],[C.ALL]:[]},L="tabres.com",V="https://images.tabres.com",W={994:E=>{const t=["50","51","10","55","99","70","77","60"];return new RegExp(`^(${t.join("|")})\\d{7}$`).test(E)?{isValid:!0}:{isValid:!1,error:`Azerbaijani numbers must be 9 digits and start with ${t.join(", ")}`}},31:E=>/^\d{9}$/.test(E)?{isValid:!0}:{isValid:!1,error:"Dutch numbers must be exactly 9 digits"}};const M="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",p=(E,t,e)=>M.charAt(E>>2)+M.charAt((3&E)<<4|t>>4)+M.charAt((15&t)<<2|e>>6)+M.charAt(63&e),g=(E,t)=>{var e,r;return(null===(r=null===(e=null==E?void 0:E.translations)||void 0===e?void 0:e.find)||void 0===r?void 0:r.call(e,E=>E.language===t))||{}};var m,v;!function(E){E.VIEW_BUSINESS="VIEW_BUSINESS",E.UPDATE_BUSINESS="UPDATE_BUSINESS",E.VIEW_ORDERS="VIEW_ORDERS",E.UPDATE_ORDER="UPDATE_ORDER",E.CREATE_ORDER="CREATE_ORDER",E.VIEW_QR_MENU="VIEW_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"}(m||(m={})),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"}(v||(v={}));exports.adjustLightness=(E,t)=>{const e=parseInt(E.replace("#",""),16),r=(e>>16&255)/255,A=(e>>8&255)/255,_=(255&e)/255,T=Math.max(r,A,_),R=Math.min(r,A,_),o=(T+R)/2;let I=0,n=0;if(T!==R){const E=T-R;switch(n=o>.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 a=Math.max(0,Math.min(1,o+t/100)),i=(E,t,e)=>(e<0&&(e+=1),e>1&&(e-=1),e<1/6?E+6*(t-E)*e:e<.5?t:e<2/3?E+(t-E)*(2/3-e)*6:E);let s=a,D=a,N=a;if(0!==n){const E=a<.5?a*(1+n):a+n-a*n,t=2*a-E;s=i(t,E,I+1/3),D=i(t,E,I),N=i(t,E,I-1/3)}const c=E=>Math.round(255*E).toString(16).padStart(2,"0");return`#${c(s)}${c(D)}${c(N)}`},exports.buildSelectedAddonsPayload=(t=[],e={})=>Object.entries(e).map(([e,r])=>{const A=Number(e),_=Array.isArray(r)?r:[r],T=t.find(E=>E.id===A);if(E.isEmpty(T))return{addonId:A,options:[]};const R=(T.options||[]).filter(E=>_.includes(E.id)).map(E=>({optionId:E.id,price:E.price}));return{addonId:A,options:R}}),exports.calculatSingleAddonTotalPrice=l,exports.calculateTotalAddonPrice=S,exports.calculateTotalPrice=T,exports.formatAddressLine=(E,t,e)=>[E,[t,e].filter(Boolean).join("/")].filter(Boolean).join(" "),exports.formatCityLine=E=>(E||[]).filter(Boolean).join(", "),exports.generateOrderItemsId=(t,e,r)=>{if(!t)throw new Error("Product ID is required");let A=`${t}`;e&&(A+=`-${e}`);const _=Object.entries(r||{}).map(([t,e])=>{if(!t||!e)return null;const r=Array.isArray(e)?E.sortNumbers(e).filter(Boolean).join("-"):`${e}`;return r?`${t}-${r}`:null}).filter(Boolean).join("-");return _&&(A+=`-${_}`),A},exports.getAddonOptionRawPrice=e,exports.getAddonOptionTranslation=(E,t)=>{var e;return(null===(e=null==E?void 0:E.title)||void 0===e?void 0:e[t])||""},exports.getAddonTitle=(E,t)=>{var e;return(null===(e=null==E?void 0:E.title)||void 0===e?void 0:e[t])||""},exports.getAddonTranslation=(E,t)=>{var e;return(null===(e=null==E?void 0:E.title)||void 0===e?void 0:e[t])||""},exports.getBaseUrl=(E,t)=>{const e=t||"en";return"localhost:3000"===E?{url:`http://localhost:3000/${e}`,domain:L}:{url:`https://${L}/${e}`,domain:L}},exports.getCategoryNameById=(t,e,r)=>{var A;const _=null===(A=null==e?void 0:e.find)||void 0===A?void 0:A.call(e,({id:E})=>E===t);if(E.isEmpty(_))return"";const{name:T}=g(_,r);return T||""},exports.getCategoryTranslation=g,exports.getCoverPhotoSource=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${V}/${E}`:"https://images.tabres.com/tabres-doodle.webp",exports.getDefaultOrderType=(E,t,e)=>{if(!E)return null;const{deliveryOrderEnabled:r,dineInOrderEnabled:A,pickupOrderEnabled:_}=E;return r&&e?i.DELIVERY:A&&t?i.DINE_IN:_&&t?i.PICK_UP:null},exports.getHasUserPermission=(t,e)=>!!E.isEmpty(t)||!E.isEmpty(e)&&(!!e.includes(m.ALL)||t.some(E=>e.includes(E))),exports.getImageSource=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${V}/${E}`:"",exports.getIsFeatureActive=(t,e)=>{if("1"===E.getQueryParam(t))return!0;return(e===C.ALPHA?[C.ALPHA,C.BETA,C.ALL]:e===C.BETA?[C.BETA,C.ALL]:[C.ALL]).some(E=>{var e;return null===(e=U[E])||void 0===e?void 0:e.includes(t)})},exports.getLogoImageSource=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${V}/${E}`:"https://images.tabres.com/no-photo-128.webp",exports.getOptionPrice=({option:t,currency:e,language:r})=>{const{price:A}=t||{};return{totalPrice:A,formattedTotalPrice:E.priceFormatter(A,e||"USD",r||"en")}},exports.getOptionTitles=(E,t,e)=>{var r;if(Array.isArray(t))return(E||[]).filter(({id:E})=>t.includes(E)).map(({title:E})=>(null==E?void 0:E[e])||"").filter(Boolean).join(", ");{const A=(E||[]).find(({id:E})=>E===t);return(null===(r=null==A?void 0:A.title)||void 0===r?void 0:r[e])||""}},exports.getOrderErrorMessages=E=>{switch(E){case"customer":return O.ADDRESS_IS_EMPTY;case"tableId":return O.TABLE_NOT_SELECTED;case"items":return O.EMPTY_ITEMS;case"branchId":return O.BRANCH_NOT_SELECTED;default:return O.FIELD_REQUIRED_ERROR}},exports.getOrderItemPrice=E=>{var t;const{price:e,variant:r,addons:A,quantity:_,vat:T}=E||{},R=null!==(t=null==r?void 0:r.price)&&void 0!==t?t:e,o=R+S(A,1),I=R*(T/100),n=o+I;return{totalGross:n*_,totalNet:o*_,totalTax:I*_,itemGrossPrice:n,itemNetPrice:o,itemTax:I}},exports.getOrderPrice=(t,e,r)=>{const A=(E,t,e)=>t*E+S(e,t);let _=0,T=0;for(const E of t.items){const e=A(E.price,E.quantity,E.addons);_+=e,void 0===t.vat&&E.vat&&(T+=e*E.vat/100)}void 0!==t.vat&&(T=_*t.vat/100);const R=_+T;return{totalWithoutTax:_,totalWithoutTaxFormatted:E.priceFormatter(_,e,r),totalTax:T,totalTaxFormatted:E.priceFormatter(T,e,r),totalWithTax:R,totalWithTaxFormatted:E.priceFormatter(R,e,r)}},exports.getPermissionsByRole=E=>{switch(E){case v.OWNER:return[m.ALL];case v.GENERAL_MANAGER:return[m.VIEW_BUSINESS,m.UPDATE_BUSINESS,m.VIEW_ORDERS,m.UPDATE_ORDER,m.CREATE_ORDER,m.VIEW_QR_MENU,m.VIEW_QR_CODES,m.VIEW_MENU,m.VIEW_MENU_ITEMS,m.UPDATE_MENU_ITEM,m.CREATE_MENU_ITEM,m.DELETE_MENU_ITEM,m.VIEW_CATEGORIES,m.UPDATE_CATEGORY,m.CREATE_CATEGORY,m.DELETE_CATEGORY,m.VIEW_ADDONS,m.UPDATE_ADDON,m.CREATE_ADDON,m.DELETE_ADDON,m.VIEW_TABLES,m.UPDATE_TABLE,m.CREATE_TABLE,m.DELETE_TABLE,m.VIEW_BRANCHES,m.UPDATE_BRANCH,m.CREATE_BRANCH,m.DELETE_BRANCH,m.VIEW_EMPLOYEES,m.UPDATE_EMPLOYEE,m.CREATE_EMPLOYEE,m.DELETE_EMPLOYEE,m.VIEW_ANALYTICS,m.VIEW_SALES_REPORTS,m.VIEW_SUBSCRIPTION,m.CREATE_QR_CODE,m.DELETE_QR_CODE,m.AI_ASSISTANT];case v.BRANCH_MANAGER:return[m.VIEW_BUSINESS,m.VIEW_ORDERS,m.UPDATE_ORDER,m.CREATE_ORDER,m.VIEW_QR_MENU,m.VIEW_QR_CODES,m.VIEW_MENU,m.VIEW_MENU_ITEMS,m.UPDATE_MENU_ITEM,m.CREATE_MENU_ITEM,m.DELETE_MENU_ITEM,m.VIEW_CATEGORIES,m.UPDATE_CATEGORY,m.CREATE_CATEGORY,m.DELETE_CATEGORY,m.VIEW_ADDONS,m.UPDATE_ADDON,m.CREATE_ADDON,m.DELETE_ADDON,m.VIEW_TABLES,m.UPDATE_TABLE,m.CREATE_TABLE,m.DELETE_TABLE,m.VIEW_EMPLOYEES,m.UPDATE_EMPLOYEE,m.VIEW_ANALYTICS,m.VIEW_SALES_REPORTS,m.CREATE_QR_CODE,m.DELETE_QR_CODE,m.AI_ASSISTANT];case v.CHEF:return[m.VIEW_MENU,m.VIEW_MENU_ITEMS,m.UPDATE_MENU_ITEM,m.VIEW_CATEGORIES,m.UPDATE_CATEGORY,m.VIEW_ADDONS,m.UPDATE_ADDON,m.VIEW_ORDERS,m.UPDATE_ORDER];case v.SOUS_CHEF:return[m.VIEW_MENU,m.VIEW_MENU_ITEMS,m.VIEW_CATEGORIES,m.VIEW_ADDONS,m.VIEW_ORDERS,m.UPDATE_ORDER];case v.PASTRY_CHEF:return[m.VIEW_MENU,m.VIEW_MENU_ITEMS,m.UPDATE_MENU_ITEM,m.VIEW_ORDERS,m.UPDATE_ORDER];case v.LINE_COOK:case v.PREP_COOK:case v.KITCHEN_ASSISTANT:return[m.VIEW_MENU,m.VIEW_MENU_ITEMS,m.VIEW_ORDERS,m.UPDATE_ORDER];case v.HEAD_WAITER:return[m.VIEW_ORDERS,m.CREATE_ORDER,m.UPDATE_ORDER,m.VIEW_TABLES,m.UPDATE_TABLE_STATUS,m.VIEW_MENU,m.VIEW_MENU_ITEMS,m.VIEW_CATEGORIES,m.VIEW_ADDONS,m.VIEW_QR_MENU,m.VIEW_QR_CODES];case v.WAITER:return[m.VIEW_ORDERS,m.CREATE_ORDER,m.UPDATE_ORDER,m.VIEW_TABLES,m.UPDATE_TABLE_STATUS,m.VIEW_MENU,m.VIEW_MENU_ITEMS,m.VIEW_CATEGORIES,m.VIEW_ADDONS];case v.RUNNER:return[m.VIEW_ORDERS,m.UPDATE_ORDER];case v.BARISTA:case v.BARTENDER:case v.SOMMELIER:case v.ROOM_SERVICE_STAFF:return[m.VIEW_MENU,m.VIEW_MENU_ITEMS,m.VIEW_ORDERS,m.CREATE_ORDER,m.UPDATE_ORDER];case v.ACCOUNTANT:return[m.VIEW_ANALYTICS,m.VIEW_SALES_REPORTS,m.VIEW_SUBSCRIPTION];case v.DELIVERY_DRIVER:return[m.VIEW_ORDERS,m.UPDATE_ORDER];case v.INVENTORY_MANAGER:return[m.VIEW_CATEGORIES,m.UPDATE_CATEGORY,m.CREATE_CATEGORY,m.DELETE_CATEGORY,m.VIEW_ADDONS,m.UPDATE_ADDON,m.CREATE_ADDON,m.DELETE_ADDON,m.VIEW_MENU,m.VIEW_MENU_ITEMS,m.UPDATE_MENU_ITEM,m.CREATE_MENU_ITEM,m.DELETE_MENU_ITEM,m.VIEW_PURCHASES,m.CREATE_PURCHASE,m.UPDATE_PURCHASE,m.DELETE_PURCHASE,m.VIEW_INVENTORY,m.VIEW_INVENTORY_PRODUCTS,m.CREATE_INVENTORY_PRODUCT,m.UPDATE_INVENTORY_PRODUCT,m.DELETE_INVENTORY_PRODUCT,m.VIEW_PURCHASE_DETAIL,m.VIEW_BRANCH_BALANCE,m.UPDATE_PRODUCT_INGREDIENTS,m.DELETE_PRODUCT_INGREDIENTS];case v.PURCHASING_MANAGER:return[m.VIEW_MENU,m.VIEW_MENU_ITEMS,m.VIEW_CATEGORIES,m.CREATE_CATEGORY,m.UPDATE_CATEGORY,m.VIEW_ADDONS,m.CREATE_ADDON,m.UPDATE_ADDON];case v.WAREHOUSE_STAFF:return[m.VIEW_CATEGORIES,m.VIEW_ADDONS,m.VIEW_MENU,m.VIEW_MENU_ITEMS];default:return[]}},exports.getPriceSuffix=E=>{switch(E){case A.WEIGHT:return" / kg";case A.VOLUME:return" / l";default:return""}},exports.getProductAddon=(E,t)=>((null==E?void 0:E.addons)||[]).find(({id:E})=>E===t)||{},exports.getProductOrderPrice=({product:t,variantId:e,quantity:r=1,currency:A,language:_,selectedAddons:T,noVat:R=!1})=>{const{total:o}=a({product:t,variantId:e,quantity:r,selectedAddons:T,noVat:R});return{totalPrice:o,formattedTotalPrice:E.priceFormatter(o,A,_)}},exports.getProductOrderRawPrice=a,exports.getProductPrice=(t,e,r,A=1)=>{const _=R(t,A);return{totalPrice:_,formattedTotalPrice:E.priceFormatter(_,e,r)}},exports.getProductRawPrice=R,exports.getProductSellUnitShortCuts=E=>{switch(E){case A.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 A.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,t)=>{var e;return(null===(e=null==E?void 0:E.translations)||void 0===e?void 0:e[t])||{}},exports.getProductVariant=o,exports.getProductVariantPrice=({variantId:t,currency:e="USD",language:r="en",product:A,quantity:_=1})=>{const T=n(t,A,_);return{totalPrice:T,formattedTotalPrice:E.priceFormatter(T,e,r)}},exports.getProductVariantRawPrice=n,exports.getProductVariantTranslation=(E,t)=>{var e;return(null===(e=null==E?void 0:E.title)||void 0===e?void 0:e[t])||""},exports.getRegisterUrl=(E,t)=>`https://app.tabres.com/auth/register?lang=${E}&utm_source=${t}`,exports.getSelectedAddonsFromOrderItems=E=>{const t={};for(const{addonId:e,options:r=[]}of E.addons||[]){const E=r.map(({optionId:E})=>E);t[e]=1===E.length?E[0]:E}return t},exports.getSelectedOptionsTotalPrice=I,exports.getStatusIcon=E=>{switch(E){case s.COMPLETED:return t.Check;case s.DELIVERED:return t.BagCheck;case s.OUT_FOR_DELIVERY:return t.Delivery;case s.PREPARING:return t.Chef;case s.CONFIRMED:return t.FileCheck;case s.PENDING:default:return t.HourglassHalf}},exports.getVideoSource=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${V}/${E}`:"",exports.prepareCategoryAndProductMap=(E,t)=>{const e=t.reduce((E,t)=>{if(!t.visible)return E;const e=Number(t.categoryId);return E[e]||(E[e]=[]),E[e].push(t),E},{});return E.map(E=>Object.assign(Object.assign({},E),{products:e[Number(E.id)]||[]})).filter(E=>{var t;return(null===(t=null==E?void 0:E.products)||void 0===t?void 0:t.length)>0})},exports.preparePhoneNumber=E=>`${E.countryCode}${E.phoneNumber}`.replaceAll("+",""),exports.rgbDataURL=(E,t,e)=>`data:image/gif;base64,R0lGODlhAQABAPAA${p(0,E,t)+p(e,255,255)}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`,exports.validateAddressForm=E=>{const t={},{countryCode:e,cityName:r,street:A,houseNumber:_}=E||{};return e||(t.countryCode="COUNTRY_REQUIRED"),r||(t.cityName="CITY_REQUIRED"),A||(t.street="STREET_REQUIRED"),_||(t.houseNumber="STREET_NUMBER_REQUIRED"),t},exports.validateForm=(t,e)=>{const r={},{email:A,otp:_}=t||{};switch(e){case u.OTP:A&&E.checkIsValidEmail(A)||(r.email="Invalid Email Address"),_&&6===_.length||(r.otp="Invalid OTP");break;case u.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 t=E.replace(/\D/g,""),e=t.startsWith("994")?"994":t.startsWith("31")?"31":null;if(!e)return{isValid:!1,error:"Unsupported country code"};const r=t.slice(e.length);return(0,W[e])(r)};
|
|
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,i,s;!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"}(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,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 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 O,S;!function(E){E.UPLOAD_VIDEO="UPLOAD_VIDEO"}(O||(O={})),function(E){E.ALPHA="ALPHA",E.BETA="BETA",E.ALL="ALL"}(S||(S={}));const l={[S.ALPHA]:[O.UPLOAD_VIDEO],[S.BETA]:[],[S.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,r)=>P.charAt(E>>2)+P.charAt((3&E)<<4|e>>4)+P.charAt((15&e)<<2|r>>6)+P.charAt(63&r),U=(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_ORDERS="VIEW_ORDERS",E.UPDATE_ORDER="UPDATE_ORDER",E.CREATE_ORDER="CREATE_ORDER",E.VIEW_QR_MENU="VIEW_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"}(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"}(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 i=Math.max(0,Math.min(1,I+e/100)),s=(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 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,n+1/3),a=s(e,E,n),N=s(e,E,n-1/3)}const O=E=>Math.round(255*E).toString(16).padStart(2,"0");return`#${O(D)}${O(a)}${O(N)}`},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:u}:{url:`https://${u}/${r}`,domain:u}},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}=U(_,t);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,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:`${C}/${E}`:"",exports.getIsFeatureActive=(e,r)=>{if("1"===E.getQueryParam(e))return!0;return(r===S.ALPHA?[S.ALPHA,S.BETA,S.ALL]:r===S.BETA?[S.BETA,S.ALL]:[S.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:`${C}/${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 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,r,t)=>{const A=D(e);return E.priceFormatter(A,r,t)},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 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:`${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 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${d(0,E,e)+d(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 a.OTP:A&&E.checkIsValidEmail(A)||(t.email="Invalid Email Address"),_&&6===_.length||(t.otp="Invalid OTP");break;case a.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,c[r])(t)};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|