bb-integrations-library 3.0.11__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 (217) hide show
  1. bb_integrations_lib/__init__.py +0 -0
  2. bb_integrations_lib/converters/__init__.py +0 -0
  3. bb_integrations_lib/gravitate/__init__.py +0 -0
  4. bb_integrations_lib/gravitate/base_api.py +20 -0
  5. bb_integrations_lib/gravitate/model.py +29 -0
  6. bb_integrations_lib/gravitate/pe_api.py +122 -0
  7. bb_integrations_lib/gravitate/rita_api.py +552 -0
  8. bb_integrations_lib/gravitate/sd_api.py +572 -0
  9. bb_integrations_lib/gravitate/testing/TTE/sd/models.py +1398 -0
  10. bb_integrations_lib/gravitate/testing/TTE/sd/tests/test_models.py +2987 -0
  11. bb_integrations_lib/gravitate/testing/__init__.py +0 -0
  12. bb_integrations_lib/gravitate/testing/builder.py +55 -0
  13. bb_integrations_lib/gravitate/testing/openapi.py +70 -0
  14. bb_integrations_lib/gravitate/testing/util.py +274 -0
  15. bb_integrations_lib/mappers/__init__.py +0 -0
  16. bb_integrations_lib/mappers/prices/__init__.py +0 -0
  17. bb_integrations_lib/mappers/prices/model.py +106 -0
  18. bb_integrations_lib/mappers/prices/price_mapper.py +127 -0
  19. bb_integrations_lib/mappers/prices/protocol.py +20 -0
  20. bb_integrations_lib/mappers/prices/util.py +61 -0
  21. bb_integrations_lib/mappers/rita_mapper.py +523 -0
  22. bb_integrations_lib/models/__init__.py +0 -0
  23. bb_integrations_lib/models/dtn_supplier_invoice.py +487 -0
  24. bb_integrations_lib/models/enums.py +28 -0
  25. bb_integrations_lib/models/pipeline_structs.py +76 -0
  26. bb_integrations_lib/models/probe/probe_event.py +20 -0
  27. bb_integrations_lib/models/probe/request_data.py +431 -0
  28. bb_integrations_lib/models/probe/resume_token.py +7 -0
  29. bb_integrations_lib/models/rita/audit.py +113 -0
  30. bb_integrations_lib/models/rita/auth.py +30 -0
  31. bb_integrations_lib/models/rita/bucket.py +17 -0
  32. bb_integrations_lib/models/rita/config.py +188 -0
  33. bb_integrations_lib/models/rita/constants.py +19 -0
  34. bb_integrations_lib/models/rita/crossroads_entities.py +293 -0
  35. bb_integrations_lib/models/rita/crossroads_mapping.py +428 -0
  36. bb_integrations_lib/models/rita/crossroads_monitoring.py +78 -0
  37. bb_integrations_lib/models/rita/crossroads_network.py +41 -0
  38. bb_integrations_lib/models/rita/crossroads_rules.py +80 -0
  39. bb_integrations_lib/models/rita/email.py +39 -0
  40. bb_integrations_lib/models/rita/issue.py +63 -0
  41. bb_integrations_lib/models/rita/mapping.py +227 -0
  42. bb_integrations_lib/models/rita/probe.py +58 -0
  43. bb_integrations_lib/models/rita/reference_data.py +110 -0
  44. bb_integrations_lib/models/rita/source_system.py +9 -0
  45. bb_integrations_lib/models/rita/workers.py +76 -0
  46. bb_integrations_lib/models/sd/bols_and_drops.py +241 -0
  47. bb_integrations_lib/models/sd/get_order.py +301 -0
  48. bb_integrations_lib/models/sd/orders.py +18 -0
  49. bb_integrations_lib/models/sd_api.py +115 -0
  50. bb_integrations_lib/pipelines/__init__.py +0 -0
  51. bb_integrations_lib/pipelines/parsers/__init__.py +0 -0
  52. bb_integrations_lib/pipelines/parsers/distribution_report/__init__.py +0 -0
  53. bb_integrations_lib/pipelines/parsers/distribution_report/order_by_site_product_parser.py +50 -0
  54. bb_integrations_lib/pipelines/parsers/distribution_report/tank_configs_parser.py +47 -0
  55. bb_integrations_lib/pipelines/parsers/dtn/__init__.py +0 -0
  56. bb_integrations_lib/pipelines/parsers/dtn/dtn_price_parser.py +102 -0
  57. bb_integrations_lib/pipelines/parsers/dtn/model.py +79 -0
  58. bb_integrations_lib/pipelines/parsers/price_engine/__init__.py +0 -0
  59. bb_integrations_lib/pipelines/parsers/price_engine/parse_accessorials_prices_parser.py +67 -0
  60. bb_integrations_lib/pipelines/parsers/price_engine/price_file_upload/__init__.py +0 -0
  61. bb_integrations_lib/pipelines/parsers/price_engine/price_file_upload/price_merge_parser.py +111 -0
  62. bb_integrations_lib/pipelines/parsers/price_engine/price_file_upload/price_sync_parser.py +107 -0
  63. bb_integrations_lib/pipelines/parsers/price_engine/price_file_upload/shared.py +81 -0
  64. bb_integrations_lib/pipelines/parsers/tank_reading_parser.py +155 -0
  65. bb_integrations_lib/pipelines/parsers/tank_sales_parser.py +144 -0
  66. bb_integrations_lib/pipelines/shared/__init__.py +0 -0
  67. bb_integrations_lib/pipelines/shared/allocation_matching.py +227 -0
  68. bb_integrations_lib/pipelines/shared/bol_allocation.py +2793 -0
  69. bb_integrations_lib/pipelines/steps/__init__.py +0 -0
  70. bb_integrations_lib/pipelines/steps/create_accessorials_step.py +80 -0
  71. bb_integrations_lib/pipelines/steps/distribution_report/__init__.py +0 -0
  72. bb_integrations_lib/pipelines/steps/distribution_report/distribution_report_datafram_to_raw_data.py +33 -0
  73. bb_integrations_lib/pipelines/steps/distribution_report/get_model_history_step.py +50 -0
  74. bb_integrations_lib/pipelines/steps/distribution_report/get_order_by_site_product_step.py +62 -0
  75. bb_integrations_lib/pipelines/steps/distribution_report/get_tank_configs_step.py +40 -0
  76. bb_integrations_lib/pipelines/steps/distribution_report/join_distribution_order_dos_step.py +85 -0
  77. bb_integrations_lib/pipelines/steps/distribution_report/upload_distribution_report_datafram_to_big_query.py +47 -0
  78. bb_integrations_lib/pipelines/steps/echo_step.py +14 -0
  79. bb_integrations_lib/pipelines/steps/export_dataframe_to_rawdata_step.py +28 -0
  80. bb_integrations_lib/pipelines/steps/exporting/__init__.py +0 -0
  81. bb_integrations_lib/pipelines/steps/exporting/bbd_export_payroll_file_step.py +107 -0
  82. bb_integrations_lib/pipelines/steps/exporting/bbd_export_readings_step.py +236 -0
  83. bb_integrations_lib/pipelines/steps/exporting/cargas_wholesale_bundle_upload_step.py +33 -0
  84. bb_integrations_lib/pipelines/steps/exporting/dataframe_flat_file_export.py +29 -0
  85. bb_integrations_lib/pipelines/steps/exporting/gcs_bucket_export_file_step.py +34 -0
  86. bb_integrations_lib/pipelines/steps/exporting/keyvu_export_step.py +356 -0
  87. bb_integrations_lib/pipelines/steps/exporting/pe_price_export_step.py +238 -0
  88. bb_integrations_lib/pipelines/steps/exporting/platform_science_order_sync_step.py +500 -0
  89. bb_integrations_lib/pipelines/steps/exporting/save_rawdata_to_disk.py +15 -0
  90. bb_integrations_lib/pipelines/steps/exporting/sftp_export_file_step.py +60 -0
  91. bb_integrations_lib/pipelines/steps/exporting/sftp_export_many_files_step.py +23 -0
  92. bb_integrations_lib/pipelines/steps/exporting/update_exported_orders_table_step.py +64 -0
  93. bb_integrations_lib/pipelines/steps/filter_step.py +22 -0
  94. bb_integrations_lib/pipelines/steps/get_latest_sync_date.py +34 -0
  95. bb_integrations_lib/pipelines/steps/importing/bbd_import_payroll_step.py +30 -0
  96. bb_integrations_lib/pipelines/steps/importing/get_order_numbers_to_export_step.py +138 -0
  97. bb_integrations_lib/pipelines/steps/importing/load_file_to_dataframe_step.py +46 -0
  98. bb_integrations_lib/pipelines/steps/importing/load_imap_attachment_step.py +172 -0
  99. bb_integrations_lib/pipelines/steps/importing/pe_bulk_sync_price_structure_step.py +68 -0
  100. bb_integrations_lib/pipelines/steps/importing/pe_price_merge_step.py +86 -0
  101. bb_integrations_lib/pipelines/steps/importing/sftp_file_config_step.py +124 -0
  102. bb_integrations_lib/pipelines/steps/importing/test_exact_file_match.py +57 -0
  103. bb_integrations_lib/pipelines/steps/null_step.py +15 -0
  104. bb_integrations_lib/pipelines/steps/pe_integration_job_step.py +32 -0
  105. bb_integrations_lib/pipelines/steps/processing/__init__.py +0 -0
  106. bb_integrations_lib/pipelines/steps/processing/archive_gcs_step.py +76 -0
  107. bb_integrations_lib/pipelines/steps/processing/archive_sftp_step.py +48 -0
  108. bb_integrations_lib/pipelines/steps/processing/bbd_format_tank_readings_step.py +492 -0
  109. bb_integrations_lib/pipelines/steps/processing/bbd_upload_prices_step.py +54 -0
  110. bb_integrations_lib/pipelines/steps/processing/bbd_upload_tank_sales_step.py +124 -0
  111. bb_integrations_lib/pipelines/steps/processing/bbd_upload_tankreading_step.py +80 -0
  112. bb_integrations_lib/pipelines/steps/processing/convert_bbd_order_to_cargas_step.py +226 -0
  113. bb_integrations_lib/pipelines/steps/processing/delete_sftp_step.py +33 -0
  114. bb_integrations_lib/pipelines/steps/processing/dtn/__init__.py +2 -0
  115. bb_integrations_lib/pipelines/steps/processing/dtn/convert_dtn_invoice_to_sd_model.py +145 -0
  116. bb_integrations_lib/pipelines/steps/processing/dtn/parse_dtn_invoice_step.py +38 -0
  117. bb_integrations_lib/pipelines/steps/processing/file_config_parser_step.py +720 -0
  118. bb_integrations_lib/pipelines/steps/processing/file_config_parser_step_v2.py +418 -0
  119. bb_integrations_lib/pipelines/steps/processing/get_sd_price_price_request.py +105 -0
  120. bb_integrations_lib/pipelines/steps/processing/keyvu_upload_deliveryplan_step.py +39 -0
  121. bb_integrations_lib/pipelines/steps/processing/mark_orders_exported_in_bbd_step.py +185 -0
  122. bb_integrations_lib/pipelines/steps/processing/pe_price_rows_processing_step.py +174 -0
  123. bb_integrations_lib/pipelines/steps/processing/send_process_report_step.py +47 -0
  124. bb_integrations_lib/pipelines/steps/processing/sftp_renamer_step.py +61 -0
  125. bb_integrations_lib/pipelines/steps/processing/tank_reading_touchup_steps.py +75 -0
  126. bb_integrations_lib/pipelines/steps/processing/upload_supplier_invoice_step.py +16 -0
  127. bb_integrations_lib/pipelines/steps/send_attached_in_rita_email_step.py +44 -0
  128. bb_integrations_lib/pipelines/steps/send_rita_email_step.py +34 -0
  129. bb_integrations_lib/pipelines/steps/sleep_step.py +24 -0
  130. bb_integrations_lib/pipelines/wrappers/__init__.py +0 -0
  131. bb_integrations_lib/pipelines/wrappers/accessorials_transformation.py +104 -0
  132. bb_integrations_lib/pipelines/wrappers/distribution_report.py +191 -0
  133. bb_integrations_lib/pipelines/wrappers/export_tank_readings.py +237 -0
  134. bb_integrations_lib/pipelines/wrappers/import_tank_readings.py +192 -0
  135. bb_integrations_lib/pipelines/wrappers/wrapper.py +81 -0
  136. bb_integrations_lib/protocols/__init__.py +0 -0
  137. bb_integrations_lib/protocols/flat_file.py +210 -0
  138. bb_integrations_lib/protocols/gravitate_client.py +104 -0
  139. bb_integrations_lib/protocols/pipelines.py +697 -0
  140. bb_integrations_lib/provider/__init__.py +0 -0
  141. bb_integrations_lib/provider/api/__init__.py +0 -0
  142. bb_integrations_lib/provider/api/cargas/__init__.py +0 -0
  143. bb_integrations_lib/provider/api/cargas/client.py +43 -0
  144. bb_integrations_lib/provider/api/cargas/model.py +49 -0
  145. bb_integrations_lib/provider/api/cargas/protocol.py +23 -0
  146. bb_integrations_lib/provider/api/dtn/__init__.py +0 -0
  147. bb_integrations_lib/provider/api/dtn/client.py +128 -0
  148. bb_integrations_lib/provider/api/dtn/protocol.py +9 -0
  149. bb_integrations_lib/provider/api/keyvu/__init__.py +0 -0
  150. bb_integrations_lib/provider/api/keyvu/client.py +30 -0
  151. bb_integrations_lib/provider/api/keyvu/model.py +149 -0
  152. bb_integrations_lib/provider/api/macropoint/__init__.py +0 -0
  153. bb_integrations_lib/provider/api/macropoint/client.py +28 -0
  154. bb_integrations_lib/provider/api/macropoint/model.py +40 -0
  155. bb_integrations_lib/provider/api/pc_miler/__init__.py +0 -0
  156. bb_integrations_lib/provider/api/pc_miler/client.py +130 -0
  157. bb_integrations_lib/provider/api/pc_miler/model.py +6 -0
  158. bb_integrations_lib/provider/api/pc_miler/web_services_apis.py +131 -0
  159. bb_integrations_lib/provider/api/platform_science/__init__.py +0 -0
  160. bb_integrations_lib/provider/api/platform_science/client.py +147 -0
  161. bb_integrations_lib/provider/api/platform_science/model.py +82 -0
  162. bb_integrations_lib/provider/api/quicktrip/__init__.py +0 -0
  163. bb_integrations_lib/provider/api/quicktrip/client.py +52 -0
  164. bb_integrations_lib/provider/api/telapoint/__init__.py +0 -0
  165. bb_integrations_lib/provider/api/telapoint/client.py +68 -0
  166. bb_integrations_lib/provider/api/telapoint/model.py +178 -0
  167. bb_integrations_lib/provider/api/warren_rogers/__init__.py +0 -0
  168. bb_integrations_lib/provider/api/warren_rogers/client.py +207 -0
  169. bb_integrations_lib/provider/aws/__init__.py +0 -0
  170. bb_integrations_lib/provider/aws/s3/__init__.py +0 -0
  171. bb_integrations_lib/provider/aws/s3/client.py +126 -0
  172. bb_integrations_lib/provider/ftp/__init__.py +0 -0
  173. bb_integrations_lib/provider/ftp/client.py +140 -0
  174. bb_integrations_lib/provider/ftp/interface.py +273 -0
  175. bb_integrations_lib/provider/ftp/model.py +76 -0
  176. bb_integrations_lib/provider/imap/__init__.py +0 -0
  177. bb_integrations_lib/provider/imap/client.py +228 -0
  178. bb_integrations_lib/provider/imap/model.py +3 -0
  179. bb_integrations_lib/provider/sqlserver/__init__.py +0 -0
  180. bb_integrations_lib/provider/sqlserver/client.py +106 -0
  181. bb_integrations_lib/secrets/__init__.py +4 -0
  182. bb_integrations_lib/secrets/adapters.py +98 -0
  183. bb_integrations_lib/secrets/credential_models.py +222 -0
  184. bb_integrations_lib/secrets/factory.py +85 -0
  185. bb_integrations_lib/secrets/providers.py +160 -0
  186. bb_integrations_lib/shared/__init__.py +0 -0
  187. bb_integrations_lib/shared/exceptions.py +25 -0
  188. bb_integrations_lib/shared/model.py +1039 -0
  189. bb_integrations_lib/shared/shared_enums.py +510 -0
  190. bb_integrations_lib/storage/README.md +236 -0
  191. bb_integrations_lib/storage/__init__.py +0 -0
  192. bb_integrations_lib/storage/aws/__init__.py +0 -0
  193. bb_integrations_lib/storage/aws/s3.py +8 -0
  194. bb_integrations_lib/storage/defaults.py +72 -0
  195. bb_integrations_lib/storage/gcs/__init__.py +0 -0
  196. bb_integrations_lib/storage/gcs/client.py +8 -0
  197. bb_integrations_lib/storage/gcsmanager/__init__.py +0 -0
  198. bb_integrations_lib/storage/gcsmanager/client.py +8 -0
  199. bb_integrations_lib/storage/setup.py +29 -0
  200. bb_integrations_lib/util/__init__.py +0 -0
  201. bb_integrations_lib/util/cache/__init__.py +0 -0
  202. bb_integrations_lib/util/cache/custom_ttl_cache.py +75 -0
  203. bb_integrations_lib/util/cache/protocol.py +9 -0
  204. bb_integrations_lib/util/config/__init__.py +0 -0
  205. bb_integrations_lib/util/config/manager.py +391 -0
  206. bb_integrations_lib/util/config/model.py +41 -0
  207. bb_integrations_lib/util/exception_logger/__init__.py +0 -0
  208. bb_integrations_lib/util/exception_logger/exception_logger.py +146 -0
  209. bb_integrations_lib/util/exception_logger/test.py +114 -0
  210. bb_integrations_lib/util/utils.py +364 -0
  211. bb_integrations_lib/workers/__init__.py +0 -0
  212. bb_integrations_lib/workers/groups.py +13 -0
  213. bb_integrations_lib/workers/rpc_worker.py +50 -0
  214. bb_integrations_lib/workers/topics.py +20 -0
  215. bb_integrations_library-3.0.11.dist-info/METADATA +59 -0
  216. bb_integrations_library-3.0.11.dist-info/RECORD +217 -0
  217. bb_integrations_library-3.0.11.dist-info/WHEEL +4 -0
