UNPKG

@tachybase/plugin-workflow-approval

Version:

Approval base in Workflow

140 lines (139 loc) 5.86 kB
var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var tools_exports = {}; __export(tools_exports, { ApprovalJobStatusMap: () => ApprovalJobStatusMap, getNegotiationMode: () => getNegotiationMode, parseAssignees: () => parseAssignees }); module.exports = __toCommonJS(tools_exports); var import_module_workflow = require("@tachybase/module-workflow"); var import_status = require("../constants/status"); const NEGOTIATION_MODE = { SINGLE: Symbol("single"), ALL: Symbol("all"), ANY: Symbol("any"), PERCENTAGE: Symbol("percentage") }; const JobStatusMap = { [import_status.APPROVAL_ACTION_STATUS.PENDING]: import_module_workflow.JOB_STATUS.PENDING, [import_status.APPROVAL_ACTION_STATUS.APPROVED]: import_module_workflow.JOB_STATUS.RESOLVED, [import_status.APPROVAL_ACTION_STATUS.REJECTED]: import_module_workflow.JOB_STATUS.REJECTED, [import_status.APPROVAL_ACTION_STATUS.RETURNED]: import_module_workflow.JOB_STATUS.RETRY_NEEDED }; const ApprovalJobStatusMap = { [import_module_workflow.JOB_STATUS.PENDING]: import_status.APPROVAL_ACTION_STATUS.PENDING, [import_module_workflow.JOB_STATUS.RESOLVED]: import_status.APPROVAL_ACTION_STATUS.APPROVED, [import_module_workflow.JOB_STATUS.REJECTED]: import_status.APPROVAL_ACTION_STATUS.REJECTED, [import_module_workflow.JOB_STATUS.RETRY_NEEDED]: import_status.APPROVAL_ACTION_STATUS.RETURNED, [import_module_workflow.JOB_STATUS.CANCELED]: import_status.APPROVAL_ACTION_STATUS.CANCELED }; const Modes = { [NEGOTIATION_MODE.SINGLE]: { getStatus(distribution, assignees, mode) { const done = distribution.find((item) => item.status !== import_status.APPROVAL_ACTION_STATUS.PENDING && item.count > 0); return done ? JobStatusMap[done.status] : null; } }, [NEGOTIATION_MODE.ALL]: { getStatus(distribution, assignees, mode) { const rejected = distribution.find( (item) => [import_status.APPROVAL_ACTION_STATUS.REJECTED, import_status.APPROVAL_ACTION_STATUS.RETURNED].includes(item.status) ); if (rejected && rejected.count) { return JobStatusMap[rejected.status]; } const approved = distribution.find((item) => item.status === import_status.APPROVAL_ACTION_STATUS.APPROVED); if (approved && approved.count === assignees.length) { return import_module_workflow.JOB_STATUS.RESOLVED; } return null; } }, [NEGOTIATION_MODE.ANY]: { getStatus(distribution, assignees, mode) { const returned = distribution.find((item) => item.status === import_status.APPROVAL_ACTION_STATUS.RETURNED); if (returned && returned.count) { return import_module_workflow.JOB_STATUS.RETRY_NEEDED; } const approved = distribution.find((item) => item.status === import_status.APPROVAL_ACTION_STATUS.APPROVED); if (approved && approved.count) { return import_status.APPROVAL_ACTION_STATUS.APPROVED; } const rejectedCount = distribution.reduce( (count, item) => item.status === import_status.APPROVAL_ACTION_STATUS.REJECTED ? count + item.count : count, 0 ); if (rejectedCount === assignees.length) { return import_module_workflow.JOB_STATUS.REJECTED; } return null; } }, [NEGOTIATION_MODE.PERCENTAGE]: { getStatus(distribution, assignees, mode) { const returned = distribution.find((item) => item.status === import_status.APPROVAL_ACTION_STATUS.RETURNED); if (returned && returned.count) { return import_module_workflow.JOB_STATUS.RETRY_NEEDED; } const approved = distribution.find((item) => item.status === import_status.APPROVAL_ACTION_STATUS.APPROVED); if (approved && approved.count / assignees.length > mode) { return import_module_workflow.JOB_STATUS.RESOLVED; } const rejected = distribution.find((item) => item.status === import_status.APPROVAL_ACTION_STATUS.REJECTED); if (rejected && rejected.count / assignees.length >= 1 - mode) { return import_module_workflow.JOB_STATUS.REJECTED; } return null; } } }; function getNegotiationMode(mode) { switch (true) { case mode === 1: return Modes[NEGOTIATION_MODE.ALL]; case (0 < mode && mode < 1): return Modes[NEGOTIATION_MODE.PERCENTAGE]; default: return Modes[NEGOTIATION_MODE.SINGLE]; } } async function parseAssignees(node, processor) { const configAssignees = processor.getParsedValue(node.config.assignees ?? [], node.id).flat().filter(Boolean); const assignees = /* @__PURE__ */ new Set(); const UserRepo = processor.options.plugin.app.db.getRepository("users"); for (const item of configAssignees) { if (typeof item === "object") { const result = await UserRepo.find({ ...item, fields: ["id"], transaction: processor.transaction }); result.forEach((item2) => assignees.add(item2.id)); } else { assignees.add(item); } } return [...assignees]; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ApprovalJobStatusMap, getNegotiationMode, parseAssignees });