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,70 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class SupplierLocation(BaseModel):
|
|
7
|
+
supplier_id: str = Field(..., description="Unique identifier for the supplier.")
|
|
8
|
+
item_id: str = Field(..., description="Unique identifier for the inventory item.")
|
|
9
|
+
location_id: str = Field(..., description="Unique identifier for the supplier's specific location.")
|
|
10
|
+
location_name: str = Field(..., description="Name or description of the location, for example Head Office or Manufacturing Plant.")
|
|
11
|
+
address_line_1: str = Field(..., description="Primary address line for the location.")
|
|
12
|
+
address_line_2: Optional[str] = Field(None, description="Secondary address line, if applicable.")
|
|
13
|
+
city: str = Field(..., description="City where the supplier's location is based.")
|
|
14
|
+
state_province: str = Field(..., description="State or province of the location.")
|
|
15
|
+
country: str = Field(..., description="Country of the supplier's location.")
|
|
16
|
+
postal_code: str = Field(..., description="Postal or ZIP code for the location.")
|
|
17
|
+
contact_number: str = Field(..., description="Phone number for the location.")
|
|
18
|
+
email_address: str = Field(..., description="Email address for location-specific communication.")
|
|
19
|
+
facility_type: str = Field(..., description="Type of facility at the location, for example Manufacturing, Warehouse, or Office.")
|
|
20
|
+
operational_hours: str = Field(..., description="Standard hours of operation for the facility.")
|
|
21
|
+
primary_function: str = Field(..., description="Main activity performed at the location, for example Assembly or Distribution.")
|
|
22
|
+
geographical_coordinates: str = Field(..., description="Latitude and longitude for mapping purposes.")
|
|
23
|
+
annual_production_capacity: Optional[int] = Field(None, description="Maximum production output per year at this location.")
|
|
24
|
+
employee_count: int = Field(..., description="Total number of employees at the location.")
|
|
25
|
+
certifications: Optional[list[str]] = Field(None, description="Certifications specific to the location, for example ISO 9001 or OSHA Compliance.")
|
|
26
|
+
storage_capacity: Optional[float] = Field(None, description="Maximum storage capacity at the location, for example in cubic meters.")
|
|
27
|
+
key_contact_person: str = Field(..., description="Name of the primary contact person at the location.")
|
|
28
|
+
key_contact_role: str = Field(..., description="Role of the key contact person, for example Plant Manager or Logistics Coordinator.")
|
|
29
|
+
remarks: Optional[str] = Field(None, description="Additional notes or observations about the location.")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class SupplierLocationCreate(SupplierLocation):
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class SupplierLocationUpdate(BaseModel):
|
|
37
|
+
supplier_id: Optional[str] = None
|
|
38
|
+
item_id: Optional[str] = None
|
|
39
|
+
location_name: Optional[str] = None
|
|
40
|
+
address_line_1: Optional[str] = None
|
|
41
|
+
address_line_2: Optional[str] = None
|
|
42
|
+
city: Optional[str] = None
|
|
43
|
+
state_province: Optional[str] = None
|
|
44
|
+
country: Optional[str] = None
|
|
45
|
+
postal_code: Optional[str] = None
|
|
46
|
+
contact_number: Optional[str] = None
|
|
47
|
+
email_address: Optional[str] = None
|
|
48
|
+
facility_type: Optional[str] = None
|
|
49
|
+
operational_hours: Optional[str] = None
|
|
50
|
+
primary_function: Optional[str] = None
|
|
51
|
+
geographical_coordinates: Optional[str] = None
|
|
52
|
+
annual_production_capacity: Optional[int] = None
|
|
53
|
+
employee_count: Optional[int] = None
|
|
54
|
+
certifications: Optional[list[str]] = None
|
|
55
|
+
storage_capacity: Optional[float] = None
|
|
56
|
+
key_contact_person: Optional[str] = None
|
|
57
|
+
key_contact_role: Optional[str] = None
|
|
58
|
+
remarks: Optional[str] = None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class SupplierLocationResponse(SupplierLocation):
|
|
62
|
+
class Config:
|
|
63
|
+
from_attributes = True
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class PaginatedSupplierLocationResponse(BaseModel):
|
|
67
|
+
total: int
|
|
68
|
+
page: int
|
|
69
|
+
page_size: int
|
|
70
|
+
results: list[SupplierLocationResponse]
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SupplierPricingModel(BaseModel):
|
|
8
|
+
supplier_id: str = Field(..., description="Unique identifier for the supplier.")
|
|
9
|
+
item_id: str = Field(..., description="Unique identifier for the inventory item.")
|
|
10
|
+
location_id: str = Field(..., description="Unique identifier for the supplier's specific location.")
|
|
11
|
+
item_name: str = Field(..., description="Name or description of the item.")
|
|
12
|
+
unit_price: float = Field(..., description="Price per unit of the item.")
|
|
13
|
+
currency: str = Field(..., description="Currency in which the price is quoted.")
|
|
14
|
+
pricing_tier: str = Field(..., description="Price category based on order volume, for example Bulk, Standard, or Wholesale.")
|
|
15
|
+
discount_rate: float = Field(..., description="Discount percentage for bulk purchases or special agreements.")
|
|
16
|
+
net_unit_price: float = Field(..., description="Final price per unit after applying any discounts.")
|
|
17
|
+
quantity_range: str = Field(..., description="Range of quantities applicable for the specific pricing tier.")
|
|
18
|
+
pricing_validity_start: datetime = Field(..., description="Start datetime for the validity of the quoted price.")
|
|
19
|
+
pricing_validity_end: datetime = Field(..., description="End datetime for the validity of the quoted price.")
|
|
20
|
+
price_adjustment_terms: str = Field(..., description="Terms for adjusting prices due to inflation, raw material costs, etc.")
|
|
21
|
+
tax_rate: float = Field(..., description="Applicable tax percentage for the item.")
|
|
22
|
+
tax_amount: float = Field(..., description="Calculated tax amount per unit.")
|
|
23
|
+
total_unit_cost: float = Field(..., description="Unit price including taxes.")
|
|
24
|
+
shipping_cost_per_unit: float = Field(..., description="Estimated or actual shipping cost per unit.")
|
|
25
|
+
total_landed_cost: float = Field(..., description="Total cost per unit including price, taxes, and shipping.")
|
|
26
|
+
payment_terms: str = Field(..., description="Terms of payment specific to pricing agreements, for example Net 30 or Advance Payment.")
|
|
27
|
+
minimum_order_quantity: int = Field(..., description="Minimum quantity required for purchase at the specified price.")
|
|
28
|
+
price_escalation_clause: Optional[str] = Field(None, description="Conditions under which price increases are allowed.")
|
|
29
|
+
currency_exchange_rate: Optional[float] = Field(None, description="Exchange rate if pricing is in a foreign currency.")
|
|
30
|
+
custom_pricing_notes: Optional[str] = Field(None, description="Additional notes or special agreements regarding pricing.")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class SupplierPricingCreate(SupplierPricingModel):
|
|
34
|
+
pass
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class SupplierPricingUpdate(BaseModel):
|
|
38
|
+
supplier_id: Optional[str] = None
|
|
39
|
+
item_id: Optional[str] = None
|
|
40
|
+
location_id: Optional[str] = None
|
|
41
|
+
item_name: Optional[str] = None
|
|
42
|
+
unit_price: Optional[float] = None
|
|
43
|
+
currency: Optional[str] = None
|
|
44
|
+
pricing_tier: Optional[str] = None
|
|
45
|
+
discount_rate: Optional[float] = None
|
|
46
|
+
net_unit_price: Optional[float] = None
|
|
47
|
+
quantity_range: Optional[str] = None
|
|
48
|
+
pricing_validity_start: Optional[datetime] = None
|
|
49
|
+
pricing_validity_end: Optional[datetime] = None
|
|
50
|
+
price_adjustment_terms: Optional[str] = None
|
|
51
|
+
tax_rate: Optional[float] = None
|
|
52
|
+
tax_amount: Optional[float] = None
|
|
53
|
+
total_unit_cost: Optional[float] = None
|
|
54
|
+
shipping_cost_per_unit: Optional[float] = None
|
|
55
|
+
total_landed_cost: Optional[float] = None
|
|
56
|
+
payment_terms: Optional[str] = None
|
|
57
|
+
minimum_order_quantity: Optional[int] = None
|
|
58
|
+
price_escalation_clause: Optional[str] = None
|
|
59
|
+
currency_exchange_rate: Optional[float] = None
|
|
60
|
+
custom_pricing_notes: Optional[str] = None
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class SupplierPricingResponse(SupplierPricingModel):
|
|
64
|
+
supplier_pricing_id: str
|
|
65
|
+
|
|
66
|
+
class Config:
|
|
67
|
+
from_attributes = True
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class PaginatedSupplierPricingResponse(BaseModel):
|
|
71
|
+
total: int
|
|
72
|
+
page: int
|
|
73
|
+
page_size: int
|
|
74
|
+
results: list[SupplierPricingResponse]
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SupplierQualityData(BaseModel):
|
|
8
|
+
supplier_id: str = Field(..., description="Unique identifier for the supplier.")
|
|
9
|
+
item_id: str = Field(..., description="Unique identifier for the inventory item.")
|
|
10
|
+
location_id: str = Field(..., description="Unique identifier for the supplier's specific location.")
|
|
11
|
+
quality_rating: float = Field(..., description="Overall quality score based on historical performance, for example 1 to 100.")
|
|
12
|
+
defect_rate: float = Field(..., description="Percentage of defective items in delivered goods.")
|
|
13
|
+
on_time_delivery_rate: float = Field(..., description="Percentage of orders delivered on or before the agreed-upon date.")
|
|
14
|
+
return_rate: float = Field(..., description="Percentage of delivered goods returned due to quality issues.")
|
|
15
|
+
non_conformance_reports: int = Field(..., description="Number of non-conformance reports filed against the supplier.")
|
|
16
|
+
iso_certifications: list[str] = Field(..., description="List of ISO or equivalent certifications related to quality management.")
|
|
17
|
+
quality_audit_compliance_rate: float = Field(..., description="Percentage of quality audits passed successfully.")
|
|
18
|
+
inspection_pass_rate: float = Field(..., description="Percentage of items that pass quality inspection upon delivery.")
|
|
19
|
+
warranty_claims_rate: float = Field(..., description="Percentage of delivered goods that resulted in warranty claims.")
|
|
20
|
+
supplier_quality_manager: str = Field(..., description="Name of the person responsible for quality assurance at the supplier.")
|
|
21
|
+
corrective_action_turnaround_time: int = Field(..., description="Average number of days to resolve quality issues raised by the buyer.")
|
|
22
|
+
customer_complaint_rate: float = Field(..., description="Percentage of complaints related to supplier's products or services.")
|
|
23
|
+
continuous_improvement_programs: bool = Field(..., description="Indicates if the supplier has active quality improvement initiatives.")
|
|
24
|
+
last_quality_audit_date: datetime = Field(..., description="Date of the most recent quality audit conducted.")
|
|
25
|
+
next_quality_audit_date: datetime = Field(..., description="Scheduled date for the next quality audit.")
|
|
26
|
+
inspection_process_details: Optional[str] = Field(None, description="Description of the supplier's internal quality inspection processes.")
|
|
27
|
+
first_pass_yield: float = Field(..., description="Percentage of goods that meet quality standards without rework.")
|
|
28
|
+
material_traceability: bool = Field(..., description="Indicates whether the supplier provides traceability for materials used.")
|
|
29
|
+
adherence_to_specifications: float = Field(..., description="Percentage of delivered goods meeting exact design or technical specifications.")
|
|
30
|
+
remarks: Optional[str] = Field(None, description="Additional notes or observations about the supplier's quality performance.")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class SupplierQualityCreate(SupplierQualityData):
|
|
34
|
+
pass
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class SupplierQualityUpdate(BaseModel):
|
|
38
|
+
supplier_id: Optional[str] = None
|
|
39
|
+
item_id: Optional[str] = None
|
|
40
|
+
location_id: Optional[str] = None
|
|
41
|
+
quality_rating: Optional[float] = None
|
|
42
|
+
defect_rate: Optional[float] = None
|
|
43
|
+
on_time_delivery_rate: Optional[float] = None
|
|
44
|
+
return_rate: Optional[float] = None
|
|
45
|
+
non_conformance_reports: Optional[int] = None
|
|
46
|
+
iso_certifications: Optional[list[str]] = None
|
|
47
|
+
quality_audit_compliance_rate: Optional[float] = None
|
|
48
|
+
inspection_pass_rate: Optional[float] = None
|
|
49
|
+
warranty_claims_rate: Optional[float] = None
|
|
50
|
+
supplier_quality_manager: Optional[str] = None
|
|
51
|
+
corrective_action_turnaround_time: Optional[int] = None
|
|
52
|
+
customer_complaint_rate: Optional[float] = None
|
|
53
|
+
continuous_improvement_programs: Optional[bool] = None
|
|
54
|
+
last_quality_audit_date: Optional[datetime] = None
|
|
55
|
+
next_quality_audit_date: Optional[datetime] = None
|
|
56
|
+
inspection_process_details: Optional[str] = None
|
|
57
|
+
first_pass_yield: Optional[float] = None
|
|
58
|
+
material_traceability: Optional[bool] = None
|
|
59
|
+
adherence_to_specifications: Optional[float] = None
|
|
60
|
+
remarks: Optional[str] = None
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class SupplierQualityResponse(SupplierQualityData):
|
|
64
|
+
supplier_quality_id: str
|
|
65
|
+
|
|
66
|
+
class Config:
|
|
67
|
+
from_attributes = True
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class PaginatedSupplierQualityResponse(BaseModel):
|
|
71
|
+
total: int
|
|
72
|
+
page: int
|
|
73
|
+
page_size: int
|
|
74
|
+
results: list[SupplierQualityResponse]
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SupplierShippingData(BaseModel):
|
|
8
|
+
supplier_id: str = Field(..., description="Unique identifier for the supplier.")
|
|
9
|
+
item_id: str = Field(..., description="Unique identifier for the inventory item.")
|
|
10
|
+
location_id: str = Field(..., description="Unique identifier for the supplier's specific location.")
|
|
11
|
+
shipping_method: str = Field(..., description="The mode of transportation used, for example Air, Sea, Rail, Road, or Courier.")
|
|
12
|
+
shipping_carrier: str = Field(..., description="Name of the logistics provider or shipping company.")
|
|
13
|
+
shipping_terms: str = Field(..., description="Delivery terms as per the Incoterms, for example FOB, CIF, DDP, or EXW.")
|
|
14
|
+
origin_address: str = Field(..., description="Address from which the goods will be shipped.")
|
|
15
|
+
destination_address: str = Field(..., description="Delivery address for the goods.")
|
|
16
|
+
average_transit_time_days: int = Field(..., description="Average number of days required for shipping to the destination.")
|
|
17
|
+
shipping_cost: float = Field(..., description="Estimated or actual shipping cost per shipment.")
|
|
18
|
+
shipping_currency: str = Field(..., description="Currency in which the shipping cost is quoted.")
|
|
19
|
+
packaging_type: str = Field(..., description="Type of packaging used for shipments, for example Pallet, Crate, or Box.")
|
|
20
|
+
max_weight_per_shipment: float = Field(..., description="Maximum allowable weight for a single shipment in kg.")
|
|
21
|
+
max_volume_per_shipment: float = Field(..., description="Maximum allowable volume for a single shipment in cubic meters.")
|
|
22
|
+
tracking_available: bool = Field(..., description="Indicates if shipment tracking is available.")
|
|
23
|
+
tracking_url: Optional[str] = Field(None, description="URL for shipment tracking, if applicable.")
|
|
24
|
+
preferred_delivery_time: str = Field(..., description="Preferred time window for delivery, for example 9 AM - 5 PM.")
|
|
25
|
+
insurance_provided: bool = Field(..., description="Indicates if the shipment is insured.")
|
|
26
|
+
insurance_coverage_amount: Optional[float] = Field(None, description="Value covered by shipping insurance.")
|
|
27
|
+
freight_class: Optional[str] = Field(None, description="Freight classification for the shipment, for example Hazardous or Perishable.")
|
|
28
|
+
customs_clearance_included: bool = Field(..., description="Indicates if customs clearance is necessary for international shipments.")
|
|
29
|
+
customs_documentation: list[str] = Field(..., description="List of documents required for customs clearance, for example Invoice or Packing List.")
|
|
30
|
+
last_shipping_date: Optional[datetime] = Field(None, description="The most recent date a shipment was dispatched by the supplier.")
|
|
31
|
+
remarks: Optional[str] = Field(None, description="Additional notes or special instructions related to shipping.")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class SupplierShippingCreate(SupplierShippingData):
|
|
35
|
+
pass
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class SupplierShippingUpdate(BaseModel):
|
|
39
|
+
supplier_id: Optional[str] = None
|
|
40
|
+
item_id: Optional[str] = None
|
|
41
|
+
location_id: Optional[str] = None
|
|
42
|
+
shipping_method: Optional[str] = None
|
|
43
|
+
shipping_carrier: Optional[str] = None
|
|
44
|
+
shipping_terms: Optional[str] = None
|
|
45
|
+
origin_address: Optional[str] = None
|
|
46
|
+
destination_address: Optional[str] = None
|
|
47
|
+
average_transit_time_days: Optional[int] = None
|
|
48
|
+
shipping_cost: Optional[float] = None
|
|
49
|
+
shipping_currency: Optional[str] = None
|
|
50
|
+
packaging_type: Optional[str] = None
|
|
51
|
+
max_weight_per_shipment: Optional[float] = None
|
|
52
|
+
max_volume_per_shipment: Optional[float] = None
|
|
53
|
+
tracking_available: Optional[bool] = None
|
|
54
|
+
tracking_url: Optional[str] = None
|
|
55
|
+
preferred_delivery_time: Optional[str] = None
|
|
56
|
+
insurance_provided: Optional[bool] = None
|
|
57
|
+
insurance_coverage_amount: Optional[float] = None
|
|
58
|
+
freight_class: Optional[str] = None
|
|
59
|
+
customs_clearance_included: Optional[bool] = None
|
|
60
|
+
customs_documentation: Optional[list[str]] = None
|
|
61
|
+
last_shipping_date: Optional[datetime] = None
|
|
62
|
+
remarks: Optional[str] = None
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class SupplierShippingResponse(SupplierShippingData):
|
|
66
|
+
supplier_shipping_id: str
|
|
67
|
+
|
|
68
|
+
class Config:
|
|
69
|
+
from_attributes = True
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class PaginatedSupplierShippingResponse(BaseModel):
|
|
73
|
+
total: int
|
|
74
|
+
page: int
|
|
75
|
+
page_size: int
|
|
76
|
+
results: list[SupplierShippingResponse]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""suppliers service routers package."""
|
|
2
|
+
|
|
3
|
+
__all__ = [
|
|
4
|
+
"supplier_capabilities",
|
|
5
|
+
"supplier_certifications",
|
|
6
|
+
"supplier_details",
|
|
7
|
+
"supplier_financials",
|
|
8
|
+
"supplier_inventory",
|
|
9
|
+
"supplier_locations",
|
|
10
|
+
"supplier_pricing",
|
|
11
|
+
"supplier_quality",
|
|
12
|
+
"supplier_shipping",
|
|
13
|
+
]
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
from fastapi import APIRouter, Depends, HTTPException, Query, status
|
|
2
|
+
from motor.motor_asyncio import AsyncIOMotorDatabase
|
|
3
|
+
|
|
4
|
+
from services.common.db import get_database
|
|
5
|
+
from services.suppliers.helpers import supplier_capabilities as crud
|
|
6
|
+
from services.common.auth import require_permission
|
|
7
|
+
from services.suppliers.models.supplier_capabilities import (
|
|
8
|
+
PaginatedSupplierCapabilitiesResponse,
|
|
9
|
+
SupplierCapabilitiesCreate,
|
|
10
|
+
SupplierCapabilitiesResponse,
|
|
11
|
+
SupplierCapabilitiesUpdate,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
router = APIRouter()
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@router.get("/", response_model=PaginatedSupplierCapabilitiesResponse)
|
|
18
|
+
async def list_supplier_capabilities(
|
|
19
|
+
page: int = Query(1, ge=1),
|
|
20
|
+
page_size: int = Query(20, ge=1, le=100),
|
|
21
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
22
|
+
_: dict = Depends(require_permission("perm-view-products")),
|
|
23
|
+
):
|
|
24
|
+
records, total = await crud.get_all(db, page=page, page_size=page_size)
|
|
25
|
+
return PaginatedSupplierCapabilitiesResponse(
|
|
26
|
+
total=total,
|
|
27
|
+
page=page,
|
|
28
|
+
page_size=page_size,
|
|
29
|
+
results=records,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@router.get("/{supplier_id}", response_model=SupplierCapabilitiesResponse)
|
|
34
|
+
async def get_supplier_capabilities(
|
|
35
|
+
supplier_id: str,
|
|
36
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
37
|
+
_: dict = Depends(require_permission("perm-view-products")),
|
|
38
|
+
):
|
|
39
|
+
record = await crud.get_by_supplier_id(db, supplier_id)
|
|
40
|
+
if not record:
|
|
41
|
+
raise HTTPException(
|
|
42
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
43
|
+
detail=f"Supplier capabilities for supplier '{supplier_id}' not found",
|
|
44
|
+
)
|
|
45
|
+
return record
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@router.post("/", response_model=SupplierCapabilitiesResponse, status_code=status.HTTP_201_CREATED)
|
|
49
|
+
async def create_supplier_capabilities(
|
|
50
|
+
data: SupplierCapabilitiesCreate,
|
|
51
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
52
|
+
_: dict = Depends(require_permission("perm-create-products")),
|
|
53
|
+
):
|
|
54
|
+
if await crud.get_by_supplier_id(db, data.supplier_id):
|
|
55
|
+
raise HTTPException(
|
|
56
|
+
status_code=status.HTTP_409_CONFLICT,
|
|
57
|
+
detail=f"Supplier capabilities for supplier '{data.supplier_id}' already exist",
|
|
58
|
+
)
|
|
59
|
+
return await crud.create(db, data)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@router.patch("/{supplier_id}", response_model=SupplierCapabilitiesResponse)
|
|
63
|
+
async def update_supplier_capabilities(
|
|
64
|
+
supplier_id: str,
|
|
65
|
+
data: SupplierCapabilitiesUpdate,
|
|
66
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
67
|
+
_: dict = Depends(require_permission("perm-update-products")),
|
|
68
|
+
):
|
|
69
|
+
updated = await crud.update(db, supplier_id, data)
|
|
70
|
+
if not updated:
|
|
71
|
+
raise HTTPException(
|
|
72
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
73
|
+
detail=f"Supplier capabilities for supplier '{supplier_id}' not found",
|
|
74
|
+
)
|
|
75
|
+
return updated
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
@router.delete("/{supplier_id}", status_code=status.HTTP_204_NO_CONTENT)
|
|
79
|
+
async def delete_supplier_capabilities(
|
|
80
|
+
supplier_id: str,
|
|
81
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
82
|
+
_: dict = Depends(require_permission("perm-delete-products")),
|
|
83
|
+
):
|
|
84
|
+
if not await crud.delete(db, supplier_id):
|
|
85
|
+
raise HTTPException(
|
|
86
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
87
|
+
detail=f"Supplier capabilities for supplier '{supplier_id}' not found",
|
|
88
|
+
)
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
from fastapi import APIRouter, Depends, HTTPException, Query, status
|
|
2
|
+
from motor.motor_asyncio import AsyncIOMotorDatabase
|
|
3
|
+
|
|
4
|
+
from services.common.db import get_database
|
|
5
|
+
from services.suppliers.helpers import supplier_certifications as crud
|
|
6
|
+
from services.common.auth import require_permission
|
|
7
|
+
from services.suppliers.models.supplier_certifications import (
|
|
8
|
+
CertificationCreate,
|
|
9
|
+
CertificationResponse,
|
|
10
|
+
CertificationUpdate,
|
|
11
|
+
PaginatedCertificationResponse,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
router = APIRouter()
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@router.get("/", response_model=PaginatedCertificationResponse)
|
|
18
|
+
async def list_supplier_certifications(
|
|
19
|
+
page: int = Query(1, ge=1),
|
|
20
|
+
page_size: int = Query(20, ge=1, le=100),
|
|
21
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
22
|
+
_: dict = Depends(require_permission("perm-view-products")),
|
|
23
|
+
):
|
|
24
|
+
records, total = await crud.get_all(db, page=page, page_size=page_size)
|
|
25
|
+
return PaginatedCertificationResponse(total=total, page=page, page_size=page_size, results=records)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@router.get("/by-supplier/{supplier_id}", response_model=list[CertificationResponse])
|
|
29
|
+
async def list_supplier_certifications_by_supplier(
|
|
30
|
+
supplier_id: str,
|
|
31
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
32
|
+
_: dict = Depends(require_permission("perm-view-products")),
|
|
33
|
+
):
|
|
34
|
+
return await crud.get_by_supplier(db, supplier_id)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@router.get("/{certification_id}", response_model=CertificationResponse)
|
|
38
|
+
async def get_supplier_certification(
|
|
39
|
+
certification_id: str,
|
|
40
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
41
|
+
_: dict = Depends(require_permission("perm-view-products")),
|
|
42
|
+
):
|
|
43
|
+
record = await crud.get_by_id(db, certification_id)
|
|
44
|
+
if not record:
|
|
45
|
+
raise HTTPException(
|
|
46
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
47
|
+
detail=f"Supplier certification '{certification_id}' not found",
|
|
48
|
+
)
|
|
49
|
+
return record
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@router.post("/", response_model=CertificationResponse, status_code=status.HTTP_201_CREATED)
|
|
53
|
+
async def create_supplier_certification(
|
|
54
|
+
data: CertificationCreate,
|
|
55
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
56
|
+
_: dict = Depends(require_permission("perm-create-products")),
|
|
57
|
+
):
|
|
58
|
+
return await crud.create(db, data)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@router.patch("/{certification_id}", response_model=CertificationResponse)
|
|
62
|
+
async def update_supplier_certification(
|
|
63
|
+
certification_id: str,
|
|
64
|
+
data: CertificationUpdate,
|
|
65
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
66
|
+
_: dict = Depends(require_permission("perm-update-products")),
|
|
67
|
+
):
|
|
68
|
+
updated = await crud.update(db, certification_id, data)
|
|
69
|
+
if not updated:
|
|
70
|
+
raise HTTPException(
|
|
71
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
72
|
+
detail=f"Supplier certification '{certification_id}' not found",
|
|
73
|
+
)
|
|
74
|
+
return updated
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@router.delete("/{certification_id}", status_code=status.HTTP_204_NO_CONTENT)
|
|
78
|
+
async def delete_supplier_certification(
|
|
79
|
+
certification_id: str,
|
|
80
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
81
|
+
_: dict = Depends(require_permission("perm-delete-products")),
|
|
82
|
+
):
|
|
83
|
+
if not await crud.delete(db, certification_id):
|
|
84
|
+
raise HTTPException(
|
|
85
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
86
|
+
detail=f"Supplier certification '{certification_id}' not found",
|
|
87
|
+
)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
from fastapi import APIRouter, Depends, HTTPException, Query, status
|
|
2
|
+
from motor.motor_asyncio import AsyncIOMotorDatabase
|
|
3
|
+
|
|
4
|
+
from services.common.db import get_database
|
|
5
|
+
from services.suppliers.helpers import supplier_details as crud
|
|
6
|
+
from services.common.auth import require_permission
|
|
7
|
+
from services.suppliers.models.supplier_details import (
|
|
8
|
+
PaginatedSupplierDetailsResponse,
|
|
9
|
+
SupplierDetailsCreate,
|
|
10
|
+
SupplierDetailsResponse,
|
|
11
|
+
SupplierDetailsUpdate,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
router = APIRouter()
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@router.get("/", response_model=PaginatedSupplierDetailsResponse)
|
|
18
|
+
async def list_supplier_details(
|
|
19
|
+
page: int = Query(1, ge=1),
|
|
20
|
+
page_size: int = Query(20, ge=1, le=100),
|
|
21
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
22
|
+
_: dict = Depends(require_permission("perm-view-products")),
|
|
23
|
+
):
|
|
24
|
+
records, total = await crud.get_all(db, page=page, page_size=page_size)
|
|
25
|
+
return PaginatedSupplierDetailsResponse(total=total, page=page, page_size=page_size, results=records)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@router.get("/{supplier_id}", response_model=SupplierDetailsResponse)
|
|
29
|
+
async def get_supplier_details(
|
|
30
|
+
supplier_id: str,
|
|
31
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
32
|
+
_: dict = Depends(require_permission("perm-view-products")),
|
|
33
|
+
):
|
|
34
|
+
record = await crud.get_by_supplier_id(db, supplier_id)
|
|
35
|
+
if not record:
|
|
36
|
+
raise HTTPException(
|
|
37
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
38
|
+
detail=f"Supplier details for supplier '{supplier_id}' not found",
|
|
39
|
+
)
|
|
40
|
+
return record
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@router.post("/", response_model=SupplierDetailsResponse, status_code=status.HTTP_201_CREATED)
|
|
44
|
+
async def create_supplier_details(
|
|
45
|
+
data: SupplierDetailsCreate,
|
|
46
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
47
|
+
_: dict = Depends(require_permission("perm-create-products")),
|
|
48
|
+
):
|
|
49
|
+
if await crud.get_by_supplier_id(db, data.supplier_id):
|
|
50
|
+
raise HTTPException(
|
|
51
|
+
status_code=status.HTTP_409_CONFLICT,
|
|
52
|
+
detail=f"Supplier details for supplier '{data.supplier_id}' already exist",
|
|
53
|
+
)
|
|
54
|
+
return await crud.create(db, data)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@router.patch("/{supplier_id}", response_model=SupplierDetailsResponse)
|
|
58
|
+
async def update_supplier_details(
|
|
59
|
+
supplier_id: str,
|
|
60
|
+
data: SupplierDetailsUpdate,
|
|
61
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
62
|
+
_: dict = Depends(require_permission("perm-update-products")),
|
|
63
|
+
):
|
|
64
|
+
updated = await crud.update(db, supplier_id, data)
|
|
65
|
+
if not updated:
|
|
66
|
+
raise HTTPException(
|
|
67
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
68
|
+
detail=f"Supplier details for supplier '{supplier_id}' not found",
|
|
69
|
+
)
|
|
70
|
+
return updated
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@router.delete("/{supplier_id}", status_code=status.HTTP_204_NO_CONTENT)
|
|
74
|
+
async def delete_supplier_details(
|
|
75
|
+
supplier_id: str,
|
|
76
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
77
|
+
_: dict = Depends(require_permission("perm-delete-products")),
|
|
78
|
+
):
|
|
79
|
+
if not await crud.delete(db, supplier_id):
|
|
80
|
+
raise HTTPException(
|
|
81
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
82
|
+
detail=f"Supplier details for supplier '{supplier_id}' not found",
|
|
83
|
+
)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
from fastapi import APIRouter, Depends, HTTPException, Query, status
|
|
2
|
+
from motor.motor_asyncio import AsyncIOMotorDatabase
|
|
3
|
+
|
|
4
|
+
from services.common.db import get_database
|
|
5
|
+
from services.suppliers.helpers import supplier_financials as crud
|
|
6
|
+
from services.common.auth import require_permission
|
|
7
|
+
from services.suppliers.models.supplier_financials import (
|
|
8
|
+
PaginatedSupplierFinancialsResponse,
|
|
9
|
+
SupplierFinancialsCreate,
|
|
10
|
+
SupplierFinancialsResponse,
|
|
11
|
+
SupplierFinancialsUpdate,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
router = APIRouter()
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@router.get("/", response_model=PaginatedSupplierFinancialsResponse)
|
|
18
|
+
async def list_supplier_financials(
|
|
19
|
+
page: int = Query(1, ge=1),
|
|
20
|
+
page_size: int = Query(20, ge=1, le=100),
|
|
21
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
22
|
+
_: dict = Depends(require_permission("perm-view-products")),
|
|
23
|
+
):
|
|
24
|
+
records, total = await crud.get_all(db, page=page, page_size=page_size)
|
|
25
|
+
return PaginatedSupplierFinancialsResponse(total=total, page=page, page_size=page_size, results=records)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@router.get("/{supplier_id}", response_model=SupplierFinancialsResponse)
|
|
29
|
+
async def get_supplier_financials(
|
|
30
|
+
supplier_id: str,
|
|
31
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
32
|
+
_: dict = Depends(require_permission("perm-view-products")),
|
|
33
|
+
):
|
|
34
|
+
record = await crud.get_by_supplier_id(db, supplier_id)
|
|
35
|
+
if not record:
|
|
36
|
+
raise HTTPException(
|
|
37
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
38
|
+
detail=f"Supplier financials for supplier '{supplier_id}' not found",
|
|
39
|
+
)
|
|
40
|
+
return record
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@router.post("/", response_model=SupplierFinancialsResponse, status_code=status.HTTP_201_CREATED)
|
|
44
|
+
async def create_supplier_financials(
|
|
45
|
+
data: SupplierFinancialsCreate,
|
|
46
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
47
|
+
_: dict = Depends(require_permission("perm-create-products")),
|
|
48
|
+
):
|
|
49
|
+
if await crud.get_by_supplier_id(db, data.supplier_id):
|
|
50
|
+
raise HTTPException(
|
|
51
|
+
status_code=status.HTTP_409_CONFLICT,
|
|
52
|
+
detail=f"Supplier financials for supplier '{data.supplier_id}' already exist",
|
|
53
|
+
)
|
|
54
|
+
return await crud.create(db, data)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@router.patch("/{supplier_id}", response_model=SupplierFinancialsResponse)
|
|
58
|
+
async def update_supplier_financials(
|
|
59
|
+
supplier_id: str,
|
|
60
|
+
data: SupplierFinancialsUpdate,
|
|
61
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
62
|
+
_: dict = Depends(require_permission("perm-update-products")),
|
|
63
|
+
):
|
|
64
|
+
updated = await crud.update(db, supplier_id, data)
|
|
65
|
+
if not updated:
|
|
66
|
+
raise HTTPException(
|
|
67
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
68
|
+
detail=f"Supplier financials for supplier '{supplier_id}' not found",
|
|
69
|
+
)
|
|
70
|
+
return updated
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@router.delete("/{supplier_id}", status_code=status.HTTP_204_NO_CONTENT)
|
|
74
|
+
async def delete_supplier_financials(
|
|
75
|
+
supplier_id: str,
|
|
76
|
+
db: AsyncIOMotorDatabase = Depends(get_database),
|
|
77
|
+
_: dict = Depends(require_permission("perm-delete-products")),
|
|
78
|
+
):
|
|
79
|
+
if not await crud.delete(db, supplier_id):
|
|
80
|
+
raise HTTPException(
|
|
81
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
82
|
+
detail=f"Supplier financials for supplier '{supplier_id}' not found",
|
|
83
|
+
)
|