@tabres/react 1.0.11 → 1.0.13
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/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/modules/menu/models.d.ts +23 -0
- package/dist/models/modules/view/index.d.ts +4 -0
- package/dist/models/modules/view/utils.d.ts +1 -0
- package/dist/modules/menu/models.d.ts +23 -0
- package/dist/modules/view/utils.d.ts +1 -0
- package/dist/styles/ui.css +1 -1
- package/dist/styles/ui.css.map +1 -1
- package/dist/utils/index.esm.js +1 -1
- package/dist/utils/index.esm.js.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/modules/menu/models.d.ts +23 -0
- package/dist/utils/modules/view/utils.d.ts +1 -0
- package/package.json +2 -2
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 I,Delivery as e,BagCheck as n,Check as D}from"@sorocraft/ui/icons";const i=(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))||{}},a=(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))||{}},o=({option:A,currency:_,language:T})=>{const{price:t}=A||{};return{totalPrice:t,formattedTotalPrice:E(t,_||"USD",T||"en")}},N=(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(({translations:E})=>{var A;return(null===(A=E.find(E=>E.language===_))||void 0===A?void 0:A.title)||""}).filter(Boolean).join(", ");{const t=(E||[]).find(({id:E})=>E===A);return(null===(T=null==t?void 0:t.translations.find(E=>E.language===_))||void 0===T?void 0:T.title)||""}},l=(E,A)=>{var _,T,t;return(null===(t=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))||void 0===t?void 0:t.title)||""};var S,s,C;!function(E){E.LIST="list",E.GRID="grid"}(S||(S={})),function(E){E.PIECE="PIECE",E.WEIGHT="WEIGHT",E.VOLUME="VOLUME"}(s||(s={})),function(E){E.SINGLE="SINGLE",E.MULTIPLE="MULTIPLE"}(C||(C={}));const u=(E=0,A=1,_=0)=>E*A*(1+_/100),c=(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))||{}},U=(E,A=1)=>{const{price:_=0,vat:T=0}=E||{};return u(_,A,T)},P=(A,_,T,t=1)=>{const R=U(A,t);return{totalPrice:R,formattedTotalPrice:E(R,_,T)}},d=(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))||{}},L=(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+N(_,t)}return E+(A[T]||[]).reduce((E,A)=>E+N(_,A),0)},0)*_,V=(E,A,_)=>{const T=d(A,E),{vat:t}=A||{},{price:R}=T||{};return u(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 _,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))||{}},v=({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}),I=L(r,t,T),e=_?V(_,r,T):U(r,T);return{price:e,optionsPrice:I,total:e+I}},B=({product:A,variantId:_,quantity:T=1,currency:t,language:R,selectedAddons:r,noVat:I=!1})=>{const{total:e}=v({product:A,variantId:_,quantity:T,selectedAddons:r,noVat:I});return{totalPrice:e,formattedTotalPrice:E(e,t,R)}},H=(E,A)=>((null==E?void 0:E.addons)||[]).find(({id:E})=>E===A)||{},Y=E=>{switch(E){case s.WEIGHT:return" / kg";case s.VOLUME:return" / l";default:return""}},G=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 f,m,p,g,h,b;!function(E){E.DINE_IN="DINE_IN",E.PICK_UP="PICK_UP",E.DELIVERY="DELIVERY"}(f||(f={})),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"}(m||(m={})),function(E){E.PENDING="PENDING",E.PREPARING="PREPARING",E.READY="READY",E.SERVED="SERVED"}(p||(p={})),function(E){E.CASH="CASH",E.CARD="CARD",E.WALLET="WALLET",E.TERMINAL="TERMINAL"}(g||(g={})),function(E){E.CART="CART",E.DETAILS="DETAILS",E.COMPLETED="COMPLETED"}(h||(h={})),g.CASH,h.CART,h.DETAILS,h.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 Q=(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 I=R+r;return{totalWithoutTax:R,totalWithoutTaxFormatted:E(R,_,T),totalTax:r,totalTaxFormatted:E(r,_,T),totalWithTax:I,totalWithTaxFormatted:E(I,_,T)}},$=(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||{},I=null!==(A=null==T?void 0:T.price)&&void 0!==A?A:_,e=I+y(t,1),n=I*(r/100),D=e+n;return{totalGross:D*R,totalNet:e*R,totalTax:n*R,itemGrossPrice:D,itemNetPrice:e,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 m.COMPLETED:return D;case m.DELIVERED:return n;case m.OUT_FOR_DELIVERY:return e;case m.PREPARING:return I;case m.CONFIRMED:return r;case m.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 I=(r.options||[]).filter(E=>R.includes(E.id)).map(E=>({optionId:E.id,price:E.price}));return{addonId:t,options:I}}),k=(E,A,_)=>{if(!E)return null;const{deliveryOrderEnabled:T,dineInOrderEnabled:t,pickupOrderEnabled:R}=E;return T&&_?f.DELIVERY:t&&A?f.DINE_IN:R&&A?f.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)})},IE="tabres.com",eE="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 iE=(E,A)=>{const _=A||"en";return"localhost:3000"===E?{url:`http://localhost:3000/${_}`,domain:IE}:{url:`https://${IE}/${_}`,domain:IE}},aE=(E,A)=>`https://app.tabres.com/auth/register?lang=${E}&utm_source=${A}`,oE=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${eE}/${E}`:"",NE=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${eE}/${E}`:"https://images.tabres.com/no-photo-128.webp",OE=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${eE}/${E}`:"https://images.tabres.com/tabres-doodle.webp",lE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",SE=(E,A,_)=>lE.charAt(E>>2)+lE.charAt((3&E)<<4|A>>4)+lE.charAt((15&A)<<2|_>>6)+lE.charAt(63&_),sE=(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:`${eE}/${E}`:"",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))||{}},cE=(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||""},UE=(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 PE,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"}(PE||(PE={})),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 LE=E=>{switch(E){case dE.OWNER:return[PE.ALL];case dE.GENERAL_MANAGER:return[PE.VIEW_BUSINESS,PE.UPDATE_BUSINESS,PE.VIEW_ORDERS,PE.UPDATE_ORDER,PE.CREATE_ORDER,PE.VIEW_QR_MENU,PE.VIEW_QR_CODES,PE.VIEW_MENU,PE.VIEW_MENU_ITEMS,PE.UPDATE_MENU_ITEM,PE.CREATE_MENU_ITEM,PE.DELETE_MENU_ITEM,PE.VIEW_CATEGORIES,PE.UPDATE_CATEGORY,PE.CREATE_CATEGORY,PE.DELETE_CATEGORY,PE.VIEW_ADDONS,PE.UPDATE_ADDON,PE.CREATE_ADDON,PE.DELETE_ADDON,PE.VIEW_TABLES,PE.UPDATE_TABLE,PE.CREATE_TABLE,PE.DELETE_TABLE,PE.VIEW_BRANCHES,PE.UPDATE_BRANCH,PE.CREATE_BRANCH,PE.DELETE_BRANCH,PE.VIEW_EMPLOYEES,PE.UPDATE_EMPLOYEE,PE.CREATE_EMPLOYEE,PE.DELETE_EMPLOYEE,PE.VIEW_ANALYTICS,PE.VIEW_SALES_REPORTS,PE.VIEW_SUBSCRIPTION,PE.CREATE_QR_CODE,PE.DELETE_QR_CODE,PE.AI_ASSISTANT];case dE.BRANCH_MANAGER:return[PE.VIEW_BUSINESS,PE.VIEW_ORDERS,PE.UPDATE_ORDER,PE.CREATE_ORDER,PE.VIEW_QR_MENU,PE.VIEW_QR_CODES,PE.VIEW_MENU,PE.VIEW_MENU_ITEMS,PE.UPDATE_MENU_ITEM,PE.CREATE_MENU_ITEM,PE.DELETE_MENU_ITEM,PE.VIEW_CATEGORIES,PE.UPDATE_CATEGORY,PE.CREATE_CATEGORY,PE.DELETE_CATEGORY,PE.VIEW_ADDONS,PE.UPDATE_ADDON,PE.CREATE_ADDON,PE.DELETE_ADDON,PE.VIEW_TABLES,PE.UPDATE_TABLE,PE.CREATE_TABLE,PE.DELETE_TABLE,PE.VIEW_EMPLOYEES,PE.UPDATE_EMPLOYEE,PE.VIEW_ANALYTICS,PE.VIEW_SALES_REPORTS,PE.CREATE_QR_CODE,PE.DELETE_QR_CODE,PE.AI_ASSISTANT];case dE.CHEF:return[PE.VIEW_MENU,PE.VIEW_MENU_ITEMS,PE.UPDATE_MENU_ITEM,PE.VIEW_CATEGORIES,PE.UPDATE_CATEGORY,PE.VIEW_ADDONS,PE.UPDATE_ADDON,PE.VIEW_ORDERS,PE.UPDATE_ORDER];case dE.SOUS_CHEF:return[PE.VIEW_MENU,PE.VIEW_MENU_ITEMS,PE.VIEW_CATEGORIES,PE.VIEW_ADDONS,PE.VIEW_ORDERS,PE.UPDATE_ORDER];case dE.PASTRY_CHEF:return[PE.VIEW_MENU,PE.VIEW_MENU_ITEMS,PE.UPDATE_MENU_ITEM,PE.VIEW_ORDERS,PE.UPDATE_ORDER];case dE.LINE_COOK:case dE.PREP_COOK:case dE.KITCHEN_ASSISTANT:return[PE.VIEW_MENU,PE.VIEW_MENU_ITEMS,PE.VIEW_ORDERS,PE.UPDATE_ORDER];case dE.HEAD_WAITER:return[PE.VIEW_ORDERS,PE.CREATE_ORDER,PE.UPDATE_ORDER,PE.VIEW_TABLES,PE.UPDATE_TABLE_STATUS,PE.VIEW_MENU,PE.VIEW_MENU_ITEMS,PE.VIEW_CATEGORIES,PE.VIEW_ADDONS,PE.VIEW_QR_MENU,PE.VIEW_QR_CODES];case dE.WAITER:return[PE.VIEW_ORDERS,PE.CREATE_ORDER,PE.UPDATE_ORDER,PE.VIEW_TABLES,PE.UPDATE_TABLE_STATUS,PE.VIEW_MENU,PE.VIEW_MENU_ITEMS,PE.VIEW_CATEGORIES,PE.VIEW_ADDONS];case dE.RUNNER:return[PE.VIEW_ORDERS,PE.UPDATE_ORDER];case dE.BARISTA:case dE.BARTENDER:case dE.SOMMELIER:case dE.ROOM_SERVICE_STAFF:return[PE.VIEW_MENU,PE.VIEW_MENU_ITEMS,PE.VIEW_ORDERS,PE.CREATE_ORDER,PE.UPDATE_ORDER];case dE.ACCOUNTANT:return[PE.VIEW_ANALYTICS,PE.VIEW_SALES_REPORTS,PE.VIEW_SUBSCRIPTION];case dE.DELIVERY_DRIVER:return[PE.VIEW_ORDERS,PE.UPDATE_ORDER];case dE.INVENTORY_MANAGER:return[PE.VIEW_CATEGORIES,PE.UPDATE_CATEGORY,PE.CREATE_CATEGORY,PE.DELETE_CATEGORY,PE.VIEW_ADDONS,PE.UPDATE_ADDON,PE.CREATE_ADDON,PE.DELETE_ADDON,PE.VIEW_MENU,PE.VIEW_MENU_ITEMS,PE.UPDATE_MENU_ITEM,PE.CREATE_MENU_ITEM,PE.DELETE_MENU_ITEM,PE.VIEW_PURCHASES,PE.CREATE_PURCHASE,PE.UPDATE_PURCHASE,PE.DELETE_PURCHASE,PE.VIEW_INVENTORY,PE.VIEW_INVENTORY_PRODUCTS,PE.CREATE_INVENTORY_PRODUCT,PE.UPDATE_INVENTORY_PRODUCT,PE.DELETE_INVENTORY_PRODUCT,PE.VIEW_PURCHASE_DETAIL,PE.VIEW_BRANCH_BALANCE,PE.UPDATE_PRODUCT_INGREDIENTS,PE.DELETE_PRODUCT_INGREDIENTS];case dE.PURCHASING_MANAGER:return[PE.VIEW_MENU,PE.VIEW_MENU_ITEMS,PE.VIEW_CATEGORIES,PE.CREATE_CATEGORY,PE.UPDATE_CATEGORY,PE.VIEW_ADDONS,PE.CREATE_ADDON,PE.UPDATE_ADDON];case dE.WAREHOUSE_STAFF:return[PE.VIEW_CATEGORIES,PE.VIEW_ADDONS,PE.VIEW_MENU,PE.VIEW_MENU_ITEMS];default:return[]}},VE=(E,_)=>!!A(E)||!A(_)&&(!!_.includes(PE.ALL)||E.some(E=>_.includes(E)));export{x as buildSelectedAddonsPayload,F as calculatSingleAddonTotalPrice,y as calculateTotalAddonPrice,u as calculateTotalPrice,_E as formatAddressLine,AE as formatCityLine,$ as generateOrderItemsId,N as getAddonOptionRawPrice,a as getAddonOptionTranslation,l as getAddonTitle,i as getAddonTranslation,iE as getBaseUrl,cE as getCategoryNameById,uE as getCategoryTranslation,OE as getCoverPhotoSource,k as getDefaultOrderType,VE as getHasUserPermission,oE as getImageSource,rE as getIsFeatureActive,NE as getLogoImageSource,o as getOptionPrice,O as getOptionTitles,q as getOrderErrorMessages,j as getOrderItemPrice,Q as getOrderPrice,LE as getPermissionsByRole,Y as getPriceSuffix,H as getProductAddon,B as getProductOrderPrice,v as getProductOrderRawPrice,P as getProductPrice,U as getProductRawPrice,G as getProductSellUnitShortCuts,c as getProductTranslation,d as getProductVariant,W as getProductVariantPrice,V as getProductVariantRawPrice,M as getProductVariantTranslation,aE as getRegisterUrl,w as getSelectedAddonsFromOrderItems,L as getSelectedOptionsTotalPrice,K as getStatusIcon,CE as getVideoSource,UE as prepareCategoryAndProductMap,X as preparePhoneNumber,sE 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 T}from"@sorocraft/js-utils";import{HourglassHalf as R,FileCheck as r,Chef as e,Delivery as n,BagCheck as I,Check as D}from"@sorocraft/ui/icons";const a=(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))||{}},i=(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))||{}},o=({option:A,currency:_,language:t})=>{const{price:T}=A||{};return{totalPrice:T,formattedTotalPrice:E(T,_||"USD",t||"en")}},N=(E,A)=>{var _;return(null===(_=((null==E?void 0:E.options)||[]).find(({id:E})=>E===A))||void 0===_?void 0:_.price)||0},l=(E,A,_)=>{var t;if(Array.isArray(A))return(E||[]).filter(({id:E})=>A.includes(E)).map(({translations:E})=>{var A;return(null===(A=E.find(E=>E.language===_))||void 0===A?void 0:A.title)||""}).filter(Boolean).join(", ");{const T=(E||[]).find(({id:E})=>E===A);return(null===(t=null==T?void 0:T.translations.find(E=>E.language===_))||void 0===t?void 0:t.title)||""}},O=(E,A)=>{var _,t,T;return(null===(T=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))||void 0===T?void 0:T.title)||""};var s,S,u;!function(E){E.LIST="list",E.GRID="grid"}(s||(s={})),function(E){E.PIECE="PIECE",E.WEIGHT="WEIGHT",E.VOLUME="VOLUME"}(S||(S={})),function(E){E.SINGLE="SINGLE",E.MULTIPLE="MULTIPLE"}(u||(u={}));const C=(E=0,A=1,_=0)=>E*A*(1+_/100),c=(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))||{}},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)}},d=(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))||{}},L=(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===u.SINGLE){const T=A[t];return E+N(_,T)}return E+(A[t]||[]).reduce((E,A)=>E+N(_,A),0)},0)*_,V=(E,A,_)=>{const t=d(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 _,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))||{}},v=({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=L(r,T,t),n=_?V(_,r,t):U(r,t);return{price:n,optionsPrice:e,total:n+e}},B=({product:A,variantId:_,quantity:t=1,currency:T,language:R,selectedAddons:r,noVat:e=!1})=>{const{total:n}=v({product:A,variantId:_,quantity:t,selectedAddons:r,noVat:e});return{totalPrice:n,formattedTotalPrice:E(n,T,R)}},H=(E,A)=>((null==E?void 0:E.addons)||[]).find(({id:E})=>E===A)||{},Y=E=>{switch(E){case S.WEIGHT:return" / kg";case S.VOLUME:return" / l";default:return""}},m=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 f,G,p,g,h,b;!function(E){E.DINE_IN="DINE_IN",E.PICK_UP="PICK_UP",E.DELIVERY="DELIVERY"}(f||(f={})),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"}(G||(G={})),function(E){E.PENDING="PENDING",E.PREPARING="PREPARING",E.READY="READY",E.SERVED="SERVED"}(p||(p={})),function(E){E.CASH="CASH",E.CARD="CARD",E.WALLET="WALLET",E.TERMINAL="TERMINAL"}(g||(g={})),function(E){E.CART="CART",E.DETAILS="DETAILS",E.COMPLETED="COMPLETED"}(h||(h={})),g.CASH,h.CART,h.DETAILS,h.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:_,n=e+y(T,1),I=e*(r/100),D=n+I;return{totalGross:D*R,totalNet:n*R,totalTax:I*R,itemGrossPrice:D,itemNetPrice:n,itemTax:I}},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 G.COMPLETED:return D;case G.DELIVERED:return I;case G.OUT_FOR_DELIVERY:return n;case G.PREPARING:return e;case G.CONFIRMED:return r;case G.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&&_?f.DELIVERY:T&&A?f.DINE_IN:R&&A?f.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",nE="https://images.tabres.com",IE={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,IE[_])(t)}const aE=(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:`${nE}/${E}`:"",NE=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${nE}/${E}`:"https://images.tabres.com/no-photo-128.webp",lE=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${nE}/${E}`:"https://images.tabres.com/tabres-doodle.webp",OE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",sE=(E,A,_)=>OE.charAt(E>>2)+OE.charAt((3&E)<<4|A>>4)+OE.charAt((15&A)<<2|_>>6)+OE.charAt(63&_),SE=(E,A,_)=>`data:image/gif;base64,R0lGODlhAQABAPAA${sE(0,E,A)+sE(_,255,255)}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`,uE=E=>E?E.includes("base64")||E.startsWith("https://")?E:`${nE}/${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),n=(r+e)/2;let I=0,D=0;if(r!==e){const E=r-e;switch(D=n>.5?E/(2-r-e):E/(r+e),r){case t:I=(T-R)/E+(T<R?6:0);break;case T:I=(R-t)/E+2;break;case R:I=(t-T)/E+4}I/=6}const a=Math.max(0,Math.min(1,n+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=a,N=a,l=a;if(0!==D){const E=a<.5?a*(1+D):a+D-a*D,A=2*a-E;o=i(A,E,I+1/3),N=i(A,E,I),l=i(A,E,I-1/3)}const O=E=>Math.round(255*E).toString(16).padStart(2,"0");return`#${O(o)}${O(N)}${O(l)}`},cE=(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}=cE(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 dE,LE;!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"}(dE||(dE={})),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"}(LE||(LE={}));const VE=E=>{switch(E){case LE.OWNER:return[dE.ALL];case LE.GENERAL_MANAGER:return[dE.VIEW_BUSINESS,dE.UPDATE_BUSINESS,dE.VIEW_ORDERS,dE.UPDATE_ORDER,dE.CREATE_ORDER,dE.VIEW_QR_MENU,dE.VIEW_QR_CODES,dE.VIEW_MENU,dE.VIEW_MENU_ITEMS,dE.UPDATE_MENU_ITEM,dE.CREATE_MENU_ITEM,dE.DELETE_MENU_ITEM,dE.VIEW_CATEGORIES,dE.UPDATE_CATEGORY,dE.CREATE_CATEGORY,dE.DELETE_CATEGORY,dE.VIEW_ADDONS,dE.UPDATE_ADDON,dE.CREATE_ADDON,dE.DELETE_ADDON,dE.VIEW_TABLES,dE.UPDATE_TABLE,dE.CREATE_TABLE,dE.DELETE_TABLE,dE.VIEW_BRANCHES,dE.UPDATE_BRANCH,dE.CREATE_BRANCH,dE.DELETE_BRANCH,dE.VIEW_EMPLOYEES,dE.UPDATE_EMPLOYEE,dE.CREATE_EMPLOYEE,dE.DELETE_EMPLOYEE,dE.VIEW_ANALYTICS,dE.VIEW_SALES_REPORTS,dE.VIEW_SUBSCRIPTION,dE.CREATE_QR_CODE,dE.DELETE_QR_CODE,dE.AI_ASSISTANT];case LE.BRANCH_MANAGER:return[dE.VIEW_BUSINESS,dE.VIEW_ORDERS,dE.UPDATE_ORDER,dE.CREATE_ORDER,dE.VIEW_QR_MENU,dE.VIEW_QR_CODES,dE.VIEW_MENU,dE.VIEW_MENU_ITEMS,dE.UPDATE_MENU_ITEM,dE.CREATE_MENU_ITEM,dE.DELETE_MENU_ITEM,dE.VIEW_CATEGORIES,dE.UPDATE_CATEGORY,dE.CREATE_CATEGORY,dE.DELETE_CATEGORY,dE.VIEW_ADDONS,dE.UPDATE_ADDON,dE.CREATE_ADDON,dE.DELETE_ADDON,dE.VIEW_TABLES,dE.UPDATE_TABLE,dE.CREATE_TABLE,dE.DELETE_TABLE,dE.VIEW_EMPLOYEES,dE.UPDATE_EMPLOYEE,dE.VIEW_ANALYTICS,dE.VIEW_SALES_REPORTS,dE.CREATE_QR_CODE,dE.DELETE_QR_CODE,dE.AI_ASSISTANT];case LE.CHEF:return[dE.VIEW_MENU,dE.VIEW_MENU_ITEMS,dE.UPDATE_MENU_ITEM,dE.VIEW_CATEGORIES,dE.UPDATE_CATEGORY,dE.VIEW_ADDONS,dE.UPDATE_ADDON,dE.VIEW_ORDERS,dE.UPDATE_ORDER];case LE.SOUS_CHEF:return[dE.VIEW_MENU,dE.VIEW_MENU_ITEMS,dE.VIEW_CATEGORIES,dE.VIEW_ADDONS,dE.VIEW_ORDERS,dE.UPDATE_ORDER];case LE.PASTRY_CHEF:return[dE.VIEW_MENU,dE.VIEW_MENU_ITEMS,dE.UPDATE_MENU_ITEM,dE.VIEW_ORDERS,dE.UPDATE_ORDER];case LE.LINE_COOK:case LE.PREP_COOK:case LE.KITCHEN_ASSISTANT:return[dE.VIEW_MENU,dE.VIEW_MENU_ITEMS,dE.VIEW_ORDERS,dE.UPDATE_ORDER];case LE.HEAD_WAITER:return[dE.VIEW_ORDERS,dE.CREATE_ORDER,dE.UPDATE_ORDER,dE.VIEW_TABLES,dE.UPDATE_TABLE_STATUS,dE.VIEW_MENU,dE.VIEW_MENU_ITEMS,dE.VIEW_CATEGORIES,dE.VIEW_ADDONS,dE.VIEW_QR_MENU,dE.VIEW_QR_CODES];case LE.WAITER:return[dE.VIEW_ORDERS,dE.CREATE_ORDER,dE.UPDATE_ORDER,dE.VIEW_TABLES,dE.UPDATE_TABLE_STATUS,dE.VIEW_MENU,dE.VIEW_MENU_ITEMS,dE.VIEW_CATEGORIES,dE.VIEW_ADDONS];case LE.RUNNER:return[dE.VIEW_ORDERS,dE.UPDATE_ORDER];case LE.BARISTA:case LE.BARTENDER:case LE.SOMMELIER:case LE.ROOM_SERVICE_STAFF:return[dE.VIEW_MENU,dE.VIEW_MENU_ITEMS,dE.VIEW_ORDERS,dE.CREATE_ORDER,dE.UPDATE_ORDER];case LE.ACCOUNTANT:return[dE.VIEW_ANALYTICS,dE.VIEW_SALES_REPORTS,dE.VIEW_SUBSCRIPTION];case LE.DELIVERY_DRIVER:return[dE.VIEW_ORDERS,dE.UPDATE_ORDER];case LE.INVENTORY_MANAGER:return[dE.VIEW_CATEGORIES,dE.UPDATE_CATEGORY,dE.CREATE_CATEGORY,dE.DELETE_CATEGORY,dE.VIEW_ADDONS,dE.UPDATE_ADDON,dE.CREATE_ADDON,dE.DELETE_ADDON,dE.VIEW_MENU,dE.VIEW_MENU_ITEMS,dE.UPDATE_MENU_ITEM,dE.CREATE_MENU_ITEM,dE.DELETE_MENU_ITEM,dE.VIEW_PURCHASES,dE.CREATE_PURCHASE,dE.UPDATE_PURCHASE,dE.DELETE_PURCHASE,dE.VIEW_INVENTORY,dE.VIEW_INVENTORY_PRODUCTS,dE.CREATE_INVENTORY_PRODUCT,dE.UPDATE_INVENTORY_PRODUCT,dE.DELETE_INVENTORY_PRODUCT,dE.VIEW_PURCHASE_DETAIL,dE.VIEW_BRANCH_BALANCE,dE.UPDATE_PRODUCT_INGREDIENTS,dE.DELETE_PRODUCT_INGREDIENTS];case LE.PURCHASING_MANAGER:return[dE.VIEW_MENU,dE.VIEW_MENU_ITEMS,dE.VIEW_CATEGORIES,dE.CREATE_CATEGORY,dE.UPDATE_CATEGORY,dE.VIEW_ADDONS,dE.CREATE_ADDON,dE.UPDATE_ADDON];case LE.WAREHOUSE_STAFF:return[dE.VIEW_CATEGORIES,dE.VIEW_ADDONS,dE.VIEW_MENU,dE.VIEW_MENU_ITEMS];default:return[]}},WE=(E,_)=>!!A(E)||!A(_)&&(!!_.includes(dE.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,N as getAddonOptionRawPrice,i as getAddonOptionTranslation,O as getAddonTitle,a as getAddonTranslation,aE as getBaseUrl,UE as getCategoryNameById,cE as getCategoryTranslation,lE as getCoverPhotoSource,k as getDefaultOrderType,WE as getHasUserPermission,oE as getImageSource,rE as getIsFeatureActive,NE as getLogoImageSource,o as getOptionPrice,l as getOptionTitles,q as getOrderErrorMessages,j as getOrderItemPrice,$ as getOrderPrice,VE as getPermissionsByRole,Y as getPriceSuffix,H as getProductAddon,B as getProductOrderPrice,v as getProductOrderRawPrice,P as getProductPrice,U as getProductRawPrice,m as getProductSellUnitShortCuts,c as getProductTranslation,d as getProductVariant,W as getProductVariantPrice,V as getProductVariantRawPrice,M as getProductVariantTranslation,iE as getRegisterUrl,w as getSelectedAddonsFromOrderItems,L as getSelectedOptionsTotalPrice,K as getStatusIcon,uE as getVideoSource,PE as prepareCategoryAndProductMap,X as preparePhoneNumber,SE as rgbDataURL,EE as validateAddressForm,Z as validateForm,DE 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 {\n\tMenuAddon,\n\tMenuAddonOption,\n\tMenuAddonOptionTranslation,\n\tMenuAddonTranslation,\n} from \"./models\";\n\nexport const getAddonTranslation = (addon: MenuAddon, language: string): MenuAddonTranslation => {\n\treturn (addon?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonTranslation;\n};\n\nexport const getAddonOptionTranslation = (\n\toption: MenuAddonOption,\n\tlanguage: string\n): MenuAddonOptionTranslation => {\n\treturn (option?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonOptionTranslation;\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(({ translations }) => translations.find((t) => t.language === language)?.title || \"\")\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?.translations.find((t) => t.language === language)?.title || \"\";\n\t}\n};\n\nexport const getAddonTitle = (addon: MenuAddon, language: string): string => {\n\treturn addon?.translations?.find?.((t) => t.language === language)?.title || \"\";\n};\n","import { MenuAddon } from \"../addon/models\";\n\nexport interface ProductTranslation {\n\tid: number;\n\tname: string;\n\tdescription?: string;\n\tlanguage: string;\n\tproductId?: number;\n}\n\nexport interface ProductVariantTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface ProductVariant {\n\tid?: number;\n\tprice: number;\n\ttranslations: ProductVariantTranslation[];\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: ProductTranslation[];\n\tvariants: ProductVariant[];\n\taddons: MenuAddon[];\n\tavailable?: boolean;\n\tvisible?: boolean;\n\tposition?: number;\n\tvideoUrl?: string;\n\tsellUnitType?: SellUnitType;\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 MenuAddonTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOptionTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOption {\n\tid?: number;\n\tprice: number;\n\ttranslations: MenuAddonOptionTranslation[];\n\tremove?: boolean;\n}\n\nexport interface MenuAddon {\n\tid?: number;\n\tselectType: MenuAddonSelectType;\n\ttranslations: MenuAddonTranslation[];\n\toptions: MenuAddonOption[];\n\tbusinessId?: number;\n}\n","import { isEmpty, priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tProduct,\n\tProductTranslation,\n\tProductVariant,\n\tProductVariantTranslation,\n\tSellUnitType,\n} 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): ProductTranslation => {\n\treturn (product?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductTranslation;\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 = (\n\tvariant: ProductVariant,\n\tlanguage: string,\n): ProductVariantTranslation => {\n\treturn (variant?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductVariantTranslation;\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}\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","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","_b","_a","translations","find","call","item","getAddonOptionTranslation","option","getOptionPrice","currency","price","totalPrice","formattedTotalPrice","priceFormatter","getAddonOptionRawPrice","optionId","options","id","getOptionTitles","optionIds","Array","isArray","filter","includes","map","t","title","Boolean","join","getAddonTitle","_c","ProductView","SellUnitType","MenuAddonSelectType","calculateTotalPrice","quantity","vat","getProductTranslation","product","getProductRawPrice","getProductPrice","getProductVariant","variantId","variants","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","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":"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"}
|
|
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 {\n\tMenuAddon,\n\tMenuAddonOption,\n\tMenuAddonOptionTranslation,\n\tMenuAddonTranslation,\n} from \"./models\";\n\nexport const getAddonTranslation = (addon: MenuAddon, language: string): MenuAddonTranslation => {\n\treturn (addon?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonTranslation;\n};\n\nexport const getAddonOptionTranslation = (\n\toption: MenuAddonOption,\n\tlanguage: string\n): MenuAddonOptionTranslation => {\n\treturn (option?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonOptionTranslation;\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(({ translations }) => translations.find((t) => t.language === language)?.title || \"\")\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?.translations.find((t) => t.language === language)?.title || \"\";\n\t}\n};\n\nexport const getAddonTitle = (addon: MenuAddon, language: string): string => {\n\treturn addon?.translations?.find?.((t) => t.language === language)?.title || \"\";\n};\n","import { MenuAddon } from \"../addon/models\";\n\nexport interface ProductTranslation {\n\tid: number;\n\tname: string;\n\tdescription?: string;\n\tlanguage: string;\n\tproductId?: number;\n}\n\nexport interface ProductVariantTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface ProductVariant {\n\tid?: number;\n\tprice: number;\n\ttranslations: ProductVariantTranslation[];\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: ProductTranslation[];\n\tvariants: ProductVariant[];\n\taddons: MenuAddon[];\n\tavailable?: boolean;\n\tvisible?: boolean;\n\tposition?: number;\n\tvideoUrl?: string;\n\tsellUnitType?: SellUnitType;\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 MenuAddonTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOptionTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOption {\n\tid?: number;\n\tprice: number;\n\ttranslations: MenuAddonOptionTranslation[];\n\tremove?: boolean;\n}\n\nexport interface MenuAddon {\n\tid?: number;\n\tselectType: MenuAddonSelectType;\n\ttranslations: MenuAddonTranslation[];\n\toptions: MenuAddonOption[];\n\tbusinessId?: number;\n}\n","import { isEmpty, priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tProduct,\n\tProductTranslation,\n\tProductVariant,\n\tProductVariantTranslation,\n\tSellUnitType,\n} 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): ProductTranslation => {\n\treturn (product?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductTranslation;\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 = (\n\tvariant: ProductVariant,\n\tlanguage: string,\n): ProductVariantTranslation => {\n\treturn (variant?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductVariantTranslation;\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}\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","_b","_a","translations","find","call","item","getAddonOptionTranslation","option","getOptionPrice","currency","price","totalPrice","formattedTotalPrice","priceFormatter","getAddonOptionRawPrice","optionId","options","id","getOptionTitles","optionIds","Array","isArray","filter","includes","map","t","title","Boolean","join","getAddonTitle","_c","ProductView","SellUnitType","MenuAddonSelectType","calculateTotalPrice","quantity","vat","getProductTranslation","product","getProductRawPrice","getProductPrice","getProductVariant","variantId","variants","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","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":"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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))||{}},n=(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,I=(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=n(T,A,r),a=e?I(e,T,r):R(T,r);return{price:a,optionsPrice:o,total:a+o}};var i,s,D,l,N,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"}(l||(l={})),function(E){E.CART="CART",E.DETAILS="DETAILS",E.COMPLETED="COMPLETED"}(N||(N={})),l.CASH,N.CART,N.DETAILS,N.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 c=E=>E.options.reduce((E,t)=>E+t.price,0);function S(E=[],t=1){return t*E.reduce((E,t)=>E+c(t),0)}var d,u;!function(E){E.PHONE="PHONE",E.OTP="OTP",E.EMAIL="EMAIL"}(d||(d={})),function(E){E.HOME="HOME",E.WORK="WORK",E.TRAVEL="TRAVEL"}(u||(u={}));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 v,m;!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"}(v||(v={})),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"}(m||(m={}));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=c,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,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))||{}},exports.getAddonTitle=(E,t)=>{var e,r,A;return(null===(A=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))||void 0===A?void 0:A.title)||""},exports.getAddonTranslation=(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))||{}},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(v.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(({translations:E})=>{var t;return(null===(t=E.find(E=>E.language===e))||void 0===t?void 0:t.title)||""}).filter(Boolean).join(", ");{const A=(E||[]).find(({id:E})=>E===t);return(null===(r=null==A?void 0:A.translations.find(E=>E.language===e))||void 0===r?void 0:r.title)||""}},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),n=R*(T/100),I=o+n;return{totalGross:I*_,totalNet:o*_,totalTax:n*_,itemGrossPrice:I,itemNetPrice:o,itemTax:n}},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 m.OWNER:return[v.ALL];case m.GENERAL_MANAGER:return[v.VIEW_BUSINESS,v.UPDATE_BUSINESS,v.VIEW_ORDERS,v.UPDATE_ORDER,v.CREATE_ORDER,v.VIEW_QR_MENU,v.VIEW_QR_CODES,v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.UPDATE_MENU_ITEM,v.CREATE_MENU_ITEM,v.DELETE_MENU_ITEM,v.VIEW_CATEGORIES,v.UPDATE_CATEGORY,v.CREATE_CATEGORY,v.DELETE_CATEGORY,v.VIEW_ADDONS,v.UPDATE_ADDON,v.CREATE_ADDON,v.DELETE_ADDON,v.VIEW_TABLES,v.UPDATE_TABLE,v.CREATE_TABLE,v.DELETE_TABLE,v.VIEW_BRANCHES,v.UPDATE_BRANCH,v.CREATE_BRANCH,v.DELETE_BRANCH,v.VIEW_EMPLOYEES,v.UPDATE_EMPLOYEE,v.CREATE_EMPLOYEE,v.DELETE_EMPLOYEE,v.VIEW_ANALYTICS,v.VIEW_SALES_REPORTS,v.VIEW_SUBSCRIPTION,v.CREATE_QR_CODE,v.DELETE_QR_CODE,v.AI_ASSISTANT];case m.BRANCH_MANAGER:return[v.VIEW_BUSINESS,v.VIEW_ORDERS,v.UPDATE_ORDER,v.CREATE_ORDER,v.VIEW_QR_MENU,v.VIEW_QR_CODES,v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.UPDATE_MENU_ITEM,v.CREATE_MENU_ITEM,v.DELETE_MENU_ITEM,v.VIEW_CATEGORIES,v.UPDATE_CATEGORY,v.CREATE_CATEGORY,v.DELETE_CATEGORY,v.VIEW_ADDONS,v.UPDATE_ADDON,v.CREATE_ADDON,v.DELETE_ADDON,v.VIEW_TABLES,v.UPDATE_TABLE,v.CREATE_TABLE,v.DELETE_TABLE,v.VIEW_EMPLOYEES,v.UPDATE_EMPLOYEE,v.VIEW_ANALYTICS,v.VIEW_SALES_REPORTS,v.CREATE_QR_CODE,v.DELETE_QR_CODE,v.AI_ASSISTANT];case m.CHEF:return[v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.UPDATE_MENU_ITEM,v.VIEW_CATEGORIES,v.UPDATE_CATEGORY,v.VIEW_ADDONS,v.UPDATE_ADDON,v.VIEW_ORDERS,v.UPDATE_ORDER];case m.SOUS_CHEF:return[v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.VIEW_CATEGORIES,v.VIEW_ADDONS,v.VIEW_ORDERS,v.UPDATE_ORDER];case m.PASTRY_CHEF:return[v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.UPDATE_MENU_ITEM,v.VIEW_ORDERS,v.UPDATE_ORDER];case m.LINE_COOK:case m.PREP_COOK:case m.KITCHEN_ASSISTANT:return[v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.VIEW_ORDERS,v.UPDATE_ORDER];case m.HEAD_WAITER:return[v.VIEW_ORDERS,v.CREATE_ORDER,v.UPDATE_ORDER,v.VIEW_TABLES,v.UPDATE_TABLE_STATUS,v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.VIEW_CATEGORIES,v.VIEW_ADDONS,v.VIEW_QR_MENU,v.VIEW_QR_CODES];case m.WAITER:return[v.VIEW_ORDERS,v.CREATE_ORDER,v.UPDATE_ORDER,v.VIEW_TABLES,v.UPDATE_TABLE_STATUS,v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.VIEW_CATEGORIES,v.VIEW_ADDONS];case m.RUNNER:return[v.VIEW_ORDERS,v.UPDATE_ORDER];case m.BARISTA:case m.BARTENDER:case m.SOMMELIER:case m.ROOM_SERVICE_STAFF:return[v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.VIEW_ORDERS,v.CREATE_ORDER,v.UPDATE_ORDER];case m.ACCOUNTANT:return[v.VIEW_ANALYTICS,v.VIEW_SALES_REPORTS,v.VIEW_SUBSCRIPTION];case m.DELIVERY_DRIVER:return[v.VIEW_ORDERS,v.UPDATE_ORDER];case m.INVENTORY_MANAGER:return[v.VIEW_CATEGORIES,v.UPDATE_CATEGORY,v.CREATE_CATEGORY,v.DELETE_CATEGORY,v.VIEW_ADDONS,v.UPDATE_ADDON,v.CREATE_ADDON,v.DELETE_ADDON,v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.UPDATE_MENU_ITEM,v.CREATE_MENU_ITEM,v.DELETE_MENU_ITEM,v.VIEW_PURCHASES,v.CREATE_PURCHASE,v.UPDATE_PURCHASE,v.DELETE_PURCHASE,v.VIEW_INVENTORY,v.VIEW_INVENTORY_PRODUCTS,v.CREATE_INVENTORY_PRODUCT,v.UPDATE_INVENTORY_PRODUCT,v.DELETE_INVENTORY_PRODUCT,v.VIEW_PURCHASE_DETAIL,v.VIEW_BRANCH_BALANCE,v.UPDATE_PRODUCT_INGREDIENTS,v.DELETE_PRODUCT_INGREDIENTS];case m.PURCHASING_MANAGER:return[v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.VIEW_CATEGORIES,v.CREATE_CATEGORY,v.UPDATE_CATEGORY,v.VIEW_ADDONS,v.CREATE_ADDON,v.UPDATE_ADDON];case m.WAREHOUSE_STAFF:return[v.VIEW_CATEGORIES,v.VIEW_ADDONS,v.VIEW_MENU,v.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,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))||{}},exports.getProductVariant=o,exports.getProductVariantPrice=({variantId:t,currency:e="USD",language:r="en",product:A,quantity:_=1})=>{const T=I(t,A,_);return{totalPrice:T,formattedTotalPrice:E.priceFormatter(T,e,r)}},exports.getProductVariantRawPrice=I,exports.getProductVariantTranslation=(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))||{}},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=n,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 d.OTP:A&&E.checkIsValidEmail(A)||(r.email="Invalid Email Address"),_&&6===_.length||(r.otp="Invalid OTP");break;case d.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"),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))||{}},n=(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,a=(E,t,e)=>{const r=o(t,E),{vat:A}=t||{},{price:_}=r||{};return T(_,e,A)},I=({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=n(T,A,r),I=e?a(e,T,r):R(T,r);return{price:I,optionsPrice:o,total:I+o}};var i,s,D,l,N,c;!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"}(l||(l={})),function(E){E.CART="CART",E.DETAILS="DETAILS",E.COMPLETED="COMPLETED"}(N||(N={})),l.CASH,N.CART,N.DETAILS,N.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"}(c||(c={}));const O=E=>E.options.reduce((E,t)=>E+t.price,0);function S(E=[],t=1){return t*E.reduce((E,t)=>E+O(t),0)}var d,u;!function(E){E.PHONE="PHONE",E.OTP="OTP",E.EMAIL="EMAIL"}(d||(d={})),function(E){E.HOME="HOME",E.WORK="WORK",E.TRAVEL="TRAVEL"}(u||(u={}));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 v,m;!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"}(v||(v={})),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"}(m||(m={}));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 n=0,a=0;if(T!==R){const E=T-R;switch(a=o>.5?E/(2-T-R):E/(T+R),T){case r:n=(A-_)/E+(A<_?6:0);break;case A:n=(_-r)/E+2;break;case _:n=(r-A)/E+4}n/=6}const I=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=I,D=I,l=I;if(0!==a){const E=I<.5?I*(1+a):I+a-I*a,t=2*I-E;s=i(t,E,n+1/3),D=i(t,E,n),l=i(t,E,n-1/3)}const N=E=>Math.round(255*E).toString(16).padStart(2,"0");return`#${N(s)}${N(D)}${N(l)}`},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=O,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,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))||{}},exports.getAddonTitle=(E,t)=>{var e,r,A;return(null===(A=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))||void 0===A?void 0:A.title)||""},exports.getAddonTranslation=(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))||{}},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(v.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(({translations:E})=>{var t;return(null===(t=E.find(E=>E.language===e))||void 0===t?void 0:t.title)||""}).filter(Boolean).join(", ");{const A=(E||[]).find(({id:E})=>E===t);return(null===(r=null==A?void 0:A.translations.find(E=>E.language===e))||void 0===r?void 0:r.title)||""}},exports.getOrderErrorMessages=E=>{switch(E){case"customer":return c.ADDRESS_IS_EMPTY;case"tableId":return c.TABLE_NOT_SELECTED;case"items":return c.EMPTY_ITEMS;case"branchId":return c.BRANCH_NOT_SELECTED;default:return c.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),n=R*(T/100),a=o+n;return{totalGross:a*_,totalNet:o*_,totalTax:n*_,itemGrossPrice:a,itemNetPrice:o,itemTax:n}},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 m.OWNER:return[v.ALL];case m.GENERAL_MANAGER:return[v.VIEW_BUSINESS,v.UPDATE_BUSINESS,v.VIEW_ORDERS,v.UPDATE_ORDER,v.CREATE_ORDER,v.VIEW_QR_MENU,v.VIEW_QR_CODES,v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.UPDATE_MENU_ITEM,v.CREATE_MENU_ITEM,v.DELETE_MENU_ITEM,v.VIEW_CATEGORIES,v.UPDATE_CATEGORY,v.CREATE_CATEGORY,v.DELETE_CATEGORY,v.VIEW_ADDONS,v.UPDATE_ADDON,v.CREATE_ADDON,v.DELETE_ADDON,v.VIEW_TABLES,v.UPDATE_TABLE,v.CREATE_TABLE,v.DELETE_TABLE,v.VIEW_BRANCHES,v.UPDATE_BRANCH,v.CREATE_BRANCH,v.DELETE_BRANCH,v.VIEW_EMPLOYEES,v.UPDATE_EMPLOYEE,v.CREATE_EMPLOYEE,v.DELETE_EMPLOYEE,v.VIEW_ANALYTICS,v.VIEW_SALES_REPORTS,v.VIEW_SUBSCRIPTION,v.CREATE_QR_CODE,v.DELETE_QR_CODE,v.AI_ASSISTANT];case m.BRANCH_MANAGER:return[v.VIEW_BUSINESS,v.VIEW_ORDERS,v.UPDATE_ORDER,v.CREATE_ORDER,v.VIEW_QR_MENU,v.VIEW_QR_CODES,v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.UPDATE_MENU_ITEM,v.CREATE_MENU_ITEM,v.DELETE_MENU_ITEM,v.VIEW_CATEGORIES,v.UPDATE_CATEGORY,v.CREATE_CATEGORY,v.DELETE_CATEGORY,v.VIEW_ADDONS,v.UPDATE_ADDON,v.CREATE_ADDON,v.DELETE_ADDON,v.VIEW_TABLES,v.UPDATE_TABLE,v.CREATE_TABLE,v.DELETE_TABLE,v.VIEW_EMPLOYEES,v.UPDATE_EMPLOYEE,v.VIEW_ANALYTICS,v.VIEW_SALES_REPORTS,v.CREATE_QR_CODE,v.DELETE_QR_CODE,v.AI_ASSISTANT];case m.CHEF:return[v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.UPDATE_MENU_ITEM,v.VIEW_CATEGORIES,v.UPDATE_CATEGORY,v.VIEW_ADDONS,v.UPDATE_ADDON,v.VIEW_ORDERS,v.UPDATE_ORDER];case m.SOUS_CHEF:return[v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.VIEW_CATEGORIES,v.VIEW_ADDONS,v.VIEW_ORDERS,v.UPDATE_ORDER];case m.PASTRY_CHEF:return[v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.UPDATE_MENU_ITEM,v.VIEW_ORDERS,v.UPDATE_ORDER];case m.LINE_COOK:case m.PREP_COOK:case m.KITCHEN_ASSISTANT:return[v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.VIEW_ORDERS,v.UPDATE_ORDER];case m.HEAD_WAITER:return[v.VIEW_ORDERS,v.CREATE_ORDER,v.UPDATE_ORDER,v.VIEW_TABLES,v.UPDATE_TABLE_STATUS,v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.VIEW_CATEGORIES,v.VIEW_ADDONS,v.VIEW_QR_MENU,v.VIEW_QR_CODES];case m.WAITER:return[v.VIEW_ORDERS,v.CREATE_ORDER,v.UPDATE_ORDER,v.VIEW_TABLES,v.UPDATE_TABLE_STATUS,v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.VIEW_CATEGORIES,v.VIEW_ADDONS];case m.RUNNER:return[v.VIEW_ORDERS,v.UPDATE_ORDER];case m.BARISTA:case m.BARTENDER:case m.SOMMELIER:case m.ROOM_SERVICE_STAFF:return[v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.VIEW_ORDERS,v.CREATE_ORDER,v.UPDATE_ORDER];case m.ACCOUNTANT:return[v.VIEW_ANALYTICS,v.VIEW_SALES_REPORTS,v.VIEW_SUBSCRIPTION];case m.DELIVERY_DRIVER:return[v.VIEW_ORDERS,v.UPDATE_ORDER];case m.INVENTORY_MANAGER:return[v.VIEW_CATEGORIES,v.UPDATE_CATEGORY,v.CREATE_CATEGORY,v.DELETE_CATEGORY,v.VIEW_ADDONS,v.UPDATE_ADDON,v.CREATE_ADDON,v.DELETE_ADDON,v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.UPDATE_MENU_ITEM,v.CREATE_MENU_ITEM,v.DELETE_MENU_ITEM,v.VIEW_PURCHASES,v.CREATE_PURCHASE,v.UPDATE_PURCHASE,v.DELETE_PURCHASE,v.VIEW_INVENTORY,v.VIEW_INVENTORY_PRODUCTS,v.CREATE_INVENTORY_PRODUCT,v.UPDATE_INVENTORY_PRODUCT,v.DELETE_INVENTORY_PRODUCT,v.VIEW_PURCHASE_DETAIL,v.VIEW_BRANCH_BALANCE,v.UPDATE_PRODUCT_INGREDIENTS,v.DELETE_PRODUCT_INGREDIENTS];case m.PURCHASING_MANAGER:return[v.VIEW_MENU,v.VIEW_MENU_ITEMS,v.VIEW_CATEGORIES,v.CREATE_CATEGORY,v.UPDATE_CATEGORY,v.VIEW_ADDONS,v.CREATE_ADDON,v.UPDATE_ADDON];case m.WAREHOUSE_STAFF:return[v.VIEW_CATEGORIES,v.VIEW_ADDONS,v.VIEW_MENU,v.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}=I({product:t,variantId:e,quantity:r,selectedAddons:T,noVat:R});return{totalPrice:o,formattedTotalPrice:E.priceFormatter(o,A,_)}},exports.getProductOrderRawPrice=I,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,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))||{}},exports.getProductVariant=o,exports.getProductVariantPrice=({variantId:t,currency:e="USD",language:r="en",product:A,quantity:_=1})=>{const T=a(t,A,_);return{totalPrice:T,formattedTotalPrice:E.priceFormatter(T,e,r)}},exports.getProductVariantRawPrice=a,exports.getProductVariantTranslation=(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))||{}},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=n,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 d.OTP:A&&E.checkIsValidEmail(A)||(r.email="Invalid Email Address"),_&&6===_.length||(r.otp="Invalid OTP");break;case d.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)};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|