{"version":3,"sources":["BookingBase.ts","BookByPlant.ts"],"names":["LM","Array","prototype","lastElement","this","length","Error","Direction","EmailStatus","nextDateDay","BookingBase","now","moment","tz","TZ","notExpiringRules","rules","JSON","parse","d","every","a","setOpenings","alt","$scope","data","selecteddate","Opening","format","selectedWD","minValidDate","clone","Closing","selectedtime","hours","$applyAsync","findTimeAfterFreeze","plantId","nowPlusFreeze","add","freezeBooking","todayWD","isBefore","max","genericHelper","findNextWDs","MAXDAYS","res","_a","sent","workDay","filter","wd","isDateAndOpenTime","nextWorkDay","isAfter","getFromLocalStorage","element","localStorage","getItem","fillFieldFromLocalStorage","saveFieldInLocalStorage","value","setItem","date","isBetween","isDateAndNotOpenTime","isBeforeOpenTime","isAfterOpenTime","isNotDate","dateNotOpeningAndBeforeFirstOpening","openings","some","o","isSame","getField","field","hasOwnProperty","angular","isString","toUpperCase","saveStep","step","email","selectedTruckType","notes","selectLapse","lapse","_i","allLapses","Selected","From","SortICodeNameOrder","sort","b","Order","MapSortICodeNameOrder","map","Code","trim","Name","GetD","_this","$http","post","PlantId","then","productGroupsValues","productGroups","pg","Value","Limit","truckTypes","trucks","destinations","tripTypes","customerCode","openingHour","TargetToLocal","Tz","closingHour","docksLimit","maxDocks","FreezeBooking","loadUnload","origLoadUnload","i","workflowEnabled","ActionType","name","loadUnloadEnabled","indexOf","LoadUnload","$","text","InvitationOnly","getCustomerPlant","docks","find","Id","hub_id","GetMultiplePreBook","prebookings","code","cust","values","_p","_o","obj","q","Json","utc","booking","datepart","isValid","tmp","pin","Pin","__assign","country","_b","trucktype","carrier","_c","refname","_d","external","_e","refnum","truckplate","_f","trailerplate","_g","sender","_h","phonenumber","_j","phone","receiver","_k","_l","note","privacySelectedValue","mindate","maxdate","products","_m","Type","type","TripType","triptype","Destination","destination","push","GetPreBook","ship","plant","shipref","freezingHours","compareFields","newValue","$uibModal","WizardHandler","FileUploader","min","limitDay","firstProposedSlot","Language","LangService","getLanguage","columnVisibilityError","skip","firstTitle","secondTitle","whInternalContactPhone","whInternalContactEmail","sameDaySlot","maxlimit","NaN","filteredLapses","attachments1Count","attachments2Count","attachments3Count","productsPreviewStrings","totQty","bookingFilePath","img","fileNotLoadedYet1","fileNotLoadedYet2","fileNotLoadedYet3","isNaN","isNumber","filePath","Math","random","toString","uploader1","uploader2","uploader3","confirmUpload","accordionGroup","existing","fromScratch","anchor","hideFromScratch","prebookingConfirmed","showAutocompleteBtn","newBookingError","removePrebooking","index","splice","init","bloppo","h","isMoment","isSameOrAfter","getBookingAvail","validateFn","loc","filterCode","loadingLapses","showLoading","actionWf","x","Load","Unload","BrainyHelper","calculateDuration","plantCode","p","PackageType","Quantity","DestinationCountry","DeliveryMethod","Action","None","duration","Average","effDuration","Expected","searchData","startOf","recheckRes","Forward","_","wizard","currentStep","wzTitle","ProductInfos","TruckType","response","next","canSave","saveBooking","err","console","log","open","templateUrl","windowClass","scope","extend","notExpiring","currentData","toDate","changeDayCheckResult","direction","recheckResults","startdate","isFirstRun","nextDay","errorMessage","$apply","blockSearch","manageRemainingDays","actualDate","remainingDays","passedMaxDate","passedMinDate","maxDate","maxDays","filtered","l","slice","MAXRESULTS","cutMinMaxDates","nextNonVisibleSlot","waitNext","Date","WarehouseInternalContactPhone","WarehouseInternalContactEmail","CutMinMaxDates","OpeningTime","MaxDocks","rows","Ships","d_1","s","s2m","RePlanned","ExpStartLoad","ExpEndLoad","Volume","slotDayLimits","U","filterSlotDayLimits","lims","apply","Days","cgWithAnyProd","cg","ProductCode","allShipsProdTypes","from","Set","flatMap","y","Items","z","Product_Code","productList","concat","volume","productCode","quantity","avail","filterComboGroups","To","lapsesFound","FindTimeLapses","invalid","ClosingTime","dockGroups","comboGroups","expectedVolume","MininumDelay","BondGate","reduce","cum","c","undefined","subtract","Backward","waitPrevious","isSameOrBefore","f","res_1","forEach","acts_1","origs_1","type_1","ShipmentTypes","OriginDestinations","Truck","ActivityType","toISOString","saf","delays","BookingTollerance","StartDate","EndDate","refreshSlots","__awaiter","lapseSelected","bookingCode","get","toJSON","selectedDateTime","alert","selectedTimeSlot","initialDateTime","StartDT","EndDT","gateCode","Carrier","PhoneNumber","Nation","CDN","Email","TruckPlate","TrailerPlate","Notes","Sender","Receiver","ReferenceName","External","FilePath","Recaptcha","recaptchaResponse","Prebookings","ShipmentCode","shipCode","UnlockCode","unlockCode","FirstProposedSlot","SelectedTimeSlot","shipment","document","getElementById","innerHTML","HtmlTemplate","formLink","FormLink","formLabel","FormLabel","downloadPdf","goTo","hubSR","UpdateShip","pId","dbId","window","location","parent","postMessage","stringify","validates2","validateTruckType","atleastOne","getElementsByClassName","validates3","prebooking","is_prebooked","prebookedstatus","is_privacy_checked","KEY_PRIVACY_LOCAL_STORAGE","privacy_version","lng_1","customPrivacy_1","customPrivacy","controller","set_privacy","chg","selectLanguage","language","reload","content","privacy_selected_value","localstorage_selected_value","isCustomPrivacy","privacyIt","privacyEn","privacyLinkIt","privacyLinkEn","cookieIt","cookieEn","cookieLinkIt","cookieLinkEn","gdprLink","cookieLink","backdrop","result","catch","navigation_wizard_enabled","validateValue","triggerQuantity","product","limit","getProductLimit","addProductRow","lu","checkScreensize","$resolve","parentScope","trip","isColumnVisible","item","OkBtn","elem","$close","controllerAs","resolve","size","editProductRow","removeRow","navigator","userAgent","match","link","createElement","href","linkId","attributes","setNamedItem","createAttribute","click","mandAttachments","group","attachField","mandatoryFieldsList","Workflow","Fields","FormName","Mandatory","Visible","PrintPDF","onAfterAddingAll","allowPdfDownload","upload","uploaderFiles","files","uploadSuccess","form","FormData","append","fileUploadError1","fileUploadError2","fileUploadError3","method","url","headers","Content-Type","findIndex","status","message","queue","_file","isInUploadingPhase1","file","isInUploadingPhase2","isInUploadingPhase3","deleteFile","fp","delete","btoa","removeFromQueue","fillFields","PrintElem","mywindow","write","title","close","focus","setTimeout","print","getUploadedPdf","pdfName","encodeURIComponent","checkConditions","sanitize","showTooltip","fieldName","Field","TooltipIT","TooltipEN","TooltipES","TooltipDE","TooltipFR","TooltipPL","TooltipRO","TooltipRU","showLabel","LabelIT","LabelEN","LabelES","LabelDE","LabelFR","LabelPL","LabelRO","LabelRU","showProductLabel","bookingFieldLabels","isVisible","isMandatory","isEditable","Editable","checkEmail","databaseId","emailValid","BlackList","Existing","$new","waitSecs","body","resend","sendEmail","findMultipleShipments","params","pathname","values_1","minDate","confirmPrebooking","findShipments","shipmentCode","getElementsByName","emails","okClose","isArray","i_1","emptyLapses","globalApp","directive","restrict","require","_1","_2","$select","$evalAsync","items","selected","val","BookByPlant","_super","BookByPlantController","__extends","showDanger","call","$window","$timeout","_this_1","isDisabledSelectFromExistingShipment","CUSTOMERID","PLANTCODE","style","display","paddingTop","emailRegex","css","checkHeaderColor","HEADERCOLOR","ParseLocation","hash","attr","ExternalCode","search","split","privacyStatement","createSignalRHub","addEventListener","event","loader_1","template","p_1","MoveFromUTCToLocal","plannedCheckIn","fatherShipment","sonShipment","shipmentCreator","address","truckType","truckPlate","trailerPlate","lastValidTime","vector","sapCode","firstValidTime","ceil","diff","exception","error","$watch","parsed","removeUndefined","replace","requires"],"mappings":"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","file":"plant.min.js","sourcesContent":["/// \r\n/// \r\ndeclare var recaptchaResponse: string;\r\ndeclare var APIURL: string;\r\ndeclare interface Array {\r\n /**\r\n * Get last element of Array\r\n * */\r\n lastElement(): T;\r\n}\r\n\r\nif (!Array.prototype.lastElement) {\r\n Array.prototype.lastElement = function () {\r\n if (!this.length)\r\n throw Error(\"Array is empty\");\r\n return this[this.length - 1];\r\n }\r\n}\r\n\r\ninterface JsonBooking extends IBookingData {\r\n mindate: moment.Moment,\r\n maxdate: moment.Moment,\r\n freezingHours?: number\r\n}\r\n\r\ninterface PrebookingMultiple {\r\n booking: JsonBooking;\r\n products: BookingProduct[];\r\n code: string;\r\n pin: string;\r\n}\r\n\r\ninterface CustomPrivacy {\r\n privacyIt: string;\r\n privacyEn: string;\r\n privacyLinkIt: string;\r\n privacyLinkEn: string;\r\n cookieIt: string;\r\n cookieEn: string;\r\n cookieLinkIt: string;\r\n cookieLinkEn: string;\r\n}\r\n\r\ninterface IBookingData {\r\n email: string;\r\n selecteddate: string | null;\r\n selectedtime: number | string;\r\n selectedTruckType: string;\r\n carrier: string;\r\n refname: string;\r\n refnum: string;\r\n truckplate: string;\r\n trailerplate: string;\r\n sender: string;\r\n phonenumber: string;\r\n receiver: string;\r\n notes: string;\r\n privacySelectedValue: string;\r\n country: string;\r\n external: string;\r\n}\r\ninterface IBookScope extends ng.IScope {\r\n mandAttachments: (group: number) => boolean;\r\n searchData: moment.Moment;\r\n formLink: string;\r\n formLabel: string;\r\n showLabel: (fieldName: string) => string;\r\n showTooltip: (fieldName: string) => string;\r\n showProductLabel: (fieldName: string) => string;\r\n isColumnVisible: (fieldName: string) => boolean;\r\n columnVisibilityError: boolean;\r\n isVisible: (field: string) => boolean;\r\n isNaN: (a: number) => boolean;\r\n prebooking: boolean;\r\n is_privacy_checked: () => boolean;\r\n customPrivacy: CustomPrivacy;\r\n getCustomPrivacy: () => void;\r\n is_prebooked: boolean;\r\n prebookedstatus: -1 | 0 | 1;\r\n tz: () => string;\r\n products: BookingProduct[];\r\n docks: CustomerPlant[];\r\n hub_id: number;\r\n data: IBookingData & {\r\n //aggiunti\r\n startdate?: moment.Moment;\r\n };\r\n allLapses: ILapseAvailable[];\r\n filteredLapses: ILapseAvailable[];\r\n type: string;\r\n startdate: moment.Moment;\r\n //posMarkers: PosMarkers[];\r\n sd: any;\r\n format: string;\r\n productGroupsValues: ProductGroupValue[];\r\n duration: number;\r\n plantId: number;\r\n loadUnload: any[];\r\n loadingLapses: boolean;\r\n truckTypes: ICodeNameOrder[];\r\n destinations: ICodeNameOrder[];\r\n tripTypes: ICodeNameOrder[];\r\n selectedTruckType: string;\r\n customerCode: string;\r\n plantCode: string;\r\n bookingCode: string;\r\n uploader1: FileUploader;\r\n uploader2: FileUploader;\r\n uploader3: FileUploader;\r\n mandStep: any;\r\n atleastOne: boolean;\r\n shipment: any;\r\n currentData: any;\r\n hours: number[];\r\n selectedDatetime: moment.Moment;\r\n emailRegex: RegExp;\r\n waitPrevious: boolean;\r\n waitNext: boolean;\r\n totQty: number;\r\n filePath: string;\r\n uploadSuccess: boolean;\r\n bookingFilePath: string;\r\n hubSR: any;\r\n confirmUpload: boolean;\r\n now: string | moment.Moment;\r\n todayWD: WorkingDay;\r\n selectedWD: WorkingDay;\r\n allowPdfDownload: boolean;\r\n canSave: boolean;\r\n sameDaySlot: boolean;\r\n maxlimit: number;\r\n privacyStatement: string;\r\n freezeBooking: number;\r\n firstValidResult: ILapseAvailable;\r\n minValidDate: moment.Moment;\r\n loadUnloadEnabled: boolean;\r\n origLoadUnload: any[];\r\n productsPreviewStrings: string[];\r\n mandatoryFieldsList: WfMandatoryField[];\r\n bookingFieldLabels: BookingFieldLabelsGet;\r\n docksLimit: number;\r\n emailValid: boolean;\r\n effDuration: number;\r\n accordionGroup: { existing: boolean, fromScratch: boolean, anchor: string, hideFromScratch: boolean };\r\n shipCode: string;\r\n unlockCode: string;\r\n errorMessage: string;\r\n isDisabledSelectFromExistingShipment: boolean;\r\n getBookingAvail: (validateFn: () => boolean) => void;\r\n recheckResults: (startdate: moment.Moment, direction: LM.Direction, isfirst?: boolean, filterCode?: string, nextDay?: boolean) => void;\r\n selectLapse: (lapse: any) => void;\r\n saveBooking: (loc?: CustomerPlant) => void;\r\n addProductRow: () => void;\r\n editProductRow: (product: any) => void;\r\n checkScreensize: () => boolean;\r\n downloadPdf: (bookingCode: string) => void;\r\n removeRow: (product: any) => void;\r\n upload: (group: number) => void;\r\n isInUploadingPhase1: (file: any) => boolean;\r\n isInUploadingPhase2: (file: any) => boolean;\r\n isInUploadingPhase3: (file: any) => boolean;\r\n deleteFile: (file: any, group: number) => void;\r\n validates2: () => boolean;\r\n validates3: () => boolean;\r\n validateTruckType: () => boolean;\r\n validateValue: (value: string) => boolean;\r\n fillFields: () => void;\r\n PrintElem: (elem: string) => void;\r\n PrintPDF: (bookingCode: string, linkId?: string) => void;\r\n getUploadedPdf: (pdfName: string) => void;\r\n checkConditions: () => void;\r\n sanitize: () => void;\r\n isMandatory: (field: string, value: string) => boolean;\r\n checkEmail: (email: string) => void;\r\n findShipments: (shipmentCode: string, unlockCode: string) => void;\r\n findMultipleShipments: (params: string) => void;\r\n bloppo: (h: moment.Moment) => boolean;\r\n navigation_wizard_enabled: () => boolean;\r\n fileUploadError1: string;\r\n fileUploadError2: string;\r\n fileUploadError3: string;\r\n init: () => void;\r\n emptyLapses: () => void;\r\n refreshSlots: (filterCode: string) => void;\r\n showLoading: boolean;\r\n InvitationOnly: boolean;\r\n linkId: string;\r\n isEditable: (field: string, value: string) => boolean;\r\n prebookings: Array;\r\n removePrebooking: (index: number) => void;\r\n confirmPrebooking: () => void;\r\n prebookingConfirmed: boolean;\r\n showAutocompleteBtn: boolean;\r\n changeDayCheckResult: (direction: LM.Direction) => void;\r\n newBookingError: boolean;\r\n attachments1Count: number;\r\n attachments2Count: number;\r\n attachments3Count: number;\r\n quantityWarning: (value: number, code: string) => void;\r\n triggerQuantity: (product?: BookingProduct) => void;\r\n getProductLimit: (productCode: string) => number;\r\n skip: any;\r\n firstTitle: string;\r\n secondTitle: string;\r\n whInternalContactPhone: string;\r\n whInternalContactEmail: string;\r\n cutMinMaxDates: boolean;\r\n passedMaxDate: boolean;\r\n passedMinDate: boolean;\r\n fileNotLoadedYet1: any[];\r\n fileNotLoadedYet2: any[];\r\n fileNotLoadedYet3: any[];\r\n maxDays: number;\r\n initialDateTime: moment.Moment;\r\n}\r\nnamespace LM {\r\n\r\n export interface IGetD {\r\n productGroups: ICodeNameOrder[];\r\n trucks: ICodeNameOrder[];\r\n reasons: (ICodeName & { Red: boolean })[];\r\n destinations: ICodeNameOrder[];\r\n x: string;\r\n customerCode: string;\r\n tripTypes: ICodeNameOrder[];\r\n openingHour: string | null;\r\n closingHour: string | null;\r\n FreezeBooking: number;\r\n workflowEnabled: ActionType[];\r\n maxDocks: number | null;\r\n Tz: string;\r\n InvitationOnly: boolean;\r\n }\r\n\r\n export interface IGetWorkingTime {\r\n openingHour: string;\r\n closingHour: string;\r\n maxDocks: number | null;\r\n }\r\n\r\n export enum Direction {\r\n Forward = 'forward',\r\n Backward = 'backward'\r\n };\r\n\r\n export enum EmailStatus {\r\n WhiteList,\r\n Existing,\r\n BlackList\r\n };\r\n export interface Prebooking {\r\n shipCode: string;\r\n unlockCode: string;\r\n products: BookingProduct[];\r\n minDate: string | moment.Moment;\r\n maxDate: string | moment.Moment;\r\n }\r\n var nextDateDay: moment.Moment = null;\r\n export abstract class BookingBase {\r\n protected volume: angular.IHttpResponse<{ [key: string]: number; }>;\r\n protected now(): moment.Moment {\r\n return moment.tz(this.TZ);\r\n }\r\n protected min: moment.Moment = this.now();\r\n protected max: moment.Moment | null = null;\r\n protected delays: { StartDate: moment.Moment, EndDate: moment.Moment | null, BookingTollerance: number }[];\r\n protected actionWf: LM.ActionType;\r\n protected MAXDAYS: number = 90;\r\n protected Language: string;\r\n protected limitDay: moment.Moment | null = null;\r\n protected firstProposedSlot: moment.Moment | null = null;\r\n\r\n constructor(public $scope: T, public genericHelper: LM.GenericHelperService, $uibModal: any, WizardHandler: any, FileUploader: FileUploader, protected $http: ng.IHttpService) {\r\n this.Language = LangService.getLanguage();\r\n $scope.tz = () => this.TZ;\r\n $scope.columnVisibilityError = false;\r\n $scope.docks = [];\r\n $scope.skip = false;\r\n $scope.firstTitle = '2';\r\n $scope.secondTitle = '3';\r\n $scope.whInternalContactPhone = \"\";\r\n $scope.whInternalContactEmail = \"\";\r\n $scope.sameDaySlot = true;\r\n $scope.maxlimit = NaN;\r\n //$scope.posMarkers = [];\r\n $scope.productGroupsValues = [];\r\n $scope.products = [];\r\n $scope.filteredLapses = [];\r\n $scope.truckTypes = [];\r\n $scope.destinations = [];\r\n $scope.tripTypes = [];\r\n $scope.hours = [];\r\n $scope.attachments1Count = 0;\r\n $scope.attachments2Count = 0;\r\n $scope.attachments3Count = 0;\r\n $scope.productsPreviewStrings = [];\r\n $scope.data = {\r\n selectedTruckType: '',\r\n selecteddate: null,\r\n selectedtime: 0,\r\n email: '',\r\n carrier: '',\r\n refname: '',\r\n external: '',\r\n refnum: '',\r\n truckplate: '',\r\n trailerplate: '',\r\n phonenumber: '',\r\n notes: '',\r\n sender: '',\r\n receiver: '',\r\n privacySelectedValue: '',\r\n country: 'it'\r\n };\r\n $scope.totQty = 0;\r\n $scope.bookingFilePath = '';\r\n $scope.loadUnload = [{ name: 'Load', img: '../../Content/Icons/load.png' }, { name: 'Unload', img: '../../Content/Icons/unload.png' }];\r\n $scope.now = this.now();//.format('YYYY-MM-DD');\r\n $scope.fileNotLoadedYet1 = [];\r\n $scope.fileNotLoadedYet2 = [];\r\n $scope.fileNotLoadedYet3 = [];\r\n for (let i: number = 0; i <= 23; i++)\r\n $scope.hours.push(i);\r\n $scope.isNaN = (a: number) => !angular.isNumber(a) || isNaN(a);\r\n $scope.filePath = (Math.random() * 1e4).toString();\r\n $scope.uploader1 = new FileUploader();\r\n $scope.uploader2 = new FileUploader();\r\n $scope.uploader3 = new FileUploader();\r\n $scope.confirmUpload = false;\r\n $scope.selectedWD = {\r\n Opening: this.now(),\r\n Closing: this.now()\r\n };\r\n $scope.todayWD = {\r\n Opening: this.now(),\r\n Closing: this.now()\r\n };\r\n $scope.accordionGroup = {\r\n existing: false,\r\n fromScratch: true,\r\n anchor: '',\r\n hideFromScratch: false\r\n };\r\n $scope.prebookings = [];\r\n $scope.prebookingConfirmed = false;\r\n $scope.showAutocompleteBtn = true;\r\n $scope.newBookingError = false;\r\n //$scope.addPrebooking = () => $scope.prebookings.push({ shipCode: '', unlockCode: '' });\r\n\r\n $scope.removePrebooking = (index: number) =>\r\n $scope.prebookings.splice(index, 1);\r\n\r\n $scope.init = function () {\r\n $scope.columnVisibilityError = false;\r\n }\r\n\r\n $scope.bloppo = (h: moment.Moment): boolean => {\r\n if (!moment.isMoment(this.max) || !this.max.isValid())\r\n return true;\r\n if (!moment.isMoment(h))\r\n return false;\r\n //if (moment.isMoment(this.min)) {\r\n if (this.min.isSameOrAfter(h))\r\n return false;\r\n if (moment.isMoment(this.max))\r\n return this.max.isSameOrAfter(h);\r\n //}\r\n return true;\r\n };\r\n\r\n $scope.getBookingAvail = (validateFn: () => boolean, loc?: any, filterCode: string = '') => {\r\n if (validateFn()) {\r\n const plant: CustomerPlant = loc || this.getCustomerPlant();\r\n $scope.plantId = plant.Id;\r\n $scope.loadingLapses = true;\r\n $scope.allLapses = [];\r\n $scope.showLoading = true;\r\n\r\n this.actionWf = $scope.products.every(x => x.Type == 'Load') ? LM.ActionType.Load : $scope.products.every(x => x.Type == 'Unload') ? LM.ActionType.Unload : LM.ActionType.LoadUnload;\r\n BrainyHelper.calculateDuration(genericHelper.$http, $scope.customerCode, $scope.plantCode, $scope.data.selectedTruckType, $scope.products.map(p => ({\r\n PackageType: p.Code,\r\n Quantity: p.Value,\r\n DestinationCountry: p.Destination,\r\n DeliveryMethod: p.TripType,\r\n Action: p.Type == 'Load' ? LM.ActionType.Load : p.Type == 'Unload' ? LM.ActionType.Unload : p.Type == 'LoadUnload' ? LM.ActionType.LoadUnload : LM.ActionType.None\r\n }))).then(res => {\r\n $scope.duration = res.Average; //Expected;\r\n $scope.effDuration = res.Expected;\r\n $scope.searchData = nextDateDay = moment.tz($scope.data.selecteddate, 'YYYY/MM/DD', this.TZ).startOf('d').add($scope.data.selectedtime, 'h');\r\n //$scope.recheckResults($scope.searchData.add(1, 'd'), Direction.Forward);\r\n recheckRes($scope.searchData, Direction.Forward, true, filterCode).then(_ => {\r\n $scope.showLoading = false;\r\n if (WizardHandler.wizard().currentStep().wzTitle == $scope.firstTitle) {\r\n $http.post('/Booking/Book/CanSkipSlotSelection', {\r\n PlantId: $scope.plantId,\r\n ProductInfos: $scope.products,\r\n TruckType: $scope.data.selectedTruckType\r\n }).then(function (response) {\r\n $scope.skip = response.data;\r\n WizardHandler.wizard().next();\r\n });\r\n }\r\n if (WizardHandler.wizard().currentStep().wzTitle == $scope.secondTitle && $scope.skip == 'True') {\r\n var now = moment();\r\n if ($scope.filteredLapses[0].From <= now && $scope.filteredLapses.length > 1) {\r\n $scope.filteredLapses[1].Selected = true;\r\n $scope.selectLapse($scope.filteredLapses[1]);\r\n } else {\r\n $scope.filteredLapses[0].Selected = true;\r\n $scope.selectLapse($scope.filteredLapses[0]);\r\n }\r\n $scope.canSave = true;\r\n $scope.saveBooking(loc);\r\n } else {\r\n if (WizardHandler.wizard().currentStep().wzTitle != $scope.firstTitle) {\r\n WizardHandler.wizard().next();\r\n }\r\n }\r\n }, err => {\r\n console.log(err);\r\n $scope.showLoading = false;\r\n $uibModal.open({\r\n templateUrl: '/Templates/SlotUnavailable.html',\r\n windowClass: 'slotUnavail',\r\n scope: angular.extend($scope, {\r\n notExpiring: this.notExpiringRules($scope.currentData != null ? $scope.currentData.x : null),\r\n whInternalContactEmail: $scope.whInternalContactEmail,\r\n whInternalContactPhone: $scope.whInternalContactPhone,\r\n date: moment.tz($scope.data.selecteddate, 'YYYY/MM/DD', this.TZ).add(30, 'd').toDate()\r\n })\r\n });\r\n });\r\n });\r\n this.saveStep(2);\r\n }\r\n\r\n };\r\n\r\n $scope.changeDayCheckResult = (direction: Direction) =>\r\n $scope.recheckResults(nextDateDay, direction, false, '', true);\r\n\r\n /**\r\n * Funzione per ottenere gli slot temporali\r\n * \r\n * @param startdate Data di partenza per calcolo degli slot\r\n * @param direction Direzione per cercare avanti o indietro nel tempo\r\n * @param isFirstRun Flag per definire se รจ primo giro di richiesta slot\r\n * @param filterCode Stringa per filtrare un codice dalla lista delle prenotazioni esistenti\r\n * @param nextDay Flag per saltare al giorno successivo/precedente\r\n */\r\n $scope.recheckResults = (startdate: moment.Moment, direction: Direction, isFirstRun: boolean = false, filterCode: string = '', nextDay: boolean = false) => {\r\n recheckRes(startdate, direction, isFirstRun, filterCode, nextDay)\r\n .then(_ => console.log(\"Completed\"),\r\n err => {\r\n $scope.errorMessage = \"Non c'รจ disponibilitร \";\r\n $scope.filteredLapses = [];\r\n $scope.loadingLapses = false;\r\n $scope.$apply();\r\n console.log(err);\r\n });\r\n }\r\n\r\n /**\r\n * Funzione per controllare se abbiamo superato il limite di 30 giorni\r\n * @param startdate data richiesta\r\n */\r\n const blockSearch = (startdate: moment.Moment) => {\r\n if ($scope.allLapses.length == 0 && startdate.isAfter(moment.tz($scope.data.selecteddate, 'YYYY/MM/DD', this.TZ).add('d', 30))) {\r\n throw new Error(\"Blocco ricerca\");\r\n }\r\n }\r\n\r\n function manageRemainingDays(direction: LM.Direction, actualDate: moment.Moment) {\r\n if ($scope.searchData != actualDate)\r\n if (direction == LM.Direction.Forward) {\r\n if (remainingDays >= 0)\r\n remainingDays--;\r\n }\r\n else\r\n remainingDays++;\r\n }\r\n\r\n let remainingDays = 0;\r\n const recheckRes = async (startdate: moment.Moment, direction: Direction, isFirstRun: boolean = false, filterCode: string = '', nextDay: boolean = false) => {\r\n $scope.passedMaxDate = false;\r\n $scope.passedMinDate = false;\r\n let maxDate = this.max ?? this.limitDay;\r\n if (isFirstRun) {\r\n remainingDays = 0;\r\n $scope.maxDays = 0;\r\n }\r\n //Se si arriva oltre 30 giorni nella ricerca di slot disponibili esci\r\n blockSearch(startdate);\r\n\r\n if (direction == LM.Direction.Forward) {\r\n const filtered: ILapseAvailable[] = $scope.allLapses.filter(l => l.From.isAfter(startdate));\r\n //Esistono giร  risultati disponibili, non siamo al primo giro e non abbiamo cambiato giorno di consultazione\r\n if (filtered.length > 0 && !isFirstRun && !nextDay) {\r\n $scope.filteredLapses = filtered.slice(0, MAXRESULTS);\r\n //Check per verificare se abbiamo superato la data max\r\n if ($scope.cutMinMaxDates && maxDate && maxDate.isValid()) {\r\n $scope.filteredLapses = $scope.filteredLapses.filter(x => x.From < maxDate);\r\n const nextNonVisibleSlot = $scope.allLapses.filter(x => x.From > $scope.filteredLapses[$scope.filteredLapses.length - 1]?.From)[0];\r\n //let nextNonVisibleSlot = f.length > 0 ? f[0] : null;\r\n $scope.passedMaxDate = nextNonVisibleSlot && nextNonVisibleSlot.From.isValid() && nextNonVisibleSlot.From >= maxDate;\r\n }\r\n } else {\r\n //Flag per evitare troppe chiamate\r\n $scope.waitNext = true;\r\n\r\n //Se siamo arrivati all'ultimo slot disponibile si passa al giorno successivo oppure se si avanza di giorno\r\n if (($scope.allLapses.length > 0 && $scope.filteredLapses.length > 0 &&\r\n $scope.allLapses.lastElement().From == $scope.filteredLapses.lastElement().From)\r\n || nextDay) {\r\n startdate.add(1, 'd').startOf('day');\r\n }\r\n\r\n $scope.loadingLapses = true;\r\n //Vengono richiesti tutti i dati necessari (aperture, limite baie, prenotazioni esistenti, etc)\r\n const res = await genericHelper.$http.post('/Booking/Book/GetData', { Date: startdate, PlantId: $scope.plantId, direction: direction });\r\n //Se non viene trovato niente, si prova ad andare sul giorno successivo\r\n if (res.data == -1) {\r\n startdate.add(1, 'd');\r\n await recheckRes(startdate, Direction.Forward);\r\n }\r\n else {\r\n $scope.currentData = res.data;\r\n //const comboGroupRevamp: ComboGroupRevamp[] = $scope.currentData.cg.map((c: ComboGroup) => this.omit(c, 'TruckTypeCode', 'From', 'To', 'Availability', 'Volume', 'LimitType'));\r\n $scope.whInternalContactPhone = res.data.WarehouseInternalContactPhone;\r\n $scope.whInternalContactEmail = res.data.WarehouseInternalContactEmail;\r\n $scope.cutMinMaxDates = res.data.CutMinMaxDates;\r\n\r\n if (!isFirstRun)\r\n startdate = moment.tz($scope.currentData.OpeningTime, this.TZ).startOf('d');\r\n $scope.docksLimit = res.data.MaxDocks;\r\n\r\n //Rende libero lo slot della prenotazione da modificare\r\n if (filterCode)\r\n $scope.currentData.rows = $scope.currentData.rows.map((a: any) => ({\r\n ...a,\r\n Ships: a.Ships.filter((b: any) => b.Code != filterCode)\r\n }));\r\n\r\n //Le date di inizio, fine e pianificazione vengono castate a stringa, prendendo solo le prenotazioni future rispetto alla data di partenza\r\n for (const d of $scope.currentData.rows) {\r\n d.Ships = d.Ships.filter((s: any) => {\r\n if (s2m(s.RePlanned) >= startdate.clone().startOf('d')) {\r\n s.ExpStartLoad = s2m(s.ExpStartLoad).utc().format();\r\n s.ExpEndLoad = s2m(s.ExpEndLoad).utc().format();\r\n // Aggiunto .utc(), vedere se cambia nel calcolo degli slot \r\n s.RePlanned = s2m(s.RePlanned).utc().format();\r\n // Reset volume per successivo ricalcolo\r\n s.Volume = 0;\r\n return true;\r\n }\r\n return false;\r\n });\r\n }\r\n\r\n if (!$scope.maxDays) {\r\n //Ricaviamo limite di massimi giorni da cercare\r\n const slotDayLimits = U.filterSlotDayLimits(res.data.lims, $scope.products, $scope.data.selectedTruckType);\r\n if (isFirstRun) {\r\n if (slotDayLimits.length) {\r\n $scope.maxDays = remainingDays = Math.min(...slotDayLimits.map(x => x.Days));\r\n manageRemainingDays(direction, startdate);\r\n }\r\n }\r\n } else {\r\n manageRemainingDays(direction, startdate);\r\n }\r\n\r\n //Recuperiamo tutte le handling unit presenti fra le prenotazioni della giornata, nel caso sia presente comboGroup con ProductCode == null (*)\r\n const cgWithAnyProd = ($scope.currentData.cg).some(x => x.ProductCode == null);\r\n let allShipsProdTypes = [];\r\n if (cgWithAnyProd)\r\n allShipsProdTypes = Array.from(new Set(($scope.currentData.rows).flatMap((x: any) => (x.Ships).flatMap((y: any) => (y.Items).flatMap((z: any) => z.Product_Code)))));\r\n //Ricaviamo tutti i codici delle handling unit, sia products che combogroup\r\n const productList = new Set(\r\n Array.from(\r\n ($scope.currentData.cg)\r\n .map(x => x.ProductCode))\r\n .concat($scope.products.map(p => p.Code))\r\n .concat(allShipsProdTypes)\r\n .filter(x => x));\r\n //Chiamata per calcolare volume\r\n if (!this.volume || !this.volume.data)\r\n this.volume = await $http.post<{ [key: string]: number }>('/Booking/Book/CalculateVolume', {\r\n products:\r\n Array.from(productList)\r\n .map(x => ({ productCode: x, quantity: 0 })),\r\n plantId: $scope.plantId\r\n });\r\n let avail = U.filterComboGroups(($scope.currentData.cg), $scope.products, $scope.data.selectedTruckType, this.volume.data);\r\n if (avail) {\r\n avail = avail.map(x => ({\r\n ...x,\r\n From: TargetToLocal(moment(x.From), this.TZ),\r\n To: TargetToLocal(moment(x.To), this.TZ)\r\n }));\r\n }\r\n\r\n //Chiamata a funzione di Revamp per calcolo slot temporali\r\n let lapsesFound = FindTimeLapses({\r\n rows: $scope.currentData.rows,\r\n date: moment.invalid(),\r\n OpeningTime: moment.tz($scope.currentData.OpeningTime, this.TZ),\r\n ClosingTime: moment.tz($scope.currentData.ClosingTime, this.TZ),\r\n dockGroups: $scope.currentData.dockGroups,\r\n comboGroups: avail,\r\n expectedVolume: this.volume.data\r\n },\r\n $scope.effDuration,\r\n [],\r\n // se sono in edit non considero idle time fra spedizioni\r\n filterCode ? 0 : $scope.currentData.MininumDelay,\r\n $scope.duration,\r\n $scope.docksLimit);\r\n //Se non sono disponibili slot riprova sulla giornata successiva\r\n if (typeof lapsesFound === 'number') {\r\n startdate.add(1, 'd');\r\n await recheckRes(startdate, Direction.Forward, false);\r\n } else {\r\n //Slot vengono filtrati in base a regole di esclusione\r\n $scope.allLapses = lapsesFound\r\n .filter(l => U.BondGate(\r\n l,\r\n $scope.products,\r\n $scope.data.selectedTruckType,\r\n startdate,\r\n JSON.parse($scope.currentData.x))\r\n );\r\n //Vengono eliminati slot con stesso orario ma su baie diverse (viene mostrato solo lo slot con prioritร  maggiore)\r\n $scope.allLapses = $scope.allLapses.reduce((cum: ILapseAvailable[], next: ILapseAvailable) => {\r\n if (!cum.some(c => c.From.isSame(next.From, 'minute')))\r\n cum.push(next);\r\n return cum;\r\n }, []);\r\n //Se si arriva oltre 30 giorni nella ricerca di slot disponibili esci\r\n blockSearch(startdate);\r\n //if ($scope.allLapses.length == 0 && startdate.isAfter(moment.tz($scope.data.selecteddate, 'YYYY/MM/DD', this.TZ).add('d', 30))) {\r\n // throw new Error(\"Blocco ricerca\");\r\n //}\r\n //Se non sono disponibili slot riprova sulla giornata successiva\r\n if ($scope.allLapses.length == 0) {\r\n startdate.add(1, 'd');\r\n await recheckRes(startdate, Direction.Forward);\r\n }\r\n //Se sono disponibili slot\r\n else {\r\n $scope.errorMessage = '';\r\n $scope.productGroupsValues = $scope.currentData.productGroups.map((pg: any) => ({ Code: pg.Code.trim(), Name: pg.Name.trim(), Value: 0, Limit: pg.Limit }));\r\n if (isFirstRun && $scope.minValidDate != undefined)\r\n $scope.filteredLapses = $scope.allLapses.filter(l => l.From.isSameOrAfter($scope.minValidDate));\r\n else\r\n $scope.filteredLapses = $scope.allLapses.filter(l => l.From.isSameOrAfter(moment(startdate)));\r\n // $scope.filteredLapses = $scope.allLapses.filter(l => l.From.isSameOrAfter(moment($scope.data.selecteddate).startOf('d').add($scope.data.selectedtime, 'h')));\r\n //Se non sono disponibili slot riprova sulla giornata successiva\r\n if ($scope.filteredLapses.length == 0) {\r\n startdate.add(1, 'd');\r\n await recheckRes(startdate, Direction.Forward);\r\n }\r\n else {\r\n if (isFirstRun) {\r\n //Serve??\r\n //$scope.firstValidResult = $scope.filteredLapses[0];\r\n\r\n if (this.min?.isValid()) {\r\n $scope.passedMinDate = $scope.filteredLapses.some(x => x.From < this.min);\r\n $scope.filteredLapses = $scope.filteredLapses.filter(x => x.From > this.min);\r\n }\r\n\r\n if ($scope.cutMinMaxDates && maxDate?.isValid()) {\r\n $scope.passedMaxDate = $scope.filteredLapses.some(x => x.From > maxDate);\r\n $scope.filteredLapses = $scope.filteredLapses.filter(x => x.From < maxDate);\r\n }\r\n\r\n $scope.filteredLapses = $scope.filteredLapses.filter(l => l.From.isSameOrAfter(startdate)).slice(0, MAXRESULTS);\r\n if ($scope.filteredLapses.length == 0) {\r\n if ($scope.passedMaxDate)\r\n throw new Error(\"Blocco ricerca\");\r\n //Se non troviamo risultati svuotiamo tutti gli slot e andiamo a domani\r\n $scope.allLapses = [];\r\n startdate.clone().add(1, 'd');\r\n await recheckRes(startdate, Direction.Forward);\r\n }\r\n }\r\n else {\r\n\r\n $scope.filteredLapses = $scope.filteredLapses.slice(0, MAXRESULTS);\r\n\r\n nextDateDay = $scope.filteredLapses[0].From.clone().startOf('d');\r\n\r\n if (($scope.cutMinMaxDates && maxDate?.isValid()) || remainingDays < 0) {\r\n if (maxDate?.isValid() && $scope.filteredLapses[0].From > maxDate || remainingDays < 0) {\r\n $scope.filteredLapses[0].From.clone().subtract(1, 'd');\r\n await recheckRes($scope.filteredLapses[0].From, Direction.Backward);\r\n }\r\n }\r\n }\r\n }\r\n $scope.waitPrevious = false;\r\n }\r\n }\r\n }\r\n $scope.loadingLapses = false;\r\n $scope.$applyAsync();\r\n }\r\n }\r\n else {\r\n //Se primo slot disponibile รจ precedente alla data di minima validitร , esco \r\n if ($scope.filteredLapses[0].From.isSameOrBefore($scope.minValidDate, 'm'))\r\n return;\r\n if (startdate >= this.now()) {\r\n let filtered: ILapseAvailable[] = $scope.allLapses.filter(l => l.From.isBefore(startdate) && l.From.isSameOrAfter($scope.minValidDate));\r\n if (filtered.length > 0 && !isFirstRun && !nextDay) {\r\n $scope.filteredLapses = filtered.slice(-MAXRESULTS);\r\n\r\n if ($scope.cutMinMaxDates && this.min?.isValid()) {\r\n $scope.filteredLapses = $scope.filteredLapses.filter(x => x.From > this.min);\r\n let f = $scope.allLapses.filter(x => x.From < $scope.filteredLapses[0]?.From);\r\n let nextNonVisibleSlot = f.length > 0 ? f.lastElement() : null;\r\n $scope.passedMinDate = nextNonVisibleSlot && nextNonVisibleSlot.From.isValid && nextNonVisibleSlot.From <= this.min;\r\n }\r\n } else {\r\n if (startdate.isSame(this.now(), 'day')) {\r\n $scope.waitPrevious = true;\r\n return;// grigio dietro\r\n }\r\n $scope.data.startdate = moment.tz(startdate.clone().subtract('d', 1), this.TZ).startOf('day');\r\n\r\n $scope.waitPrevious = true;\r\n $scope.loadingLapses = true;\r\n const res = await genericHelper.$http.post('/Booking/Book/GetData', {\r\n Date: TargetToLocal($scope.data.startdate, this.TZ), //moment.tz($scope.data.startdate, this.TZ),\r\n PlantId: $scope.plantId, direction: direction\r\n });\r\n $scope.currentData = res.data;\r\n $scope.productGroupsValues = res.data.productGroups.map((pg: any) => ({ Code: pg.Code.trim(), Name: pg.Name.trim(), Value: 0, Limit: pg.Limit }));\r\n $scope.waitPrevious = false;\r\n $scope.docksLimit = res.data.MaxDocks;\r\n $scope.cutMinMaxDates = res.data.CutMinMaxDates;\r\n\r\n //Rende libero lo slot della prenotazione da modificare\r\n if (filterCode)\r\n $scope.currentData.rows = $scope.currentData.rows.map((a: any) => ({\r\n ...a,\r\n Ships: a.Ships.filter((b: any) => b.Code != filterCode)\r\n }));\r\n\r\n for (var d of $scope.currentData.rows) {\r\n d.Ships.forEach((s: any) => {\r\n // Prima non era presente .utc()\r\n s.ExpStartLoad = s2m(s.ExpStartLoad).utc().format();\r\n s.ExpEndLoad = s2m(s.ExpEndLoad).utc().format();\r\n s.RePlanned = s2m(s.RePlanned).utc().format();\r\n // Reset volume per successivo ricalcolo\r\n s.Volume = 0;\r\n })\r\n }\r\n\r\n manageRemainingDays(direction, startdate);\r\n\r\n //Recuperiamo tutte le handling unit presenti fra le prenotazioni della giornata, nel caso sia presente comboGroup con ProductCode == null (*)\r\n const cgWithAnyProd = ($scope.currentData.cg).some(x => x.ProductCode == null);\r\n let allShipsProdTypes = [];\r\n if (cgWithAnyProd)\r\n allShipsProdTypes = Array.from(new Set(($scope.currentData.rows).flatMap((x: any) => (x.Ships).flatMap((y: any) => (y.Items).flatMap((z: any) => z.Product_Code)))));\r\n //Chiamata per calcolare volume\r\n const productList = new Set(\r\n Array.from(\r\n ($scope.currentData.cg)\r\n .map(x => x.ProductCode))\r\n .concat($scope.products.map(p => p.Code))\r\n .concat(allShipsProdTypes)\r\n .filter(x => x));\r\n //Chiamata per calcolare volume\r\n if (!this.volume || !this.volume.data)\r\n this.volume = await $http.post<{ [key: string]: number }>('/Booking/Book/CalculateVolume', {\r\n products:\r\n Array.from(productList)\r\n .map(x => ({ productCode: x, quantity: 0 })),\r\n plantId: $scope.plantId\r\n });\r\n let avail = U.filterComboGroups(($scope.currentData.cg), $scope.products, $scope.data.selectedTruckType, this.volume.data);\r\n if (avail) {\r\n avail = avail.map(x => ({\r\n ...x,\r\n From: TargetToLocal(moment(x.From), this.TZ),\r\n To: TargetToLocal(moment(x.To), this.TZ)\r\n }));\r\n //avail.From = TargetToLocal(moment(avail.From), this.TZ);\r\n //avail.To = TargetToLocal(moment(avail.To), this.TZ);\r\n }\r\n\r\n\r\n $scope.allLapses = (FindTimeLapses({\r\n rows: $scope.currentData.rows,\r\n date: moment.invalid(),\r\n OpeningTime: moment.tz($scope.currentData.OpeningTime, this.TZ), //moment.tz($scope.currentData.OpeningTime, this.TZ),\r\n ClosingTime: moment.tz($scope.currentData.ClosingTime, this.TZ),//moment.tz($scope.currentData.ClosingTime, this.TZ)\r\n dockGroups: $scope.currentData.dockGroups,\r\n comboGroups: avail,\r\n expectedVolume: this.volume.data\r\n },\r\n $scope.effDuration,\r\n [],\r\n // se sono in edit non considero idle time fra spedizioni\r\n filterCode ? 0 : $scope.currentData.MininumDelay,\r\n $scope.duration,\r\n $scope.docksLimit))\r\n .filter(l => U.BondGate(\r\n { Code: l.Code }\r\n , $scope.products\r\n , $scope.data.selectedTruckType\r\n , moment.tz($scope.currentData.OpeningTime, this.TZ)\r\n , JSON.parse(res.data.x)))\r\n .filter(l => l.From.isSameOrAfter($scope.minValidDate))\r\n .reduce((cum: ILapseAvailable[], next: ILapseAvailable) => {\r\n if (!cum.some(c => c.From.isSame(next.From, 'minute')))\r\n cum.push(next);\r\n return cum;\r\n }, []);\r\n\r\n blockSearch(startdate);\r\n\r\n if ($scope.allLapses.length == 0) {\r\n await recheckRes(startdate.clone().subtract('d', 1), Direction.Backward);\r\n }\r\n\r\n else {\r\n $scope.errorMessage = '';\r\n $scope.filteredLapses = $scope.allLapses.slice(-MAXRESULTS);\r\n nextDateDay = $scope.filteredLapses[0].From.clone().startOf('d');\r\n\r\n if ($scope.cutMinMaxDates && this.min?.isValid()) {\r\n if ($scope.filteredLapses[$scope.filteredLapses.length - 1].From < this.min) {\r\n $scope.filteredLapses[$scope.filteredLapses.length - 1].From.clone().add(1, 'd');\r\n await recheckRes($scope.filteredLapses[$scope.filteredLapses.length - 1].From, Direction.Forward);\r\n }\r\n }\r\n }\r\n $scope.loadingLapses = false;\r\n $scope.$applyAsync();\r\n }\r\n }\r\n }\r\n try {\r\n const acts: string[] = [];\r\n const origs: string[] = [];\r\n let type = '';\r\n $scope.products.forEach(a => {\r\n acts.push(a.TripType);\r\n origs.push(a.Destination);\r\n if (!type)\r\n type = a.Type;\r\n else\r\n type += '|' + a.Type;\r\n });\r\n const saf = await genericHelper.$http.post<{ StartDate: string, EndDate: string, BookingTollerance: number }[]>('/Booking/Book/MaxDelay', {\r\n PlantId: $scope.plantId,\r\n ShipmentTypes: acts,\r\n OriginDestinations: origs,\r\n Truck: $scope.data.selectedTruckType,\r\n ActivityType: type,\r\n From: moment.tz($scope.currentData.OpeningTime, this.TZ).toISOString(),\r\n To: moment.tz($scope.currentData.ClosingTime, this.TZ).toISOString()\r\n });\r\n this.delays = saf.data.map(a => ({\r\n BookingTollerance: a.BookingTollerance,\r\n StartDate: moment.tz(a.StartDate, this.TZ),\r\n EndDate: a.EndDate ? moment.tz(a.EndDate, this.TZ) : null\r\n }));\r\n } catch {\r\n this.delays = [];\r\n } finally {\r\n $scope.maxlimit = NaN;\r\n }\r\n\r\n // tengo traccia di quale e' il primo slot proposto in assoluto da load manager\r\n if (this.firstProposedSlot == null)\r\n this.firstProposedSlot = $scope.filteredLapses[0].From;\r\n\r\n //const searchData = moment.tz($scope.data.selecteddate, 'YYYY/MM/DD', this.TZ).startOf('d').add($scope.data.selectedtime, 'h');\r\n //console.log(searchData);\r\n\r\n };\r\n\r\n $scope.refreshSlots = async (filterCode: string) => {\r\n //Resettiamo tutte le date\r\n const searchData = nextDateDay = moment.tz($scope.data.selecteddate, 'YYYY/MM/DD', this.TZ).startOf('d').add($scope.data.selectedtime, 'h');\r\n $scope.canSave = false;\r\n $scope.recheckResults(searchData, Direction.Forward, true, filterCode ? filterCode : '');\r\n }\r\n\r\n $scope.saveBooking = (loc?: CustomerPlant) => {\r\n const plantId: CustomerPlant = loc || this.getCustomerPlant();\r\n const lapseSelected = $scope.filteredLapses.find(l => l.Selected);\r\n $scope.showLoading = true;\r\n if ($scope.canSave) {\r\n if (!$scope.bookingCode)\r\n //genericHelper.$http.get(`/Booking/Book/IsOverbooking?plantId=${plantId.Id}&bookHour=${LocalToTarget(lapseSelected.From, this.TZ).toJSON()}&gateId=${lapseSelected.Code}&duration=${$scope.duration}`).then(res => {\r\n genericHelper.$http.get(`/Booking/Book/IsOverbooking?plantId=${plantId.Id}&bookHour=${lapseSelected.From.toJSON()}&gateId=${lapseSelected.Code}&duration=${$scope.effDuration}`).then(res => {\r\n let selectedDateTime = moment.tz($scope.data.selecteddate, 'YYYY/MM/DD', this.TZ).startOf('d').add($scope.data.selectedtime, 'h')\r\n if (!!+res.data) {\r\n $scope.allLapses = $scope.filteredLapses = [];\r\n $scope.newBookingError = true;\r\n $scope.recheckResults(selectedDateTime, Direction.Forward, true);\r\n //WizardHandler.wizard().previous();\r\n alert('Slot no more available, please select another arrival time');\r\n $scope.showLoading = false;\r\n } else {\r\n\r\n let firstProposedSlot = this.firstProposedSlot;\r\n let selectedTimeSlot = $scope.initialDateTime;\r\n genericHelper.$http.post('/Booking/Book/NewBooking', {\r\n //UnlockCode: $scope.prebookings.reduce((prev: string, cur: LM.Prebooking & IBookingData) => prev ? prev += ` - ${cur.unlockCode}` : prev = cur.unlockCode,''),//this.prebooked && this.prebooked.unlockCode,\r\n PlantId: plantId.Id,\r\n StartDT: lapseSelected.From,\r\n EndDT: moment(lapseSelected.From).add($scope.effDuration, 'm'),\r\n Destination: '01',\r\n Truck: $scope.data.selectedTruckType,\r\n TripType: '01',\r\n Items: $scope.products.map(p => ({\r\n PackageType: p.Code,\r\n Quantity: p.Value,\r\n DestinationCountry: p.Destination,\r\n TripType: p.TripType,\r\n Action: p.Type\r\n })),\r\n gateCode: lapseSelected.Code,\r\n Carrier: this.getField('carrier'),\r\n PhoneNumber: this.getField('phonenumber'),\r\n Nation: this.getField('country'),\r\n CDN: $scope.data.refnum.toUpperCase(),//(this.prebooked ? this.prebooked.shipmentCode : $scope.data.refnum).toUpperCase(),\r\n Email: $scope.data.email,\r\n TruckPlate: this.getField('truckplate'),\r\n TrailerPlate: this.getField('trailerplate'),\r\n Notes: $scope.data.notes,\r\n Sender: this.getField('sender'),\r\n Receiver: this.getField('receiver'),\r\n ReferenceName: this.getField('refname'),\r\n External: this.getField('external'),\r\n FilePath: $scope.bookingFilePath,\r\n Recaptcha: recaptchaResponse,\r\n Prebookings: $scope.prebookings.length > 0 ? $scope.prebookings.map(p => { ShipmentCode: p.shipCode, UnlockCode: p.unlockCode }) : [],\r\n FirstProposedSlot: firstProposedSlot,\r\n SelectedTimeSlot: selectedTimeSlot\r\n }).then(res => {\r\n if (res.data.Error) {\r\n if (res.data.Error.indexOf(\"Empty Captcha\") > -1) {\r\n recaptchaResponse = \"MULTI_BK\";\r\n $scope.saveBooking(loc);\r\n }\r\n else {\r\n alert('Booking process has encountered some error. Please try again.' + res.data.Error);\r\n }\r\n //location.reload();\r\n } else {\r\n $scope.shipment = res.data.shipment;\r\n document.getElementById('ticket').innerHTML = res.data.HtmlTemplate;\r\n for (let i = 0; i < $scope.shipment.Items.length; i++) {\r\n $scope.productsPreviewStrings.push(ActionType[$scope.shipment.Items[i].Action] + ': ' + $scope.shipment.Items[i].Product_Code + '[' + $scope.shipment.Items[i].Quantity + ']')\r\n //$scope.productsPreviewStrings.push($scope.shipment.Items[i].LoadUnload + ': ' + $scope.shipment.Items[i].Product_Code + '[' + $scope.shipment.Items[i].Quantity + ']')\r\n }\r\n $scope.shipment.Items.forEach((i: any) => $scope.totQty += i.Quantity);\r\n $scope.bookingCode = $scope.shipment.Code;\r\n //const qrcode = new QRCode(document.getElementById('qrcode'), { height: 100, width: 100 });\r\n //qrcode.makeCode($scope.shipment.TicketUrl.toString());\r\n // @ts-ignore\r\n\r\n //-----------------------------\r\n //QRCode.toCanvas(document.getElementById('qrcode'), $scope.shipment.TicketUrl.toString(), { width: 100 });\r\n //JsBarcode('#barcode', $scope.shipment.Code, { height: 30, width: 1, displayValue: false });\r\n\r\n $scope.formLink = res.data.FormLink;\r\n $scope.formLabel = res.data.FormLabel;\r\n $scope.downloadPdf($scope.bookingCode);\r\n //Versione originale, sembra che i parametri passati siano nulli\r\n //$scope.hubSR.UpdateShip(res.data.pIdC, res.data.dbIdC);\r\n $scope.showLoading = false;\r\n if (!$scope.skip) {\r\n WizardHandler.wizard().next();\r\n } else {\r\n WizardHandler.wizard().goTo(\"End\");\r\n }\r\n $scope.hubSR.UpdateShip(res.data.pId, res.data.dbId);\r\n //comunico con portale\r\n if (window.location !== window.parent.location) {\r\n // The page is an iframe\r\n window.parent.postMessage(JSON.stringify($scope.shipment), '*');\r\n }\r\n }\r\n });\r\n }\r\n })\r\n }\r\n };\r\n\r\n $scope.selectLapse = (lapse: ILapseAvailable) => {\r\n $scope.sameDaySlot = this.selectLapse(lapse);\r\n $scope.canSave = true;\r\n const obj = this.delays.find(a => lapse.From.isSameOrAfter(a.StartDate) && (!a.EndDate || lapse.From.isBefore(a.EndDate)));\r\n if (obj)\r\n $scope.maxlimit = obj.BookingTollerance;\r\n else\r\n $scope.maxlimit = NaN;\r\n };\r\n\r\n $scope.validates2 = function () {\r\n if (!$scope.validateTruckType())\r\n return false;\r\n if ($scope.products.length == 0)\r\n return $scope.atleastOne = false;\r\n return document.getElementsByClassName('wrong-s2').length <= 0;\r\n };\r\n\r\n $scope.validates3 = function () {\r\n if (!$scope.validateTruckType())\r\n return false;\r\n if ($scope.products.length == 0)\r\n return $scope.atleastOne = false;\r\n return document.getElementsByClassName('wrong-s3').length <= 0;\r\n };\r\n $scope.prebooking = false;\r\n $scope.is_prebooked = false;\r\n $scope.prebookedstatus = 0;\r\n $scope.is_privacy_checked = function () {\r\n const ACTUAL_PRIVACY_VERSION = \"2\";\r\n const KEY_PRIVACY_LOCAL_STORAGE = \"load_manager_privacy_version\";\r\n const privacy_version = BookingBase.getFromLocalStorage(KEY_PRIVACY_LOCAL_STORAGE);\r\n if (privacy_version == \"\" || privacy_version < ACTUAL_PRIVACY_VERSION) {\r\n //const match = decodeURIComponent(document.cookie).match(/\\.User\\.Locale=([^;]+);?/);\r\n //const lng = Array.isArray(match) ? match[1] : 'en';\r\n const lng = LangService.getLanguage();\r\n const customPrivacy = $scope.customPrivacy;\r\n $uibModal.open({\r\n templateUrl: '/Templates/PrivacyVerification.html',\r\n controller: ['$scope', (function ($scope: any) {\r\n $scope.set_privacy = () => {\r\n BookingBase.saveFieldInLocalStorage(KEY_PRIVACY_LOCAL_STORAGE, ACTUAL_PRIVACY_VERSION);\r\n };\r\n $scope.chg = () => {\r\n console.log(\"Custom privacy :\" + JSON.stringify(customPrivacy));\r\n LangService.selectLanguage($scope.language);\r\n location.reload();\r\n };\r\n $scope.language = lng;\r\n $scope.content = {\r\n privacy_selected_value: \"\", localstorage_selected_value: \"\",\r\n isCustomPrivacy: !!customPrivacy,\r\n privacyIt: customPrivacy ? customPrivacy.privacyIt : \"\",\r\n privacyEn: customPrivacy ? customPrivacy.privacyEn : \"\",\r\n privacyLinkIt: customPrivacy ? customPrivacy.privacyLinkIt : \"\",\r\n privacyLinkEn: customPrivacy ? customPrivacy.privacyLinkEn : \"\",\r\n cookieIt: customPrivacy ? customPrivacy.cookieIt : \"\",\r\n cookieEn: customPrivacy ? customPrivacy.cookieEn : \"\",\r\n cookieLinkIt: customPrivacy ? customPrivacy.cookieLinkIt : \"\",\r\n cookieLinkEn: customPrivacy ? customPrivacy.cookieLinkEn : \"\",\r\n };\r\n $scope.gdprLink = () => {\r\n switch ($scope['language']) {\r\n case 'it':\r\n return 'informativa-gdpr';\r\n case 'en':\r\n default:\r\n return 'informativa-gdpr-en';\r\n }\r\n };\r\n $scope.cookieLink = () => {\r\n switch ($scope['language']) {\r\n case 'it':\r\n return 'informativa-cookie-policyr';\r\n case 'en':\r\n default:\r\n return 'informativa-cookie-policy-en';\r\n }\r\n };\r\n })],\r\n backdrop: 'static'\r\n }).result.catch(() => location.reload());\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n $scope.navigation_wizard_enabled = function () {\r\n if (!$scope.is_privacy_checked()) {\r\n location.reload();\r\n }\r\n return WizardHandler.wizard().currentStep().wzTitle !== 'End' || $scope.newBookingError;\r\n };\r\n\r\n $scope.validateTruckType = function () {\r\n return !!$scope.data.selectedTruckType;\r\n };\r\n\r\n $scope.validateValue = function (value: string) {\r\n if (!value || value == '0')\r\n return false;\r\n return true;\r\n };\r\n\r\n $scope.triggerQuantity = function (product) {\r\n if (!product || !product.Code)\r\n return false\r\n const limit = $scope.getProductLimit(product.Code);\r\n return (limit && limit < product.Value);\r\n }\r\n\r\n $scope.getProductLimit = (productCode: string) => $scope.productGroupsValues.find(x => x.Code == productCode)?.Limit;\r\n\r\n $scope.addProductRow = () => {\r\n if (!$scope.loadUnloadEnabled && $scope.products.length > 0)\r\n $scope.loadUnload = $scope.loadUnload.filter(lu => (lu).name == $scope.products[0].Type);\r\n else\r\n $scope.loadUnload = $scope.origLoadUnload;\r\n if ($scope.checkScreensize()) {\r\n let modalInstance = $uibModal.open({\r\n templateUrl: '/Templates/AddItemModal.html',\r\n controller: ['$scope', function ($scope: any) {\r\n $scope.data = $scope.$resolve.data;\r\n $scope.parentScope = $scope.$resolve.parentScope;\r\n\r\n var code = '';\r\n var type = '';\r\n var destination = '';\r\n var trip = '';\r\n\r\n if ($scope.data.productGroupsValues && !$scope.parentScope.isColumnVisible(\"Product\")) {\r\n if ($scope.data.productGroupsValues.length == 1) {\r\n code = $scope.data.productGroupsValues[0].Code;\r\n } else {\r\n $scope.parentScope.columnVisibilityError = true;\r\n }\r\n }\r\n if ($scope.data.loadUnload && !$scope.parentScope.isColumnVisible(\"Type\")) {\r\n if ($scope.data.loadUnload.length == 1) {\r\n type = $scope.data.loadUnload[0].name;\r\n } else {\r\n $scope.parentScope.columnVisibilityError = true;\r\n }\r\n }\r\n if ($scope.data.tripTypes && !$scope.parentScope.isColumnVisible(\"Deliver method\")) {\r\n if ($scope.data.tripTypes.length == 1) {\r\n trip = $scope.data.tripTypes[0].Name;\r\n } else {\r\n $scope.parentScope.columnVisibilityError = true;\r\n }\r\n }\r\n if ($scope.data.destinations && !$scope.parentScope.isColumnVisible(\"Source/Destination\")) {\r\n if ($scope.data.destinations.length == 1) {\r\n destination = $scope.data.destinations[0].Name;\r\n } else {\r\n $scope.parentScope.columnVisibilityError = true;\r\n }\r\n }\r\n\r\n\r\n if (!$scope.parentScope.isColumnVisible(\"Quantity\")) {\r\n $scope.item = { Type: type, Code: code, TripType: trip, Destination: destination, Name: '', Value: 1 };\r\n } else {\r\n $scope.item = { Type: type, Code: code, TripType: trip, Destination: destination, Name: '' };\r\n }\r\n $scope.OkBtn = function (elem: BookingProduct) {\r\n $scope.$close(elem);\r\n }\r\n }],\r\n controllerAs: '$ctrl',\r\n resolve: {\r\n data: () => {\r\n productGroupsValues: $scope.productGroupsValues,\r\n loadUnload: $scope.loadUnload,\r\n destinations: $scope.destinations,\r\n tripTypes: $scope.tripTypes,\r\n customerCode: $scope.customerCode\r\n },\r\n parentScope: $scope\r\n },\r\n size: 'sm'\r\n });\r\n modalInstance.result.then((res: any) => {\r\n $scope.products.push(res);\r\n });\r\n }\r\n else {\r\n var code = '';\r\n var type = '';\r\n var destination = '';\r\n var trip = '';\r\n\r\n //SE LA COLONNA NON รจ VISIBILE E C'รจ SOLO UN VALORE POSSIBILE LO SETTO, ALTRIMENTI NON POSSO PROSEGUIRE\r\n\r\n if ($scope.productGroupsValues && !$scope.isColumnVisible(\"Product\")) {\r\n if ($scope.productGroupsValues.length == 1) {\r\n code = $scope.productGroupsValues[0].Code;\r\n } else {\r\n $scope.columnVisibilityError = true;\r\n }\r\n }\r\n if ($scope.loadUnload && !$scope.isColumnVisible(\"Type\")) {\r\n if ($scope.loadUnload.length == 1) {\r\n type = $scope.loadUnload[0].name;\r\n } else {\r\n $scope.columnVisibilityError = true;\r\n }\r\n }\r\n if ($scope.tripTypes && !$scope.isColumnVisible(\"Deliver method\")) {\r\n if ($scope.tripTypes.length == 1) {\r\n trip = $scope.tripTypes[0].Name;\r\n } else {\r\n $scope.columnVisibilityError = true;\r\n }\r\n }\r\n if ($scope.destinations && !$scope.isColumnVisible(\"Source/Destination\")) {\r\n if ($scope.destinations.length == 1) {\r\n destination = $scope.destinations[0].Name;\r\n } else {\r\n $scope.columnVisibilityError = true;\r\n }\r\n }\r\n\r\n if (!$scope.isColumnVisible(\"Quantity\")) {\r\n $scope.products.push({ Code: code, Type: type, Destination: destination, TripType: trip, Value: 1 });\r\n } else {\r\n $scope.products.push({ Code: code, Type: type, Destination: destination, TripType: trip });\r\n }\r\n }\r\n $scope.atleastOne = true;\r\n };\r\n\r\n $scope.editProductRow = (product: any) => {\r\n $uibModal.open({\r\n templateUrl: '/Templates/EditItemModal.html',\r\n controller: ['$scope', function ($scope: any) {\r\n $scope.data = $scope.$resolve.data;\r\n $scope.product = $scope.$resolve.product;\r\n $scope.OkBtn = function (elem: BookingProduct) {\r\n $scope.$close(elem);\r\n }\r\n }],\r\n controllerAs: '$ctrl',\r\n resolve: {\r\n data: () => {\r\n productGroupsValues: $scope.productGroupsValues,\r\n loadUnload: [{ name: 'Load' }, { name: 'Unload' }],\r\n destinations: $scope.destinations,\r\n tripTypes: $scope.tripTypes\r\n //customerCode: $scope.customerCode\r\n },\r\n product: () => product //angular.copy(product)\r\n }\r\n });\r\n };\r\n\r\n $scope.removeRow = (product: any) => {\r\n $scope.products.splice($scope.products.indexOf(product), 1);\r\n if ($scope.products.length == 0)\r\n $scope.atleastOne = false;\r\n };\r\n\r\n $scope.checkScreensize = () => {\r\n if (navigator.userAgent.match(/Android/i)\r\n || navigator.userAgent.match(/webOS/i)\r\n || navigator.userAgent.match(/iPhone/i)\r\n //|| navigator.userAgent.match(/iPad/i)\r\n || navigator.userAgent.match(/iPod/i)\r\n || navigator.userAgent.match(/BlackBerry/i)\r\n || navigator.userAgent.match(/Windows Phone/i))\r\n return true;\r\n };\r\n\r\n $scope.downloadPdf = (bookingCode: string) => {\r\n const link = document.createElement('a');\r\n link.href = '/Booking/Book/DownloadCustomPdf?shipmentCode=' + bookingCode + ($scope.linkId ? '&linkId=' + $scope.linkId : '');\r\n link.attributes.setNamedItem(document.createAttribute('download'));\r\n link.click();\r\n };\r\n\r\n $scope.mandAttachments = (group: number) => {\r\n const attachField = $scope.mandatoryFieldsList?.find(f => (LM.ActionType)[f.Workflow] == this.actionWf)?.Fields.find(f => f.FormName == 'attachments' + group.toString());\r\n var r = $scope.mandatoryFieldsList && this.actionWf &&\r\n attachField.Mandatory === 'true' && attachField.Visible === 'true' &&\r\n ((!$scope.attachments1Count && group == 1) || (!$scope.attachments2Count && group == 2) || (!$scope.attachments3Count && group == 3));\r\n return r;\r\n }\r\n\r\n $scope.PrintPDF = (bookingCode: string) => {\r\n window.open('/Booking/Book/DownloadCustomPdf?shipmentCode=' + bookingCode + ($scope.linkId ? '&linkId=' + $scope.linkId : '') + '&download_for_print=true', '_blank');\r\n };\r\n\r\n $scope.uploader1.onAfterAddingAll = () => {\r\n $scope.allowPdfDownload = false;\r\n $scope.upload(1);\r\n };\r\n\r\n $scope.uploader2.onAfterAddingAll = () => {\r\n $scope.allowPdfDownload = false;\r\n $scope.upload(2);\r\n };\r\n\r\n $scope.uploader3.onAfterAddingAll = () => {\r\n $scope.allowPdfDownload = false;\r\n $scope.upload(3);\r\n };\r\n\r\n $scope.upload = async (group: number) => {\r\n $scope.allowPdfDownload = true;\r\n const uploaderFiles = (document.getElementById('upload' + '-' + group)).files;\r\n for (let i: number = 0; i < uploaderFiles.length; i++) {\r\n $scope.uploadSuccess = false;\r\n let form = new FormData();\r\n let item = uploaderFiles.item(i);\r\n form.append('id', $scope.filePath);\r\n form.append('cc', $scope.customerCode);\r\n form.append('file', item, item.name);\r\n form.append('group', group.toString());\r\n //Reset error message\r\n if (group == 1) {\r\n $scope.fileUploadError1 = \"\";\r\n $scope.fileNotLoadedYet1.push(item.name);\r\n }\r\n if (group == 2) {\r\n $scope.fileUploadError2 = \"\";\r\n $scope.fileNotLoadedYet2.push(item.name);\r\n }\r\n if (group == 3) {\r\n $scope.fileUploadError3 = \"\";\r\n $scope.fileNotLoadedYet3.push(item.name);\r\n }\r\n $http({\r\n method: 'POST',\r\n url: '/Booking/Book/UploadFile/',\r\n data: form,\r\n headers: {\r\n 'Content-Type': void 0\r\n }\r\n }).then(function (response) {\r\n if (group == 1) {\r\n $scope.fileNotLoadedYet1.splice($scope.fileNotLoadedYet1.findIndex(f => f == item.name), 1);\r\n }\r\n if (group == 2) {\r\n $scope.fileNotLoadedYet2.splice($scope.fileNotLoadedYet2.findIndex(f => f == item.name), 1);\r\n }\r\n if (group == 3) {\r\n $scope.fileNotLoadedYet3.splice($scope.fileNotLoadedYet3.findIndex(f => f == item.name), 1);\r\n }\r\n if (response.data.status == \"OK\") {\r\n $scope.bookingFilePath = response.data.message;\r\n\r\n if (group == 1) {\r\n $scope.attachments1Count++;\r\n }\r\n if (group == 2) {\r\n $scope.attachments2Count++;\r\n }\r\n if (group == 3) {\r\n $scope.attachments3Count++;\r\n }\r\n }\r\n else {\r\n if (group == 1) {\r\n if (!$scope.fileUploadError1)\r\n $scope.fileUploadError1 = response.data.message;\r\n $scope.uploader1.queue.splice($scope.uploader1.queue.findIndex((a: any) => a._file == item), 1)\r\n }\r\n if (group == 2) {\r\n if (!$scope.fileUploadError2)\r\n $scope.fileUploadError2 = response.data.message;\r\n $scope.uploader2.queue.splice($scope.uploader2.queue.findIndex((a: any) => a._file == item), 1)\r\n }\r\n if (group == 3) {\r\n if (!$scope.fileUploadError3)\r\n $scope.fileUploadError3 = response.data.message;\r\n $scope.uploader3.queue.splice($scope.uploader3.queue.findIndex((a: any) => a._file == item), 1)\r\n }\r\n }\r\n //$scope.uploader.clearQueue();\r\n });\r\n }\r\n };\r\n\r\n $scope.isInUploadingPhase1 = (file: any) => {\r\n return $scope.fileNotLoadedYet1.findIndex(f => f == file) > 0;\r\n }\r\n $scope.isInUploadingPhase2 = (file: any) => {\r\n return $scope.fileNotLoadedYet2.findIndex(f => f == file) > 0;\r\n }\r\n $scope.isInUploadingPhase3 = (file: any) => {\r\n return $scope.fileNotLoadedYet3.findIndex(f => f == file) > 0;\r\n }\r\n\r\n $scope.deleteFile = (file: any, group: number) => {\r\n const fp = `Temp/${$scope.customerCode}/${$scope.filePath}/${file.file.name}`;\r\n genericHelper.$http.delete('/Booking/Book/DeleteFile/' + btoa(fp)).then(res => {\r\n if (group == 1) {\r\n $scope.uploader1.removeFromQueue(file);\r\n $scope.attachments1Count--;\r\n }\r\n if (group == 2) {\r\n $scope.uploader2.removeFromQueue(file);\r\n $scope.attachments2Count--;\r\n }\r\n if (group == 3) {\r\n $scope.uploader3.removeFromQueue(file);\r\n $scope.attachments3Count--;\r\n }\r\n });\r\n };\r\n\r\n $scope.fillFields = function () {\r\n //$scope.data.email = BookingBase.fillFieldFromLocalStorage('email');\r\n //EMAIL CHECK WHITELIST\r\n //$scope.checkEmail($scope.data.email);\r\n //$scope.data.selectedTruckType = BookingBase.fillFieldFromLocalStorage('truckType');\r\n $scope.data.carrier = BookingBase.fillFieldFromLocalStorage('carrier');\r\n $scope.data.external = BookingBase.fillFieldFromLocalStorage('external');\r\n $scope.data.refname = BookingBase.fillFieldFromLocalStorage('refname');\r\n $scope.data.refnum = BookingBase.fillFieldFromLocalStorage('refnum');\r\n $scope.data.truckplate = BookingBase.fillFieldFromLocalStorage('truckplate');\r\n $scope.data.trailerplate = BookingBase.fillFieldFromLocalStorage('trailerplate');\r\n $scope.data.phonenumber = BookingBase.fillFieldFromLocalStorage('phonenumber');\r\n $scope.data.notes = BookingBase.fillFieldFromLocalStorage('notes');\r\n $scope.data.sender = BookingBase.fillFieldFromLocalStorage('sender');\r\n $scope.data.receiver = BookingBase.fillFieldFromLocalStorage('receiver');\r\n };\r\n\r\n $scope.PrintElem = function (elem: string) {\r\n const mywindow = window.open('', 'PRINT', 'height=580,width=339');\r\n mywindow.document.write('' + document.title + '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n document.getElementById(elem).innerHTML,\r\n '');\r\n\r\n mywindow.document.close(); // necessary for IE >= 10\r\n mywindow.focus(); // necessary for IE >= 10*/\r\n setTimeout(() => mywindow.print(), 500);\r\n return true;\r\n };\r\n\r\n $scope.getUploadedPdf = function (pdfName) {\r\n location.href = '/Booking/Book/downloadUploadedPdf?dir=' + $scope.filePath + '&fileName=' + encodeURIComponent(pdfName) + '&cc=' + $scope.customerCode;\r\n };\r\n\r\n $scope.checkConditions = function () {\r\n $scope.canSave = $scope.data.privacySelectedValue == 'Agree' && $scope.filteredLapses.some(l => l.Selected);\r\n };\r\n\r\n $scope.sanitize = () => {\r\n //$scope.data.phonenumber = $sanitize($scope.data.phonenumber);\r\n //$scope.data.carrier = $sanitize($scope.data.carrier);\r\n //$scope.data.refname = $sanitize($scope.data.refname);\r\n //$scope.data.refnum = $sanitize($scope.data.refnum);\r\n //$scope.data.truckplate = $sanitize($scope.data.truckplate);\r\n //$scope.data.trailerplate = $sanitize($scope.data.trailerplate);\r\n //$scope.data.sender = $sanitize($scope.data.sender);\r\n //$scope.data.receiver = $sanitize($scope.data.receiver);\r\n //$scope.data.notes = $sanitize($scope.data.notes);\r\n\r\n /////////////\r\n this.saveStep(3);\r\n /////////////\r\n };\r\n\r\n\r\n $scope.showTooltip = (fieldName: string) => {\r\n if ($scope.mandatoryFieldsList && this.actionWf) {\r\n const field = $scope.mandatoryFieldsList.find(f => (LM.ActionType)[f.Workflow] == this.actionWf).Fields.find(f => f.Field == fieldName);\r\n switch (LangService.getLanguage()) {\r\n case (\"it\"):\r\n if (field.TooltipIT)\r\n return field.TooltipIT;\r\n break;\r\n case ('en'):\r\n if (field.TooltipEN)\r\n return field.TooltipEN;\r\n break;\r\n case ('es'):\r\n if (field.TooltipES)\r\n return field.TooltipES;\r\n break;\r\n case ('de'):\r\n if (field.TooltipDE)\r\n return field.TooltipDE;\r\n break;\r\n case ('fr'):\r\n if (field.TooltipFR)\r\n return field.TooltipFR;\r\n break;\r\n case ('pl'):\r\n if (field.TooltipPL)\r\n return field.TooltipPL;\r\n break;\r\n case ('ro'):\r\n if (field.TooltipRO)\r\n return field.TooltipRO;\r\n break;\r\n case ('ru'):\r\n if (field.TooltipRU)\r\n return field.TooltipRU;\r\n break;\r\n }\r\n return fieldName;\r\n }\r\n }\r\n\r\n $scope.showLabel = (fieldName: string) => {\r\n if ($scope.mandatoryFieldsList && this.actionWf) {\r\n const field = $scope.mandatoryFieldsList.find(f => (LM.ActionType)[f.Workflow] == this.actionWf).Fields.find(f => f.Field == fieldName);\r\n switch (LangService.getLanguage()) {\r\n case (\"it\"):\r\n if (field.LabelIT)\r\n return field.LabelIT;\r\n break;\r\n case ('en'):\r\n if (field.LabelEN)\r\n return field.LabelEN;\r\n break;\r\n case ('es'):\r\n if (field.LabelES)\r\n return field.LabelES;\r\n break;\r\n case ('de'):\r\n if (field.LabelDE)\r\n return field.LabelDE;\r\n break;\r\n case ('fr'):\r\n if (field.LabelFR)\r\n return field.LabelFR;\r\n break;\r\n case ('pl'):\r\n if (field.LabelPL)\r\n return field.LabelPL;\r\n break;\r\n case ('ro'):\r\n if (field.LabelRO)\r\n return field.LabelRO;\r\n break;\r\n case ('ru'):\r\n if (field.LabelRU)\r\n return field.LabelRU;\r\n break;\r\n }\r\n return fieldName;\r\n }\r\n }\r\n $scope.showProductLabel = (fieldName: string) => {\r\n if ($scope.bookingFieldLabels) {\r\n const field = $scope.bookingFieldLabels.Fields.find(f => f.Field == fieldName);\r\n switch (LangService.getLanguage()) {\r\n case (\"it\"):\r\n if (field.LabelIT)\r\n return field.LabelIT;\r\n break;\r\n case ('en'):\r\n if (field.LabelEN)\r\n return field.LabelEN;\r\n break;\r\n case ('es'):\r\n if (field.LabelES)\r\n return field.LabelES;\r\n break;\r\n case ('de'):\r\n if (field.LabelDE)\r\n return field.LabelDE;\r\n break;\r\n case ('fr'):\r\n if (field.LabelFR)\r\n return field.LabelFR;\r\n break;\r\n case ('pl'):\r\n if (field.LabelPL)\r\n return field.LabelPL;\r\n break;\r\n case ('ro'):\r\n if (field.LabelRO)\r\n return field.LabelRO;\r\n break;\r\n case ('ru'):\r\n if (field.LabelRU)\r\n return field.LabelRU;\r\n break;\r\n }\r\n return fieldName;\r\n }\r\n }\r\n $scope.isColumnVisible = (fieldName: string) => {\r\n if ($scope.bookingFieldLabels) {\r\n const field = $scope.bookingFieldLabels.Fields.find(f => f.Field == fieldName);\r\n if (field) {\r\n return field.Visible.toUpperCase() == 'TRUE';\r\n }\r\n return false;\r\n }\r\n }\r\n $scope.isVisible = (field: string) =>\r\n $scope.mandatoryFieldsList && this.actionWf &&\r\n $scope.mandatoryFieldsList.find(f => (LM.ActionType)[f.Workflow] == this.actionWf).Fields.find(f => f.FormName == field).Visible === 'true';\r\n\r\n $scope.isMandatory = (field: string, value: string) =>\r\n $scope.mandatoryFieldsList && this.actionWf &&\r\n $scope.mandatoryFieldsList.find(f => (LM.ActionType)[f.Workflow] == this.actionWf).Fields.find(f => f.FormName == field).Mandatory === 'true' &&\r\n !$scope.validateValue(value);\r\n\r\n $scope.isEditable = (field: string) =>\r\n $scope.mandatoryFieldsList && this.actionWf &&\r\n $scope.mandatoryFieldsList.find(f => (LM.ActionType)[f.Workflow] == this.actionWf).Fields.find(f => f.FormName == field).Editable === 'true';\r\n\r\n $scope.checkEmail = (email: string) => {\r\n if (!email)\r\n return;\r\n genericHelper.$http.post('/EmailVerification/CheckEmail', { email: email, databaseId: $scope.customerCode, plantCode: $scope.plantCode }).then(res => {\r\n $scope.emailValid = res.data != EmailStatus.BlackList && res.data != EmailStatus.Existing;\r\n if (!$scope.emailValid && $scope.InvitationOnly)\r\n $uibModal.open({\r\n templateUrl: '/Templates/EmailVerification.html',\r\n scope: angular.extend($scope.$new(), {\r\n email: email,\r\n waitSecs: false,\r\n content: {\r\n title: this.Language == 'it' ?\r\n 'Indirizzo email non abilitato su magazzino' :\r\n \"Email address is not enabled for warehouse\",\r\n body: this.Language == 'it' ?\r\n `L'indirizzo email inserito non รจ presente nella lista degli utenti abilitati a prenotarsi su questo magazzino. Contattare il proprio referente.` :\r\n 'Email address is not inside the list of enabled addresses for booking. Please contact your reference person.',\r\n resend: false\r\n },\r\n }),\r\n backdrop: 'static'\r\n }).result.catch(() => location.reload());\r\n else {\r\n if ($scope.emailValid)\r\n return;\r\n $uibModal.open({\r\n templateUrl: '/Templates/EmailVerification.html',\r\n scope: angular.extend($scope.$new(), {\r\n email: email,\r\n waitSecs: false,\r\n sendEmail: function () {\r\n genericHelper.$http.post('/EmailVerification/SendEmail', { email: email, databaseId: $scope.customerCode, plantCode: $scope.plantCode })\r\n .then(res => {\r\n this.waitSecs = true;\r\n setTimeout(() => { this.waitSecs = false; this.$apply(); /*$scope.$apply();*/ }, 15000);\r\n });\r\n },\r\n content: res.data == EmailStatus.BlackList ?\r\n {\r\n title: this.Language == 'it' ?\r\n 'Indirizzo email non valido o bloccato!' :\r\n 'Email address not valid or locked!',\r\n body: this.Language == 'it' ?\r\n 'Controllare l\\'indirizzo o contattare il magazzino.' :\r\n 'Please check email address or contact warehouse.'\r\n } :\r\n {\r\n title: this.Language == 'it' ?\r\n 'Mail non verificata!' :\r\n 'Email address not verified!',\r\n body: this.Language == 'it' ?\r\n 'Abbiamo inviato una mail all\\'indirizzo indicato, controllare la propria casella postale.' :\r\n 'An email has been sent to the given email address, please check your mailbox.', resend: true\r\n }\r\n }),\r\n backdrop: 'static'\r\n }).result.catch(() => location.reload());\r\n }\r\n });\r\n };\r\n\r\n $scope.findMultipleShipments = (params: string): void => {\r\n let cust: CustomerPlant = null;\r\n if (location.pathname.indexOf(\"ByPlant\") < 0)\r\n cust = this.getCustomerPlant();\r\n else\r\n cust = {\r\n Id: $scope.plantId\r\n }\r\n\r\n $scope.prebooking = true;\r\n if ($scope.accordionGroup.anchor == '#c') {\r\n $scope.accordionGroup.hideFromScratch = true;\r\n }\r\n\r\n this.GetMultiplePreBook(cust.Id, params, $scope.plantCode).then(values => {\r\n for (let q of values) {\r\n if (moment(q.booking.selecteddate).isAfter($scope.data.selecteddate))\r\n $scope.data.selecteddate = q.booking.selecteddate;\r\n $scope.prebookings.push({ ...q.booking, shipCode: q.code, unlockCode: q.pin, products: q.products, minDate: q.booking.mindate, maxDate: q.booking.maxdate });\r\n $scope.is_prebooked = true;\r\n $scope.prebookedstatus = 1;\r\n $scope.prebooking = false;\r\n $scope.$apply();\r\n }\r\n\r\n $scope.confirmPrebooking();\r\n\r\n setTimeout(() => {\r\n $scope.prebookedstatus = 0; $scope.$applyAsync();\r\n }, 2000);\r\n\r\n\r\n }, (err) => {\r\n console.log(err);\r\n //this.prebooked = null;\r\n $scope.is_prebooked = false;\r\n $scope.prebooking = false;\r\n $scope.prebookedstatus = -1;\r\n $scope.$applyAsync();\r\n setTimeout(() => { $scope.prebookedstatus = 0; $scope.$applyAsync(); }, 2000);\r\n });\r\n };\r\n\r\n $scope.findShipments = (shipmentCode: string, unlockCode: string): void => {\r\n let cust: CustomerPlant = null;\r\n if (location.pathname.indexOf(\"ByPlant\") < 0)\r\n cust = this.getCustomerPlant();\r\n else\r\n cust = {\r\n Id: $scope.plantId\r\n }\r\n\r\n $scope.prebooking = true;\r\n if ($scope.accordionGroup.anchor == '#c') {\r\n $scope.accordionGroup.hideFromScratch = true;\r\n }\r\n this.GetPreBook(cust.Id, $scope.plantCode, shipmentCode, unlockCode).then(q => {\r\n if (moment(q.booking.selecteddate).isAfter($scope.data.selecteddate))\r\n $scope.data.selecteddate = q.booking.selecteddate;\r\n if (!$scope.prebookings.map(p => p.shipCode).find(a => a.toUpperCase() === shipmentCode.toUpperCase())) {\r\n $scope.prebookings.push({ ...q.booking, shipCode: shipmentCode, unlockCode: unlockCode, products: q.products, minDate: q.booking.mindate, maxDate: q.booking.maxdate });\r\n $scope.is_prebooked = true;\r\n $scope.prebookedstatus = 1;\r\n $scope.prebooking = false;\r\n $scope.$apply();\r\n } else {\r\n $scope.prebooking = false;\r\n }\r\n\r\n (document.getElementsByName('shipCode')[0]).value = '';\r\n (document.getElementsByName('unlockCode')[0]).value = '';\r\n setTimeout(() => {\r\n $scope.prebookedstatus = 0; $scope.$applyAsync();\r\n }, 2000);\r\n }, (err) => {\r\n console.log(err);\r\n //this.prebooked = null;\r\n $scope.is_prebooked = false;\r\n $scope.prebooking = false;\r\n $scope.prebookedstatus = -1;\r\n $scope.$applyAsync();\r\n setTimeout(() => { $scope.prebookedstatus = 0; $scope.$applyAsync(); }, 2000);\r\n });\r\n }\r\n $scope.confirmPrebooking = () => {\r\n $scope.accordionGroup.existing = false;\r\n $scope.accordionGroup.fromScratch = true;\r\n $scope.accordionGroup.hideFromScratch = false;\r\n $scope.products = [];\r\n const emails = new Set($scope.prebookings.map(p => p.email).filter(x => x != null && x.length > 0));\r\n if (emails.size > 1) {\r\n $uibModal.open({\r\n templateUrl: '/Templates/ChooseEmail.html',\r\n scope: angular.extend($scope, {\r\n emails: Array.from(emails),\r\n email: '',\r\n okClose: (email: string) => ($scope).$close(email)\r\n }),\r\n backdrop: 'static'\r\n }).result.then((res: string) => { $scope.data.email = res; $scope.checkEmail(res); });\r\n } else {\r\n $scope.data.email = $scope.prebookings.find(p => p.email)?.email;\r\n if ($scope.data.email)\r\n $scope.checkEmail($scope.data.email);\r\n }\r\n const truckTypes = new Set($scope.prebookings.map(p => p.selectedTruckType));\r\n if (truckTypes.size > 1)\r\n $scope.data.selectedTruckType = '';\r\n else\r\n $scope.data.selectedTruckType = $scope.prebookings.find(p => p.selectedTruckType)?.selectedTruckType;\r\n $scope.prebookings.forEach((p, i) => {\r\n if (Array.isArray(p.products)) {\r\n for (let i = 0; i < p.products.length; i++) {\r\n $scope.products.push(p.products[i]);\r\n $scope.atleastOne = true;\r\n }\r\n }\r\n if (i == 0) {\r\n $scope.data.phonenumber = p.phonenumber;\r\n }\r\n $scope.data.refnum += this.compareFields($scope.data.refnum, p.shipCode);\r\n $scope.data.carrier += this.compareFields($scope.data.carrier, p.carrier);\r\n $scope.data.country += this.compareFields($scope.data.country, p.country);\r\n $scope.data.external += this.compareFields($scope.data.external, p.external);\r\n $scope.data.notes += this.compareFields($scope.data.notes, p.notes);\r\n $scope.data.receiver += this.compareFields($scope.data.receiver, p.receiver);\r\n $scope.data.refname += this.compareFields($scope.data.refname, p.refname);\r\n $scope.data.sender += this.compareFields($scope.data.sender, p.sender);\r\n $scope.data.trailerplate += this.compareFields($scope.data.trailerplate, p.trailerplate);\r\n $scope.data.truckplate += this.compareFields($scope.data.truckplate, p.truckplate);\r\n if (moment(p.selecteddate).isAfter($scope.data.selecteddate))\r\n $scope.data.selecteddate = p.selecteddate;\r\n if (moment($scope.data.selecteddate).isSameOrBefore(moment(), 'd'))\r\n this.findTimeAfterFreeze($scope.plantId);\r\n if (this.max && this.max > p.maxDate || !this.max) {\r\n //this.max = p.maxDate;\r\n this.max = typeof p.maxDate === 'string' ? moment.tz(p.maxDate, this.TZ) : p.maxDate;\r\n }\r\n\r\n if (this.min && this.min < p.minDate || !this.min) {\r\n this.min = typeof p.minDate === 'string' ? moment.tz(p.minDate, this.TZ) : p.minDate;\r\n }\r\n });\r\n $scope.prebookingConfirmed = true;\r\n $scope.showAutocompleteBtn = false;\r\n };\r\n $scope.emptyLapses = () => {\r\n $scope.allLapses = [];\r\n }\r\n\r\n }\r\n\r\n protected notExpiringRules(rules: any) {\r\n if (rules == null) return false;\r\n const excl = JSON.parse(rules);\r\n if ((excl.d).every(a => !a[ExclusionRuleEnum.EndValidity]))\r\n return true;\r\n else\r\n return false;\r\n }\r\n\r\n public setOpenings(a: WorkingDay, alt?: moment.Moment) {\r\n //Set datepicker ng-model on step 1\r\n this.$scope.data.selecteddate = a.Opening.tz(this.TZ).format('YYYY/MM/DD');\r\n //Set datepicker minDate on step 1\r\n this.$scope.now = a.Opening.tz(this.TZ);\r\n this.$scope.selectedWD.Opening = this.$scope.minValidDate = (alt || a.Opening).tz(this.TZ).clone();\r\n this.$scope.selectedWD.Closing = a.Closing.clone();\r\n this.$scope.data.selectedtime = (alt || a.Opening).tz(this.TZ).clone().hours();\r\n this.$scope.$applyAsync();\r\n }\r\n\r\n //protected findTimeAfterFreeze(plantId: number) {\r\n // const nowPlusFreeze = this.now().add(this.$scope.freezeBooking, 'h');\r\n // let count = 0;\r\n // let days = this.now().add(this.$scope.freezeBooking, 'h').startOf('d');\r\n // console.log(days);\r\n // if (this.$scope.todayWD.Opening && this.$scope.todayWD.Closing) {\r\n // //if (this.now().isBefore(this.$scope.todayWD.Closing))\r\n // if (nowPlusFreeze.isBefore(this.$scope.todayWD.Closing)) {\r\n // this.setOpenings({\r\n // Opening: moment.max([this.$scope.todayWD.Opening, this.now().add(this.$scope.freezeBooking, 'h')]),\r\n // Closing: this.$scope.todayWD.Closing\r\n // });\r\n // } else {\r\n // this.genericHelper.findNextWDs(plantId, this.MAXDAYS, this.now().add(1, 'd')).then(res => {\r\n // // Sono dentro una opening\r\n // let workDay = res.filter(wd =>\r\n // BookingBase.isDateAndOpenTime(nowPlusFreeze, wd));\r\n // console.log(\"Workday:\");\r\n // console.log(workDay);\r\n // if (workDay.length > 0)\r\n // this.setOpenings(workDay[0], workDay[0].Opening.clone().hours(nowPlusFreeze.hours()));\r\n // else {\r\n // let nextWorkDay = res.filter(wd => wd.Opening.isAfter(nowPlusFreeze));\r\n // console.log(\"NextWorkDay:\");\r\n // console.log(nextWorkDay);\r\n // if (nextWorkDay.length > 0)\r\n // this.setOpenings(nextWorkDay[0]);\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n // this.genericHelper.findNextWDs(plantId, 7, this.TZ).then(res => {\r\n // let workDay = res.filter(wd =>\r\n // BookingBase.isDateAndOpenTime(nowPlusFreeze, wd));\r\n // console.log(\"Else Workday:\");\r\n // console.log(workDay);\r\n // if (workDay.length > 0)\r\n // this.setOpenings(workDay[0], workDay[0].Opening.clone().hours(nowPlusFreeze.hours()));\r\n // else {\r\n // let nextWorkDay = res.filter(wd => wd.Opening.isAfter(nowPlusFreeze));\r\n // console.log(\"Else NextWorkDay:\");\r\n // console.log(nextWorkDay);\r\n // if (nextWorkDay.length > 0)\r\n // this.setOpenings(nextWorkDay[0]);\r\n // }\r\n // });\r\n // }\r\n //}\r\n\r\n protected async findTimeAfterFreeze(plantId: number) {\r\n const nowPlusFreeze = this.now().add(this.$scope.freezeBooking, 'h');\r\n //let count = 0;\r\n if (this.$scope.todayWD.Opening && this.$scope.todayWD.Closing) {\r\n //if (this.now().isBefore(this.$scope.todayWD.Closing))\r\n if (nowPlusFreeze.isBefore(this.$scope.todayWD.Closing)) {\r\n this.setOpenings({\r\n Opening: moment.max([this.$scope.todayWD.Opening, nowPlusFreeze]),\r\n Closing: this.$scope.todayWD.Closing\r\n });\r\n } else {\r\n const res = await this.genericHelper.findNextWDs(plantId, this.MAXDAYS, this.now().add(1, 'd'));\r\n // Sono dentro una opening\r\n let workDay = res.filter(wd =>\r\n BookingBase.isDateAndOpenTime(nowPlusFreeze, wd));\r\n if (workDay.length > 0)\r\n this.setOpenings(workDay[0], workDay[0].Opening.clone().hours(nowPlusFreeze.hours()));\r\n else {\r\n let nextWorkDay = res.filter(wd => wd.Opening.isAfter(nowPlusFreeze));\r\n if (nextWorkDay.length > 0)\r\n this.setOpenings(nextWorkDay[0]);\r\n }\r\n }\r\n } else {\r\n const res = await this.genericHelper.findNextWDs(plantId, 7, this.TZ);\r\n let workDay = res.filter(wd =>\r\n BookingBase.isDateAndOpenTime(nowPlusFreeze, wd));\r\n if (workDay.length > 0)\r\n this.setOpenings(workDay[0], workDay[0].Opening.clone().hours(nowPlusFreeze.hours()));\r\n else {\r\n let nextWorkDay = res.filter(wd => wd.Opening.isAfter(nowPlusFreeze));\r\n if (nextWorkDay.length > 0)\r\n this.setOpenings(nextWorkDay[0]);\r\n }\r\n }\r\n }\r\n\r\n private static getFromLocalStorage(element: string) {\r\n try { return localStorage.getItem(element) || '' } catch { return '' };\r\n }\r\n\r\n private static fillFieldFromLocalStorage(element: string) {\r\n try { return localStorage.getItem(element) || '' } catch { return '' };\r\n }\r\n\r\n private static saveFieldInLocalStorage(element: string, value?: string) {\r\n try { localStorage.setItem(element, value || ''); } catch { }\r\n }\r\n\r\n private static isDateAndOpenTime(date: moment.Moment, wd: WorkingDay) {\r\n return date.isBetween(wd.Opening, wd.Closing, 'minute', '[)');\r\n }\r\n\r\n private static isDateAndNotOpenTime(date: moment.Moment, wd: WorkingDay) {\r\n return date.isBetween(wd.Opening, wd.Closing, 'date', '[]') && !date.isBetween(wd.Opening, wd.Closing, 'minute', '[)');\r\n }\r\n\r\n private static isBeforeOpenTime(date: moment.Moment, wd: WorkingDay) {\r\n return date.isBetween(wd.Opening, wd.Closing, 'date', '[]') && date.isBefore(wd.Opening, 'minute');\r\n }\r\n\r\n private static isAfterOpenTime(date: moment.Moment, wd: WorkingDay) {\r\n return date.isBetween(wd.Opening, wd.Closing, 'date', '[]') && date.isAfter(wd.Closing, 'minute');\r\n }\r\n\r\n private static isNotDate(date: moment.Moment, wd: WorkingDay) {\r\n return !date.isBetween(wd.Opening, wd.Closing, 'date', '[]');\r\n }\r\n\r\n private static dateNotOpeningAndBeforeFirstOpening(date: moment.Moment, openings: WorkingDay[]) {\r\n return !openings.some(o => o.Opening.isSame(date, 'date')) && date.isBefore(openings[0].Opening);\r\n }\r\n private getField(field: keyof IBookingData) {\r\n if (this.$scope.data.hasOwnProperty(field)) {\r\n const a = this.$scope.data[field];\r\n if (angular.isString(a))\r\n return a.toUpperCase();\r\n }\r\n return null;\r\n }\r\n private saveStep(step: number) {\r\n if (step == 2) {\r\n BookingBase.saveFieldInLocalStorage('email', this.$scope.data.email);\r\n BookingBase.saveFieldInLocalStorage('truckType', this.$scope.data.selectedTruckType);\r\n } else {\r\n BookingBase.saveFieldInLocalStorage('carrier', this.getField('carrier'));\r\n BookingBase.saveFieldInLocalStorage('external', this.getField('external'));\r\n BookingBase.saveFieldInLocalStorage('refname', this.getField('refname'));\r\n BookingBase.saveFieldInLocalStorage('refnum', this.getField('refnum'));\r\n BookingBase.saveFieldInLocalStorage('truckplate', this.getField('truckplate'));\r\n BookingBase.saveFieldInLocalStorage('trailerplate', this.getField('trailerplate'));\r\n BookingBase.saveFieldInLocalStorage('sender', this.getField('sender'));\r\n BookingBase.saveFieldInLocalStorage('phonenumber', this.getField('phonenumber'));\r\n BookingBase.saveFieldInLocalStorage('receiver', this.getField('receiver'));\r\n BookingBase.saveFieldInLocalStorage('notes', this.$scope.data.notes);\r\n }\r\n }\r\n protected selectLapse(lapse: ILapseAvailable) {\r\n for (let l of this.$scope.allLapses)\r\n l.Selected = false;\r\n lapse.Selected = true;\r\n return moment.tz(this.$scope.data.selecteddate, 'YYYY/MM/DD', this.TZ).isSame(lapse.From, 'd');\r\n }\r\n private static SortICodeNameOrder(a: T[]) {\r\n return a.sort((a, b) => a.Order - b.Order);\r\n }\r\n private static MapSortICodeNameOrder(a: T[]): ICodeNameOrder[] {\r\n return LM.BookingBase.SortICodeNameOrder(a.map(d => ({ Code: d.Code.trim(), Name: d.Name.trim(), Order: d.Order })));\r\n }\r\n\r\n protected TZ: string;\r\n\r\n protected GetD(plantId: number) {\r\n return this.$http.post('/Booking/Book/GetD', { PlantId: plantId }).then(res => {\r\n this.$scope.productGroupsValues = LM.BookingBase.SortICodeNameOrder(res.data.productGroups.map(pg => ({ Code: pg.Code.trim(), Name: pg.Name.trim(), Value: 0, Order: pg.Order, Limit: pg.Limit })));\r\n this.$scope.truckTypes = LM.BookingBase.MapSortICodeNameOrder(res.data.trucks);\r\n this.$scope.destinations = LM.BookingBase.MapSortICodeNameOrder(res.data.destinations);\r\n this.$scope.tripTypes = LM.BookingBase.MapSortICodeNameOrder(res.data.tripTypes);\r\n this.$scope.customerCode = res.data.customerCode;\r\n this.$scope.selectedWD.Opening = this.$scope.todayWD.Opening = res.data.openingHour ? TargetToLocal(res.data.openingHour, res.data.Tz)/*moment.utc(res.data.openingHour)*/ : null;\r\n this.$scope.selectedWD.Closing = this.$scope.todayWD.Closing = res.data.closingHour ? TargetToLocal(res.data.closingHour, res.data.Tz)/*moment.utc(res.data.closingHour)*/ : null;\r\n this.$scope.docksLimit = res.data.maxDocks;\r\n this.$scope.freezeBooking = res.data.FreezeBooking;\r\n this.$scope.loadUnload = this.$scope.origLoadUnload = this.$scope.loadUnload.filter(i => res.data.workflowEnabled.some(a => LM.ActionType[a] == i.name));\r\n this.$scope.loadUnloadEnabled = res.data.workflowEnabled.indexOf(LM.ActionType.LoadUnload) >= 0;\r\n this.TZ = res.data.Tz;\r\n $('#localDestTime').text(moment.tz(res.data.Tz).format('YYYY/MM/DD HH:mm'));\r\n this.$scope.InvitationOnly = res.data.InvitationOnly;\r\n });\r\n }\r\n\r\n protected getCustomerPlant() {\r\n return this.$scope.docks.find(d => d.Id == this.$scope.hub_id);\r\n }\r\n\r\n protected async GetMultiplePreBook(plantId: number, prebookings: string, code: string): Promise {\r\n const values = await this.$http.post<{\r\n Code: string,\r\n Pin: string,\r\n Json: string\r\n }[]>('/booking/api/prebook/MultiplePrebookCheck', {\r\n cust: plantId,\r\n prebookings: prebookings,\r\n });\r\n\r\n let res: PrebookingMultiple[] = [];\r\n for (let obj of values.data) {\r\n let q = JSON.parse(obj.Json);\r\n const date = moment.utc(q.booking.date);\r\n const datepart = date.isValid() ? {\r\n selecteddate: date.format('YYYY/MM/DD'),\r\n selectedtime: date.hours()\r\n } : {\r\n selecteddate: null,\r\n selectedtime: 0\r\n };\r\n\r\n let tmp: PrebookingMultiple = {\r\n code: obj.Code,\r\n pin: obj.Pin,\r\n booking: {\r\n ...datepart,\r\n country: '',\r\n email: q.booking?.email,\r\n selectedTruckType: q.booking?.trucktype,\r\n carrier: q.booking?.carrier,\r\n refname: q.booking?.refname,\r\n external: q.booking?.external,\r\n refnum: code,\r\n truckplate: q.booking?.truckplate,\r\n trailerplate: q.booking?.trailerplate,\r\n sender: q.booking?.sender,\r\n phonenumber: q.booking?.phone,\r\n receiver: q.booking?.receiver,\r\n notes: q.booking?.note,\r\n privacySelectedValue: '',\r\n mindate: q.booking.mindate ? q.booking.mindate : null,\r\n //maxdate: q.booking.maxdate ? MoveFromUTCToLocal(q.booking.maxdate, this.TZ) : null\r\n maxdate: q.booking.maxdate ? q.booking.maxdate : null\r\n },\r\n products: q.products?.map((a: any) => ({\r\n Code: a.code,\r\n Value: a.value,\r\n Type: a.type,\r\n TripType: a.triptype,\r\n Destination: a.destination\r\n }))\r\n };\r\n\r\n res.push(tmp);\r\n }\r\n\r\n return res;\r\n }\r\n\r\n protected async GetPreBook(plantId: number, code: string, ship: string, pin: string): Promise<{ booking: IBookingData & { mindate: moment.Moment, maxdate: moment.Moment, freezingHours: number }, products: BookingProduct[] }> {\r\n //int cust, string plant, string shipref, string pin\r\n const q = await this.$http.post<{\r\n booking: {\r\n email: string;\r\n date: string | null;\r\n trucktype: string;\r\n carrier: string;\r\n refname: string;\r\n external: string;\r\n truckplate: string;\r\n trailerplate: string;\r\n sender: string;\r\n phone: string;\r\n receiver: string;\r\n note: string;\r\n mindate: string;\r\n maxdate: string;\r\n freezingHours: number\r\n };\r\n products?: {\r\n code: string;\r\n value: number;\r\n type: string;\r\n triptype: string;\r\n destination: string;\r\n }[];\r\n }>('/booking/api/prebook/post', {\r\n cust: plantId,\r\n plant: code,\r\n shipref: ship,\r\n pin: pin\r\n });\r\n const date = moment.utc(q.data.booking.date);\r\n const datepart = date.isValid() ? {\r\n selecteddate: date.format('YYYY/MM/DD'),\r\n selectedtime: date.hours()\r\n } : {\r\n selecteddate: null,\r\n selectedtime: 0\r\n };\r\n return {\r\n booking: {\r\n ...datepart,\r\n country: '',\r\n email: q.data.booking?.email,\r\n selectedTruckType: q.data.booking?.trucktype,\r\n carrier: q.data.booking?.carrier,\r\n refname: q.data.booking?.refname,\r\n external: q.data.booking?.external,\r\n refnum: code,\r\n truckplate: q.data.booking?.truckplate,\r\n trailerplate: q.data.booking?.trailerplate,\r\n sender: q.data.booking?.sender,\r\n phonenumber: q.data.booking?.phone,\r\n receiver: q.data.booking?.receiver,\r\n notes: q.data.booking?.note,\r\n privacySelectedValue: '',\r\n mindate: q.data.booking.mindate ? moment(q.data.booking.mindate) : null,\r\n //maxdate: q.data.booking.maxdate ? MoveFromUTCToLocal(q.data.booking.maxdate, this.TZ) : null,\r\n maxdate: q.data.booking.maxdate ? moment(q.data.booking.maxdate) : null,\r\n freezingHours: q.data.booking.freezingHours\r\n },\r\n products: q.data.products?.map(a => ({\r\n Code: a.code,\r\n Value: a.value,\r\n Type: a.type,\r\n TripType: a.triptype,\r\n Destination: a.destination\r\n }))\r\n };\r\n }\r\n\r\n private compareFields(field: string, newValue: string) {\r\n if (!field && newValue != null && newValue != 'undefined')\r\n field = newValue?.toUpperCase();\r\n else if (newValue != null && newValue != 'undefined' && field?.toUpperCase().trim().indexOf(newValue?.toUpperCase().trim()) < 0)\r\n field = ` - ${newValue.toUpperCase()}`;\r\n else\r\n field = '';\r\n return field;\r\n }\r\n\r\n //private omit = >(\r\n // obj: T, ...keys: string[]\r\n //) => (\r\n // Object.fromEntries(\r\n // Object.entries(obj)\r\n // .filter(([key]) => !keys.includes(key))\r\n // ) as K\r\n //)\r\n }\r\n\r\n globalApp.directive('autoSelect', () => ({\r\n restrict: 'A',\r\n require: 'uiSelect',\r\n link: function ($scope, _1, _2, $select: any) {\r\n angular.element(function () { // Evaluated when DOM is ready\r\n $scope.$evalAsync(function () { // Execute its callback within the current digest cycle if one is occurring.\r\n // Otherwise a new digest cycle will start executing the callback.\r\n if ($select.items.length === 1) {\r\n $select.selected = $select.items[0];\r\n }\r\n });\r\n });\r\n }\r\n }));\r\n globalApp\r\n .filter('formattz', () => (a: moment.Moment, tz: string) => moment.tz(a, tz).format('YYYY/MM/DD HH:mm'))\r\n .filter('showName', () => (code: string, values: { Code: string, Name: string }[]) => values.find((val) => val.Code == code).Name);\r\n\r\n}\r\n","declare var LOADMANAGERURL: string;\r\ndeclare var PLANTCODE: string;\r\ndeclare var CUSTOMERID: string;\r\ndeclare const HEADERCOLOR: string;\r\nmodule BookByPlant {\r\n\r\n interface IBookByPlantScope extends IBookScope {\r\n removeUndefined: () => void;\r\n loc: any;\r\n next: (plantCode: string) => void;\r\n ParseLocation: (location: CustomerPlant) => void;\r\n getBookingAvail: () => void;\r\n showDanger: boolean;\r\n }\r\n\r\n class BookByPlantController extends LM.BookingBase {\r\n constructor(public $scope: IBookByPlantScope, $http: ng.IHttpService, WizardHandler: any, $uibModal: any, FileUploader: any, genericHelper: LM.GenericHelperService, $window: ng.IWindowService, $timeout: ng.ITimeoutService) {\r\n super($scope, genericHelper, $uibModal, WizardHandler, FileUploader, $http);\r\n this.$scope.showDanger = false;\r\n $scope.loadUnload = [\r\n { name: 'Load', img: '../../Content/Icons/load.png' },\r\n { name: 'Unload', img: '../../Content/Icons/unload.png' }\r\n ];\r\n $scope.totQty = 0;\r\n $scope.isDisabledSelectFromExistingShipment = false;\r\n $scope.customerCode = CUSTOMERID;\r\n $scope.plantCode = PLANTCODE;\r\n $scope.firstTitle = '1';\r\n $scope.secondTitle = '2';\r\n if (window.location !== window.parent.location) {\r\n // The page is in an iframe\r\n (document.getElementsByClassName('navbar navbar-primary navbar-fixed-top').item(0)).style.display = 'none';\r\n document.body.style.paddingTop = '0px';\r\n } else {\r\n // The page is not in an iframe\r\n }\r\n $scope.emailRegex = genericHelper.emailRegex;\r\n\r\n var _this = this;\r\n $('#hamburger-icon').css('color', checkHeaderColor(HEADERCOLOR));\r\n \r\n $scope.ParseLocation = function (location: CustomerPlant) {\r\n let anchor = window.location.hash;\r\n $scope.accordionGroup.anchor = \"\";\r\n if (anchor && anchor.length == 2) {\r\n if (anchor == \"#b\") {\r\n $scope.accordionGroup.existing = true;\r\n $scope.accordionGroup.fromScratch = false;\r\n $scope.accordionGroup.anchor = \"#b\";\r\n } else if (anchor == \"#c\") {\r\n $scope.accordionGroup.existing = true;\r\n $scope.accordionGroup.fromScratch = false;\r\n $scope.accordionGroup.hideFromScratch = true;\r\n $scope.accordionGroup.anchor = \"#c\";\r\n }\r\n }\r\n if (location) {\r\n $scope.loc = location;\r\n $scope.plantId = location.Id;\r\n genericHelper.$http.post('/Booking/Book/GetSupportMail', { PlantId: $scope.plantId }).then(function (response) {\r\n if (response.data != \"\" && response.data) {\r\n $('#help-desk-by-plant').attr(\"href\", \"mailto:\" + response.data)\r\n }\r\n });\r\n\r\n $scope.InvitationOnly = location.InvitationOnly;\r\n $http.get('/booking/book/GetMandatoryFields?PlantCode=' + $scope.loc.ExternalCode + '&CustId=' + $scope.customerCode).then(res => {\r\n $scope.mandatoryFieldsList = res.data;\r\n });\r\n $http.get('/booking/book/GetBookingFieldLabels?PlantCode=' + $scope.plantCode + '&CustId=' + $scope.customerCode).then(res => {\r\n $scope.bookingFieldLabels = res.data;\r\n });\r\n\r\n $scope.plantCode = $scope.loc.ExternalCode;\r\n _this.GetD($scope.loc.Id).then(() => {\r\n _this.findTimeAfterFreeze($scope.loc.Id);\r\n $scope.initialDateTime = moment($scope.data.selecteddate).add($scope.data.selectedtime, \"h\");\r\n window.parent.postMessage(\"Loaded\", \"*\");\r\n\r\n if (window.location.search.indexOf('prebookings=') >= 0) {\r\n let tmp = window.location.search.split(\"prebookings=\");\r\n if (tmp.length > 0) {\r\n $scope.findMultipleShipments(tmp[1]);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.allowPdfDownload = false;\r\n $scope.canSave = false;\r\n $scope.privacyStatement = '';\r\n\r\n $scope.hubSR = genericHelper.createSignalRHub();\r\n\r\n $window.addEventListener('message', (event) => {\r\n if (event.data != 'recaptcha-setup' && event.data != 'Loaded') {\r\n const loader = $uibModal.open({\r\n template: '',\r\n backdrop: 'static',\r\n windowClass: 'loader'\r\n });\r\n $timeout(() => {\r\n console.log(`Selected date: ${moment($scope.data.selecteddate, 'YYYY/MM/DD').format()}`);\r\n console.log('MEssage event: ' + moment().format());\r\n $scope.isDisabledSelectFromExistingShipment = true;\r\n try {\r\n const p = JSON.parse(event.data);\r\n console.log(`Planned check in: ${MoveFromUTCToLocal(moment(p.plannedCheckIn), this.TZ).format()}`);\r\n $scope.data.refname = p.fatherShipment;\r\n $scope.data.refnum = p.sonShipment;\r\n $scope.data.external = p.external;\r\n $scope.data.sender = p.shipmentCreator ? p.shipmentCreator.email : '';\r\n $scope.data.receiver = p.receiver.name + ' ' + p.receiver.address;\r\n $scope.data.selectedTruckType = p.truckType;\r\n $scope.data.notes = p.notes;\r\n $scope.data.truckplate = p.truckPlate;\r\n $scope.data.trailerplate = p.trailerPlate;\r\n // 30/11/2021 Deciso che minDate non vale come avviso ma diventa vincolo\r\n //this.min = moment.utc(p.firstValidDate);\r\n $scope.data.selecteddate = moment.max(moment($scope.data.selecteddate, 'YYYY/MM/DD'), MoveFromUTCToLocal(moment(p.plannedCheckIn), this.TZ)).format('YYYY/MM/DD');\r\n setTimeout(() => { $(\"#startdate input\").val(moment.max(moment($scope.data.selecteddate, 'YYYY/MM/DD'), MoveFromUTCToLocal(moment(p.plannedCheckIn), this.TZ)).format('YYYY/MM/DD')) }, 100);\r\n this.max = moment.utc(p.lastValidTime);\r\n $scope.data.carrier = p.vector ? p.vector.sapCode : '';\r\n $scope.atleastOne = true;\r\n if (p.items)\r\n $scope.products = p.items;\r\n $scope.data.email = p.email;\r\n $scope.checkEmail(p.email);\r\n $scope.showAutocompleteBtn = false;\r\n if (p.firstValidTime && p.freezingHours) {\r\n const max = moment.max(this.now().clone().add(p.freezingHours, 'h'), moment.tz(p.firstValidTime, this.TZ));\r\n $scope.freezeBooking = Math.ceil(max.diff(this.now(), 'm') / 60);\r\n this.findTimeAfterFreeze($scope.loc.Id);\r\n $scope.$evalAsync();\r\n }\r\n //Iniettato solo freezing hours\r\n else if (p.freezingHours && !p.firstValidTime) {\r\n $scope.freezeBooking = p.freezingHours;\r\n this.findTimeAfterFreeze($scope.loc.Id);\r\n $scope.$evalAsync();\r\n }\r\n //Iniettato solo min date\r\n else if (!p.freezingHours && p.firstValidTime) {\r\n $scope.freezeBooking = moment.tz(p.firstValidTime, this.TZ).diff(this.now(), 'h');\r\n this.findTimeAfterFreeze($scope.loc.Id);\r\n $scope.$evalAsync();\r\n }\r\n } catch (exception) {\r\n console.error(\"Exception: \", exception);\r\n console.error(\"Event data:\", event.data);\r\n } finally {\r\n loader.close();\r\n }\r\n }, 2000);\r\n }\r\n }, false);\r\n\r\n $scope.next = function (plantCode: string) {\r\n WizardHandler.wizard().next();\r\n $scope.plantCode = plantCode;\r\n };\r\n $scope.$watch((a: IBookScope) => a.data.selecteddate, (newValue?: string) => { //YYYY/MM/DD\r\n const plant = $scope.loc;\r\n const now = moment.tz(this.TZ);\r\n const parsed = moment.tz(newValue, \"YYYY/MM/DD\", this.TZ);\r\n let selected = newValue ? parsed : now;\r\n if (selected.isSame(now, 'day'))\r\n selected = now.clone().startOf('day');\r\n\r\n if ($scope.minValidDate.isSame(parsed, 'date'))\r\n this.findTimeAfterFreeze(plant.Id)\r\n else {\r\n if (plant && !$scope.selectedWD)\r\n $http.get(`/Book/GetWorkingTime?plantId=${plant.Id}&date=${selected.toISOString()}`).then(res => {\r\n if (moment.tz(res.data.openingHour, this.TZ) > now.clone().add(this.$scope.freezeBooking, 'h')) {\r\n this.$scope.selectedWD.Opening = (moment.tz(res.data.openingHour, this.TZ)).tz(this.TZ).clone();\r\n this.$scope.selectedWD.Closing = moment.tz(res.data.closingHour, this.TZ);\r\n this.$scope.data.selectedtime = (moment.tz(res.data.openingHour, this.TZ)).tz(this.TZ).clone().hours();\r\n }\r\n else {\r\n this.$scope.selectedWD.Opening = now.clone().add(this.$scope.freezeBooking, 'h');\r\n this.$scope.selectedWD.Closing = moment.tz(res.data.closingHour, this.TZ);\r\n this.$scope.data.selectedtime = now.clone().add(this.$scope.freezeBooking, 'h').hours();\r\n }\r\n\r\n $scope.$evalAsync();\r\n $scope.docksLimit = res.data.maxDocks;\r\n });\r\n else if (newValue)\r\n\r\n $http.get(`/Book/GetWorkingTime?plantId=${plant.Id}&date=${selected.toISOString()}`).then(res => {\r\n\r\n if (moment.tz(res.data.openingHour, this.TZ) > now.clone().add(this.$scope.freezeBooking, 'h')) {\r\n this.$scope.selectedWD.Opening = (moment.tz(res.data.openingHour, this.TZ)).tz(this.TZ).clone();\r\n this.$scope.selectedWD.Closing = moment.tz(res.data.closingHour, this.TZ);\r\n this.$scope.data.selectedtime = (moment.tz(res.data.openingHour, this.TZ)).tz(this.TZ).clone().hours();\r\n }\r\n else {\r\n this.$scope.selectedWD.Opening = now.clone().add(this.$scope.freezeBooking, 'h');\r\n this.$scope.selectedWD.Closing = moment.tz(res.data.closingHour, this.TZ);\r\n this.$scope.data.selectedtime = now.clone().add(this.$scope.freezeBooking, 'h').hours();\r\n }\r\n $scope.$evalAsync();\r\n $scope.docksLimit = res.data.maxDocks;\r\n });\r\n }\r\n });\r\n\r\n $scope.navigation_wizard_enabled = function () {\r\n return WizardHandler.wizard().currentStep().wzTitle !== 'End';\r\n };\r\n\r\n\r\n /**\r\n * Fix per rimozione UNDEFINED injectata in alcuni campi\r\n * */\r\n $scope.removeUndefined = function () {\r\n $scope.data.refname = $scope.data.refname?.replace('undefined', '');\r\n $scope.data.refnum = $scope.data.refnum?.replace('undefined', '');\r\n $scope.data.external = $scope.data.external?.replace('undefined', '');\r\n $scope.data.sender = $scope.data.sender?.replace('undefined', '');\r\n $scope.data.receiver = $scope.data.receiver?.replace('undefined', '');\r\n $scope.data.notes = $scope.data.notes?.replace('undefined', '');\r\n $scope.data.truckplate = $scope.data.truckplate?.replace('undefined', '');\r\n $scope.data.trailerplate = $scope.data.trailerplate?.replace('undefined', '');\r\n $scope.data.carrier = $scope.data.carrier?.replace('undefined', '');\r\n }\r\n //const unregister = $scope.$watch((a: IBookScope) => a.data.selecteddate, (newValue?: string) => { //YYYY/MM/DD\r\n // const plant = $scope.loc;\r\n // const now = moment.tz(this.TZ);\r\n // const parsed = moment.tz(newValue, \"YYYY/MM/DD\", this.TZ);\r\n // let selected = newValue ? parsed : now;\r\n // if (selected.isSame(now, 'day'))\r\n // selected = now.startOf('day');\r\n // if (plant && !$scope.selectedWD)\r\n // $http.get(`/Book/GetWorkingTime?plantId=${plant.Id}&date=${selected.toISOString()}`).then(res => {\r\n // $scope.selectedWD.Opening = moment.tz(res.data.openingHour, this.TZ);\r\n // $scope.selectedWD.Closing = moment.tz(res.data.closingHour, this.TZ);\r\n // $scope.$evalAsync();\r\n // $scope.docksLimit = res.data.maxDocks;\r\n\r\n // });\r\n // else if (newValue)\r\n // //if (!$scope.selectedWD.Opening.isSame(parsed, 'date') && !$scope.minValidDate.isSame(parsed, 'date'))\r\n // $http.get(`/Book/GetWorkingTime?plantId=${plant.Id}&date=${selected.toISOString()}`).then(res => {\r\n // $scope.selectedWD.Opening = moment.tz(res.data.openingHour, this.TZ);\r\n // $scope.selectedWD.Closing = moment.tz(res.data.closingHour, this.TZ);\r\n // $scope.$evalAsync();\r\n // $scope.docksLimit = res.data.maxDocks;\r\n // });\r\n // else if ($scope.minValidDate && $scope.minValidDate.isSame(parsed, 'date'))\r\n // this.findTimeAfterFreeze(plant.Id);\r\n //});\r\n\r\n }\r\n\r\n protected selectLapse(lapse: ILapseAvailable) {\r\n this.$scope.showDanger = !this.$scope.bloppo(lapse.From);\r\n return super.selectLapse(lapse);\r\n }\r\n }\r\n\r\n globalApp.requires.push('mgo-angular-wizard', 'ngSanitize', 'ui.select', 'vcRecaptcha', 'ui.bootstrap', 'angularFileUpload', 'ngMessages', 'ngfallbackSrc');\r\n globalApp.controller('BookByPlantController', [\r\n '$scope',\r\n '$http',\r\n 'WizardHandler',\r\n '$uibModal',\r\n 'FileUploader',\r\n 'genericHelper',\r\n '$window',\r\n '$timeout',\r\n BookByPlantController,\r\n ]);\r\n}"]}