b1sl-python 0.1.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 (579) hide show
  1. b1sl/__init__.py +5 -0
  2. b1sl/b1sl/__init__.py +56 -0
  3. b1sl/b1sl/_types.py +28 -0
  4. b1sl/b1sl/adapter.py +40 -0
  5. b1sl/b1sl/adapter_protocol.py +28 -0
  6. b1sl/b1sl/async_client.py +268 -0
  7. b1sl/b1sl/async_rest_adapter.py +347 -0
  8. b1sl/b1sl/base_adapter.py +394 -0
  9. b1sl/b1sl/client.py +112 -0
  10. b1sl/b1sl/config.py +138 -0
  11. b1sl/b1sl/config_manager.py +77 -0
  12. b1sl/b1sl/contrib/__init__.py +14 -0
  13. b1sl/b1sl/contrib/django/__init__.py +13 -0
  14. b1sl/b1sl/contrib/django/middleware/__init__.py +27 -0
  15. b1sl/b1sl/contrib/django/middleware/base.py +89 -0
  16. b1sl/b1sl/contrib/django/middleware/odata_decode_middleware.py +20 -0
  17. b1sl/b1sl/contrib/django/middleware/odata_transform_url_middleware.py +20 -0
  18. b1sl/b1sl/entities/__init__.py +2209 -0
  19. b1sl/b1sl/environment.py +36 -0
  20. b1sl/b1sl/exceptions/exceptions.py +142 -0
  21. b1sl/b1sl/fields/__init__.py +2020 -0
  22. b1sl/b1sl/fields/_generated/__init__.py +0 -0
  23. b1sl/b1sl/fields/_generated/complex_types.py +6926 -0
  24. b1sl/b1sl/fields/_generated/entities/__init__.py +0 -0
  25. b1sl/b1sl/fields/_generated/entities/businesspartners.py +544 -0
  26. b1sl/b1sl/fields/_generated/entities/finance.py +451 -0
  27. b1sl/b1sl/fields/_generated/entities/general.py +4587 -0
  28. b1sl/b1sl/fields/_generated/entities/inventory.py +761 -0
  29. b1sl/b1sl/fields/_generated/entities/production.py +256 -0
  30. b1sl/b1sl/fields/_generated/entities/purchasing.py +53 -0
  31. b1sl/b1sl/fields/_generated/entities/sales.py +244 -0
  32. b1sl/b1sl/logging_utils.py +119 -0
  33. b1sl/b1sl/models/__init__.py +13 -0
  34. b1sl/b1sl/models/_generated/__init__.py +0 -0
  35. b1sl/b1sl/models/_generated/_types.py +5 -0
  36. b1sl/b1sl/models/_generated/complex_types.py +6929 -0
  37. b1sl/b1sl/models/_generated/entities/__init__.py +581 -0
  38. b1sl/b1sl/models/_generated/entities/businesspartners.py +565 -0
  39. b1sl/b1sl/models/_generated/entities/finance.py +472 -0
  40. b1sl/b1sl/models/_generated/entities/general.py +4831 -0
  41. b1sl/b1sl/models/_generated/entities/inventory.py +786 -0
  42. b1sl/b1sl/models/_generated/entities/production.py +272 -0
  43. b1sl/b1sl/models/_generated/entities/purchasing.py +64 -0
  44. b1sl/b1sl/models/_generated/entities/sales.py +263 -0
  45. b1sl/b1sl/models/_generated/enums.py +3501 -0
  46. b1sl/b1sl/models/_generated/resources/__init__.py +0 -0
  47. b1sl/b1sl/models/_overrides/inventory.py +24 -0
  48. b1sl/b1sl/models/base.py +209 -0
  49. b1sl/b1sl/models/odata_query_model.py +50 -0
  50. b1sl/b1sl/models/paginated_result.py +85 -0
  51. b1sl/b1sl/models/result.py +17 -0
  52. b1sl/b1sl/resources/__init__.py +11 -0
  53. b1sl/b1sl/resources/_generated/__init__.py +0 -0
  54. b1sl/b1sl/resources/_generated/account_category.py +15 -0
  55. b1sl/b1sl/resources/_generated/account_category_service.py +21 -0
  56. b1sl/b1sl/resources/_generated/account_segmentation_categories.py +15 -0
  57. b1sl/b1sl/resources/_generated/account_segmentations.py +15 -0
  58. b1sl/b1sl/resources/_generated/accounts_service.py +33 -0
  59. b1sl/b1sl/resources/_generated/accrual_types.py +15 -0
  60. b1sl/b1sl/resources/_generated/accrual_types_service.py +21 -0
  61. b1sl/b1sl/resources/_generated/activities.py +15 -0
  62. b1sl/b1sl/resources/_generated/activities_service.py +109 -0
  63. b1sl/b1sl/resources/_generated/activity_locations.py +15 -0
  64. b1sl/b1sl/resources/_generated/activity_recipient_lists.py +15 -0
  65. b1sl/b1sl/resources/_generated/activity_recipient_lists_service.py +21 -0
  66. b1sl/b1sl/resources/_generated/activity_statuses.py +15 -0
  67. b1sl/b1sl/resources/_generated/activity_types.py +15 -0
  68. b1sl/b1sl/resources/_generated/additional_expenses.py +15 -0
  69. b1sl/b1sl/resources/_generated/address_service.py +38 -0
  70. b1sl/b1sl/resources/_generated/alert_managements.py +16 -0
  71. b1sl/b1sl/resources/_generated/alternate_cat_num.py +15 -0
  72. b1sl/b1sl/resources/_generated/alternative_items_service.py +113 -0
  73. b1sl/b1sl/resources/_generated/approval_requests.py +15 -0
  74. b1sl/b1sl/resources/_generated/approval_requests_service.py +33 -0
  75. b1sl/b1sl/resources/_generated/approval_stages.py +15 -0
  76. b1sl/b1sl/resources/_generated/approval_stages_service.py +21 -0
  77. b1sl/b1sl/resources/_generated/approval_templates.py +15 -0
  78. b1sl/b1sl/resources/_generated/approval_templates_service.py +21 -0
  79. b1sl/b1sl/resources/_generated/asset_capitalization.py +15 -0
  80. b1sl/b1sl/resources/_generated/asset_capitalization_credit_memo.py +15 -0
  81. b1sl/b1sl/resources/_generated/asset_capitalization_credit_memo_service.py +37 -0
  82. b1sl/b1sl/resources/_generated/asset_capitalization_service.py +37 -0
  83. b1sl/b1sl/resources/_generated/asset_classes.py +15 -0
  84. b1sl/b1sl/resources/_generated/asset_classes_service.py +21 -0
  85. b1sl/b1sl/resources/_generated/asset_depreciation_groups.py +15 -0
  86. b1sl/b1sl/resources/_generated/asset_depreciation_groups_service.py +21 -0
  87. b1sl/b1sl/resources/_generated/asset_groups.py +15 -0
  88. b1sl/b1sl/resources/_generated/asset_groups_service.py +21 -0
  89. b1sl/b1sl/resources/_generated/asset_manual_depreciation.py +15 -0
  90. b1sl/b1sl/resources/_generated/asset_manual_depreciation_service.py +37 -0
  91. b1sl/b1sl/resources/_generated/asset_retirement.py +15 -0
  92. b1sl/b1sl/resources/_generated/asset_retirement_service.py +37 -0
  93. b1sl/b1sl/resources/_generated/asset_transfer.py +15 -0
  94. b1sl/b1sl/resources/_generated/asset_transfer_service.py +37 -0
  95. b1sl/b1sl/resources/_generated/attachments2.py +15 -0
  96. b1sl/b1sl/resources/_generated/attribute_groups.py +15 -0
  97. b1sl/b1sl/resources/_generated/attribute_groups_service.py +21 -0
  98. b1sl/b1sl/resources/_generated/bank_charges_allocation_codes.py +15 -0
  99. b1sl/b1sl/resources/_generated/bank_charges_allocation_codes_service.py +21 -0
  100. b1sl/b1sl/resources/_generated/bank_pages.py +15 -0
  101. b1sl/b1sl/resources/_generated/bank_statements.py +15 -0
  102. b1sl/b1sl/resources/_generated/bank_statements_service.py +32 -0
  103. b1sl/b1sl/resources/_generated/banks.py +15 -0
  104. b1sl/b1sl/resources/_generated/bar_codes.py +15 -0
  105. b1sl/b1sl/resources/_generated/bar_codes_service.py +21 -0
  106. b1sl/b1sl/resources/_generated/batch_number_details.py +15 -0
  107. b1sl/b1sl/resources/_generated/bill_of_exchange_transactions.py +15 -0
  108. b1sl/b1sl/resources/_generated/bin_location_attributes.py +15 -0
  109. b1sl/b1sl/resources/_generated/bin_location_attributes_service.py +21 -0
  110. b1sl/b1sl/resources/_generated/bin_location_fields.py +15 -0
  111. b1sl/b1sl/resources/_generated/bin_location_fields_service.py +21 -0
  112. b1sl/b1sl/resources/_generated/bin_locations.py +15 -0
  113. b1sl/b1sl/resources/_generated/bin_locations_service.py +21 -0
  114. b1sl/b1sl/resources/_generated/blanket_agreements.py +15 -0
  115. b1sl/b1sl/resources/_generated/blanket_agreements_service.py +21 -0
  116. b1sl/b1sl/resources/_generated/boe_document_types.py +15 -0
  117. b1sl/b1sl/resources/_generated/boe_document_types_service.py +21 -0
  118. b1sl/b1sl/resources/_generated/boe_instructions.py +15 -0
  119. b1sl/b1sl/resources/_generated/boe_instructions_service.py +21 -0
  120. b1sl/b1sl/resources/_generated/boe_lines_service.py +30 -0
  121. b1sl/b1sl/resources/_generated/boe_portfolios.py +15 -0
  122. b1sl/b1sl/resources/_generated/boe_portfolios_service.py +21 -0
  123. b1sl/b1sl/resources/_generated/bp_fiscal_registry_id.py +15 -0
  124. b1sl/b1sl/resources/_generated/bp_opening_balance_service.py +41 -0
  125. b1sl/b1sl/resources/_generated/bp_priorities.py +15 -0
  126. b1sl/b1sl/resources/_generated/branches.py +15 -0
  127. b1sl/b1sl/resources/_generated/branches_service.py +21 -0
  128. b1sl/b1sl/resources/_generated/brazil_beverage_indexers.py +15 -0
  129. b1sl/b1sl/resources/_generated/brazil_beverage_indexers_service.py +21 -0
  130. b1sl/b1sl/resources/_generated/brazil_fuel_indexers.py +15 -0
  131. b1sl/b1sl/resources/_generated/brazil_fuel_indexers_service.py +21 -0
  132. b1sl/b1sl/resources/_generated/brazil_multi_indexers.py +15 -0
  133. b1sl/b1sl/resources/_generated/brazil_numeric_indexers.py +15 -0
  134. b1sl/b1sl/resources/_generated/brazil_string_indexers.py +15 -0
  135. b1sl/b1sl/resources/_generated/budget_distributions.py +15 -0
  136. b1sl/b1sl/resources/_generated/budget_scenarios.py +15 -0
  137. b1sl/b1sl/resources/_generated/budgets.py +15 -0
  138. b1sl/b1sl/resources/_generated/business_partner_groups.py +15 -0
  139. b1sl/b1sl/resources/_generated/business_partner_properties.py +15 -0
  140. b1sl/b1sl/resources/_generated/business_partner_properties_service.py +21 -0
  141. b1sl/b1sl/resources/_generated/business_partners.py +15 -0
  142. b1sl/b1sl/resources/_generated/business_partners_service.py +47 -0
  143. b1sl/b1sl/resources/_generated/business_places.py +15 -0
  144. b1sl/b1sl/resources/_generated/campaign_response_type.py +15 -0
  145. b1sl/b1sl/resources/_generated/campaign_response_type_service.py +21 -0
  146. b1sl/b1sl/resources/_generated/campaigns.py +15 -0
  147. b1sl/b1sl/resources/_generated/campaigns_service.py +21 -0
  148. b1sl/b1sl/resources/_generated/cash_discounts.py +15 -0
  149. b1sl/b1sl/resources/_generated/cash_discounts_service.py +21 -0
  150. b1sl/b1sl/resources/_generated/cash_flow_line_items.py +15 -0
  151. b1sl/b1sl/resources/_generated/cash_flow_line_items_service.py +21 -0
  152. b1sl/b1sl/resources/_generated/certificate_series.py +15 -0
  153. b1sl/b1sl/resources/_generated/certificate_series_service.py +21 -0
  154. b1sl/b1sl/resources/_generated/change_logs_service.py +51 -0
  155. b1sl/b1sl/resources/_generated/chart_of_accounts.py +15 -0
  156. b1sl/b1sl/resources/_generated/check_lines_service.py +38 -0
  157. b1sl/b1sl/resources/_generated/checksfor_payment.py +15 -0
  158. b1sl/b1sl/resources/_generated/choose_from_list.py +15 -0
  159. b1sl/b1sl/resources/_generated/client_mixin.py +3920 -0
  160. b1sl/b1sl/resources/_generated/closing_date_procedure.py +15 -0
  161. b1sl/b1sl/resources/_generated/cockpits.py +15 -0
  162. b1sl/b1sl/resources/_generated/cockpits_service.py +46 -0
  163. b1sl/b1sl/resources/_generated/commission_groups.py +15 -0
  164. b1sl/b1sl/resources/_generated/company_service.py +410 -0
  165. b1sl/b1sl/resources/_generated/contacts.py +15 -0
  166. b1sl/b1sl/resources/_generated/contract_templates.py +15 -0
  167. b1sl/b1sl/resources/_generated/correction_invoice.py +15 -0
  168. b1sl/b1sl/resources/_generated/correction_invoice_reversal.py +15 -0
  169. b1sl/b1sl/resources/_generated/correction_invoice_reversal_service.py +65 -0
  170. b1sl/b1sl/resources/_generated/correction_invoice_service.py +78 -0
  171. b1sl/b1sl/resources/_generated/correction_purchase_invoice.py +15 -0
  172. b1sl/b1sl/resources/_generated/correction_purchase_invoice_reversal.py +15 -0
  173. b1sl/b1sl/resources/_generated/correction_purchase_invoice_reversal_service.py +65 -0
  174. b1sl/b1sl/resources/_generated/correction_purchase_invoice_service.py +78 -0
  175. b1sl/b1sl/resources/_generated/cost_center_types.py +15 -0
  176. b1sl/b1sl/resources/_generated/cost_center_types_service.py +21 -0
  177. b1sl/b1sl/resources/_generated/cost_element_service.py +21 -0
  178. b1sl/b1sl/resources/_generated/cost_elements.py +15 -0
  179. b1sl/b1sl/resources/_generated/counties.py +15 -0
  180. b1sl/b1sl/resources/_generated/counties_service.py +21 -0
  181. b1sl/b1sl/resources/_generated/countries.py +15 -0
  182. b1sl/b1sl/resources/_generated/countries_service.py +21 -0
  183. b1sl/b1sl/resources/_generated/credit_card_payments.py +15 -0
  184. b1sl/b1sl/resources/_generated/credit_cards.py +15 -0
  185. b1sl/b1sl/resources/_generated/credit_lines_service.py +38 -0
  186. b1sl/b1sl/resources/_generated/credit_notes.py +15 -0
  187. b1sl/b1sl/resources/_generated/credit_notes_service.py +100 -0
  188. b1sl/b1sl/resources/_generated/credit_payment_methods.py +15 -0
  189. b1sl/b1sl/resources/_generated/currencies.py +15 -0
  190. b1sl/b1sl/resources/_generated/customer_equipment_cards.py +15 -0
  191. b1sl/b1sl/resources/_generated/customs_declaration.py +15 -0
  192. b1sl/b1sl/resources/_generated/customs_groups.py +15 -0
  193. b1sl/b1sl/resources/_generated/cycle_count_determinations.py +15 -0
  194. b1sl/b1sl/resources/_generated/cycle_count_determinations_service.py +21 -0
  195. b1sl/b1sl/resources/_generated/dashboard_packages_service.py +28 -0
  196. b1sl/b1sl/resources/_generated/deductible_tax_service.py +21 -0
  197. b1sl/b1sl/resources/_generated/deductible_taxes.py +15 -0
  198. b1sl/b1sl/resources/_generated/deduction_tax_groups.py +15 -0
  199. b1sl/b1sl/resources/_generated/deduction_tax_hierarchies.py +15 -0
  200. b1sl/b1sl/resources/_generated/deduction_tax_sub_groups.py +15 -0
  201. b1sl/b1sl/resources/_generated/deduction_tax_sub_groups_service.py +21 -0
  202. b1sl/b1sl/resources/_generated/delivery_notes.py +15 -0
  203. b1sl/b1sl/resources/_generated/delivery_notes_service.py +85 -0
  204. b1sl/b1sl/resources/_generated/departments.py +15 -0
  205. b1sl/b1sl/resources/_generated/departments_service.py +21 -0
  206. b1sl/b1sl/resources/_generated/deposits.py +15 -0
  207. b1sl/b1sl/resources/_generated/deposits_service.py +53 -0
  208. b1sl/b1sl/resources/_generated/depreciation_areas.py +15 -0
  209. b1sl/b1sl/resources/_generated/depreciation_areas_service.py +21 -0
  210. b1sl/b1sl/resources/_generated/depreciation_type_pools.py +15 -0
  211. b1sl/b1sl/resources/_generated/depreciation_type_pools_service.py +21 -0
  212. b1sl/b1sl/resources/_generated/depreciation_types.py +15 -0
  213. b1sl/b1sl/resources/_generated/depreciation_types_service.py +21 -0
  214. b1sl/b1sl/resources/_generated/determination_criterias.py +15 -0
  215. b1sl/b1sl/resources/_generated/determination_criterias_service.py +21 -0
  216. b1sl/b1sl/resources/_generated/dimensions.py +15 -0
  217. b1sl/b1sl/resources/_generated/dimensions_service.py +21 -0
  218. b1sl/b1sl/resources/_generated/distribution_rules.py +15 -0
  219. b1sl/b1sl/resources/_generated/distribution_rules_service.py +21 -0
  220. b1sl/b1sl/resources/_generated/dnf_code_setup.py +15 -0
  221. b1sl/b1sl/resources/_generated/dnf_code_setup_service.py +21 -0
  222. b1sl/b1sl/resources/_generated/down_payments.py +15 -0
  223. b1sl/b1sl/resources/_generated/down_payments_service.py +68 -0
  224. b1sl/b1sl/resources/_generated/drafts.py +15 -0
  225. b1sl/b1sl/resources/_generated/drafts_service.py +86 -0
  226. b1sl/b1sl/resources/_generated/dunning_letters.py +15 -0
  227. b1sl/b1sl/resources/_generated/dunning_terms.py +15 -0
  228. b1sl/b1sl/resources/_generated/dunning_terms_service.py +21 -0
  229. b1sl/b1sl/resources/_generated/dynamic_system_strings.py +15 -0
  230. b1sl/b1sl/resources/_generated/electronic_communication_action_service.py +122 -0
  231. b1sl/b1sl/resources/_generated/electronic_communication_actions_service.py +119 -0
  232. b1sl/b1sl/resources/_generated/electronic_file_formats.py +15 -0
  233. b1sl/b1sl/resources/_generated/electronic_file_formats_service.py +21 -0
  234. b1sl/b1sl/resources/_generated/email_groups.py +15 -0
  235. b1sl/b1sl/resources/_generated/email_groups_service.py +21 -0
  236. b1sl/b1sl/resources/_generated/employee_id_type.py +15 -0
  237. b1sl/b1sl/resources/_generated/employee_id_type_service.py +21 -0
  238. b1sl/b1sl/resources/_generated/employee_position.py +15 -0
  239. b1sl/b1sl/resources/_generated/employee_position_service.py +21 -0
  240. b1sl/b1sl/resources/_generated/employee_roles_setup.py +15 -0
  241. b1sl/b1sl/resources/_generated/employee_roles_setup_service.py +21 -0
  242. b1sl/b1sl/resources/_generated/employee_status.py +15 -0
  243. b1sl/b1sl/resources/_generated/employee_status_service.py +21 -0
  244. b1sl/b1sl/resources/_generated/employee_transfers.py +15 -0
  245. b1sl/b1sl/resources/_generated/employee_transfers_service.py +21 -0
  246. b1sl/b1sl/resources/_generated/employees_info.py +15 -0
  247. b1sl/b1sl/resources/_generated/employment_category_service.py +21 -0
  248. b1sl/b1sl/resources/_generated/employment_categorys.py +15 -0
  249. b1sl/b1sl/resources/_generated/enhanced_discount_groups.py +15 -0
  250. b1sl/b1sl/resources/_generated/enhanced_discount_groups_service.py +21 -0
  251. b1sl/b1sl/resources/_generated/exceptional_event_service.py +21 -0
  252. b1sl/b1sl/resources/_generated/exceptional_events.py +15 -0
  253. b1sl/b1sl/resources/_generated/extended_translations.py +15 -0
  254. b1sl/b1sl/resources/_generated/extended_translations_service.py +21 -0
  255. b1sl/b1sl/resources/_generated/external_calls_service.py +54 -0
  256. b1sl/b1sl/resources/_generated/external_reconciliations_service.py +104 -0
  257. b1sl/b1sl/resources/_generated/fa_account_determinations.py +15 -0
  258. b1sl/b1sl/resources/_generated/fa_account_determinations_service.py +21 -0
  259. b1sl/b1sl/resources/_generated/factoring_indicators.py +15 -0
  260. b1sl/b1sl/resources/_generated/financial_years.py +15 -0
  261. b1sl/b1sl/resources/_generated/financial_years_service.py +21 -0
  262. b1sl/b1sl/resources/_generated/fiscal_printer.py +15 -0
  263. b1sl/b1sl/resources/_generated/fiscal_printer_service.py +21 -0
  264. b1sl/b1sl/resources/_generated/fixed_asset_items_service.py +55 -0
  265. b1sl/b1sl/resources/_generated/form_preferences.py +15 -0
  266. b1sl/b1sl/resources/_generated/formatted_searches.py +15 -0
  267. b1sl/b1sl/resources/_generated/forms1099.py +15 -0
  268. b1sl/b1sl/resources/_generated/gl_account_advanced_rules.py +15 -0
  269. b1sl/b1sl/resources/_generated/gl_account_advanced_rules_service.py +21 -0
  270. b1sl/b1sl/resources/_generated/goods_return_request.py +15 -0
  271. b1sl/b1sl/resources/_generated/goods_return_request_service.py +69 -0
  272. b1sl/b1sl/resources/_generated/gov_pay_codes.py +15 -0
  273. b1sl/b1sl/resources/_generated/gov_pay_codes_service.py +21 -0
  274. b1sl/b1sl/resources/_generated/gt_is_service.py +28 -0
  275. b1sl/b1sl/resources/_generated/holidays.py +15 -0
  276. b1sl/b1sl/resources/_generated/house_bank_accounts.py +15 -0
  277. b1sl/b1sl/resources/_generated/incoming_payments.py +15 -0
  278. b1sl/b1sl/resources/_generated/india_hsn.py +15 -0
  279. b1sl/b1sl/resources/_generated/india_hsn_service.py +21 -0
  280. b1sl/b1sl/resources/_generated/industries.py +15 -0
  281. b1sl/b1sl/resources/_generated/integration_packages_configure.py +15 -0
  282. b1sl/b1sl/resources/_generated/integration_packages_configure_service.py +21 -0
  283. b1sl/b1sl/resources/_generated/internal_reconciliations.py +15 -0
  284. b1sl/b1sl/resources/_generated/internal_reconciliations_service.py +51 -0
  285. b1sl/b1sl/resources/_generated/intrastat_configuration.py +15 -0
  286. b1sl/b1sl/resources/_generated/intrastat_configuration_service.py +21 -0
  287. b1sl/b1sl/resources/_generated/inventory_countings.py +15 -0
  288. b1sl/b1sl/resources/_generated/inventory_countings_service.py +21 -0
  289. b1sl/b1sl/resources/_generated/inventory_cycles.py +15 -0
  290. b1sl/b1sl/resources/_generated/inventory_gen_entries.py +15 -0
  291. b1sl/b1sl/resources/_generated/inventory_gen_entry_service.py +67 -0
  292. b1sl/b1sl/resources/_generated/inventory_gen_exit_service.py +66 -0
  293. b1sl/b1sl/resources/_generated/inventory_gen_exits.py +15 -0
  294. b1sl/b1sl/resources/_generated/inventory_opening_balances.py +15 -0
  295. b1sl/b1sl/resources/_generated/inventory_opening_balances_service.py +21 -0
  296. b1sl/b1sl/resources/_generated/inventory_postings.py +15 -0
  297. b1sl/b1sl/resources/_generated/inventory_postings_service.py +34 -0
  298. b1sl/b1sl/resources/_generated/inventory_transfer_requests.py +15 -0
  299. b1sl/b1sl/resources/_generated/inventory_transfer_requests_service.py +43 -0
  300. b1sl/b1sl/resources/_generated/invoices.py +15 -0
  301. b1sl/b1sl/resources/_generated/invoices_service.py +100 -0
  302. b1sl/b1sl/resources/_generated/item_groups.py +15 -0
  303. b1sl/b1sl/resources/_generated/item_properties.py +15 -0
  304. b1sl/b1sl/resources/_generated/items.py +15 -0
  305. b1sl/b1sl/resources/_generated/journal_entries.py +15 -0
  306. b1sl/b1sl/resources/_generated/journal_entry_document_type_service.py +21 -0
  307. b1sl/b1sl/resources/_generated/journal_entry_document_types.py +15 -0
  308. b1sl/b1sl/resources/_generated/journal_vouchers_service.py +45 -0
  309. b1sl/b1sl/resources/_generated/knowledge_base_solutions.py +15 -0
  310. b1sl/b1sl/resources/_generated/kp_is.py +15 -0
  311. b1sl/b1sl/resources/_generated/kp_is_service.py +21 -0
  312. b1sl/b1sl/resources/_generated/landed_costs.py +15 -0
  313. b1sl/b1sl/resources/_generated/landed_costs_codes.py +15 -0
  314. b1sl/b1sl/resources/_generated/landed_costs_service.py +21 -0
  315. b1sl/b1sl/resources/_generated/legal_data.py +15 -0
  316. b1sl/b1sl/resources/_generated/length_measures.py +15 -0
  317. b1sl/b1sl/resources/_generated/license_service.py +21 -0
  318. b1sl/b1sl/resources/_generated/local_era.py +15 -0
  319. b1sl/b1sl/resources/_generated/manufacturers.py +15 -0
  320. b1sl/b1sl/resources/_generated/material_groups.py +15 -0
  321. b1sl/b1sl/resources/_generated/material_groups_service.py +21 -0
  322. b1sl/b1sl/resources/_generated/material_revaluation.py +15 -0
  323. b1sl/b1sl/resources/_generated/material_revaluation_fifo_service.py +33 -0
  324. b1sl/b1sl/resources/_generated/material_revaluation_snb_service.py +33 -0
  325. b1sl/b1sl/resources/_generated/messages.py +15 -0
  326. b1sl/b1sl/resources/_generated/messages_service.py +35 -0
  327. b1sl/b1sl/resources/_generated/mobile_add_on_setting.py +15 -0
  328. b1sl/b1sl/resources/_generated/mobile_add_on_setting_service.py +21 -0
  329. b1sl/b1sl/resources/_generated/mobile_app_service.py +240 -0
  330. b1sl/b1sl/resources/_generated/multi_language_translations.py +15 -0
  331. b1sl/b1sl/resources/_generated/nature_of_assessees.py +15 -0
  332. b1sl/b1sl/resources/_generated/nature_of_assessees_service.py +21 -0
  333. b1sl/b1sl/resources/_generated/ncm_codes_setup.py +15 -0
  334. b1sl/b1sl/resources/_generated/ncm_codes_setup_service.py +21 -0
  335. b1sl/b1sl/resources/_generated/nf_models.py +15 -0
  336. b1sl/b1sl/resources/_generated/nf_models_service.py +21 -0
  337. b1sl/b1sl/resources/_generated/nf_tax_categories.py +15 -0
  338. b1sl/b1sl/resources/_generated/nf_tax_categories_service.py +21 -0
  339. b1sl/b1sl/resources/_generated/nota_fiscal_cfop.py +15 -0
  340. b1sl/b1sl/resources/_generated/nota_fiscal_cst.py +15 -0
  341. b1sl/b1sl/resources/_generated/nota_fiscal_usage.py +15 -0
  342. b1sl/b1sl/resources/_generated/occurrence_codes.py +15 -0
  343. b1sl/b1sl/resources/_generated/occurrence_codes_service.py +21 -0
  344. b1sl/b1sl/resources/_generated/orders.py +15 -0
  345. b1sl/b1sl/resources/_generated/orders_service.py +94 -0
  346. b1sl/b1sl/resources/_generated/packages_types.py +15 -0
  347. b1sl/b1sl/resources/_generated/partners_setups.py +15 -0
  348. b1sl/b1sl/resources/_generated/partners_setups_service.py +21 -0
  349. b1sl/b1sl/resources/_generated/payment_blocks.py +15 -0
  350. b1sl/b1sl/resources/_generated/payment_blocks_service.py +21 -0
  351. b1sl/b1sl/resources/_generated/payment_calculation_service.py +37 -0
  352. b1sl/b1sl/resources/_generated/payment_drafts.py +15 -0
  353. b1sl/b1sl/resources/_generated/payment_reason_code_service.py +21 -0
  354. b1sl/b1sl/resources/_generated/payment_reason_codes.py +15 -0
  355. b1sl/b1sl/resources/_generated/payment_run_export.py +15 -0
  356. b1sl/b1sl/resources/_generated/payment_terms_types.py +15 -0
  357. b1sl/b1sl/resources/_generated/payment_terms_types_service.py +28 -0
  358. b1sl/b1sl/resources/_generated/pick_lists.py +15 -0
  359. b1sl/b1sl/resources/_generated/pick_lists_service.py +78 -0
  360. b1sl/b1sl/resources/_generated/pos_daily_summary.py +15 -0
  361. b1sl/b1sl/resources/_generated/predefined_texts.py +15 -0
  362. b1sl/b1sl/resources/_generated/predefined_texts_service.py +21 -0
  363. b1sl/b1sl/resources/_generated/price_lists.py +15 -0
  364. b1sl/b1sl/resources/_generated/product_trees.py +15 -0
  365. b1sl/b1sl/resources/_generated/production_orders.py +15 -0
  366. b1sl/b1sl/resources/_generated/profit_centers.py +15 -0
  367. b1sl/b1sl/resources/_generated/profit_centers_service.py +21 -0
  368. b1sl/b1sl/resources/_generated/project_management_configuration_service.py +333 -0
  369. b1sl/b1sl/resources/_generated/project_management_service.py +104 -0
  370. b1sl/b1sl/resources/_generated/project_management_time_sheet.py +15 -0
  371. b1sl/b1sl/resources/_generated/project_managements.py +15 -0
  372. b1sl/b1sl/resources/_generated/projects.py +15 -0
  373. b1sl/b1sl/resources/_generated/projects_service.py +21 -0
  374. b1sl/b1sl/resources/_generated/purchase_credit_notes.py +15 -0
  375. b1sl/b1sl/resources/_generated/purchase_credit_notes_service.py +85 -0
  376. b1sl/b1sl/resources/_generated/purchase_delivery_notes.py +15 -0
  377. b1sl/b1sl/resources/_generated/purchase_delivery_notes_service.py +85 -0
  378. b1sl/b1sl/resources/_generated/purchase_down_payments.py +15 -0
  379. b1sl/b1sl/resources/_generated/purchase_down_payments_service.py +70 -0
  380. b1sl/b1sl/resources/_generated/purchase_invoices.py +15 -0
  381. b1sl/b1sl/resources/_generated/purchase_invoices_service.py +85 -0
  382. b1sl/b1sl/resources/_generated/purchase_orders.py +15 -0
  383. b1sl/b1sl/resources/_generated/purchase_orders_service.py +69 -0
  384. b1sl/b1sl/resources/_generated/purchase_quotations.py +15 -0
  385. b1sl/b1sl/resources/_generated/purchase_quotations_service.py +70 -0
  386. b1sl/b1sl/resources/_generated/purchase_request_service.py +68 -0
  387. b1sl/b1sl/resources/_generated/purchase_requests.py +15 -0
  388. b1sl/b1sl/resources/_generated/purchase_returns.py +15 -0
  389. b1sl/b1sl/resources/_generated/purchase_returns_service.py +85 -0
  390. b1sl/b1sl/resources/_generated/purchase_tax_invoices.py +15 -0
  391. b1sl/b1sl/resources/_generated/qr_code_service.py +33 -0
  392. b1sl/b1sl/resources/_generated/query_auth_groups.py +15 -0
  393. b1sl/b1sl/resources/_generated/query_categories.py +15 -0
  394. b1sl/b1sl/resources/_generated/query_service.py +29 -0
  395. b1sl/b1sl/resources/_generated/queue.py +15 -0
  396. b1sl/b1sl/resources/_generated/quotations.py +15 -0
  397. b1sl/b1sl/resources/_generated/quotations_service.py +69 -0
  398. b1sl/b1sl/resources/_generated/recurring_transaction_service.py +67 -0
  399. b1sl/b1sl/resources/_generated/relationships.py +15 -0
  400. b1sl/b1sl/resources/_generated/report_filter.py +15 -0
  401. b1sl/b1sl/resources/_generated/report_filter_service.py +30 -0
  402. b1sl/b1sl/resources/_generated/report_layouts_service.py +237 -0
  403. b1sl/b1sl/resources/_generated/report_types.py +15 -0
  404. b1sl/b1sl/resources/_generated/report_types_service.py +21 -0
  405. b1sl/b1sl/resources/_generated/resource_capacities.py +15 -0
  406. b1sl/b1sl/resources/_generated/resource_capacities_service.py +34 -0
  407. b1sl/b1sl/resources/_generated/resource_groups.py +15 -0
  408. b1sl/b1sl/resources/_generated/resource_groups_service.py +21 -0
  409. b1sl/b1sl/resources/_generated/resource_properties.py +15 -0
  410. b1sl/b1sl/resources/_generated/resource_properties_service.py +21 -0
  411. b1sl/b1sl/resources/_generated/resources.py +15 -0
  412. b1sl/b1sl/resources/_generated/resources_service.py +21 -0
  413. b1sl/b1sl/resources/_generated/retorno_codes.py +15 -0
  414. b1sl/b1sl/resources/_generated/retorno_codes_service.py +21 -0
  415. b1sl/b1sl/resources/_generated/return_request.py +15 -0
  416. b1sl/b1sl/resources/_generated/return_request_service.py +69 -0
  417. b1sl/b1sl/resources/_generated/returns.py +15 -0
  418. b1sl/b1sl/resources/_generated/returns_service.py +85 -0
  419. b1sl/b1sl/resources/_generated/route_stages.py +15 -0
  420. b1sl/b1sl/resources/_generated/route_stages_service.py +21 -0
  421. b1sl/b1sl/resources/_generated/sales_forecast.py +15 -0
  422. b1sl/b1sl/resources/_generated/sales_opportunities.py +15 -0
  423. b1sl/b1sl/resources/_generated/sales_opportunity_competitors_setup.py +15 -0
  424. b1sl/b1sl/resources/_generated/sales_opportunity_competitors_setup_service.py +21 -0
  425. b1sl/b1sl/resources/_generated/sales_opportunity_interests_setup.py +15 -0
  426. b1sl/b1sl/resources/_generated/sales_opportunity_interests_setup_service.py +21 -0
  427. b1sl/b1sl/resources/_generated/sales_opportunity_reasons_setup.py +15 -0
  428. b1sl/b1sl/resources/_generated/sales_opportunity_reasons_setup_service.py +21 -0
  429. b1sl/b1sl/resources/_generated/sales_opportunity_sources_setup.py +15 -0
  430. b1sl/b1sl/resources/_generated/sales_opportunity_sources_setup_service.py +21 -0
  431. b1sl/b1sl/resources/_generated/sales_persons.py +15 -0
  432. b1sl/b1sl/resources/_generated/sales_stages.py +15 -0
  433. b1sl/b1sl/resources/_generated/sales_tax_authorities.py +15 -0
  434. b1sl/b1sl/resources/_generated/sales_tax_authorities_types.py +15 -0
  435. b1sl/b1sl/resources/_generated/sales_tax_codes.py +15 -0
  436. b1sl/b1sl/resources/_generated/sales_tax_invoices.py +15 -0
  437. b1sl/b1sl/resources/_generated/sbo_bob_service.py +89 -0
  438. b1sl/b1sl/resources/_generated/sections.py +15 -0
  439. b1sl/b1sl/resources/_generated/sections_service.py +21 -0
  440. b1sl/b1sl/resources/_generated/self_credit_memo_service.py +69 -0
  441. b1sl/b1sl/resources/_generated/self_credit_memos.py +15 -0
  442. b1sl/b1sl/resources/_generated/self_invoice_service.py +69 -0
  443. b1sl/b1sl/resources/_generated/self_invoices.py +15 -0
  444. b1sl/b1sl/resources/_generated/serial_number_details.py +15 -0
  445. b1sl/b1sl/resources/_generated/series_service.py +305 -0
  446. b1sl/b1sl/resources/_generated/service_call_origins.py +15 -0
  447. b1sl/b1sl/resources/_generated/service_call_origins_service.py +21 -0
  448. b1sl/b1sl/resources/_generated/service_call_problem_sub_types.py +15 -0
  449. b1sl/b1sl/resources/_generated/service_call_problem_sub_types_service.py +21 -0
  450. b1sl/b1sl/resources/_generated/service_call_problem_types.py +15 -0
  451. b1sl/b1sl/resources/_generated/service_call_problem_types_service.py +21 -0
  452. b1sl/b1sl/resources/_generated/service_call_solution_status.py +15 -0
  453. b1sl/b1sl/resources/_generated/service_call_solution_status_service.py +21 -0
  454. b1sl/b1sl/resources/_generated/service_call_status.py +15 -0
  455. b1sl/b1sl/resources/_generated/service_call_status_service.py +21 -0
  456. b1sl/b1sl/resources/_generated/service_call_types.py +15 -0
  457. b1sl/b1sl/resources/_generated/service_call_types_service.py +21 -0
  458. b1sl/b1sl/resources/_generated/service_calls.py +15 -0
  459. b1sl/b1sl/resources/_generated/service_contracts.py +15 -0
  460. b1sl/b1sl/resources/_generated/service_groups.py +15 -0
  461. b1sl/b1sl/resources/_generated/service_groups_service.py +21 -0
  462. b1sl/b1sl/resources/_generated/service_tax_posting_service.py +36 -0
  463. b1sl/b1sl/resources/_generated/shipping_types.py +15 -0
  464. b1sl/b1sl/resources/_generated/short_link_mappings_service.py +26 -0
  465. b1sl/b1sl/resources/_generated/special_prices.py +15 -0
  466. b1sl/b1sl/resources/_generated/states.py +15 -0
  467. b1sl/b1sl/resources/_generated/states_service.py +21 -0
  468. b1sl/b1sl/resources/_generated/stock_takings.py +15 -0
  469. b1sl/b1sl/resources/_generated/stock_transfer_draft_service.py +34 -0
  470. b1sl/b1sl/resources/_generated/stock_transfer_drafts.py +15 -0
  471. b1sl/b1sl/resources/_generated/stock_transfer_service.py +43 -0
  472. b1sl/b1sl/resources/_generated/stock_transfers.py +15 -0
  473. b1sl/b1sl/resources/_generated/target_groups.py +15 -0
  474. b1sl/b1sl/resources/_generated/target_groups_service.py +21 -0
  475. b1sl/b1sl/resources/_generated/tax_code_determinations.py +15 -0
  476. b1sl/b1sl/resources/_generated/tax_code_determinations_service.py +21 -0
  477. b1sl/b1sl/resources/_generated/tax_code_determinations_tcd.py +15 -0
  478. b1sl/b1sl/resources/_generated/tax_code_determinations_tcd_service.py +21 -0
  479. b1sl/b1sl/resources/_generated/tax_invoice_report.py +15 -0
  480. b1sl/b1sl/resources/_generated/tax_web_sites.py +15 -0
  481. b1sl/b1sl/resources/_generated/tax_web_sites_service.py +27 -0
  482. b1sl/b1sl/resources/_generated/teams.py +15 -0
  483. b1sl/b1sl/resources/_generated/termination_reason.py +15 -0
  484. b1sl/b1sl/resources/_generated/termination_reason_service.py +21 -0
  485. b1sl/b1sl/resources/_generated/territories.py +15 -0
  486. b1sl/b1sl/resources/_generated/tracking_notes.py +15 -0
  487. b1sl/b1sl/resources/_generated/tracking_notes_service.py +21 -0
  488. b1sl/b1sl/resources/_generated/transaction_codes.py +15 -0
  489. b1sl/b1sl/resources/_generated/transaction_codes_service.py +21 -0
  490. b1sl/b1sl/resources/_generated/transportation_document.py +15 -0
  491. b1sl/b1sl/resources/_generated/tsr_exceptional_event_service.py +21 -0
  492. b1sl/b1sl/resources/_generated/tsr_exceptional_events.py +15 -0
  493. b1sl/b1sl/resources/_generated/unit_of_measurement_groups.py +15 -0
  494. b1sl/b1sl/resources/_generated/unit_of_measurement_groups_service.py +21 -0
  495. b1sl/b1sl/resources/_generated/unit_of_measurements.py +15 -0
  496. b1sl/b1sl/resources/_generated/unit_of_measurements_service.py +21 -0
  497. b1sl/b1sl/resources/_generated/user_default_groups.py +15 -0
  498. b1sl/b1sl/resources/_generated/user_fields_md.py +15 -0
  499. b1sl/b1sl/resources/_generated/user_keys_md.py +15 -0
  500. b1sl/b1sl/resources/_generated/user_languages.py +15 -0
  501. b1sl/b1sl/resources/_generated/user_menu_service.py +103 -0
  502. b1sl/b1sl/resources/_generated/user_objects_md.py +15 -0
  503. b1sl/b1sl/resources/_generated/user_permission_tree.py +15 -0
  504. b1sl/b1sl/resources/_generated/user_queries.py +15 -0
  505. b1sl/b1sl/resources/_generated/user_tables_md.py +15 -0
  506. b1sl/b1sl/resources/_generated/users.py +15 -0
  507. b1sl/b1sl/resources/_generated/users_service.py +21 -0
  508. b1sl/b1sl/resources/_generated/value_mapping.py +15 -0
  509. b1sl/b1sl/resources/_generated/value_mapping_communication.py +15 -0
  510. b1sl/b1sl/resources/_generated/value_mapping_service.py +64 -0
  511. b1sl/b1sl/resources/_generated/vat_groups.py +15 -0
  512. b1sl/b1sl/resources/_generated/vendor_payments.py +15 -0
  513. b1sl/b1sl/resources/_generated/w_tax_type_code_service.py +21 -0
  514. b1sl/b1sl/resources/_generated/w_tax_type_codes.py +15 -0
  515. b1sl/b1sl/resources/_generated/warehouse_locations.py +15 -0
  516. b1sl/b1sl/resources/_generated/warehouse_sublevel_codes.py +15 -0
  517. b1sl/b1sl/resources/_generated/warehouse_sublevel_codes_service.py +21 -0
  518. b1sl/b1sl/resources/_generated/warehouses.py +15 -0
  519. b1sl/b1sl/resources/_generated/web_client_bookmark_tile_service.py +21 -0
  520. b1sl/b1sl/resources/_generated/web_client_bookmark_tiles.py +15 -0
  521. b1sl/b1sl/resources/_generated/web_client_dashboard_service.py +21 -0
  522. b1sl/b1sl/resources/_generated/web_client_dashboards.py +15 -0
  523. b1sl/b1sl/resources/_generated/web_client_form_setting_service.py +21 -0
  524. b1sl/b1sl/resources/_generated/web_client_form_settings.py +15 -0
  525. b1sl/b1sl/resources/_generated/web_client_launchpad_service.py +21 -0
  526. b1sl/b1sl/resources/_generated/web_client_launchpads.py +15 -0
  527. b1sl/b1sl/resources/_generated/web_client_listview_filter_service.py +21 -0
  528. b1sl/b1sl/resources/_generated/web_client_listview_filters.py +15 -0
  529. b1sl/b1sl/resources/_generated/web_client_notification_service.py +21 -0
  530. b1sl/b1sl/resources/_generated/web_client_notifications.py +15 -0
  531. b1sl/b1sl/resources/_generated/web_client_preference_service.py +21 -0
  532. b1sl/b1sl/resources/_generated/web_client_preferences.py +15 -0
  533. b1sl/b1sl/resources/_generated/web_client_recent_activities.py +15 -0
  534. b1sl/b1sl/resources/_generated/web_client_recent_activity_service.py +21 -0
  535. b1sl/b1sl/resources/_generated/web_client_variant_group_service.py +21 -0
  536. b1sl/b1sl/resources/_generated/web_client_variant_groups.py +15 -0
  537. b1sl/b1sl/resources/_generated/web_client_variant_service.py +21 -0
  538. b1sl/b1sl/resources/_generated/web_client_variants.py +15 -0
  539. b1sl/b1sl/resources/_generated/weight_measures.py +15 -0
  540. b1sl/b1sl/resources/_generated/withholding_tax_codes.py +15 -0
  541. b1sl/b1sl/resources/_generated/witholding_tax_definition.py +15 -0
  542. b1sl/b1sl/resources/_generated/wizard_payment_methods.py +15 -0
  543. b1sl/b1sl/resources/_generated/workflow_task_service.py +47 -0
  544. b1sl/b1sl/resources/async_base.py +60 -0
  545. b1sl/b1sl/resources/base.py +159 -0
  546. b1sl/b1sl/resources/udo.py +78 -0
  547. b1sl/b1sl/rest_adapter.py +351 -0
  548. b1sl/b1sl/testing.py +24 -0
  549. b1sl/b1sl/tests/__init__.py +0 -0
  550. b1sl/b1sl/tests/test_01_settings.py +60 -0
  551. b1sl/b1sl/tests/test_02_rest_adapter.py +177 -0
  552. b1sl/b1sl/tests/test_03_items_endpoint.py +172 -0
  553. b1sl/b1sl/tests/test_04_serialnumberdetails_endpoint.py +181 -0
  554. b1sl/b1sl/tests/test_observability.py +153 -0
  555. b1sl/b1sl/tests/test_utils.py +24 -0
  556. b1sl/contrib/__init__.py +0 -0
  557. b1sl/contrib/django/__init__.py +15 -0
  558. b1sl/contrib/django/base.py +89 -0
  559. b1sl/contrib/django/odata_decode_middleware.py +14 -0
  560. b1sl/contrib/django/odata_transform_url_middleware.py +15 -0
  561. b1sl/py.typed +0 -0
  562. b1sl/saphdb/__init__.py +19 -0
  563. b1sl/saphdb/adapter.py +24 -0
  564. b1sl/saphdb/client.py +50 -0
  565. b1sl/saphdb/config.py +68 -0
  566. b1sl/saphdb/endpoints/serialnumberdetailodbc.py +100 -0
  567. b1sl/saphdb/exceptions/exceptions.py +19 -0
  568. b1sl/saphdb/main.py +18 -0
  569. b1sl/saphdb/models/result.py +18 -0
  570. b1sl/saphdb/models/serial.py +37 -0
  571. b1sl/saphdb/odbc_adapter.py +220 -0
  572. b1sl/saphdb/tests/__init__.py +0 -0
  573. b1sl/saphdb/tests/test_01_settings.py +37 -0
  574. b1sl/saphdb/tests/test_02_odbc_adapter.py +96 -0
  575. b1sl/saphdb/tests/test_04_serialnumberdetails_endpoint.py +131 -0
  576. b1sl_python-0.1.0.dist-info/METADATA +169 -0
  577. b1sl_python-0.1.0.dist-info/RECORD +579 -0
  578. b1sl_python-0.1.0.dist-info/WHEEL +4 -0
  579. b1sl_python-0.1.0.dist-info/licenses/LICENSE +21 -0
