biscript: 21
This data as json
| id | active | data | dateLastModified | description | name | note | typeId | fbVersion | fbName | published |
|---|---|---|---|---|---|---|---|---|---|---|
| 21 | _binary | {% Script Util %} //Filter Variables var dailyCapacityParam = $NUM{Daily_Capacity}; var parameterCatName = "$TEXT{Calendar_Category|%}"; parameterCatName = "\'" + parameterCatName.toUpperCase() + "\'"; console.log("CatName = " + parameterCatName); var defaultView, parameterDefaultView = "$LIST{Default_View|^Week,Month,Day}"; switch (parameterDefaultView) { case "Month": defaultView = "month"; break; case "Week": defaultView = "agendaWeek"; break; case "Day": defaultView = "agendaDay"; break; } var DailyCapacities = {}; var calendarDate = moment("$DATE{Date|Today}"); // CHANGE WOITEM DATE SCHEDULED API CALL function updateWOItem(event, view) { let eventStart = moment(event.start).format('YYYY-MM-DD[T]HH:mm:ss'); let eventEnd = moment(event.end).format('YYYY-MM-DD[T]HH:mm:ss'); if (eventStart == null) { return "No Start Date Found"; } console.log("\r\nEvent Start = " + eventStart + " Event End = " + eventEnd); let WONum = {GetWorkOrderRq: {WorkOrderNumber: event.wonum}}; console.log("\r\nEvent WO Num = " + WONum); let WOAPIObject = JSON.parse(runApiRequest('GetWorkOrderRq', JSON.stringify(WONum))); if (WOAPIObject.statusCode == 1001) { console.log("\r\nUnable to parse API request. WO Num = " + WONum); return WOAPIObject; } else { let WO = WOAPIObject.GetWorkOrderRs.WO; // CHECK TO SEE IF THE EVENT HAS AN END DATE if (!moment(event.end).isValid()) { // CHANGE EACH WO ITEM DATE SCHEDULED for (i = 0; i < WO.WOItems; i++) { WO.WOItems[i].DateScheduled = eventStart; } // CHANGE WO DATE SCHEDULED/DATE SCHEDULED TO START console.log("Event end was null"); WO.DateScheduled = eventStart; WO.DateScheduledToStart = eventStart; } else { console.log("Event end was not null"); for (i = 0; i < WO.WOItems; i++) { WO.WOItems[i].DateScheduled = eventStart; } WO.DateScheduled = eventEnd; WO.DateScheduledToStart = eventStart; } // FORMAT REQUEST OBJECT let WONewDate = {SaveWorkOrderRq: {'WO': WO}}; // UPDATE THE WORK ORDER AND WO ITEMS let SaveWorkOrderRs = runApiRequest("SaveWorkOrderRq", JSON.stringify(WONewDate)); if (SaveWorkOrderRs.statusCode == 1000) { console.log("Work Order " + event.wonum + " has been successfully updated to start date and end date " + eventStart); } else { console.log("SaveWorkOrderRs = \r\n" + JSON.stringify(SaveWorkOrderRs)); } } } var query = "SELECT bom.num AS bomnum,mo.id AS moid, mo.num AS monum, wo.num AS wonum, moitem.description AS moitemdesc," + "\r\nCOALESCE(bom.estimatedDuration,0) * COALESCE(wo.qtyTarget,0) AS estimatedDuration, COALESCE(wo.datescheduled,moitem.datescheduled) AS datescheduled, COALESCE(wo.datescheduledtostart,moitem.datescheduledtostart) datescheduledtostart, calcat.color AS catcolor," + "\r\ncalcat.name AS catname, wo.id AS woid" + "\r\n" + "\r\nFROM moitem" + "\r\nLEFT JOIN mo ON moitem.moid = mo.id" + "\r\nLEFT JOIN wo ON wo.moitemid = moitem.id" + "\r\nLEFT JOIN bom ON moitem.bomid = bom.id" + "\r\nLEFT JOIN calcategory AS calcat ON wo.calcategoryid = calcat.id" + "\r\n" + "\r\nWHERE moitem.typeid = 50" + "\r\nAND wo.num IS NOT NULL" + "\r\nAND moitem.statusid IN (10,20,30,40)" + "\r\nAND IF(" + parameterCatName + " = '%', 1=1,UPPER(calcat.name) LIKE " + parameterCatName + ")" + "\r\nORDER BY moitem.datescheduled"; var moitems = JSON.parse(runQuery(query)); var events = []; var dayTotals = {}; var currentView = "Month"; var clickTimer, doubleClick; var tUOM; var tUOMSelection = "$LIST{UOM|hr,min}"; switch (tUOMSelection) { case "hr": tUOM = 60; break; case "min": tUOM = 1; break; } var showBOM = $CHECK{Show_Work_Order_Description_in_Title|false}; for (i = 0; i < moitems.length; i++) { let duration = moitems[i].estimatedduration / tUOM; // FORMAT THE TITLE OF THE EVENT AND THEN ADD THE EVENT TO THE LIST let title; if (showBOM) { title = duration + " - " + moitems[i].wonum + " : " + moitems[i].bomnum; } else { title = duration + " - " + moitems[i].wonum; } let catColor = "#" + moitems[i].catcolor; let event = { 'id': moitems[i].woid, 'title': title, 'start': moitems[i].datescheduled, 'end': moitems[i].datescheduled, allDay: true, monum: moitems[i].monum, wonum: moitems[i].wonum, "duration": duration, "color": catColor }; events.push(event); // CALCULATE DAILY DURATION TOTALS let currentDay = moment(moitems[i].datescheduled).toDate(); currentDay = moment(currentDay).format('YYYY-MM-DD'); if (dayTotals[currentDay] != null) { dayTotals[currentDay] += duration; } else { dayTotals[currentDay] = duration; } } // GENERATE THE ACTUAL CALENDAR $(function () { $('#calendar').fullCalendar({ header: { left: 'prev,next today', center: 'title', right: 'month,agendaWeek,agendaDay' }, eventStartEditable: true, eventLimit: true, // when too many events in a day, show the popover events: events, defaultView: defaultView, defaultDate: calendarDate, // THIS IS THE FUNCTION THAT WILL RUN FOR EACH DAY EVERY TIME IT NEEDS TO RENDER A DAY ex.Switching views, or if they drag and drop an item dayRender: function (date, cell, view) { // SET MY INDEX AND MY JQUERY OBJECT var ddate = moment(date).format('YYYY-MM-DD'); var dayNumber = "*[data-date=\"" + ddate + "\"] span"; let dailyCapacity; if (UTIL.objContains(DailyCapacities, ddate)) { dailyCapacity = DailyCapacities[ddate]; console.log("\r\nUsed capacity from object " + DailyCapacities[ddate]); } else { dailyCapacity = dailyCapacityParam; console.log("\r\nUsed Param Capacity " + dailyCapacityParam); } // CHECK TO SEE IF THE DATE HAS A DURATION. IF IT DOES THEN CHANGE THE HEADER var idx = cell.index() + 1; let viewHeader; $(dayNumber).html(function (i, origText) { switch (view.name) { case "month": viewHeader = "<span style=float:center; text-align = center>" + (dayTotals[ddate] || "0") + "/ " + dailyCapacity + "    </span><span style = font-size:16px><b>" + origText + "</b></span>"; break; case "agendaWeek": viewHeader = "<span style=text-align:center;font-size:16px><b> " + origText + "</b></span><br><span style=float:center; text-align = center>" + (dayTotals[ddate] || "0") + "/ " + dailyCapacity + "\r\n</span>"; break; case "agendaDay": viewHeader = "<span style=float:center; text-align = center>" + (dayTotals[ddate] || "0") + "/ " + dailyCapacity + " " + origText + "</b></span>"; break; } return viewHeader; }) // CHECK TO SEE IF THE DAYS TOTAL DURATION IS OVER THE SET MAX. IF IT IS THEN MAKE THE BACKGROUND RED if (dayTotals[ddate] > dailyCapacity) { idx = cell.index() + 1; cell.css("background-color", "#ff3333"); $(".fc-time-grid .fc-bg table tbody tr td:nth-child(" + idx + ")").css("background-color", "#ff9999"); } let numberInputObj = "#" + ddate $(numberInputObj).on('keyup mouseup', function () { let num = $(this).val(); let day = $(this).attr('id'); DailyCapacities[day] = num; console.log("\r\nDaily Capacity Object = " + JSON.stringify(DailyCapacities)); $('#calendar').fullCalendar('prev'); $('#calendar').fullCalendar('next'); }); }, eventClick: function (event) { let monum = event.monum; openModule("Manufacture Order", monum); }, eventMouseover: function (event) { let wonum = event.wonum; let rgquery = "SELECT woitem.sortid, CONCAT(part.num, ' - ', part.description) AS woitempart, woitem.qtytarget AS rgqty, wo.num AS wonum, moitem.description AS woitemdescription, COALESCE(calcat.name,'') AS calcategory " + "\r\n" + "\r\n FROM woitem" + "\r\n JOIN part ON part.id = woitem.partid AND woitem.typeid = 20" + "\r\n JOIN wo ON woitem.woid = wo.id" + "\r\n LEFT OUTER JOIN moitem ON wo.moitemid = moitem.id" + "\r\nLEFT JOIN calcategory AS calcat ON wo.calcategoryid = calcat.id" + "\r\n" + "\r\n WHERE wo.num LIKE " + JSON.stringify(wonum) + "\r\n ORDER BY woitem.sortid"; let woitems = JSON.parse(runQuery(rgquery)); let headers = ['Part', 'Qty Needed']; let dontShow = []; let title = woitems[0].wonum + " - " + woitems[0].woitemdescription + "\r\n" + woitems[0].calcategory; for (let i = 0; i < woitems.length; i++) { console.log("deleted wonum = " + delete woitems[i].wonum); console.log("deleted woitemdescription = " + delete woitems[i].woitemdescription); console.log("deleted calcategory = " + delete woitems[i].calcategory); delete woitems[i].sortid; } tooltip = '<div class="tooltiptopicevent" style="width:auto;height:auto;background:white;position:absolute;z-index:10001;padding:10px 10px 10px 10px ; line-height: 200%;">' + "<table class='table'><thead><td style=text-align:center><h3>" + title + "</h3></td></thead> <tbody border=1 id=\"2ltip\"> " + UTIL.makeTable(woitems, headers, dontShow) + "</tbody></table>"; $("body").append(tooltip); $(this).mouseover(function (e) { $(this).css('z-index', 10000); $('.tooltiptopicevent').fadeIn('500'); $('.tooltiptopicevent').fadeTo('10', 1.9); }).mousemove(function (e) { $('.tooltiptopicevent').css('top', e.pageY + 10); $('.tooltiptopicevent').css('left', e.pageX + 20); }).mouseleave(function (e) { $('.tooltiptopicevent').remove(); }); }, eventDrop: function (event, delta, revertFunc, jsEvent, ui, view) { updateWOItem(event, view); // CALCULATE NEW AND OLD DATES let newDate = moment(event.start).format('YYYY-MM-DD'); let oldDate = event.start.subtract(delta).format('YYYY-MM-DD'); console.log("\r\nNew Date: " + newDate + "\r\nOld Date: " + oldDate); // ADD THE DURATION TO THE NEW DAY'S TOTAL. HAVE TO CHECK TO SEE IF THE DAY ALREADY EXISTS if (UTIL.objContains(dayTotals, newDate)) { dayTotals[newDate] += event.duration; } else { dayTotals[newDate] = event.duration; } // SUBTRACT THE DURATION FROM THE OLD DAY. THEN CHECK TO SEE IF THE NEW TOTAL IS 0. IF IT IS THEN DELETE IT dayTotals[oldDate] -= event.duration; if (dayTotals[oldDate] == 0) { delete dayTotals[oldDate]; } // UNFORTUNATELY IT ISN'T POSSIBLE TO JUST RELOAD A SINGLE DAY. SO THIS RELOADS THE WHOLE CALENDAR AS IF YOU PRESSED THE PREV AND NEXT BUTTONS $('#calendar').fullCalendar('prev'); $('#calendar').fullCalendar('next'); }, eventResize: function (event, jsEvent, ui, view) { updateWOItem(event, view); }, dayClick: function (date, jsEvent, view) { // GET THE BEGINNING AND END OF WEEK FOR WEEK VIEW var singleClick = date.format('YYYY-MM-DD HH:mm:ss'); if (doubleClick == singleClick) { switch (view.name) { case "month": $('#calendar').fullCalendar('gotoDate', date); $('#calendar').fullCalendar('changeView', 'agendaWeek'); break; case "agendaWeek": $('#calendar').fullCalendar('changeView', 'agendaDay', date); break; } doubleClick = null; } else { doubleClick = date.format('YYYY-MM-DD HH:mm:ss'); clearInterval(clickTimer); clickTimer = setInterval(function () { doubleClick = null; clearInterval(clickTimer); console.log("\r\nNot Double Click") }, 500); } } } ); }) | 2023-01-05 17:28:07.021000 | The script for the capacity planning BisKit | Capacity Planning | 20 | 3 | capacity-planning | 0 |