!function(){var e={isPopulated:!1,display:function(){this.isPopulated||(this.drawRevenueCard(),this.drawRevenueGraph(),this.drawInventoryCheckCard(),this.drawPopularCard(),this.isPopulated=!0)},drawRevenueCard:function(){let e=new Date,t=new Date(e.getFullYear(),e.getMonth(),1),n=new Date(e.getFullYear(),e.getMonth()-1,1),i=new Date((new Date).setMonth(e.getMonth()-1));const r=merchant.getRevenue(t),s=merchant.getRevenue(n,i);document.getElementById("revenue").innerText="$"+r.toFixed(2);let l=(r-s)/s*100,a="";a=l>=0?"/shared/images/upArrow.png":"/shared/images/downArrow.png",document.querySelector("#revenueChange p").innerText=Math.abs(l).toFixed(2)+"% vs last month",document.querySelector("#revenueChange img").src=a},drawRevenueGraph:function(){let e=new Date;e.setMonth(e.getMonth()-1);let t=[],n=[],i=0;const r=merchant.getTransactions(e);let s=r.length>0?r[0].date:void 0;for(let d=0;d0;)n.removeChild(n.firstChild);for(let r=0;r{s.value--,s.changed=!0},s.value=l.quantity.toFixed(2),e.children[2].innerText=l.ingredient.unit.toUpperCase(),e.children[1].children[2].onclick=()=>{s.value++,s.changed=!0},s.onchange=()=>{s.changed=!0},n.appendChild(e)}document.getElementById("inventoryCheck").onclick=()=>{this.submitInventoryCheck()}},drawPopularCard:function(){let e=new Date;e.setDate(1);const t=merchant.getIngredientsSold(e);if(!1!==t){t.sort((e,t)=>e.quantityt.quantity?-1:0);let e=[],n=[],i=[];for(let l=t.length<5?t.length-1:4;l>=0;l--){const r=t[l].ingredient.name,s=t[l].quantity,a=t[l].ingredient.unit;e.push(t[l].quantity),n.push(`${r}: ${s.toFixed(2)} ${a.toUpperCase()}`),0===l?i.push("rgb(255, 99, 107"):i.push("rgb(179, 191, 209")}let r={x:e,type:"bar",orientation:"h",text:n,textposition:"auto",hoverinfo:"none",marker:{color:i}},s={title:{text:"MOST POPULAR INGREDIENTS"},xaxis:{zeroline:!1,title:"QUANTITY"},yaxis:{showticklabels:!1}};screen.width<1400&&(s.margin={l:10,r:10,t:80,b:40}),Plotly.newPlot("popularIngredientsCard",[r],s)}else{document.getElementById("popularCanvas").style.display="none";let e=document.createElement("p");e.innerText="N/A",e.classList="notice",document.getElementById("popularIngredientsCard").appendChild(e)}},submitInventoryCheck:function(){let e=document.querySelectorAll("#inventoryCheckCard li"),t=[];for(let n=0;n=0))return void controller.createBanner("CANNOT HAVE NEGATIVE INGREDIENTS","error");if(!0===e[n].children[1].children[1].changed){let i=e[n].ingredient;t.push({id:i.ingredient.id,quantity:e[n].children[1].children[1].value}),e[n].children[1].children[1].changed=!1}}if(t.length>0){let e=document.getElementById("loaderContainer");e.style.display="flex",fetch("/merchant/ingredients/update",{method:"PUT",headers:{"Content-Type":"application/json;charset=utf-8"},body:JSON.stringify(t)}).then(e=>e.json()).then(e=>{if("string"==typeof e)controller.createBanner(e,"error");else{for(let t=0;t{controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE","error")}).finally(()=>{e.style.display="none"})}}};var t={isPopulated:!1,ingredients:[],display:function(){this.isPopulated||(document.getElementById("ingredientSearch").oninput=()=>{this.search()},this.populateByProperty(),this.isPopulated=!0)},populateByProperty:function(){let e;e=merchant.categorizeIngredients();let t=document.getElementById("categoryList"),n=document.getElementById("categoryDiv").content.children[0],i=document.getElementById("ingredient").content.children[0];for(this.ingredients=[];t.children.length>0;)t.removeChild(t.firstChild);for(let r=0;r{this.toggleCategory(s.children[1],s.children[0].children[1])},s.children[1].style.display="none",t.appendChild(s);for(let t=0;t{controller.openSidebar("ingredientDetails",n),l.classList.add("active")},l._name=n.ingredient.name.toLowerCase(),l._unit=n.ingredient.unit.toLowerCase(),l.children[2].innerText=`${n.quantity.toFixed(2)} ${n.ingredient.unit.toUpperCase()}`,s.children[1].appendChild(l),this.ingredients.push(l)}}},displayIngredientsOnly:function(e){let t=document.getElementById("categoryList");for(;t.children.length>0;)t.removeChild(t.firstChild);for(let n=0;n',e.style.display="flex"):"flex"===e.style.display&&(t.innerHTML='',e.style.display="none")},search:function(){let e=document.getElementById("ingredientSearch").value.toLowerCase();if(""===e)return void this.populateByProperty();let t=[];for(let n=0;n{this.posUpdate(e)}),document.getElementById("recipeSearch").oninput=()=>{this.search()},this.populateRecipes(),this.isPopulated=!0)},populateRecipes:function(){let e=document.getElementById("recipeList"),t=document.getElementById("recipe").content.children[0];for(this.recipeDivList=[];e.children.length>0;)e.removeChild(e.firstChild);for(let n=0;n{controller.openSidebar("recipeDetails",merchant.recipes[n]),i.classList.add("active")},i._name=merchant.recipes[n].name,e.appendChild(i),i.children[0].innerText=merchant.recipes[n].name,i.children[1].innerText="$"+merchant.recipes[n].price.toFixed(2),this.recipeDivList.push(i)}},search:function(){let e=document.getElementById("recipeSearch").value.toLowerCase(),t=document.getElementById("recipeList"),n=[];for(let i=0;i0;)t.removeChild(t.firstChild);for(let i=0;ie.json()).then(t=>{if("string"==typeof t)controller.createBanner(t,"error");else{for(let n=0;n{controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE","error")}).finally(()=>{t.style.display="none"})}};var i={isPopulated:!1,ingredient:void 0,recipe:void 0,transactionsByDate:[],display:function(e){if(!this.isPopulated){document.getElementById("analRecipeContent").style.display="none";let t=new Date,n=new Date(t.getFullYear(),t.getMonth()-1,t.getDate());document.getElementById("analStartDate").valueAsDate=n,document.getElementById("analEndDate").valueAsDate=t;let i=document.getElementById("analSlider");i.onclick=()=>{this.switchDisplay()},i.checked=!1,document.getElementById("analDateBtn").onclick=()=>{this.newDates(e)},this.populateButtons(),merchant.ingredients.length>0&&(this.ingredient=merchant.ingredients[0].ingredient),merchant.recipes.length>0&&(this.recipe=merchant.recipes[0]),this.newDates(e),this.isPopulated=!0}},populateButtons:function(){let e=document.getElementById("analIngredientList"),t=document.getElementById("analRecipeList");for(;e.children.length>0;)e.removeChild(e.firstChild);for(let n=0;n{this.ingredient=merchant.ingredients[n].ingredient,this.displayIngredient()},e.appendChild(t)}for(;t.children.length>0;)t.removeChild(t.firstChild);for(let n=0;n{this.recipe=merchant.recipes[n],this.displayRecipe()},t.appendChild(e)}},getData:function(e,t,n){let i={from:e,to:t,recipes:[]},r=document.getElementById("loaderContainer");return r.style.display="flex",fetch("/transaction",{method:"post",headers:{"Content-Type":"application/json;charset=utf-8"},body:JSON.stringify(i)}).then(e=>e.json()).then(i=>{if("string"==typeof i)controller.createBanner(i,"error");else{this.transactionsByDate=[],i.reverse();let r=new Date(e.getTime());r.setHours(0,0,0,0);let s=new Date(e.getTime());s.setDate(s.getDate()+1),s.setHours(0,0,0,0);let l=0;for(;r<=t;){let e=[];for(;l{controller.createBanner("UNABLE TO UPDATE THE PAGE","error")}).finally(()=>{r.style.display="none"})},displayIngredient:function(){if(void 0===this.ingredient||0===this.transactionsByDate.length)return;let e=[],t=[];for(let c=0;cl&&(l=t[c]),a+=t[c];document.getElementById("analMinUse").innerText=`${s.toFixed(2)} ${this.ingredient.unit.toUpperCase()}`,document.getElementById("analAvgUse").innerText=`${(a/t.length).toFixed(2)} ${this.ingredient.unit.toUpperCase()}`,document.getElementById("analMaxUse").innerText=`${l.toFixed(2)} ${this.ingredient.unit.toUpperCase()}`;let d=[0,0,0,0,0,0,0],o=[0,0,0,0,0,0,0];for(let c=0;c{controller.openSidebar("orderFilter")}),document.getElementById("newOrderBtn").addEventListener("click",()=>{controller.openSidebar("newOrder")}),document.getElementById("orderCalcBtn").addEventListener("click",()=>{controller.openSidebar("orderCalculator")});let e=document.getElementById("orderList"),t=document.getElementById("order").content.children[0];for(;e.children.length>0;)e.removeChild(e.firstChild);for(let n=0;n{controller.openSidebar("orderDetails",merchant.orders[n]),i.classList.add("active")},e.appendChild(i)}},getOrders:function(e){let t=document.getElementById("loaderContainer");t.style.display="flex";let n=new Date,i=new Date(n.getFullYear(),n.getMonth(),n.getDate()-30);i.setHours(0,0,0,0);let r={to:n.toUTCString(),from:i.toUTCString(),ingredients:[]};return fetch("/orders/get",{method:"post",body:JSON.stringify(r),headers:{"Content-Type":"application/json;charset=utf-8"}}).then(e=>e.json()).then(t=>{if("string"!=typeof t){let n=[];for(let i=0;i{controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE","error")}).finally(()=>{t.style.display="none"})}};var s={transactions:[],display:function(){document.getElementById("filterTransactionsButton").onclick=()=>{controller.openSidebar("transactionFilter")},document.getElementById("newTransactionButton").onclick=()=>{controller.openSidebar("newTransaction")},this.populateTransactions(this.transactions),this.isPopulated=!0},populateTransactions:function(e){let t=document.getElementById("transactionsList"),n=document.getElementById("transaction").content.children[0];for(;t.children.length>0;)t.removeChild(t.firstChild);let i=0;for(;i{controller.openSidebar("transactionDetails",s),r.classList.add("active")},t.appendChild(r);let l=0,a=0;for(let t=0;t{controller.openSidebar("editIngredient",e)},document.getElementById("removeIngBtn").onclick=()=>{this.remove(e)},document.getElementById("ingredientDetailsCategory").innerText=e.ingredient.category,document.getElementById("ingredientDetailsName").innerText=e.ingredient.name,document.getElementById("ingredientStock").innerText=e.getQuantityDisplay();let t=[],n=new Date;for(let d=1;d<31;d++){let i=new Date(n.getFullYear(),n.getMonth(),n.getDate()-d),r=new Date(n.getFullYear(),n.getMonth(),n.getDate()-d-1);t.push(merchant.getSingleIngredientSold(e,r,i))}let i=0;for(let d=0;d0;)s.removeChild(s.firstChild);for(let d=0;d{controller.openStrand("recipeBook"),controller.openSidebar("recipeDetails",a[d])},e.classList.add("choosable"),s.appendChild(e)}},remove:function(e){for(let n=0;ne.json()).then(t=>{"string"==typeof t?controller.createBanner(t,"error"):(merchant.removeIngredient(e),controller.openStrand("ingredients"),controller.createBanner("INGREDIENT REMOVED","success"))}).catch(e=>{controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE","error")}).finally(()=>{t.style.display="none"})}};var a={display:function(e){const t=document.getElementById("unitSelector");document.getElementById("newIngName").value="",document.getElementById("newIngCategory").value="",document.getElementById("newIngQuantity").value=0,document.getElementById("bottleSizeLabel").style.display="none",t.value="g",t.onchange=()=>{this.unitChange()},document.getElementById("submitNewIng").onclick=()=>{this.submit(e)},document.getElementById("ingredientFileUpload").addEventListener("click",()=>{controller.openModal("ingredientSpreadsheet")})},unitChange:function(){const e=document.getElementById("unitSelector"),t=document.getElementById("bottleSizeLabel");"bottle"===e.value?t.style.display="block":t.style.display="none"},submit:function(){let e=document.getElementById("unitSelector"),t=document.querySelectorAll("#unitSelector option");const n=parseFloat(document.getElementById("newIngQuantity").value);let i=e.value,r={ingredient:{name:document.getElementById("newIngName").value,category:document.getElementById("newIngCategory").value,unitType:t[e.selectedIndex].getAttribute("type")},quantity:n,defaultUnit:i};"bottle"===i&&(r.ingredient.unitType=document.getElementById("bottleUnits").value,r.ingredient.unitSize=parseFloat(document.getElementById("bottleSize").value));let s=document.getElementById("loaderContainer");s.style.display="flex",fetch("/ingredients/create",{method:"POST",headers:{"Content-Type":"application/json;charset=utf-8"},body:JSON.stringify(r)}).then(e=>e.json()).then(e=>{"string"==typeof e?controller.createBanner(e,"error"):(merchant.addIngredient(e.ingredient,e.quantity,e.defaultUnit),controller.openStrand("ingredients"),controller.createBanner("INGREDIENT CREATED","success"))}).catch(e=>{controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE","error")}).finally(()=>{s.style.display="none"})},submitSpreadsheet:function(){event.preventDefault(),controller.closeModal();const e=document.getElementById("spreadsheetInput").files[0];let t=new FormData;t.append("ingredients",e);let n=document.getElementById("loaderContainer");n.style.display="flex",fetch("/ingredients/create/spreadsheet",{method:"post",body:t}).then(e=>e.json()).then(e=>{if("string"==typeof e)controller.createBanner(e,"error");else{for(let t=0;t{controller.createBanner("SOMETHING WENT WRONG. TRY REFRESHING THE PAGE","error")}).finally(()=>{n.style.display="none"})}};var d={display:function(e){let t=document.getElementById("unitButtons"),n=document.getElementById("editIngQuantityLabel"),i=document.getElementById("editSpecialLabel");for(;t.children.length>0;)t.removeChild(t.firstChild);if(document.getElementById("editIngTitle").innerText=e.ingredient.name,document.getElementById("editIngName").value=e.ingredient.name,document.getElementById("editIngCategory").value=e.ingredient.category,n.innerText=`CURRENT STOCK (${e.ingredient.unit.toUpperCase()})`,document.getElementById("editIngSubmit").onclick=()=>{this.submit(e)},"bottle"===e.ingredient.unit){i.style.display="flex",i.innerText=`BOTTLE SIZE (${e.ingredient.unitType.toUpperCase()}):`;let t=document.createElement("input");t.id="editIngSpecialSize",t.type="number",t.min="0",t.step="0.01",t.value=e.ingredient.unitSize.toFixed(2),i.appendChild(t)}else i.style.display="none";const r=e.ingredient.getPotentialUnits();for(let l=0;l{this.changeUnit(n)},t.appendChild(n),r[l]===e.ingredient.unitType&&n.classList.add("unitActive")}let s=document.createElement("input");s.id="editIngQuantity",s.type="number",s.min="0",s.step="0.01",s.value=e.quantity.toFixed(2),n.appendChild(s)},changeUnit(e){let t=document.getElementById("unitButtons");for(let n=0;ne.json()).then(e=>{"string"==typeof e?controller.createBanner(e,"error"):(merchant.removeIngredient(merchant.getIngredient(e.ingredient._id)),merchant.addIngredient(e.ingredient,e.quantity,e.unit),controller.openStrand("ingredients"),controller.createBanner("INGREDIENT UPDATED","success"))}).catch(e=>{controller.createBanner("SOMETHING WENT WRONG, PLEASE REFRESH THE PAGE","error")}).finally(()=>{r.style.display="none"})}};var o={display:function(){document.getElementById("sidebarDiv").classList.add("sidebarWide"),document.getElementById("newOrderIngredientList").style.display="flex",document.getElementById("orderFileUpload").addEventListener("click",()=>{controller.openModal("orderSpreadsheet")});let e=document.getElementById("selectedIngredientList");for(;e.children.length>0;)e.removeChild(e.firstChild);let t=document.getElementById("newOrderIngredients");for(;t.children.length>0;)t.removeChild(t.firstChild);for(let n=0;n{this.addIngredient(merchant.ingredients[n],e)},t.appendChild(e)}document.getElementById("submitNewOrder").onclick=()=>{this.submit()}},addIngredient:function(e,t){t.style.display="none";let n=document.getElementById("selectedIngredient").content.children[0].cloneNode(!0);n.ingredient=e,n.children[0].children[1].onclick=()=>{this.removeIngredient(n,t)},n.children[0].children[0].innerText=`${e.ingredient.name} (${e.ingredient.unit.toUpperCase()})`,document.getElementById("selectedIngredientList").appendChild(n)},removeIngredient:function(e,t){e.parentElement.removeChild(e),t.style.display="block"},submit:function(){let e=document.getElementById("newOrderDate").valueAsDate,t=100*document.getElementById("orderTaxes").value,n=100*document.getElementById("orderFees").value,i=document.getElementById("selectedIngredientList").children;if(null===e)return void controller.createBanner("DATE IS REQUIRED FOR ORDERS","error");e.setHours(0,0,0,0);let r={name:document.getElementById("newOrderName").value,date:e,taxes:t,fees:n,ingredients:[]};for(let l=0;le.json()).then(e=>{"string"==typeof e?controller.createBanner(e,"error"):(merchant.addOrder(e,!0),controller.openStrand("orders",merchant.orders),controller.createBanner("NEW ORDER CREATED","success"))}).catch(e=>{controller.createBanner("SOMETHING WENT WRONG, PLEASE REFRESH THE PAGE","error")}).finally(()=>{s.style.display="none"})},convertPrice:function(e,t){switch(e.unit){case"g":return t;case"kg":return t/1e3;case"oz":return t/28.3495;case"lb":return t/453.5924;case"ml":return 1e3*t;case"l":return t;case"tsp":return 202.8842*t;case"tbsp":return 67.6278*t;case"ozfl":return 33.8141*t;case"cup":return 4.1667*t;case"pt":return 2.1134*t;case"qt":return 1.0567*t;case"gal":return t/3.7854;case"mm":return 1e3*t;case"cm":return 100*t;case"m":return t;case"in":return 39.3701*t;case"ft":return 3.2808*t;default:return t}},submitSpreadsheet:function(){event.preventDefault(),controller.closeModal();const e=document.getElementById("spreadsheetInput").files[0];let t=new FormData;t.append("orders",e),t.append("timeOffset",(new Date).getTimezoneOffset());let n=document.getElementById("loaderContainer");n.style.display="flex",fetch("/orders/create/spreadsheet",{method:"post",body:t}).then(e=>e.json()).then(e=>{"string"==typeof e?controller.createBanner(e,"error"):(merchant.addOrder(e,!0),controller.createBanner("ORDER CREATED AND INGREDIENTS UPDATED SUCCESSFULLY","success"),controller.openStrand("orders"))}).catch(e=>{controller.createBanner("UNABLE TO DISPLAY NEW ORDER. PLEASE REFRESH THE PAGE.","error")}).finally(()=>{n.style.display="none"})}};var c={display:function(e){document.getElementById("newRecipeName").value="",document.getElementById("newRecipePrice").value="",document.getElementById("ingredientCount").value=1;let t=merchant.categorizeIngredients(),n=document.getElementById("recipeInputIngredients");for(;n.children.length>0;)n.removeChild(n.firstChild);this.changeIngredientCount(t),document.getElementById("ingredientCount").onchange=()=>{this.changeIngredientCount(t)},document.getElementById("submitNewRecipe").onclick=()=>{this.submit(e)},document.getElementById("recipeFileUpload").onclick=()=>{controller.openModal("recipeSpreadsheet")}},changeIngredientCount:function(e){let t=document.getElementById("ingredientCount").value,n=document.getElementById("recipeInputIngredients"),i=document.getElementById("recipeInputIngredient").content.children[0],r=n.children.length;if(t>r){let s=t-r;for(let t=0;te.json()).then(e=>{if("string"==typeof e)controller.createBanner(e,"error");else{let t=[];for(let n=0;n{controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE","error")}).finally(()=>{i.style.display="none"})},submitSpreadsheet:function(){event.preventDefault(),controller.closeModal();const e=document.getElementById("spreadsheetInput").files[0];let t=new FormData;t.append("recipes",e);let n=document.getElementById("loaderContainer");n.style.display="flex",fetch("/recipes/create/spreadsheet",{method:"post",body:t}).then(e=>e.json()).then(e=>{if("string"==typeof e)controller.createBanner(e,"error");else{for(let t=0;t{controller.createBanner("UNABLE TO DISPLAY NEW RECIPES. PLEASE REFRESH THE PAGE","error")}).finally(()=>{n.style.display="none"})}};var u={display:function(e){let t=document.getElementById("editRecipeName");"none"===merchant.pos?t.value=e.name:(document.getElementById("editRecipeNoName").innertext=e.name,t.parentNode.style.display="none");let n=document.getElementById("editRecipeIngList");for(;n.children.length>0;)n.removeChild(n.firstChild);let i=document.getElementById("editRecipeIng").content.children[0];for(let r=0;r{t.parentNode.removeChild(t)},t.children[1].innerText=e.ingredients[r].ingredient.getNameAndUnit(),t.children[2].style.display="none",t.children[3].value=e.ingredients[r].quantity,t.ingredient=e.ingredients[r],n.appendChild(t)}document.getElementById("addRecIng").onclick=()=>{this.newIngredient()},document.getElementById("editRecipePrice").value=e.price,document.getElementById("editRecipeSubmit").onclick=()=>{this.submit(e)},document.getElementById("editRecipeCancel").onclick=()=>{controller.openSidebar("recipeDetails",e)}},newIngredient:function(){let e=document.getElementById("editRecipeIngList"),t=document.getElementById("editRecipeIng").content.children[0].cloneNode(!0);t.children[0].onclick=()=>{t.parentNode.removeChild(t)},t.children[1].style.display="none",t.children[3].value="0.00";let n=merchant.categorizeIngredients();for(let i=0;ie.json()).then(e=>{"string"==typeof e?controller.createBanner(e,"error"):(merchant.updateRecipe(e),controller.openStrand("recipeBook"),controller.createBanner("RECIPE UPDATED","success"))}).catch(e=>{controller.createBanner("SOMETHING WENT WRONG, PLEASE REFRESH THE PAGE","error")}).finally(()=>{i.style.display="none"})}};var h={display:function(){let e=document.getElementById("newTransactionRecipes"),t=document.getElementById("createTransaction").content.children[0];for(document.getElementById("transactionFileUpload").addEventListener("click",()=>{controller.openModal("transactionSpreadsheet")});e.children.length>0;)e.removeChild(e.firstChild);for(let n=0;n{this.submit()}},submit:function(){let e=document.getElementById("newTransactionRecipes"),t=document.getElementById("newTransactionDate").valueAsDate;if(null===t)return void controller.createBanner("DATE IS REQUIRED FOR TRANSACTIONS","error");t.setHours(0,0,0,0);let n={date:t,recipes:[],ingredientUpdates:{}};for(let i=0;i0){n.recipes.push({recipe:r.id,quantity:t});for(let e=0;e0){let e=document.getElementById("loaderContainer");e.style.display="flex",fetch("/transaction/create",{method:"post",headers:{"Content-Type":"application/json;charset=utf-8"},body:JSON.stringify(n)}).then(e=>e.json()).then(e=>{"string"==typeof e?controller.createBanner(e,"error"):(merchant.addTransaction(e),controller.updateAnalytics(),controller.openStrand("transactions",merchant.getTransactions()),controller.createBanner("TRANSACTION CREATED","success"))}).catch(e=>{controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE","error")}).finally(()=>{e.style.display="none"})}},submitSpreadsheet:function(){event.preventDefault(),controller.closeModal();const e=document.getElementById("spreadsheetInput").files[0];let t=new FormData;t.append("transactions",e),t.append("timeOffset",(new Date).getTimezoneOffset());let n=document.getElementById("loaderContainer");n.style.display="flex",fetch("/transactions/create/spreadsheet",{method:"post",body:t}).then(e=>e.json()).then(e=>{if("string"==typeof e)controller.createBanner(e,"error");else{for(let t=0;t{controller.createBanner("UNABLE TO DISPLAY NEW TRANSACTIONS. PLEASE REFRESH THE PAGE","error")}).finally(()=>{n.style.display="none"})}};var g={display:function(e){document.getElementById("removeOrderBtn").onclick=()=>{this.remove(e)},document.getElementById("orderDetailName").innerText=e.name,document.getElementById("orderDetailDate").innerText=e.date.toLocaleDateString("en-US"),document.getElementById("orderDetailTax").innerText="$"+e.taxes.toFixed(2),document.getElementById("orderDetailFee").innerText="$"+e.fees.toFixed(2);let t=document.getElementById("orderIngredients");for(;t.children.length>0;)t.removeChild(t.firstChild);let n=document.getElementById("orderIngredient").content.children[0];for(let i=0;i{controller.openStrand("ingredients"),controller.openSidebar("ingredientDetails",merchant.getIngredient(e.ingredients[i].ingredient.id))},r.children[1].innerText=`${e.ingredients[i].quantity.toFixed(2)} ${s.unit.toUpperCase()} X $${e.ingredients[i].pricePerUnit.toFixed(2)}`,t.appendChild(r)}document.getElementById("orderDetailTotal").innerText="$"+e.getIngredientCost().toFixed(2),document.querySelector("#orderTotalPrice p").innerText="$"+e.getTotalCost().toFixed(2)},remove:function(e){let t=document.getElementById("loaderContainer");t.style.display="flex",fetch("/order/"+e.id,{method:"DELETE",headers:{"Content-Type":"application/json;charset=utf-8"}}).then(e=>e.json()).then(t=>{"string"==typeof t?controller.createBanner(t,"error"):(merchant.removeOrder(e),controller.openStrand("orders",merchant.orders),controller.createBanner("ORDER REMOVED","success"))}).catch(e=>{controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE","error")}).finally(()=>{t.style.display="none"})}};var p={display:function(e){let t=new Date,n=new Date(t.getFullYear(),t.getMonth(),t.getDate()-30),i=document.getElementById("orderFilterIngredients");for(document.getElementById("orderFilterDateFrom").valueAsDate=n,document.getElementById("orderFilterDateTo").valueAsDate=t;i.children.length>0;)i.removeChild(i.firstChild);for(let r=0;r{this.toggleActive(e)},i.appendChild(e);let t=document.createElement("p");t.innerText=merchant.ingredients[r].ingredient.name,e.appendChild(t)}document.getElementById("orderFilterSubmit").onclick=()=>{this.submit(e)}},toggleActive:function(e){e.classList.contains("active")?e.classList.remove("active"):e.classList.add("active")},submit:function(e){let t={from:document.getElementById("orderFilterDateFrom").valueAsDate,to:document.getElementById("orderFilterDateTo").valueAsDate,ingredients:[]};t.from.setHours(0,0,0,0),t.to.setHours(0,0,0,0);let n=document.getElementById("orderFilterIngredients").children;for(let r=0;re.json()).then(t=>{let n=[];if("string"==typeof t)controller.createBanner(t,"error");else if(0===t.length)controller.createBanner("NO ORDERS MATCH YOUR SEARCH","error");else for(let i=0;i{controller.createBanner("UNABLE TO DISPLAY THE ORDERS","error")}).finally(()=>{i.style.display="none"})}};var m={display:function(){let e=document.getElementById("calculatorItemsBody"),t=document.getElementById("calculatorItem").content.children[0],n=this.predict();for(;e.children.length>0;)e.removeChild(e.firstChild);for(let i=0;i{controller.openSidebar("editRecipe",e)},document.getElementById("recipeName").innerText=e.name,"none"===merchant.pos&&(document.getElementById("removeRecipeBtn").onclick=()=>{this.remove(e)});let t=document.getElementById("recipeIngredientList");for(;t.children.length>0;)t.removeChild(t.firstChild);let n=document.getElementById("recipeIngredient").content.children[0];for(let i=0;i{controller.openStrand("ingredients"),controller.openSidebar("ingredientDetails",merchant.getIngredient(e.ingredients[i].ingredient.id))},t.appendChild(r)}document.getElementById("recipePrice").children[1].innerText="$"+e.price.toFixed(2)},remove:function(e){let t=document.getElementById("loaderContainer");t.style.display="flex",fetch("/recipe/remove/"+e.id,{method:"delete"}).then(e=>e.json()).then(t=>{"string"==typeof t?controller.createBanner(t,"error"):(merchant.removeRecipe(e),controller.createBanner("RECIPE REMOVED","success"),controller.openStrand("recipeBook"))}).catch(e=>{controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE","error")}).finally(()=>{t.style.display="none"})}};var E={transaction:{},display:function(e){this.transaction=e;let t=document.getElementById("transactionRecipes"),n=document.getElementById("transactionRecipe").content.children[0],i=0,r=0;for(;t.children.length>0;)t.removeChild(t.firstChild);for(let l=0;l{controller.openStrand("recipeBook"),controller.openSidebar("recipeDetails",e.recipes[l].recipe)},t.appendChild(s),i+=e.recipes[l].quantity,r+=a}let s=`${["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"][e.date.getDay()]}, ${["January","February","March","April","May","June","July","August","September","October","November","December"][e.date.getMonth()]} ${e.date.getDate()}, ${e.date.getFullYear()}`;document.getElementById("transactionDate").innerText=s,document.getElementById("totalRecipes").innerText=i+" recipes",document.getElementById("totalPrice").innerText="$"+r.toFixed(2),"none"===merchant.pos&&(document.getElementById("removeTransBtn").onclick=()=>{this.remove()})},remove:function(){let e=document.getElementById("loaderContainer");e.style.display="flex",fetch("/transaction/"+this.transaction.id,{method:"delete",headers:{"Content-Type":"application/json;charset=utf-8"}}).then(e=>{"string"==typeof e?controller.createBanner(e,"error"):(merchant.removeTransaction(this.transaction),controller.updateAnalytics(),controller.openStrand("transactions",merchant.getTransactions()),controller.createBanner("TRANSACTION REMOVED","success"))}).catch(e=>{controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE","error")}).finally(()=>{e.style.display="none"})}};var f={display:function(e){let t=new Date,n=new Date(t);n.setMonth(t.getMonth()-1),document.getElementById("transFilterDateStart").valueAsDate=n,document.getElementById("transFilterDateEnd").valueAsDate=t;let i=document.getElementById("transFilterRecipeList");for(;i.children.length>0;)i.removeChild(i.firstChild);for(let r=0;r{this.toggleActive(e)},i.appendChild(e)}document.getElementById("transFilterSubmit").onclick=()=>{this.submit(e)}},toggleActive:function(e){e.classList.contains("active")?e.classList.remove("active"):e.classList.add("active")},submit:function(e){let t={from:document.getElementById("transFilterDateStart").valueAsDate,to:document.getElementById("transFilterDateEnd").valueAsDate,recipes:[]};if(t.from.setHours(0,0,0,0),t.to.setHours(0,0,0,0),t.startDate>=t.endDate)return void controller.createBanner("START DATE CANNOT BE AFTER END DATE","error");let n=document.getElementById("transFilterRecipeList").children;for(let r=0;re.json()).then(t=>{let n=[];if("string"==typeof t)controller.createBanner(t,"error");else if(0===t.length)controller.createBanner("NO TRANSACTIONS MATCH YOUR SEARCH","error");else for(let i=0;i{controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE","error")}).finally(()=>{i.style.display="none"})}};class I{constructor(e,t){this._quantity=t,this._ingredient=e}get ingredient(){return this._ingredient}get quantity(){switch(this._ingredient.unit){case"g":return this._quantity;case"kg":return this._quantity/1e3;case"oz":return this._quantity/28.3495;case"lb":return this._quantity/453.5924;case"ml":return 1e3*this._quantity;case"l":return this._quantity;case"tsp":return 202.8842*this._quantity;case"tbsp":return 67.6278*this._quantity;case"ozfl":return 33.8141*this._quantity;case"cup":return 4.1667*this._quantity;case"pt":return 2.1134*this._quantity;case"qt":return 1.0567*this._quantity;case"gal":return this._quantity/3.7854;case"mm":return 1e3*this._quantity;case"cm":return 100*this._quantity;case"m":return this._quantity;case"in":return 39.3701*this._quantity;case"ft":return 3.2808*this._quantity;default:return this._quantity}}updateQuantity(e){this._quantity+=this.convertToBase(e)}convertToBase(e){switch(this._ingredient.unit){case"g":return e;case"kg":return 1e3*e;case"oz":return 28.3495*e;case"lb":return 453.5924*e;case"ml":return e/1e3;case"l":return e;case"tsp":return e/202.8842;case"tbsp":return e/67.6278;case"ozfl":return e/33.8141;case"cup":return e/4.1667;case"pt":return e/2.1134;case"qt":return e/1.0567;case"gal":return 3.7854*e;case"mm":return e/1e3;case"cm":return e/100;case"m":return e;case"in":return e/39.3701;case"ft":return e/3.2808;default:return e}}getQuantityDisplay(){return`${this.quantity.toFixed(2)} ${this._ingredient.unit.toUpperCase()}`}}var B=class{constructor(e,t,n,i,r,s,l){this._id=e,this._name=t,this._category=n,this._unitType=i,this._unit=r,this._parent=s,this._unitSize=l}get id(){return this._id}get name(){return this._name}set name(e){this._name=e}get category(){return this._category}set category(e){this._category=e}get unitType(){return this._unitType}get unit(){return this._unit}set unit(e){this._unit=e}get parent(){return this._parent}get specialUnit(){return this._specialUnit}get unitSize(){switch(this._unit){case"g":return this._unitSize;case"kg":return this._unitSize/1e3;case"oz":return this._unitSize/28.3495;case"lb":return this._unitSize/453.5924;case"ml":return 1e3*this._unitSize;case"l":return this._unitSize;case"tsp":return 202.8842*this._unitSize;case"tbsp":return 67.6278*this._unitSize;case"ozfl":return 33.8141*this._unitSize;case"cup":return 4.1667*this._unitSize;case"pt":return 2.1134*this._unitSize;case"qt":return 1.0567*this._unitSize;case"gal":return this._unitSize/3.7854;case"mm":return 1e3*this._unitSize;case"cm":return 100*this._unitSize;case"m":return this._unitSize;case"in":return 39.3701*this._unitSize;case"ft":return 3.2808*this._unitSize;default:return this._unitSize}}set unitSize(e){if(e<0)return!1;this._unitSize=e}getBaseUnitSize(){return this._unitSize}getNameAndUnit(){return`${this._name} (${this._unit.toUpperCase()})`}getPotentialUnits(){let e=["g","kg","oz","lb"],t=["ml","l","tsp","tbsp","ozfl","cup","pt","qt","gal"],n=["mm","cm","m","in","ft"];return e.includes(this._unit)?e:t.includes(this._unit)?t:n.includes(this._unit)?n:"bottle"===this._unit?t:[]}};class T{constructor(e,t){if(t<0)return controller.createBanner("QUANTITY CANNOT BE A NEGATIVE NUMBER","error"),!1;this._ingredient=e,this._quantity=t}get ingredient(){return this._ingredient}get quantity(){switch(this._ingredient.unit){case"g":return this._quantity;case"kg":return this._quantity/1e3;case"oz":return this._quantity/28.3495;case"lb":return this._quantity/453.5924;case"ml":return 1e3*this._quantity;case"l":return this._quantity;case"tsp":return 202.8842*this._quantity;case"tbsp":return 67.6278*this._quantity;case"ozfl":return 33.8141*this._quantity;case"cup":return 4.1667*this._quantity;case"pt":return 2.1134*this._quantity;case"qt":return 1.0567*this._quantity;case"gal":return this._quantity/3.7854;case"mm":return 1e3*this._quantity;case"cm":return 100*this._quantity;case"m":return this._quantity;case"in":return 39.3701*this._quantity;case"ft":return 3.2808*this._quantity;default:return this._quantity}}set quantity(e){if(e<0)return controller.createBanner("QUANTITY CANNOT BE A NEGATIVE NUMBER","error"),!1;this_quantity=this.convertToBase(e)}getQuantityDisplay(){return`${this.quantity.toFixed(2)} ${this._ingredient.unit.toUpperCase()}`}convertToBase(e){switch(this._ingredient.unit){case"g":return e;case"kg":return 1e3*e;case"oz":return 28.3495*e;case"lb":return 453.5924*e;case"ml":return e/1e3;case"l":return e;case"tsp":return e/202.8842;case"tbsp":return e/67.6278;case"ozfl":return e/33.8141;case"cup":return e/4.1667;case"pt":return e/2.1134;case"qt":return e/1.0567;case"gal":return 3.7854*e;case"mm":return e/1e3;case"cm":return e/100;case"m":return e;case"in":return e/39.3701;case"ft":return e/3.2808;default:return e}}}var _=class{constructor(e,t,n,i,r){if(n<0)return controller.createBanner("PRICE CANNOT BE A NEGATIVE NUMBER","error"),!1;if(!this.isSanitaryString(t))return controller.createBanner("NAME CONTAINS ILLEGAL CHARACTERS","error"),!1;this._id=e,this._name=t,this._price=n,this._parent=r,this._ingredients=[];for(let s=0;s","$","{","}","(",")"];for(let n=0;nnew Date)return!1;for(let a=0;anew Date)return controller.createBanner("DATE CANNOT BE SET TO THE FUTURE","error"),!1;this._id=e,this._parent=i,this._date=t,this._recipes=[];for(let r=0;re.date>t.date?-1:1);let t={};for(let i=0;i=0;r--)if(this._transactions[r].date>=e){i=r;break}for(let r=0;r","$","{","}","(",")"];for(let n=0;nscreen.width||screen.width<1200)&&this.closeMenu()},openSidebar:function(e,n={}){switch(this.closeSidebar(),document.getElementById("sidebarDiv").classList="sidebar",document.getElementById(e).style.display="flex",e){case"ingredientDetails":l.display(n,t);break;case"newIngredient":a.display(B);break;case"editIngredient":d.display(n);break;case"recipeDetails":y.display(n);break;case"editRecipe":u.display(n);break;case"addRecipe":c.display(_);break;case"orderDetails":g.display(n);break;case"orderFilter":p.display(v);break;case"newOrder":o.display();break;case"orderCalculator":m.display();break;case"transactionDetails":E.display(n);break;case"transactionFilter":f.display(D);break;case"newTransaction":h.display(D)}(screen.height>screen.width||screen.width<1200)&&(document.querySelector(".contentBlock").style.display="none",document.getElementById("mobileMenuSelector").style.display="none",document.getElementById("sidebarCloser").style.display="block")},closeSidebar:function(){let e=document.getElementById("sidebarDiv");for(let t=0;tscreen.width||screen.width<1200)&&(document.querySelector(".contentBlock").style.display="flex",document.getElementById("mobileMenuSelector").style.display="block",document.getElementById("sidebarCloser").style.display="none")},openModal:function(e){document.getElementById("modal").style.display="flex",document.getElementById("modalClose").addEventListener("click",this.closeModal);let t={};switch(e){case"ingredientSpreadsheet":(t=document.getElementById("modalSpreadsheetUpload")).style.display="flex",document.getElementById("modalSpreadsheetTitle").innerText="ingredients",document.getElementById("spreadsheetDownload").href="/ingredients/download/spreadsheet",t.onsubmit=a.submitSpreadsheet;break;case"recipeSpreadsheet":(t=document.getElementById("modalSpreadsheetUpload")).style.display="flex",document.getElementById("modalSpreadsheetTitle").innerText="recipes",document.getElementById("spreadsheetDownload").href="/recipes/download/spreadsheet",t.onsubmit=c.submitSpreadsheet;break;case"orderSpreadsheet":(t=document.getElementById("modalSpreadsheetUpload")).style.display="flex",document.getElementById("modalSpreadsheetTitle").innerText="orders",document.getElementById("spreadsheetDownload").href="/orders/download/spreadsheet",t.onsubmit=o.submitSpreadsheet;break;case"transactionSpreadsheet":(t=document.getElementById("modalSpreadsheetUpload")).style.display="flex",document.getElementById("modalSpreadsheetTitle").innerText="transactions",document.getElementById("spreadsheetDownload").href="/transactions/download/spreadsheet",t.onsubmit=h.submitSpreadsheet}},closeModal:function(){let e=document.getElementById("modal"),t=document.getElementById("modalContent");for(let n=0;n{n.removeChild(i)},1e4);i.children[2].addEventListener("click",()=>{n.removeChild(i),clearTimeout(r)})},changeMenu:function(){let e=document.querySelector(".menu"),t=document.querySelectorAll(".menuButton");if(e.classList.contains("menuMinimized")){if(e.classList.contains("menuMinimized")){e.classList="menu";for(let e=0;e{document.getElementById("max").style.display="flex",document.getElementById("min").style.display="none"},150)}}else{e.classList="menu menuMinimized";for(let e=0;e{this.closeMenu()}},closeMenu:function(){document.getElementById("menu").style.display="none",document.querySelector(".contentBlock").style.display="flex",document.getElementById("mobileMenuSelector").onclick=()=>{this.openMenu()}},updateAnalytics:function(){i.isPopulated=!1}},document.getElementById("homeBtn").onclick=()=>{controller.openStrand("home")},document.getElementById("ingredientsBtn").onclick=()=>{controller.openStrand("ingredients")},document.getElementById("recipeBookBtn").onclick=()=>{controller.openStrand("recipeBook")},document.getElementById("analyticsBtn").onclick=()=>{controller.openStrand("analytics")},document.getElementById("ordersBtn").onclick=async()=>{0===merchant.orders.length&&merchant.setOrders(await r.getOrders(v)),controller.openStrand("orders",merchant.orders)},document.getElementById("transactionsBtn").onclick=()=>{controller.openStrand("transactions",merchant.getTransactions())},controller.openStrand("home")}();