@@ -0,0 +1,241 @@
1
+ from datetime import datetime
2
+ from typing import Optional
3
+
4
+ from pydantic import BaseModel
5
+
6
+
7
+ class DriverExtraData(BaseModel):
8
+ source_id: Optional[str] = None
9
+ source_system_id: Optional[str] = None
10
+
11
+
12
+ class Drop(BaseModel):
13
+ compartment_indexes: list[int]
14
+ before_stick_inches: Optional[int] = None
15
+ before_stick_time: Optional[datetime] = None
16
+ after_stick_inches: Optional[int] = None
17
+ after_stick_time: Optional[datetime] = None
18
+ drop_id: str
19
+ location: str
20
+ location_id: str
21
+ location_source_id: Optional[str] = None
22
+ location_source_system: Optional[str] = None
23
+ product: str
24
+ product_id: str
25
+ product_source_id: Optional[str] = None
26
+ product_source_system: Optional[str] = None
27
+ tank_id: Optional[int] = None
28
+ tank_source_id: Optional[str] = None
29
+ tank_source_system: Optional[str] = None
30
+ volume: int
31
+ driver_id: Optional[str] = None
32
+ driver_username: Optional[str] = None
33
+ driver_extra_data: Optional[DriverExtraData] = None
34
+ driver_name: Optional[str] = None
35
+ driver_date: Optional[datetime] = None
36
+ driver_shift: Optional[str] = None
37
+ driver_shift_id: Optional[str] = None
38
+ tractor_number: Optional[str] = None
39
+ trailer_number: Optional[str] = None
40
+ blend_codes: list[str] = []
41
+ site_counterparty_id: Optional[str] = None
42
+ site_counterparty_name: Optional[str] = None
43
+ freight_customer_id: Optional[str] = None
44
+ freight_customer_name: Optional[str] = None
45
+
46
+
47
+ class BOLPriceDetails(BaseModel):
48
+ price: Optional[float] = None
49
+ price_id: Optional[str] = None
50
+ curve_id: Optional[str] = None
51
+ date: Optional[datetime] = None
52
+ counterparty_id: Optional[str] = None
53
+
54
+
55
+ class BOLDetail(BaseModel):
56
+ compartment_index: Optional[int] = None
57
+ load_number: Optional[str] = None
58
+ product: str
59
+ product_id: str
60
+ product_source_id: Optional[str] = None
61
+ product_source_system: Optional[str] = None
62
+ net_volume: int
63
+ gross_volume: int
64
+ supplier: Optional[str] = None
65
+ supplier_id: Optional[str] = None
66
+ supplier_source_id: Optional[str] = None
67
+ supplier_source_system: Optional[str] = None
68
+ contract: Optional[str] = None
69
+ price_details: Optional[BOLPriceDetails] = None
70
+
71
+
72
+ class BOL(BaseModel):
73
+ bol_number: str
74
+ bol_id: str
75
+ date: Optional[datetime] = None
76
+ details: list[BOLDetail] = []
77
+ load_or_drop: Optional[str] = None
78
+ location: Optional[str] = None
79
+ location_id: Optional[str] = None
80
+ location_source_id: Optional[str] = None
81
+ location_source_system: Optional[str] = None
82
+ driver_id: Optional[str] = None
83
+ driver_username: Optional[str] = None
84
+ driver_extra_data: Optional[DriverExtraData] = None
85
+ driver_name: Optional[str] = None
86
+ driver_date: Optional[datetime] = None
87
+ driver_shift: Optional[str] = None
88
+ driver_shift_id: Optional[str] = None
89
+ tractor_number: Optional[str] = None
90
+ trailer_number: Optional[str] = None
91
+
92
+
93
+ class Cost(BaseModel):
94
+ cost_type: str
95
+ carrier: Optional[str] = None
96
+ carrier_source_id: Optional[str] = None
97
+ carrier_source_system: Optional[str] = None
98
+ per_unit_price: Optional[float] = None
99
+ cost_amount: Optional[float] = None
100
+
101
+
102
+ class FreightLeg(BaseModel):
103
+ origin: str
104
+ origin_id: str
105
+ destination: str
106
+ destination_id: str
107
+ distance: Optional[float] = None
108
+
109
+
110
+ class FreightTransaction(BaseModel):
111
+ model_type: Optional[str] = None
112
+ type: Optional[str] = None
113
+ subtype: Optional[str] = None
114
+ rate: Optional[float] = None
115
+ amount: Optional[float] = None
116
+ total: Optional[float] = None
117
+ uom: Optional[str] = None
118
+ errors: list[str] = []
119
+ id: str
120
+ product_group: Optional[str] = None
121
+ product_id: Optional[str] = None
122
+ product_name: Optional[str] = None
123
+ origin: Optional[str] = None
124
+ origin_id: Optional[str] = None
125
+ origin_override: Optional[str] = None
126
+ origin_id_override: Optional[str] = None
127
+ destination: Optional[str] = None
128
+ destination_id: Optional[str] = None
129
+ destination_override: Optional[str] = None
130
+ destination_id_override: Optional[str] = None
131
+ legs: list[FreightLeg] = []
132
+ use_surcharge: Optional[bool] = None
133
+ manual: Optional[bool] = None
134
+ has_dependency: Optional[bool] = None
135
+ created_date: Optional[datetime] = None
136
+ requires_approval: Optional[bool] = None
137
+ requires_approval_reason_code: Optional[bool] = None
138
+ is_approved: Optional[bool] = None
139
+ approved_by: Optional[str] = None
140
+ approved_date: Optional[datetime] = None
141
+ approved_reason_code: Optional[str] = None
142
+ amount_override: Optional[float] = None
143
+ rate_override: Optional[float] = None
144
+ product_id_override: Optional[str] = None
145
+ product_name_override: Optional[str] = None
146
+ product_group_override: Optional[str] = None
147
+ subtype_override: Optional[str] = None
148
+ uom_override: Optional[str] = None
149
+ total_override: Optional[float] = None
150
+ override_by: Optional[str] = None
151
+ override_date: Optional[datetime] = None
152
+ exclude_from_invoice: Optional[bool] = None
153
+ credit_rebill_metadata: Optional[dict] = None
154
+ extra_data: Optional[dict] = None
155
+ gross_volume: Optional[int] = None
156
+ net_volume: Optional[int] = None
157
+ bol_date: Optional[datetime] = None
158
+ bol_number: Optional[str] = None
159
+ bol_number_override: Optional[str] = None
160
+ delivery_date: Optional[datetime] = None
161
+
162
+
163
+ class Freight(BaseModel):
164
+ id: str
165
+ parent: Optional[str] = None
166
+ created_at: Optional[datetime] = None
167
+ type: Optional[str] = None
168
+ status: Optional[str] = None
169
+ reversed: Optional[bool] = None
170
+ transactions: list[FreightTransaction] = []
171
+ counterparty_id: Optional[str] = None
172
+ book_type: Optional[str] = None
173
+ effective_date_used: Optional[datetime] = None
174
+ invoice_group_id: Optional[str] = None
175
+ invoice_number: Optional[str] = None
176
+ accessorial_invoice_number: Optional[str] = None
177
+ new_version_available: Optional[bool] = None
178
+ new_version_total: Optional[float] = None
179
+ error: Optional[str] = None
180
+
181
+
182
+ class AllocatedBOLPrice(BaseModel):
183
+ contract: Optional[str] = None
184
+ price_type: Optional[str] = None
185
+ price_id: Optional[str] = None
186
+ curve_id: Optional[str] = None
187
+ price: Optional[float] = None
188
+ date: Optional[datetime] = None
189
+ expired: Optional[bool] = None
190
+
191
+
192
+ class AllocatedBOL(BaseModel):
193
+ bol_number: str
194
+ bol_id: str
195
+ bol_terminal_id: Optional[str] = None
196
+ bol_terminal: Optional[str] = None
197
+ bol_product: Optional[str] = None
198
+ bol_product_id: Optional[str] = None
199
+ bol_supplier: Optional[str] = None
200
+ bol_supplier_id: Optional[str] = None
201
+ bol_net_volume_original: Optional[int] = None
202
+ bol_gross_volume_original: Optional[int] = None
203
+ store_number: Optional[str] = None
204
+ store_id: Optional[str] = None
205
+ location_id: Optional[str] = None
206
+ store_tank: Optional[int] = None
207
+ store_product: Optional[str] = None
208
+ store_product_id: Optional[str] = None
209
+ store_timezone: Optional[str] = None
210
+ bol_net_volume_allocated: Optional[int] = None
211
+ bol_gross_volume_allocated: Optional[int] = None
212
+ driver_schedule: Optional[str] = None
213
+ bol_date: Optional[datetime] = None
214
+ delivered_date: Optional[datetime] = None
215
+ price: Optional[AllocatedBOLPrice] = None
216
+
217
+
218
+ class Order(BaseModel):
219
+ order_number: str
220
+ order_id: str
221
+ po: Optional[str] = None
222
+ carrier: Optional[str] = None
223
+ carrier_id: Optional[str] = None
224
+ manager: Optional[str] = None
225
+ manager_id: Optional[str] = None
226
+ last_movement_update: Optional[datetime] = None
227
+ order_date: Optional[datetime] = None
228
+ status: Optional[str] = None
229
+ type: Optional[str] = None
230
+ drops: list[Drop] = []
231
+ bols: list[BOL] = []
232
+ costs: list[Cost] = []
233
+ validation_bypass_on: Optional[datetime] = None
234
+ has_additives: Optional[bool] = None
235
+ estimated_freight: Optional[Freight] = None
236
+ actual_freight: Optional[Freight] = None
237
+ allocated_bol_error: Optional[str] = None
238
+ allocated_bol_issue: Optional[str] = None
239
+ allocated_bols: list[AllocatedBOL] = []
240
+ last_change_date: Optional[datetime] = None
241
+ reference_order_number: Optional[str] = None
@@ -0,0 +1,301 @@
1
+ from datetime import datetime
2
+ from typing import Optional
3
+
4
+ from pydantic import BaseModel
5
+
6
+
7
+ class Driver(BaseModel):
8
+ driver_id: str
9
+ driver_schedule_id: Optional[str] = None
10
+ name: Optional[str] = None
11
+ username: Optional[str] = None
12
+
13
+
14
+ class LoadDetail(BaseModel):
15
+ detail_id: str
16
+ counterparty_id: Optional[str] = None
17
+ counterparty_name: Optional[str] = None
18
+ counterparty_source_id: Optional[str] = None
19
+ counterparty_source_system: Optional[str] = None
20
+ price_type: Optional[str] = None
21
+ contract: Optional[str] = None
22
+ product_id: str
23
+ product_name: Optional[str] = None
24
+ product_source_id: Optional[str] = None
25
+ product_source_system: Optional[str] = None
26
+ drop_product_id: Optional[str] = None
27
+ drop_product_name: Optional[str] = None
28
+ drop_product_source_id: Optional[str] = None
29
+ drop_product_source_system: Optional[str] = None
30
+ quantity: int
31
+ compartment_index: Optional[int] = None
32
+ blend_code: Optional[str] = None
33
+ product_codes: list[str] = []
34
+ load_number: Optional[str] = None
35
+
36
+
37
+ class Load(BaseModel):
38
+ location_id: str
39
+ location_name: Optional[str] = None
40
+ location_source_id: Optional[str] = None
41
+ location_source_system: Optional[str] = None
42
+ location_type: Optional[str] = None
43
+ details: list[LoadDetail] = []
44
+ eta: Optional[datetime] = None
45
+ status: Optional[str] = None
46
+
47
+
48
+ class DropSource(BaseModel):
49
+ compartment_index: int
50
+ volume: int
51
+
52
+
53
+ class DropDetail(BaseModel):
54
+ detail_id: str
55
+ counterparty_id: Optional[str] = None
56
+ counterparty_name: Optional[str] = None
57
+ counterparty_source_id: Optional[str] = None
58
+ counterparty_source_system: Optional[str] = None
59
+ product_id: str
60
+ product_name: Optional[str] = None
61
+ product_source_id: Optional[str] = None
62
+ product_source_system: Optional[str] = None
63
+ quantity: int
64
+ tank_id: Optional[int] = None
65
+ sources: list[DropSource] = []
66
+ destination_codes: list[str] = []
67
+ blend_codes: list[str] = []
68
+
69
+
70
+ class Drop(BaseModel):
71
+ location_id: str
72
+ location_name: Optional[str] = None
73
+ location_source_id: Optional[str] = None
74
+ location_source_system: Optional[str] = None
75
+ location_type: Optional[str] = None
76
+ details: list[DropDetail] = []
77
+ eta: Optional[datetime] = None
78
+ status: Optional[str] = None
79
+
80
+
81
+ class Detour(BaseModel):
82
+ location_id: Optional[str] = None
83
+ location_name: Optional[str] = None
84
+ eta: Optional[datetime] = None
85
+ status: Optional[str] = None
86
+
87
+
88
+ class FreightLeg(BaseModel):
89
+ origin: str
90
+ origin_id: str
91
+ destination: str
92
+ destination_id: str
93
+ distance: Optional[float] = None
94
+
95
+
96
+ class FreightTransaction(BaseModel):
97
+ model_type: Optional[str] = None
98
+ type: Optional[str] = None
99
+ subtype: Optional[str] = None
100
+ rate: Optional[float] = None
101
+ amount: Optional[float] = None
102
+ total: Optional[float] = None
103
+ uom: Optional[str] = None
104
+ errors: list[str] = []
105
+ id: str
106
+ product_group: Optional[str] = None
107
+ product_id: Optional[str] = None
108
+ product_name: Optional[str] = None
109
+ origin: Optional[str] = None
110
+ origin_id: Optional[str] = None
111
+ origin_override: Optional[str] = None
112
+ origin_id_override: Optional[str] = None
113
+ destination: Optional[str] = None
114
+ destination_id: Optional[str] = None
115
+ destination_override: Optional[str] = None
116
+ destination_id_override: Optional[str] = None
117
+ legs: list[FreightLeg] = []
118
+ use_surcharge: Optional[bool] = None
119
+ manual: Optional[bool] = None
120
+ has_dependency: Optional[bool] = None
121
+ created_date: Optional[datetime] = None
122
+ requires_approval: Optional[bool] = None
123
+ requires_approval_reason_code: Optional[bool] = None
124
+ is_approved: Optional[bool] = None
125
+ approved_by: Optional[str] = None
126
+ approved_date: Optional[datetime] = None
127
+ approved_reason_code: Optional[str] = None
128
+ amount_override: Optional[float] = None
129
+ rate_override: Optional[float] = None
130
+ product_id_override: Optional[str] = None
131
+ product_name_override: Optional[str] = None
132
+ product_group_override: Optional[str] = None
133
+ subtype_override: Optional[str] = None
134
+ uom_override: Optional[str] = None
135
+ total_override: Optional[float] = None
136
+ override_by: Optional[str] = None
137
+ override_date: Optional[datetime] = None
138
+ exclude_from_invoice: Optional[bool] = None
139
+ credit_rebill_metadata: Optional[dict] = None
140
+ extra_data: Optional[dict] = None
141
+ gross_volume: Optional[int] = None
142
+ net_volume: Optional[int] = None
143
+ bol_date: Optional[datetime] = None
144
+ bol_number: Optional[str] = None
145
+ bol_number_override: Optional[str] = None
146
+ delivery_date: Optional[datetime] = None
147
+
148
+
149
+ class EstimatedFreight(BaseModel):
150
+ id: str
151
+ parent: Optional[str] = None
152
+ created_at: Optional[datetime] = None
153
+ type: Optional[str] = None
154
+ status: Optional[str] = None
155
+ reversed: Optional[bool] = None
156
+ transactions: list[FreightTransaction] = []
157
+ counterparty_id: Optional[str] = None
158
+ book_type: Optional[str] = None
159
+ effective_date_used: Optional[datetime] = None
160
+ invoice_group_id: Optional[str] = None
161
+ invoice_number: Optional[str] = None
162
+ accessorial_invoice_number: Optional[str] = None
163
+ new_version_available: Optional[bool] = None
164
+ new_version_total: Optional[float] = None
165
+ error: Optional[str] = None
166
+
167
+
168
+ class PriceComponent(BaseModel):
169
+ timezone_data: Optional[str] = None
170
+ curve_id: Optional[str] = None
171
+ price_id: Optional[str] = None
172
+ terminal_id: Optional[str] = None
173
+ terminal: Optional[str] = None
174
+ supplier_id: Optional[str] = None
175
+ supplier: Optional[str] = None
176
+ price_type: Optional[str] = None
177
+ product_id: Optional[str] = None
178
+ product: Optional[str] = None
179
+ supply_owner_id: Optional[str] = None
180
+ supply_owner: Optional[str] = None
181
+ price: Optional[float] = None
182
+ contract: Optional[str] = None
183
+ volume: Optional[int] = None
184
+ effective_from: Optional[datetime] = None
185
+ effective_to: Optional[datetime] = None
186
+ group_id: Optional[str] = None
187
+ group_effective_cutover: Optional[datetime] = None
188
+ group_effective_cutover_timezone: Optional[str] = None
189
+ group_identifier: Optional[str] = None
190
+ group_name: Optional[str] = None
191
+ min_constraint: Optional[float] = None
192
+ max_constraint: Optional[float] = None
193
+ load_number: Optional[str] = None
194
+ load_numbers: list[str] = []
195
+ directive_info: Optional[dict] = None
196
+
197
+
198
+ class Price(BaseModel):
199
+ product_name: Optional[str] = None
200
+ volume: Optional[int] = None
201
+ components: list[PriceComponent] = []
202
+ product_total: Optional[float] = None
203
+ blend_code: Optional[str] = None
204
+
205
+
206
+ class SupplyOwnerDefinition(BaseModel):
207
+ location_name: Optional[str] = None
208
+ product: Optional[str] = None
209
+ supply_owner_id: Optional[str] = None
210
+
211
+
212
+ class SupplyOwnerMap(BaseModel):
213
+ definitions: list[SupplyOwnerDefinition] = []
214
+
215
+
216
+ class SupplyOption(BaseModel):
217
+ option: Optional[str] = None
218
+ carrier_id: Optional[str] = None
219
+ carrier: Optional[str] = None
220
+ loaded_miles: Optional[float] = None
221
+ freight: Optional[float] = None
222
+ freight_cost: Optional[float] = None
223
+ stops: Optional[int] = None
224
+ prices: list[Price] = []
225
+ product_total: Optional[float] = None
226
+ landed_cost: Optional[float] = None
227
+ supply_owner_map: Optional[SupplyOwnerMap] = None
228
+ freight_customer_id: Optional[str] = None
229
+ delivered: Optional[bool] = None
230
+ out_of_network: Optional[bool] = None
231
+ estimated_freight: Optional[EstimatedFreight] = None
232
+ legs: list[FreightLeg] = []
233
+ freight_distance: Optional[float] = None
234
+ supply_owner_id: Optional[str] = None
235
+
236
+
237
+ class GetOrderResponse(BaseModel):
238
+ type: str
239
+ order_id: Optional[str] = None
240
+ drivers: list[Driver] = []
241
+ order_number: Optional[int] = None
242
+ order_date: Optional[datetime] = None
243
+ order_state: Optional[str] = None
244
+ carrier_window_start: Optional[datetime] = None
245
+ carrier_window_end: Optional[datetime] = None
246
+ carrier_window_start_local: Optional[datetime] = None
247
+ carrier_window_end_local: Optional[datetime] = None
248
+ carrier_notify_state: Optional[str] = None
249
+ load_window_start: Optional[datetime] = None
250
+ load_window_end: Optional[datetime] = None
251
+ dispatch_window_start: Optional[datetime] = None
252
+ dispatch_window_end: Optional[datetime] = None
253
+ hauler_counterparty_id: Optional[str] = None
254
+ hauler_counterparty_name: Optional[str] = None
255
+ hauler_counterparty_source_id: Optional[str] = None
256
+ hauler_counterparty_source_system: Optional[str] = None
257
+ hauled_by_updated_by: Optional[str] = None
258
+ hauled_by_updated: Optional[datetime] = None
259
+ loads: list[Load] = []
260
+ drops: list[Drop] = []
261
+ detours: list[Detour] = []
262
+ trip_status: Optional[str] = None
263
+ last_change_date: Optional[datetime] = None
264
+ market: Optional[str] = None
265
+ supply_option: Optional[SupplyOption] = None
266
+ created_by: Optional[str] = None
267
+ note: Optional[str] = None
268
+ estimated_load_minutes: Optional[int] = None
269
+ total_miles: Optional[float] = None
270
+ loaded_miles: Optional[float] = None
271
+ unloaded_miles: Optional[float] = None
272
+ reference_order_number: Optional[str] = None
273
+ extra_data: Optional[dict] = None
274
+ tractor: Optional[str] = None
275
+ trailer: Optional[str] = None
276
+ po_number: Optional[str] = None
277
+
278
+
279
+ class GetOrderRequestProduct(BaseModel):
280
+ product_id: Optional[str] = None
281
+ product_name: Optional[str] = None
282
+ quantity: Optional[int] = None
283
+
284
+
285
+ class GetOrderRequestResponse(BaseModel):
286
+ type: Optional[str] = None
287
+ number: int
288
+ order_id: Optional[str] = None
289
+ order_number: Optional[int] = None
290
+ order_date: Optional[datetime] = None
291
+ order_state: Optional[str] = None
292
+ reference_order_number: Optional[str] = None
293
+ last_change_date: Optional[datetime] = None
294
+ site_name: Optional[str] = None
295
+ site_id: Optional[str] = None
296
+ customer_id: Optional[str] = None
297
+ customer_name: Optional[str] = None
298
+ delivery_window_start: datetime
299
+ delivery_window_end: datetime
300
+ products: list[GetOrderRequestProduct] = []
301
+ extra_data: Optional[dict] = None
@@ -0,0 +1,18 @@
1
+ from datetime import datetime
2
+ from enum import StrEnum
3
+ from typing import List
4
+
5
+ from pydantic import BaseModel
6
+
7
+
8
+ class ERPStatus(StrEnum):
9
+ """Copied from supply_and_dispatch_aio 2025-06-17"""
10
+ sent = "sent"
11
+ unsent = "unsent"
12
+ errors = "errors"
13
+
14
+ class BackofficeERP(BaseModel):
15
+ """Copied from supply_and_dispatch_aio 2025-06-17"""
16
+ status: ERPStatus = ERPStatus.unsent
17
+ time_sent: datetime | None = None
18
+ errors: List = []
@@ -0,0 +1,115 @@
1
+ from datetime import datetime
2
+ from typing import Literal
3
+
4
+ from pydantic import BaseModel, Field
5
+
6
+
7
+ class HierarchyKey(BaseModel):
8
+ id: str | None = None
9
+ name: str | None = None
10
+ source_system: str | None = None
11
+ source_id: str | None = None
12
+
13
+
14
+ class SiteKey(BaseModel):
15
+ id: str | None = None
16
+ number: str | None = None
17
+ source_system: str | None = None
18
+ source_id: str | None = None
19
+
20
+
21
+ class OrderKey(BaseModel):
22
+ order_number: int | None
23
+ order_id: str | None = None
24
+ order_reference_number: str | None = None
25
+
26
+
27
+ class DeliveryWindow(BaseModel):
28
+ start: datetime
29
+ end: datetime
30
+ timezone: str = "UTC"
31
+
32
+
33
+ class LoadsCreateRequest(BaseModel):
34
+ terminal: HierarchyKey | None = None
35
+ product: HierarchyKey | None = None
36
+ supplier: HierarchyKey | None = None
37
+ price_type: str | None = None
38
+
39
+
40
+ class DropCreateRequest(BaseModel):
41
+ site: SiteKey
42
+ tank_id: str | None = None
43
+ product: HierarchyKey
44
+ volume: int
45
+ loads: list[LoadsCreateRequest] = []
46
+
47
+
48
+ class OrderCreateRequest(BaseModel):
49
+ reference_order_number: str
50
+ supply_owner: HierarchyKey | None = None
51
+ sourcing_strategy: Literal["Specific Supply", "Tank Supply Default", "Use Best", "Manual"] = "Specific Supply"
52
+ manual_supply_fallback: bool = True
53
+ allow_alternate_products: bool = False
54
+ delivery_window: DeliveryWindow
55
+ fit_to_trailer: bool = False
56
+
57
+ note: str | None = None
58
+ drops: list[DropCreateRequest]
59
+ extra_data: dict
60
+
61
+
62
+ class OrderStatusUpdateRequest(BaseModel):
63
+ order_id: str
64
+ order_number: str | None = None
65
+ status: str
66
+ location_id: str | None = None
67
+ eta: datetime | None = None
68
+ actual: datetime | None = None
69
+
70
+ class DropDetail(BaseModel):
71
+ product_id: str
72
+ quantity: float
73
+ tank_id: int | None = None
74
+ pre_drop_volume: float | None = None
75
+ pre_drop_inches: float | None = None
76
+ pre_drop_time: datetime | None = None
77
+ post_drop_volume: float | None = None
78
+ post_drop_inches: float | None = None
79
+ post_drop_time: datetime | None = None
80
+
81
+ class SaveDropDetailsRequest(BaseModel):
82
+ order_id: str
83
+ location_id: str
84
+ mode: Literal["replace", "append"]
85
+ details: list[DropDetail]
86
+
87
+ class BOLDetail(BaseModel):
88
+ supplier_id: str
89
+ product_id: str
90
+ contract: str | None = None
91
+ price_type: str | None = None
92
+ net_volume: float
93
+ gross_volume: float
94
+
95
+ class SaveBOLDetailsRequest(BaseModel):
96
+ order_id: str
97
+ bol_number: str
98
+ terminal_id: str
99
+ bol_date: datetime
100
+ details: list[BOLDetail]
101
+
102
+ class OrderUpdateRequest(BaseModel):
103
+ order: OrderKey = Field(...)
104
+ sourcing_strategy: Literal["Specific Supply", "Tank Supply Default", "Use Best", "Manual"] = Field(default="Use Best")
105
+ delivery_window: DeliveryWindow | None = Field(default=None, description="If provided, replaces the existing delivery window.")
106
+ note: str | None = Field(default=None, description="If provided, replaces the existing note.")
107
+ drops: list[DropCreateRequest] = Field(default=[], description="If provided, replaces all existing drops.")
108
+ extra_data: dict = Field(default={}, description="Merge this extra data with the existing extra data. New keys will be added, existing keys will be updated.")
109
+
110
+ class SendToCarrierRequest(BaseModel):
111
+ order_ids: list[str]
112
+ force: bool = False
113
+ instant: bool = False
114
+ actual_end_date: datetime | None = None
115
+ send_email: bool = True
File without changes
File without changes