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.
Files changed (838) hide show
  1. monkeybrain_runtime-1.0.0.dist-info/METADATA +76 -0
  2. monkeybrain_runtime-1.0.0.dist-info/RECORD +838 -0
  3. monkeybrain_runtime-1.0.0.dist-info/WHEEL +5 -0
  4. monkeybrain_runtime-1.0.0.dist-info/entry_points.txt +3 -0
  5. monkeybrain_runtime-1.0.0.dist-info/top_level.txt +2 -0
  6. services/__init__.py +8 -0
  7. services/agentos/__init__.py +0 -0
  8. services/agentos/main.py +1 -0
  9. services/assets/helpers/__init__.py +12 -0
  10. services/assets/helpers/device.py +59 -0
  11. services/assets/helpers/equipment.py +179 -0
  12. services/assets/helpers/instruments.py +72 -0
  13. services/assets/helpers/machines.py +183 -0
  14. services/assets/helpers/materials.py +76 -0
  15. services/assets/helpers/parts.py +116 -0
  16. services/assets/helpers/plc.py +134 -0
  17. services/assets/helpers/tags.py +108 -0
  18. services/assets/helpers/tools.py +101 -0
  19. services/assets/main.py +75 -0
  20. services/assets/models/__init__.py +12 -0
  21. services/assets/models/device.py +79 -0
  22. services/assets/models/equipment.py +222 -0
  23. services/assets/models/instruments.py +85 -0
  24. services/assets/models/machines.py +230 -0
  25. services/assets/models/material.py +266 -0
  26. services/assets/models/parts.py +96 -0
  27. services/assets/models/plc.py +264 -0
  28. services/assets/models/tags.py +76 -0
  29. services/assets/models/tools.py +179 -0
  30. services/assets/routers/__init__.py +12 -0
  31. services/assets/routers/classes.py +65 -0
  32. services/assets/routers/device.py +86 -0
  33. services/assets/routers/equipment.py +145 -0
  34. services/assets/routers/families.py +61 -0
  35. services/assets/routers/instruments.py +70 -0
  36. services/assets/routers/machines.py +136 -0
  37. services/assets/routers/materials.py +105 -0
  38. services/assets/routers/parts.py +130 -0
  39. services/assets/routers/plc.py +94 -0
  40. services/assets/routers/subclasses.py +68 -0
  41. services/assets/routers/tags.py +138 -0
  42. services/assets/routers/tools.py +113 -0
  43. services/auth/helpers/__init__.py +13 -0
  44. services/auth/helpers/approval_decisions.py +261 -0
  45. services/auth/helpers/audit_elasticsearch_sync.py +350 -0
  46. services/auth/helpers/departments.py +53 -0
  47. services/auth/helpers/graph_store.py +848 -0
  48. services/auth/helpers/influx_store.py +280 -0
  49. services/auth/helpers/me.py +33 -0
  50. services/auth/helpers/nats_consumer.py +618 -0
  51. services/auth/helpers/nats_store.py +242 -0
  52. services/auth/helpers/permissions.py +62 -0
  53. services/auth/helpers/roles.py +87 -0
  54. services/auth/helpers/store.py +54 -0
  55. services/auth/helpers/team_members.py +155 -0
  56. services/auth/helpers/teams.py +87 -0
  57. services/auth/helpers/tokens.py +71 -0
  58. services/auth/helpers/users.py +119 -0
  59. services/auth/helpers/websocket_broadcast.py +41 -0
  60. services/auth/main.py +88 -0
  61. services/auth/models/__init__.py +12 -0
  62. services/auth/models/departments.py +55 -0
  63. services/auth/models/login.py +20 -0
  64. services/auth/models/permissions.py +61 -0
  65. services/auth/models/roles.py +53 -0
  66. services/auth/models/session.py +26 -0
  67. services/auth/models/teamMembers.py +59 -0
  68. services/auth/models/teams.py +56 -0
  69. services/auth/models/users.py +77 -0
  70. services/auth/routers/__init__.py +14 -0
  71. services/auth/routers/auth.py +3839 -0
  72. services/auth/routers/departments.py +84 -0
  73. services/auth/routers/integration_config.py +703 -0
  74. services/auth/routers/me.py +28 -0
  75. services/auth/routers/permissions.py +96 -0
  76. services/auth/routers/roles.py +139 -0
  77. services/auth/routers/session.py +224 -0
  78. services/auth/routers/team_members.py +152 -0
  79. services/auth/routers/teams.py +112 -0
  80. services/auth/routers/users.py +131 -0
  81. services/auth/routers/websocket_events.py +247 -0
  82. services/batch_execution/__init__.py +19 -0
  83. services/batch_execution/pipeline_triggers/__init__.py +53 -0
  84. services/batch_execution/pipeline_triggers/pipeline_parameter_adjuster.py +440 -0
  85. services/batch_execution/pipeline_triggers/pipeline_trigger_engine.py +445 -0
  86. services/batch_execution/pipeline_triggers/re_evaluation_queue.py +341 -0
  87. services/batch_execution/pipeline_triggers/test_phase3_implementation.py +553 -0
  88. services/batch_execution/pipeline_triggers/workflow_reevaluator.py +367 -0
  89. services/batch_execution/smoke_test_e2e_feedback_loop.py +704 -0
  90. services/batch_execution/workflow_executor.py +478 -0
  91. services/changeover/helpers/__init__.py +11 -0
  92. services/changeover/helpers/changeover.py +87 -0
  93. services/changeover/helpers/changeover_common.py +55 -0
  94. services/changeover/helpers/changeover_events.py +66 -0
  95. services/changeover/helpers/changeover_kpis.py +33 -0
  96. services/changeover/helpers/changeover_matrix.py +60 -0
  97. services/changeover/helpers/changeover_procedures.py +164 -0
  98. services/changeover/helpers/changeover_windows.py +96 -0
  99. services/changeover/main.py +52 -0
  100. services/changeover/models/__init__.py +11 -0
  101. services/changeover/models/changeover.py +73 -0
  102. services/changeover/models/changeover_events.py +142 -0
  103. services/changeover/models/changeover_kpis.py +75 -0
  104. services/changeover/models/changeover_matrix.py +63 -0
  105. services/changeover/models/changeover_procedures.py +108 -0
  106. services/changeover/models/changeover_tasks.py +87 -0
  107. services/changeover/models/changeover_windows.py +72 -0
  108. services/changeover/routers/__init__.py +9 -0
  109. services/changeover/routers/changeover_events.py +127 -0
  110. services/changeover/routers/changeover_kpis.py +80 -0
  111. services/changeover/routers/changeover_matrix.py +80 -0
  112. services/changeover/routers/changeover_procedures.py +118 -0
  113. services/changeover/routers/changeover_windows.py +98 -0
  114. services/common/__init__.py +2 -0
  115. services/common/approval_chains.py +648 -0
  116. services/common/auth.py +56 -0
  117. services/common/cdc.py +52 -0
  118. services/common/compat.py +217 -0
  119. services/common/compliance.py +562 -0
  120. services/common/config.py +134 -0
  121. services/common/cors.py +17 -0
  122. services/common/data_transformation.py +195 -0
  123. services/common/db.py +577 -0
  124. services/common/embeddings.py +97 -0
  125. services/common/event_reducers.py +194 -0
  126. services/common/event_types.py +51 -0
  127. services/common/integration_ingestion.py +169 -0
  128. services/common/logging.py +204 -0
  129. services/common/models/__init__.py +2 -0
  130. services/common/models/databricks.py +25 -0
  131. services/common/models/enums.py +64 -0
  132. services/common/module_control.py +422 -0
  133. services/common/mongo_cdc_watcher.py +106 -0
  134. services/common/n8n_auth.py +22 -0
  135. services/common/neo4j_mirror.py +1087 -0
  136. services/common/ontology_registry.py +110 -0
  137. services/common/reasoning_traces.py +52 -0
  138. services/common/supply_chain_cdc.py +555 -0
  139. services/common/tracing.py +159 -0
  140. services/common/utils.py +30 -0
  141. services/customers/helpers/__init__.py +8 -0
  142. services/customers/helpers/customer_details.py +64 -0
  143. services/customers/helpers/customer_metadata.py +64 -0
  144. services/customers/helpers/customer_order_metrics.py +67 -0
  145. services/customers/helpers/customer_payment_data.py +67 -0
  146. services/customers/main.py +50 -0
  147. services/customers/models/__init__.py +8 -0
  148. services/customers/models/customer_details.py +42 -0
  149. services/customers/models/customer_metadata.py +97 -0
  150. services/customers/models/customer_order_metrics.py +86 -0
  151. services/customers/models/customer_payment_data.py +60 -0
  152. services/customers/routers/__init__.py +8 -0
  153. services/customers/routers/customer_details.py +88 -0
  154. services/customers/routers/customer_metadata.py +88 -0
  155. services/customers/routers/customer_order_metrics.py +88 -0
  156. services/customers/routers/customer_payment_data.py +88 -0
  157. services/documents/__init__.py +1 -0
  158. services/documents/helpers/__init__.py +6 -0
  159. services/documents/helpers/document_metadata.py +569 -0
  160. services/documents/helpers/document_workflows.py +215 -0
  161. services/documents/helpers/report_templates.py +113 -0
  162. services/documents/main.py +49 -0
  163. services/documents/models/__init__.py +6 -0
  164. services/documents/models/document_metadata.py +215 -0
  165. services/documents/models/document_workflows.py +136 -0
  166. services/documents/models/report_templates.py +132 -0
  167. services/documents/routers/__init__.py +6 -0
  168. services/documents/routers/document_metadata.py +654 -0
  169. services/documents/routers/document_workflows.py +146 -0
  170. services/documents/routers/report_templates.py +86 -0
  171. services/events/helpers/__init__.py +5 -0
  172. services/events/helpers/events.py +394 -0
  173. services/events/main.py +40 -0
  174. services/events/models/__init__.py +5 -0
  175. services/events/models/events.py +50 -0
  176. services/events/routers/__init__.py +6 -0
  177. services/events/routers/count_events.py +109 -0
  178. services/events/routers/events.py +75 -0
  179. services/events/seed_events.py +196 -0
  180. services/facilities/helpers/__init__.py +8 -0
  181. services/facilities/helpers/lines.py +74 -0
  182. services/facilities/helpers/locations.py +231 -0
  183. services/facilities/helpers/plants.py +59 -0
  184. services/facilities/helpers/stages.py +110 -0
  185. services/facilities/helpers/workstation.py +213 -0
  186. services/facilities/main.py +60 -0
  187. services/facilities/models/__init__.py +10 -0
  188. services/facilities/models/industrialLine.py +72 -0
  189. services/facilities/models/industrialPlant.py +164 -0
  190. services/facilities/models/locations.py +74 -0
  191. services/facilities/models/stages.py +92 -0
  192. services/facilities/models/worker.py +73 -0
  193. services/facilities/models/workstation.py +117 -0
  194. services/facilities/models/workstation_live_state.py +59 -0
  195. services/facilities/routers/__init__.py +8 -0
  196. services/facilities/routers/bays.py +81 -0
  197. services/facilities/routers/buildings.py +92 -0
  198. services/facilities/routers/floors.py +81 -0
  199. services/facilities/routers/lines.py +154 -0
  200. services/facilities/routers/locations.py +208 -0
  201. services/facilities/routers/plant.py +203 -0
  202. services/facilities/routers/rooms.py +81 -0
  203. services/facilities/routers/stages.py +152 -0
  204. services/facilities/routers/workstation.py +173 -0
  205. services/file/backup.py +71 -0
  206. services/file/main.py +45 -0
  207. services/file/recieve.py +54 -0
  208. services/file/send.py +55 -0
  209. services/file/src/core/config.py +90 -0
  210. services/file/src/core/keycloak.py +152 -0
  211. services/file/src/core/logging_config.py +9 -0
  212. services/file/src/core/security.py +33 -0
  213. services/file/src/helpers/cad_conversion.py +331 -0
  214. services/file/src/helpers/helpers.py +825 -0
  215. services/file/src/routes/cad_conversion.py +26 -0
  216. services/file/src/routes/files.py +136 -0
  217. services/file/src/routes/presigned.py +154 -0
  218. services/file/src/services/websocket.py +293 -0
  219. services/floor_layout/helpers/__init__.py +8 -0
  220. services/floor_layout/helpers/bays.py +92 -0
  221. services/floor_layout/helpers/buildings.py +54 -0
  222. services/floor_layout/helpers/floors.py +65 -0
  223. services/floor_layout/helpers/rooms.py +76 -0
  224. services/floor_layout/main.py +52 -0
  225. services/floor_layout/models/__init__.py +8 -0
  226. services/floor_layout/models/bays.py +65 -0
  227. services/floor_layout/models/buildings.py +52 -0
  228. services/floor_layout/models/floors.py +45 -0
  229. services/floor_layout/models/rooms.py +61 -0
  230. services/floor_layout/routers/__init__.py +9 -0
  231. services/floor_layout/routers/bays.py +143 -0
  232. services/floor_layout/routers/buildings.py +116 -0
  233. services/floor_layout/routers/floors.py +89 -0
  234. services/floor_layout/routers/locations.py +80 -0
  235. services/floor_layout/routers/rooms.py +134 -0
  236. services/inventory/helpers/__init__.py +13 -0
  237. services/inventory/helpers/cycle_counts.py +124 -0
  238. services/inventory/helpers/inventory_allocations.py +134 -0
  239. services/inventory/helpers/inventory_item_counts.py +114 -0
  240. services/inventory/helpers/inventory_item_quantities.py +114 -0
  241. services/inventory/helpers/inventory_items.py +103 -0
  242. services/inventory/helpers/inventory_stage_outputs.py +134 -0
  243. services/inventory/helpers/inventory_transactions.py +112 -0
  244. services/inventory/helpers/stock_adjustment_requests.py +101 -0
  245. services/inventory/helpers/warehouse_cycle_counts.py +133 -0
  246. services/inventory/helpers/warehouse_locations.py +213 -0
  247. services/inventory/helpers/warehouse_regulated_records.py +123 -0
  248. services/inventory/main.py +62 -0
  249. services/inventory/models/__init__.py +17 -0
  250. services/inventory/models/cycle_counts.py +99 -0
  251. services/inventory/models/inventory_allocations.py +121 -0
  252. services/inventory/models/inventory_common.py +65 -0
  253. services/inventory/models/inventory_enums.py +21 -0
  254. services/inventory/models/inventory_item_count.py +65 -0
  255. services/inventory/models/inventory_item_quantity.py +82 -0
  256. services/inventory/models/inventory_items.py +168 -0
  257. services/inventory/models/inventory_responses.py +44 -0
  258. services/inventory/models/inventory_stage_outputs.py +96 -0
  259. services/inventory/models/inventory_state.py +15 -0
  260. services/inventory/models/inventory_transactions.py +80 -0
  261. services/inventory/models/stock_adjustment_requests.py +109 -0
  262. services/inventory/models/warehouse_cycle_counts.py +119 -0
  263. services/inventory/models/warehouse_location_models.py +708 -0
  264. services/inventory/models/warehouse_regulated_records.py +358 -0
  265. services/inventory/routers/__init__.py +13 -0
  266. services/inventory/routers/cycle_counts.py +106 -0
  267. services/inventory/routers/inventory_allocations.py +125 -0
  268. services/inventory/routers/inventory_item_counts.py +105 -0
  269. services/inventory/routers/inventory_item_quantities.py +105 -0
  270. services/inventory/routers/inventory_items.py +109 -0
  271. services/inventory/routers/inventory_stage_outputs.py +122 -0
  272. services/inventory/routers/inventory_transactions.py +96 -0
  273. services/inventory/routers/stock_adjustment_requests.py +124 -0
  274. services/inventory/routers/warehouse_cycle_counts.py +124 -0
  275. services/inventory/routers/warehouse_locations.py +426 -0
  276. services/inventory/routers/warehouse_regulated_records.py +273 -0
  277. services/iot/helpers/__init__.py +8 -0
  278. services/iot/helpers/ble_device.py +87 -0
  279. services/iot/helpers/mqtt_bridge.py +115 -0
  280. services/iot/helpers/sensor_readings.py +63 -0
  281. services/iot/helpers/sensors.py +77 -0
  282. services/iot/helpers/servers.py +72 -0
  283. services/iot/helpers/uwb_device.py +95 -0
  284. services/iot/main.py +53 -0
  285. services/iot/models/__init__.py +8 -0
  286. services/iot/models/ble_device.py +118 -0
  287. services/iot/models/sensors.py +256 -0
  288. services/iot/models/servers.py +206 -0
  289. services/iot/models/uwb_device.py +106 -0
  290. services/iot/routers/__init__.py +8 -0
  291. services/iot/routers/ble_device.py +110 -0
  292. services/iot/routers/sensors.py +144 -0
  293. services/iot/routers/servers.py +141 -0
  294. services/iot/routers/uwb_device.py +148 -0
  295. services/module_control/__init__.py +1 -0
  296. services/module_control/helpers/__init__.py +1 -0
  297. services/module_control/helpers/integration_config.py +243 -0
  298. services/module_control/helpers/security.py +104 -0
  299. services/module_control/main.py +44 -0
  300. services/module_control/models/__init__.py +1 -0
  301. services/module_control/models/module_control.py +65 -0
  302. services/module_control/routers/__init__.py +1 -0
  303. services/module_control/routers/module_control.py +219 -0
  304. services/orders/helpers/__init__.py +11 -0
  305. services/orders/helpers/invoices.py +123 -0
  306. services/orders/helpers/order_customer_metrics.py +61 -0
  307. services/orders/helpers/order_details.py +71 -0
  308. services/orders/helpers/order_metadata.py +61 -0
  309. services/orders/helpers/order_payment_metadata.py +74 -0
  310. services/orders/helpers/orders.py +119 -0
  311. services/orders/helpers/sales_orders.py +136 -0
  312. services/orders/main.py +56 -0
  313. services/orders/models/__init__.py +11 -0
  314. services/orders/models/invoices.py +415 -0
  315. services/orders/models/order_customer_metrics.py +78 -0
  316. services/orders/models/order_details.py +46 -0
  317. services/orders/models/order_metadata.py +60 -0
  318. services/orders/models/order_payment_metadata.py +63 -0
  319. services/orders/models/orders.py +64 -0
  320. services/orders/models/sales_orders.py +130 -0
  321. services/orders/routers/__init__.py +11 -0
  322. services/orders/routers/invoices.py +111 -0
  323. services/orders/routers/order_customer_metrics.py +87 -0
  324. services/orders/routers/order_details.py +87 -0
  325. services/orders/routers/order_metadata.py +87 -0
  326. services/orders/routers/order_payment_metadata.py +87 -0
  327. services/orders/routers/orders.py +74 -0
  328. services/orders/routers/sales_orders.py +111 -0
  329. services/pm/helpers/__init__.py +14 -0
  330. services/pm/helpers/calendar_bookings.py +114 -0
  331. services/pm/helpers/calibration_point.py +110 -0
  332. services/pm/helpers/calibrations.py +196 -0
  333. services/pm/helpers/checklists.py +318 -0
  334. services/pm/helpers/cleaning.py +333 -0
  335. services/pm/helpers/downtime.py +376 -0
  336. services/pm/helpers/kanban_boards.py +186 -0
  337. services/pm/helpers/maintainance.py +177 -0
  338. services/pm/helpers/sop.py +1155 -0
  339. services/pm/helpers/sop_cdc.py +324 -0
  340. services/pm/helpers/weekly_schedules.py +79 -0
  341. services/pm/main.py +62 -0
  342. services/pm/models/__init__.py +14 -0
  343. services/pm/models/calendar_booking.py +82 -0
  344. services/pm/models/calibration_point.py +44 -0
  345. services/pm/models/calibrations.py +167 -0
  346. services/pm/models/checklists.py +117 -0
  347. services/pm/models/cleaning.py +203 -0
  348. services/pm/models/downtime.py +109 -0
  349. services/pm/models/kanban_board.py +178 -0
  350. services/pm/models/maintainanceLog.py +148 -0
  351. services/pm/models/sop.py +152 -0
  352. services/pm/models/weekly_schedule.py +91 -0
  353. services/pm/routers/__init__.py +14 -0
  354. services/pm/routers/calendar_bookings.py +143 -0
  355. services/pm/routers/calibration_point.py +94 -0
  356. services/pm/routers/calibrations.py +232 -0
  357. services/pm/routers/checklists.py +188 -0
  358. services/pm/routers/cleaning.py +127 -0
  359. services/pm/routers/downtime.py +143 -0
  360. services/pm/routers/kanban_boards.py +283 -0
  361. services/pm/routers/maintainance.py +241 -0
  362. services/pm/routers/sop.py +437 -0
  363. services/pm/routers/weekly_schedules.py +108 -0
  364. services/process_definitions/helpers/__init__.py +11 -0
  365. services/process_definitions/helpers/cpp_cqa_registry.py +120 -0
  366. services/process_definitions/helpers/mbmr_templates.py +107 -0
  367. services/process_definitions/helpers/packing_instructions.py +113 -0
  368. services/process_definitions/helpers/process_constraints.py +495 -0
  369. services/process_definitions/helpers/process_corrections.py +279 -0
  370. services/process_definitions/helpers/process_definition.py +996 -0
  371. services/process_definitions/helpers/process_node_catalog.py +786 -0
  372. services/process_definitions/helpers/process_post_checks.py +441 -0
  373. services/process_definitions/helpers/process_pre_checks.py +351 -0
  374. services/process_definitions/helpers/process_steps.py +220 -0
  375. services/process_definitions/main.py +71 -0
  376. services/process_definitions/models/__init__.py +13 -0
  377. services/process_definitions/models/cpp_cqa_registry.py +145 -0
  378. services/process_definitions/models/gxp_change_controls.py +38 -0
  379. services/process_definitions/models/gxp_risk_assessments.py +30 -0
  380. services/process_definitions/models/gxp_validation_evidence.py +33 -0
  381. services/process_definitions/models/mbmr_templates.py +173 -0
  382. services/process_definitions/models/packing_instructions.py +176 -0
  383. services/process_definitions/models/process_constraints.py +159 -0
  384. services/process_definitions/models/process_corrections.py +118 -0
  385. services/process_definitions/models/process_definition.py +685 -0
  386. services/process_definitions/models/process_definition_common.py +48 -0
  387. services/process_definitions/models/process_node_catalog.py +25 -0
  388. services/process_definitions/models/process_post_checks.py +171 -0
  389. services/process_definitions/models/process_pre_checks.py +168 -0
  390. services/process_definitions/models/process_steps.py +170 -0
  391. services/process_definitions/node_services/__init__.py +8 -0
  392. services/process_definitions/node_services/common.py +95 -0
  393. services/process_definitions/node_services/executor.py +499 -0
  394. services/process_definitions/node_services/flow_simulator.py +733 -0
  395. services/process_definitions/node_services/functions.py +193 -0
  396. services/process_definitions/node_services/messaging.py +44 -0
  397. services/process_definitions/node_services/models.py +221 -0
  398. services/process_definitions/node_services/network.py +161 -0
  399. services/process_definitions/node_services/parsers.py +87 -0
  400. services/process_definitions/node_services/sequence.py +95 -0
  401. services/process_definitions/node_services/storage.py +50 -0
  402. services/process_definitions/node_services/webhooks.py +52 -0
  403. services/process_definitions/routers/__init__.py +10 -0
  404. services/process_definitions/routers/cpp_cqa_registry.py +86 -0
  405. services/process_definitions/routers/mbmr_templates.py +84 -0
  406. services/process_definitions/routers/packing_instructions.py +84 -0
  407. services/process_definitions/routers/process_constraints.py +564 -0
  408. services/process_definitions/routers/process_corrections.py +343 -0
  409. services/process_definitions/routers/process_definition.py +992 -0
  410. services/process_definitions/routers/process_post_checks.py +529 -0
  411. services/process_definitions/routers/process_pre_checks.py +435 -0
  412. services/process_definitions/routers/process_steps.py +274 -0
  413. services/procurement/helpers/__init__.py +9 -0
  414. services/procurement/helpers/goods_receipts.py +240 -0
  415. services/procurement/helpers/purchase_order_shipping_information.py +85 -0
  416. services/procurement/helpers/purchase_orders.py +68 -0
  417. services/procurement/helpers/quality_control.py +235 -0
  418. services/procurement/helpers/sampling.py +404 -0
  419. services/procurement/main.py +52 -0
  420. services/procurement/models/__init__.py +9 -0
  421. services/procurement/models/goods_receipts.py +165 -0
  422. services/procurement/models/purchase_orders.py +54 -0
  423. services/procurement/models/quality_control.py +464 -0
  424. services/procurement/models/reinspection_records.py +28 -0
  425. services/procurement/models/sampling.py +262 -0
  426. services/procurement/models/shipping_information.py +51 -0
  427. services/procurement/routers/__init__.py +9 -0
  428. services/procurement/routers/goods_receipts.py +201 -0
  429. services/procurement/routers/purchase_orders.py +106 -0
  430. services/procurement/routers/quality_control.py +386 -0
  431. services/procurement/routers/sampling.py +296 -0
  432. services/procurement/routers/shipping_information.py +97 -0
  433. services/production/__init__.py +1 -0
  434. services/production/agents/__init__.py +5 -0
  435. services/production/agents/batch_planning_agent.py +815 -0
  436. services/production/models/__init__.py +25 -0
  437. services/production/models/batch.py +253 -0
  438. services/products/helpers/__init__.py +10 -0
  439. services/products/helpers/boms.py +100 -0
  440. services/products/helpers/drug_research.py +644 -0
  441. services/products/helpers/product_component.py +168 -0
  442. services/products/helpers/product_inventory.py +221 -0
  443. services/products/helpers/product_pricing.py +123 -0
  444. services/products/helpers/product_utils.py +32 -0
  445. services/products/helpers/products.py +81 -0
  446. services/products/main.py +59 -0
  447. services/products/models/__init__.py +9 -0
  448. services/products/models/drug_research.py +138 -0
  449. services/products/models/product_common.py +60 -0
  450. services/products/models/product_component.py +1028 -0
  451. services/products/models/product_inventory.py +118 -0
  452. services/products/models/product_pricing.py +73 -0
  453. services/products/models/products.py +151 -0
  454. services/products/routers/__init__.py +9 -0
  455. services/products/routers/boms.py +116 -0
  456. services/products/routers/drug_research.py +115 -0
  457. services/products/routers/product_components.py +123 -0
  458. services/products/routers/product_inventory.py +185 -0
  459. services/products/routers/product_pricing.py +136 -0
  460. services/products/routers/products.py +165 -0
  461. services/replenishment/__init__.py +1 -0
  462. services/replenishment/main.py +46 -0
  463. services/replenishment/routers/__init__.py +1 -0
  464. services/replenishment/routers/replenishment.py +20 -0
  465. services/shifts/helpers/__init__.py +7 -0
  466. services/shifts/helpers/shift_templates.py +124 -0
  467. services/shifts/helpers/shifts.py +79 -0
  468. services/shifts/helpers/timesheets.py +137 -0
  469. services/shifts/main.py +48 -0
  470. services/shifts/models/__init__.py +8 -0
  471. services/shifts/models/shift.py +62 -0
  472. services/shifts/models/shift_template.py +82 -0
  473. services/shifts/models/time_range.py +31 -0
  474. services/shifts/models/timesheet.py +196 -0
  475. services/shifts/routers/__init__.py +7 -0
  476. services/shifts/routers/shift_templates.py +97 -0
  477. services/shifts/routers/shifts.py +117 -0
  478. services/shifts/routers/timesheets.py +117 -0
  479. services/shipping/helpers/__init__.py +15 -0
  480. services/shipping/helpers/carrier.py +78 -0
  481. services/shipping/helpers/customs_declaration.py +104 -0
  482. services/shipping/helpers/delivery_note.py +99 -0
  483. services/shipping/helpers/package.py +95 -0
  484. services/shipping/helpers/pallet.py +85 -0
  485. services/shipping/helpers/route.py +93 -0
  486. services/shipping/helpers/shipping_information.py +82 -0
  487. services/shipping/helpers/shipping_provider_details.py +59 -0
  488. services/shipping/helpers/shipping_provider_metadata.py +59 -0
  489. services/shipping/helpers/vehicle.py +85 -0
  490. services/shipping/helpers/waybill.py +86 -0
  491. services/shipping/main.py +64 -0
  492. services/shipping/models/__init__.py +15 -0
  493. services/shipping/models/carrier.py +97 -0
  494. services/shipping/models/customs_declaration.py +138 -0
  495. services/shipping/models/delivery_note.py +163 -0
  496. services/shipping/models/package.py +152 -0
  497. services/shipping/models/pallet.py +137 -0
  498. services/shipping/models/route.py +120 -0
  499. services/shipping/models/shipping_information.py +55 -0
  500. services/shipping/models/shipping_provider_details.py +42 -0
  501. services/shipping/models/shipping_provider_metadata.py +54 -0
  502. services/shipping/models/vehicle.py +129 -0
  503. services/shipping/models/waybill.py +189 -0
  504. services/shipping/routers/__init__.py +15 -0
  505. services/shipping/routers/carrier.py +99 -0
  506. services/shipping/routers/customs_declaration.py +132 -0
  507. services/shipping/routers/delivery_note.py +150 -0
  508. services/shipping/routers/package.py +141 -0
  509. services/shipping/routers/pallet.py +108 -0
  510. services/shipping/routers/route.py +128 -0
  511. services/shipping/routers/shipping_information.py +97 -0
  512. services/shipping/routers/shipping_provider_details.py +80 -0
  513. services/shipping/routers/shipping_provider_metadata.py +80 -0
  514. services/shipping/routers/vehicle.py +117 -0
  515. services/shipping/routers/waybill.py +119 -0
  516. services/suppliers/helpers/__init__.py +13 -0
  517. services/suppliers/helpers/supplier_capabilities.py +58 -0
  518. services/suppliers/helpers/supplier_certifications.py +67 -0
  519. services/suppliers/helpers/supplier_details.py +58 -0
  520. services/suppliers/helpers/supplier_financials.py +58 -0
  521. services/suppliers/helpers/supplier_inventory.py +74 -0
  522. services/suppliers/helpers/supplier_locations.py +60 -0
  523. services/suppliers/helpers/supplier_pricing.py +69 -0
  524. services/suppliers/helpers/supplier_quality.py +69 -0
  525. services/suppliers/helpers/supplier_shipping.py +69 -0
  526. services/suppliers/main.py +60 -0
  527. services/suppliers/models/__init__.py +13 -0
  528. services/suppliers/models/supplier_capabilities.py +70 -0
  529. services/suppliers/models/supplier_certifications.py +64 -0
  530. services/suppliers/models/supplier_details.py +75 -0
  531. services/suppliers/models/supplier_financials.py +69 -0
  532. services/suppliers/models/supplier_inventory.py +76 -0
  533. services/suppliers/models/supplier_locations.py +70 -0
  534. services/suppliers/models/supplier_pricing.py +74 -0
  535. services/suppliers/models/supplier_quality.py +74 -0
  536. services/suppliers/models/supplier_shipping.py +76 -0
  537. services/suppliers/routers/__init__.py +13 -0
  538. services/suppliers/routers/supplier_capabilities.py +88 -0
  539. services/suppliers/routers/supplier_certifications.py +87 -0
  540. services/suppliers/routers/supplier_details.py +83 -0
  541. services/suppliers/routers/supplier_financials.py +83 -0
  542. services/suppliers/routers/supplier_inventory.py +105 -0
  543. services/suppliers/routers/supplier_locations.py +89 -0
  544. services/suppliers/routers/supplier_pricing.py +96 -0
  545. services/suppliers/routers/supplier_quality.py +96 -0
  546. services/suppliers/routers/supplier_shipping.py +96 -0
  547. services/supply_allocation/main.py +46 -0
  548. services/supply_allocation/routers/__init__.py +1 -0
  549. services/supply_allocation/routers/allocation.py +20 -0
  550. services/taxonomy/helpers/__init__.py +7 -0
  551. services/taxonomy/helpers/classes.py +48 -0
  552. services/taxonomy/helpers/family.py +53 -0
  553. services/taxonomy/helpers/subclass.py +58 -0
  554. services/taxonomy/main.py +48 -0
  555. services/taxonomy/models/__init__.py +7 -0
  556. services/taxonomy/models/classes.py +52 -0
  557. services/taxonomy/models/family.py +60 -0
  558. services/taxonomy/models/subclass.py +50 -0
  559. services/taxonomy/routers/__init__.py +7 -0
  560. services/taxonomy/routers/classes.py +78 -0
  561. services/taxonomy/routers/family.py +77 -0
  562. services/taxonomy/routers/subclass.py +82 -0
  563. services/warehouse_execution/__init__.py +1 -0
  564. services/warehouse_execution/main.py +46 -0
  565. services/warehouse_execution/routers/__init__.py +1 -0
  566. services/warehouse_execution/routers/execution.py +21 -0
  567. services/work_order_agent/__init__.py +17 -0
  568. services/work_order_agent/agent/__init__.py +17 -0
  569. services/work_order_agent/agent/work_order_agent.py +658 -0
  570. services/work_order_agent/tracking/__init__.py +101 -0
  571. services/work_order_agent/tracking/event_system.py +182 -0
  572. services/work_order_agent/tracking/state_machine.py +163 -0
  573. services/work_order_agent/tracking/state_machine_integrator.py +295 -0
  574. services/work_order_agent/tracking/test_phase2_implementation.py +302 -0
  575. services/work_order_agent/tracking/time_analysis.py +301 -0
  576. services/work_order_agent/tracking/tracked_work_order.py +255 -0
  577. services/work_order_agent/tracking/work_order_adapter.py +367 -0
  578. services/work_order_agent/tracking/work_order_batch_manager.py +406 -0
  579. services/work_order_agent/tracking/work_order_repository.py +431 -0
  580. services/workorders/helpers/__init__.py +5 -0
  581. services/workorders/helpers/area_room_usage_ledger.py +139 -0
  582. services/workorders/helpers/batch_execution_records.py +265 -0
  583. services/workorders/helpers/batch_release_workflows.py +158 -0
  584. services/workorders/helpers/batch_step_executions.py +145 -0
  585. services/workorders/helpers/equipment_usage_ledger.py +209 -0
  586. services/workorders/helpers/executed_bmr_records.py +170 -0
  587. services/workorders/helpers/executed_bpr_records.py +170 -0
  588. services/workorders/helpers/executed_instruction_evidence.py +155 -0
  589. services/workorders/helpers/ipc_result_records.py +134 -0
  590. services/workorders/helpers/production_batches.py +117 -0
  591. services/workorders/helpers/work_orders.py +367 -0
  592. services/workorders/helpers/yield_reconciliation_records.py +158 -0
  593. services/workorders/main.py +110 -0
  594. services/workorders/models/__init__.py +5 -0
  595. services/workorders/models/area_room_usage_ledger.py +154 -0
  596. services/workorders/models/batch_execution_records.py +575 -0
  597. services/workorders/models/batch_release_workflows.py +190 -0
  598. services/workorders/models/batch_step_executions.py +142 -0
  599. services/workorders/models/equipment_usage_ledger.py +144 -0
  600. services/workorders/models/executed_bmr_records.py +220 -0
  601. services/workorders/models/executed_bpr_records.py +220 -0
  602. services/workorders/models/executed_instruction_evidence.py +128 -0
  603. services/workorders/models/ipc_result_records.py +164 -0
  604. services/workorders/models/production_batches.py +181 -0
  605. services/workorders/models/work_orders.py +255 -0
  606. services/workorders/models/yield_reconciliation_records.py +175 -0
  607. services/workorders/routers/__init__.py +5 -0
  608. services/workorders/routers/area_room_usage_ledger.py +117 -0
  609. services/workorders/routers/batch_execution_records.py +103 -0
  610. services/workorders/routers/batch_release_workflows.py +86 -0
  611. services/workorders/routers/batch_step_executions.py +88 -0
  612. services/workorders/routers/equipment_usage_ledger.py +115 -0
  613. services/workorders/routers/executed_bmr_records.py +86 -0
  614. services/workorders/routers/executed_bpr_records.py +86 -0
  615. services/workorders/routers/executed_instruction_evidence.py +86 -0
  616. services/workorders/routers/ipc_result_records.py +86 -0
  617. services/workorders/routers/production_batches.py +86 -0
  618. services/workorders/routers/work_orders.py +257 -0
  619. services/workorders/routers/yield_reconciliation_records.py +86 -0
  620. src/broca/__init__.py +5 -0
  621. src/broca/agent.py +201 -0
  622. src/cerebellum/__init__.py +0 -0
  623. src/cerebellum/adapter.py +84 -0
  624. src/cerebellum/capabilities/__init__.py +0 -0
  625. src/cerebellum/capabilities/agent/__init__.py +0 -0
  626. src/cerebellum/capabilities/agent/agents.py +65 -0
  627. src/cerebellum/capabilities/ai/__init__.py +0 -0
  628. src/cerebellum/capabilities/ai/providers.py +106 -0
  629. src/cerebellum/capabilities/api/__init__.py +0 -0
  630. src/cerebellum/capabilities/api/graphql.py +35 -0
  631. src/cerebellum/capabilities/api/rest_api.py +45 -0
  632. src/cerebellum/capabilities/api/webhook.py +30 -0
  633. src/cerebellum/capabilities/browser/__init__.py +0 -0
  634. src/cerebellum/capabilities/browser/browsers.py +27 -0
  635. src/cerebellum/capabilities/cloud/__init__.py +0 -0
  636. src/cerebellum/capabilities/cloud/cloud.py +46 -0
  637. src/cerebellum/capabilities/communication/__init__.py +0 -0
  638. src/cerebellum/capabilities/communication/communication.py +62 -0
  639. src/cerebellum/capabilities/database/__init__.py +0 -0
  640. src/cerebellum/capabilities/database/elasticsearch.py +40 -0
  641. src/cerebellum/capabilities/database/influxdb.py +37 -0
  642. src/cerebellum/capabilities/database/mongodb.py +50 -0
  643. src/cerebellum/capabilities/database/neo4j.py +32 -0
  644. src/cerebellum/capabilities/database/redis.py +44 -0
  645. src/cerebellum/capabilities/enterprise/__init__.py +0 -0
  646. src/cerebellum/capabilities/enterprise/opensource.py +180 -0
  647. src/cerebellum/capabilities/enterprise/proprietary.py +313 -0
  648. src/cerebellum/capabilities/event_streaming/__init__.py +0 -0
  649. src/cerebellum/capabilities/event_streaming/streaming.py +38 -0
  650. src/cerebellum/capabilities/infrastructure/__init__.py +0 -0
  651. src/cerebellum/capabilities/infrastructure/infrastructure.py +30 -0
  652. src/cerebellum/capabilities/productivity/__init__.py +0 -0
  653. src/cerebellum/capabilities/productivity/productivity.py +158 -0
  654. src/cerebellum/capabilities/robotics/__init__.py +0 -0
  655. src/cerebellum/capabilities/robotics/robotics.py +124 -0
  656. src/cerebellum/capabilities/runtime/__init__.py +0 -0
  657. src/cerebellum/capabilities/runtime/runtimes.py +92 -0
  658. src/cerebellum/capabilities/search/__init__.py +0 -0
  659. src/cerebellum/capabilities/search/search.py +63 -0
  660. src/cerebellum/capabilities/source_control/__init__.py +0 -0
  661. src/cerebellum/capabilities/source_control/source_control.py +113 -0
  662. src/cerebellum/capabilities/storage/__init__.py +0 -0
  663. src/cerebellum/capabilities/storage/storage.py +94 -0
  664. src/cerebellum/capabilities/workflow/__init__.py +0 -0
  665. src/cerebellum/capabilities/workflow/workflows.py +49 -0
  666. src/cerebellum/capability.py +108 -0
  667. src/cerebellum/config.py +157 -0
  668. src/cerebellum/fallback.py +147 -0
  669. src/cerebellum/fallback_engine.py +121 -0
  670. src/cerebellum/key_manager.py +129 -0
  671. src/cerebellum/keystore.py +179 -0
  672. src/cerebellum/lifecycle.py +54 -0
  673. src/cerebellum/metadata.py +61 -0
  674. src/cerebellum/operator/base.py +25 -0
  675. src/cerebellum/peripheral.py +92 -0
  676. src/cerebellum/registry.py +98 -0
  677. src/cerebellum/resolve_entity_capability.py +259 -0
  678. src/cingulate/benchmark/__init__.py +23 -0
  679. src/cingulate/benchmark/reporter.py +102 -0
  680. src/cingulate/benchmark/runner.py +159 -0
  681. src/cingulate/benchmark/scenario_runner.py +150 -0
  682. src/cingulate/benchmark/validator.py +102 -0
  683. src/cingulate/governance/__init__.py +21 -0
  684. src/cingulate/governance/architecture_validator.py +194 -0
  685. src/cingulate/governance/compliance.py +104 -0
  686. src/cingulate/governance/governance.py +77 -0
  687. src/cingulate/governance/policy_registry.py +91 -0
  688. src/cortex/__init__.py +33 -0
  689. src/cortex/cost.py +71 -0
  690. src/cortex/counterfactual.py +162 -0
  691. src/cortex/digital_twin.py +90 -0
  692. src/cortex/experience.py +83 -0
  693. src/cortex/feedback.py +144 -0
  694. src/cortex/loss.py +116 -0
  695. src/cortex/prediction.py +142 -0
  696. src/cortex/replay.py +130 -0
  697. src/cortex/reward.py +113 -0
  698. src/cortex/simulator.py +102 -0
  699. src/cortex/world_model.py +180 -0
  700. src/cortex/world_model_simulation.py +1591 -0
  701. src/cortex/world_state.py +121 -0
  702. src/cortex/xavier.py +250 -0
  703. src/deepdive/__init__.py +29 -0
  704. src/deepdive/aggregation.py +113 -0
  705. src/deepdive/digital_twin_aggregator.py +128 -0
  706. src/deepdive/elasticsearch_adapter.py +110 -0
  707. src/deepdive/fleet_analytics.py +131 -0
  708. src/deepdive/knowledge_aggregator.py +130 -0
  709. src/homeostasis/__init__.py +19 -0
  710. src/homeostasis/control_plane.py +159 -0
  711. src/introspection/__init__.py +38 -0
  712. src/introspection/alerting.py +142 -0
  713. src/introspection/health.py +101 -0
  714. src/introspection/lemon.py +243 -0
  715. src/introspection/logging.py +147 -0
  716. src/introspection/metrics.py +106 -0
  717. src/introspection/tracing.py +162 -0
  718. src/monkey_brain/__init__.py +1 -0
  719. src/monkey_brain/api/main.py +148 -0
  720. src/monkey_brain/api/models.py +81 -0
  721. src/monkey_brain/api/routes/routes/keys.py +106 -0
  722. src/monkey_brain/api/routes/routes/run.py +169 -0
  723. src/monkey_brain/api/routes/routes/simulate.py +485 -0
  724. src/monkey_brain/dlm/__init__.py +44 -0
  725. src/monkey_brain/dlm/dlm.py +139 -0
  726. src/monkey_brain/dlm/gc.py +115 -0
  727. src/monkey_brain/dlm/lifecycle.py +149 -0
  728. src/monkey_brain/dlm/orphans.py +99 -0
  729. src/monkey_brain/dlm/storage.py +149 -0
  730. src/monkey_brain/dlm/ttl.py +140 -0
  731. src/monkey_brain/documents/__init__.py +0 -0
  732. src/monkey_brain/documents/document_ocr.py +6 -0
  733. src/monkey_brain/kernel/__init__.py +53 -0
  734. src/monkey_brain/kernel/capability_interface.py +144 -0
  735. src/monkey_brain/kernel/classifier/__init__.py +1 -0
  736. src/monkey_brain/kernel/classifier/embed_classifier.py +125 -0
  737. src/monkey_brain/kernel/classifier/intent_examples.py +106 -0
  738. src/monkey_brain/kernel/dag.py +23 -0
  739. src/monkey_brain/kernel/execution_state.py +257 -0
  740. src/monkey_brain/kernel/goal_planner.py +85 -0
  741. src/monkey_brain/kernel/goal_router.py +20 -0
  742. src/monkey_brain/kernel/goals/__init__.py +1 -0
  743. src/monkey_brain/kernel/goals/goal.py +130 -0
  744. src/monkey_brain/kernel/goals/goal_bootstrap.py +38 -0
  745. src/monkey_brain/kernel/goals/goal_classifier.py +132 -0
  746. src/monkey_brain/kernel/goals/goal_registry.py +75 -0
  747. src/monkey_brain/kernel/intents/__init__.py +1 -0
  748. src/monkey_brain/kernel/intents/event_adapter.py +246 -0
  749. src/monkey_brain/kernel/intents/helpers.py +13 -0
  750. src/monkey_brain/kernel/intents/intent_registry.py +705 -0
  751. src/monkey_brain/kernel/intents/intent_router.py +102 -0
  752. src/monkey_brain/kernel/intents/predicates/approval_create.py +9 -0
  753. src/monkey_brain/kernel/intents/predicates/approval_decision.py +9 -0
  754. src/monkey_brain/kernel/intents/predicates/approval_hold.py +9 -0
  755. src/monkey_brain/kernel/intents/predicates/approval_query.py +9 -0
  756. src/monkey_brain/kernel/intents/predicates/batch_close.py +9 -0
  757. src/monkey_brain/kernel/intents/predicates/batch_creation.py +9 -0
  758. src/monkey_brain/kernel/intents/predicates/batch_delete.py +9 -0
  759. src/monkey_brain/kernel/intents/predicates/batch_hold.py +9 -0
  760. src/monkey_brain/kernel/intents/predicates/batch_record.py +9 -0
  761. src/monkey_brain/kernel/intents/predicates/batch_update.py +9 -0
  762. src/monkey_brain/kernel/intents/predicates/change_control.py +49 -0
  763. src/monkey_brain/kernel/intents/predicates/compliance_audit.py +14 -0
  764. src/monkey_brain/kernel/intents/predicates/decision_intelligence.py +9 -0
  765. src/monkey_brain/kernel/intents/predicates/drug_research.py +9 -0
  766. src/monkey_brain/kernel/intents/predicates/fuzzy_match.py +19 -0
  767. src/monkey_brain/kernel/intents/predicates/production_kpi.py +9 -0
  768. src/monkey_brain/kernel/intents/predicates/sop_create.py +9 -0
  769. src/monkey_brain/kernel/intents/predicates/sop_query.py +9 -0
  770. src/monkey_brain/kernel/intents/predicates/sop_update.py +9 -0
  771. src/monkey_brain/kernel/intents/predicates/warehouse_shipping.py +9 -0
  772. src/monkey_brain/kernel/intents/predicates/work_order_create.py +9 -0
  773. src/monkey_brain/kernel/intents/predicates/work_order_delete.py +9 -0
  774. src/monkey_brain/kernel/intents/predicates/work_order_hold.py +9 -0
  775. src/monkey_brain/kernel/intents/predicates/work_order_query.py +9 -0
  776. src/monkey_brain/kernel/intents/predicates/work_order_status.py +9 -0
  777. src/monkey_brain/kernel/intents/predicates/work_order_update.py +9 -0
  778. src/monkey_brain/kernel/intents/predicates/worker.py +9 -0
  779. src/monkey_brain/kernel/intents/telemetry_adapter.py +274 -0
  780. src/monkey_brain/kernel/intents/utils.py +68 -0
  781. src/monkey_brain/kernel/learning.py +98 -0
  782. src/monkey_brain/kernel/llm_explorer.py +188 -0
  783. src/monkey_brain/kernel/loss.py +81 -0
  784. src/monkey_brain/kernel/nlp/__init__.py +1 -0
  785. src/monkey_brain/kernel/nlp/compat.py +23 -0
  786. src/monkey_brain/kernel/nlp/models.py +10 -0
  787. src/monkey_brain/kernel/nlp/question_analyzer.py +203 -0
  788. src/monkey_brain/kernel/nlp/spacy_parser.py +53 -0
  789. src/monkey_brain/kernel/observer.py +97 -0
  790. src/monkey_brain/kernel/parser/__init__.py +3 -0
  791. src/monkey_brain/kernel/parser/ast.py +28 -0
  792. src/monkey_brain/kernel/parser/extractors/__init__.py +11 -0
  793. src/monkey_brain/kernel/parser/extractors/entities.py +21 -0
  794. src/monkey_brain/kernel/parser/extractors/filters.py +16 -0
  795. src/monkey_brain/kernel/parser/extractors/projections.py +36 -0
  796. src/monkey_brain/kernel/parser/extractors/verbs.py +31 -0
  797. src/monkey_brain/kernel/parser/parser.py +57 -0
  798. src/monkey_brain/kernel/parser/rules.py +75 -0
  799. src/monkey_brain/kernel/pipeline.py +44 -0
  800. src/monkey_brain/kernel/planner.py +57 -0
  801. src/monkey_brain/kernel/rl/__init__.py +33 -0
  802. src/monkey_brain/kernel/rl/learner.py +98 -0
  803. src/monkey_brain/kernel/rl/policy.py +254 -0
  804. src/monkey_brain/kernel/rl/reward.py +117 -0
  805. src/monkey_brain/kernel/rl/transition.py +112 -0
  806. src/monkey_brain/persistence/__init__.py +47 -0
  807. src/monkey_brain/persistence/adapters.py +49 -0
  808. src/monkey_brain/persistence/events.py +105 -0
  809. src/monkey_brain/persistence/manager.py +124 -0
  810. src/monkey_brain/persistence/mongodb_adapter.py +91 -0
  811. src/monkey_brain/persistence/redis_adapter.py +93 -0
  812. src/monkey_brain/persistence/reducer.py +111 -0
  813. src/monkey_brain/runtime/__init__.py +49 -0
  814. src/monkey_brain/runtime/depedencies.py +8 -0
  815. src/monkey_brain/runtime/engine.py +183 -0
  816. src/monkey_brain/runtime/message_bus.py +82 -0
  817. src/monkey_brain/runtime/process.py +144 -0
  818. src/monkey_brain/runtime/resource_manager.py +100 -0
  819. src/monkey_brain/runtime/routers.py +8 -0
  820. src/monkey_brain/runtime/runtime.py +199 -0
  821. src/monkey_brain/runtime/scheduler.py +165 -0
  822. src/monkey_brain/runtime/supervisor.py +133 -0
  823. src/monkey_brain/runtime/worker_pool.py +111 -0
  824. src/plasticity/seed/__init__.py +30 -0
  825. src/plasticity/seed/benchmark_generator.py +105 -0
  826. src/plasticity/seed/event_generator.py +122 -0
  827. src/plasticity/seed/scenario_builder.py +134 -0
  828. src/plasticity/seed/seed_data.py +206 -0
  829. src/plasticity/seed/seeder.py +122 -0
  830. src/plasticity/testing/__init__.py +28 -0
  831. src/plasticity/testing/performance.py +131 -0
  832. src/plasticity/testing/profiler.py +255 -0
  833. src/plasticity/testing/reporter.py +84 -0
  834. src/plasticity/testing/runner.py +209 -0
  835. src/sync/__init__.py +12 -0
  836. src/sync/cloud_aggregator.py +63 -0
  837. src/sync/edge_node.py +51 -0
  838. 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
+ )