Documentation
Function Codes
Flow 3 — Odoo
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;