const monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; //create order date (will be created in UTC as milliseconds) let orderDate = new Date(); let orderDateTimeInMs = orderDate.getTime(); //access delivery hours, minutes and whether it is am or pm let hrs = event.newValue.hrs; let mins = event.newValue.mins; let ampm = event.newValue.hourFormat; //get timezoneOffset from user profile (channel) let timezoneOffset = context.getVariable('profile.timezoneOffset'); //determine max delivery time in milliseconds let orderDay = orderDate.getDate(); let orderMonth = monthNames[orderDate.getMonth()]; let orderYear = orderDate.getFullYear(); let maxDeliveryTimeInMilliseconds = (new Date(orderMonth + " " + orderYear + ", " + orderDay + " 8:30 pm")).getTime() + (timezoneOffset != null? timezoneOffset:0); //compose delivery date string from order date day, month, year and //the hours and min information passed through the TIME entity. This //avoids people ordering pizza e.g. for tomorrow or yesterday let deliveryDateString = monthNames[orderDate.getMonth()] + " " + orderDate.getFullYear() + ", " + orderDate.getDate() + " " + hrs + ":" + mins + " " + ampm; //delivery date should consider timezoneOffset if available let deliveryDateInMilliseconds = (new Date(deliveryDateString)).getTime() + (timezoneOffset != null? timezoneOffset:0); //hours and minutes cannot both be 0 if ((hrs == 0) && (mins == 0)) { let message = "Please enter a time. Pizzas are delivered the same day. Orders must be placed 60 minutes before delivery, but at the latest at 8:30 p.m."; context.addValidationError('DeliveryTime', message); return false; } //check if shop is closed for deliveries, which is for when order time plus pizza //creation time is later than max delivery time if ((orderDateTimeInMs + 3600000) > maxDeliveryTimeInMilliseconds) { let message = "Sorry, but I only accept orders until 8:30 p.m. All orders after 8.30 pm must be processed by an employee"; context.addMessage(message, true) context.cancel(); return false; } //delivery is for "pm" hours until 9:30 if (ampm.toLowerCase() === 'am') { let message = "Sorry, we only deliver from 12 pm to 9.30 pm. Orders must be received 60 minutes before delivery, that is, at 8:30 pm at the latest. Please choose another time."; context.addValidationError('DeliveryTime', message); return false; } //is delivery time in future? If it is not, raise validation error. if (deliveryDateInMilliseconds < orderDateTimeInMs) { let message = "The delivery time cannot be in the past. Please enter a time that is at least 60 minutes ahead of the current time."; context.addValidationError('DeliveryTime', message); return false; } //is requested delivery time outside delivery hours? if (deliveryDateInMilliseconds > maxDeliveryTimeInMilliseconds) { let message = "We deliver until 9:30 pm. Orders must be placed 60 minutes before delivery. Please try again."; context.addValidationError('DeliveryTime', message); return false; } //is delivery within 60 minutes? If so, ask user to change to later if (deliveryDateInMilliseconds < (orderDateTimeInMs + 3600000)) { let message = "Quality takes time. We need at least 60 minutes to create the pizza. Please provide a new delivery time"; context.addValidationError('DeliveryTime', message); return false; } return true;