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