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,69 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
from uuid import uuid4
|
|
3
|
+
|
|
4
|
+
from motor.motor_asyncio import AsyncIOMotorDatabase
|
|
5
|
+
from pymongo import ReturnDocument
|
|
6
|
+
|
|
7
|
+
from services.suppliers.models.supplier_pricing import SupplierPricingCreate, SupplierPricingUpdate
|
|
8
|
+
|
|
9
|
+
COLLECTION = "supplier_pricing"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _serialize(doc: Optional[dict]) -> Optional[dict]:
|
|
13
|
+
if not doc:
|
|
14
|
+
return None
|
|
15
|
+
doc = dict(doc)
|
|
16
|
+
doc.pop("_id", None)
|
|
17
|
+
return doc
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
async def get_all(db: AsyncIOMotorDatabase, page: int = 1, page_size: int = 20) -> tuple[list[dict], int]:
|
|
21
|
+
query: dict = {}
|
|
22
|
+
total = await db[COLLECTION].count_documents(query)
|
|
23
|
+
cursor = db[COLLECTION].find(query).skip((page - 1) * page_size).limit(page_size)
|
|
24
|
+
return [_serialize(d) async for d in cursor], total
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
async def get_by_id(db: AsyncIOMotorDatabase, supplier_pricing_id: str) -> Optional[dict]:
|
|
28
|
+
return _serialize(await db[COLLECTION].find_one({"supplier_pricing_id": supplier_pricing_id}))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
async def get_by_supplier(db: AsyncIOMotorDatabase, supplier_id: str) -> list[dict]:
|
|
32
|
+
cursor = db[COLLECTION].find({"supplier_id": supplier_id})
|
|
33
|
+
return [_serialize(d) async for d in cursor]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
async def get_by_item(db: AsyncIOMotorDatabase, item_id: str) -> list[dict]:
|
|
37
|
+
cursor = db[COLLECTION].find({"item_id": item_id})
|
|
38
|
+
return [_serialize(d) async for d in cursor]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
async def get_by_location(db: AsyncIOMotorDatabase, location_id: str) -> list[dict]:
|
|
42
|
+
cursor = db[COLLECTION].find({"location_id": location_id})
|
|
43
|
+
return [_serialize(d) async for d in cursor]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
async def create(db: AsyncIOMotorDatabase, data: SupplierPricingCreate) -> dict:
|
|
47
|
+
doc = {
|
|
48
|
+
**data.model_dump(),
|
|
49
|
+
"supplier_pricing_id": f"supplier-price-{uuid4().hex[:12]}",
|
|
50
|
+
}
|
|
51
|
+
await db[COLLECTION].insert_one(doc)
|
|
52
|
+
return _serialize(doc)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
async def update(db: AsyncIOMotorDatabase, supplier_pricing_id: str, data: SupplierPricingUpdate) -> Optional[dict]:
|
|
56
|
+
fields = data.model_dump(exclude_unset=True)
|
|
57
|
+
if not fields:
|
|
58
|
+
return await get_by_id(db, supplier_pricing_id)
|
|
59
|
+
result = await db[COLLECTION].find_one_and_update(
|
|
60
|
+
{"supplier_pricing_id": supplier_pricing_id},
|
|
61
|
+
{"$set": fields},
|
|
62
|
+
return_document=ReturnDocument.AFTER,
|
|
63
|
+
)
|
|
64
|
+
return _serialize(result)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
async def delete(db: AsyncIOMotorDatabase, supplier_pricing_id: str) -> bool:
|
|
68
|
+
result = await db[COLLECTION].delete_one({"supplier_pricing_id": supplier_pricing_id})
|
|
69
|
+
return result.deleted_count == 1
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
from uuid import uuid4
|
|
3
|
+
|
|
4
|
+
from motor.motor_asyncio import AsyncIOMotorDatabase
|
|
5
|
+
from pymongo import ReturnDocument
|
|
6
|
+
|
|
7
|
+
from services.suppliers.models.supplier_quality import SupplierQualityCreate, SupplierQualityUpdate
|
|
8
|
+
|
|
9
|
+
COLLECTION = "supplier_quality"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _serialize(doc: Optional[dict]) -> Optional[dict]:
|
|
13
|
+
if not doc:
|
|
14
|
+
return None
|
|
15
|
+
doc = dict(doc)
|
|
16
|
+
doc.pop("_id", None)
|
|
17
|
+
return doc
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
async def get_all(db: AsyncIOMotorDatabase, page: int = 1, page_size: int = 20) -> tuple[list[dict], int]:
|
|
21
|
+
query: dict = {}
|
|
22
|
+
total = await db[COLLECTION].count_documents(query)
|
|
23
|
+
cursor = db[COLLECTION].find(query).skip((page - 1) * page_size).limit(page_size)
|
|
24
|
+
return [_serialize(d) async for d in cursor], total
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
async def get_by_id(db: AsyncIOMotorDatabase, supplier_quality_id: str) -> Optional[dict]:
|
|
28
|
+
return _serialize(await db[COLLECTION].find_one({"supplier_quality_id": supplier_quality_id}))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
async def get_by_supplier(db: AsyncIOMotorDatabase, supplier_id: str) -> list[dict]:
|
|
32
|
+
cursor = db[COLLECTION].find({"supplier_id": supplier_id})
|
|
33
|
+
return [_serialize(d) async for d in cursor]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
async def get_by_item(db: AsyncIOMotorDatabase, item_id: str) -> list[dict]:
|
|
37
|
+
cursor = db[COLLECTION].find({"item_id": item_id})
|
|
38
|
+
return [_serialize(d) async for d in cursor]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
async def get_by_location(db: AsyncIOMotorDatabase, location_id: str) -> list[dict]:
|
|
42
|
+
cursor = db[COLLECTION].find({"location_id": location_id})
|
|
43
|
+
return [_serialize(d) async for d in cursor]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
async def create(db: AsyncIOMotorDatabase, data: SupplierQualityCreate) -> dict:
|
|
47
|
+
doc = {
|
|
48
|
+
**data.model_dump(),
|
|
49
|
+
"supplier_quality_id": f"supplier-quality-{uuid4().hex[:12]}",
|
|
50
|
+
}
|
|
51
|
+
await db[COLLECTION].insert_one(doc)
|
|
52
|
+
return _serialize(doc)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
async def update(db: AsyncIOMotorDatabase, supplier_quality_id: str, data: SupplierQualityUpdate) -> Optional[dict]:
|
|
56
|
+
fields = data.model_dump(exclude_unset=True)
|
|
57
|
+
if not fields:
|
|
58
|
+
return await get_by_id(db, supplier_quality_id)
|
|
59
|
+
result = await db[COLLECTION].find_one_and_update(
|
|
60
|
+
{"supplier_quality_id": supplier_quality_id},
|
|
61
|
+
{"$set": fields},
|
|
62
|
+
return_document=ReturnDocument.AFTER,
|
|
63
|
+
)
|
|
64
|
+
return _serialize(result)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
async def delete(db: AsyncIOMotorDatabase, supplier_quality_id: str) -> bool:
|
|
68
|
+
result = await db[COLLECTION].delete_one({"supplier_quality_id": supplier_quality_id})
|
|
69
|
+
return result.deleted_count == 1
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
from uuid import uuid4
|
|
3
|
+
|
|
4
|
+
from motor.motor_asyncio import AsyncIOMotorDatabase
|
|
5
|
+
from pymongo import ReturnDocument
|
|
6
|
+
|
|
7
|
+
from services.suppliers.models.supplier_shipping import SupplierShippingCreate, SupplierShippingUpdate
|
|
8
|
+
|
|
9
|
+
COLLECTION = "supplier_shipping"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _serialize(doc: Optional[dict]) -> Optional[dict]:
|
|
13
|
+
if not doc:
|
|
14
|
+
return None
|
|
15
|
+
doc = dict(doc)
|
|
16
|
+
doc.pop("_id", None)
|
|
17
|
+
return doc
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
async def get_all(db: AsyncIOMotorDatabase, page: int = 1, page_size: int = 20) -> tuple[list[dict], int]:
|
|
21
|
+
query: dict = {}
|
|
22
|
+
total = await db[COLLECTION].count_documents(query)
|
|
23
|
+
cursor = db[COLLECTION].find(query).skip((page - 1) * page_size).limit(page_size)
|
|
24
|
+
return [_serialize(d) async for d in cursor], total
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
async def get_by_id(db: AsyncIOMotorDatabase, supplier_shipping_id: str) -> Optional[dict]:
|
|
28
|
+
return _serialize(await db[COLLECTION].find_one({"supplier_shipping_id": supplier_shipping_id}))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
async def get_by_supplier(db: AsyncIOMotorDatabase, supplier_id: str) -> list[dict]:
|
|
32
|
+
cursor = db[COLLECTION].find({"supplier_id": supplier_id})
|
|
33
|
+
return [_serialize(d) async for d in cursor]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
async def get_by_item(db: AsyncIOMotorDatabase, item_id: str) -> list[dict]:
|
|
37
|
+
cursor = db[COLLECTION].find({"item_id": item_id})
|
|
38
|
+
return [_serialize(d) async for d in cursor]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
async def get_by_location(db: AsyncIOMotorDatabase, location_id: str) -> list[dict]:
|
|
42
|
+
cursor = db[COLLECTION].find({"location_id": location_id})
|
|
43
|
+
return [_serialize(d) async for d in cursor]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
async def create(db: AsyncIOMotorDatabase, data: SupplierShippingCreate) -> dict:
|
|
47
|
+
doc = {
|
|
48
|
+
**data.model_dump(),
|
|
49
|
+
"supplier_shipping_id": f"supplier-ship-{uuid4().hex[:12]}",
|
|
50
|
+
}
|
|
51
|
+
await db[COLLECTION].insert_one(doc)
|
|
52
|
+
return _serialize(doc)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
async def update(db: AsyncIOMotorDatabase, supplier_shipping_id: str, data: SupplierShippingUpdate) -> Optional[dict]:
|
|
56
|
+
fields = data.model_dump(exclude_unset=True)
|
|
57
|
+
if not fields:
|
|
58
|
+
return await get_by_id(db, supplier_shipping_id)
|
|
59
|
+
result = await db[COLLECTION].find_one_and_update(
|
|
60
|
+
{"supplier_shipping_id": supplier_shipping_id},
|
|
61
|
+
{"$set": fields},
|
|
62
|
+
return_document=ReturnDocument.AFTER,
|
|
63
|
+
)
|
|
64
|
+
return _serialize(result)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
async def delete(db: AsyncIOMotorDatabase, supplier_shipping_id: str) -> bool:
|
|
68
|
+
result = await db[COLLECTION].delete_one({"supplier_shipping_id": supplier_shipping_id})
|
|
69
|
+
return result.deleted_count == 1
|
|
@@ -0,0 +1,60 @@
|
|
|
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.suppliers.routers.supplier_details import router as supplier_details_router
|
|
11
|
+
from services.suppliers.routers.supplier_capabilities import router as supplier_capabilities_router
|
|
12
|
+
from services.suppliers.routers.supplier_certifications import router as supplier_certifications_router
|
|
13
|
+
from services.suppliers.routers.supplier_financials import router as supplier_financials_router
|
|
14
|
+
from services.suppliers.routers.supplier_inventory import router as supplier_inventory_router
|
|
15
|
+
from services.suppliers.routers.supplier_locations import router as supplier_locations_router
|
|
16
|
+
from services.suppliers.routers.supplier_pricing import router as supplier_pricing_router
|
|
17
|
+
from services.suppliers.routers.supplier_quality import router as supplier_quality_router
|
|
18
|
+
from services.suppliers.routers.supplier_shipping import router as supplier_shipping_router
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
logger = configure_service_logging("suppliers")
|
|
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="Suppliers Service",
|
|
32
|
+
description="Microservice for suppliers service.",
|
|
33
|
+
version="1.0.0",
|
|
34
|
+
lifespan=lifespan,
|
|
35
|
+
)
|
|
36
|
+
install_request_logging(app, "suppliers")
|
|
37
|
+
install_route_tracing(app, "suppliers")
|
|
38
|
+
|
|
39
|
+
app.add_middleware(
|
|
40
|
+
CORSMiddleware,
|
|
41
|
+
allow_origins=["*"],
|
|
42
|
+
allow_credentials=True,
|
|
43
|
+
allow_methods=["*"],
|
|
44
|
+
allow_headers=["*"],
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
app.include_router(supplier_details_router, prefix="/api/v1/supplier-details", tags=["Supplier Details"])
|
|
48
|
+
app.include_router(supplier_capabilities_router, prefix="/api/v1/supplier-capabilities", tags=["Supplier Capabilities"])
|
|
49
|
+
app.include_router(supplier_certifications_router, prefix="/api/v1/supplier-certifications", tags=["Supplier Certifications"])
|
|
50
|
+
app.include_router(supplier_financials_router, prefix="/api/v1/supplier-financials", tags=["Supplier Financials"])
|
|
51
|
+
app.include_router(supplier_inventory_router, prefix="/api/v1/supplier-inventory", tags=["Supplier Inventory"])
|
|
52
|
+
app.include_router(supplier_locations_router, prefix="/api/v1/supplier-locations", tags=["Supplier Locations"])
|
|
53
|
+
app.include_router(supplier_pricing_router, prefix="/api/v1/supplier-pricing", tags=["Supplier Pricing"])
|
|
54
|
+
app.include_router(supplier_quality_router, prefix="/api/v1/supplier-quality", tags=["Supplier Quality"])
|
|
55
|
+
app.include_router(supplier_shipping_router, prefix="/api/v1/supplier-shipping", tags=["Supplier Shipping"])
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@app.get("/health", tags=["Health"])
|
|
59
|
+
async def health_check():
|
|
60
|
+
return {"status": "healthy"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""suppliers service models 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,70 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class SupplierCapabilitiesModel(BaseModel):
|
|
7
|
+
supplier_id: str = Field(..., description="Unique identifier for the supplier.")
|
|
8
|
+
core_competencies: list[str] = Field(..., description="Key areas of expertise or specialization.")
|
|
9
|
+
production_capacity: int = Field(..., description="Maximum production output per month.")
|
|
10
|
+
capacity_unit: str = Field(..., description="Unit of measurement for production capacity, for example units or tons.")
|
|
11
|
+
lead_time: int = Field(..., description="Average time in days required for order fulfillment.")
|
|
12
|
+
technology_capability: list[str] = Field(..., description="Technologies or equipment used, for example CNC, Robotics, or 3D Printing.")
|
|
13
|
+
certifications: list[str] = Field(..., description="List of certifications that validate the supplier's capabilities.")
|
|
14
|
+
quality_control_measures: str = Field(..., description="Description of the supplier's quality assurance and control processes.")
|
|
15
|
+
rad_capabilities: bool = Field(..., description="Indicates if the supplier has in-house research and development facilities.")
|
|
16
|
+
customization_capability: bool = Field(..., description="Indicates if the supplier can produce custom designs or products.")
|
|
17
|
+
geographical_reach: list[str] = Field(..., description="List of regions or countries the supplier can serve.")
|
|
18
|
+
material_expertise: list[str] = Field(..., description="Types of materials the supplier specializes in, for example Steel or Aluminum.")
|
|
19
|
+
sustainability_practices: Optional[str] = Field(None, description="Description of any eco-friendly or sustainable practices followed by the supplier.")
|
|
20
|
+
subcontracting_capability: bool = Field(..., description="Indicates if the supplier can manage subcontracted production.")
|
|
21
|
+
maintenance_services: bool = Field(..., description="Indicates if the supplier provides maintenance or after-sales services.")
|
|
22
|
+
packaging_capabilities: str = Field(..., description="Types of packaging options offered, for example Bulk or Retail-Ready.")
|
|
23
|
+
export_compliance: bool = Field(..., description="Indicates if the supplier complies with the required export regulations.")
|
|
24
|
+
testing_facilities: bool = Field(..., description="Indicates if the supplier has in-house testing and validation facilities.")
|
|
25
|
+
automation_level: str = Field(..., description="Level of automation in the supplier's production process, for example Manual, Semi-Automated, or Fully Automated.")
|
|
26
|
+
employee_count: int = Field(..., description="Total number of employees at the supplier's facility.")
|
|
27
|
+
partnership_initiatives: Optional[str] = Field(None, description="Details of significant partnerships or collaborations with other firms.")
|
|
28
|
+
innovation_awards: Optional[list[str]] = Field(None, description="Recognition received for innovation or excellence.")
|
|
29
|
+
remarks: Optional[str] = Field(None, description="Additional notes or observations regarding the supplier's capabilities.")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class SupplierCapabilitiesCreate(SupplierCapabilitiesModel):
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class SupplierCapabilitiesUpdate(BaseModel):
|
|
37
|
+
core_competencies: Optional[list[str]] = None
|
|
38
|
+
production_capacity: Optional[int] = None
|
|
39
|
+
capacity_unit: Optional[str] = None
|
|
40
|
+
lead_time: Optional[int] = None
|
|
41
|
+
technology_capability: Optional[list[str]] = None
|
|
42
|
+
certifications: Optional[list[str]] = None
|
|
43
|
+
quality_control_measures: Optional[str] = None
|
|
44
|
+
rad_capabilities: Optional[bool] = None
|
|
45
|
+
customization_capability: Optional[bool] = None
|
|
46
|
+
geographical_reach: Optional[list[str]] = None
|
|
47
|
+
material_expertise: Optional[list[str]] = None
|
|
48
|
+
sustainability_practices: Optional[str] = None
|
|
49
|
+
subcontracting_capability: Optional[bool] = None
|
|
50
|
+
maintenance_services: Optional[bool] = None
|
|
51
|
+
packaging_capabilities: Optional[str] = None
|
|
52
|
+
export_compliance: Optional[bool] = None
|
|
53
|
+
testing_facilities: Optional[bool] = None
|
|
54
|
+
automation_level: Optional[str] = None
|
|
55
|
+
employee_count: Optional[int] = None
|
|
56
|
+
partnership_initiatives: Optional[str] = None
|
|
57
|
+
innovation_awards: Optional[list[str]] = None
|
|
58
|
+
remarks: Optional[str] = None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class SupplierCapabilitiesResponse(SupplierCapabilitiesModel):
|
|
62
|
+
class Config:
|
|
63
|
+
from_attributes = True
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class PaginatedSupplierCapabilitiesResponse(BaseModel):
|
|
67
|
+
total: int
|
|
68
|
+
page: int
|
|
69
|
+
page_size: int
|
|
70
|
+
results: list[SupplierCapabilitiesResponse]
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
from datetime import datetime, timezone
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def datetime_now() -> datetime:
|
|
8
|
+
return datetime.now(timezone.utc)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class CertificationModel(BaseModel):
|
|
12
|
+
supplier_id: str = Field(..., description="Unique identifier for the supplier.")
|
|
13
|
+
certification_name: str = Field(..., description="Name of the certification or standard achieved by the supplier.")
|
|
14
|
+
certification_type: str = Field(..., description="Type of certification, for example Quality, Environmental, Safety, or Industry-Specific.")
|
|
15
|
+
issuing_authority: str = Field(..., description="Organization or authority that issued the certification.")
|
|
16
|
+
certification_number: Optional[str] = Field(None, description="Unique identification number for the certification, if applicable.")
|
|
17
|
+
issue_date: datetime = Field(..., description="Date on which the certification was issued.")
|
|
18
|
+
expiry_date: Optional[datetime] = Field(default_factory=datetime_now)
|
|
19
|
+
renewal_required: bool = Field(..., description="Indicates if the certification requires periodic renewal.")
|
|
20
|
+
renewal_frequency: Optional[str] = Field(None, description="How often the certification must be renewed, for example Annual or Every 3 Years.")
|
|
21
|
+
scope_of_certification: str = Field(..., description="Description of the areas or processes covered by the certification.")
|
|
22
|
+
audit_required: bool = Field(..., description="Indicates if regular audits are required to maintain the certification.")
|
|
23
|
+
last_audit_date: Optional[datetime] = Field(default_factory=datetime_now)
|
|
24
|
+
next_audit_date: Optional[datetime] = Field(default_factory=datetime_now)
|
|
25
|
+
certification_status: str = Field(..., description="Current status of the certification, for example Active, Pending Renewal, or Expired.")
|
|
26
|
+
certificate_document: Optional[str] = Field(None, description="Reference to the digital copy of the certificate or a link to its location.")
|
|
27
|
+
remarks: Optional[str] = Field(None, description="Additional notes or observations about the certification.")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class CertificationCreate(CertificationModel):
|
|
31
|
+
pass
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class CertificationUpdate(BaseModel):
|
|
35
|
+
supplier_id: Optional[str] = None
|
|
36
|
+
certification_name: Optional[str] = None
|
|
37
|
+
certification_type: Optional[str] = None
|
|
38
|
+
issuing_authority: Optional[str] = None
|
|
39
|
+
certification_number: Optional[str] = None
|
|
40
|
+
issue_date: Optional[datetime] = None
|
|
41
|
+
expiry_date: Optional[datetime] = None
|
|
42
|
+
renewal_required: Optional[bool] = None
|
|
43
|
+
renewal_frequency: Optional[str] = None
|
|
44
|
+
scope_of_certification: Optional[str] = None
|
|
45
|
+
audit_required: Optional[bool] = None
|
|
46
|
+
last_audit_date: Optional[datetime] = None
|
|
47
|
+
next_audit_date: Optional[datetime] = None
|
|
48
|
+
certification_status: Optional[str] = None
|
|
49
|
+
certificate_document: Optional[str] = None
|
|
50
|
+
remarks: Optional[str] = None
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class CertificationResponse(CertificationModel):
|
|
54
|
+
certification_id: str
|
|
55
|
+
|
|
56
|
+
class Config:
|
|
57
|
+
from_attributes = True
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class PaginatedCertificationResponse(BaseModel):
|
|
61
|
+
total: int
|
|
62
|
+
page: int
|
|
63
|
+
page_size: int
|
|
64
|
+
results: list[CertificationResponse]
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel, EmailStr, Field
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SupplierDetails(BaseModel):
|
|
8
|
+
supplier_id: str = Field(..., description="Unique identifier for the supplier.")
|
|
9
|
+
supplier_name: str = Field(..., description="Official name of the supplier.")
|
|
10
|
+
supplier_type: str = Field(..., description="Type of supplier, for example Manufacturer, Distributor, Wholesaler, or Service Provider.")
|
|
11
|
+
address: str = Field(..., description="Registered address of the supplier.")
|
|
12
|
+
city: str = Field(..., description="City where the supplier is located.")
|
|
13
|
+
state_region: str = Field(..., description="State or region where the supplier operates.")
|
|
14
|
+
country: str = Field(..., description="Country of the supplier.")
|
|
15
|
+
postal_code: str = Field(..., description="Postal code for the supplier's address.")
|
|
16
|
+
contact_name: str = Field(..., description="Primary contact person's name.")
|
|
17
|
+
contact_email: EmailStr = Field(..., description="Email address for communication.")
|
|
18
|
+
contact_phone: str = Field(..., description="Phone number for the primary contact.")
|
|
19
|
+
website: Optional[str] = Field(None, description="Official website of the supplier, if available.")
|
|
20
|
+
tax_id: str = Field(..., description="Taxpayer Identification Number of the supplier.")
|
|
21
|
+
payment_terms: str = Field(..., description="Agreed payment terms, for example Net 30 or Net 45.")
|
|
22
|
+
currency: str = Field(..., description="Default currency for transactions with the supplier.")
|
|
23
|
+
lead_time_days: int = Field(..., description="Average time required to fulfill an order in days.")
|
|
24
|
+
annual_spend: float = Field(..., description="Total annual expenditure on this supplier.")
|
|
25
|
+
approval_status: str = Field(..., description="Supplier's approval status, for example Approved, Pending, or Blacklisted.")
|
|
26
|
+
risk_rating: int = Field(..., description="Risk score assigned to the supplier based on financial and operational factors.")
|
|
27
|
+
certifications: list[str] = Field(..., description="Certifications held by the supplier, for example ISO 9001, CE, or RoHS.")
|
|
28
|
+
industry: str = Field(..., description="Industry in which the supplier operates.")
|
|
29
|
+
past_performance_score: float = Field(..., description="Rating based on historical performance on a 1-10 scale.")
|
|
30
|
+
preferred_supplier: bool = Field(..., description="Indicates if this supplier is a preferred vendor.")
|
|
31
|
+
last_order_date: Optional[datetime] = Field(None, description="The most recent date an order was placed with the supplier.")
|
|
32
|
+
remarks: Optional[str] = Field(None, description="Additional metadata or context not covered by other fields.")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class SupplierDetailsCreate(SupplierDetails):
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class SupplierDetailsUpdate(BaseModel):
|
|
40
|
+
supplier_name: Optional[str] = None
|
|
41
|
+
supplier_type: Optional[str] = None
|
|
42
|
+
address: Optional[str] = None
|
|
43
|
+
city: Optional[str] = None
|
|
44
|
+
state_region: Optional[str] = None
|
|
45
|
+
country: Optional[str] = None
|
|
46
|
+
postal_code: Optional[str] = None
|
|
47
|
+
contact_name: Optional[str] = None
|
|
48
|
+
contact_email: Optional[EmailStr] = None
|
|
49
|
+
contact_phone: Optional[str] = None
|
|
50
|
+
website: Optional[str] = None
|
|
51
|
+
tax_id: Optional[str] = None
|
|
52
|
+
payment_terms: Optional[str] = None
|
|
53
|
+
currency: Optional[str] = None
|
|
54
|
+
lead_time_days: Optional[int] = None
|
|
55
|
+
annual_spend: Optional[float] = None
|
|
56
|
+
approval_status: Optional[str] = None
|
|
57
|
+
risk_rating: Optional[int] = None
|
|
58
|
+
certifications: Optional[list[str]] = None
|
|
59
|
+
industry: Optional[str] = None
|
|
60
|
+
past_performance_score: Optional[float] = None
|
|
61
|
+
preferred_supplier: Optional[bool] = None
|
|
62
|
+
last_order_date: Optional[datetime] = None
|
|
63
|
+
remarks: Optional[str] = None
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class SupplierDetailsResponse(SupplierDetails):
|
|
67
|
+
class Config:
|
|
68
|
+
from_attributes = True
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class PaginatedSupplierDetailsResponse(BaseModel):
|
|
72
|
+
total: int
|
|
73
|
+
page: int
|
|
74
|
+
page_size: int
|
|
75
|
+
results: list[SupplierDetailsResponse]
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SupplierFinancials(BaseModel):
|
|
8
|
+
supplier_id: str = Field(..., description="Unique identifier for the supplier.")
|
|
9
|
+
annual_revenue: float = Field(..., description="Total revenue generated by the supplier in a financial year.")
|
|
10
|
+
currency: str = Field(..., description="Currency in which financial values are reported.")
|
|
11
|
+
net_profit_margin: float = Field(..., description="Percentage of revenue that constitutes net profit.")
|
|
12
|
+
operating_costs: float = Field(..., description="Total operational expenses incurred by the supplier in a year.")
|
|
13
|
+
debt_to_equity_ratio: float = Field(..., description="Ratio of supplier's total debt to its shareholder equity.")
|
|
14
|
+
credit_rating: str = Field(..., description="Supplier's creditworthiness as rated by a recognized agency.")
|
|
15
|
+
payment_terms: str = Field(..., description="Standard payment terms agreed upon with the supplier, for example Net 30 or Net 60.")
|
|
16
|
+
outstanding_balance: float = Field(..., description="Amount currently owed to the supplier.")
|
|
17
|
+
overdue_invoices: int = Field(..., description="Number of unpaid invoices that are past their due date.")
|
|
18
|
+
average_payment_delay_days: int = Field(..., description="Average delay in payment beyond the agreed payment terms.")
|
|
19
|
+
financial_health_score: float = Field(..., description="Composite score reflecting the supplier's financial health.")
|
|
20
|
+
bank_name: Optional[str] = Field(None, description="Name of the bank used by the supplier for transactions.")
|
|
21
|
+
bank_account_number: Optional[str] = Field(None, description="Bank account number for supplier payments.")
|
|
22
|
+
tax_identification_number: Optional[str] = Field(None, description="Tax ID or equivalent identification for compliance purposes.")
|
|
23
|
+
audited_financials: bool = Field(..., description="Indicates whether the supplier's financial statements are audited.")
|
|
24
|
+
last_audit_date: Optional[datetime] = Field(None, description="Date of the supplier's most recent financial audit.")
|
|
25
|
+
profitability_trends: str = Field(..., description="Summary or description of profitability trends over recent years.")
|
|
26
|
+
liquidity_ratio: float = Field(..., description="Ratio of the supplier's liquid assets to its current liabilities.")
|
|
27
|
+
payment_methods_accepted: Optional[list[str]] = Field(None, description="List of payment methods accepted by the supplier, for example Bank Transfer or Credit.")
|
|
28
|
+
tax_compliance_status: bool = Field(..., description="Indicates whether the supplier is compliant with tax regulations.")
|
|
29
|
+
remarks: Optional[str] = Field(None, description="Additional notes or observations about the supplier's finances.")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class SupplierFinancialsCreate(SupplierFinancials):
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class SupplierFinancialsUpdate(BaseModel):
|
|
37
|
+
annual_revenue: Optional[float] = None
|
|
38
|
+
currency: Optional[str] = None
|
|
39
|
+
net_profit_margin: Optional[float] = None
|
|
40
|
+
operating_costs: Optional[float] = None
|
|
41
|
+
debt_to_equity_ratio: Optional[float] = None
|
|
42
|
+
credit_rating: Optional[str] = None
|
|
43
|
+
payment_terms: Optional[str] = None
|
|
44
|
+
outstanding_balance: Optional[float] = None
|
|
45
|
+
overdue_invoices: Optional[int] = None
|
|
46
|
+
average_payment_delay_days: Optional[int] = None
|
|
47
|
+
financial_health_score: Optional[float] = None
|
|
48
|
+
bank_name: Optional[str] = None
|
|
49
|
+
bank_account_number: Optional[str] = None
|
|
50
|
+
tax_identification_number: Optional[str] = None
|
|
51
|
+
audited_financials: Optional[bool] = None
|
|
52
|
+
last_audit_date: Optional[datetime] = None
|
|
53
|
+
profitability_trends: Optional[str] = None
|
|
54
|
+
liquidity_ratio: Optional[float] = None
|
|
55
|
+
payment_methods_accepted: Optional[list[str]] = None
|
|
56
|
+
tax_compliance_status: Optional[bool] = None
|
|
57
|
+
remarks: Optional[str] = None
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class SupplierFinancialsResponse(SupplierFinancials):
|
|
61
|
+
class Config:
|
|
62
|
+
from_attributes = True
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class PaginatedSupplierFinancialsResponse(BaseModel):
|
|
66
|
+
total: int
|
|
67
|
+
page: int
|
|
68
|
+
page_size: int
|
|
69
|
+
results: list[SupplierFinancialsResponse]
|
|
@@ -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 SupplierInventory(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
|
+
item_name: str = Field(..., description="Name or description of the inventory item.")
|
|
11
|
+
sku: str = Field(..., description="Unique stock-keeping unit identifier assigned by the supplier.")
|
|
12
|
+
category: str = Field(..., description="Category or classification of the inventory item, for example Raw Material or Component.")
|
|
13
|
+
current_stock: int = Field(..., description="Quantity of the item currently available in stock.")
|
|
14
|
+
unit_of_measure: str = Field(..., description="Unit in which the inventory is measured, for example Kg or Units.")
|
|
15
|
+
reorder_level: int = Field(..., description="Minimum stock level at which new stock needs to be ordered.")
|
|
16
|
+
safety_stock: int = Field(..., description="Buffer stock maintained to avoid stockouts.")
|
|
17
|
+
maximum_stock_level: Optional[int] = Field(None, description="Maximum quantity that can be stored.")
|
|
18
|
+
location_id: str = Field(..., description="Identifier for the location where the inventory is stored.")
|
|
19
|
+
batch_number: Optional[str] = Field(None, description="Batch identifier for tracking purposes.")
|
|
20
|
+
manufacturing_date: Optional[datetime] = Field(None, description="Date when the item was manufactured.")
|
|
21
|
+
expiry_date: Optional[datetime] = Field(None, description="Expiry date for perishable or limited-lifecycle items.")
|
|
22
|
+
cost_per_unit: float = Field(..., description="Cost of one unit of the item.")
|
|
23
|
+
currency: str = Field(..., description="Currency in which the item is priced.")
|
|
24
|
+
reserved_stock: Optional[int] = Field(None, description="Quantity reserved for existing orders or commitments.")
|
|
25
|
+
available_stock: int = Field(..., description="Stock available for new orders after accounting for reserved quantities.")
|
|
26
|
+
lead_time: int = Field(..., description="Time in days required to restock the item.")
|
|
27
|
+
last_stock_update_date: Optional[datetime] = Field(None, description="Date when the inventory data was last updated.")
|
|
28
|
+
supplier_lead_time: Optional[int] = Field(None, description="Time taken by the supplier to replenish stock.")
|
|
29
|
+
stock_turnover_rate: Optional[float] = Field(None, description="Rate at which stock is consumed or sold.")
|
|
30
|
+
quality_check_status: bool = Field(..., description="Indicates whether the stock has passed quality checks.")
|
|
31
|
+
remarks: Optional[str] = Field(None, description="Additional notes or observations about the stock.")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class SupplierInventoryCreate(SupplierInventory):
|
|
35
|
+
pass
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class SupplierInventoryUpdate(BaseModel):
|
|
39
|
+
supplier_id: Optional[str] = None
|
|
40
|
+
item_id: Optional[str] = None
|
|
41
|
+
item_name: Optional[str] = None
|
|
42
|
+
sku: Optional[str] = None
|
|
43
|
+
category: Optional[str] = None
|
|
44
|
+
current_stock: Optional[int] = None
|
|
45
|
+
unit_of_measure: Optional[str] = None
|
|
46
|
+
reorder_level: Optional[int] = None
|
|
47
|
+
safety_stock: Optional[int] = None
|
|
48
|
+
maximum_stock_level: Optional[int] = None
|
|
49
|
+
location_id: Optional[str] = None
|
|
50
|
+
batch_number: Optional[str] = None
|
|
51
|
+
manufacturing_date: Optional[datetime] = None
|
|
52
|
+
expiry_date: Optional[datetime] = None
|
|
53
|
+
cost_per_unit: Optional[float] = None
|
|
54
|
+
currency: Optional[str] = None
|
|
55
|
+
reserved_stock: Optional[int] = None
|
|
56
|
+
available_stock: Optional[int] = None
|
|
57
|
+
lead_time: Optional[int] = None
|
|
58
|
+
last_stock_update_date: Optional[datetime] = None
|
|
59
|
+
supplier_lead_time: Optional[int] = None
|
|
60
|
+
stock_turnover_rate: Optional[float] = None
|
|
61
|
+
quality_check_status: Optional[bool] = None
|
|
62
|
+
remarks: Optional[str] = None
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class SupplierInventoryResponse(SupplierInventory):
|
|
66
|
+
supplier_inventory_id: str
|
|
67
|
+
|
|
68
|
+
class Config:
|
|
69
|
+
from_attributes = True
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class PaginatedSupplierInventoryResponse(BaseModel):
|
|
73
|
+
total: int
|
|
74
|
+
page: int
|
|
75
|
+
page_size: int
|
|
76
|
+
results: list[SupplierInventoryResponse]
|