Table of contents

Flow 3 — Odoo

msg.payload = { fields: ["id", "name", "state", "product_id", "product_qty", "x_studio_drawing_file", "date_start", "date_finished"] }; return msg;
let productions = msg.payload; msg.originalProductions = productions; let productionIds = productions.map(p => p.id); msg.payload = { model: "mrp.workorder", domain: [["production_id", "in", productionIds]], fields: ["name", "workcenter_id", "production_id"] }; return msg;
let workorders = msg.payload; let workcenterIds = [...new Set(workorders.map(w => w.workcenter_id[0]))]; msg.originalWorkorders = workorders; msg.filters = [[["id", "in", workcenterIds]]] msg.fields = ["id", "code", "create_date"] return msg;
let workcenters = msg.payload; let workorders = msg.originalWorkorders; let productions = msg.originalProductions; let wcMap = {}; workcenters.forEach(wc => { wcMap[wc.id] = wc.code; }); let woMap = {}; workorders.forEach(wo => { let prodId = wo.production_id[0]; if (!woMap[prodId]) woMap[prodId] = []; woMap[prodId].push({ id: wo.id, name: wo.name, state: wo.state, duration_expected: wo.duration_expected, workcenter_id: wo.workcenter_id, code: wcMap[wo.workcenter_id[0]] || "N/A" }); }); let result = productions.map(prod => { return { id: prod.id, name: prod.name, state: prod.state, product_id: prod.product_id, product_qty: prod.product_qty, x_studio_drawing_file: prod.x_studio_drawing_file, date_start: prod.date_start, date_finished: prod.date_finished, workorders: woMap[prod.id] || [] }; }); msg.productionData = result; return msg;
let productionData = msg.productionData; let points = []; productionData.forEach(prod => { if (prod.workorders.length > 0) { prod.workorders.forEach(wo => { points.push({ measurement: "mo_workorders", tags: { production_id: prod.id }, fields: { production_name: prod.name, workorder_name: wo.name, workorder_id: wo.id || 0, workcenter_code: wo.code, workcenter_name: wo.workcenter_id ? (msg.payload.find(wc => wc.id === wo.workcenter_id[0])?.name || "N/A") : "N/A", production_qty: prod.product_qty || 0, production_state: prod.state, workorder_state: wo.state, duration_expected: wo.duration_expected || 0 }, time: new Date(prod.date_start || Date.now()).toISOString() }); }); } else { points.push({ measurement: "mo_workorders", tags: { production_id: prod.id }, fields: { production_name: prod.name, workorder_name: "N/A", workorder_id: 0, workcenter_code: "N/A", workcenter_name: "N/A", production_qty: prod.product_qty || 0, production_state: prod.state, workorder_state: "N/A", duration_expected: 0 }, time: new Date(prod.date_start || Date.now()).toISOString() }); } }); msg.payload = points; return msg;
let workcenters = msg.payload; let workorders = msg.originalWorkorders; let productions = msg.originalProductions; let wcMap = {}; workcenters.forEach(wc => { wcMap[wc.id] = wc.code; }); let woMap = {}; workorders.forEach(wo => { if (["progress", "waiting", "ready", "pending"].includes(wo.state)) { let prodId = wo.production_id[0]; if (!woMap[prodId]) woMap[prodId] = []; woMap[prodId].push({ id: wo.id, name: wo.name, state: wo.state, duration_expected: wo.duration_expected, duration:wo.duration, workcenter_id: wo.workcenter_id, code: wcMap[wo.workcenter_id[0]] || "N/A" }); } }); let result = productions .filter(prod => { return ( prod.date_start && (prod.state === "confirmed" || prod.state === "progress") ); }) .map(prod => { return { id: prod.id, name: prod.name, state: prod.state, product_id: prod.product_id, product_qty: prod.product_qty, x_studio_drawing_file: prod.x_studio_drawing_file, date_start: prod.date_start, date_finished: prod.date_finished, workorders: woMap[prod.id] || [] }; }); result = result.filter(prod => prod.workorders.length > 0); msg.payload = { productionData: result }; return msg;
msg.payload = { fields: ["id", "name", "stage_id","schedule_date", "request_date"] }; return msg;
let requests = msg.payload; msg.originalRequests = requests; let workcenterIds = [...new Set( requests .filter(r => r.workcenter_id) .map(r => r.workcenter_id[0]) )]; msg.payload = { model: "mrp.workcenter", domain: [["id", "in", workcenterIds]], fields: ["id", "name", "code"] }; return msg;
let workcenters = msg.payload || []; let requests = msg.originalRequests || []; let wcMap = {}; workcenters.forEach(wc => { wcMap[wc.id] = { id: wc.id, name: wc.name, code: wc.code }; }); let today = new Date( new Date().toLocaleString("en-US", { timeZone: "Asia/Kuala_Lumpur" }) ); function daysBetween(dateStr) { if (!dateStr) return null; let schedule = new Date(dateStr); if (isNaN(schedule.getTime())) return null; let diffTime = schedule.getTime() - today.getTime(); return Math.ceil(diffTime / (1000 * 60 * 60 * 24)); } let allowedStages = ["New Request", "In Progress"]; let result = requests .filter(req => { let stageName = Array.isArray(req.stage_id) ? req.stage_id[1] : null; return allowedStages.includes(stageName); }) .map(req => { let wcId = req.workcenter_id?.[0] || null; let stageName = Array.isArray(req.stage_id) ? req.stage_id[1] : null; return { id: req.id, name: req.name, stage: stageName, maintenance_type: req.maintenance_type, request_date: req.request_date, schedule_date: req.schedule_date, remaining_days: daysBetween(req.schedule_date), workcenter: wcId ? wcMap[wcId] || null : null }; }); msg.payload = { maintenanceData: result }; return msg;
if (msg.topic !== "start_workorder" || !msg.payload.id) { return null; } let wo_id = msg.payload.id; msg.payload = [wo_id]; return msg;
if (msg.topic !== "pause_workorder" || !msg.payload.id) { return null; } msg.payload = [msg.payload.id]; return msg;
if (msg.topic !== "finish_workorder" || !msg.payload.id) { return null; } msg.payload = [msg.payload.id]; return msg;
if (msg.topic !== "continue_workorder" || !msg.payload.id) { return null; } msg.payload = [msg.payload.id]; return msg;