File without changes
@@ -0,0 +1,24 @@
1
+ from .._generated.entities.inventory import Item as _Item
2
+
3
+
4
+ class Item(_Item):
5
+ """
6
+ Manual override for Item entity to add business logic.
7
+ """
8
+
9
+ @property
10
+ def available_stock(self) -> float:
11
+ """
12
+ Calculated available stock based on standard SAP logic:
13
+ Available = OnHand - IsCommited + OnOrder
14
+
15
+ Mapping:
16
+ - OnHand: quantity_on_stock
17
+ - IsCommited: quantity_ordered_by_customers
18
+ - OnOrder: quantity_ordered_from_vendors
19
+ """
20
+ on_hand = self.quantity_on_stock or 0.0
21
+ committed = self.quantity_ordered_by_customers or 0.0
22
+ ordered = self.quantity_ordered_from_vendors or 0.0
23
+
24
+ return on_hand - committed + ordered
@@ -0,0 +1,209 @@
1
+ """
2
+ b1sl.b1sl.models.base
3
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
+ Single source of truth for the shared B1Model base class.
5
+
6
+ All SAP B1 Pydantic models in this SDK must inherit from B1Model, never
7
+ directly from pydantic.BaseModel. This guarantees a consistent config
8
+ across the whole model hierarchy:
9
+
10
+ - ``extra='allow'`` — unknown UDFs (U_*) returned by SAP are preserved
11
+ instead of causing a ValidationError.
12
+ - ``populate_by_name=True`` — fields can be set by their Python name
13
+ OR by their SAP alias (whichever is more convenient at the call site).
14
+
15
+ Inbound normalisation contract
16
+ -------------------------------
17
+ ``B1Model`` handles SAP-specific encodings transparently via a
18
+ ``model_validator(mode='before')`` so every subclass automatically
19
+ receives clean Python values:
20
+
21
+ * ``"tYES"`` / ``"tNO"`` → ``bool``
22
+ * ``"/Date(1735689600000)/"`` → ISO date string ``"2025-01-01"``
23
+
24
+ >>> from b1sl.b1sl.models.base import B1Model
25
+ >>> from pydantic import Field
26
+ >>> class MyModel(B1Model):
27
+ ... active: bool | None = Field(None, alias="Active")
28
+ ... created: str | None = Field(None, alias="CreateDate")
29
+ >>> MyModel.model_validate({"Active": "tYES", "CreateDate": "/Date(1735689600000)/"})
30
+ MyModel(active=True, created='2025-01-01')
31
+
32
+ Outbound serialisation contract
33
+ ---------------------------------
34
+ ``to_api_payload()`` reverses the normalisation so SAP receives its native
35
+ format, and enforces ``exclude_unset=True`` to prevent accidental null-
36
+ overwrites on PATCH requests:
37
+
38
+ * ``bool`` → ``"tYES"`` / ``"tNO"``
39
+ * ``datetime.date`` → ISO string ``"YYYY-MM-DD"``
40
+ * ``Valid=True`` → also sets ``Frozen="tNO"`` (SAP invariant)
41
+ """
42
+
43
+ from __future__ import annotations
44
+
45
+ import re
46
+ from datetime import date, datetime, timezone
47
+ from enum import Enum
48
+ from typing import Annotated, Any
49
+
50
+ from pydantic import BaseModel, BeforeValidator, ConfigDict, model_validator
51
+
52
+ # SAP boolean sentinel values — exact set used by the Service Layer.
53
+ _SAP_YES: str = "tYES"
54
+ _SAP_NO: str = "tNO"
55
+
56
+ _SAP_BOOL_TRUE = {"boyes", "tyes", "y", "yes", "true", "1"}
57
+ _SAP_BOOL_FALSE = {"bono", "tno", "n", "no", "false", "0"}
58
+
59
+
60
+ def _coerce_sap_boolean(v: Any) -> Any:
61
+ if isinstance(v, str):
62
+ vl = v.lower()
63
+ if vl in _SAP_BOOL_TRUE:
64
+ return True
65
+ elif vl in _SAP_BOOL_FALSE:
66
+ return False
67
+ return v
68
+
69
+
70
+ SapBool = Annotated[bool, BeforeValidator(_coerce_sap_boolean)]
71
+
72
+ # /Date(milliseconds_since_epoch)/ — the OData v2 date format SAP uses.
73
+ _SAP_DATE_RE = re.compile(r"^/Date\((\d+)\)/$")
74
+
75
+
76
+ class B1Model(BaseModel):
77
+ """
78
+ Base for every SAP B1 Pydantic model in the SDK.
79
+
80
+ Subclass this instead of ``pydantic.BaseModel`` to inherit:
81
+
82
+ * Automatic ``/Date(ms)/`` → ISO date string coercion on ingest.
83
+ * ``extra='allow'`` — unknown UDFs (U_* fields) round-trip cleanly.
84
+ * ``populate_by_name=True`` — both Python name and SAP alias accepted.
85
+ * ``to_api_payload()`` — safe outbound serialisation:
86
+ - ``exclude_unset=True`` to prevent over-posting on PATCH.
87
+ - ``bool`` → ``"tYES"``/``"tNO"``
88
+ - ``date`` → ISO string
89
+ - ``Valid`` presence → auto-sets ``Frozen`` to the inverse.
90
+
91
+ UDF Example::
92
+
93
+ class MyItem(B1Model):
94
+ item_code: str = Field(alias="ItemCode")
95
+ custom_field: str | None = Field(None, alias="U_MyCustomField")
96
+
97
+ Because ``extra='allow'`` is set, any *additional* UDFs returned by SAP
98
+ that are not explicitly declared on the subclass are stored in
99
+ ``model.__pydantic_extra__`` and round-trip cleanly through
100
+ ``to_api_payload()``.
101
+ """
102
+
103
+ model_config = ConfigDict(
104
+ populate_by_name=True, # accept both field name and alias
105
+ extra="allow", # preserve unknown SAP UDFs (U_* fields)
106
+ arbitrary_types_allowed=True,
107
+ )
108
+
109
+ # ── Inbound coercion (SAP → Python) ─────────────────────────────────── #
110
+
111
+ @model_validator(mode="before")
112
+ @classmethod
113
+ def _coerce_sap_primitives(cls, data: Any) -> Any:
114
+ """
115
+ Coerce SAP string sentinels to native Python types before
116
+ field-level validation runs.
117
+
118
+ Conversions applied:
119
+ * "/Date(1735689600000)/" → "2025-01-01" (ISO date string)
120
+ * "tYES" / "tNO" etc → bool
121
+ """
122
+ if not isinstance(data, dict):
123
+ return data
124
+
125
+ coerced: dict[str, Any] = {}
126
+ for key, val in data.items():
127
+ if isinstance(val, str):
128
+ # 1. Check for Dates
129
+ m = _SAP_DATE_RE.match(val)
130
+ if m:
131
+ epoch_ms = int(m.group(1))
132
+ coerced[key] = (
133
+ datetime.fromtimestamp(epoch_ms / 1000, tz=timezone.utc)
134
+ .date()
135
+ .isoformat()
136
+ )
137
+ else:
138
+ # 2. Check for Booleans
139
+ coerced[key] = _coerce_sap_boolean(val)
140
+ else:
141
+ coerced[key] = val
142
+ return coerced
143
+
144
+ # ── Outbound serialisation (Python → SAP) ───────────────────────────── #
145
+
146
+ def get(self, field_alias: str, default: Any = None) -> Any:
147
+ """
148
+ Access a field's value by its SAP alias (e.g. 'CardCode') or Python name.
149
+
150
+ This is particularly useful when using the ``F`` (fields) constants to
151
+ read data from a model instance dynamically.
152
+
153
+ Args:
154
+ field_alias (str): The SAP alias or Python attribute name.
155
+ default (Any, optional): Value to return if the field is not found.
156
+ Defaults to None.
157
+
158
+ Returns:
159
+ Any: The field value if found, else the default.
160
+ """
161
+ # 1. Search in defined Pydantic fields
162
+ for name, field in self.model_fields.items():
163
+ if field.alias == field_alias or name == field_alias:
164
+ return getattr(self, name, default)
165
+
166
+ # 2. Search in 'extra' fields (UDFs) if allowed
167
+ if self.model_extra and field_alias in self.model_extra:
168
+ return self.model_extra[field_alias]
169
+
170
+ return default
171
+
172
+ def to_api_payload(self) -> dict:
173
+ """
174
+ Serialise this model to an API-ready dict safe for SAP Service Layer.
175
+
176
+ Behaviour:
177
+ * ``exclude_unset=True`` — only fields the developer *explicitly* set
178
+ are included, preventing accidental null-overwrites on PATCH.
179
+ * ``bool`` → ``"tYES"`` / ``"tNO"``
180
+ * ``datetime.date`` → ISO string ``"YYYY-MM-DD"``
181
+ * If ``Valid`` is in the payload, ``Frozen`` is automatically set to
182
+ the inverse value (SAP requires both fields to be kept in sync).
183
+
184
+ Fields explicitly set to ``None`` **are** included (the developer
185
+ intended to clear that SAP field).
186
+
187
+ Outputs SAP field aliases (not Python attribute names) and includes
188
+ any extra UDF fields stored in ``__pydantic_extra__``.
189
+ """
190
+ raw: dict[str, Any] = self.model_dump(by_alias=True, exclude_unset=True)
191
+
192
+ encoded: dict[str, Any] = {}
193
+ for key, val in raw.items():
194
+ if isinstance(val, bool):
195
+ encoded[key] = _SAP_YES if val else _SAP_NO
196
+ elif isinstance(val, date):
197
+ encoded[key] = val.isoformat()
198
+ elif isinstance(val, Enum):
199
+ # For BoYesNoEnum and others, we might need special handling if they are IntEnums but represent booleans
200
+ if val.name in ("tYES", "boYES"):
201
+ encoded[key] = _SAP_YES
202
+ elif val.name in ("tNO", "boNO"):
203
+ encoded[key] = _SAP_NO
204
+ else:
205
+ encoded[key] = val.value
206
+ else:
207
+ encoded[key] = val
208
+
209
+ return encoded
@@ -0,0 +1,50 @@
1
+ """
2
+ b1sl.b1sl.models.odata_query_model
3
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
+ Typed container for OData v4 query parameters.
5
+
6
+ ``ODataQueryModel`` is used internally by ``BaseResource._build_odata_params``
7
+ to construct validated, serialisable query-parameter dicts. Using a Pydantic
8
+ model here gives us:
9
+
10
+ * ``extra='forbid'`` — typos in keyword arguments raise a ``ValidationError``
11
+ immediately instead of silently being ignored by the HTTP client.
12
+ * A single ``build_query_params()`` method that strips ``None`` values and
13
+ coerces all parameter values to strings as required by ``requests``.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ from pydantic import BaseModel, ConfigDict, Field
19
+
20
+
21
+ class ODataQueryModel(BaseModel):
22
+ """Typed representation of OData v4 system query options.
23
+
24
+ All fields are optional; only non-``None`` fields are included in the
25
+ generated query-parameter dict.
26
+ """
27
+
28
+ select: str | None = Field(None, alias="$select")
29
+ filter_: str | None = Field(None, alias="$filter")
30
+ order_by: str | None = Field(None, alias="$orderby")
31
+ top: int | None = Field(None, alias="$top")
32
+ skip: int | None = Field(None, alias="$skip")
33
+ expand: str | None = Field(None, alias="$expand")
34
+ format: str | None = Field(None, alias="$format")
35
+ count: bool | None = Field(None, alias="$count")
36
+ search: str | None = Field(None, alias="$search")
37
+
38
+ model_config = ConfigDict(
39
+ extra="forbid", # reject unknown keys — catches query-param typos
40
+ populate_by_name=True, # allow both Python name and OData alias
41
+ )
42
+
43
+ def build_query_params(self) -> dict[str, str]:
44
+ """Return a ``{str: str}`` dict suitable for ``requests`` ``params=``.
45
+
46
+ Only set (non-``None``) fields are included. OData alias names
47
+ (e.g. ``"$select"``) are used as keys.
48
+ """
49
+ raw = self.model_dump(by_alias=True, exclude_none=True)
50
+ return {k: str(v) for k, v in raw.items()}
@@ -0,0 +1,85 @@
1
+ """
2
+ b1sl.b1sl.models.paginated_result
3
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
+ Generic container for a single SAP B1 OData page.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from typing import (
10
+ Any,
11
+ Generic,
12
+ Iterator,
13
+ )
14
+
15
+ from b1sl.b1sl._types import T
16
+
17
+
18
+ class PaginatedResult(Generic[T]):
19
+ """
20
+ Wraps one page of SAP B1 OData results together with pagination metadata.
21
+
22
+ Attributes:
23
+ data: An **iterator** yielding validated model instances for
24
+ this page. See the warning below.
25
+ metadata: The ``odata.metadata`` URL string returned by SAP, if any.
26
+ next_params: Query-param dict for the next page (from ``odata.nextLink``),
27
+ or ``None`` if this is the last page.
28
+
29
+ .. warning:: ``data`` is a **one-shot generator**.
30
+
31
+ Iterating over ``data`` a second time returns nothing::
32
+
33
+ result = client.items.list()
34
+ first = list(result.data) # ✅ correct
35
+ second = list(result.data) # ❌ empty — generator exhausted!
36
+
37
+ To consume the page multiple times, call :meth:`to_list` **once** and
38
+ keep a reference to the returned list::
39
+
40
+ items = result.to_list()
41
+ print(items[0]) # ✅ safe — list is cached internally
42
+ print(items[-1]) # ✅ still fine
43
+ """
44
+
45
+ def __init__(
46
+ self,
47
+ data: Iterator[T],
48
+ metadata: str | None = None,
49
+ next_params: dict[str, Any] | None = None,
50
+ ) -> None:
51
+ self._data_iter: Iterator[T] = data
52
+ self._data_cache: list[T] | None = None
53
+ self.metadata = metadata
54
+ self.next_params = next_params
55
+
56
+ @property
57
+ def data(self) -> Iterator[T]:
58
+ """
59
+ One-shot iterator over this page's records.
60
+
61
+ If you have already called :meth:`to_list`, subsequent accesses to
62
+ ``data`` will replay the cached list so it is not empty.
63
+ """
64
+ if self._data_cache is not None:
65
+ return iter(self._data_cache)
66
+ return self._data_iter
67
+
68
+ def to_list(self) -> list[T]:
69
+ """
70
+ Materialise the page into a list and cache it.
71
+
72
+ Safe to call multiple times — the generator is consumed only once and
73
+ the result is stored in ``_data_cache`` for all future accesses via
74
+ either ``to_list()`` or the ``data`` property.
75
+
76
+ Returns:
77
+ A list of validated model instances for this page.
78
+ """
79
+ if self._data_cache is None:
80
+ self._data_cache = list(self._data_iter)
81
+ return self._data_cache
82
+
83
+ def __iter__(self) -> Iterator[T]:
84
+ """Allow ``for item in paginated_result`` to work transparently."""
85
+ return self.data
@@ -0,0 +1,17 @@
1
+ from __future__ import annotations
2
+
3
+ from pydantic import BaseModel, ConfigDict
4
+
5
+
6
+ class Result(BaseModel):
7
+ status_code: int
8
+ message: str = ""
9
+ data: dict | None = None
10
+ next_link: str | None = None
11
+ next_params: dict | None = None
12
+ metadata: str | None = None
13
+
14
+ # Update configuration for Pydantic V2
15
+ model_config = ConfigDict(
16
+ extra="allow" # Allows extra fields not explicitly defined
17
+ )
@@ -0,0 +1,11 @@
1
+ """
2
+ b1sl.b1sl.resources — public resource re-exports.
3
+ """
4
+
5
+ from b1sl.b1sl.resources.base import GenericResource
6
+ from b1sl.b1sl.resources.udo import UDOResource
7
+
8
+ __all__ = [
9
+ "GenericResource",
10
+ "UDOResource",
11
+ ]
File without changes
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING, Any
3
+ from b1sl.b1sl.resources.base import GenericResource
4
+
5
+ if TYPE_CHECKING:
6
+ from ...models._generated._types import *
7
+
8
+ class AccountCategoryService(GenericResource["AccountCategory"]):
9
+ """This entity enables you to manipulate 'AccountCategory'."""
10
+ endpoint = "AccountCategory"
11
+
12
+ def __init__(self, adapter):
13
+ from ...models._generated._types import AccountCategory
14
+ self.model = AccountCategory
15
+ super().__init__(adapter)
@@ -0,0 +1,21 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING, Any
3
+ from b1sl.b1sl.resources.base import GenericResource
4
+
5
+ if TYPE_CHECKING:
6
+ from ...models._generated._types import *
7
+
8
+ class AccountCategoryService(GenericResource[Any]):
9
+ endpoint = "AccountCategoryService"
10
+
11
+ def __init__(self, adapter):
12
+ self.model = None
13
+ super().__init__(adapter)
14
+
15
+ # --- Actions ---
16
+
17
+ def get_category_list(self, payload: dict | None = None) -> Any:
18
+ """POST AccountCategoryService_GetCategoryList
19
+ Invoke the method 'GetCategoryList' on this service.
20
+ """
21
+ return self._adapter.post(f"AccountCategoryService_GetCategoryList", data=payload)
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING, Any
3
+ from b1sl.b1sl.resources.base import GenericResource
4
+
5
+ if TYPE_CHECKING:
6
+ from ...models._generated._types import *
7
+
8
+ class AccountSegmentationCategoriesService(GenericResource["AccountSegmentationCategory"]):
9
+ """This entity enables you to manipulate 'AccountSegmentationCategories'. It represents the categories under each of the account segments."""
10
+ endpoint = "AccountSegmentationCategories"
11
+
12
+ def __init__(self, adapter):
13
+ from ...models._generated._types import AccountSegmentationCategory
14
+ self.model = AccountSegmentationCategory
15
+ super().__init__(adapter)
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING, Any
3
+ from b1sl.b1sl.resources.base import GenericResource
4
+
5
+ if TYPE_CHECKING:
6
+ from ...models._generated._types import *
7
+
8
+ class AccountSegmentationsService(GenericResource["AccountSegmentation"]):
9
+ """This entity enables you to manipulate 'AccountSegmentations'."""
10
+ endpoint = "AccountSegmentations"
11
+
12
+ def __init__(self, adapter):
13
+ from ...models._generated._types import AccountSegmentation
14
+ self.model = AccountSegmentation
15
+ super().__init__(adapter)
@@ -0,0 +1,33 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING, Any
3
+ from b1sl.b1sl.resources.base import GenericResource
4
+
5
+ if TYPE_CHECKING:
6
+ from ...models._generated._types import *
7
+
8
+ class AccountsService(GenericResource[Any]):
9
+ endpoint = "AccountsService"
10
+
11
+ def __init__(self, adapter):
12
+ self.model = None
13
+ super().__init__(adapter)
14
+
15
+ # --- Actions ---
16
+
17
+ def create_open_balance(self, payload: dict | None = None) -> Any:
18
+ """POST AccountsService_CreateOpenBalance
19
+ Invoke the method 'CreateOpenBalance' on this service by specifying the payload 'OpenningBalanceAccount,GLAccounts' in the JSON format.
20
+
21
+ Example:
22
+ ```json
23
+ {
24
+ "GLAccounts": {
25
+ "Code": "test"
26
+ },
27
+ "OpenningBalanceAccount": {
28
+ "Date": "2016-08-29"
29
+ }
30
+ }
31
+ ```
32
+ """
33
+ return self._adapter.post(f"AccountsService_CreateOpenBalance", data=payload)
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING, Any
3
+ from b1sl.b1sl.resources.base import GenericResource
4
+
5
+ if TYPE_CHECKING:
6
+ from ...models._generated._types import *
7
+
8
+ class AccrualTypesService(GenericResource["AccrualType"]):
9
+ """This entity enables you to manipulate 'AccrualTypes'."""
10
+ endpoint = "AccrualTypes"
11
+
12
+ def __init__(self, adapter):
13
+ from ...models._generated._types import AccrualType
14
+ self.model = AccrualType
15
+ super().__init__(adapter)
@@ -0,0 +1,21 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING, Any
3
+ from b1sl.b1sl.resources.base import GenericResource
4
+
5
+ if TYPE_CHECKING:
6
+ from ...models._generated._types import *
7
+
8
+ class AccrualTypesService(GenericResource[Any]):
9
+ endpoint = "AccrualTypesService"
10
+
11
+ def __init__(self, adapter):
12
+ self.model = None
13
+ super().__init__(adapter)
14
+
15
+ # --- Actions ---
16
+
17
+ def get_accrual_type_list(self, payload: dict | None = None) -> Any:
18
+ """POST AccrualTypesService_GetAccrualTypeList
19
+ Invoke the method 'GetAccrualTypeList' on this service.
20
+ """
21
+ return self._adapter.post(f"AccrualTypesService_GetAccrualTypeList", data=payload)
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING, Any
3
+ from b1sl.b1sl.resources.base import GenericResource
4
+
5
+ if TYPE_CHECKING:
6
+ from ...models._generated._types import *
7
+
8
+ class ActivitiesService(GenericResource["Activity"]):
9
+ """This entity enables you to manipulate 'Activities'."""
10
+ endpoint = "Activities"
11
+
12
+ def __init__(self, adapter):
13
+ from ...models._generated._types import Activity
14
+ self.model = Activity
15
+ super().__init__(adapter)
@@ -0,0 +1,109 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING, Any
3
+ from b1sl.b1sl.resources.base import GenericResource
4
+
5
+ if TYPE_CHECKING:
6
+ from ...models._generated._types import *
7
+
8
+ class ActivitiesService(GenericResource[Any]):
9
+ endpoint = "ActivitiesService"
10
+
11
+ def __init__(self, adapter):
12
+ self.model = None
13
+ super().__init__(adapter)
14
+
15
+ # --- Actions ---
16
+
17
+ def delete_single_instance_from_series(self, payload: dict | None = None) -> Any:
18
+ """POST ActivitiesService_DeleteSingleInstanceFromSeries
19
+ Invoke the method 'DeleteSingleInstanceFromSeries' on this service by specifying the payload 'ActivityInstanceParams' in the JSON format.
20
+
21
+ Example:
22
+ ```json
23
+ {
24
+ "ActivityInstanceParams": {
25
+ "ActivityCode": "3",
26
+ "InstanceDate": "2016-08-30"
27
+ }
28
+ }
29
+ ```
30
+ """
31
+ return self._adapter.post(f"ActivitiesService_DeleteSingleInstanceFromSeries", data=payload)
32
+
33
+ def get_activity_list(self, payload: dict | None = None) -> Any:
34
+ """POST ActivitiesService_GetActivityList
35
+ Invoke the method 'GetActivityList' on this service.
36
+ """
37
+ return self._adapter.post(f"ActivitiesService_GetActivityList", data=payload)
38
+
39
+ def get_list_by_attend_user(self, payload: dict | None = None) -> Any:
40
+ """POST ActivitiesService_GetListByAttendUser
41
+ """
42
+ return self._adapter.post(f"ActivitiesService_GetListByAttendUser", data=payload)
43
+
44
+ def get_single_instance_from_series(self, payload: dict | None = None) -> Any:
45
+ """POST ActivitiesService_GetSingleInstanceFromSeries
46
+ Invoke the method 'GetSingleInstanceFromSeries' on this service by specifying the payload 'ActivityInstanceParams' in the JSON format.
47
+
48
+ Example:
49
+ ```json
50
+ {
51
+ "ActivityInstanceParams": {
52
+ "ActivityCode": "3",
53
+ "InstanceDate": "2016-08-30"
54
+ }
55
+ }
56
+ ```
57
+ """
58
+ return self._adapter.post(f"ActivitiesService_GetSingleInstanceFromSeries", data=payload)
59
+
60
+ def get_top_n_activity_instances(self, payload: dict | None = None) -> Any:
61
+ """POST ActivitiesService_GetTopNActivityInstances
62
+ Invoke the method 'GetTopNActivityInstances' on this service by specifying the payload 'ActivityInstancesListParams' in the JSON format.
63
+
64
+ Example:
65
+ ```json
66
+ {
67
+ "ActivityInstancesListParams": {
68
+ "ActivityInstancesListParams": {
69
+ "StartDate": "2016-08-30"
70
+ }
71
+ }
72
+ }
73
+ ```
74
+ """
75
+ return self._adapter.post(f"ActivitiesService_GetTopNActivityInstances", data=payload)
76
+
77
+ def init_data(self, payload: dict | None = None) -> Any:
78
+ """POST ActivitiesService_InitData
79
+ """
80
+ return self._adapter.post(f"ActivitiesService_InitData", data=payload)
81
+
82
+ def update_single_instance_in_series(self, payload: dict | None = None) -> Any:
83
+ """POST ActivitiesService_UpdateSingleInstanceInSeries
84
+ Invoke the method 'UpdateSingleInstanceInSeries' on this service by specifying the payload 'Activity' in the JSON format.
85
+
86
+ Example:
87
+ ```json
88
+ {
89
+ "Activity": {
90
+ "ActivityDate": "2016-08-30",
91
+ "ActivityTime": "08:13:00",
92
+ "CardCode": "C01",
93
+ "DocEntry": "3",
94
+ "DocNum": "1",
95
+ "DocType": "17",
96
+ "Duration": 15,
97
+ "DurationType": "du_Minuts",
98
+ "EndDueDate": "2016-08-30",
99
+ "EndTime": "08:28:00",
100
+ "Reminder": "tYES",
101
+ "ReminderPeriod": 15,
102
+ "ReminderType": "du_Minuts",
103
+ "StartDate": "2016-08-30",
104
+ "StartTime": "08:13:00"
105
+ }
106
+ }
107
+ ```
108
+ """
109
+ return self._adapter.post(f"ActivitiesService_UpdateSingleInstanceInSeries", data=payload)