flexbiz-server 12.6.13 → 12.6.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +439 -4
  2. package/package.json +4 -3
  3. package/server/agents/agents.js +1 -0
  4. package/server/agents/ai_memory_manager.js +6 -0
  5. package/server/agents/ceoAgent.js +43 -0
  6. package/server/agents/chatController.js +6 -0
  7. package/server/agents/cskhAgent.js +43 -0
  8. package/server/agents/flowAgent.js +43 -0
  9. package/server/agents/prompts/ceo.js +2 -0
  10. package/server/agents/prompts/flow.js +2 -0
  11. package/server/agents/staffAgent.js +44 -0
  12. package/server/agents/tools/financeTools.js +57 -0
  13. package/server/agents/tools/flowTools.js +36 -0
  14. package/server/agents/tools/kpiTools.js +104 -0
  15. package/server/agents/tools/masterDataTools.js +74 -0
  16. package/server/agents/tools/okrTools.js +21 -0
  17. package/server/agents/tools/ragTools.js +21 -0
  18. package/server/agents/tools/reportTools.js +43 -0
  19. package/server/agents/tools/staffTools.js +13 -0
  20. package/server/agents/tools/stockTools.js +41 -0
  21. package/server/agents/tools/systemTools.js +52 -0
  22. package/server/agents/tools/taskTools.js +23 -0
  23. package/server/agents/tools/utils.js +57 -0
  24. package/server/app.js +7 -7
  25. package/server/controllers/controller.js +31 -29
  26. package/server/controllers/controllerRPT.js +31 -29
  27. package/server/controllers/findHandler.js +22 -21
  28. package/server/controllers/importFromExcelHandler.js +17 -14
  29. package/server/controllers/importHandler.js +26 -41
  30. package/server/controllers/importHandler_old.js +41 -0
  31. package/server/controllers/rptHandler.js +14 -11
  32. package/server/controllers/viewHandler.js +7 -7
  33. package/server/flow/FlowEngine.js +49 -45
  34. package/server/flow/WebhookManager.js +1 -1
  35. package/server/flow/handlers.js +2 -2
  36. package/server/flow/nodes/userform.js +28 -0
  37. package/server/flow/utils.js +12 -4
  38. package/server/global.js +4 -3
  39. package/server/libs/cdpstk.js +1 -1
  40. package/server/libs/ckvt.js +12 -11
  41. package/server/libs/ckvtcapphat.js +5 -5
  42. package/server/libs/ckvtnpp.js +8 -8
  43. package/server/libs/ckvttt.js +6 -5
  44. package/server/libs/ctvt.js +7 -6
  45. package/server/libs/ctvtnpp.js +7 -6
  46. package/server/libs/ctvttt.js +6 -6
  47. package/server/libs/databanle.js +17 -18
  48. package/server/libs/databanle_old.js +18 -0
  49. package/server/libs/databanletheongay.js +25 -29
  50. package/server/libs/dktk.js +3 -3
  51. package/server/libs/dkvt.js +11 -11
  52. package/server/libs/dkvtnpp.js +7 -6
  53. package/server/libs/dkvttt.js +7 -6
  54. package/server/libs/docs.js +72 -36
  55. package/server/libs/dtbanletheosp.js +16 -19
  56. package/server/libs/fifo_dk.js +8 -0
  57. package/server/libs/fifo_group.js +4 -0
  58. package/server/libs/fifo_trace_query.js +12 -0
  59. package/server/libs/getGiaban.js +59 -70
  60. package/server/libs/getGiaban_old.js +70 -0
  61. package/server/libs/joinData.js +3 -3
  62. package/server/libs/joinData_bk.js +44 -0
  63. package/server/libs/kpistatus.js +24 -17
  64. package/server/libs/permission.js +54 -56
  65. package/server/libs/permission_old.js +58 -0
  66. package/server/libs/post-book.js +1 -1
  67. package/server/libs/post-socai.js +2 -1
  68. package/server/libs/post-sokho.js +11 -11
  69. package/server/libs/prototypes.js +13 -12
  70. package/server/libs/queryBuilding.js +11 -10
  71. package/server/libs/redis-cache.js +22 -10
  72. package/server/libs/sctcnkh.js +19 -17
  73. package/server/libs/socaitk.js +1 -1
  74. package/server/libs/thnxt.js +17 -14
  75. package/server/libs/thnxtnpp.js +8 -8
  76. package/server/libs/thnxttt.js +8 -7
  77. package/server/libs/tinhgia1vt_fifo.js +22 -0
  78. package/server/libs/tinhgiafifo.js +28 -0
  79. package/server/libs/utils.js +37 -19
  80. package/server/models/app.js +1 -1
  81. package/server/models/approve.js +8 -8
  82. package/server/models/cacheDataReport.js +2 -2
  83. package/server/models/cacheSessionReport.js +5 -1
  84. package/server/models/cdvt.js +2 -2
  85. package/server/models/checkin.js +2 -2
  86. package/server/models/chitietluongds.js +1 -1
  87. package/server/models/contract.js +1 -1
  88. package/server/models/csluongtheods.js +2 -2
  89. package/server/models/ctds2.js +7 -6
  90. package/server/models/custom_report.js +1 -0
  91. package/server/models/dmdt.js +2 -2
  92. package/server/models/dmkho.js +5 -4
  93. package/server/models/dmnvt.js +5 -4
  94. package/server/models/fifo_dk.js +2 -0
  95. package/server/models/fifo_lot.js +3 -0
  96. package/server/models/fifo_trace.js +4 -0
  97. package/server/models/flowpending.js +2 -0
  98. package/server/models/group.js +3 -5
  99. package/server/models/listinfo.js +61 -33
  100. package/server/models/schedule.js +4 -3
  101. package/server/models/task.js +1 -1
  102. package/server/models/trangthai.js +2 -2
  103. package/server/modules/lists/bg-fifo_dk.js +8 -0
  104. package/server/modules/lists/ls-checkin.js +1 -1
  105. package/server/modules/lists/ls-customer.js +23 -26
  106. package/server/modules/lists/ls-dmbp.js +5 -5
  107. package/server/modules/lists/ls-dmkho.js +7 -1
  108. package/server/modules/lists/ls-dmnhtask.js +1 -1
  109. package/server/modules/lists/ls-dmvt.js +52 -70
  110. package/server/modules/lists/ls-flowpending.js +3 -0
  111. package/server/modules/lists/ls-participant.js +6 -4
  112. package/server/modules/lists/ls-task.js +6 -6
  113. package/server/modules/reports/calc-tinhgiafifo.js +8 -0
  114. package/server/modules/reports/calc-tinhluong.js +17 -16
  115. package/server/modules/reports/rp-baoCaoFifoKy.js +1 -0
  116. package/server/modules/reports/rp-congviectheobp.js +4 -4
  117. package/server/modules/reports/rp-congviectheodt.js +1 -1
  118. package/server/modules/reports/rp-congviectheokh.js +1 -1
  119. package/server/modules/reports/rp-congviectheonv.js +1 -1
  120. package/server/modules/reports/rp-dtbanletheoct.js +22 -23
  121. package/server/modules/reports/rp-dtbanletheokh.js +17 -20
  122. package/server/modules/reports/rp-dtbanletheokho.js +15 -18
  123. package/server/modules/reports/rp-hoahong.js +1 -1
  124. package/server/modules/reports/rp-sctvt.js +1 -1
  125. package/server/modules/reports/rp-sosanhkhvatt2.js +1 -1
  126. package/server/modules/reports/rp-thnxt.js +8 -8
  127. package/server/modules/reports/rp-tongquannvbh.js +1 -1
  128. package/server/modules/systems/sys-app.js +5 -5
  129. package/server/modules/vouchers/vo-so1.js +14 -14
@@ -7,58 +7,62 @@ if($begin_node_potentialStartNodes_startNodeIdOverride$$&&$nodes$$[$begin_node_p
7
7
  1)$begin_node_potentialStartNodes_startNodeIdOverride$$=$begin_node_potentialStartNodes_startNodeIdOverride$$[0];else throw Error(`[${$flowInstanceId$$}] Flow ${$flowIdStr$$} has no nodes.`);}if(!$begin_node_potentialStartNodes_startNodeIdOverride$$)throw Error(`[${$flowInstanceId$$}] Cannot start Flow ${$flowIdStr$$}: Start node could not be determined.`);if($begin_node_potentialStartNodes_startNodeIdOverride$$?.data?.disabled)throw Error("Node kh\u1edfi \u0111\u1ea7u \u0111\u00e3 b\u1ecb v\u00f4 hi\u1ec7u ho\u00e1");
8
8
  var $abortController_isWebhookStart$$=new AbortController;$flowDefinition_flowState_flow_id$$={flowId:$flowIdStr$$,instanceId:$flowInstanceId$$,status:"initializing",initialData:$initialData$$,nodes:$nodes$$,edges:$edges_finalStatus_startNodeType$$,flowDefinition:$flowDefinition_flowState_flow_id$$,abortController:$abortController_isWebhookStart$$,abortSignal:$abortController_isWebhookStart$$.signal,triggerDownstreamCallback:($sourceNodeId$$,$payload$$)=>{this.triggerDownstreamNodesInternal($flowInstanceId$$,
9
9
  $sourceNodeId$$,$payload$$)}};this.runningFlows[$flowInstanceId$$]=$flowDefinition_flowState_flow_id$$;Logger.info(`[${$flowInstanceId$$}] Start node is ${$begin_node_potentialStartNodes_startNodeIdOverride$$.id} - ${$begin_node_potentialStartNodes_startNodeIdOverride$$.name} - ${$begin_node_potentialStartNodes_startNodeIdOverride$$.type}`);$edges_finalStatus_startNodeType$$=$begin_node_potentialStartNodes_startNodeIdOverride$$.type;$abortController_isWebhookStart$$=$edges_finalStatus_startNodeType$$===
10
- "webhook"||$edges_finalStatus_startNodeType$$==="facebook";if(this.webhookManager){const $webhookNodes$$=Object.values($flowDefinition_flowState_flow_id$$.nodes).filter($n$$=>($n$$.type==="webhook"||$n$$.type==="facebook")&&$n$$.data?.path&&!$n$$.data?.disabled);if($webhookNodes$$.length>0){Logger.info(`[${$flowInstanceId$$}] Registering webhooks for flow ${$flowIdStr$$}...`);try{await Promise.all($webhookNodes$$.map(async $whNode$$=>{let {path:$path$$,method:$method$$,verificationMethod:$verificationMethod$$,
11
- verificationChallengeQueryParam:$verificationChallengeQueryParam$$,verificationTokenQueryParam:$verificationTokenQueryParam$$,verificationTokenValue:$verificationTokenValue$$,appSecret:$appSecret$$}=$whNode$$.data;const $nodeId$$=$whNode$$.id;var $fbVerifyToken_verificationConfig$$=null;let $dataMethod$$=$method$$;if($whNode$$.type==="facebook"){$dataMethod$$="POST";({verifyTokenValue:$fbVerifyToken_verificationConfig$$}=$whNode$$.data);$appSecret$$=$whNode$$.data.appSecret;if(!$fbVerifyToken_verificationConfig$$){Logger.error(`[${$flowInstanceId$$}] Skipping FB node ${$nodeId$$}: Missing 'verifyTokenValue'.`);
12
- return}$fbVerifyToken_verificationConfig$$={method:"GET",challengeQueryParam:"hub.challenge",tokenParam:"hub.verify_token",tokenValue:$fbVerifyToken_verificationConfig$$}}else $verificationChallengeQueryParam$$&&($fbVerifyToken_verificationConfig$$={method:$verificationMethod$$||"GET",challengeQueryParam:$verificationChallengeQueryParam$$,...($verificationTokenQueryParam$$&&$verificationTokenValue$$&&{tokenParam:$verificationTokenQueryParam$$,tokenValue:$verificationTokenValue$$})});$dataMethod$$=
13
- $dataMethod$$?.toLowerCase()||"post";await this.webhookManager.registerWebhook($path$$,$dataMethod$$,$flowIdStr$$,$nodeId$$,$flowInstanceId$$,$fbVerifyToken_verificationConfig$$,$appSecret$$);Logger.info(`[${$flowInstanceId$$}] Registered webhook: ${$dataMethod$$.toUpperCase()} ${$path$$} (Node ${$nodeId$$})`)}))}catch($registerError$$){throw Logger.error(`[${$flowInstanceId$$}] Error during webhook registration:`,$registerError$$),this.cleanupFlow($flowIdStr$$,$flowInstanceId$$),Error(`Failed during webhook registration: ${$registerError$$.message}`);
14
- }}}else $abortController_isWebhookStart$$&&Logger.warn(`[${$flowInstanceId$$}] Webhook start node detected but WebhookManager is not set.`);$abortController_isWebhookStart$$?($edges_finalStatus_startNodeType$$="listening",$flowDefinition_flowState_flow_id$$.status=$edges_finalStatus_startNodeType$$,Logger.info(`[${$flowInstanceId$$}] Flow instance is LISTENING for webhook trigger at node ${$begin_node_potentialStartNodes_startNodeIdOverride$$.id}. Status: ${$edges_finalStatus_startNodeType$$}`),global.socketContainer?.socketIO&&
15
- global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-started",{flowInstanceId:$flowInstanceId$$,flowId:$flowIdStr$$,status:$edges_finalStatus_startNodeType$$})):($edges_finalStatus_startNodeType$$=$edges_finalStatus_startNodeType$$==="event"?"listening":"running",$flowDefinition_flowState_flow_id$$.status=$edges_finalStatus_startNodeType$$,Logger.info(`[${$flowInstanceId$$}] Flow ${$flowIdStr$$} instance starting nodes immediately. Status: ${$edges_finalStatus_startNodeType$$}`),global.socketContainer?.socketIO&&
16
- global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-started",{flowInstanceId:$flowInstanceId$$,flowId:$flowIdStr$$,status:$edges_finalStatus_startNodeType$$}),this.runNode($begin_node_potentialStartNodes_startNodeIdOverride$$,$initialData$$??{},$flowInstanceId$$,"initial").catch($error$$=>{Logger.error(`[${$flowInstanceId$$}] Critical error during initial node run:`,$error$$);this.stopFlow($flowInstanceId$$,!0,`Critical error starting flow: ${$error$$.message}`)}));await global.getModel("flow").updateOne({_id:$flowIdStr$$},
17
- {activeInstance:{status:$edges_finalStatus_startNodeType$$,initialData:$initialData$$,instanceId:$flowInstanceId$$}});return{flowInstanceId:$flowInstanceId$$,status:$edges_finalStatus_startNodeType$$}}async runNode($node$$,$errorMsg$jscomp$1_payload$$,$flowInstanceId$$,$triggerId$$=null){const $triggerContext$$=$triggerId$$?`|${$triggerId$$}`:"";Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] --- runNode ENTERED for node ${$node$$?.id} - ${$node$$.name} - ${$node$$.type} ---`);var $errorMsg_flowState$$=
18
- this.runningFlows[$flowInstanceId$$];if($errorMsg_flowState$$&&["running","listening"].includes($errorMsg_flowState$$.status))if($node$$&&$node$$.id&&$errorMsg_flowState$$.nodes[$node$$.id]){$errorMsg_flowState$$.status==="listening"&&(Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] runNode: Transitioning flow status from 'listening' to 'running'.`),$errorMsg_flowState$$.status="running",global.socketContainer?.socketIO&&global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-status-updated",
10
+ "webhook"||$edges_finalStatus_startNodeType$$==="facebook";if(this.webhookManager){var $userformNodes_webhookNodes$$=Object.values($flowDefinition_flowState_flow_id$$.nodes).filter($n$$=>($n$$.type==="webhook"||$n$$.type==="facebook")&&$n$$.data?.path&&!$n$$.data?.disabled);if($userformNodes_webhookNodes$$.length>0){Logger.info(`[${$flowInstanceId$$}] Registering webhooks for flow ${$flowIdStr$$}...`);try{await Promise.all($userformNodes_webhookNodes$$.map(async $whNode$$=>{let {path:$path$$,method:$method$$,
11
+ verificationMethod:$verificationMethod$$,verificationChallengeQueryParam:$verificationChallengeQueryParam$$,verificationTokenQueryParam:$verificationTokenQueryParam$$,verificationTokenValue:$verificationTokenValue$$,appSecret:$appSecret$$}=$whNode$$.data;const $nodeId$$=$whNode$$.id;var $fbVerifyToken_verificationConfig$$=null;let $dataMethod$$=$method$$;if($whNode$$.type==="facebook"){$dataMethod$$="POST";({verifyTokenValue:$fbVerifyToken_verificationConfig$$}=$whNode$$.data);$appSecret$$=$whNode$$.data.appSecret;
12
+ if(!$fbVerifyToken_verificationConfig$$){Logger.error(`[${$flowInstanceId$$}] Skipping FB node ${$nodeId$$}: Missing 'verifyTokenValue'.`);return}$fbVerifyToken_verificationConfig$$={method:"GET",challengeQueryParam:"hub.challenge",tokenParam:"hub.verify_token",tokenValue:$fbVerifyToken_verificationConfig$$}}else $verificationChallengeQueryParam$$&&($fbVerifyToken_verificationConfig$$={method:$verificationMethod$$||"GET",challengeQueryParam:$verificationChallengeQueryParam$$,...($verificationTokenQueryParam$$&&
13
+ $verificationTokenValue$$&&{tokenParam:$verificationTokenQueryParam$$,tokenValue:$verificationTokenValue$$})});$dataMethod$$=$dataMethod$$?.toLowerCase()||"post";await this.webhookManager.registerWebhook($path$$,$dataMethod$$,$flowIdStr$$,$nodeId$$,$flowInstanceId$$,$fbVerifyToken_verificationConfig$$,$appSecret$$);Logger.info(`[${$flowInstanceId$$}] Registered webhook: ${$dataMethod$$.toUpperCase()} ${$path$$} (Node ${$nodeId$$})`)}))}catch($registerError$$){throw Logger.error(`[${$flowInstanceId$$}] Error during webhook registration:`,
14
+ $registerError$$),this.cleanupFlow($flowIdStr$$,$flowInstanceId$$),Error(`Failed during webhook registration: ${$registerError$$.message}`);}}}else $abortController_isWebhookStart$$&&Logger.warn(`[${$flowInstanceId$$}] Webhook start node detected but WebhookManager is not set.`);this.webhookManager&&($userformNodes_webhookNodes$$=Object.values($flowDefinition_flowState_flow_id$$.nodes).filter($n$$=>$n$$.type==="userform"&&!$n$$.data?.disabled),$userformNodes_webhookNodes$$.length>0&&(Logger.info(`[${$flowInstanceId$$}] Registering direct-complete webhooks for ${$userformNodes_webhookNodes$$.length} userform node(s)...`),
15
+ await Promise.all($userformNodes_webhookNodes$$.map(async $ufNode$$=>{$ufNode$$.directCompleteSecret=crypto.randomBytes(16).toString("hex");await this.webhookManager.registerWebhook(`/userform-complete/${$ufNode$$.id}`,"post",$flowIdStr$$,$ufNode$$.id,$flowInstanceId$$,null,null)}))));$abortController_isWebhookStart$$?($edges_finalStatus_startNodeType$$="listening",$flowDefinition_flowState_flow_id$$.status=$edges_finalStatus_startNodeType$$,Logger.info(`[${$flowInstanceId$$}] Flow instance is LISTENING for webhook trigger at node ${$begin_node_potentialStartNodes_startNodeIdOverride$$.id}. Status: ${$edges_finalStatus_startNodeType$$}`),
16
+ global.socketContainer?.socketIO&&global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-started",{flowInstanceId:$flowInstanceId$$,flowId:$flowIdStr$$,status:$edges_finalStatus_startNodeType$$})):($edges_finalStatus_startNodeType$$=$edges_finalStatus_startNodeType$$==="event"?"listening":"running",$flowDefinition_flowState_flow_id$$.status=$edges_finalStatus_startNodeType$$,Logger.info(`[${$flowInstanceId$$}] Flow ${$flowIdStr$$} instance starting nodes immediately. Status: ${$edges_finalStatus_startNodeType$$}`),
17
+ global.socketContainer?.socketIO&&global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-started",{flowInstanceId:$flowInstanceId$$,flowId:$flowIdStr$$,status:$edges_finalStatus_startNodeType$$}),this.runNode($begin_node_potentialStartNodes_startNodeIdOverride$$,$initialData$$??{},$flowInstanceId$$,"initial").catch($error$$=>{Logger.error(`[${$flowInstanceId$$}] Critical error during initial node run:`,$error$$);this.stopFlow($flowInstanceId$$,!0,`Critical error starting flow: ${$error$$.message}`)}));
18
+ await global.getModel("flow").updateOne({_id:$flowIdStr$$},{activeInstance:{status:$edges_finalStatus_startNodeType$$,initialData:$initialData$$,instanceId:$flowInstanceId$$}});return{flowInstanceId:$flowInstanceId$$,status:$edges_finalStatus_startNodeType$$}}async runNode($node$$,$errorMsg$jscomp$1_payload$$,$flowInstanceId$$,$triggerId$$=null){const $triggerContext$$=$triggerId$$?`|${$triggerId$$}`:"";Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] --- runNode ENTERED for node ${$node$$?.id} - ${$node$$.name} - ${$node$$.type} ---`);
19
+ var $errorMsg_flowState$$=this.runningFlows[$flowInstanceId$$];if($errorMsg_flowState$$&&["running","listening"].includes($errorMsg_flowState$$.status))if($node$$&&$node$$.id&&$errorMsg_flowState$$.nodes[$node$$.id]){$errorMsg_flowState$$.status==="listening"&&(Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] runNode: Transitioning flow status from 'listening' to 'running'.`),$errorMsg_flowState$$.status="running",global.socketContainer?.socketIO&&global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-status-updated",
19
20
  {flowInstanceId:$flowInstanceId$$,status:"running"}));var $currentNodeState$$=$errorMsg_flowState$$.nodes[$node$$.id];if($errorMsg_flowState$$.abortSignal.aborted)Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] runNode: Node ${$node$$.id} aborted before execution.`),this.updateNodeStatus($flowInstanceId$$,$node$$.id,"cancelled",void 0,void 0,$triggerId$$),this.checkFlowCompletion($flowInstanceId$$);else{Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] ---> Attempting to set node ${$node$$.id} to RUNNING`);
