monkeybrain-runtime 1.0.0__py3-none-any.whl
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.
- monkeybrain_runtime-1.0.0.dist-info/METADATA +76 -0
- monkeybrain_runtime-1.0.0.dist-info/RECORD +838 -0
- monkeybrain_runtime-1.0.0.dist-info/WHEEL +5 -0
- monkeybrain_runtime-1.0.0.dist-info/entry_points.txt +3 -0
- monkeybrain_runtime-1.0.0.dist-info/top_level.txt +2 -0
- services/__init__.py +8 -0
- services/agentos/__init__.py +0 -0
- services/agentos/main.py +1 -0
- services/assets/helpers/__init__.py +12 -0
- services/assets/helpers/device.py +59 -0
- services/assets/helpers/equipment.py +179 -0
- services/assets/helpers/instruments.py +72 -0
- services/assets/helpers/machines.py +183 -0
- services/assets/helpers/materials.py +76 -0
- services/assets/helpers/parts.py +116 -0
- services/assets/helpers/plc.py +134 -0
- services/assets/helpers/tags.py +108 -0
- services/assets/helpers/tools.py +101 -0
- services/assets/main.py +75 -0
- services/assets/models/__init__.py +12 -0
- services/assets/models/device.py +79 -0
- services/assets/models/equipment.py +222 -0
- services/assets/models/instruments.py +85 -0
- services/assets/models/machines.py +230 -0
- services/assets/models/material.py +266 -0
- services/assets/models/parts.py +96 -0
- services/assets/models/plc.py +264 -0
- services/assets/models/tags.py +76 -0
- services/assets/models/tools.py +179 -0
- services/assets/routers/__init__.py +12 -0
- services/assets/routers/classes.py +65 -0
- services/assets/routers/device.py +86 -0
- services/assets/routers/equipment.py +145 -0
- services/assets/routers/families.py +61 -0
- services/assets/routers/instruments.py +70 -0
- services/assets/routers/machines.py +136 -0
- services/assets/routers/materials.py +105 -0
- services/assets/routers/parts.py +130 -0
- services/assets/routers/plc.py +94 -0
- services/assets/routers/subclasses.py +68 -0
- services/assets/routers/tags.py +138 -0
- services/assets/routers/tools.py +113 -0
- services/auth/helpers/__init__.py +13 -0
- services/auth/helpers/approval_decisions.py +261 -0
- services/auth/helpers/audit_elasticsearch_sync.py +350 -0
- services/auth/helpers/departments.py +53 -0
- services/auth/helpers/graph_store.py +848 -0
- services/auth/helpers/influx_store.py +280 -0
- services/auth/helpers/me.py +33 -0
- services/auth/helpers/nats_consumer.py +618 -0
- services/auth/helpers/nats_store.py +242 -0
- services/auth/helpers/permissions.py +62 -0
- services/auth/helpers/roles.py +87 -0
- services/auth/helpers/store.py +54 -0
- services/auth/helpers/team_members.py +155 -0
- services/auth/helpers/teams.py +87 -0
- services/auth/helpers/tokens.py +71 -0
- services/auth/helpers/users.py +119 -0
- services/auth/helpers/websocket_broadcast.py +41 -0
- services/auth/main.py +88 -0
- services/auth/models/__init__.py +12 -0
- services/auth/models/departments.py +55 -0
- services/auth/models/login.py +20 -0
- services/auth/models/permissions.py +61 -0
- services/auth/models/roles.py +53 -0
- services/auth/models/session.py +26 -0
- services/auth/models/teamMembers.py +59 -0
- services/auth/models/teams.py +56 -0
- services/auth/models/users.py +77 -0
- services/auth/routers/__init__.py +14 -0
- services/auth/routers/auth.py +3839 -0
- services/auth/routers/departments.py +84 -0
- services/auth/routers/integration_config.py +703 -0
- services/auth/routers/me.py +28 -0
- services/auth/routers/permissions.py +96 -0
- services/auth/routers/roles.py +139 -0
- services/auth/routers/session.py +224 -0
- services/auth/routers/team_members.py +152 -0
- services/auth/routers/teams.py +112 -0
- services/auth/routers/users.py +131 -0
- services/auth/routers/websocket_events.py +247 -0
- services/batch_execution/__init__.py +19 -0
- services/batch_execution/pipeline_triggers/__init__.py +53 -0
- services/batch_execution/pipeline_triggers/pipeline_parameter_adjuster.py +440 -0
- services/batch_execution/pipeline_triggers/pipeline_trigger_engine.py +445 -0
- services/batch_execution/pipeline_triggers/re_evaluation_queue.py +341 -0
- services/batch_execution/pipeline_triggers/test_phase3_implementation.py +553 -0
- services/batch_execution/pipeline_triggers/workflow_reevaluator.py +367 -0
- services/batch_execution/smoke_test_e2e_feedback_loop.py +704 -0
- services/batch_execution/workflow_executor.py +478 -0
- services/changeover/helpers/__init__.py +11 -0
- services/changeover/helpers/changeover.py +87 -0
- services/changeover/helpers/changeover_common.py +55 -0
- services/changeover/helpers/changeover_events.py +66 -0
- services/changeover/helpers/changeover_kpis.py +33 -0
- services/changeover/helpers/changeover_matrix.py +60 -0
- services/changeover/helpers/changeover_procedures.py +164 -0
- services/changeover/helpers/changeover_windows.py +96 -0
- services/changeover/main.py +52 -0
- services/changeover/models/__init__.py +11 -0
- services/changeover/models/changeover.py +73 -0
- services/changeover/models/changeover_events.py +142 -0
- services/changeover/models/changeover_kpis.py +75 -0
- services/changeover/models/changeover_matrix.py +63 -0
- services/changeover/models/changeover_procedures.py +108 -0
- services/changeover/models/changeover_tasks.py +87 -0
- services/changeover/models/changeover_windows.py +72 -0
- services/changeover/routers/__init__.py +9 -0
- services/changeover/routers/changeover_events.py +127 -0
- services/changeover/routers/changeover_kpis.py +80 -0
- services/changeover/routers/changeover_matrix.py +80 -0
- services/changeover/routers/changeover_procedures.py +118 -0
- services/changeover/routers/changeover_windows.py +98 -0
- services/common/__init__.py +2 -0
- services/common/approval_chains.py +648 -0
- services/common/auth.py +56 -0
- services/common/cdc.py +52 -0
- services/common/compat.py +217 -0
- services/common/compliance.py +562 -0
- services/common/config.py +134 -0
- services/common/cors.py +17 -0
- services/common/data_transformation.py +195 -0
- services/common/db.py +577 -0
- services/common/embeddings.py +97 -0
- services/common/event_reducers.py +194 -0
- services/common/event_types.py +51 -0
- services/common/integration_ingestion.py +169 -0
- services/common/logging.py +204 -0
- services/common/models/__init__.py +2 -0
- services/common/models/databricks.py +25 -0
- services/common/models/enums.py +64 -0
- services/common/module_control.py +422 -0
- services/common/mongo_cdc_watcher.py +106 -0
- services/common/n8n_auth.py +22 -0
- services/common/neo4j_mirror.py +1087 -0
- services/common/ontology_registry.py +110 -0
- services/common/reasoning_traces.py +52 -0
- services/common/supply_chain_cdc.py +555 -0
- services/common/tracing.py +159 -0
- services/common/utils.py +30 -0
- services/customers/helpers/__init__.py +8 -0
- services/customers/helpers/customer_details.py +64 -0
- services/customers/helpers/customer_metadata.py +64 -0
- services/customers/helpers/customer_order_metrics.py +67 -0
- services/customers/helpers/customer_payment_data.py +67 -0
- services/customers/main.py +50 -0
- services/customers/models/__init__.py +8 -0
- services/customers/models/customer_details.py +42 -0
- services/customers/models/customer_metadata.py +97 -0
- services/customers/models/customer_order_metrics.py +86 -0
- services/customers/models/customer_payment_data.py +60 -0
- services/customers/routers/__init__.py +8 -0
- services/customers/routers/customer_details.py +88 -0
- services/customers/routers/customer_metadata.py +88 -0
- services/customers/routers/customer_order_metrics.py +88 -0
- services/customers/routers/customer_payment_data.py +88 -0
- services/documents/__init__.py +1 -0
- services/documents/helpers/__init__.py +6 -0
- services/documents/helpers/document_metadata.py +569 -0
- services/documents/helpers/document_workflows.py +215 -0
- services/documents/helpers/report_templates.py +113 -0
- services/documents/main.py +49 -0
- services/documents/models/__init__.py +6 -0
- services/documents/models/document_metadata.py +215 -0
- services/documents/models/document_workflows.py +136 -0
- services/documents/models/report_templates.py +132 -0
- services/documents/routers/__init__.py +6 -0
- services/documents/routers/document_metadata.py +654 -0
- services/documents/routers/document_workflows.py +146 -0
- services/documents/routers/report_templates.py +86 -0
- services/events/helpers/__init__.py +5 -0
- services/events/helpers/events.py +394 -0
- services/events/main.py +40 -0
- services/events/models/__init__.py +5 -0
- services/events/models/events.py +50 -0
- services/events/routers/__init__.py +6 -0
- services/events/routers/count_events.py +109 -0
- services/events/routers/events.py +75 -0
- services/events/seed_events.py +196 -0
- services/facilities/helpers/__init__.py +8 -0
- services/facilities/helpers/lines.py +74 -0
- services/facilities/helpers/locations.py +231 -0
- services/facilities/helpers/plants.py +59 -0
- services/facilities/helpers/stages.py +110 -0
- services/facilities/helpers/workstation.py +213 -0
- services/facilities/main.py +60 -0
- services/facilities/models/__init__.py +10 -0
- services/facilities/models/industrialLine.py +72 -0
- services/facilities/models/industrialPlant.py +164 -0
- services/facilities/models/locations.py +74 -0
- services/facilities/models/stages.py +92 -0
- services/facilities/models/worker.py +73 -0
- services/facilities/models/workstation.py +117 -0
- services/facilities/models/workstation_live_state.py +59 -0
- services/facilities/routers/__init__.py +8 -0
- services/facilities/routers/bays.py +81 -0
- services/facilities/routers/buildings.py +92 -0
- services/facilities/routers/floors.py +81 -0
- services/facilities/routers/lines.py +154 -0
- services/facilities/routers/locations.py +208 -0
- services/facilities/routers/plant.py +203 -0
- services/facilities/routers/rooms.py +81 -0
- services/facilities/routers/stages.py +152 -0
- services/facilities/routers/workstation.py +173 -0
- services/file/backup.py +71 -0
- services/file/main.py +45 -0
- services/file/recieve.py +54 -0
- services/file/send.py +55 -0
- services/file/src/core/config.py +90 -0
- services/file/src/core/keycloak.py +152 -0
- services/file/src/core/logging_config.py +9 -0
- services/file/src/core/security.py +33 -0
- services/file/src/helpers/cad_conversion.py +331 -0
- services/file/src/helpers/helpers.py +825 -0
- services/file/src/routes/cad_conversion.py +26 -0
- services/file/src/routes/files.py +136 -0
- services/file/src/routes/presigned.py +154 -0
- services/file/src/services/websocket.py +293 -0
- services/floor_layout/helpers/__init__.py +8 -0
- services/floor_layout/helpers/bays.py +92 -0
- services/floor_layout/helpers/buildings.py +54 -0
- services/floor_layout/helpers/floors.py +65 -0
- services/floor_layout/helpers/rooms.py +76 -0
- services/floor_layout/main.py +52 -0
- services/floor_layout/models/__init__.py +8 -0
- services/floor_layout/models/bays.py +65 -0
- services/floor_layout/models/buildings.py +52 -0
- services/floor_layout/models/floors.py +45 -0
- services/floor_layout/models/rooms.py +61 -0
- services/floor_layout/routers/__init__.py +9 -0
- services/floor_layout/routers/bays.py +143 -0
- services/floor_layout/routers/buildings.py +116 -0
- services/floor_layout/routers/floors.py +89 -0
- services/floor_layout/routers/locations.py +80 -0
- services/floor_layout/routers/rooms.py +134 -0
- services/inventory/helpers/__init__.py +13 -0
- services/inventory/helpers/cycle_counts.py +124 -0
- services/inventory/helpers/inventory_allocations.py +134 -0
- services/inventory/helpers/inventory_item_counts.py +114 -0
- services/inventory/helpers/inventory_item_quantities.py +114 -0
- services/inventory/helpers/inventory_items.py +103 -0
- services/inventory/helpers/inventory_stage_outputs.py +134 -0
- services/inventory/helpers/inventory_transactions.py +112 -0
- services/inventory/helpers/stock_adjustment_requests.py +101 -0
- services/inventory/helpers/warehouse_cycle_counts.py +133 -0
- services/inventory/helpers/warehouse_locations.py +213 -0
- services/inventory/helpers/warehouse_regulated_records.py +123 -0
- services/inventory/main.py +62 -0
- services/inventory/models/__init__.py +17 -0
- services/inventory/models/cycle_counts.py +99 -0
- services/inventory/models/inventory_allocations.py +121 -0
- services/inventory/models/inventory_common.py +65 -0
- services/inventory/models/inventory_enums.py +21 -0
- services/inventory/models/inventory_item_count.py +65 -0
- services/inventory/models/inventory_item_quantity.py +82 -0
- services/inventory/models/inventory_items.py +168 -0
- services/inventory/models/inventory_responses.py +44 -0
- services/inventory/models/inventory_stage_outputs.py +96 -0
- services/inventory/models/inventory_state.py +15 -0
- services/inventory/models/inventory_transactions.py +80 -0
- services/inventory/models/stock_adjustment_requests.py +109 -0
- services/inventory/models/warehouse_cycle_counts.py +119 -0
- services/inventory/models/warehouse_location_models.py +708 -0
- services/inventory/models/warehouse_regulated_records.py +358 -0
- services/inventory/routers/__init__.py +13 -0
- services/inventory/routers/cycle_counts.py +106 -0
- services/inventory/routers/inventory_allocations.py +125 -0
- services/inventory/routers/inventory_item_counts.py +105 -0
- services/inventory/routers/inventory_item_quantities.py +105 -0
- services/inventory/routers/inventory_items.py +109 -0
- services/inventory/routers/inventory_stage_outputs.py +122 -0
- services/inventory/routers/inventory_transactions.py +96 -0
- services/inventory/routers/stock_adjustment_requests.py +124 -0
- services/inventory/routers/warehouse_cycle_counts.py +124 -0
- services/inventory/routers/warehouse_locations.py +426 -0
- services/inventory/routers/warehouse_regulated_records.py +273 -0
- services/iot/helpers/__init__.py +8 -0
- services/iot/helpers/ble_device.py +87 -0
- services/iot/helpers/mqtt_bridge.py +115 -0
- services/iot/helpers/sensor_readings.py +63 -0
- services/iot/helpers/sensors.py +77 -0
- services/iot/helpers/servers.py +72 -0
- services/iot/helpers/uwb_device.py +95 -0
- services/iot/main.py +53 -0
- services/iot/models/__init__.py +8 -0
- services/iot/models/ble_device.py +118 -0
- services/iot/models/sensors.py +256 -0
- services/iot/models/servers.py +206 -0
- services/iot/models/uwb_device.py +106 -0
- services/iot/routers/__init__.py +8 -0
- services/iot/routers/ble_device.py +110 -0
- services/iot/routers/sensors.py +144 -0
- services/iot/routers/servers.py +141 -0
- services/iot/routers/uwb_device.py +148 -0
- services/module_control/__init__.py +1 -0
- services/module_control/helpers/__init__.py +1 -0
- services/module_control/helpers/integration_config.py +243 -0
- services/module_control/helpers/security.py +104 -0
- services/module_control/main.py +44 -0
- services/module_control/models/__init__.py +1 -0
- services/module_control/models/module_control.py +65 -0
- services/module_control/routers/__init__.py +1 -0
- services/module_control/routers/module_control.py +219 -0
- services/orders/helpers/__init__.py +11 -0
- services/orders/helpers/invoices.py +123 -0
- services/orders/helpers/order_customer_metrics.py +61 -0
- services/orders/helpers/order_details.py +71 -0
- services/orders/helpers/order_metadata.py +61 -0
- services/orders/helpers/order_payment_metadata.py +74 -0
- services/orders/helpers/orders.py +119 -0
- services/orders/helpers/sales_orders.py +136 -0
- services/orders/main.py +56 -0
- services/orders/models/__init__.py +11 -0
- services/orders/models/invoices.py +415 -0
- services/orders/models/order_customer_metrics.py +78 -0
- services/orders/models/order_details.py +46 -0
- services/orders/models/order_metadata.py +60 -0
- services/orders/models/order_payment_metadata.py +63 -0
- services/orders/models/orders.py +64 -0
- services/orders/models/sales_orders.py +130 -0
- services/orders/routers/__init__.py +11 -0
- services/orders/routers/invoices.py +111 -0
- services/orders/routers/order_customer_metrics.py +87 -0
- services/orders/routers/order_details.py +87 -0
- services/orders/routers/order_metadata.py +87 -0
- services/orders/routers/order_payment_metadata.py +87 -0
- services/orders/routers/orders.py +74 -0
- services/orders/routers/sales_orders.py +111 -0
- services/pm/helpers/__init__.py +14 -0
- services/pm/helpers/calendar_bookings.py +114 -0
- services/pm/helpers/calibration_point.py +110 -0
- services/pm/helpers/calibrations.py +196 -0
- services/pm/helpers/checklists.py +318 -0
- services/pm/helpers/cleaning.py +333 -0
- services/pm/helpers/downtime.py +376 -0
- services/pm/helpers/kanban_boards.py +186 -0
- services/pm/helpers/maintainance.py +177 -0
- services/pm/helpers/sop.py +1155 -0
- services/pm/helpers/sop_cdc.py +324 -0
- services/pm/helpers/weekly_schedules.py +79 -0
- services/pm/main.py +62 -0
- services/pm/models/__init__.py +14 -0
- services/pm/models/calendar_booking.py +82 -0
- services/pm/models/calibration_point.py +44 -0
- services/pm/models/calibrations.py +167 -0
- services/pm/models/checklists.py +117 -0
- services/pm/models/cleaning.py +203 -0
- services/pm/models/downtime.py +109 -0
- services/pm/models/kanban_board.py +178 -0
- services/pm/models/maintainanceLog.py +148 -0
- services/pm/models/sop.py +152 -0
- services/pm/models/weekly_schedule.py +91 -0
- services/pm/routers/__init__.py +14 -0
- services/pm/routers/calendar_bookings.py +143 -0
- services/pm/routers/calibration_point.py +94 -0
- services/pm/routers/calibrations.py +232 -0
- services/pm/routers/checklists.py +188 -0
- services/pm/routers/cleaning.py +127 -0
- services/pm/routers/downtime.py +143 -0
- services/pm/routers/kanban_boards.py +283 -0
- services/pm/routers/maintainance.py +241 -0
- services/pm/routers/sop.py +437 -0
- services/pm/routers/weekly_schedules.py +108 -0
- services/process_definitions/helpers/__init__.py +11 -0
- services/process_definitions/helpers/cpp_cqa_registry.py +120 -0
- services/process_definitions/helpers/mbmr_templates.py +107 -0
- services/process_definitions/helpers/packing_instructions.py +113 -0
- services/process_definitions/helpers/process_constraints.py +495 -0
- services/process_definitions/helpers/process_corrections.py +279 -0
- services/process_definitions/helpers/process_definition.py +996 -0
- services/process_definitions/helpers/process_node_catalog.py +786 -0
- services/process_definitions/helpers/process_post_checks.py +441 -0
- services/process_definitions/helpers/process_pre_checks.py +351 -0
- services/process_definitions/helpers/process_steps.py +220 -0
- services/process_definitions/main.py +71 -0
- services/process_definitions/models/__init__.py +13 -0
- services/process_definitions/models/cpp_cqa_registry.py +145 -0
- services/process_definitions/models/gxp_change_controls.py +38 -0
- services/process_definitions/models/gxp_risk_assessments.py +30 -0
- services/process_definitions/models/gxp_validation_evidence.py +33 -0
- services/process_definitions/models/mbmr_templates.py +173 -0
- services/process_definitions/models/packing_instructions.py +176 -0
- services/process_definitions/models/process_constraints.py +159 -0
- services/process_definitions/models/process_corrections.py +118 -0
- services/process_definitions/models/process_definition.py +685 -0
- services/process_definitions/models/process_definition_common.py +48 -0
- services/process_definitions/models/process_node_catalog.py +25 -0
- services/process_definitions/models/process_post_checks.py +171 -0
- services/process_definitions/models/process_pre_checks.py +168 -0
- services/process_definitions/models/process_steps.py +170 -0
- services/process_definitions/node_services/__init__.py +8 -0
- services/process_definitions/node_services/common.py +95 -0
- services/process_definitions/node_services/executor.py +499 -0
- services/process_definitions/node_services/flow_simulator.py +733 -0
- services/process_definitions/node_services/functions.py +193 -0
- services/process_definitions/node_services/messaging.py +44 -0
- services/process_definitions/node_services/models.py +221 -0
- services/process_definitions/node_services/network.py +161 -0
- services/process_definitions/node_services/parsers.py +87 -0
- services/process_definitions/node_services/sequence.py +95 -0
- services/process_definitions/node_services/storage.py +50 -0
- services/process_definitions/node_services/webhooks.py +52 -0
- services/process_definitions/routers/__init__.py +10 -0
- services/process_definitions/routers/cpp_cqa_registry.py +86 -0
- services/process_definitions/routers/mbmr_templates.py +84 -0
- services/process_definitions/routers/packing_instructions.py +84 -0
- services/process_definitions/routers/process_constraints.py +564 -0
- services/process_definitions/routers/process_corrections.py +343 -0
- services/process_definitions/routers/process_definition.py +992 -0
- services/process_definitions/routers/process_post_checks.py +529 -0
- services/process_definitions/routers/process_pre_checks.py +435 -0
- services/process_definitions/routers/process_steps.py +274 -0
- services/procurement/helpers/__init__.py +9 -0
- services/procurement/helpers/goods_receipts.py +240 -0
- services/procurement/helpers/purchase_order_shipping_information.py +85 -0
- services/procurement/helpers/purchase_orders.py +68 -0
- services/procurement/helpers/quality_control.py +235 -0
- services/procurement/helpers/sampling.py +404 -0
- services/procurement/main.py +52 -0
- services/procurement/models/__init__.py +9 -0
- services/procurement/models/goods_receipts.py +165 -0
- services/procurement/models/purchase_orders.py +54 -0
- services/procurement/models/quality_control.py +464 -0
- services/procurement/models/reinspection_records.py +28 -0
- services/procurement/models/sampling.py +262 -0
- services/procurement/models/shipping_information.py +51 -0
- services/procurement/routers/__init__.py +9 -0
- services/procurement/routers/goods_receipts.py +201 -0
- services/procurement/routers/purchase_orders.py +106 -0
- services/procurement/routers/quality_control.py +386 -0
- services/procurement/routers/sampling.py +296 -0
- services/procurement/routers/shipping_information.py +97 -0
- services/production/__init__.py +1 -0
- services/production/agents/__init__.py +5 -0
- services/production/agents/batch_planning_agent.py +815 -0
- services/production/models/__init__.py +25 -0
- services/production/models/batch.py +253 -0
- services/products/helpers/__init__.py +10 -0
- services/products/helpers/boms.py +100 -0
- services/products/helpers/drug_research.py +644 -0
- services/products/helpers/product_component.py +168 -0
- services/products/helpers/product_inventory.py +221 -0
- services/products/helpers/product_pricing.py +123 -0
- services/products/helpers/product_utils.py +32 -0
- services/products/helpers/products.py +81 -0
- services/products/main.py +59 -0
- services/products/models/__init__.py +9 -0
- services/products/models/drug_research.py +138 -0
- services/products/models/product_common.py +60 -0
- services/products/models/product_component.py +1028 -0
- services/products/models/product_inventory.py +118 -0
- services/products/models/product_pricing.py +73 -0
- services/products/models/products.py +151 -0
- services/products/routers/__init__.py +9 -0
- services/products/routers/boms.py +116 -0
- services/products/routers/drug_research.py +115 -0
- services/products/routers/product_components.py +123 -0
- services/products/routers/product_inventory.py +185 -0
- services/products/routers/product_pricing.py +136 -0
- services/products/routers/products.py +165 -0
- services/replenishment/__init__.py +1 -0
- services/replenishment/main.py +46 -0
- services/replenishment/routers/__init__.py +1 -0
- services/replenishment/routers/replenishment.py +20 -0
- services/shifts/helpers/__init__.py +7 -0
- services/shifts/helpers/shift_templates.py +124 -0
- services/shifts/helpers/shifts.py +79 -0
- services/shifts/helpers/timesheets.py +137 -0
- services/shifts/main.py +48 -0
- services/shifts/models/__init__.py +8 -0
- services/shifts/models/shift.py +62 -0
- services/shifts/models/shift_template.py +82 -0
- services/shifts/models/time_range.py +31 -0
- services/shifts/models/timesheet.py +196 -0
- services/shifts/routers/__init__.py +7 -0
- services/shifts/routers/shift_templates.py +97 -0
- services/shifts/routers/shifts.py +117 -0
- services/shifts/routers/timesheets.py +117 -0
- services/shipping/helpers/__init__.py +15 -0
- services/shipping/helpers/carrier.py +78 -0
- services/shipping/helpers/customs_declaration.py +104 -0
- services/shipping/helpers/delivery_note.py +99 -0
- services/shipping/helpers/package.py +95 -0
- services/shipping/helpers/pallet.py +85 -0
- services/shipping/helpers/route.py +93 -0
- services/shipping/helpers/shipping_information.py +82 -0
- services/shipping/helpers/shipping_provider_details.py +59 -0
- services/shipping/helpers/shipping_provider_metadata.py +59 -0
- services/shipping/helpers/vehicle.py +85 -0
- services/shipping/helpers/waybill.py +86 -0
- services/shipping/main.py +64 -0
- services/shipping/models/__init__.py +15 -0
- services/shipping/models/carrier.py +97 -0
- services/shipping/models/customs_declaration.py +138 -0
- services/shipping/models/delivery_note.py +163 -0
- services/shipping/models/package.py +152 -0
- services/shipping/models/pallet.py +137 -0
- services/shipping/models/route.py +120 -0
- services/shipping/models/shipping_information.py +55 -0
- services/shipping/models/shipping_provider_details.py +42 -0
- services/shipping/models/shipping_provider_metadata.py +54 -0
- services/shipping/models/vehicle.py +129 -0
- services/shipping/models/waybill.py +189 -0
- services/shipping/routers/__init__.py +15 -0
- services/shipping/routers/carrier.py +99 -0
- services/shipping/routers/customs_declaration.py +132 -0
- services/shipping/routers/delivery_note.py +150 -0
- services/shipping/routers/package.py +141 -0
- services/shipping/routers/pallet.py +108 -0
- services/shipping/routers/route.py +128 -0
- services/shipping/routers/shipping_information.py +97 -0
- services/shipping/routers/shipping_provider_details.py +80 -0
- services/shipping/routers/shipping_provider_metadata.py +80 -0
- services/shipping/routers/vehicle.py +117 -0
- services/shipping/routers/waybill.py +119 -0
- services/suppliers/helpers/__init__.py +13 -0
- services/suppliers/helpers/supplier_capabilities.py +58 -0
- services/suppliers/helpers/supplier_certifications.py +67 -0
- services/suppliers/helpers/supplier_details.py +58 -0
- services/suppliers/helpers/supplier_financials.py +58 -0
- services/suppliers/helpers/supplier_inventory.py +74 -0
- services/suppliers/helpers/supplier_locations.py +60 -0
- services/suppliers/helpers/supplier_pricing.py +69 -0
- services/suppliers/helpers/supplier_quality.py +69 -0
- services/suppliers/helpers/supplier_shipping.py +69 -0
- services/suppliers/main.py +60 -0
- services/suppliers/models/__init__.py +13 -0
- services/suppliers/models/supplier_capabilities.py +70 -0
- services/suppliers/models/supplier_certifications.py +64 -0
- services/suppliers/models/supplier_details.py +75 -0
- services/suppliers/models/supplier_financials.py +69 -0
- services/suppliers/models/supplier_inventory.py +76 -0
- services/suppliers/models/supplier_locations.py +70 -0
- services/suppliers/models/supplier_pricing.py +74 -0
- services/suppliers/models/supplier_quality.py +74 -0
- services/suppliers/models/supplier_shipping.py +76 -0
- services/suppliers/routers/__init__.py +13 -0
- services/suppliers/routers/supplier_capabilities.py +88 -0
- services/suppliers/routers/supplier_certifications.py +87 -0
- services/suppliers/routers/supplier_details.py +83 -0
- services/suppliers/routers/supplier_financials.py +83 -0
- services/suppliers/routers/supplier_inventory.py +105 -0
- services/suppliers/routers/supplier_locations.py +89 -0
- services/suppliers/routers/supplier_pricing.py +96 -0
- services/suppliers/routers/supplier_quality.py +96 -0
- services/suppliers/routers/supplier_shipping.py +96 -0
- services/supply_allocation/main.py +46 -0
- services/supply_allocation/routers/__init__.py +1 -0
- services/supply_allocation/routers/allocation.py +20 -0
- services/taxonomy/helpers/__init__.py +7 -0
- services/taxonomy/helpers/classes.py +48 -0
- services/taxonomy/helpers/family.py +53 -0
- services/taxonomy/helpers/subclass.py +58 -0
- services/taxonomy/main.py +48 -0
- services/taxonomy/models/__init__.py +7 -0
- services/taxonomy/models/classes.py +52 -0
- services/taxonomy/models/family.py +60 -0
- services/taxonomy/models/subclass.py +50 -0
- services/taxonomy/routers/__init__.py +7 -0
- services/taxonomy/routers/classes.py +78 -0
- services/taxonomy/routers/family.py +77 -0
- services/taxonomy/routers/subclass.py +82 -0
- services/warehouse_execution/__init__.py +1 -0
- services/warehouse_execution/main.py +46 -0
- services/warehouse_execution/routers/__init__.py +1 -0
- services/warehouse_execution/routers/execution.py +21 -0
- services/work_order_agent/__init__.py +17 -0
- services/work_order_agent/agent/__init__.py +17 -0
- services/work_order_agent/agent/work_order_agent.py +658 -0
- services/work_order_agent/tracking/__init__.py +101 -0
- services/work_order_agent/tracking/event_system.py +182 -0
- services/work_order_agent/tracking/state_machine.py +163 -0
- services/work_order_agent/tracking/state_machine_integrator.py +295 -0
- services/work_order_agent/tracking/test_phase2_implementation.py +302 -0
- services/work_order_agent/tracking/time_analysis.py +301 -0
- services/work_order_agent/tracking/tracked_work_order.py +255 -0
- services/work_order_agent/tracking/work_order_adapter.py +367 -0
- services/work_order_agent/tracking/work_order_batch_manager.py +406 -0
- services/work_order_agent/tracking/work_order_repository.py +431 -0
- services/workorders/helpers/__init__.py +5 -0
- services/workorders/helpers/area_room_usage_ledger.py +139 -0
- services/workorders/helpers/batch_execution_records.py +265 -0
- services/workorders/helpers/batch_release_workflows.py +158 -0
- services/workorders/helpers/batch_step_executions.py +145 -0
- services/workorders/helpers/equipment_usage_ledger.py +209 -0
- services/workorders/helpers/executed_bmr_records.py +170 -0
- services/workorders/helpers/executed_bpr_records.py +170 -0
- services/workorders/helpers/executed_instruction_evidence.py +155 -0
- services/workorders/helpers/ipc_result_records.py +134 -0
- services/workorders/helpers/production_batches.py +117 -0
- services/workorders/helpers/work_orders.py +367 -0
- services/workorders/helpers/yield_reconciliation_records.py +158 -0
- services/workorders/main.py +110 -0
- services/workorders/models/__init__.py +5 -0
- services/workorders/models/area_room_usage_ledger.py +154 -0
- services/workorders/models/batch_execution_records.py +575 -0
- services/workorders/models/batch_release_workflows.py +190 -0
- services/workorders/models/batch_step_executions.py +142 -0
- services/workorders/models/equipment_usage_ledger.py +144 -0
- services/workorders/models/executed_bmr_records.py +220 -0
- services/workorders/models/executed_bpr_records.py +220 -0
- services/workorders/models/executed_instruction_evidence.py +128 -0
- services/workorders/models/ipc_result_records.py +164 -0
- services/workorders/models/production_batches.py +181 -0
- services/workorders/models/work_orders.py +255 -0
- services/workorders/models/yield_reconciliation_records.py +175 -0
- services/workorders/routers/__init__.py +5 -0
- services/workorders/routers/area_room_usage_ledger.py +117 -0
- services/workorders/routers/batch_execution_records.py +103 -0
- services/workorders/routers/batch_release_workflows.py +86 -0
- services/workorders/routers/batch_step_executions.py +88 -0
- services/workorders/routers/equipment_usage_ledger.py +115 -0
- services/workorders/routers/executed_bmr_records.py +86 -0
- services/workorders/routers/executed_bpr_records.py +86 -0
- services/workorders/routers/executed_instruction_evidence.py +86 -0
- services/workorders/routers/ipc_result_records.py +86 -0
- services/workorders/routers/production_batches.py +86 -0
- services/workorders/routers/work_orders.py +257 -0
- services/workorders/routers/yield_reconciliation_records.py +86 -0
- src/broca/__init__.py +5 -0
- src/broca/agent.py +201 -0
- src/cerebellum/__init__.py +0 -0
- src/cerebellum/adapter.py +84 -0
- src/cerebellum/capabilities/__init__.py +0 -0
- src/cerebellum/capabilities/agent/__init__.py +0 -0
- src/cerebellum/capabilities/agent/agents.py +65 -0
- src/cerebellum/capabilities/ai/__init__.py +0 -0
- src/cerebellum/capabilities/ai/providers.py +106 -0
- src/cerebellum/capabilities/api/__init__.py +0 -0
- src/cerebellum/capabilities/api/graphql.py +35 -0
- src/cerebellum/capabilities/api/rest_api.py +45 -0
- src/cerebellum/capabilities/api/webhook.py +30 -0
- src/cerebellum/capabilities/browser/__init__.py +0 -0
- src/cerebellum/capabilities/browser/browsers.py +27 -0
- src/cerebellum/capabilities/cloud/__init__.py +0 -0
- src/cerebellum/capabilities/cloud/cloud.py +46 -0
- src/cerebellum/capabilities/communication/__init__.py +0 -0
- src/cerebellum/capabilities/communication/communication.py +62 -0
- src/cerebellum/capabilities/database/__init__.py +0 -0
- src/cerebellum/capabilities/database/elasticsearch.py +40 -0
- src/cerebellum/capabilities/database/influxdb.py +37 -0
- src/cerebellum/capabilities/database/mongodb.py +50 -0
- src/cerebellum/capabilities/database/neo4j.py +32 -0
- src/cerebellum/capabilities/database/redis.py +44 -0
- src/cerebellum/capabilities/enterprise/__init__.py +0 -0
- src/cerebellum/capabilities/enterprise/opensource.py +180 -0
- src/cerebellum/capabilities/enterprise/proprietary.py +313 -0
- src/cerebellum/capabilities/event_streaming/__init__.py +0 -0
- src/cerebellum/capabilities/event_streaming/streaming.py +38 -0
- src/cerebellum/capabilities/infrastructure/__init__.py +0 -0
- src/cerebellum/capabilities/infrastructure/infrastructure.py +30 -0
- src/cerebellum/capabilities/productivity/__init__.py +0 -0
- src/cerebellum/capabilities/productivity/productivity.py +158 -0
- src/cerebellum/capabilities/robotics/__init__.py +0 -0
- src/cerebellum/capabilities/robotics/robotics.py +124 -0
- src/cerebellum/capabilities/runtime/__init__.py +0 -0
- src/cerebellum/capabilities/runtime/runtimes.py +92 -0
- src/cerebellum/capabilities/search/__init__.py +0 -0
- src/cerebellum/capabilities/search/search.py +63 -0
- src/cerebellum/capabilities/source_control/__init__.py +0 -0
- src/cerebellum/capabilities/source_control/source_control.py +113 -0
- src/cerebellum/capabilities/storage/__init__.py +0 -0
- src/cerebellum/capabilities/storage/storage.py +94 -0
- src/cerebellum/capabilities/workflow/__init__.py +0 -0
- src/cerebellum/capabilities/workflow/workflows.py +49 -0
- src/cerebellum/capability.py +108 -0
- src/cerebellum/config.py +157 -0
- src/cerebellum/fallback.py +147 -0
- src/cerebellum/fallback_engine.py +121 -0
- src/cerebellum/key_manager.py +129 -0
- src/cerebellum/keystore.py +179 -0
- src/cerebellum/lifecycle.py +54 -0
- src/cerebellum/metadata.py +61 -0
- src/cerebellum/operator/base.py +25 -0
- src/cerebellum/peripheral.py +92 -0
- src/cerebellum/registry.py +98 -0
- src/cerebellum/resolve_entity_capability.py +259 -0
- src/cingulate/benchmark/__init__.py +23 -0
- src/cingulate/benchmark/reporter.py +102 -0
- src/cingulate/benchmark/runner.py +159 -0
- src/cingulate/benchmark/scenario_runner.py +150 -0
- src/cingulate/benchmark/validator.py +102 -0
- src/cingulate/governance/__init__.py +21 -0
- src/cingulate/governance/architecture_validator.py +194 -0
- src/cingulate/governance/compliance.py +104 -0
- src/cingulate/governance/governance.py +77 -0
- src/cingulate/governance/policy_registry.py +91 -0
- src/cortex/__init__.py +33 -0
- src/cortex/cost.py +71 -0
- src/cortex/counterfactual.py +162 -0
- src/cortex/digital_twin.py +90 -0
- src/cortex/experience.py +83 -0
- src/cortex/feedback.py +144 -0
- src/cortex/loss.py +116 -0
- src/cortex/prediction.py +142 -0
- src/cortex/replay.py +130 -0
- src/cortex/reward.py +113 -0
- src/cortex/simulator.py +102 -0
- src/cortex/world_model.py +180 -0
- src/cortex/world_model_simulation.py +1591 -0
- src/cortex/world_state.py +121 -0
- src/cortex/xavier.py +250 -0
- src/deepdive/__init__.py +29 -0
- src/deepdive/aggregation.py +113 -0
- src/deepdive/digital_twin_aggregator.py +128 -0
- src/deepdive/elasticsearch_adapter.py +110 -0
- src/deepdive/fleet_analytics.py +131 -0
- src/deepdive/knowledge_aggregator.py +130 -0
- src/homeostasis/__init__.py +19 -0
- src/homeostasis/control_plane.py +159 -0
- src/introspection/__init__.py +38 -0
- src/introspection/alerting.py +142 -0
- src/introspection/health.py +101 -0
- src/introspection/lemon.py +243 -0
- src/introspection/logging.py +147 -0
- src/introspection/metrics.py +106 -0
- src/introspection/tracing.py +162 -0
- src/monkey_brain/__init__.py +1 -0
- src/monkey_brain/api/main.py +148 -0
- src/monkey_brain/api/models.py +81 -0
- src/monkey_brain/api/routes/routes/keys.py +106 -0
- src/monkey_brain/api/routes/routes/run.py +169 -0
- src/monkey_brain/api/routes/routes/simulate.py +485 -0
- src/monkey_brain/dlm/__init__.py +44 -0
- src/monkey_brain/dlm/dlm.py +139 -0
- src/monkey_brain/dlm/gc.py +115 -0
- src/monkey_brain/dlm/lifecycle.py +149 -0
- src/monkey_brain/dlm/orphans.py +99 -0
- src/monkey_brain/dlm/storage.py +149 -0
- src/monkey_brain/dlm/ttl.py +140 -0
- src/monkey_brain/documents/__init__.py +0 -0
- src/monkey_brain/documents/document_ocr.py +6 -0
- src/monkey_brain/kernel/__init__.py +53 -0
- src/monkey_brain/kernel/capability_interface.py +144 -0
- src/monkey_brain/kernel/classifier/__init__.py +1 -0
- src/monkey_brain/kernel/classifier/embed_classifier.py +125 -0
- src/monkey_brain/kernel/classifier/intent_examples.py +106 -0
- src/monkey_brain/kernel/dag.py +23 -0
- src/monkey_brain/kernel/execution_state.py +257 -0
- src/monkey_brain/kernel/goal_planner.py +85 -0
- src/monkey_brain/kernel/goal_router.py +20 -0
- src/monkey_brain/kernel/goals/__init__.py +1 -0
- src/monkey_brain/kernel/goals/goal.py +130 -0
- src/monkey_brain/kernel/goals/goal_bootstrap.py +38 -0
- src/monkey_brain/kernel/goals/goal_classifier.py +132 -0
- src/monkey_brain/kernel/goals/goal_registry.py +75 -0
- src/monkey_brain/kernel/intents/__init__.py +1 -0
- src/monkey_brain/kernel/intents/event_adapter.py +246 -0
- src/monkey_brain/kernel/intents/helpers.py +13 -0
- src/monkey_brain/kernel/intents/intent_registry.py +705 -0
- src/monkey_brain/kernel/intents/intent_router.py +102 -0
- src/monkey_brain/kernel/intents/predicates/approval_create.py +9 -0
- src/monkey_brain/kernel/intents/predicates/approval_decision.py +9 -0
- src/monkey_brain/kernel/intents/predicates/approval_hold.py +9 -0
- src/monkey_brain/kernel/intents/predicates/approval_query.py +9 -0
- src/monkey_brain/kernel/intents/predicates/batch_close.py +9 -0
- src/monkey_brain/kernel/intents/predicates/batch_creation.py +9 -0
- src/monkey_brain/kernel/intents/predicates/batch_delete.py +9 -0
- src/monkey_brain/kernel/intents/predicates/batch_hold.py +9 -0
- src/monkey_brain/kernel/intents/predicates/batch_record.py +9 -0
- src/monkey_brain/kernel/intents/predicates/batch_update.py +9 -0
- src/monkey_brain/kernel/intents/predicates/change_control.py +49 -0
- src/monkey_brain/kernel/intents/predicates/compliance_audit.py +14 -0
- src/monkey_brain/kernel/intents/predicates/decision_intelligence.py +9 -0
- src/monkey_brain/kernel/intents/predicates/drug_research.py +9 -0
- src/monkey_brain/kernel/intents/predicates/fuzzy_match.py +19 -0
- src/monkey_brain/kernel/intents/predicates/production_kpi.py +9 -0
- src/monkey_brain/kernel/intents/predicates/sop_create.py +9 -0
- src/monkey_brain/kernel/intents/predicates/sop_query.py +9 -0
- src/monkey_brain/kernel/intents/predicates/sop_update.py +9 -0
- src/monkey_brain/kernel/intents/predicates/warehouse_shipping.py +9 -0
- src/monkey_brain/kernel/intents/predicates/work_order_create.py +9 -0
- src/monkey_brain/kernel/intents/predicates/work_order_delete.py +9 -0
- src/monkey_brain/kernel/intents/predicates/work_order_hold.py +9 -0
- src/monkey_brain/kernel/intents/predicates/work_order_query.py +9 -0
- src/monkey_brain/kernel/intents/predicates/work_order_status.py +9 -0
- src/monkey_brain/kernel/intents/predicates/work_order_update.py +9 -0
- src/monkey_brain/kernel/intents/predicates/worker.py +9 -0
- src/monkey_brain/kernel/intents/telemetry_adapter.py +274 -0
- src/monkey_brain/kernel/intents/utils.py +68 -0
- src/monkey_brain/kernel/learning.py +98 -0
- src/monkey_brain/kernel/llm_explorer.py +188 -0
- src/monkey_brain/kernel/loss.py +81 -0
- src/monkey_brain/kernel/nlp/__init__.py +1 -0
- src/monkey_brain/kernel/nlp/compat.py +23 -0
- src/monkey_brain/kernel/nlp/models.py +10 -0
- src/monkey_brain/kernel/nlp/question_analyzer.py +203 -0
- src/monkey_brain/kernel/nlp/spacy_parser.py +53 -0
- src/monkey_brain/kernel/observer.py +97 -0
- src/monkey_brain/kernel/parser/__init__.py +3 -0
- src/monkey_brain/kernel/parser/ast.py +28 -0
- src/monkey_brain/kernel/parser/extractors/__init__.py +11 -0
- src/monkey_brain/kernel/parser/extractors/entities.py +21 -0
- src/monkey_brain/kernel/parser/extractors/filters.py +16 -0
- src/monkey_brain/kernel/parser/extractors/projections.py +36 -0
- src/monkey_brain/kernel/parser/extractors/verbs.py +31 -0
- src/monkey_brain/kernel/parser/parser.py +57 -0
- src/monkey_brain/kernel/parser/rules.py +75 -0
- src/monkey_brain/kernel/pipeline.py +44 -0
- src/monkey_brain/kernel/planner.py +57 -0
- src/monkey_brain/kernel/rl/__init__.py +33 -0
- src/monkey_brain/kernel/rl/learner.py +98 -0
- src/monkey_brain/kernel/rl/policy.py +254 -0
- src/monkey_brain/kernel/rl/reward.py +117 -0
- src/monkey_brain/kernel/rl/transition.py +112 -0
- src/monkey_brain/persistence/__init__.py +47 -0
- src/monkey_brain/persistence/adapters.py +49 -0
- src/monkey_brain/persistence/events.py +105 -0
- src/monkey_brain/persistence/manager.py +124 -0
- src/monkey_brain/persistence/mongodb_adapter.py +91 -0
- src/monkey_brain/persistence/redis_adapter.py +93 -0
- src/monkey_brain/persistence/reducer.py +111 -0
- src/monkey_brain/runtime/__init__.py +49 -0
- src/monkey_brain/runtime/depedencies.py +8 -0
- src/monkey_brain/runtime/engine.py +183 -0
- src/monkey_brain/runtime/message_bus.py +82 -0
- src/monkey_brain/runtime/process.py +144 -0
- src/monkey_brain/runtime/resource_manager.py +100 -0
- src/monkey_brain/runtime/routers.py +8 -0
- src/monkey_brain/runtime/runtime.py +199 -0
- src/monkey_brain/runtime/scheduler.py +165 -0
- src/monkey_brain/runtime/supervisor.py +133 -0
- src/monkey_brain/runtime/worker_pool.py +111 -0
- src/plasticity/seed/__init__.py +30 -0
- src/plasticity/seed/benchmark_generator.py +105 -0
- src/plasticity/seed/event_generator.py +122 -0
- src/plasticity/seed/scenario_builder.py +134 -0
- src/plasticity/seed/seed_data.py +206 -0
- src/plasticity/seed/seeder.py +122 -0
- src/plasticity/testing/__init__.py +28 -0
- src/plasticity/testing/performance.py +131 -0
- src/plasticity/testing/profiler.py +255 -0
- src/plasticity/testing/reporter.py +84 -0
- src/plasticity/testing/runner.py +209 -0
- src/sync/__init__.py +12 -0
- src/sync/cloud_aggregator.py +63 -0
- src/sync/edge_node.py +51 -0
- src/sync/sync_manager.py +74 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
"""
|
|
2
|
+
helpers/prechecks_helper.py
|
|
3
|
+
----------------------------
|
|
4
|
+
MongoDB CRUD helper for ProcessPrechecks and ProcessStepPrechecks models.
|
|
5
|
+
Mirrors the pattern established in the devices helper.
|
|
6
|
+
|
|
7
|
+
Collections
|
|
8
|
+
-----------
|
|
9
|
+
process_definition_prechecks → ProcessPrechecks documents (one per process_definition)
|
|
10
|
+
process_step_prechecks → ProcessStepPrechecks documents (one per step)
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from typing import Optional
|
|
14
|
+
from motor.motor_asyncio import AsyncIOMotorDatabase
|
|
15
|
+
|
|
16
|
+
from services.process_definitions.models.process_pre_checks import (
|
|
17
|
+
ProcessPrechecksCreate,
|
|
18
|
+
ProcessPrechecksUpdate,
|
|
19
|
+
ProcessStepPrechecksCreate,
|
|
20
|
+
ProcessStepPrechecksUpdate,
|
|
21
|
+
PreCheckConditionCreate,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
WORKFLOW_COLLECTION = "process_definition_prechecks"
|
|
25
|
+
STEP_COLLECTION = "process_step_prechecks"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _serialize(doc: dict) -> dict:
|
|
29
|
+
"""Strip MongoDB's internal _id before returning a document."""
|
|
30
|
+
doc.pop("_id", None)
|
|
31
|
+
return doc
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# ===========================================================================
|
|
35
|
+
# ProcessPrechecks (process_definition-level)
|
|
36
|
+
# ===========================================================================
|
|
37
|
+
|
|
38
|
+
# ---------------------------------------------------------------------------
|
|
39
|
+
# Read
|
|
40
|
+
# ---------------------------------------------------------------------------
|
|
41
|
+
|
|
42
|
+
async def get_all(
|
|
43
|
+
db: AsyncIOMotorDatabase,
|
|
44
|
+
page: int = 1,
|
|
45
|
+
page_size: int = 20,
|
|
46
|
+
) -> tuple[list[dict], int]:
|
|
47
|
+
"""Return a paginated list of all ProcessPrechecks containers."""
|
|
48
|
+
query: dict = {}
|
|
49
|
+
total = await db[WORKFLOW_COLLECTION].count_documents(query)
|
|
50
|
+
cursor = (
|
|
51
|
+
db[WORKFLOW_COLLECTION]
|
|
52
|
+
.find(query)
|
|
53
|
+
.skip((page - 1) * page_size)
|
|
54
|
+
.limit(page_size)
|
|
55
|
+
)
|
|
56
|
+
return [_serialize(d) async for d in cursor], total
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
async def get_by_id(
|
|
60
|
+
db: AsyncIOMotorDatabase,
|
|
61
|
+
prechecks_id: str,
|
|
62
|
+
) -> Optional[dict]:
|
|
63
|
+
"""Fetch a ProcessPrechecks container by its id."""
|
|
64
|
+
doc = await db[WORKFLOW_COLLECTION].find_one({"id": prechecks_id})
|
|
65
|
+
return _serialize(doc) if doc else None
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
async def get_by_process_definition_id(
|
|
69
|
+
db: AsyncIOMotorDatabase,
|
|
70
|
+
process_definition_id: str,
|
|
71
|
+
) -> Optional[dict]:
|
|
72
|
+
"""Fetch the prechecks container that belongs to a given process_definition."""
|
|
73
|
+
if not process_definition_id:
|
|
74
|
+
return None
|
|
75
|
+
doc = await db[WORKFLOW_COLLECTION].find_one({"process_definition_id": process_definition_id})
|
|
76
|
+
return _serialize(doc) if doc else None
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
async def get_conditions_by_severity(
|
|
80
|
+
db: AsyncIOMotorDatabase,
|
|
81
|
+
prechecks_id: str,
|
|
82
|
+
severity: str,
|
|
83
|
+
) -> list[dict]:
|
|
84
|
+
"""Return all conditions within a container that match a given severity."""
|
|
85
|
+
doc = await db[WORKFLOW_COLLECTION].find_one({"id": prechecks_id})
|
|
86
|
+
if not doc:
|
|
87
|
+
return []
|
|
88
|
+
return [
|
|
89
|
+
c for c in doc.get("process_definition_precheck_conditions", [])
|
|
90
|
+
if c.get("severity") == severity
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
async def get_mandatory_conditions(
|
|
95
|
+
db: AsyncIOMotorDatabase,
|
|
96
|
+
prechecks_id: str,
|
|
97
|
+
) -> list[dict]:
|
|
98
|
+
"""Return only the mandatory conditions from a container."""
|
|
99
|
+
doc = await db[WORKFLOW_COLLECTION].find_one({"id": prechecks_id})
|
|
100
|
+
if not doc:
|
|
101
|
+
return []
|
|
102
|
+
return [
|
|
103
|
+
c for c in doc.get("process_definition_precheck_conditions", [])
|
|
104
|
+
if c.get("is_mandatory") is True
|
|
105
|
+
]
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
# ---------------------------------------------------------------------------
|
|
109
|
+
# Write
|
|
110
|
+
# ---------------------------------------------------------------------------
|
|
111
|
+
|
|
112
|
+
async def create(
|
|
113
|
+
db: AsyncIOMotorDatabase,
|
|
114
|
+
data: ProcessPrechecksCreate,
|
|
115
|
+
) -> dict:
|
|
116
|
+
"""Insert a new ProcessPrechecks container and return it."""
|
|
117
|
+
doc = data.model_dump()
|
|
118
|
+
await db[WORKFLOW_COLLECTION].insert_one(doc)
|
|
119
|
+
return _serialize(doc)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
async def update(
|
|
123
|
+
db: AsyncIOMotorDatabase,
|
|
124
|
+
prechecks_id: str,
|
|
125
|
+
data: ProcessPrechecksUpdate,
|
|
126
|
+
) -> Optional[dict]:
|
|
127
|
+
"""
|
|
128
|
+
Partially update a ProcessPrechecks container.
|
|
129
|
+
Only non-None fields are written.
|
|
130
|
+
"""
|
|
131
|
+
fields = {k: v for k, v in data.model_dump().items() if v is not None}
|
|
132
|
+
if not fields:
|
|
133
|
+
return await get_by_id(db, prechecks_id)
|
|
134
|
+
result = await db[WORKFLOW_COLLECTION].find_one_and_update(
|
|
135
|
+
{"id": prechecks_id},
|
|
136
|
+
{"$set": fields},
|
|
137
|
+
return_document=True,
|
|
138
|
+
)
|
|
139
|
+
return _serialize(result) if result else None
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
async def add_condition(
|
|
143
|
+
db: AsyncIOMotorDatabase,
|
|
144
|
+
prechecks_id: str,
|
|
145
|
+
condition: PreCheckConditionCreate,
|
|
146
|
+
) -> Optional[dict]:
|
|
147
|
+
"""Append a new PreCheckCondition to the conditions array."""
|
|
148
|
+
result = await db[WORKFLOW_COLLECTION].find_one_and_update(
|
|
149
|
+
{"id": prechecks_id},
|
|
150
|
+
{"$push": {"process_definition_precheck_conditions": condition.model_dump()}},
|
|
151
|
+
return_document=True,
|
|
152
|
+
)
|
|
153
|
+
return _serialize(result) if result else None
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
async def update_condition(
|
|
157
|
+
db: AsyncIOMotorDatabase,
|
|
158
|
+
prechecks_id: str,
|
|
159
|
+
condition_id: str,
|
|
160
|
+
fields: dict,
|
|
161
|
+
) -> Optional[dict]:
|
|
162
|
+
"""
|
|
163
|
+
Update specific fields of a PreCheckCondition inside the conditions array.
|
|
164
|
+
Pass only the fields you want to change in the `fields` dict.
|
|
165
|
+
"""
|
|
166
|
+
updates = {f"process_definition_precheck_conditions.$.{k}": v for k, v in fields.items()}
|
|
167
|
+
result = await db[WORKFLOW_COLLECTION].find_one_and_update(
|
|
168
|
+
{"id": prechecks_id, "process_definition_precheck_conditions.id": condition_id},
|
|
169
|
+
{"$set": updates},
|
|
170
|
+
return_document=True,
|
|
171
|
+
)
|
|
172
|
+
return _serialize(result) if result else None
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
async def remove_condition(
|
|
176
|
+
db: AsyncIOMotorDatabase,
|
|
177
|
+
prechecks_id: str,
|
|
178
|
+
condition_id: str,
|
|
179
|
+
) -> Optional[dict]:
|
|
180
|
+
"""Remove a specific condition from the conditions array."""
|
|
181
|
+
result = await db[WORKFLOW_COLLECTION].find_one_and_update(
|
|
182
|
+
{"id": prechecks_id},
|
|
183
|
+
{"$pull": {"process_definition_precheck_conditions": {"id": condition_id}}},
|
|
184
|
+
return_document=True,
|
|
185
|
+
)
|
|
186
|
+
return _serialize(result) if result else None
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
async def delete(
|
|
190
|
+
db: AsyncIOMotorDatabase,
|
|
191
|
+
prechecks_id: str,
|
|
192
|
+
) -> bool:
|
|
193
|
+
"""Delete a ProcessPrechecks container by ID."""
|
|
194
|
+
result = await db[WORKFLOW_COLLECTION].delete_one({"id": prechecks_id})
|
|
195
|
+
return result.deleted_count == 1
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
async def delete_by_process_definition_id(
|
|
199
|
+
db: AsyncIOMotorDatabase,
|
|
200
|
+
process_definition_id: str,
|
|
201
|
+
) -> bool:
|
|
202
|
+
"""Delete the prechecks container that belongs to a process_definition (cascade delete)."""
|
|
203
|
+
result = await db[WORKFLOW_COLLECTION].delete_one({"process_definition_id": process_definition_id})
|
|
204
|
+
return result.deleted_count == 1
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
# ===========================================================================
|
|
208
|
+
# ProcessStepPrechecks (step-level)
|
|
209
|
+
# ===========================================================================
|
|
210
|
+
|
|
211
|
+
# ---------------------------------------------------------------------------
|
|
212
|
+
# Read
|
|
213
|
+
# ---------------------------------------------------------------------------
|
|
214
|
+
|
|
215
|
+
async def get_step_prechecks_by_id(
|
|
216
|
+
db: AsyncIOMotorDatabase,
|
|
217
|
+
prechecks_id: str,
|
|
218
|
+
) -> Optional[dict]:
|
|
219
|
+
"""Fetch a ProcessStepPrechecks container by its id."""
|
|
220
|
+
doc = await db[STEP_COLLECTION].find_one({"id": prechecks_id})
|
|
221
|
+
return _serialize(doc) if doc else None
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
async def get_step_prechecks_by_step_id(
|
|
225
|
+
db: AsyncIOMotorDatabase,
|
|
226
|
+
step_id: str,
|
|
227
|
+
) -> Optional[dict]:
|
|
228
|
+
"""Fetch the prechecks container that belongs to a given process_definition step."""
|
|
229
|
+
if not step_id:
|
|
230
|
+
return None
|
|
231
|
+
doc = await db[STEP_COLLECTION].find_one({"process_step_id": step_id})
|
|
232
|
+
return _serialize(doc) if doc else None
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
async def get_step_prechecks_by_process_definition_id(
|
|
236
|
+
db: AsyncIOMotorDatabase,
|
|
237
|
+
process_definition_id: str,
|
|
238
|
+
) -> list[dict]:
|
|
239
|
+
"""Return all step-level prechecks containers that share the same process_definition_id."""
|
|
240
|
+
if not process_definition_id:
|
|
241
|
+
return []
|
|
242
|
+
cursor = db[STEP_COLLECTION].find({"process_definition_id": process_definition_id})
|
|
243
|
+
return [_serialize(d) async for d in cursor]
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
async def get_step_conditions_by_severity(
|
|
247
|
+
db: AsyncIOMotorDatabase,
|
|
248
|
+
prechecks_id: str,
|
|
249
|
+
severity: str,
|
|
250
|
+
) -> list[dict]:
|
|
251
|
+
"""Return all step-level conditions that match a given severity."""
|
|
252
|
+
doc = await db[STEP_COLLECTION].find_one({"id": prechecks_id})
|
|
253
|
+
if not doc:
|
|
254
|
+
return []
|
|
255
|
+
return [
|
|
256
|
+
c for c in doc.get("process_step_precheck_conditions", [])
|
|
257
|
+
if c.get("severity") == severity
|
|
258
|
+
]
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
# ---------------------------------------------------------------------------
|
|
262
|
+
# Write
|
|
263
|
+
# ---------------------------------------------------------------------------
|
|
264
|
+
|
|
265
|
+
async def create_step_prechecks(
|
|
266
|
+
db: AsyncIOMotorDatabase,
|
|
267
|
+
data: ProcessStepPrechecksCreate,
|
|
268
|
+
) -> dict:
|
|
269
|
+
"""Insert a new ProcessStepPrechecks container and return it."""
|
|
270
|
+
doc = data.model_dump()
|
|
271
|
+
await db[STEP_COLLECTION].insert_one(doc)
|
|
272
|
+
return _serialize(doc)
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
async def update_step_prechecks(
|
|
276
|
+
db: AsyncIOMotorDatabase,
|
|
277
|
+
prechecks_id: str,
|
|
278
|
+
data: ProcessStepPrechecksUpdate,
|
|
279
|
+
) -> Optional[dict]:
|
|
280
|
+
"""Partially update a ProcessStepPrechecks container."""
|
|
281
|
+
fields = {k: v for k, v in data.model_dump().items() if v is not None}
|
|
282
|
+
if not fields:
|
|
283
|
+
return await get_step_prechecks_by_id(db, prechecks_id)
|
|
284
|
+
result = await db[STEP_COLLECTION].find_one_and_update(
|
|
285
|
+
{"id": prechecks_id},
|
|
286
|
+
{"$set": fields},
|
|
287
|
+
return_document=True,
|
|
288
|
+
)
|
|
289
|
+
return _serialize(result) if result else None
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
async def add_step_condition(
|
|
293
|
+
db: AsyncIOMotorDatabase,
|
|
294
|
+
prechecks_id: str,
|
|
295
|
+
condition: PreCheckConditionCreate,
|
|
296
|
+
) -> Optional[dict]:
|
|
297
|
+
"""Append a new PreCheckCondition to a step's conditions array."""
|
|
298
|
+
result = await db[STEP_COLLECTION].find_one_and_update(
|
|
299
|
+
{"id": prechecks_id},
|
|
300
|
+
{"$push": {"process_step_precheck_conditions": condition.model_dump()}},
|
|
301
|
+
return_document=True,
|
|
302
|
+
)
|
|
303
|
+
return _serialize(result) if result else None
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
async def update_step_condition(
|
|
307
|
+
db: AsyncIOMotorDatabase,
|
|
308
|
+
prechecks_id: str,
|
|
309
|
+
condition_id: str,
|
|
310
|
+
fields: dict,
|
|
311
|
+
) -> Optional[dict]:
|
|
312
|
+
"""Update specific fields of a condition inside a step's conditions array."""
|
|
313
|
+
updates = {f"process_step_precheck_conditions.$.{k}": v for k, v in fields.items()}
|
|
314
|
+
result = await db[STEP_COLLECTION].find_one_and_update(
|
|
315
|
+
{"id": prechecks_id, "process_step_precheck_conditions.id": condition_id},
|
|
316
|
+
{"$set": updates},
|
|
317
|
+
return_document=True,
|
|
318
|
+
)
|
|
319
|
+
return _serialize(result) if result else None
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
async def remove_step_condition(
|
|
323
|
+
db: AsyncIOMotorDatabase,
|
|
324
|
+
prechecks_id: str,
|
|
325
|
+
condition_id: str,
|
|
326
|
+
) -> Optional[dict]:
|
|
327
|
+
"""Remove a specific condition from a step's conditions array."""
|
|
328
|
+
result = await db[STEP_COLLECTION].find_one_and_update(
|
|
329
|
+
{"id": prechecks_id},
|
|
330
|
+
{"$pull": {"process_step_precheck_conditions": {"id": condition_id}}},
|
|
331
|
+
return_document=True,
|
|
332
|
+
)
|
|
333
|
+
return _serialize(result) if result else None
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
async def delete_step_prechecks(
|
|
337
|
+
db: AsyncIOMotorDatabase,
|
|
338
|
+
prechecks_id: str,
|
|
339
|
+
) -> bool:
|
|
340
|
+
"""Delete a ProcessStepPrechecks container by ID."""
|
|
341
|
+
result = await db[STEP_COLLECTION].delete_one({"id": prechecks_id})
|
|
342
|
+
return result.deleted_count == 1
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
async def delete_step_prechecks_by_step_id(
|
|
346
|
+
db: AsyncIOMotorDatabase,
|
|
347
|
+
step_id: str,
|
|
348
|
+
) -> bool:
|
|
349
|
+
"""Delete the step prechecks container that belongs to a step (cascade delete)."""
|
|
350
|
+
result = await db[STEP_COLLECTION].delete_one({"process_step_id": step_id})
|
|
351
|
+
return result.deleted_count == 1
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"""
|
|
2
|
+
helpers/process_steps_helper.py
|
|
3
|
+
---------------------------------
|
|
4
|
+
MongoDB CRUD helper for ProcessSteps and ProcessStep models.
|
|
5
|
+
Mirrors the pattern established in the devices helper.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Optional
|
|
9
|
+
from motor.motor_asyncio import AsyncIOMotorDatabase
|
|
10
|
+
|
|
11
|
+
from services.process_definitions.models.process_steps import ProcessStepsCreate, ProcessStepsUpdate, ProcessStepUpdate
|
|
12
|
+
|
|
13
|
+
COLLECTION = "process_steps"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _serialize(doc: dict) -> dict:
|
|
17
|
+
"""Strip MongoDB's internal _id before returning a document."""
|
|
18
|
+
doc.pop("_id", None)
|
|
19
|
+
return doc
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# ---------------------------------------------------------------------------
|
|
23
|
+
# ProcessSteps — top-level container
|
|
24
|
+
# ---------------------------------------------------------------------------
|
|
25
|
+
|
|
26
|
+
async def get_all(
|
|
27
|
+
db: AsyncIOMotorDatabase,
|
|
28
|
+
page: int = 1,
|
|
29
|
+
page_size: int = 20,
|
|
30
|
+
) -> tuple[list[dict], int]:
|
|
31
|
+
"""Return a paginated list of all ProcessSteps containers and the total count."""
|
|
32
|
+
query: dict = {}
|
|
33
|
+
total = await db[COLLECTION].count_documents(query)
|
|
34
|
+
cursor = (
|
|
35
|
+
db[COLLECTION]
|
|
36
|
+
.find(query)
|
|
37
|
+
.skip((page - 1) * page_size)
|
|
38
|
+
.limit(page_size)
|
|
39
|
+
)
|
|
40
|
+
return [_serialize(d) async for d in cursor], total
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
async def get_by_id(
|
|
44
|
+
db: AsyncIOMotorDatabase,
|
|
45
|
+
steps_id: str,
|
|
46
|
+
) -> Optional[dict]:
|
|
47
|
+
"""Fetch a ProcessSteps container by its id."""
|
|
48
|
+
doc = await db[COLLECTION].find_one({"id": steps_id})
|
|
49
|
+
return _serialize(doc) if doc else None
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
async def get_by_process_definition_id(
|
|
53
|
+
db: AsyncIOMotorDatabase,
|
|
54
|
+
process_definition_id: str,
|
|
55
|
+
) -> Optional[dict]:
|
|
56
|
+
"""Fetch the ProcessSteps container that belongs to a given process_definition."""
|
|
57
|
+
if not process_definition_id:
|
|
58
|
+
return None
|
|
59
|
+
doc = await db[COLLECTION].find_one({"process_definition_id": process_definition_id})
|
|
60
|
+
return _serialize(doc) if doc else None
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
async def create(
|
|
64
|
+
db: AsyncIOMotorDatabase,
|
|
65
|
+
data: ProcessStepsCreate,
|
|
66
|
+
) -> dict:
|
|
67
|
+
"""Insert a new ProcessSteps container and return it."""
|
|
68
|
+
doc = data.model_dump()
|
|
69
|
+
await db[COLLECTION].insert_one(doc)
|
|
70
|
+
return _serialize(doc)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
async def update(
|
|
74
|
+
db: AsyncIOMotorDatabase,
|
|
75
|
+
steps_id: str,
|
|
76
|
+
data: ProcessStepsUpdate,
|
|
77
|
+
) -> Optional[dict]:
|
|
78
|
+
"""
|
|
79
|
+
Partially update a ProcessSteps container.
|
|
80
|
+
Only non-None fields are written.
|
|
81
|
+
"""
|
|
82
|
+
fields = {k: v for k, v in data.model_dump().items() if v is not None}
|
|
83
|
+
if not fields:
|
|
84
|
+
return await get_by_id(db, steps_id)
|
|
85
|
+
result = await db[COLLECTION].find_one_and_update(
|
|
86
|
+
{"id": steps_id},
|
|
87
|
+
{"$set": fields},
|
|
88
|
+
return_document=True,
|
|
89
|
+
)
|
|
90
|
+
return _serialize(result) if result else None
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
async def delete(
|
|
94
|
+
db: AsyncIOMotorDatabase,
|
|
95
|
+
steps_id: str,
|
|
96
|
+
) -> bool:
|
|
97
|
+
"""Delete a ProcessSteps container by ID. Returns True if removed."""
|
|
98
|
+
result = await db[COLLECTION].delete_one({"id": steps_id})
|
|
99
|
+
return result.deleted_count == 1
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
async def delete_by_process_definition_id(
|
|
103
|
+
db: AsyncIOMotorDatabase,
|
|
104
|
+
process_definition_id: str,
|
|
105
|
+
) -> bool:
|
|
106
|
+
"""Delete the ProcessSteps container that belongs to a process_definition."""
|
|
107
|
+
result = await db[COLLECTION].delete_one({"process_definition_id": process_definition_id})
|
|
108
|
+
return result.deleted_count == 1
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
# ---------------------------------------------------------------------------
|
|
112
|
+
# Individual ProcessStep — operations on steps[] array inside the container
|
|
113
|
+
# ---------------------------------------------------------------------------
|
|
114
|
+
|
|
115
|
+
async def get_step_by_id(
|
|
116
|
+
db: AsyncIOMotorDatabase,
|
|
117
|
+
steps_id: str,
|
|
118
|
+
step_id: str,
|
|
119
|
+
) -> Optional[dict]:
|
|
120
|
+
"""Return a single step from within a ProcessSteps container."""
|
|
121
|
+
doc = await db[COLLECTION].find_one(
|
|
122
|
+
{"id": steps_id, "steps.id": step_id},
|
|
123
|
+
{"steps.$": 1},
|
|
124
|
+
)
|
|
125
|
+
if not doc or not doc.get("steps"):
|
|
126
|
+
return None
|
|
127
|
+
return doc["steps"][0]
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
async def get_steps_by_status(
|
|
131
|
+
db: AsyncIOMotorDatabase,
|
|
132
|
+
steps_id: str,
|
|
133
|
+
status: str,
|
|
134
|
+
) -> list[dict]:
|
|
135
|
+
"""Return all steps within a container that match a given status."""
|
|
136
|
+
doc = await db[COLLECTION].find_one({"id": steps_id})
|
|
137
|
+
if not doc:
|
|
138
|
+
return []
|
|
139
|
+
return [s for s in doc.get("steps", []) if s.get("status") == status]
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
async def get_steps_by_action_type(
|
|
143
|
+
db: AsyncIOMotorDatabase,
|
|
144
|
+
steps_id: str,
|
|
145
|
+
action_type: str,
|
|
146
|
+
) -> list[dict]:
|
|
147
|
+
"""Return all steps within a container that match a given action_type."""
|
|
148
|
+
doc = await db[COLLECTION].find_one({"id": steps_id})
|
|
149
|
+
if not doc:
|
|
150
|
+
return []
|
|
151
|
+
return [s for s in doc.get("steps", []) if s.get("action_type") == action_type]
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
async def add_step(
|
|
155
|
+
db: AsyncIOMotorDatabase,
|
|
156
|
+
steps_id: str,
|
|
157
|
+
step: dict,
|
|
158
|
+
) -> Optional[dict]:
|
|
159
|
+
"""Append a new ProcessStep to the steps array of a container."""
|
|
160
|
+
result = await db[COLLECTION].find_one_and_update(
|
|
161
|
+
{"id": steps_id},
|
|
162
|
+
{"$push": {"steps": step}},
|
|
163
|
+
return_document=True,
|
|
164
|
+
)
|
|
165
|
+
return _serialize(result) if result else None
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
async def update_step(
|
|
169
|
+
db: AsyncIOMotorDatabase,
|
|
170
|
+
steps_id: str,
|
|
171
|
+
step_id: str,
|
|
172
|
+
data: ProcessStepUpdate,
|
|
173
|
+
) -> Optional[dict]:
|
|
174
|
+
"""
|
|
175
|
+
Update fields of a specific step inside the steps array.
|
|
176
|
+
Uses the positional $ operator to target the matched element.
|
|
177
|
+
Only non-None fields are written.
|
|
178
|
+
"""
|
|
179
|
+
fields = {
|
|
180
|
+
f"steps.$.{k}": v
|
|
181
|
+
for k, v in data.model_dump().items()
|
|
182
|
+
if v is not None
|
|
183
|
+
}
|
|
184
|
+
if not fields:
|
|
185
|
+
return await get_by_id(db, steps_id)
|
|
186
|
+
result = await db[COLLECTION].find_one_and_update(
|
|
187
|
+
{"id": steps_id, "steps.id": step_id},
|
|
188
|
+
{"$set": fields},
|
|
189
|
+
return_document=True,
|
|
190
|
+
)
|
|
191
|
+
return _serialize(result) if result else None
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
async def update_step_status(
|
|
195
|
+
db: AsyncIOMotorDatabase,
|
|
196
|
+
steps_id: str,
|
|
197
|
+
step_id: str,
|
|
198
|
+
status: str,
|
|
199
|
+
) -> Optional[dict]:
|
|
200
|
+
"""Convenience helper: flip only the status of a single step."""
|
|
201
|
+
result = await db[COLLECTION].find_one_and_update(
|
|
202
|
+
{"id": steps_id, "steps.id": step_id},
|
|
203
|
+
{"$set": {"steps.$.status": status}},
|
|
204
|
+
return_document=True,
|
|
205
|
+
)
|
|
206
|
+
return _serialize(result) if result else None
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
async def remove_step(
|
|
210
|
+
db: AsyncIOMotorDatabase,
|
|
211
|
+
steps_id: str,
|
|
212
|
+
step_id: str,
|
|
213
|
+
) -> Optional[dict]:
|
|
214
|
+
"""Remove a specific step from the steps array. Returns the updated container."""
|
|
215
|
+
result = await db[COLLECTION].find_one_and_update(
|
|
216
|
+
{"id": steps_id},
|
|
217
|
+
{"$pull": {"steps": {"id": step_id}}},
|
|
218
|
+
return_document=True,
|
|
219
|
+
)
|
|
220
|
+
return _serialize(result) if result else None
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from contextlib import asynccontextmanager
|
|
2
|
+
|
|
3
|
+
from fastapi import FastAPI
|
|
4
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
5
|
+
|
|
6
|
+
from services.common.logging import configure_service_logging, install_request_logging
|
|
7
|
+
from services.common.tracing import install_route_tracing
|
|
8
|
+
|
|
9
|
+
from services.common.db import close_db, connect_db
|
|
10
|
+
from services.process_definitions.routers.cpp_cqa_registry import router as cpp_cqa_registry_router
|
|
11
|
+
from services.process_definitions.routers.mbmr_templates import router as mbmr_templates_router
|
|
12
|
+
from services.process_definitions.routers.packing_instructions import router as packing_instructions_router
|
|
13
|
+
from services.process_definitions.routers.process_definition import router as process_definition_router
|
|
14
|
+
from services.process_definitions.routers.process_steps import router as process_steps_router
|
|
15
|
+
from services.process_definitions.routers.process_pre_checks import router as process_definition_prechecks_router
|
|
16
|
+
from services.process_definitions.routers.process_post_checks import router as process_definition_postchecks_router
|
|
17
|
+
from services.process_definitions.routers.process_constraints import router as process_constraints_router
|
|
18
|
+
from services.process_definitions.routers.process_corrections import router as process_corrections_router
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
logger = configure_service_logging("process_definition")
|
|
22
|
+
|
|
23
|
+
@asynccontextmanager
|
|
24
|
+
async def lifespan(app: FastAPI):
|
|
25
|
+
await connect_db()
|
|
26
|
+
yield
|
|
27
|
+
await close_db()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
app = FastAPI(
|
|
31
|
+
title="Process Definition Service",
|
|
32
|
+
description="Microservice for process definition service.",
|
|
33
|
+
version="1.0.0",
|
|
34
|
+
lifespan=lifespan,
|
|
35
|
+
)
|
|
36
|
+
install_request_logging(app, "process_definition")
|
|
37
|
+
install_route_tracing(app, "process_definition")
|
|
38
|
+
|
|
39
|
+
app.add_middleware(
|
|
40
|
+
CORSMiddleware,
|
|
41
|
+
allow_origins=[
|
|
42
|
+
"http://localhost:5173",
|
|
43
|
+
"http://127.0.0.1:5173",
|
|
44
|
+
],
|
|
45
|
+
allow_origin_regex=(
|
|
46
|
+
r"^http://("
|
|
47
|
+
r"192\.168\.\d+\.\d+|"
|
|
48
|
+
r"10\.\d+\.\d+\.\d+|"
|
|
49
|
+
r"172\.(1[6-9]|2\d|3[0-1])\.\d+\.\d+|"
|
|
50
|
+
r"[A-Za-z0-9.-]+\.local"
|
|
51
|
+
r"):5173$"
|
|
52
|
+
),
|
|
53
|
+
allow_credentials=True,
|
|
54
|
+
allow_methods=["*"],
|
|
55
|
+
allow_headers=["*"],
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
app.include_router(process_definition_router, prefix="/api/v1/process-definitions", tags=["Process Definitions"])
|
|
59
|
+
app.include_router(cpp_cqa_registry_router, prefix="/api/v1/cpp-cqa-registry", tags=["CPP CQA Registry"])
|
|
60
|
+
app.include_router(mbmr_templates_router, prefix="/api/v1/mbmr-templates", tags=["MBMR Templates"])
|
|
61
|
+
app.include_router(packing_instructions_router, prefix="/api/v1/packing-instructions", tags=["Packing Instructions"])
|
|
62
|
+
app.include_router(process_steps_router, prefix="/api/v1/process-steps", tags=["Process Steps"])
|
|
63
|
+
app.include_router(process_definition_prechecks_router, prefix="/api/v1/process-prechecks", tags=["Process Prechecks"])
|
|
64
|
+
app.include_router(process_definition_postchecks_router, prefix="/api/v1/process-postchecks", tags=["Process Postchecks"])
|
|
65
|
+
app.include_router(process_constraints_router, prefix="/api/v1/process-constraints", tags=["Process Constraints"])
|
|
66
|
+
app.include_router(process_corrections_router, prefix="/api/v1/process-corrections", tags=["Process Corrections"])
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@app.get("/health", tags=["Health"])
|
|
70
|
+
async def health_check():
|
|
71
|
+
return {"status": "healthy"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""process definition service models package."""
|
|
2
|
+
|
|
3
|
+
__all__ = [
|
|
4
|
+
"process_definition",
|
|
5
|
+
"process_definition_common",
|
|
6
|
+
"process_constraints",
|
|
7
|
+
"process_corrections",
|
|
8
|
+
"process_definition_execution_path",
|
|
9
|
+
"process_node_catalog",
|
|
10
|
+
"process_post_checks",
|
|
11
|
+
"process_pre_checks",
|
|
12
|
+
"process_steps",
|
|
13
|
+
]
|