20
- this.updateNodeStatus($flowInstanceId$$,$node$$.id,"running",void 0,$errorMsg$jscomp$1_payload$$,$triggerId$$);Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Status of node ${$node$$.id} AFTER update attempt: ${$errorMsg_flowState$$.nodes[$node$$.id]?.status}`);Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Running node ${$node$$.id} (Type: ${$node$$.type})`);var $handler$$=nodeHandlers[$node$$.type]||nodeHandlers.debug;$handler$$||(Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Don't find handler for type node ${$node$$.type}. Use debug node...`),
21
+ this.updateNodeStatus($flowInstanceId$$,$node$$.id,"running",void 0,$errorMsg$jscomp$1_payload$$,$triggerId$$);Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Status of node ${$node$$.id} AFTER update attempt: ${$errorMsg_flowState$$.nodes[$node$$.id]?.status}`);Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Running node ${$node$$.id} (Type: ${$node$$.type})`);Logger.info("[FlowEngine] T\u00ecm node",$node$$.type);var $handler$$=nodeHandlers[$node$$.type];$handler$$||(Logger.warn(`[${$flowInstanceId$$}${$triggerContext$$}] Don't find handler for type node ${$node$$.type}. Use debug node...`),
21
22
  $handler$$=nodeHandlers.debug);if($handler$$)try{Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Executing handler for node ${$node$$.id}...`);const $engineContext$$={updateNodeStatus:this.updateNodeStatus.bind(this),triggerDownstreamNodesInternal:this.triggerDownstreamNodesInternal.bind(this),runNode:this.runNode.bind(this),cancelBranch:this._cancelBranch.bind(this)},$outputData$$=await $handler$$($errorMsg_flowState$$,$currentNodeState$$,$errorMsg$jscomp$1_payload$$,$errorMsg_flowState$$.abortSignal,
22
23
  $engineContext$$);Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Handler for node ${$node$$.id} finished.`);if(this.runningFlows[$flowInstanceId$$]&&["running","listening"].includes(this.runningFlows[$flowInstanceId$$].status))if($errorMsg_flowState$$.abortSignal.aborted)Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Node ${$node$$.id} aborted during handler execution.`),this.updateNodeStatus($flowInstanceId$$,$node$$.id,"cancelled",void 0,void 0,$triggerId$$),this.checkFlowCompletion($flowInstanceId$$);
23
- else if($outputData$$===void 0&&["switch","foreachitem"].includes($node$$.type))Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] ${$node$$.type} node ${$node$$.id} handled branching. Setting status to completed.`),Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] ---> Attempting to set node ${$node$$.id} to COMPLETED (after branching)`),this.updateNodeStatus($flowInstanceId$$,$node$$.id,"completed",void 0,void 0,$triggerId$$),this.checkFlowCompletion($flowInstanceId$$);else if($outputData$$&&
24
+ else if($outputData$$===void 0&&["switch","foreachitem","userform"].includes($node$$.type))Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] ${$node$$.type} node ${$node$$.id} handled branching. Setting status to completed.`),Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] ---> Attempting to set node ${$node$$.id} to COMPLETED (after branching)`),this.updateNodeStatus($flowInstanceId$$,$node$$.id,"completed",void 0,void 0,$triggerId$$),this.checkFlowCompletion($flowInstanceId$$);else if($outputData$$&&
24
25
  typeof $outputData$$==="object"&&$outputData$$.repeating===!0){const $nodeStatus$$=$outputData$$.nodeStatus||"active_repeating";Logger.info(`[${$flowInstanceId$$}] Node ${$node$$.id} is now an active '${$outputData$$.nodeType||"repeating"}' node (independent of trigger ${$triggerId$$}).`);Logger.info(`[${$flowInstanceId$$}] ---> Attempting to set node ${$node$$.id} to ${$nodeStatus$$} (repeating)`);this.updateNodeStatus($flowInstanceId$$,$node$$.id,$nodeStatus$$,void 0,void 0,null)}else Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] ---> Attempting to set node ${$node$$.id} to COMPLETED`),
25
26
  this.updateNodeStatus($flowInstanceId$$,$node$$.id,"completed",$outputData$$,void 0,$triggerId$$),Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Node ${$node$$.id} completed normally.`),Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Triggering downstream nodes from ${$node$$.id}...`),this.triggerDownstreamNodesInternal($flowInstanceId$$,$node$$.id,$outputData$$,$triggerId$$);else Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Flow stopped or changed status during node ${$node$$.id} execution.`),
26
27
  this.checkFlowCompletion($flowInstanceId$$)}catch($error$$){$error$$ instanceof DOMException&&$error$$.name==="AbortError"?(Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Node ${$node$$.id} execution aborted by signal.`),Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] ---> Attempting to set node ${$node$$.id} to CANCELLED (AbortError)`),this.updateNodeStatus($flowInstanceId$$,$node$$.id,"cancelled",void 0,void 0,$triggerId$$)):(Logger.error(`[${$flowInstanceId$$}${$triggerContext$$}] Node ${$node$$.id} failed during execution:`,
27
28
  $error$$),$errorMsg$jscomp$1_payload$$=$error$$.message||$error$$,Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] ---> Attempting to set node ${$node$$.id} to FAILED:`,$errorMsg$jscomp$1_payload$$),this.updateNodeStatus($flowInstanceId$$,$node$$.id,"failed",$errorMsg$jscomp$1_payload$$,void 0,$triggerId$$),Logger.warn(`[${$flowInstanceId$$}${$triggerContext$$}] Execution path failed for this trigger at node ${$node$$.id}.`)),Object.values($errorMsg_flowState$$.nodes).find($n$$=>$n$$.type===
28
29
  "webhook"||$n$$.type==="facebook")||(Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}]: check flow completion`),this.checkFlowCompletion($flowInstanceId$$))}else $errorMsg_flowState$$=`No handler for type ${$node$$.type} or debug (Node ${$node$$.id}).`,Logger.error(`[${$flowInstanceId$$}${$triggerContext$$}] ${$errorMsg_flowState$$}`),this.updateNodeStatus($flowInstanceId$$,$node$$.id,"failed",$errorMsg_flowState$$,void 0,$triggerId$$),this.stopFlow($flowInstanceId$$,!0,$errorMsg_flowState$$)}}else Logger.error(`[${$flowInstanceId$$}${$triggerContext$$}] runNode ERROR: Invalid node object passed:`,
29
- $node$$),this.stopFlow($flowInstanceId$$,!0,`Invalid node ID: ${$node$$?.id}`);else $errorMsg_flowState$$?Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] runNode SKIPPED for node ${$node$$?.id}: Flow status is ${$errorMsg_flowState$$.status}.`):Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] runNode SKIPPED for node ${$node$$?.id}: Flow state not found.`)}triggerDownstreamNodesInternal($flowInstanceId$$,$sourceNodeId$$,$payload$$,$triggerId$$){const $flowState$$=this.runningFlows[$flowInstanceId$$],
30
- $triggerContext$$=$triggerId$$?`|${$triggerId$$}`:"";if(!$flowState$$||$flowState$$.status!=="running"&&$flowState$$.status!=="listening"||$flowState$$.abortSignal.aborted)Logger.info(`\u26a0\ufe0f [${$flowInstanceId$$}${$triggerContext$$}] Skipping downstream trigger from ${$sourceNodeId$$}. Reason: Flow status (${$flowState$$?.status}) not 'running or listening' or aborted (${$flowState$$.abortSignal.aborted}).`);else if($flowState$$.nodes[$sourceNodeId$$]){var $nextNodeIds$$=$flowState$$.edges.filter($edge$$=>
31
- $edge$$.source===$sourceNodeId$$).map($edge$$=>$edge$$.target).filter($id$$=>$flowState$$.nodes[$id$$]&&!$flowState$$.nodes[$id$$].data?.disabled);if($nextNodeIds$$.length>0){Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Node ${$sourceNodeId$$} has ${$nextNodeIds$$.length} downstream nodes: ${$nextNodeIds$$.join(", ")}`);for(const $nextNodeId$$ of $nextNodeIds$$){const $targetNodeState$$=$flowState$$.nodes[$nextNodeId$$];if(!$targetNodeState$$||$targetNodeState$$.data?.disabled)Logger.warn(`\u26a0\ufe0f [${$flowInstanceId$$}${$triggerContext$$}] Edge target ${$nextNodeId$$} not found or disabled.`);
32
- else if($targetNodeState$$.incomingPayloads=$targetNodeState$$.incomingPayloads||{},$targetNodeState$$.completedPredecessors=$targetNodeState$$.completedPredecessors||new Set,$targetNodeState$$.incomingPayloads[$sourceNodeId$$]=$payload$$,$targetNodeState$$.completedPredecessors.add($sourceNodeId$$),Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Node ${$sourceNodeId$$} -> ${$nextNodeId$$}. Join: ${$targetNodeState$$.completedPredecessors.size}/${$targetNodeState$$.predecessorCount}`),$targetNodeState$$.predecessorCount<=
33
- 0||$targetNodeState$$.completedPredecessors.size>=$targetNodeState$$.predecessorCount){$targetNodeState$$.predecessorCount<=0?Logger.warn(`[${$flowInstanceId$$}${$triggerContext$$}] Node ${$nextNodeId$$} triggered with 0 predecessors.`):Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] All predecessors for ${$nextNodeId$$} done. Triggering.`);let $combinedPayload$$;const $incomingPayloadValues$$=Object.values($targetNodeState$$.incomingPayloads);$targetNodeState$$.predecessorCount<=1?($combinedPayload$$=
34
- $incomingPayloadValues$$.length>0?$incomingPayloadValues$$[$incomingPayloadValues$$.length-1]:{},Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Using single payload for node ${$nextNodeId$$}.`)):($combinedPayload$$=$incomingPayloadValues$$,Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Combining ${$incomingPayloadValues$$.length} payloads into array for node ${$nextNodeId$$}.`));$targetNodeState$$.completedPredecessors.clear();$targetNodeState$$.incomingPayloads={};Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] ---> Attempting to set node ${$nextNodeId$$} to PENDING (before run)`);
35
- this.updateNodeStatus($flowInstanceId$$,$nextNodeId$$,"pending",void 0,void 0,null);Logger.info(`\ud83d\udd25 [${$flowInstanceId$$}${$triggerContext$$}] Calling runNode for ${$nextNodeId$$}...`);this.runNode($targetNodeState$$,$combinedPayload$$,$flowInstanceId$$,$triggerId$$).catch($error$$=>{Logger.error(`\u274c [${$flowInstanceId$$}${$triggerContext$$}] Error starting ${$nextNodeId$$}:`,$error$$);this.updateNodeStatus($flowInstanceId$$,$nextNodeId$$,"failed",$error$$.message||String($error$$),
36
- void 0,$triggerId$$)})}else Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Node ${$nextNodeId$$} still waiting for predecessors.`)}}else Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Node ${$sourceNodeId$$} is a terminal node for trigger ${$triggerId$$}.`);Object.values($flowState$$.nodes).find($n$$=>($n$$.type==="webhook"||$n$$.type==="facebook"||$n$$.type==="event")&&$n$$.predecessorCount===0)&&$flowState$$.status==="running"?Object.values($flowState$$.nodes).some($n$$=>$n$$.status===
37
- "running")?Logger.info(`[${$flowInstanceId$$}] Path for trigger ${$triggerId$$} ended, but other nodes might be running. Keeping status 'running'.`):(Logger.info(`[${$flowInstanceId$$}] No nodes seem to be running. Setting status back to 'listening'.`),$flowState$$.status="listening",global.socketContainer?.socketIO&&global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-status-updated",{flowInstanceId:$flowInstanceId$$,status:"listening"})):$nextNodeIds$$.length==0?(Object.values($flowState$$.nodes).forEach($node$$=>
38
- {["pending"].includes($node$$.status)&&this.updateNodeStatus($flowInstanceId$$,$node$$.id,"cancelled",void 0,void 0,null)}),$flowState$$.status="completed",global.socketContainer?.socketIO&&global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-status-updated",{flowInstanceId:$flowInstanceId$$,status:"completed"})):this.checkFlowCompletion($flowInstanceId$$)}else Logger.warn(`\u26a0\ufe0f [${$flowInstanceId$$}${$triggerContext$$}] Source node ${$sourceNodeId$$} not found.`)}async triggerNodeInInstance($flowInstanceId$$,
39
- $targetNodeId$$,$payload$$){var $flowState$$=this.runningFlows[$flowInstanceId$$];if($flowState$$)if(["running","listening"].includes($flowState$$.status))if($flowState$$=$flowState$$.nodes[$targetNodeId$$],!$flowState$$||$flowState$$.data?.disabled)Logger.error(`[FlowEngine.triggerNode] Target node ${$targetNodeId$$} not found or disabled in instance ${$flowInstanceId$$}.`);else{var $triggerId$$=`trig_${Date.now()}_${crypto.randomBytes(4).toString("hex")}`,$triggerContext$$=`|${$triggerId$$}`;Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Received external trigger for node ${$targetNodeId$$}. Resetting and running...`);
40
- Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Resetting branch starting from ${$targetNodeId$$}...`);await this._resetBranchStatus($flowInstanceId$$,$targetNodeId$$,$triggerId$$);this.runNode($flowState$$,$payload$$??{},$flowInstanceId$$,$triggerId$$).catch($error$$=>{Logger.error(`[${$flowInstanceId$$}|${$triggerId$$}] Error re-running node ${$targetNodeId$$} from external trigger:`,$error$$);this.updateNodeStatus($flowInstanceId$$,$targetNodeId$$,"failed",$error$$.message||String($error$$),
41
- void 0,$triggerId$$)})}else Logger.warn(`[FlowEngine.triggerNode] Instance ${$flowInstanceId$$} is not in 'running' or 'listening' state (current: ${$flowState$$.status}). Ignoring trigger.`);else Logger.warn(`[FlowEngine.triggerNode] Instance ${$flowInstanceId$$} not found. Ignoring trigger.`)}checkFlowCompletion($flowInstanceId$$){const $flowState$$=this.runningFlows[$flowInstanceId$$];$flowState$$&&!["completed","failed","stopped","listening"].includes($flowState$$.status)&&(Object.values($flowState$$.nodes).find($n$$=>
42
- ($n$$.type==="webhook"||$n$$.type==="facebook")&&$n$$.predecessorCount===0)?Logger.info("start node l\u00e0 m\u1ed9t webhook. Flow webhook kh\u00f4ng t\u1ef1 ho\u00e0n th\u00e0nh"):Object.values($flowState$$.nodes).find($n$$=>$n$$.status=="failed")&&!Object.values($flowState$$.nodes).find($n$$=>$n$$.status=="active_repeating"||$n$$.status=="active_listening")?(Logger.info(`[${$flowInstanceId$$}] Flow ${$flowState$$.flowId} instance failed.`),$flowState$$.status="failed",global.socketContainer?.socketIO&&
43
- global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-failed",{flowInstanceId:$flowInstanceId$$,flowId:$flowState$$.flowId}),this.cleanupFlow($flowState$$.flowId,$flowInstanceId$$)):Object.values($flowState$$.nodes).every($node$$=>["completed","failed","cancelled","stopped","disabled"].includes($node$$.status))&&(Logger.info(`[${$flowInstanceId$$}] All nodes finalized. Flow ${$flowState$$.flowId} instance completed.`),$flowState$$.status="completed",global.socketContainer?.socketIO&&global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-completed",
44
- {flowInstanceId:$flowInstanceId$$,flowId:$flowState$$.flowId}),this.cleanupFlow($flowState$$.flowId,$flowInstanceId$$)))}stopFlow($flowInstanceId$$,$isError$$=!1,$reason$$="Flow stopped manually"){const $flowState$$=this.runningFlows[$flowInstanceId$$];var $originalFlowId_stoppableStates$$="running pending active_repeating active_listening waiting listening initializing".split(" ");if($flowState$$&&$originalFlowId_stoppableStates$$.includes($flowState$$.status)){$originalFlowId_stoppableStates$$=
45
- $flowState$$.flowId;const $finalStatus$$=$isError$$?"failed":"stopped";Logger.info(`[${$flowInstanceId$$}] Stopping flow instance for ${$originalFlowId_stoppableStates$$}. Reason: ${$finalStatus$$}. Msg: ${$reason$$}`);$flowState$$.abortController&&!$flowState$$.abortController.signal.aborted&&($flowState$$.abortController.abort(),Logger.info(`[${$flowInstanceId$$}] Abort signal sent.`));$flowState$$.status=$finalStatus$$;Object.values($flowState$$.nodes).forEach($node$$=>{["running","pending","active_repeating",
46
- "active_listening"].includes($node$$.status)&&this.updateNodeStatus($flowInstanceId$$,$node$$.id,"cancelled",void 0,void 0,null)});if(global.socketContainer?.socketIO){const $eventData$$={flowInstanceId:$flowInstanceId$$,flowId:$originalFlowId_stoppableStates$$};$isError$$?($eventData$$.error=$reason$$,global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-failed",$eventData$$)):global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-stopped",$eventData$$)}this._unregisterWebhooksForInstance($flowState$$);
47
- this.cleanupFlow($originalFlowId_stoppableStates$$,$flowInstanceId$$);Logger.info(`[${$flowInstanceId$$}] Flow instance finalized as ${$finalStatus$$}.`);return{...$flowState$$,status:$finalStatus$$}}return $flowState$$?$flowState$$:null}_unregisterWebhooksForInstance($dataMethod$jscomp$1_flowState$jscomp$6_webhookNodes$$){if(this.webhookManager&&$dataMethod$jscomp$1_flowState$jscomp$6_webhookNodes$$){var $flowInstanceId$$=$dataMethod$jscomp$1_flowState$jscomp$6_webhookNodes$$.instanceId;Logger.info(`[${$flowInstanceId$$}] Requesting unregistration of webhooks for flow ${$dataMethod$jscomp$1_flowState$jscomp$6_webhookNodes$$.flowId}...`);
48
- $dataMethod$jscomp$1_flowState$jscomp$6_webhookNodes$$=Object.values($dataMethod$jscomp$1_flowState$jscomp$6_webhookNodes$$.nodes).filter($n$$=>($n$$.type==="webhook"||$n$$.type==="facebook")&&$n$$.data?.path);for(const $whNode$$ of $dataMethod$jscomp$1_flowState$jscomp$6_webhookNodes$$){let {path:$path$$,method:$method$$,verificationMethod:$verificationMethod$$}=$whNode$$.data;$dataMethod$jscomp$1_flowState$jscomp$6_webhookNodes$$=$method$$;let $verifyMethod$$=$verificationMethod$$||"GET";$whNode$$.type===
49
- "facebook"&&($dataMethod$jscomp$1_flowState$jscomp$6_webhookNodes$$="POST",$verifyMethod$$="GET");$dataMethod$jscomp$1_flowState$jscomp$6_webhookNodes$$=$dataMethod$jscomp$1_flowState$jscomp$6_webhookNodes$$?.toLowerCase()||"post";try{this.webhookManager.unregisterWebhook($path$$,$dataMethod$jscomp$1_flowState$jscomp$6_webhookNodes$$,$flowInstanceId$$,$verifyMethod$$.toLowerCase()),Logger.info(`[${$flowInstanceId$$}] Requested unregistration for webhook: ${$dataMethod$jscomp$1_flowState$jscomp$6_webhookNodes$$.toUpperCase()} ${$path$$} (Node ${$whNode$$.id})`)}catch($unregisterError$$){Logger.error(`[${$flowInstanceId$$}] Failed to unregister webhook ${$dataMethod$jscomp$1_flowState$jscomp$6_webhookNodes$$.toUpperCase()} ${$path$$} for node ${$whNode$$.id}:`,
50
- $unregisterError$$.message)}}}}_cancelBranch($flowInstanceId$$,$startNodeId$$,$triggerId$$,$visitedNodes$$=new Set){const $flowState$$=this.runningFlows[$flowInstanceId$$];if($flowState$$&&!$visitedNodes$$.has($startNodeId$$)){var $nodeToCancel$$=$flowState$$.nodes[$startNodeId$$];$nodeToCancel$$?($visitedNodes$$.add($startNodeId$$),$nodeToCancel$$.status==="pending"&&(Logger.info(`[${$flowInstanceId$$}${$triggerId$$?`|${$triggerId$$}`:""}] ---> Cancelling node ${$startNodeId$$} in unused branch.`),
51
- this.updateNodeStatus($flowInstanceId$$,$startNodeId$$,"cancelled",void 0,void 0,$triggerId$$),$flowState$$.edges.filter($edge$$=>$edge$$.source===$startNodeId$$).forEach($edge$$=>{this._cancelBranch($flowInstanceId$$,$edge$$.target,$triggerId$$,$visitedNodes$$)}))):Logger.warn(`[${$flowInstanceId$$}] _cancelBranch: Node ${$startNodeId$$} not found.`)}}async _resetBranchStatus($flowInstanceId$$,$startNodeId$$,$triggerId$$,$visitedNodes$$=new Set){var $flowState$jscomp$8_nextEdges$$=this.runningFlows[$flowInstanceId$$];
52
- if($flowState$jscomp$8_nextEdges$$&&!$visitedNodes$$.has($startNodeId$$)){var $nodeToReset$$=$flowState$jscomp$8_nextEdges$$.nodes[$startNodeId$$];if($nodeToReset$$){$visitedNodes$$.add($startNodeId$$);$nodeToReset$$.status!=="pending"&&(Logger.info(`[${$flowInstanceId$$}${$triggerId$$?`|${$triggerId$$}`:""}] ---> Resetting node ${$startNodeId$$} to PENDING.`),this.updateNodeStatus($flowInstanceId$$,$startNodeId$$,"pending",void 0,void 0,null),$nodeToReset$$.incomingPayloads={},$nodeToReset$$.completedPredecessors=
53
- new Set);$flowState$jscomp$8_nextEdges$$=$flowState$jscomp$8_nextEdges$$.edges.filter($edge$$=>$edge$$.source===$startNodeId$$);for(const $edge$$ of $flowState$jscomp$8_nextEdges$$)await this._resetBranchStatus($flowInstanceId$$,$edge$$.target,$triggerId$$,$visitedNodes$$)}else Logger.warn(`[${$flowInstanceId$$}${$triggerId$$?`|${$triggerId$$}`:""}] _resetBranchStatus: Node ${$startNodeId$$} not found.`)}}_checkAndSetListening($flowInstanceId$$,$triggerContext$$){const $flowState$$=this.runningFlows[$flowInstanceId$$];
54
- $flowState$$&&$flowState$$.status==="running"&&Object.values($flowState$$.nodes).find($n$$=>($n$$.type==="webhook"||$n$$.type==="facebook"||$n$$.type==="event")&&$n$$.predecessorCount===0)&&(Object.values($flowState$$.nodes).some($n$$=>$n$$.status==="running")?Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Path ended, but other nodes might be running. Keeping status 'running'.`):(Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] No nodes seem to be running. Setting status back to 'listening'.`),
55
- $flowState$$.status="listening",global.socketContainer?.socketIO&&global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-status-updated",{flowInstanceId:$flowInstanceId$$,status:"listening"})))}async cleanupFlow($flowId$$,$flowInstanceId$$){if(this.runningFlows[$flowInstanceId$$]){const {status:$status$$,initialData:$initialData$$,instanceId:$instanceId$$}=this.runningFlows[$flowInstanceId$$];await global.getModel("flow").updateOne({_id:$flowId$$},{activeInstance:{status:$status$$,initialData:$initialData$$,
56
- instanceId:$instanceId$$}});Logger.info(`[${$flowInstanceId$$}] Cleaned up instance data.`)}}updateNodeStatus($flowInstanceId$$,$nodeId$$,$status$$,$logEventPayload_outputDataOrError$$,$errorMsg$$,$triggerId$$=null){var $flowState$$=this.runningFlows[$flowInstanceId$$];if($flowState$$?.nodes[$nodeId$$]){const $node$$=$flowState$$.nodes[$nodeId$$];$flowState$$=$node$$.status;const $triggerContext$$=$triggerId$$?`|${$triggerId$$}`:"";$flowState$$!==$status$$&&($node$$.status=$status$$);$status$$===
57
- "completed"&&$logEventPayload_outputDataOrError$$!==void 0&&($node$$.outputData=$logEventPayload_outputDataOrError$$);$status$$==="running"&&$errorMsg$$!==void 0&&($node$$.inputPayload=$errorMsg$$);$status$$!=="completed"&&($node$$.outputData=void 0);$errorMsg$$=null;$status$$==="failed"?$errorMsg$$=$node$$.error=$logEventPayload_outputDataOrError$$:$node$$.error=void 0;$flowState$$!==$status$$&&global.socketContainer?.socketIO&&($logEventPayload_outputDataOrError$$={flowInstanceId:$flowInstanceId$$,
58
- triggerId:$triggerId$$||"initial",nodeId:$nodeId$$,nodeType:$node$$.type,status:$status$$,timestamp:Date.now(),...($status$$==="completed"&&{outputData:$logEventPayload_outputDataOrError$$}),...($status$$==="failed"&&{error:$errorMsg$$})},Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Emitting flow-log-event:`,{...$logEventPayload_outputDataOrError$$,outputData:"..."}),global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-log-event",$logEventPayload_outputDataOrError$$));$flowState$$!==
59
- $status$$&&Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] UPDATED Node ${$nodeId$$} status: ${$flowState$$} -> ${$status$$}`)}else Logger.warn(`[${$flowInstanceId$$}] ### updateNodeStatus ### Cannot update node ${$nodeId$$}: Node or flow instance not found.`)}getFlowStatus($flowInstanceId$jscomp$12_flowState$$){return($flowInstanceId$jscomp$12_flowState$$=this.runningFlows[$flowInstanceId$jscomp$12_flowState$$])?{flowId:$flowInstanceId$jscomp$12_flowState$$.flowId,instanceId:$flowInstanceId$jscomp$12_flowState$$.instanceId,
60
- status:$flowInstanceId$jscomp$12_flowState$$.status,nodes:Object.values($flowInstanceId$jscomp$12_flowState$$.nodes).map($n$$=>({id:$n$$.id,type:$n$$.type,status:$n$$.status,outputData:$n$$.outputData,inputPayload:$n$$.inputPayload,error:$n$$.error}))}:null}getAllFlowStatuses(){return Object.keys(this.runningFlows).map($id$$=>this.getFlowStatus($id$$)).filter(Boolean)}getInstancesForFlow($flowId$$){const $targetFlowId$$=$flowId$$.toString();return Object.values(this.runningFlows).filter($state$$=>
61
- $state$$.flowId===$targetFlowId$$).map($state$$=>this.getFlowStatus($state$$.instanceId)).filter(Boolean)}stopAllInstancesOfFlow($flowId$$,$reason$$="Stopped all instances for flow definition"){const $targetFlowId$$=$flowId$$.toString();$flowId$$=Object.values(this.runningFlows).filter($state$$=>$state$$.flowId===$targetFlowId$$&&"running pending active_repeating active_listening waiting listening".split(" ").includes($state$$.status)).map($state$$=>$state$$.instanceId);if($flowId$$.length===0)return Logger.info(`[FlowEngine] No running/waiting/listening instances found for flow ${$targetFlowId$$} to stop.`),
62
- [];Logger.info(`[FlowEngine] Requesting stop for ${$flowId$$.length} instances of flow ${$targetFlowId$$}. Reason: ${$reason$$}`);const $stoppedInstanceIds$$=[];$flowId$$.forEach($instanceId$$=>{try{this.stopFlow($instanceId$$,!1,$reason$$),$stoppedInstanceIds$$.push($instanceId$$)}catch($error$$){Logger.error(`[FlowEngine] Error stopping instance ${$instanceId$$} for flow ${$targetFlowId$$}:`,$error$$)}});return $stoppedInstanceIds$$}}
30
+ $node$$),this.stopFlow($flowInstanceId$$,!0,`Invalid node ID: ${$node$$?.id}`);else $errorMsg_flowState$$?Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] runNode SKIPPED for node ${$node$$?.id}: Flow status is ${$errorMsg_flowState$$.status}.`):Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] runNode SKIPPED for node ${$node$$?.id}: Flow state not found.`)}triggerDownstreamNodesInternal($flowInstanceId$$,$sourceNodeId$$,$hasWebhookStartNode_payload$$,$triggerId$$){const $flowState$$=
31
+ this.runningFlows[$flowInstanceId$$],$triggerContext$$=$triggerId$$?`|${$triggerId$$}`:"";if(!$flowState$$||$flowState$$.status!=="running"&&$flowState$$.status!=="listening"||$flowState$$.abortSignal.aborted)Logger.info(`\u26a0\ufe0f [${$flowInstanceId$$}${$triggerContext$$}] Skipping downstream trigger from ${$sourceNodeId$$}. Reason: Flow status (${$flowState$$?.status}) not 'running or listening' or aborted (${$flowState$$.abortSignal.aborted}).`);else if($flowState$$.nodes[$sourceNodeId$$]){var $nextNodeIds$$=
32
+ $flowState$$.edges.filter($edge$$=>$edge$$.source===$sourceNodeId$$).map($edge$$=>$edge$$.target).filter($id$$=>$flowState$$.nodes[$id$$]&&!$flowState$$.nodes[$id$$].data?.disabled);if($nextNodeIds$$.length>0){Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Node ${$sourceNodeId$$} has ${$nextNodeIds$$.length} downstream nodes: ${$nextNodeIds$$.join(", ")}`);for(const $nextNodeId$$ of $nextNodeIds$$){var $hasActiveRepeatingNode_targetNodeState$$=$flowState$$.nodes[$nextNodeId$$];if(!$hasActiveRepeatingNode_targetNodeState$$||
33
+ $hasActiveRepeatingNode_targetNodeState$$.data?.disabled)Logger.warn(`\u26a0\ufe0f [${$flowInstanceId$$}${$triggerContext$$}] Edge target ${$nextNodeId$$} not found or disabled.`);else if($hasActiveRepeatingNode_targetNodeState$$.incomingPayloads=$hasActiveRepeatingNode_targetNodeState$$.incomingPayloads||{},$hasActiveRepeatingNode_targetNodeState$$.completedPredecessors=$hasActiveRepeatingNode_targetNodeState$$.completedPredecessors||new Set,$hasActiveRepeatingNode_targetNodeState$$.incomingPayloads[$sourceNodeId$$]=
34
+ $hasWebhookStartNode_payload$$,$hasActiveRepeatingNode_targetNodeState$$.completedPredecessors.add($sourceNodeId$$),Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Node ${$sourceNodeId$$} -> ${$nextNodeId$$}. Join: ${$hasActiveRepeatingNode_targetNodeState$$.completedPredecessors.size}/${$hasActiveRepeatingNode_targetNodeState$$.predecessorCount}`),$hasActiveRepeatingNode_targetNodeState$$.predecessorCount<=0||$hasActiveRepeatingNode_targetNodeState$$.completedPredecessors.size>=$hasActiveRepeatingNode_targetNodeState$$.predecessorCount){$hasActiveRepeatingNode_targetNodeState$$.predecessorCount<=
35
+ 0?Logger.warn(`[${$flowInstanceId$$}${$triggerContext$$}] Node ${$nextNodeId$$} triggered with 0 predecessors.`):Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] All predecessors for ${$nextNodeId$$} done. Triggering.`);let $combinedPayload$$;const $incomingPayloadValues$$=Object.values($hasActiveRepeatingNode_targetNodeState$$.incomingPayloads);$hasActiveRepeatingNode_targetNodeState$$.predecessorCount<=1?($combinedPayload$$=$incomingPayloadValues$$.length>0?$incomingPayloadValues$$[$incomingPayloadValues$$.length-
36
+ 1]:{},Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Using single payload for node ${$nextNodeId$$}.`)):($combinedPayload$$=$incomingPayloadValues$$,Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Combining ${$incomingPayloadValues$$.length} payloads into array for node ${$nextNodeId$$}.`));$hasActiveRepeatingNode_targetNodeState$$.completedPredecessors.clear();$hasActiveRepeatingNode_targetNodeState$$.incomingPayloads={};Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] ---> Attempting to set node ${$nextNodeId$$} to PENDING (before run)`);
37
+ this.updateNodeStatus($flowInstanceId$$,$nextNodeId$$,"pending",void 0,void 0,null);Logger.info(`\ud83d\udd25 [${$flowInstanceId$$}${$triggerContext$$}] Calling runNode for ${$nextNodeId$$}...`);this.runNode($hasActiveRepeatingNode_targetNodeState$$,$combinedPayload$$,$flowInstanceId$$,$triggerId$$).catch($error$$=>{Logger.error(`\u274c [${$flowInstanceId$$}${$triggerContext$$}] Error starting ${$nextNodeId$$}:`,$error$$);this.updateNodeStatus($flowInstanceId$$,$nextNodeId$$,"failed",$error$$.message||
38
+ String($error$$),void 0,$triggerId$$)})}else Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Node ${$nextNodeId$$} still waiting for predecessors.`)}}else Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Node ${$sourceNodeId$$} is a terminal node for trigger ${$triggerId$$}.`);$hasWebhookStartNode_payload$$=Object.values($flowState$$.nodes).find($n$$=>($n$$.type==="webhook"||$n$$.type==="facebook")&&$n$$.predecessorCount===0);$hasActiveRepeatingNode_targetNodeState$$=Object.values($flowState$$.nodes).some($n$$=>
39
+ ["active_repeating","active_listening"].includes($n$$.status));$hasWebhookStartNode_payload$$||$hasActiveRepeatingNode_targetNodeState$$?$flowState$$.status==="running"&&(Object.values($flowState$$.nodes).some($n$$=>$n$$.status==="running")?Logger.info(`[${$flowInstanceId$$}] Path for trigger ${$triggerId$$} ended, but other nodes might be running. Keeping status 'running'.`):(Logger.info(`[${$flowInstanceId$$}] No nodes seem to be running. Setting status back to 'listening'.`),$flowState$$.status=
40
+ "listening",global.socketContainer?.socketIO&&global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-status-updated",{flowInstanceId:$flowInstanceId$$,status:"listening"}))):$nextNodeIds$$.length==0?(Object.values($flowState$$.nodes).forEach($node$$=>{["pending"].includes($node$$.status)&&this.updateNodeStatus($flowInstanceId$$,$node$$.id,"cancelled",void 0,void 0,null)}),$flowState$$.status="completed",global.socketContainer?.socketIO&&global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-status-updated",
41
+ {flowInstanceId:$flowInstanceId$$,status:"completed"})):this.checkFlowCompletion($flowInstanceId$$)}else Logger.warn(`\u26a0\ufe0f [${$flowInstanceId$$}${$triggerContext$$}] Source node ${$sourceNodeId$$} not found.`)}async triggerNodeInInstance($flowInstanceId$$,$targetNodeId$$,$payload$$){var $flowState$$=this.runningFlows[$flowInstanceId$$];if($flowState$$)if(["running","listening"].includes($flowState$$.status))if($flowState$$=$flowState$$.nodes[$targetNodeId$$],!$flowState$$||$flowState$$.data?.disabled)Logger.error(`[FlowEngine.triggerNode] Target node ${$targetNodeId$$} not found or disabled in instance ${$flowInstanceId$$}.`);
42
+ else{var $triggerId$$=`trig_${Date.now()}_${crypto.randomBytes(4).toString("hex")}`,$triggerContext$$=`|${$triggerId$$}`;Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Received external trigger for node ${$targetNodeId$$}. Resetting and running...`);Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Resetting branch starting from ${$targetNodeId$$}...`);await this._resetBranchStatus($flowInstanceId$$,$targetNodeId$$,$triggerId$$);this.runNode($flowState$$,$payload$$??{},$flowInstanceId$$,
43
+ $triggerId$$).catch($error$$=>{Logger.error(`[${$flowInstanceId$$}|${$triggerId$$}] Error re-running node ${$targetNodeId$$} from external trigger:`,$error$$);this.updateNodeStatus($flowInstanceId$$,$targetNodeId$$,"failed",$error$$.message||String($error$$),void 0,$triggerId$$)})}else Logger.warn(`[FlowEngine.triggerNode] Instance ${$flowInstanceId$$} is not in 'running' or 'listening' state (current: ${$flowState$$.status}). Ignoring trigger.`);else Logger.warn(`[FlowEngine.triggerNode] Instance ${$flowInstanceId$$} not found. Ignoring trigger.`)}checkFlowCompletion($flowInstanceId$$){const $flowState$$=
44
+ this.runningFlows[$flowInstanceId$$];if($flowState$$&&!["completed","failed","stopped","listening"].includes($flowState$$.status)){var $hasWebhookStartNode$$=Object.values($flowState$$.nodes).find($n$$=>($n$$.type==="webhook"||$n$$.type==="facebook")&&$n$$.predecessorCount===0),$hasActiveRepeatingNode$$=Object.values($flowState$$.nodes).some($n$$=>["active_repeating","active_listening"].includes($n$$.status));$hasWebhookStartNode$$||$hasActiveRepeatingNode$$?Logger.info(`Flow c\u00f3 node \u0111ang l\u1eafng nghe/l\u1eb7p l\u1ea1i \u0111\u1ed9c l\u1eadp (webhook=${!!$hasWebhookStartNode$$}, active_repeating/listening=${$hasActiveRepeatingNode$$}). Flow kh\u00f4ng t\u1ef1 ho\u00e0n th\u00e0nh.`):
45
+ Object.values($flowState$$.nodes).find($n$$=>$n$$.status=="failed")&&!Object.values($flowState$$.nodes).find($n$$=>["active_repeating","active_listening","pending_input"].includes($n$$.status))?(Logger.info(`[${$flowInstanceId$$}] Flow ${$flowState$$.flowId} instance failed.`),$flowState$$.status="failed",global.socketContainer?.socketIO&&global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-failed",{flowInstanceId:$flowInstanceId$$,flowId:$flowState$$.flowId}),this.cleanupFlow($flowState$$.flowId,
46
+ $flowInstanceId$$)):Object.values($flowState$$.nodes).every($node$$=>["completed","failed","cancelled","stopped","disabled"].includes($node$$.status))&&(Logger.info(`[${$flowInstanceId$$}] All nodes finalized. Flow ${$flowState$$.flowId} instance completed.`),$flowState$$.status="completed",global.socketContainer?.socketIO&&global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-completed",{flowInstanceId:$flowInstanceId$$,flowId:$flowState$$.flowId}),this.cleanupFlow($flowState$$.flowId,
47
+ $flowInstanceId$$))}}stopFlow($flowInstanceId$$,$isError$$=!1,$reason$$="Flow stopped manually"){const $flowState$$=this.runningFlows[$flowInstanceId$$];var $originalFlowId_stoppableStates$$="running pending active_repeating active_listening waiting listening pending_input initializing".split(" ");if($flowState$$&&$originalFlowId_stoppableStates$$.includes($flowState$$.status)){$originalFlowId_stoppableStates$$=$flowState$$.flowId;const $finalStatus$$=$isError$$?"failed":"stopped";Logger.info(`[${$flowInstanceId$$}] Stopping flow instance for ${$originalFlowId_stoppableStates$$}. Reason: ${$finalStatus$$}. Msg: ${$reason$$}`);
48
+ $flowState$$.abortController&&!$flowState$$.abortController.signal.aborted&&($flowState$$.abortController.abort(),Logger.info(`[${$flowInstanceId$$}] Abort signal sent.`));$flowState$$.status=$finalStatus$$;Object.values($flowState$$.nodes).forEach($node$$=>{["running","pending","active_repeating","active_listening","pending_input"].includes($node$$.status)&&this.updateNodeStatus($flowInstanceId$$,$node$$.id,"cancelled",void 0,void 0,null)});if(global.socketContainer?.socketIO){const $eventData$$=
49
+ {flowInstanceId:$flowInstanceId$$,flowId:$originalFlowId_stoppableStates$$};$isError$$?($eventData$$.error=$reason$$,global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-failed",$eventData$$)):global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-stopped",$eventData$$)}this._unregisterWebhooksForInstance($flowState$$);this.cleanupFlow($originalFlowId_stoppableStates$$,$flowInstanceId$$);Logger.info(`[${$flowInstanceId$$}] Flow instance finalized as ${$finalStatus$$}.`);return{...$flowState$$,
50
+ status:$finalStatus$$}}return $flowState$$?$flowState$$:null}_unregisterWebhooksForInstance($flowState$jscomp$6_userformNodes$$){if(this.webhookManager&&$flowState$jscomp$6_userformNodes$$){var $flowInstanceId$$=$flowState$jscomp$6_userformNodes$$.instanceId;Logger.info(`[${$flowInstanceId$$}] Requesting unregistration of webhooks for flow ${$flowState$jscomp$6_userformNodes$$.flowId}...`);var $dataMethod$jscomp$1_webhookNodes$$=Object.values($flowState$jscomp$6_userformNodes$$.nodes).filter($n$$=>
51
+ ($n$$.type==="webhook"||$n$$.type==="facebook")&&$n$$.data?.path);for(const $whNode$$ of $dataMethod$jscomp$1_webhookNodes$$){let {path:$path$$,method:$method$$,verificationMethod:$verificationMethod$$}=$whNode$$.data;$dataMethod$jscomp$1_webhookNodes$$=$method$$;let $verifyMethod$$=$verificationMethod$$||"GET";$whNode$$.type==="facebook"&&($dataMethod$jscomp$1_webhookNodes$$="POST",$verifyMethod$$="GET");$dataMethod$jscomp$1_webhookNodes$$=$dataMethod$jscomp$1_webhookNodes$$?.toLowerCase()||"post";
52
+ try{this.webhookManager.unregisterWebhook($path$$,$dataMethod$jscomp$1_webhookNodes$$,$flowInstanceId$$,$verifyMethod$$.toLowerCase()),Logger.info(`[${$flowInstanceId$$}] Requested unregistration for webhook: ${$dataMethod$jscomp$1_webhookNodes$$.toUpperCase()} ${$path$$} (Node ${$whNode$$.id})`)}catch($unregisterError$$){Logger.error(`[${$flowInstanceId$$}] Failed to unregister webhook ${$dataMethod$jscomp$1_webhookNodes$$.toUpperCase()} ${$path$$} for node ${$whNode$$.id}:`,$unregisterError$$.message)}}$flowState$jscomp$6_userformNodes$$=
53
+ Object.values($flowState$jscomp$6_userformNodes$$.nodes).filter($n$$=>$n$$.type==="userform");for(const $ufNode$$ of $flowState$jscomp$6_userformNodes$$)try{this.webhookManager.unregisterWebhook(`/userform-complete/${$ufNode$$.id}`,"post",$flowInstanceId$$,"get"),Logger.info(`[${$flowInstanceId$$}] Unregistered direct-complete webhook for userform node ${$ufNode$$.id}`)}catch($e$$){Logger.error(`[${$flowInstanceId$$}] Failed to unregister userform webhook ${$ufNode$$.id}:`,$e$$.message)}}}_cancelBranch($flowInstanceId$$,
54
+ $startNodeId$$,$triggerId$$,$visitedNodes$$=new Set){const $flowState$$=this.runningFlows[$flowInstanceId$$];if($flowState$$&&!$visitedNodes$$.has($startNodeId$$)){var $nodeToCancel$$=$flowState$$.nodes[$startNodeId$$];$nodeToCancel$$?($visitedNodes$$.add($startNodeId$$),$nodeToCancel$$.status==="pending"&&(Logger.info(`[${$flowInstanceId$$}${$triggerId$$?`|${$triggerId$$}`:""}] ---> Cancelling node ${$startNodeId$$} in unused branch.`),this.updateNodeStatus($flowInstanceId$$,$startNodeId$$,"cancelled",
55
+ void 0,void 0,$triggerId$$),$flowState$$.edges.filter($edge$$=>$edge$$.source===$startNodeId$$).forEach($edge$$=>{this._cancelBranch($flowInstanceId$$,$edge$$.target,$triggerId$$,$visitedNodes$$)}))):Logger.warn(`[${$flowInstanceId$$}] _cancelBranch: Node ${$startNodeId$$} not found.`)}}async _resetBranchStatus($flowInstanceId$$,$startNodeId$$,$triggerId$$,$visitedNodes$$=new Set){var $flowState$jscomp$8_nextEdges$$=this.runningFlows[$flowInstanceId$$];if($flowState$jscomp$8_nextEdges$$&&!$visitedNodes$$.has($startNodeId$$)){var $nodeToReset$$=
56
+ $flowState$jscomp$8_nextEdges$$.nodes[$startNodeId$$];if($nodeToReset$$){$visitedNodes$$.add($startNodeId$$);$nodeToReset$$.status!=="pending"&&(Logger.info(`[${$flowInstanceId$$}${$triggerId$$?`|${$triggerId$$}`:""}] ---> Resetting node ${$startNodeId$$} to PENDING.`),this.updateNodeStatus($flowInstanceId$$,$startNodeId$$,"pending",void 0,void 0,null),$nodeToReset$$.incomingPayloads={},$nodeToReset$$.completedPredecessors=new Set);$flowState$jscomp$8_nextEdges$$=$flowState$jscomp$8_nextEdges$$.edges.filter($edge$$=>
57
+ $edge$$.source===$startNodeId$$);for(const $edge$$ of $flowState$jscomp$8_nextEdges$$)await this._resetBranchStatus($flowInstanceId$$,$edge$$.target,$triggerId$$,$visitedNodes$$)}else Logger.warn(`[${$flowInstanceId$$}${$triggerId$$?`|${$triggerId$$}`:""}] _resetBranchStatus: Node ${$startNodeId$$} not found.`)}}_checkAndSetListening($flowInstanceId$$,$triggerContext$$){const $flowState$$=this.runningFlows[$flowInstanceId$$];$flowState$$&&$flowState$$.status==="running"&&Object.values($flowState$$.nodes).find($n$$=>
58
+ ($n$$.type==="webhook"||$n$$.type==="facebook"||$n$$.type==="event")&&$n$$.predecessorCount===0)&&(Object.values($flowState$$.nodes).some($n$$=>$n$$.status==="running")?Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Path ended, but other nodes might be running. Keeping status 'running'.`):(Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] No nodes seem to be running. Setting status back to 'listening'.`),$flowState$$.status="listening",global.socketContainer?.socketIO&&global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-status-updated",
59
+ {flowInstanceId:$flowInstanceId$$,status:"listening"})))}async cleanupFlow($flowId$$,$flowInstanceId$$){if(this.runningFlows[$flowInstanceId$$]){const {status:$status$$,initialData:$initialData$$,instanceId:$instanceId$$}=this.runningFlows[$flowInstanceId$$];await global.getModel("flow").updateOne({_id:$flowId$$},{activeInstance:{status:$status$$,initialData:$initialData$$,instanceId:$instanceId$$}});this.runningFlows[$flowInstanceId$$].abortController&&this.runningFlows[$flowInstanceId$$].abortController.abort();
60
+ Logger.info(`[${$flowInstanceId$$}] Cleaned up instance data.`)}}updateNodeStatus($flowInstanceId$$,$nodeId$$,$status$$,$logEventPayload_outputDataOrError$$,$errorMsg$$,$triggerId$$=null){var $flowState$$=this.runningFlows[$flowInstanceId$$];if($flowState$$?.nodes[$nodeId$$]){const $node$$=$flowState$$.nodes[$nodeId$$];$flowState$$=$node$$.status;const $triggerContext$$=$triggerId$$?`|${$triggerId$$}`:"";$flowState$$!==$status$$&&($node$$.status=$status$$);$status$$==="completed"&&$logEventPayload_outputDataOrError$$!==
61
+ void 0&&($node$$.outputData=$logEventPayload_outputDataOrError$$);$errorMsg$$!==void 0&&($node$$.inputPayload=$errorMsg$$);$status$$!=="completed"&&($node$$.outputData=void 0);$errorMsg$$=null;$status$$==="failed"?$errorMsg$$=$node$$.error=$logEventPayload_outputDataOrError$$:$node$$.error=void 0;$flowState$$!==$status$$&&global.socketContainer?.socketIO&&($logEventPayload_outputDataOrError$$={flowInstanceId:$flowInstanceId$$,triggerId:$triggerId$$||"initial",nodeId:$nodeId$$,nodeType:$node$$.type,
62
+ status:$status$$,timestamp:Date.now(),...($status$$==="completed"&&{outputData:$logEventPayload_outputDataOrError$$}),...($status$$==="failed"&&{error:$errorMsg$$})},Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] Emitting flow-log-event:`,{...$logEventPayload_outputDataOrError$$,outputData:"..."}),global.socketContainer.socketIO.to($flowInstanceId$$).emit("flow-log-event",$logEventPayload_outputDataOrError$$));$flowState$$!==$status$$&&Logger.info(`[${$flowInstanceId$$}${$triggerContext$$}] UPDATED Node ${$nodeId$$} status: ${$flowState$$} -> ${$status$$}`)}else Logger.warn(`[${$flowInstanceId$$}] ### updateNodeStatus ### Cannot update node ${$nodeId$$}: Node or flow instance not found.`)}getFlowStatus($flowInstanceId$jscomp$12_flowState$$){return($flowInstanceId$jscomp$12_flowState$$=
63
+ this.runningFlows[$flowInstanceId$jscomp$12_flowState$$])?{flowId:$flowInstanceId$jscomp$12_flowState$$.flowId,instanceId:$flowInstanceId$jscomp$12_flowState$$.instanceId,status:$flowInstanceId$jscomp$12_flowState$$.status,nodes:Object.values($flowInstanceId$jscomp$12_flowState$$.nodes).map($n$$=>({id:$n$$.id,type:$n$$.type,status:$n$$.status,outputData:$n$$.outputData,inputPayload:$n$$.inputPayload,error:$n$$.error,...($n$$.type==="userform"?{directCompleteSecret:$n$$.directCompleteSecret}:{})}))}:
64
+ null}getAllFlowStatuses(){return Object.keys(this.runningFlows).map($id$$=>this.getFlowStatus($id$$)).filter(Boolean)}getInstancesForFlow($flowId$$){const $targetFlowId$$=$flowId$$.toString();return Object.values(this.runningFlows).filter($state$$=>$state$$.flowId===$targetFlowId$$).map($state$$=>this.getFlowStatus($state$$.instanceId)).filter(Boolean)}stopAllInstancesOfFlow($flowId$$,$reason$$="Stopped all instances for flow definition"){const $targetFlowId$$=$flowId$$.toString();$flowId$$=Object.values(this.runningFlows).filter($state$$=>
65
+ $state$$.flowId===$targetFlowId$$&&"running pending active_repeating active_listening waiting listening pending_input".split(" ").includes($state$$.status)).map($state$$=>$state$$.instanceId);if($flowId$$.length===0)return Logger.info(`[FlowEngine] No running/waiting/listening instances found for flow ${$targetFlowId$$} to stop.`),[];Logger.info(`[FlowEngine] Requesting stop for ${$flowId$$.length} instances of flow ${$targetFlowId$$}. Reason: ${$reason$$}`);const $stoppedInstanceIds$$=[];$flowId$$.forEach($instanceId$$=>
66
+ {try{this.stopFlow($instanceId$$,!1,$reason$$),$stoppedInstanceIds$$.push($instanceId$$)}catch($error$$){Logger.error(`[FlowEngine] Error stopping instance ${$instanceId$$} for flow ${$targetFlowId$$}:`,$error$$)}});return $stoppedInstanceIds$$}}
63
67
  const WebhookManager=require("./WebhookManager"),init=async $activeInstance_app_flows$$=>{Logger.info("init FlowEngine...");var $flowEngine_flowInstanceId$$=global.flowEngine=new FlowEngine;const $webhookManager$$=new WebhookManager($flowEngine_flowInstanceId$$);$flowEngine_flowInstanceId$$.setWebhookManager($webhookManager$$);$webhookManager$$.attach($activeInstance_app_flows$$);$activeInstance_app_flows$$=await global.getModel("flow").find({"activeInstance.status":{$in:["running","listening"]}}).lean();
64
68
  for(let $flow$$ of $activeInstance_app_flows$$)if($activeInstance_app_flows$$=$flow$$.activeInstance){$flowEngine_flowInstanceId$$=$activeInstance_app_flows$$.instanceId;try{await global.flowEngine.startFlow($flow$$._id.toString(),$activeInstance_app_flows$$.initialData||{},$flowEngine_flowInstanceId$$),Logger.info("[FlowEngin] restart flow",$flow$$.title,$flow$$._id)}catch($e$$){Logger.error("[FlowEngin] restart flow",$e$$)}}};module.exports=init;
@@ -21,6 +21,6 @@ if($registration$$&&$expectedToken_signatureHash$$&&$activeInstanceIds_req$$.que
21
21
  $res$$.status(500).send("Internal Server Configuration Error.");if($appSecret$$){$challengeValue_currentVerificationConfig_signatureHeader$$=$activeInstanceIds_req$$.headers["x-hub-signature-256"];const $rawBodyBuffer$$=$activeInstanceIds_req$$.rawBodyBuffer;if(!$challengeValue_currentVerificationConfig_signatureHeader$$)return $res$$.status(403).send("Forbidden: Missing request signature.");if(!$rawBodyBuffer$$)return $res$$.status(400).send("Bad Request: Could not verify signature (missing raw body).");
22
22
  try{$expectedToken_signatureHash$$=$challengeValue_currentVerificationConfig_signatureHeader$$.split("=")[1];if(!$expectedToken_signatureHash$$)throw Error("Invalid signature format.");$expectedHash_mode$$=crypto.createHmac("sha256",$appSecret$$).update($rawBodyBuffer$$).digest("hex");if(!crypto.timingSafeEqual(Buffer.from($expectedToken_signatureHash$$,"hex"),Buffer.from($expectedHash_mode$$,"hex")))return Logger.warn(`[WebhookManager] Denying request for ${$activeInstanceIds_req$$.path}: Invalid signature.`),
23
23
  $res$$.status(403).send("Forbidden: Invalid request signature.");Logger.info(`[WebhookManager] Signature VERIFIED for ${$activeInstanceIds_req$$.method} ${$activeInstanceIds_req$$.path}.`)}catch($sigError$$){return Logger.error(`[WebhookManager] Error verifying signature for ${$activeInstanceIds_req$$.path}:`,$sigError$$),$res$$.status(400).send("Bad Request: Could not verify signature.")}}else Logger.warn(`[WebhookManager] Proceeding without signature verification for ${$activeInstanceIds_req$$.path} (App Secret not configured).`);
24
- const $webhookData$$={body:$activeInstanceIds_req$$.body,query:$activeInstanceIds_req$$.query,headers:$activeInstanceIds_req$$.headers,method:$activeInstanceIds_req$$.method,path:$activeInstanceIds_req$$.path,ip:$activeInstanceIds_req$$.ip};$activeInstanceIds_req$$=Array.from($registration$$.activeInstances);if($activeInstanceIds_req$$.length>0)return Logger.info(`[WebhookManager] Triggering node ${$nodeId$$} in ${$activeInstanceIds_req$$.length} active instance(s) for ${$registrationKey$$}...`),
24
+ const $webhookData$$={body:$activeInstanceIds_req$$.body,query:$activeInstanceIds_req$$.query,headers:$activeInstanceIds_req$$.headers,method:$activeInstanceIds_req$$.method,path:$activeInstanceIds_req$$.path,ip:$activeInstanceIds_req$$.ip};$activeInstanceIds_req$$=Array.from($registration$$.activeInstances);if($activeInstanceIds_req$$.length>0)return Logger.warn(`[WebhookManager] Triggering node ${$nodeId$$} in ${$activeInstanceIds_req$$.length} active instance(s) for ${$registrationKey$$}...`),
25
25
  $activeInstanceIds_req$$.map($instanceId$$=>this.flowEngine.triggerNodeInInstance($instanceId$$,$nodeId$$,$webhookData$$).catch($triggerError$$=>{Logger.error(`[WebhookManager] Error triggering node ${$nodeId$$} in instance ${$instanceId$$}:`,$triggerError$$);return{status:"rejected",instanceId:$instanceId$$,error:$triggerError$$}})),$res$$.status(200).send({status:"success",triggeredInstances:$activeInstanceIds_req$$.length});Logger.warn(`[WebhookManager] Received data for ${$registrationKey$$}, but no active instances found. Ignoring.`);
26
26
  return $res$$.status(200).send({status:"ignored",message:"No active flow instances found for this trigger."})}}getActiveWebhooks(){const $activeWebhooks$$=[];for(const [$key$$,$registration$$]of this.registeredWebhooks.entries())$registration$$.activeInstances.size>0&&$activeWebhooks$$.push({key:$key$$,...$registration$$.info,activeInstanceCount:$registration$$.activeInstances.size});return $activeWebhooks$$}}module.exports=WebhookManager;
@@ -1,3 +1,3 @@
1
1
  const inject=require("./nodes/inject"),debug=require("./nodes/debug"),delay=require("./nodes/delay"),email=require("./nodes/email"),_function=require("./nodes/function"),forEachItem=require("./nodes/forEachItem"),_switch=require("./nodes/switch"),httprequest=require("./nodes/httprequest"),webhook=require("./nodes/webhook"),facebook=require("./nodes/facebook"),facebooksendmessage=require("./nodes/facebookSendMessage"),facebookconversations=require("./nodes/facebookConversations"),facebookcreatepost=
2
- require("./nodes/facebookCreatePost"),aianalysis=require("./nodes/aiAnalysis"),savedata=require("./nodes/saveData"),customer=require("./nodes/customer"),report=require("./nodes/report"),data=require("./nodes/data"),event=require("./nodes/event"),pushnotification=require("./nodes/pushNotification"),zalosendmessage=require("./nodes/zaloSendMessage"),checkaction=require("./nodes/checkAction");
3
- module.exports={inject,debug,function:_function,foreachitem:forEachItem,switch:_switch,delay,email,httprequest,webhook,facebook,facebooksendmessage,facebookconversations,facebookcreatepost,aianalysis,savedata,customer,report,data,event,pushnotification,zalosendmessage,checkaction};
2
+ require("./nodes/facebookCreatePost"),aianalysis=require("./nodes/aiAnalysis"),savedata=require("./nodes/saveData"),customer=require("./nodes/customer"),report=require("./nodes/report"),data=require("./nodes/data"),event=require("./nodes/event"),pushnotification=require("./nodes/pushNotification"),zalosendmessage=require("./nodes/zaloSendMessage"),checkaction=require("./nodes/checkAction"),{userformHandler:userform}=require("./nodes/userform");
3
+ module.exports={inject,debug,function:_function,foreachitem:forEachItem,switch:_switch,delay,email,httprequest,webhook,facebook,facebooksendmessage,facebookconversations,facebookcreatepost,aianalysis,savedata,customer,report,data,event,pushnotification,zalosendmessage,checkaction,userform};
@@ -0,0 +1,28 @@
1
+ const redis=require("redis"),{compileHtml,evalute}=require("../../libs/utils");global.__userformPendingCallbacks||(global.__userformPendingCallbacks=new Map);async function _resolveApiCode($code$$){return $code$$?(await global.getModel("listinfo").findOne({code:$code$$}))?.api_code||$code$$:null}
2
+ async function _processPayload({payload:$payload$$,isPipeline:$isPipeline_notifyUsers$$,flowState:$flowState$$,node:$node$$,abortSignal:$abortSignal$$,engineContext:$engineContext_nodeInstanceId$$,triggerId:$triggerId$$}){const {updateNodeStatus:$updateNodeStatus$$,triggerDownstreamNodesInternal:$triggerDownstreamNodesInternal$$}=$engineContext_nodeInstanceId$$,$instanceId$$=$flowState$$.instanceId,$nodeId$$=$node$$.id;$engineContext_nodeInstanceId$$=`${$instanceId$$}-${$nodeId$$}`;const $nodeLabel$$=
3
+ $node$$.data?.name||$nodeId$$,$id_app$$=$flowState$$.flowDefinition.id_app;var $configMode_passThrough$$=()=>{$updateNodeStatus$$($instanceId$$,$nodeId$$,"completed",$payload$$,void 0,$triggerId$$);$triggerDownstreamNodesInternal$$($instanceId$$,$nodeId$$,$payload$$,$triggerId$$);return"pass-through"};if(!$payload$$?.code)return Logger.info(`[${$engineContext_nodeInstanceId$$}] payload kh\u00f4ng c\u00f3 code (kh\u00f4ng ph\u1ea3i ch\u1ee9ng t\u1eeb th\u1eadt) \u2014 ${$isPipeline_notifyUsers$$?"pass-through":
4
+ "b\u1ecf qua"}.`),$isPipeline_notifyUsers$$?$configMode_passThrough$$():"skip";const $taskCode$$=$node$$.data?.code||$payload$$.code;if($node$$.data?.condition_script?.trim()){let $pass$$=!1;try{$pass$$=!!evalute($node$$.data.condition_script,{payload:$payload$$,node:$node$$.data})}catch($e$$){return Logger.error(`[${$engineContext_nodeInstanceId$$}] condition_script l\u1ed7i:`,$e$$.message),$isPipeline_notifyUsers$$?$configMode_passThrough$$():"skip"}if(!$pass$$)return Logger.info(`[${$engineContext_nodeInstanceId$$}] condition_script \u2192 false \u2014 ${$isPipeline_notifyUsers$$?
5
+ "pass-through":"b\u1ecf qua"}.`),$isPipeline_notifyUsers$$?$configMode_passThrough$$():"skip"}$isPipeline_notifyUsers$$=$node$$.data?.notify_users||[];if($node$$.data?.notify_users_script?.trim())try{var $prefillData_result_sanitizedPrefill$$=evalute($node$$.data.notify_users_script,{payload:$payload$$,node:$node$$.data});Array.isArray($prefillData_result_sanitizedPrefill$$)&&$prefillData_result_sanitizedPrefill$$.length>0?$isPipeline_notifyUsers$$=$prefillData_result_sanitizedPrefill$$:typeof $prefillData_result_sanitizedPrefill$$===
6
+ "string"&&$prefillData_result_sanitizedPrefill$$&&($isPipeline_notifyUsers$$=[$prefillData_result_sanitizedPrefill$$])}catch($e$$){Logger.warn(`[${$engineContext_nodeInstanceId$$}] notify_users_script l\u1ed7i, d\u00f9ng danh s\u00e1ch t\u0129nh:`,$e$$.message)}$prefillData_result_sanitizedPrefill$$=$payload$$;if($node$$.data?.prefill_script?.trim())try{$prefillData_result_sanitizedPrefill$$=evalute($node$$.data.prefill_script,{payload:$payload$$,node:$node$$.data})||$payload$$}catch($e$$){Logger.warn(`[${$engineContext_nodeInstanceId$$}] prefill_script l\u1ed7i, d\u00f9ng payload g\u1ed1c:`,
7
+ $e$$.message)}$prefillData_result_sanitizedPrefill$$=JSON.parse(JSON.stringify($prefillData_result_sanitizedPrefill$$));$configMode_passThrough$$=$node$$.data?.mode||"auto";return{result:"task-created",pendingId:await _createPendingTask({id_app:$id_app$$,instanceId:$instanceId$$,nodeId:$nodeId$$,nodeInstanceId:$engineContext_nodeInstanceId$$,nodeLabel:$nodeLabel$$,taskCode:$taskCode$$,sourceCode:$payload$$?.code||$node$$.data?.listen_code,effectiveMode:$configMode_passThrough$$==="auto"?$prefillData_result_sanitizedPrefill$$._id?
8
+ "edit":"create":$configMode_passThrough$$,sanitizedPrefill:$prefillData_result_sanitizedPrefill$$,flowDefinition:$flowState$$.flowDefinition,nodeData:$node$$.data,notifyUsers:$isPipeline_notifyUsers$$,updateNodeStatus:$updateNodeStatus$$,triggerDownstreamNodesInternal:$triggerDownstreamNodesInternal$$,abortSignal:$abortSignal$$,triggerId:$triggerId$$})}}
9
+ async function _createPendingTask({id_app:$id_app$$,instanceId:$instanceId$$,nodeId:$nodeId$$,nodeInstanceId:$nodeInstanceId$$,nodeLabel:$nodeLabel$$,taskCode:$taskCode$$,sourceCode:$sourceCode$$,effectiveMode:$effectiveMode$$,sanitizedPrefill:$sanitizedPrefill$$,flowDefinition:$flowDefinition$$,nodeData:$nodeData$$,notifyUsers:$notifyUsers$$,updateNodeStatus:$updateNodeStatus$$,triggerDownstreamNodesInternal:$triggerDownstreamNodesInternal$$,abortSignal:$abortSignal$$,triggerId:$triggerId$$}){const $PendingModel$$=
10
+ global.getModel("flowpending");if(!$PendingModel$$)throw"Model 'flowpending' ch\u01b0a \u0111\u01b0\u1ee3c \u0111\u0103ng k\u00fd.";const $pendingId$$=(await $PendingModel$$.create({id_app:$id_app$$,instance_id:$instanceId$$,node_id:$nodeId$$,node_instance_id:$nodeInstanceId$$,flow_id:$flowDefinition$$._id,flow_title:$flowDefinition$$.title||"",node_name:$nodeLabel$$,form_title:$nodeData$$?.form_title||$nodeLabel$$,code:$taskCode$$,source_code:$sourceCode$$,mode:$effectiveMode$$,prefill_data:$sanitizedPrefill$$,
11
+ status:"pending",date_created:new Date,notify_users:$notifyUsers$$}))._id.toString();Logger.info(`[${$nodeInstanceId$$}] T\u1ea1o pending: ${$pendingId$$} (form: ${$taskCode$$}, ngu\u1ed3n: ${$sourceCode$$||"\u2014"}, mode: ${$effectiveMode$$})`);if($notifyUsers$$.length>0)try{const $rawMsg$$=$nodeData$$?.notify_message||`Flow "${$flowDefinition$$.title||""}" \u0111ang ch\u1edd nh\u1eadp li\u1ec7u: ${$nodeData$$?.form_title||$nodeLabel$$}`;global.getModel("app").emitEvent($id_app$$,"flow-event",{title:`[Nh\u1eadp li\u1ec7u] ${$nodeData$$?.form_title||
12
+ $nodeLabel$$}`,body:compileHtml($rawMsg$$,{payload:$sanitizedPrefill$$}),data:{type:"userform_pending",pending_id:$pendingId$$}},null,$notifyUsers$$,!0,!0)}catch($e$$){Logger.warn(`[${$nodeInstanceId$$}] Kh\u00f4ng g\u1eedi \u0111\u01b0\u1ee3c th\u00f4ng b\u00e1o:`,$e$$.message)}const $callbackEntry$$={triggerDownstreamNodesInternal:$triggerDownstreamNodesInternal$$,updateNodeStatus:$updateNodeStatus$$,instanceId:$instanceId$$,nodeId:$nodeId$$,id_app:$id_app$$,triggerId:$triggerId$$,resolved:!1,subscriber:null,
13
+ resumeSubscriber:null};global.__userformPendingCallbacks.set($pendingId$$,$callbackEntry$$);$callbackEntry$$.resumeSubscriber=initResumeListener($pendingId$$,$id_app$$,$callbackEntry$$,$abortSignal$$);$abortSignal$$?.addEventListener("abort",()=>{$callbackEntry$$.resolved=!0;$PendingModel$$.updateOne({_id:$pendingId$$},{$set:{status:"aborted"}}).catch(()=>{});_cleanup($pendingId$$,$callbackEntry$$.subscriber,$callbackEntry$$.resumeSubscriber)},{once:!0});return $pendingId$$}
14
+ async function userformHandler($flowState$$,$node$$,$expectedSecret_payload$$,$abortSignal$$,$engineContext$$){const {updateNodeStatus:$updateNodeStatus$$,triggerDownstreamNodesInternal:$triggerDownstreamNodesInternal$$}=$engineContext$$,$instanceId$$=$flowState$$.instanceId,$nodeId$$=$node$$.id,$nodeInstanceId$$=`${$instanceId$$}-${$nodeId$$}`,$nodeLabel$$=$node$$.data?.name||$nodeId$$,$id_app$$=$flowState$$.flowDefinition.id_app;if($abortSignal$$?.aborted)throw new DOMException("Aborted by signal",
15
+ "AbortError");var $directCompletePayload_isStartNode$$=$expectedSecret_payload$$&&$expectedSecret_payload$$.body&&$expectedSecret_payload$$.body.__direct_complete===!0?$expectedSecret_payload$$.body:null;if($directCompletePayload_isStartNode$$)($expectedSecret_payload$$=$node$$.directCompleteSecret)&&$directCompletePayload_isStartNode$$.__secret!==$expectedSecret_payload$$?Logger.warn(`[${$nodeInstanceId$$}] direct-complete: secret kh\u00f4ng kh\u1edbp \u2014 t\u1eeb ch\u1ed1i y\u00eau c\u1ea7u.`):
16
+ ($expectedSecret_payload$$||Logger.warn(`[${$nodeInstanceId$$}] direct-complete: node.directCompleteSecret ch\u01b0a \u0111\u01b0\u1ee3c thi\u1ebft l\u1eadp \u2014 `+"FlowEngine.js c\u00f3 th\u1ec3 ch\u01b0a \u00e1p d\u1ee5ng PATCH 5. \u0110ang b\u1ecf qua ki\u1ec3m tra secret."),Logger.info(`[${$nodeInstanceId$$}] direct-complete h\u1ee3p l\u1ec7 \u2014 b\u1ecf qua t\u1ea1o task, ti\u1ebfp t\u1ee5c flow ngay.`),$updateNodeStatus$$($instanceId$$,$nodeId$$,"completed",void 0,$directCompletePayload_isStartNode$$.result,
17
+ null),$triggerDownstreamNodesInternal$$($instanceId$$,$nodeId$$,$directCompletePayload_isStartNode$$.result,null));else{var $listenCode$$=$node$$.data?.listen_code||$node$$.data?.code||$expectedSecret_payload$$?.code,$listenApiCode$$=$listenCode$$?await _resolveApiCode($listenCode$$):null;$directCompletePayload_isStartNode$$=($node$$.predecessorCount||0)===0;var $listenEvents$$=$node$$.data?.listen_events||["new","update","request_approved"];Logger.info(`[${$nodeInstanceId$$}] ${$nodeLabel$$}: ${$directCompletePayload_isStartNode$$?
18
+ "L\u1eaeNG NGHE":"PIPELINE"}`+` | listen: ${$node$$.data?.listen_code||"\u2014"} \u2192 form: ${$node$$.data?.code||"payload.code"}`);var $r$$=await _processPayload({payload:$expectedSecret_payload$$,isPipeline:!$directCompletePayload_isStartNode$$,flowState:$flowState$$,node:$node$$,abortSignal:$abortSignal$$,engineContext:$engineContext$$,triggerId:null});if($r$$!=="pass-through"){if($listenApiCode$$&&($directCompletePayload_isStartNode$$||$node$$.data?.listen_direct_ops!==!1)){const $channels$$=
19
+ $listenEvents$$.map($et$$=>`${$listenApiCode$$}-${$et$$}-${$id_app$$}`),$subscriber$$=redis.createClient();$subscriber$$.on("error",$err$$=>Logger.warn(`[${$nodeInstanceId$$}] Redis l\u1ed7i:`,$err$$.message));$subscriber$$.on("connect",()=>{$channels$$.forEach($ch$$=>$subscriber$$.subscribe($ch$$));Logger.info(`[${$nodeInstanceId$$}] L\u1eafng nghe: ${$channels$$.join(", ")}`)});$subscriber$$.on("message",async($ch$$,$message$$)=>{if(!$abortSignal$$?.aborted){try{var $eventPayload$$=JSON.parse($message$$)}catch{return}!$eventPayload$$.code&&
20
+ $listenCode$$&&($eventPayload$$={...$eventPayload$$,code:$listenCode$$});await _processPayload({payload:$eventPayload$$,isPipeline:!1,flowState:$flowState$$,node:$node$$,abortSignal:$abortSignal$$,engineContext:$engineContext$$,triggerId:`evt_${Date.now()}_${$nodeId$$.slice(-4)}`})}});$abortSignal$$?.addEventListener("abort",()=>{try{$subscriber$$.connected&&$subscriber$$.unsubscribe(()=>$subscriber$$.quit())}catch($e$$){Logger.error("[UserformNode]",$e$$)}},{once:!0})}if($directCompletePayload_isStartNode$$)return $updateNodeStatus$$($instanceId$$,
21
+ $nodeId$$,"active_listening",void 0,void 0,null),{repeating:!0,nodeType:"userform_listening",nodeStatus:"active_listening"};$updateNodeStatus$$($instanceId$$,$nodeId$$,"pending_input",void 0,{pendingId:$r$$?.pendingId,prefillData:JSON.parse(JSON.stringify($expectedSecret_payload$$||{})),mode:$node$$.data?.mode||"auto",formTitle:$node$$.data?.form_title||$nodeLabel$$,code:$node$$.data?.code,listenCode:$node$$.data?.listen_code},"waiting_input");return{repeating:!0,nodeType:"userform_waiting",nodeStatus:"pending_input"}}}}
22
+ function _cleanup($pendingId$$,...$subscribers$$){global.__userformPendingCallbacks.delete($pendingId$$);for(const $sub$$ of $subscribers$$)if($sub$$)try{$sub$$.connected&&$sub$$.unsubscribe(()=>$sub$$.quit())}catch($e$$){Logger.error("[UserformNode]",$e$$)}}
23
+ function initResumeListener($pendingId$$,$id_app$$,$callbackEntry$$,$abortSignal$$){const {triggerDownstreamNodesInternal:$triggerDownstreamNodesInternal$$,updateNodeStatus:$updateNodeStatus$$,instanceId:$instanceId$$,nodeId:$nodeId$$}=$callbackEntry$$,$sub$$=redis.createClient();$sub$$.on("error",$err$$=>Logger.warn("[userform] resume listener l\u1ed7i:",$err$$.message));$sub$$.on("connect",()=>$sub$$.subscribe(`flowpending-update-${$id_app$$}`));$sub$$.on("message",async($ch$$,$message$$)=>{if(!$callbackEntry$$.resolved&&
24
+ !$abortSignal$$?.aborted){try{var $event_formResult$$=JSON.parse($message$$)}catch{return}$ch$$=$event_formResult$$?.status||$event_formResult$$?.data?.status;String($event_formResult$$?._id||$event_formResult$$?.data?._id||"")===String($pendingId$$)&&$ch$$==="completed"&&($event_formResult$$=$event_formResult$$?.result||$event_formResult$$?.data?.result,$event_formResult$$!==void 0&&($callbackEntry$$.resolved=!0,$ch$$=`form_${$pendingId$$}`,$updateNodeStatus$$($instanceId$$,$nodeId$$,"running",void 0,
25
+ $event_formResult$$,$ch$$),$triggerDownstreamNodesInternal$$($instanceId$$,$nodeId$$,$event_formResult$$,$ch$$),$updateNodeStatus$$($instanceId$$,$nodeId$$,"completed",void 0,$event_formResult$$,$ch$$),_cleanup($pendingId$$,$sub$$,$callbackEntry$$.subscriber)))}});$abortSignal$$?.addEventListener("abort",()=>{try{$sub$$.connected&&$sub$$.quit()}catch($e$$){Logger.error("[UserformNode]",$e$$)}},{once:!0});return $sub$$}
26
+ async function resumeUserformAction($pendingId$$,$formResult$$,$entry_id_app$$){var $PendingModel$jscomp$1_tid$$=global.getModel("flowpending");if(!await $PendingModel$jscomp$1_tid$$.findOne({_id:$pendingId$$,id_app:$entry_id_app$$,status:"pending"}).lean())throw Error(`Kh\u00f4ng t\u00ecm th\u1ea5y '${$pendingId$$}' ho\u1eb7c \u0111\u00e3 ho\u00e0n th\u00e0nh.`);if(!await $PendingModel$jscomp$1_tid$$.findOneAndUpdate({_id:$pendingId$$,status:"pending"},{$set:{status:"completed",result:$formResult$$,
27
+ date_completed:new Date}},{new:!1}))throw Error("\u0110\u00e3 \u0111\u01b0\u1ee3c x\u1eed l\u00fd b\u1edfi ti\u1ebfn tr\u00ecnh kh\u00e1c.");if(($entry_id_app$$=global.__userformPendingCallbacks.get($pendingId$$))&&!$entry_id_app$$.resolved){$entry_id_app$$.resolved=!0;var {triggerDownstreamNodesInternal:$triggerDownstreamNodesInternal$$,updateNodeStatus:$updateNodeStatus$$,instanceId:$instanceId$$,nodeId:$nodeId$$}=$entry_id_app$$;$PendingModel$jscomp$1_tid$$=`form_${$pendingId$$}`;$updateNodeStatus$$($instanceId$$,
28
+ $nodeId$$,"running",void 0,$formResult$$,$PendingModel$jscomp$1_tid$$);$triggerDownstreamNodesInternal$$($instanceId$$,$nodeId$$,$formResult$$,$PendingModel$jscomp$1_tid$$);$updateNodeStatus$$($instanceId$$,$nodeId$$,"completed",void 0,$formResult$$,$PendingModel$jscomp$1_tid$$);_cleanup($pendingId$$,$entry_id_app$$.subscriber,$entry_id_app$$.resumeSubscriber)}}module.exports={userformHandler,initResumeListener,resumeUserformAction};
@@ -51,9 +51,17 @@ metadata:[{name:"code",label:"Lo\u1ea1i d\u1eef li\u1ec7u",type:"autocomplete",r
51
51
  {type:"pushnotification",label:"G\u1eedi th\u00f4ng b\u00e1o",category:"C\u00f4ng ty",description:"G\u1eedi th\u00f4ng b\u00e1o t\u1edbi ng\u01b0\u1eddi d\u00f9ng trong c\u00f4ng ty.",metadata:[{name:"defaultMessage",label:"Tin nh\u1eafn m\u1eb7c \u0111\u1ecbnh (Text)",type:"code",default:"",helper:"N\u1ed9i dung g\u1eedi. \u01afu ti\u00ean l\u1ea5y t\u1eeb 'payload.messageText'. N\u1ed9i dung c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c k\u1ebft h\u1ee3p v\u1edbi d\u1ef1 li\u1ec7u t\u1eeb payload. V\u00ed d\u1ee5: 'Ch\u1ee9ng t\u1eeb c\u00f3 s\u1ed1 ${payload.so_ct} c\u1ea7n x\u1eed l\u00fd'"},
52
52
  {name:"recipientId",label:"Ng\u01b0\u1eddi nh\u1eadn",type:"autocomplete",ref_model:"participant",ref_field:"email",ref_label:"name",multiple:!0,default:"",helper:"Ng\u01b0\u1eddi nh\u1eadn th\u00f4ng b\u00e1o. \u01afu ti\u00ean l\u1ea5y t\u1eeb 'payload.recipientId'"}]},{type:"report",label:"B\u00e1o c\u00e1o",category:"C\u00f4ng ty",description:"Ch\u1ea1y m\u1ed9t b\u00e1o c\u00e1o t\u1eeb d\u1eef li\u1ec7u c\u1ee7a c\u00f4ng ty.",metadata:[{name:"code",label:"B\u00e1o c\u00e1o",type:"autocomplete",
53
53
  ref_model:"reportinfo",ref_field:"code",ref_label:"title",ref_data_fields:"code,title,form_condition_info",default:"",required:!0},{name:"condition",label:"\u0110i\u1ec1u ki\u1ec7n m\u1eb7c \u0111\u1ecbnh",type:"formbase",default:{},helper:"\u0110i\u1ec1u ki\u1ec7n \u0111\u1ec3 ch\u1ea1y b\u00e1o c\u00e1o. \u01afu ti\u00ean l\u1ea5y t\u1eeb 'payload.condition'."},{name:"rpt_id",label:"M\u1eabu in",type:"select",ref_model:"rpt",ref_field:"_id",ref_label:"ten_mau_in",default:"",helper:"M\u1eabu in \u0111\u1ec3 render b\u00e1o c\u00e1o. N\u1ebfu kh\u00f4ng ch\u1ecdn m\u1eabu in th\u00ec s\u1ebd tr\u1ea3 v\u1ec1 d\u1eef li\u1ec7u d\u1ea1ng json"},
54
- {name:"send_to",label:"G\u1eedi b\u00e1o c\u00e1o t\u1edbi",type:"autocomplete",ref_model:"participant",ref_field:"email",ref_label:"name",multiple:!0,default:"",helper:"G\u1eedi b\u00e1o c\u00e1o t\u1edbi ng\u01b0\u1eddi d\u00f9ng"}]},{type:"customer",label:"Kh\u00e1ch h\u00e0ng",category:"C\u00f4ng ty",description:"C\u00e1c thao t\u00e1c li\u00ean quan \u0111\u1ebfn kh\u00e1ch h\u00e0ng nh\u01b0 t\u1ea1o m\u1edbi, c\u1eadp nh\u1eadt, l\u1ea5y danh s\u00e1ch",metadata:[{name:"action",label:"H\u00e0ng \u0111\u1ed9ng",
55
- type:"select",default:"create",required:!0,options:[{value:"create",label:"T\u1ea1o m\u1ed9t ho\u1eb7c nhi\u1ec1u kh\u00e1ch h\u00e0ng m\u1edbi"},{value:"createorupdate",label:"T\u1ea1o m\u1edbi ho\u1eb7c c\u1eadp nh\u1eadt m\u1ed9t ho\u1eb7c nhi\u1ec1u kh\u00e1ch h\u00e0ng"},{value:"list",label:"L\u1ea5y danh s\u00e1ch"}]},{name:"nh_kh",label:"Nh\u00f3m kh\u00e1ch h\u00e0ng",type:"select",default:"",required:!1,ref_model:"dmnhkh",ref_field:"_id",ref_label:"group_name",condition:{group_kind:1,status:!0}},
56
- {name:"trang_thai",label:"Tr\u1ea1ng th\u00e1i",type:"select",default:"",required:!1,ref_model:"trangthai",ref_field:"ma_trang_thai",ref_label:"ten_trang_thai",condition:{ma_ct:"CUSTOMER"}},{name:"ngay_sinh_hom_nay",label:"Ch\u1ec9 l\u1ea5y kh\u00e1ch c\u00f3 ng\u00e0y sinh h\u00f4m nay",type:"checkbox",default:!1,required:!1},{name:"kh_co_fb_id",label:"Ch\u1ec9 l\u1ea5y kh\u00e1ch c\u00f3 Favebook ID",type:"checkbox",default:!1,required:!1},{name:"kh_co_dien_thoai",label:"Ch\u1ec9 l\u1ea5y kh\u00e1ch c\u00f3 s\u1ed1 \u0111i\u1ec7n tho\u1ea1i",
57
- type:"checkbox",default:!1,required:!1},{name:"query",label:"\u0110i\u1ec1u ki\u1ec7n kh\u00e1c",type:"code",helper:"Script tr\u1ea3 v\u1ec1 th\u00eam c\u00e1c \u0111i\u1ec1u ki\u1ec7n kh\u00e1c. C\u00e1c tham s\u1ed1 c\u00f3 s\u1eb5n: moment,numeral,_,payload",default:"",required:!1}]}];
54
+ {name:"send_to",label:"G\u1eedi b\u00e1o c\u00e1o t\u1edbi",type:"autocomplete",ref_model:"participant",ref_field:"email",ref_label:"name",multiple:!0,default:"",helper:"G\u1eedi b\u00e1o c\u00e1o t\u1edbi ng\u01b0\u1eddi d\u00f9ng"}]},{},{type:"userform",label:"Nh\u1eadp li\u1ec7u",category:"T\u01b0\u01a1ng t\u00e1c",description:"D\u1eebng flow v\u00e0 ch\u1edd ng\u01b0\u1eddi d\u00f9ng nh\u1eadp li\u1ec7u. H\u1ed7 tr\u1ee3 2 \u0111\u01b0\u1eddng v\u00e0o song song:\n(1) Ng\u01b0\u1eddi d\u00f9ng m\u1edf form qua flow (quickAdd/quickEdit) \u2014 nh\u1eadn th\u00f4ng b\u00e1o, click, l\u01b0u form.\n(2) Ng\u01b0\u1eddi d\u00f9ng thao t\u00e1c tr\u1ef1c ti\u1ebfp tr\u00ean m\u00e0n h\u00ecnh g\u1ed1c \u2014 node l\u1eafng nghe Redis event c\u1ee7a ch\u1ee9ng t\u1eeb \u0111\u00f3 v\u00e0 t\u1ef1 \u0111\u1ed9ng nh\u1eadn k\u1ebft qu\u1ea3.\n\u0110\u01b0\u1eddng n\u00e0o \u0111\u1ebfn tr\u01b0\u1edbc th\u00ec flow ti\u1ebfp t\u1ee5c theo k\u1ebft qu\u1ea3 \u0111\u00f3.",
55
+ outputDescription:"Tr\u1ea3 v\u1ec1 object d\u1eef li\u1ec7u \u0111\u00e3 \u0111\u01b0\u1ee3c l\u01b0u (t\u1eeb form ho\u1eb7c t\u1eeb thao t\u00e1c tr\u1ef1c ti\u1ebfp). C\u1ea5u tr\u00fac ph\u1ee5 thu\u1ed9c v\u00e0o lo\u1ea1i form (code).",metadata:[{name:"listen_code",label:"L\u1eafng nghe s\u1ef1 ki\u1ec7n c\u1ee7a (lo\u1ea1i ch\u1ee9ng t\u1eeb)",type:"autocomplete",ref_model:"chucnang",ref_api:"listinfo",ref_field:"code",ref_label:"title",ref_data_fields:"code,title,api_code",condition:{is_endpoint:!0,
56
+ require_id_app:!0},default:"",helper:'Lo\u1ea1i ch\u1ee9ng t\u1eeb c\u1ea7n L\u1eaeNG NGHE s\u1ef1 ki\u1ec7n \u0111\u1ec3 t\u1ea1o task.\nV\u00ed d\u1ee5: ch\u1ecdn "\u0110\u01a1n h\u00e0ng" (dh2) \u2192 node l\u1eafng nghe s\u1ef1 ki\u1ec7n \u0111\u01a1n h\u00e0ng \u0111\u01b0\u1ee3c duy\u1ec7t.\n\u0110\u1ec3 tr\u1ed1ng \u2192 d\u00f9ng c\u00f9ng lo\u1ea1i v\u1edbi tr\u01b0\u1eddng "Lo\u1ea1i form x\u1eed l\u00fd" b\u00ean d\u01b0\u1edbi.'},{name:"code",label:"Lo\u1ea1i form / ch\u1ee9ng t\u1eeb",
57
+ type:"autocomplete",ref_model:"chucnang",ref_api:"listinfo",ref_field:"code",ref_label:"title",ref_data_fields:"code,title",condition:{is_endpoint:!0,require_id_app:!0},required:!0,helper:"Lo\u1ea1i form s\u1ebd M\u1ede khi user x\u1eed l\u00fd task. VD: ch\u1ecdn 'pnk' \u2192 user click task s\u1ebd m\u1edf form Phi\u1ebfu nh\u1eadp kho. \u0110\u1ec3 tr\u1ed1ng \u2192 d\u00f9ng lo\u1ea1i ch\u1ee9ng t\u1eeb t\u1eeb payload (backward compat)."},{name:"mode",label:"Ch\u1ebf \u0111\u1ed9 form",type:"select",
58
+ default:"auto",required:!0,options:[{value:"auto",label:"T\u1ef1 \u0111\u1ed9ng (c\u00f3 _id \u2192 s\u1eeda, kh\u00f4ng c\u00f3 \u2192 t\u1ea1o m\u1edbi)"},{value:"create",label:"T\u1ea1o m\u1edbi (quickAdd)"},{value:"edit",label:"Ch\u1ec9nh s\u1eeda (quickEdit)"}],helper:"V\u1edbi 'T\u1ef1 \u0111\u1ed9ng': node ki\u1ec3m tra xem payload t\u1eeb node tr\u01b0\u1edbc c\u00f3 _id kh\u00f4ng \u0111\u1ec3 quy\u1ebft \u0111\u1ecbnh t\u1ea1o m\u1edbi hay s\u1eeda. \u1ea2nh h\u01b0\u1edfng c\u1ea3 \u0111\u1ebfn logic l\u1eafng nghe Redis (edit \u2192 kh\u1edbp _id; create \u2192 nh\u1eadn b\u1ea5t k\u1ef3 b\u1ea3n ghi m\u1edbi n\u00e0o)."},
59
+ {name:"form_title",label:"Ti\u00eau \u0111\u1ec1 form",type:"text",default:"",helper:"Ti\u00eau \u0111\u1ec1 hi\u1ec3n th\u1ecb tr\u00ean n\u00fat, th\u00f4ng b\u00e1o v\u00e0 Task Panel."},{name:"notify_users",label:"Th\u00f4ng b\u00e1o \u0111\u1ebfn (danh s\u00e1ch t\u0129nh)",type:"autocomplete",ref_model:"participant",ref_field:"email",ref_label:"name",multiple:!0,default:[],helper:"Danh s\u00e1ch user nh\u1eadn th\u00f4ng b\u00e1o m\u1eb7c \u0111\u1ecbnh. S\u1ebd b\u1ecb THAY TH\u1ebe b\u1edfi k\u1ebft qu\u1ea3 c\u1ee7a 'notify_users_script' n\u1ebfu script tr\u1ea3 v\u1ec1 danh s\u00e1ch kh\u00f4ng r\u1ed7ng."},
60
+ {name:"notify_users_script",label:"Script x\u00e1c \u0111\u1ecbnh ng\u01b0\u1eddi nh\u1eadn (\u0111\u1ed9ng)",type:"code",default:"",helper:"Script JS tr\u1ea3 v\u1ec1 danh s\u00e1ch email (ho\u1eb7c m\u1ed9t email string) c\u1ee7a nh\u1eefng ng\u01b0\u1eddi s\u1ebd nh\u1eadn th\u00f4ng b\u00e1o v\u00e0 th\u1ea5y task c\u1ea7n x\u1eed l\u00fd.\nK\u1ebft qu\u1ea3 script s\u1ebd THAY TH\u1ebe danh s\u00e1ch t\u0129nh trong 'notify_users' n\u1ebfu tr\u1ea3 v\u1ec1 m\u1ea3ng kh\u00f4ng r\u1ed7ng.\nBi\u1ebfn c\u00f3 s\u1eb5n: payload (d\u1eef li\u1ec7u t\u1eeb node tr\u01b0\u1edbc / event), node (c\u1ea5u h\u00ecnh node).\nV\u00ed d\u1ee5 \u2014 Th\u00f4ng b\u00e1o cho ng\u01b0\u1eddi ph\u1ee5 tr\u00e1ch c\u1ee7a ch\u1ee9ng t\u1eeb:\n return [payload.email_nguoi_phu_trach].filter(Boolean);\nV\u00ed d\u1ee5 \u2014 Th\u00f4ng b\u00e1o cho c\u1ea3 tr\u01b0\u1edfng ph\u00f2ng l\u1eabn ng\u01b0\u1eddi ph\u1ee5 tr\u00e1ch:\n return [payload.email_nguoi_phu_trach, payload.email_truong_phong].filter(Boolean);\nV\u00ed d\u1ee5 \u2014 T\u1ea5t c\u1ea3 user trong m\u1ed9t nh\u00f3m (n\u1ebfu payload c\u00f3 danh s\u00e1ch):\n return (payload.nhom_xu_ly || []).map(u => u.email);"},
61
+ {name:"prefill_script",label:"Script t\u1ea1o d\u1eef li\u1ec7u \u0111i\u1ec1n s\u1eb5n",type:"code",default:"",helper:"Script JS ch\u1ecdn l\u1ecdc/bi\u1ebfn \u0111\u1ed5i payload th\u00e0nh d\u1eef li\u1ec7u \u0111i\u1ec1n s\u1eb5n v\u00e0o form.\nBi\u1ebfn c\u00f3 s\u1eb5n: payload (d\u1eef li\u1ec7u t\u1eeb node tr\u01b0\u1edbc).\nD\u00f9ng 'return' \u0111\u1ec3 tr\u1ea3 v\u1ec1 object.\nV\u00ed d\u1ee5:\n return { ma_kh: payload.ma_kh, ten_kh: payload.ten_kh };"},{name:"condition_script",label:"\u0110i\u1ec1u ki\u1ec7n t\u1ea1o task nh\u1eadp li\u1ec7u",
62
+ type:"code",default:"",helper:"Script JS quy\u1ebft \u0111\u1ecbnh c\u00f3 t\u1ea1o task ch\u1edd nh\u1eadp li\u1ec7u kh\u00f4ng.\nBi\u1ebfn c\u00f3 s\u1eb5n: payload (d\u1eef li\u1ec7u t\u1eeb node tr\u01b0\u1edbc), node (c\u1ea5u h\u00ecnh node hi\u1ec7n t\u1ea1i).\n \u2022 Return TRUE \u2192 t\u1ea1o task v\u00e0 ch\u1edd user nh\u1eadp li\u1ec7u (h\u00e0nh vi b\u00ecnh th\u01b0\u1eddng).\n \u2022 Return FALSE \u2192 b\u1ecf qua, flow ti\u1ebfp t\u1ee5c NGAY m\u00e0 kh\u00f4ng ch\u1edd (pass-through).\n \u2022 \u0110\u1ec3 tr\u1ed1ng \u2192 lu\u00f4n t\u1ea1o task.\nD\u00f9ng khi node nh\u1eadn nhi\u1ec1u s\u1ef1 ki\u1ec7n nh\u01b0ng ch\u1ec9 mu\u1ed1n h\u1ecfi user cho m\u1ed9t s\u1ed1 tr\u01b0\u1eddng h\u1ee3p.\nVD: return payload?.trang_thai === 'request_approved';\nVD: return (payload?.tong_tien || 0) >= 10000000;"},
63
+ {name:"notify_message",label:"N\u1ed9i dung th\u00f4ng b\u00e1o",type:"text",default:"",helper:"N\u1ed9i dung push notification. H\u1ed7 tr\u1ee3 template: d\u00f9ng ${payload.xxx} \u0111\u1ec3 nh\u00fang d\u1eef li\u1ec7u. \u0110\u1ec3 tr\u1ed1ng d\u00f9ng n\u1ed9i dung m\u1eb7c \u0111\u1ecbnh."},{name:"listen_direct_ops",label:"L\u1eafng nghe thao t\u00e1c tr\u1ef1c ti\u1ebfp",type:"checkbox",default:!0,helper:"N\u1ebfu b\u1eadt: node \u0111\u1ed3ng th\u1eddi subscribe Redis channel c\u1ee7a ch\u1ee9ng t\u1eeb. Khi user thao t\u00e1c tr\u1ef1c ti\u1ebfp tr\u00ean m\u00e0n h\u00ecnh g\u1ed1c (kh\u00f4ng qua form c\u1ee7a node n\u00e0y), flow s\u1ebd t\u1ef1 \u0111\u1ed9ng nh\u1eadn k\u1ebft qu\u1ea3 v\u00e0 ti\u1ebfp t\u1ee5c."},
64
+ {name:"listen_events",label:"S\u1ef1 ki\u1ec7n c\u1ea7n l\u1eafng nghe",type:"select",multiple:!0,default:["new","update"],options:[{value:"new",label:"T\u1ea1o m\u1edbi"},{value:"update",label:"C\u1eadp nh\u1eadt"},{value:"request_approved",label:"\u0110\u01b0\u1ee3c duy\u1ec7t"},{value:"request_denied",label:"B\u1ecb t\u1eeb ch\u1ed1i"}],helper:"Ch\u1ecdn lo\u1ea1i s\u1ef1 ki\u1ec7n n\u00e0o t\u1eeb m\u00e0n h\u00ecnh g\u1ed1c s\u1ebd k\u00edch ho\u1ea1t node n\u00e0y. Ch\u1ec9 c\u00f3 hi\u1ec7u l\u1ef1c khi b\u1eadt 'L\u1eafng nghe thao t\u00e1c tr\u1ef1c ti\u1ebfp'."},
65
+ {name:"event_condition_script",label:"\u0110i\u1ec1u ki\u1ec7n nh\u1eadn s\u1ef1 ki\u1ec7n tr\u1ef1c ti\u1ebfp",type:"code",default:"",helper:"Script ki\u1ec3m tra s\u1ef1 ki\u1ec7n t\u1eeb m\u00e0n h\u00ecnh g\u1ed1c c\u00f3 ph\u1ea3i d\u1eef li\u1ec7u c\u1ea7n x\u1eed l\u00fd kh\u00f4ng.\nBi\u1ebfn c\u00f3 s\u1eb5n:\n - eventPayload: d\u1eef li\u1ec7u ch\u1ee9ng t\u1eeb v\u1eeba \u0111\u01b0\u1ee3c t\u1ea1o/c\u1eadp nh\u1eadt\n - prefillData: d\u1eef li\u1ec7u \u0111i\u1ec1n s\u1eb5n ban \u0111\u1ea7u (t\u1eeb node tr\u01b0\u1edbc)\n - payload: payload g\u1ed1c t\u1eeb node tr\u01b0\u1edbc\n - node: c\u1ea5u h\u00ecnh c\u1ee7a node n\u00e0y\nD\u00f9ng 'return true/false'.\nLogic m\u1eb7c \u0111\u1ecbnh (khi \u0111\u1ec3 tr\u1ed1ng):\n - Mode 'edit' + c\u00f3 _id: ch\u1ec9 nh\u1eadn n\u1ebfu eventPayload._id kh\u1edbp prefillData._id\n - Mode 'create': nh\u1eadn b\u1ea5t k\u1ef3 b\u1ea3n ghi m\u1edbi n\u00e0o c\u1ee7a lo\u1ea1i form n\u00e0y\nV\u00ed d\u1ee5 t\u00f9y ch\u1ec9nh:\n // Ch\u1ec9 nh\u1eadn n\u1ebfu \u0111\u01a1n h\u00e0ng thu\u1ed9c kh\u00e1ch h\u00e0ng c\u1ee5 th\u1ec3\n return eventPayload.ma_kh === prefillData.ma_kh && eventPayload.tong_tien > 0;"}]}];
58
66
  async function getPageAccessToken($id_app_page$$,$page_id$$){return($id_app_page$$=await global.getModel("fbpage").findOne({id_app:$id_app_page$$,page_id:$page_id$$}).lean())&&$id_app_page$$.page_access_token?$id_app_page$$.page_access_token:null}
59
67
  const getConfigValue=($node$$,$payload$$,$key$$,$defaultValue$$,$alternativePayloadKeys$$=[])=>{if($payload$$&&typeof $payload$$==="object"){if($payload$$[$key$$]!==void 0&&$payload$$[$key$$]!==null)return $payload$$[$key$$];for(const $altKey$$ of $alternativePayloadKeys$$)if($payload$$[$altKey$$]!==void 0&&$payload$$[$altKey$$]!==null)return $payload$$[$altKey$$]}return $defaultValue$$};module.exports={getConfigValue,getPageAccessToken,Nodes};
package/server/global.js CHANGED
@@ -3,9 +3,10 @@ function globalListinfoCodePlugin($schema$$){$schema$$.path("listinfo_code")||$s
3
3
  global.socketContainer={loadConnectionId:async()=>new Promise($res$$=>{global.clientRedis.get("client-io",function($err$$,$reply$$){if($err$$)return console.error($err$$),$res$$({});if($reply$$)try{let $ios$$=JSON.parse($reply$$);return $res$$($ios$$||{})}catch($e$$){return console.error($e$$),$res$$({})}else return $res$$({})})}),saveConnectionId:async($clientIO$$={})=>new Promise(($res$$,$rej$$)=>{global.clientRedis.set("client-io",JSON.stringify($clientIO$$),$e$$=>{if($e$$)return console.error($e$$),
4
4
  $rej$$($e$$);$res$$($clientIO$$)})})};global.clientIO={};global.model_books="socai socaitmp socainpp vsocai sokho sokhott sokhonpp sokhokhongton sosanxuat vatvao vatra phucap".split(" ");global.secu_models="asskey assproduct assperiod assinvestment asssell assbuy assneedtobuy asswithdraw asscashwithdraw wallet assfindhash assbank asstransaction assissue token tokens user app listinfo right otp payload smsaccount emailaccount".split(" ");global.webPush=require("web-push");global.mongoose=require("mongoose");
5
5
  const originalCast=global.mongoose.Number.cast();global.mongoose.Number.cast(function($value$$){return typeof $value$$==="number"&&Number.isNaN($value$$)?0:originalCast($value$$)});global.mongoose.plugin(mongooseSecurityPlugin);require("./libs/mongoosePatch.js");global.mongoose.plugin(leanID);global.mongoose.plugin(deletePost);global.mongoose.plugin(globalListinfoCodePlugin);global.mongoose.plugin(function($schema$$){$schema$$.set("versionKey",!1)});global.Schema=global.mongoose.Schema;
6
- global.getModel=$model_name_name$$=>{$model_name_name$$=$model_name_name$$.split(".js")[0];var $_requireFields_manualMap_model_model_path_mySchema$$={kbmpttct:"kbmPttct",kbmtkgtgt:"kbmTkgtgt",token:"tokens",bn1:"pc1",bc1:"pt1"};$_requireFields_manualMap_model_model_path_mySchema$$[$model_name_name$$]&&($model_name_name$$=$_requireFields_manualMap_model_model_path_mySchema$$[$model_name_name$$]);if($_requireFields_manualMap_model_model_path_mySchema$$=mongoose.models[$model_name_name$$])return $_requireFields_manualMap_model_model_path_mySchema$$;
7
- if(((global.configs||{}).paths||{}).models&&($_requireFields_manualMap_model_model_path_mySchema$$=((global.configs||{}).paths||{}).models+"/"+$model_name_name$$+".js",fs.existsSync($_requireFields_manualMap_model_model_path_mySchema$$)))return require($_requireFields_manualMap_model_model_path_mySchema$$);$_requireFields_manualMap_model_model_path_mySchema$$=__dirname+"/models/"+$model_name_name$$+".js";if(fs.existsSync($_requireFields_manualMap_model_model_path_mySchema$$))return require($_requireFields_manualMap_model_model_path_mySchema$$);
8
- console.error("model",$model_name_name$$,"is not exists. create new model");$_requireFields_manualMap_model_model_path_mySchema$$={...require("./models/listinfo").requireFields};$_requireFields_manualMap_model_model_path_mySchema$$=new global.Schema($_requireFields_manualMap_model_model_path_mySchema$$,{strict:!1});return global.mongoose.model($model_name_name$$,$_requireFields_manualMap_model_model_path_mySchema$$)};global.getLib=$lib_name$$=>require("./libs/"+$lib_name$$);
6
+ global.getModel=$model_name_name$$=>{$model_name_name$$=$model_name_name$$.split(".js")[0];var $_requireFields_manualMap_model_model_path_mySchema$$={kbmpttct:"kbmPttct",kbmtkgtgt:"kbmTkgtgt",token:"tokens",bn1:"pc1",bc1:"pt1",dmnhkh:"group",dmchucvu:"group",dmnhtask:"group",dmntt:"group",dmnt:"currentcy",dmtk:"account",dmkh:"customer",dmsp:"dmvt",data_socai:"socai",data_socaitc:"socaitc",data_sokho:"sokho"};$_requireFields_manualMap_model_model_path_mySchema$$[$model_name_name$$]&&($model_name_name$$=
7
+ $_requireFields_manualMap_model_model_path_mySchema$$[$model_name_name$$]);if($_requireFields_manualMap_model_model_path_mySchema$$=mongoose.models[$model_name_name$$])return $_requireFields_manualMap_model_model_path_mySchema$$;if(global.controllers[$model_name_name$$.toUpperCase()]&&global.controllers[$model_name_name$$.toUpperCase()].model)return global.controllers[$model_name_name$$].model;if(((global.configs||{}).paths||{}).models&&($_requireFields_manualMap_model_model_path_mySchema$$=((global.configs||
8
+ {}).paths||{}).models+"/"+$model_name_name$$+".js",fs.existsSync($_requireFields_manualMap_model_model_path_mySchema$$)))return require($_requireFields_manualMap_model_model_path_mySchema$$);$_requireFields_manualMap_model_model_path_mySchema$$=__dirname+"/models/"+$model_name_name$$+".js";if(fs.existsSync($_requireFields_manualMap_model_model_path_mySchema$$))return require($_requireFields_manualMap_model_model_path_mySchema$$);console.error("model",$model_name_name$$,"is not exists. create new model");
9
+ $_requireFields_manualMap_model_model_path_mySchema$$={...require("./models/listinfo").requireFields};$_requireFields_manualMap_model_model_path_mySchema$$=new global.Schema($_requireFields_manualMap_model_model_path_mySchema$$,{strict:!1});return global.mongoose.model($model_name_name$$,$_requireFields_manualMap_model_model_path_mySchema$$)};global.getLib=$lib_name$$=>require("./libs/"+$lib_name$$);
9
10
  const pointSchema=new global.mongoose.Schema({type:{type:String,enum:["Point"],required:!0,default:"Point"},coordinates:{type:[Number],required:!0}}),polygonSchema=new global.mongoose.Schema({type:{type:String,enum:["Polygon"],required:!0,default:"Polygon"},coordinates:{type:[[[Number]]],required:!0}});global.customTypes={Point:pointSchema,Polygon:polygonSchema};const EventEmitter=require("events");class GlobalEmitter extends EventEmitter{}global.globalEvents=new GlobalEmitter;
10
11
  global.getSysConfig=async $cf_code$$=>{if($cf_code$$=await global.getModel("sysconfig").findOne({code:$cf_code$$}))return $cf_code$$.value};global.asyncCountUnRead=async $email$$=>{const $Message$$=global.getModel("message");return new Promise($resolve$$=>{setImmediate(()=>{$Message$$.countDocuments({email:$email$$,read:!1},($e$$,$rs$$)=>{$resolve$$($rs$$||0)})})})};
11
12
  global.alertMessage=function($email$$,$id_app$$){onAfterCommit(()=>{const $Message$$=global.getModel("message"),$User$$=global.getModel("user");let $query$$={email_owner:$email$$,read:!1};$id_app$$&&($query$$["exfields.id_app"]=$id_app$$);$Message$$.countDocuments($query$$,function($error$$,$count$$){$error$$?console.log($error$$):$User$$.emitEvent($email$$,"message:count",$count$$,!1)})})};
@@ -1,7 +1,7 @@
1
1
  const dktk=require("./dktk"),cktk=require("./cktk"),pstk=require("./pstk"),Account=global.getModel("account"),async=require("async"),setBacTKCon=($data$$,$tk_me$$,$bac_tk_me$$)=>{$data$$.filter($d$$=>$d$$.tk_me==$tk_me$$).forEach($tk$$=>{$tk$$.bac_tk=$bac_tk_me$$+1;setBacTKCon($data$$,$tk$$.tk,$tk$$.bac_tk)})};
2
2
  module.exports=async function($query$$,$callback$$){try{if(!$query$$.tu_ngay||!$query$$.den_ngay||!$query$$.id_app)throw Error("H\u00e0m n\u00e0y y\u00eau c\u1ea7u c\u00e1c tham s\u1ed1 tu_ngay,den_ngay,id_app");$query$$.tk||($query$$.tk="");let $bac_tk$$=Number($query$$.bac_tk||0);delete $query$$.bac_tk;let $chi_lay_tk_con$$=$query$$.chi_lay_tk_con;delete $query$$.chi_lay_tk_con;const $data$$=await new Promise(($resolve$$,$reject$$)=>{async.parallel({dk:function($callback$$){let $condition$$={...$query$$};
3
3
  $condition$$.ngay=$query$$.tu_ngay;$condition$$.groupBy=["tk"];dktk($condition$$,function($error$$,$result$$){if($error$$)return $callback$$($error$$);$callback$$(null,$result$$)},{model:"socaitc"})},ps:function($callback$$){let $condition$$={id_app:$query$$.id_app},$tk$$=$query$$.tk;if(Array.isArray($tk$$)){let $tks$$;$tk$$.forEach(function($t$$){$tks$$=$tks$$?$tks$$+"|^"+$t$$:"^"+$t$$});$tks$$||="^";$tk$$={$regex:$tks$$,$options:"i"}}else $tk$$={$regex:"^"+$tk$$,$options:"i"};$condition$$.tk=$tk$$;
4
- $query$$.ma_dvcs&&($condition$$.ma_dvcs=$query$$.ma_dvcs);$condition$$.ngay_ct={$gte:$query$$.tu_ngay,$lte:$query$$.den_ngay};$query$$.ma_kho&&($condition$$.ma_kho=$query$$.ma_kho);pstk($condition$$,function($error$$,$result$$){if($error$$)return $callback$$($error$$);$callback$$(null,$result$$)},{model:"socaitt",groupBy:["tk"]})},ck:function($callback$$){let $condition$$={...$query$$};$condition$$.ngay=$query$$.den_ngay;$condition$$.groupBy=["tk"];cktk($condition$$,function($error$$,$result$$){if($error$$)return $callback$$($error$$);
4
+ $query$$.ma_dvcs&&($condition$$.ma_dvcs=$query$$.ma_dvcs);$condition$$.ngay_ct={$gte:$query$$.tu_ngay,$lte:$query$$.den_ngay};$query$$.ma_kho&&($condition$$.ma_kho=$query$$.ma_kho);pstk($condition$$,function($error$$,$result$$){if($error$$)return $callback$$($error$$);$callback$$(null,$result$$)},{model:"socai",groupBy:["tk"]})},ck:function($callback$$){let $condition$$={...$query$$};$condition$$.ngay=$query$$.den_ngay;$condition$$.groupBy=["tk"];cktk($condition$$,function($error$$,$result$$){if($error$$)return $callback$$($error$$);
5
5
  $callback$$(null,$result$$)},{model:"socaitc"})}},function($error$$,$results$$){if($error$$)return $reject$$($error$$);let $data$$=$results$$.ps;$results$$.dk.forEach(function($r$$){$r$$.dk_no=$r$$.du_no00;$r$$.dk_co=$r$$.du_co00;$r$$.dk_no_nt=$r$$.du_no_nt00;$r$$.dk_co_nt=$r$$.du_co_nt00;$data$$.push($r$$)});$results$$.ck.forEach(function($r$$){$r$$.ck_no=$r$$.du_no00;$r$$.ck_co=$r$$.du_co00;$r$$.ck_no_nt=$r$$.du_no_nt00;$r$$.ck_co_nt=$r$$.du_co_nt00;$data$$.push($r$$)});$data$$.groupBy("tk",[{name:"dk_no",
6
6
  value:"dk_no"},{name:"dk_co",value:"dk_co"},{name:"dk_no_nt",value:"dk_no_nt"},{name:"dk_co_nt",value:"dk_co_nt"},{name:"ps_no",value:"ps_no"},{name:"ps_co",value:"ps_co"},{name:"ps_no_nt",value:"ps_no_nt"},{name:"ps_co_nt",value:"ps_co_nt"},{name:"ck_no",value:"ck_no"},{name:"ck_co",value:"ck_co"},{name:"ck_no_nt",value:"ck_no_nt"},{name:"ck_co_nt",value:"ck_co_nt"}],function($error$$,$data$$){if($chi_lay_tk_con$$)return $resolve$$($data$$);let $cdpstkme$$=[];async.map($data$$,function($acc$$,$callback$$){$acc$$.loai_tk=
7
7
  1;let $tk$$=$acc$$.tk;async.forever(function($next$$){Account.find({tk:$tk$$,id_app:$query$$.id_app},{tk_me:1},function($error1_vTK$$,$r$$){$r$$&&$r$$.length==1&&$r$$[0].tk_me?($error1_vTK$$={...$acc$$},$error1_vTK$$.tk=$r$$[0].tk_me,$cdpstkme$$.push($error1_vTK$$),$tk$$=$r$$[0].tk_me,$next$$()):$next$$("finish or has error")})},function(){$callback$$()})},function(){$cdpstkme$$.groupBy("tk",[{name:"dk_no",value:"dk_no"},{name:"dk_co",value:"dk_co"},{name:"dk_no_nt",value:"dk_no_nt"},{name:"dk_co_nt",
@@ -1,13 +1,14 @@
1
1
  const dmvt=global.getModel("dmvt"),sokho=global.getModel("sokho"),hanmucton=global.getModel("hanmucton"),ckvtcapphat=require("./ckvtcapphat"),utils=require("./utils"),_=require("lodash"),moment=require("moment"),buildAggregatePipeline=($match$$,$groupByCols$$)=>{const $groupId$$={};$groupByCols$$.forEach($col$$=>$groupId$$[$col$$]=`$${$col$$}`);return[{$match:$match$$},{$group:{_id:$groupId$$,sl_nhap:{$sum:"$sl_nhap_qd"},sl_xuat:{$sum:"$sl_xuat_qd"},tien_nhap:{$sum:"$tien_nhap"},tien_xuat:{$sum:"$tien_xuat"},
2
2
  ton00:{$sum:"$ton00"},du00:{$sum:"$du00"}}},{$project:{_id:0,...$groupByCols$$.reduce(($acc$$,$curr$$)=>({...$acc$$,[$curr$$]:`$_id.${$curr$$}`}),{}),sl_nhap:1,sl_xuat:1,tien_nhap:1,tien_xuat:1,ton00:1,du00:1}}]};
3
- module.exports=async($condition$$,$callback$$)=>{try{!$condition$$.ngay&&$condition$$.den_ngay&&($condition$$.ngay=$condition$$.den_ngay);$condition$$.ngay||($condition$$.ngay=new Date);const {ma_dvcs:$ma_dvcs$$,ma_kho:$ma_kho$$,id_app:$id_app$$}=$condition$$;let $ma_vt$$=$condition$$.ma_vt;if(_.isString($ma_vt$$)&&$ma_vt$$.includes("["))try{$ma_vt$$=JSON.parse($ma_vt$$),$ma_vt$$.length===0&&($ma_vt$$=void 0)}catch($e$$){Logger.error("[ckvt] parse ma_vt",$e$$,$ma_vt$$)}$ma_vt$$&&_.isArray($ma_vt$$)&&
4
- ($ma_vt$$={$in:$ma_vt$$});let $groupBy$$=$condition$$.groupBy||$condition$$.groupby||["ma_vt"];if(_.isString($groupBy$$))try{$groupBy$$=$groupBy$$.includes("[")?JSON.parse($groupBy$$):$groupBy$$.split(",")}catch($e$$){$groupBy$$=["ma_vt"]}const $ngay$$=moment($condition$$.ngay).endOf("date").toDate(),[$app$$,$lastLockData$$]=await Promise.all([global.getModel("app").findOne({_id:$id_app$$},{ngay_ks:1}).lean(),global.getModel("cdvttheongay").findOne({id_app:$id_app$$,den_ngay:{$lte:moment($ngay$$).startOf("date").toDate()}},
5
- {den_ngay:1}).sort({den_ngay:-1}).lean()]);if(!$app$$)throw"C\u00f4ng ty kh\u00f4ng t\u1ed3n t\u1ea1i";let $ngay_ks$$=$lastLockData$$?$lastLockData$$.den_ngay:null;$ngay_ks$$&&=moment($ngay_ks$$).endOf("date").toDate();var $merge_ngay_tinh_dn$$=$condition$$.tu_ngay&&new Date($condition$$.tu_ngay)<$ngay$$?moment($condition$$.tu_ngay).endOf("date").toDate():$ngay$$;let $ngay_dn$$=moment($merge_ngay_tinh_dn$$).startOf("year").toDate(),$nam$$,$CdvtModel$$;!$ngay_ks$$||$ngay_ks$$<$ngay_dn$$?($CdvtModel$$=
6
- global.getModel("cdvt"),$nam$$=$merge_ngay_tinh_dn$$.getFullYear()):($CdvtModel$$=global.getModel("cdvttheongay"),$ngay_dn$$=moment($ngay_ks$$).startOf("date").add(1,"days").toDate());const $buildFilter$$=($base$$={})=>{const $q$$={...$base$$};$ma_kho$$&&($q$$.ma_kho=$ma_kho$$);$ma_dvcs$$&&($q$$.ma_dvcs=$ma_dvcs$$);$ma_vt$$&&($q$$.ma_vt=$ma_vt$$);["ma_lo","han_sd","ma_tt1","ma_tt2","ma_tt3"].forEach($f$$=>{$condition$$[$f$$]&&($q$$[$f$$]=$condition$$[$f$$])});return $q$$},$pCkcapphat$$=new Promise($resolve$$=>
7
- ckvtcapphat($condition$$,($e$$,$rs$$)=>$resolve$$($rs$$||[]))),$pDauKy$$=(async()=>{const $c_dk$$={id_app:$id_app$$};$nam$$?$c_dk$$.nam=$nam$$:$c_dk$$.den_ngay=$ngay_ks$$;Object.assign($c_dk$$,$buildFilter$$());return $CdvtModel$$.aggregate(buildAggregatePipeline($c_dk$$,$groupBy$$))})(),$pPhatSinh$$=(async()=>{var $pipeline_query$$={id_app:$id_app$$,ngay_ct:{$gte:$ngay_dn$$,$lte:$ngay$$}};Object.assign($pipeline_query$$,$buildFilter$$());$condition$$.id_ct&&($pipeline_query$$.id_ct={$ne:$condition$$.id_ct});
8
- $pipeline_query$$=buildAggregatePipeline($pipeline_query$$,$groupBy$$);return sokho.aggregate($pipeline_query$$).inTxn()})(),$pHanMuc$$=hanmucton.find($buildFilter$$({id_app:$id_app$$})).lean(),$pDefault$$=(async()=>{const $q$$={id_app:$id_app$$,ton_kho_mac_dinh:{$nin:[null,void 0,0]}};$ma_vt$$&&($q$$.ma_vt=$ma_vt$$);return dmvt.find($q$$,{ma_vt:1,ton_kho_mac_dinh:1}).lean()})(),[$ckData$$,$dnData$$,$psData$$,$hmData$$,$dfData$$]=await Promise.all([$pCkcapphat$$,$pDauKy$$,$pPhatSinh$$,$pHanMuc$$,
9
- $pDefault$$]),$dataMap$$=new Map,$getGroupKey$$=$item$$=>$groupBy$$.map($k$$=>$item$$[$k$$]||"").join("||");$merge_ngay_tinh_dn$$=($JSCompiler_temp_const$jscomp$0$$,$type$$)=>{if($JSCompiler_temp_const$jscomp$0$$)for(const $item$$ of $JSCompiler_temp_const$jscomp$0$$){const $key$$=$getGroupKey$$($item$$);if(!$dataMap$$.has($key$$)){$JSCompiler_temp_const$jscomp$0$$=$dataMap$$;var $JSCompiler_temp_const$$=$JSCompiler_temp_const$jscomp$0$$.set;const $obj$$=_.pick($item$$,$groupBy$$);$obj$$.ton00=0;
10
- $obj$$.du00=0;$obj$$.sl_nhap=0;$obj$$.sl_xuat=0;$obj$$.tien_nhap=0;$obj$$.tien_xuat=0;$obj$$.ton00_capphat=0;$obj$$.du00_capphat=0;$obj$$.ton_kho_mac_dinh=0;$obj$$.ton_toi_thieu=0;$obj$$.ton_toi_da=0;$JSCompiler_temp_const$$.call($JSCompiler_temp_const$jscomp$0$$,$key$$,$obj$$)}$JSCompiler_temp_const$jscomp$0$$=$dataMap$$.get($key$$);$type$$==="dn"?($JSCompiler_temp_const$jscomp$0$$.ton00+=$item$$.ton00||0,$JSCompiler_temp_const$jscomp$0$$.du00+=$item$$.du00||0):$type$$==="ps"?($JSCompiler_temp_const$jscomp$0$$.sl_nhap+=
11
- $item$$.sl_nhap||0,$JSCompiler_temp_const$jscomp$0$$.sl_xuat+=$item$$.sl_xuat||0,$JSCompiler_temp_const$jscomp$0$$.tien_nhap+=$item$$.tien_nhap||0,$JSCompiler_temp_const$jscomp$0$$.tien_xuat+=$item$$.tien_xuat||0):$type$$==="capphat"?($JSCompiler_temp_const$jscomp$0$$.ton00_capphat+=$item$$.ton00||0,$JSCompiler_temp_const$jscomp$0$$.du00_capphat+=$item$$.du00||0):$type$$==="default"?$JSCompiler_temp_const$jscomp$0$$.ton_kho_mac_dinh=$item$$.ton_kho_mac_dinh||0:$type$$==="hanmuc"&&($JSCompiler_temp_const$jscomp$0$$.ton_toi_thieu=
12
- $item$$.ton_toi_thieu||0,$JSCompiler_temp_const$jscomp$0$$.ton_toi_da=$item$$.ton_toi_da||0)}};$merge_ngay_tinh_dn$$($dnData$$,"dn");$merge_ngay_tinh_dn$$($psData$$,"ps");$merge_ngay_tinh_dn$$($ckData$$,"capphat");$merge_ngay_tinh_dn$$($dfData$$,"default");$merge_ngay_tinh_dn$$($hmData$$,"hanmuc");const $results$$=Array.from($dataMap$$.values()).map($r$$=>{$r$$.sl_nhap=utils.round($r$$.sl_nhap,4);$r$$.sl_xuat=utils.round($r$$.sl_xuat,4);$r$$.ton00=utils.round($r$$.ton00+$r$$.sl_nhap-$r$$.sl_xuat,
13
- 4);$r$$.du00=Math.roundBy($r$$.du00,0)+Math.roundBy($r$$.tien_nhap,0)-Math.roundBy($r$$.tien_xuat,0);$r$$.sl_nhap=0;$r$$.sl_xuat=0;$r$$.tien_nhap=0;$r$$.tien_xuat=0;$r$$.ton=utils.round($r$$.ton00-($r$$.ton00_capphat>0?$r$$.ton00_capphat:0),4);$r$$.du=$r$$.du00-($r$$.du00_capphat>0?$r$$.du00_capphat:0);return $r$$});return $callback$$?$callback$$(null,$results$$):$results$$}catch($e$$){if($callback$$)return $callback$$($e$$);throw $e$$;}};
3
+ module.exports=async($condition$$,$callback$$)=>{try{!$condition$$.ngay&&$condition$$.den_ngay&&($condition$$.ngay=$condition$$.den_ngay);$condition$$.ngay||($condition$$.ngay=new Date);const {ma_dvcs:$ma_dvcs$$,ma_kho:$ma_kho$$,id_app:$id_app$$,ma_kh:$ma_kh$$}=$condition$$;let $ma_vt$$=$condition$$.ma_vt,$ds_ma_kho$$;$ma_kho$$&&(Array.isArray($ma_kho$$)?$ds_ma_kho$$=[...$ma_kho$$]:typeof $ma_kho$$=="string"&&($ds_ma_kho$$=await global.getModel("dmkho").getAllChildrenGroup($id_app$$,$ma_kho$$)));
4
+ if(_.isString($ma_vt$$)&&$ma_vt$$.includes("["))try{$ma_vt$$=JSON.parse($ma_vt$$),$ma_vt$$.length===0&&($ma_vt$$=void 0)}catch($e$$){Logger.error("[ckvt] parse ma_vt",$e$$,$ma_vt$$)}$ma_vt$$&&_.isArray($ma_vt$$)&&($ma_vt$$={$in:$ma_vt$$});let $groupBy$$=$condition$$.groupBy||$condition$$.groupby||["ma_vt"];if(_.isString($groupBy$$))try{$groupBy$$=$groupBy$$.includes("[")?JSON.parse($groupBy$$):$groupBy$$.split(",")}catch($e$$){$groupBy$$=["ma_vt"]}const $ngay$$=moment($condition$$.ngay).endOf("date").toDate(),
5
+ [$app$$,$lastLockData$$]=await Promise.all([global.getModel("app").findOne({_id:$id_app$$},{ngay_ks:1}).lean(),global.getModel("cdvttheongay").findOne({id_app:$id_app$$,den_ngay:{$lte:moment($ngay$$).startOf("date").toDate()}},{den_ngay:1}).sort({den_ngay:-1}).lean()]);if(!$app$$)throw"C\u00f4ng ty kh\u00f4ng t\u1ed3n t\u1ea1i";let $ngay_ks$$=$lastLockData$$?$lastLockData$$.den_ngay:null;$ngay_ks$$&&=moment($ngay_ks$$).endOf("date").toDate();var $merge_ngay_tinh_dn$$=$condition$$.tu_ngay&&new Date($condition$$.tu_ngay)<
6
+ $ngay$$?moment($condition$$.tu_ngay).endOf("date").toDate():$ngay$$;let $ngay_dn$$=moment($merge_ngay_tinh_dn$$).startOf("year").toDate(),$nam$$,$CdvtModel$$;!$ngay_ks$$||$ngay_ks$$<$ngay_dn$$?($CdvtModel$$=global.getModel("cdvt"),$nam$$=$merge_ngay_tinh_dn$$.getFullYear()):($CdvtModel$$=global.getModel("cdvttheongay"),$ngay_dn$$=moment($ngay_ks$$).startOf("date").add(1,"days").toDate());const $buildFilter$$=($base$$={})=>{const $q$$={...$base$$};$ds_ma_kho$$?$q$$.ma_kho={$in:$ds_ma_kho$$}:$ma_kho$$&&
7
+ ($q$$.ma_kho=$ma_kho$$);$ma_kh$$&&($q$$.ma_kh=$ma_kh$$);$ma_dvcs$$&&($q$$.ma_dvcs=$ma_dvcs$$);$ma_vt$$&&($q$$.ma_vt=$ma_vt$$);["ma_lo","han_sd","ma_tt1","ma_tt2","ma_tt3"].forEach($f$$=>{$condition$$[$f$$]&&($q$$[$f$$]=$condition$$[$f$$])});return $q$$},$pCkcapphat$$=new Promise($resolve$$=>ckvtcapphat($condition$$,($e$$,$rs$$)=>$resolve$$($rs$$||[]))),$pDauKy$$=(async()=>{const $c_dk$$={id_app:$id_app$$};$nam$$?$c_dk$$.nam=$nam$$:$c_dk$$.den_ngay=$ngay_ks$$;Object.assign($c_dk$$,$buildFilter$$());
8
+ return $CdvtModel$$.aggregate(buildAggregatePipeline($c_dk$$,$groupBy$$))})(),$pPhatSinh$$=(async()=>{var $pipeline_query$$={id_app:$id_app$$,ngay_ct:{$gte:$ngay_dn$$,$lte:$ngay$$}};Object.assign($pipeline_query$$,$buildFilter$$());$condition$$.id_ct&&($pipeline_query$$.id_ct={$ne:$condition$$.id_ct});$pipeline_query$$=buildAggregatePipeline($pipeline_query$$,$groupBy$$);return sokho.aggregate($pipeline_query$$).inTxn()})(),$pHanMuc$$=hanmucton.find($buildFilter$$({id_app:$id_app$$})).lean(),$pDefault$$=
9
+ (async()=>{const $q$$={id_app:$id_app$$,ton_kho_mac_dinh:{$nin:[null,void 0,0]}};$ma_vt$$&&($q$$.ma_vt=$ma_vt$$);return dmvt.find($q$$,{ma_vt:1,ton_kho_mac_dinh:1}).lean()})(),[$ckData$$,$dnData$$,$psData$$,$hmData$$,$dfData$$]=await Promise.all([$pCkcapphat$$,$pDauKy$$,$pPhatSinh$$,$pHanMuc$$,$pDefault$$]),$dataMap$$=new Map,$getGroupKey$$=$item$$=>$groupBy$$.map($k$$=>$item$$[$k$$]||"").join("||");$merge_ngay_tinh_dn$$=($JSCompiler_temp_const$jscomp$0$$,$type$$)=>{if($JSCompiler_temp_const$jscomp$0$$)for(const $item$$ of $JSCompiler_temp_const$jscomp$0$$){const $key$$=
10
+ $getGroupKey$$($item$$);if(!$dataMap$$.has($key$$)){$JSCompiler_temp_const$jscomp$0$$=$dataMap$$;var $JSCompiler_temp_const$$=$JSCompiler_temp_const$jscomp$0$$.set;const $obj$$=_.pick($item$$,$groupBy$$);$obj$$.ton00=0;$obj$$.du00=0;$obj$$.sl_nhap=0;$obj$$.sl_xuat=0;$obj$$.tien_nhap=0;$obj$$.tien_xuat=0;$obj$$.ton00_capphat=0;$obj$$.du00_capphat=0;$obj$$.ton_kho_mac_dinh=0;$obj$$.ton_toi_thieu=0;$obj$$.ton_toi_da=0;$JSCompiler_temp_const$$.call($JSCompiler_temp_const$jscomp$0$$,$key$$,$obj$$)}$JSCompiler_temp_const$jscomp$0$$=
11
+ $dataMap$$.get($key$$);$type$$==="dn"?($JSCompiler_temp_const$jscomp$0$$.ton00+=$item$$.ton00||0,$JSCompiler_temp_const$jscomp$0$$.du00+=$item$$.du00||0):$type$$==="ps"?($JSCompiler_temp_const$jscomp$0$$.sl_nhap+=$item$$.sl_nhap||0,$JSCompiler_temp_const$jscomp$0$$.sl_xuat+=$item$$.sl_xuat||0,$JSCompiler_temp_const$jscomp$0$$.tien_nhap+=$item$$.tien_nhap||0,$JSCompiler_temp_const$jscomp$0$$.tien_xuat+=$item$$.tien_xuat||0):$type$$==="capphat"?($JSCompiler_temp_const$jscomp$0$$.ton00_capphat+=$item$$.ton00||
12
+ 0,$JSCompiler_temp_const$jscomp$0$$.du00_capphat+=$item$$.du00||0):$type$$==="default"?$JSCompiler_temp_const$jscomp$0$$.ton_kho_mac_dinh=$item$$.ton_kho_mac_dinh||0:$type$$==="hanmuc"&&($JSCompiler_temp_const$jscomp$0$$.ton_toi_thieu=$item$$.ton_toi_thieu||0,$JSCompiler_temp_const$jscomp$0$$.ton_toi_da=$item$$.ton_toi_da||0)}};$merge_ngay_tinh_dn$$($dnData$$,"dn");$merge_ngay_tinh_dn$$($psData$$,"ps");$merge_ngay_tinh_dn$$($ckData$$,"capphat");$merge_ngay_tinh_dn$$($dfData$$,"default");$merge_ngay_tinh_dn$$($hmData$$,
13
+ "hanmuc");const $results$$=Array.from($dataMap$$.values()).map($r$$=>{$r$$.sl_nhap=utils.round($r$$.sl_nhap,4);$r$$.sl_xuat=utils.round($r$$.sl_xuat,4);$r$$.ton00=utils.round($r$$.ton00+$r$$.sl_nhap-$r$$.sl_xuat,4);$r$$.du00=Math.roundBy($r$$.du00,0)+Math.roundBy($r$$.tien_nhap,0)-Math.roundBy($r$$.tien_xuat,0);$r$$.sl_nhap=0;$r$$.sl_xuat=0;$r$$.tien_nhap=0;$r$$.tien_xuat=0;$r$$.ton=utils.round($r$$.ton00-($r$$.ton00_capphat>0?$r$$.ton00_capphat:0),4);$r$$.du=$r$$.du00-($r$$.du00_capphat>0?$r$$.du00_capphat:
14
+ 0);return $r$$});return $callback$$?$callback$$(null,$results$$):$results$$}catch($e$$){if($callback$$)return $callback$$($e$$);throw $e$$;}};
@@ -1,6 +1,6 @@
1
1
  const sokhocapphat=global.getModel("sokhocapphat"),utils=require("./utils"),async=require("async"),underscore=require("underscore"),moment=require("moment");
2
- module.exports=function($condition$$,$fn$$){!$condition$$.ngay&&$condition$$.den_ngay&&($condition$$.ngay=$condition$$.den_ngay);let $ma_dvcs$$=$condition$$.ma_dvcs,$ma_kho$$=$condition$$.ma_kho,$ma_vt$$=$condition$$.ma_vt;$ma_vt$$&&underscore.isArray($ma_vt$$)&&($ma_vt$$={$in:Object.assign($ma_vt$$)});let $ngay$$=moment($condition$$.ngay).endOf("date").toDate(),$id_app$$=$condition$$.id_app;async.series({dn:$callback$$=>{$callback$$(null,[])},ps:$callback$$=>{const $query$$={id_app:$id_app$$,ngay_ct:{$lte:$ngay$$}};
3
- $ma_kho$$&&($query$$.ma_kho=$ma_kho$$);$ma_dvcs$$&&($query$$.ma_dvcs=$ma_dvcs$$);$ma_vt$$&&($query$$.ma_vt=$ma_vt$$);$condition$$.ma_lo&&($query$$.ma_lo=$condition$$.ma_lo);$condition$$.han_sd&&($query$$.han_sd=$condition$$.han_sd);$condition$$.ma_tt1&&($query$$.ma_tt1=$condition$$.ma_tt1);$condition$$.ma_tt2&&($query$$.ma_tt2=$condition$$.ma_tt2);$condition$$.ma_tt3&&($query$$.ma_tt3=$condition$$.ma_tt3);$condition$$.id_ct&&($query$$.id_ct={$ne:$condition$$.id_ct});sokhocapphat.find($query$$).inTxn().lean().then(function($pss$$){$pss$$=
4
- $pss$$.map($ps$$=>{$ps$$.sl_nhap=utils.round($ps$$.sl_nhap_qd,4);$ps$$.sl_xuat=utils.round($ps$$.sl_xuat_qd,4);return $ps$$});$callback$$(null,$pss$$)}).catch($error$$=>{$callback$$($error$$)})}},($data_error$$,$groupBy_results$$)=>{if($data_error$$)$fn$$($data_error$$);else{$data_error$$=$groupBy_results$$.dn.concat($groupBy_results$$.ps);($groupBy_results$$=$condition$$.groupBy)||($groupBy_results$$=["ma_vt"]);if(underscore.isString($groupBy_results$$))if($groupBy_results$$.indexOf("[")>=0)try{$groupBy_results$$=
5
- JSON.parse($groupBy_results$$)}catch($e$$){Logger.error($e$$)}else $groupBy_results$$=$groupBy_results$$.split(",");$data_error$$.groupBy($groupBy_results$$,"sl_nhap sl_xuat ton00 du00 tien_nhap tien_xuat".split(" "),($e$$,$groups$$)=>{if($e$$)return $fn$$($e$$);for(let $r$$ of $groups$$)$r$$.ton00=utils.round($r$$.ton00+$r$$.sl_nhap-$r$$.sl_xuat,4),$r$$.du00=Math.roundBy($r$$.du00,0)+Math.roundBy($r$$.tien_nhap,0)-Math.roundBy($r$$.tien_xuat,0),$r$$.sl_nhap=0,$r$$.sl_xuat=0,$r$$.tien_nhap=0,$r$$.tien_xuat=
6
- 0;$fn$$(null,$groups$$)})}})};
2
+ module.exports=async function($condition$$,$fn$$){!$condition$$.ngay&&$condition$$.den_ngay&&($condition$$.ngay=$condition$$.den_ngay);let $id_app$$=$condition$$.id_app,$ma_dvcs$$=$condition$$.ma_dvcs,$ma_kho$$=$condition$$.ma_kho,$ds_ma_kho$$;$ma_kho$$&&(Array.isArray($ma_kho$$)?$ds_ma_kho$$=[...$ma_kho$$]:typeof $ma_kho$$=="string"&&($ds_ma_kho$$=await global.getModel("dmkho").getAllChildrenGroup($id_app$$,$ma_kho$$)));let $ma_vt$$=$condition$$.ma_vt;$ma_vt$$&&underscore.isArray($ma_vt$$)&&($ma_vt$$=
3
+ {$in:Object.assign($ma_vt$$)});let $ngay$$=moment($condition$$.ngay).endOf("date").toDate();async.series({dn:$callback$$=>{$callback$$(null,[])},ps:$callback$$=>{const $query$$={id_app:$id_app$$,ngay_ct:{$lte:$ngay$$}};$ds_ma_kho$$?$query$$.ma_kho={$in:$ds_ma_kho$$}:$ma_kho$$&&($query$$.ma_kho=$ma_kho$$);$ma_dvcs$$&&($query$$.ma_dvcs=$ma_dvcs$$);$ma_vt$$&&($query$$.ma_vt=$ma_vt$$);$condition$$.ma_lo&&($query$$.ma_lo=$condition$$.ma_lo);$condition$$.han_sd&&($query$$.han_sd=$condition$$.han_sd);$condition$$.ma_tt1&&
4
+ ($query$$.ma_tt1=$condition$$.ma_tt1);$condition$$.ma_tt2&&($query$$.ma_tt2=$condition$$.ma_tt2);$condition$$.ma_tt3&&($query$$.ma_tt3=$condition$$.ma_tt3);$condition$$.id_ct&&($query$$.id_ct={$ne:$condition$$.id_ct});Logger.info("[ckvtcapphat]",JSON.stringify($condition$$,null,2));sokhocapphat.find($query$$).inTxn().lean().then(function($pss$$){$pss$$=$pss$$.map($ps$$=>{$ps$$.sl_nhap=utils.round($ps$$.sl_nhap_qd,4);$ps$$.sl_xuat=utils.round($ps$$.sl_xuat_qd,4);return $ps$$});$callback$$(null,$pss$$)}).catch($error$$=>
5
+ {$callback$$($error$$)})}},($data_error$$,$groupBy_results$$)=>{if($data_error$$)$fn$$($data_error$$);else{$data_error$$=$groupBy_results$$.dn.concat($groupBy_results$$.ps);($groupBy_results$$=$condition$$.groupBy)||($groupBy_results$$=["ma_vt"]);if(underscore.isString($groupBy_results$$))if($groupBy_results$$.indexOf("[")>=0)try{$groupBy_results$$=JSON.parse($groupBy_results$$)}catch($e$$){Logger.error($e$$)}else $groupBy_results$$=$groupBy_results$$.split(",");$data_error$$.groupBy($groupBy_results$$,
6
+ "sl_nhap sl_xuat ton00 du00 tien_nhap tien_xuat".split(" "),($e$$,$groups$$)=>{if($e$$)return $fn$$($e$$);for(let $r$$ of $groups$$)$r$$.ton00=utils.round($r$$.ton00+$r$$.sl_nhap-$r$$.sl_xuat,4),$r$$.du00=Math.roundBy($r$$.du00,0)+Math.roundBy($r$$.tien_nhap,0)-Math.roundBy($r$$.tien_xuat,0),$r$$.sl_nhap=0,$r$$.sl_xuat=0,$r$$.tien_nhap=0,$r$$.tien_xuat=0;$fn$$(null,$groups$$)})}})};
@@ -1,9 +1,9 @@
1
1
  const cdvt=global.getModel("cdvtnpp"),sokho=global.getModel("sokhonpp"),utils=require("./utils"),async=require("async"),underscore=require("underscore"),moment=require("moment");
2
- module.exports=async($condition$$,$callback$$)=>{!$condition$$.ngay&&$condition$$.den_ngay&&($condition$$.ngay=$condition$$.den_ngay);let $ma_dvcs$$=$condition$$.ma_dvcs,$ma_kho$$=$condition$$.ma_kho,$ma_vt$$=$condition$$.ma_vt;if(underscore.isString($ma_vt$$)&&$ma_vt$$.indexOf("[")>=0&&$ma_vt$$.indexOf("]")>0)try{$ma_vt$$=JSON.parse($ma_vt$$),$ma_vt$$.length==0&&($ma_vt$$=void 0)}catch($e$$){Logger.error($e$$)}$ma_vt$$&&underscore.isArray($ma_vt$$)&&($ma_vt$$={$in:Object.assign($ma_vt$$)});let $ngay$$,
3
- $nam$$,$ngay_dn$$;$ngay$$=moment($condition$$.ngay).endOf("date").toDate();if($condition$$.tu_ngay){let $tu_ngay$$=new Date($condition$$.tu_ngay);$nam$$=$tu_ngay$$.getFullYear();$ngay_dn$$=moment($tu_ngay$$).startOf("year").toDate()}else $nam$$=$ngay$$.getFullYear(),$ngay_dn$$=moment($ngay$$).startOf("year").toDate();let $id_app$$=$condition$$.id_app;try{let $result$$=await new Promise(($resolve$$,$reject$$)=>{async.parallel({dn:$callback$$=>{setImmediate(()=>{const $c_dk$$={id_app:$id_app$$,nam:$nam$$};
4
- $ma_kho$$&&($c_dk$$.ma_kho=$ma_kho$$);$ma_dvcs$$&&($c_dk$$.ma_dvcs=$ma_dvcs$$);$ma_vt$$&&($c_dk$$.ma_vt=$ma_vt$$);$condition$$.ma_lo&&($c_dk$$.ma_lo=$condition$$.ma_lo);$condition$$.han_sd&&($c_dk$$.han_sd=$condition$$.han_sd);$condition$$.ma_tt1&&($c_dk$$.ma_tt1=$condition$$.ma_tt1);$condition$$.ma_tt2&&($c_dk$$.ma_tt2=$condition$$.ma_tt2);$condition$$.ma_tt3&&($c_dk$$.ma_tt3=$condition$$.ma_tt3);$condition$$.ma_kh&&($c_dk$$.ma_kh=$condition$$.ma_kh);cdvt.find($c_dk$$).lean().then($results$$=>{$callback$$(null,
5
- $results$$)}).catch($error$$=>{$callback$$($error$$)})})},ps:$callback$$=>{setImmediate(()=>{const $query$$={id_app:$id_app$$,ngay_ct:{$gte:$ngay_dn$$,$lte:$ngay$$}};$ma_kho$$&&($query$$.ma_kho=$ma_kho$$);$ma_dvcs$$&&($query$$.ma_dvcs=$ma_dvcs$$);$ma_vt$$&&($query$$.ma_vt=$ma_vt$$);$condition$$.ma_lo&&($query$$.ma_lo=$condition$$.ma_lo);$condition$$.han_sd&&($query$$.han_sd=$condition$$.han_sd);$condition$$.ma_tt1&&($query$$.ma_tt1=$condition$$.ma_tt1);$condition$$.ma_tt2&&($query$$.ma_tt2=$condition$$.ma_tt2);
6
- $condition$$.ma_tt3&&($query$$.ma_tt3=$condition$$.ma_tt3);$condition$$.id_ct&&($query$$.id_ct={$ne:$condition$$.id_ct});$condition$$.ma_kh&&($query$$.ma_kh=$condition$$.ma_kh);sokho.find($query$$).lean().then($pss$$=>{$pss$$=$pss$$.map($ps$$=>{$ps$$.sl_nhap=utils.round($ps$$.sl_nhap_qd,4);$ps$$.sl_xuat=utils.round($ps$$.sl_xuat_qd,4);return $ps$$});$callback$$(null,$pss$$)}).catch($error$$=>{$callback$$($error$$)})})}},($data_error$$,$groupBy_results$$)=>{if($data_error$$)return $reject$$(Error($data_error$$));
7
- $data_error$$=$groupBy_results$$.dn.concat($groupBy_results$$.ps).concat($groupBy_results$$.ton_kho_mac_dinh).concat($groupBy_results$$.hanmucton);($groupBy_results$$=$condition$$.groupBy||$condition$$.groupby)||($groupBy_results$$=["ma_vt"]);if(underscore.isString($groupBy_results$$))if($groupBy_results$$.indexOf("[")>=0)try{$groupBy_results$$=JSON.parse($groupBy_results$$)}catch($e$$){Logger.error($e$$)}else $groupBy_results$$=$groupBy_results$$.split(",");$data_error$$.groupBy($groupBy_results$$,
8
- "sl_nhap sl_xuat ton00 du00 tien_nhap tien_xuat ton_kho_mac_dinh ton_toi_thieu ton_toi_da".split(" "),($e$$,$groups$$)=>{if($e$$)return $reject$$(Error($e$$));for(let $r$$ of $groups$$)$r$$.ton00=utils.round($r$$.ton00+$r$$.sl_nhap-$r$$.sl_xuat,4),$r$$.du00=Math.roundBy($r$$.du00,0)+Math.roundBy($r$$.tien_nhap,0)-Math.roundBy($r$$.tien_xuat,0),$r$$.sl_nhap=0,$r$$.sl_xuat=0,$r$$.tien_nhap=0,$r$$.tien_xuat=0,$r$$.ton=$r$$.ton00,$r$$.du=$r$$.du00;$resolve$$($groups$$)})})});return $callback$$?$callback$$(null,
9
- $result$$):$result$$}catch($e$$){if($callback$$)return $callback$$($e$$);throw $e$$;}};
2
+ module.exports=async($condition$$,$callback$$)=>{!$condition$$.ngay&&$condition$$.den_ngay&&($condition$$.ngay=$condition$$.den_ngay);let $id_app$$=$condition$$.id_app,$ma_dvcs$$=$condition$$.ma_dvcs;var $ma_kho_tu_ngay$$=$condition$$.ma_kho;let $ds_ma_kho$$;$ma_kho_tu_ngay$$&&(Array.isArray($ma_kho_tu_ngay$$)?$ds_ma_kho$$=[...$ma_kho_tu_ngay$$]:typeof $ma_kho_tu_ngay$$=="string"&&($ds_ma_kho$$=await global.getModel("dmkho").getAllChildrenGroup($id_app$$,$ma_kho_tu_ngay$$)));let $ma_vt$$=$condition$$.ma_vt;
3
+ if(underscore.isString($ma_vt$$)&&$ma_vt$$.indexOf("[")>=0&&$ma_vt$$.indexOf("]")>0)try{$ma_vt$$=JSON.parse($ma_vt$$),$ma_vt$$.length==0&&($ma_vt$$=void 0)}catch($e$$){Logger.error($e$$)}$ma_vt$$&&underscore.isArray($ma_vt$$)&&($ma_vt$$={$in:Object.assign($ma_vt$$)});let $ngay$$,$nam$$,$ngay_dn$$;$ngay$$=moment($condition$$.ngay).endOf("date").toDate();$condition$$.tu_ngay?($ma_kho_tu_ngay$$=new Date($condition$$.tu_ngay),$nam$$=$ma_kho_tu_ngay$$.getFullYear(),$ngay_dn$$=moment($ma_kho_tu_ngay$$).startOf("year").toDate()):
4
+ ($nam$$=$ngay$$.getFullYear(),$ngay_dn$$=moment($ngay$$).startOf("year").toDate());try{let $result$$=await new Promise(($resolve$$,$reject$$)=>{async.parallel({dn:$callback$$=>{setImmediate(()=>{const $c_dk$$={id_app:$id_app$$,nam:$nam$$};$ds_ma_kho$$?$c_dk$$.ma_kho={$in:$ds_ma_kho$$}:$condition$$.ma_kho&&($c_dk$$.ma_kho=$condition$$.ma_kho);$ma_dvcs$$&&($c_dk$$.ma_dvcs=$ma_dvcs$$);$ma_vt$$&&($c_dk$$.ma_vt=$ma_vt$$);$condition$$.ma_lo&&($c_dk$$.ma_lo=$condition$$.ma_lo);$condition$$.han_sd&&($c_dk$$.han_sd=
5
+ $condition$$.han_sd);$condition$$.ma_tt1&&($c_dk$$.ma_tt1=$condition$$.ma_tt1);$condition$$.ma_tt2&&($c_dk$$.ma_tt2=$condition$$.ma_tt2);$condition$$.ma_tt3&&($c_dk$$.ma_tt3=$condition$$.ma_tt3);$condition$$.ma_kh&&($c_dk$$.ma_kh=$condition$$.ma_kh);cdvt.find($c_dk$$).lean().then($results$$=>{$callback$$(null,$results$$)}).catch($error$$=>{$callback$$($error$$)})})},ps:$callback$$=>{setImmediate(()=>{const $query$$={id_app:$id_app$$,ngay_ct:{$gte:$ngay_dn$$,$lte:$ngay$$}};$ds_ma_kho$$?$query$$.ma_kho=
6
+ {$in:$ds_ma_kho$$}:$condition$$.ma_kho&&($query$$.ma_kho=$condition$$.ma_kho);$ma_dvcs$$&&($query$$.ma_dvcs=$ma_dvcs$$);$ma_vt$$&&($query$$.ma_vt=$ma_vt$$);$condition$$.ma_lo&&($query$$.ma_lo=$condition$$.ma_lo);$condition$$.han_sd&&($query$$.han_sd=$condition$$.han_sd);$condition$$.ma_tt1&&($query$$.ma_tt1=$condition$$.ma_tt1);$condition$$.ma_tt2&&($query$$.ma_tt2=$condition$$.ma_tt2);$condition$$.ma_tt3&&($query$$.ma_tt3=$condition$$.ma_tt3);$condition$$.id_ct&&($query$$.id_ct={$ne:$condition$$.id_ct});
7
+ $condition$$.ma_kh&&($query$$.ma_kh=$condition$$.ma_kh);sokho.find($query$$).lean().then($pss$$=>{$pss$$=$pss$$.map($ps$$=>{$ps$$.sl_nhap=utils.round($ps$$.sl_nhap_qd,4);$ps$$.sl_xuat=utils.round($ps$$.sl_xuat_qd,4);return $ps$$});$callback$$(null,$pss$$)}).catch($error$$=>{$callback$$($error$$)})})}},($data_error$$,$groupBy_results$$)=>{if($data_error$$)return $reject$$(Error($data_error$$));$data_error$$=$groupBy_results$$.dn.concat($groupBy_results$$.ps).concat($groupBy_results$$.ton_kho_mac_dinh).concat($groupBy_results$$.hanmucton);
8
+ ($groupBy_results$$=$condition$$.groupBy||$condition$$.groupby)||($groupBy_results$$=["ma_vt"]);if(underscore.isString($groupBy_results$$))if($groupBy_results$$.indexOf("[")>=0)try{$groupBy_results$$=JSON.parse($groupBy_results$$)}catch($e$$){Logger.error($e$$)}else $groupBy_results$$=$groupBy_results$$.split(",");$data_error$$.groupBy($groupBy_results$$,"sl_nhap sl_xuat ton00 du00 tien_nhap tien_xuat ton_kho_mac_dinh ton_toi_thieu ton_toi_da".split(" "),($e$$,$groups$$)=>{if($e$$)return $reject$$(Error($e$$));
9
+ for(let $r$$ of $groups$$)$r$$.ton00=utils.round($r$$.ton00+$r$$.sl_nhap-$r$$.sl_xuat,4),$r$$.du00=Math.roundBy($r$$.du00,0)+Math.roundBy($r$$.tien_nhap,0)-Math.roundBy($r$$.tien_xuat,0),$r$$.sl_nhap=0,$r$$.sl_xuat=0,$r$$.tien_nhap=0,$r$$.tien_xuat=0,$r$$.ton=$r$$.ton00,$r$$.du=$r$$.du00;$resolve$$($groups$$)})})});return $callback$$?$callback$$(null,$result$$):$result$$}catch($e$$){if($callback$$)return $callback$$($e$$);throw $e$$;}};