b1sl-python 0.1.0__tar.gz
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.
- b1sl_python-0.1.0/.env.example +29 -0
- b1sl_python-0.1.0/.gitignore +229 -0
- b1sl_python-0.1.0/LICENSE +21 -0
- b1sl_python-0.1.0/Makefile +59 -0
- b1sl_python-0.1.0/PKG-INFO +169 -0
- b1sl_python-0.1.0/README.md +129 -0
- b1sl_python-0.1.0/ROADMAP.md +23 -0
- b1sl_python-0.1.0/configs/dev.json +16 -0
- b1sl_python-0.1.0/configs/qa.json.example +16 -0
- b1sl_python-0.1.0/pyproject.toml +106 -0
- b1sl_python-0.1.0/src/b1sl/__init__.py +5 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/__init__.py +56 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/_types.py +28 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/adapter.py +40 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/adapter_protocol.py +28 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/async_client.py +268 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/async_rest_adapter.py +347 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/base_adapter.py +394 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/client.py +112 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/config.py +138 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/config_manager.py +77 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/contrib/__init__.py +14 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/contrib/django/__init__.py +13 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/contrib/django/middleware/__init__.py +27 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/contrib/django/middleware/base.py +89 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/contrib/django/middleware/odata_decode_middleware.py +20 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/contrib/django/middleware/odata_transform_url_middleware.py +20 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/entities/__init__.py +2209 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/environment.py +36 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/exceptions/exceptions.py +142 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/fields/__init__.py +2020 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/fields/_generated/__init__.py +0 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/fields/_generated/complex_types.py +6926 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/fields/_generated/entities/__init__.py +0 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/fields/_generated/entities/businesspartners.py +544 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/fields/_generated/entities/finance.py +451 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/fields/_generated/entities/general.py +4587 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/fields/_generated/entities/inventory.py +761 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/fields/_generated/entities/production.py +256 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/fields/_generated/entities/purchasing.py +53 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/fields/_generated/entities/sales.py +244 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/logging_utils.py +119 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/__init__.py +13 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/_generated/__init__.py +0 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/_generated/_types.py +5 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/_generated/complex_types.py +6929 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/_generated/entities/__init__.py +581 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/_generated/entities/businesspartners.py +565 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/_generated/entities/finance.py +472 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/_generated/entities/general.py +4831 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/_generated/entities/inventory.py +786 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/_generated/entities/production.py +272 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/_generated/entities/purchasing.py +64 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/_generated/entities/sales.py +263 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/_generated/enums.py +3501 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/_generated/resources/__init__.py +0 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/_overrides/inventory.py +24 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/base.py +209 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/odata_query_model.py +50 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/paginated_result.py +85 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/models/result.py +17 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/__init__.py +11 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/__init__.py +0 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/account_category.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/account_category_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/account_segmentation_categories.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/account_segmentations.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/accounts_service.py +33 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/accrual_types.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/accrual_types_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/activities.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/activities_service.py +109 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/activity_locations.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/activity_recipient_lists.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/activity_recipient_lists_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/activity_statuses.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/activity_types.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/additional_expenses.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/address_service.py +38 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/alert_managements.py +16 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/alternate_cat_num.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/alternative_items_service.py +113 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/approval_requests.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/approval_requests_service.py +33 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/approval_stages.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/approval_stages_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/approval_templates.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/approval_templates_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_capitalization.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_capitalization_credit_memo.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_capitalization_credit_memo_service.py +37 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_capitalization_service.py +37 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_classes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_classes_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_depreciation_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_depreciation_groups_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_groups_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_manual_depreciation.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_manual_depreciation_service.py +37 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_retirement.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_retirement_service.py +37 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_transfer.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/asset_transfer_service.py +37 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/attachments2.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/attribute_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/attribute_groups_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bank_charges_allocation_codes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bank_charges_allocation_codes_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bank_pages.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bank_statements.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bank_statements_service.py +32 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/banks.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bar_codes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bar_codes_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/batch_number_details.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bill_of_exchange_transactions.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bin_location_attributes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bin_location_attributes_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bin_location_fields.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bin_location_fields_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bin_locations.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bin_locations_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/blanket_agreements.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/blanket_agreements_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/boe_document_types.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/boe_document_types_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/boe_instructions.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/boe_instructions_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/boe_lines_service.py +30 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/boe_portfolios.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/boe_portfolios_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bp_fiscal_registry_id.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bp_opening_balance_service.py +41 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/bp_priorities.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/branches.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/branches_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/brazil_beverage_indexers.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/brazil_beverage_indexers_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/brazil_fuel_indexers.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/brazil_fuel_indexers_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/brazil_multi_indexers.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/brazil_numeric_indexers.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/brazil_string_indexers.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/budget_distributions.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/budget_scenarios.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/budgets.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/business_partner_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/business_partner_properties.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/business_partner_properties_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/business_partners.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/business_partners_service.py +47 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/business_places.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/campaign_response_type.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/campaign_response_type_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/campaigns.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/campaigns_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/cash_discounts.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/cash_discounts_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/cash_flow_line_items.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/cash_flow_line_items_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/certificate_series.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/certificate_series_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/change_logs_service.py +51 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/chart_of_accounts.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/check_lines_service.py +38 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/checksfor_payment.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/choose_from_list.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/client_mixin.py +3920 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/closing_date_procedure.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/cockpits.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/cockpits_service.py +46 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/commission_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/company_service.py +410 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/contacts.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/contract_templates.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/correction_invoice.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/correction_invoice_reversal.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/correction_invoice_reversal_service.py +65 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/correction_invoice_service.py +78 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/correction_purchase_invoice.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/correction_purchase_invoice_reversal.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/correction_purchase_invoice_reversal_service.py +65 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/correction_purchase_invoice_service.py +78 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/cost_center_types.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/cost_center_types_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/cost_element_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/cost_elements.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/counties.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/counties_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/countries.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/countries_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/credit_card_payments.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/credit_cards.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/credit_lines_service.py +38 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/credit_notes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/credit_notes_service.py +100 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/credit_payment_methods.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/currencies.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/customer_equipment_cards.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/customs_declaration.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/customs_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/cycle_count_determinations.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/cycle_count_determinations_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/dashboard_packages_service.py +28 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/deductible_tax_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/deductible_taxes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/deduction_tax_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/deduction_tax_hierarchies.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/deduction_tax_sub_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/deduction_tax_sub_groups_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/delivery_notes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/delivery_notes_service.py +85 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/departments.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/departments_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/deposits.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/deposits_service.py +53 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/depreciation_areas.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/depreciation_areas_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/depreciation_type_pools.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/depreciation_type_pools_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/depreciation_types.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/depreciation_types_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/determination_criterias.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/determination_criterias_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/dimensions.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/dimensions_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/distribution_rules.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/distribution_rules_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/dnf_code_setup.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/dnf_code_setup_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/down_payments.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/down_payments_service.py +68 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/drafts.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/drafts_service.py +86 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/dunning_letters.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/dunning_terms.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/dunning_terms_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/dynamic_system_strings.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/electronic_communication_action_service.py +122 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/electronic_communication_actions_service.py +119 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/electronic_file_formats.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/electronic_file_formats_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/email_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/email_groups_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/employee_id_type.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/employee_id_type_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/employee_position.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/employee_position_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/employee_roles_setup.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/employee_roles_setup_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/employee_status.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/employee_status_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/employee_transfers.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/employee_transfers_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/employees_info.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/employment_category_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/employment_categorys.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/enhanced_discount_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/enhanced_discount_groups_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/exceptional_event_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/exceptional_events.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/extended_translations.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/extended_translations_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/external_calls_service.py +54 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/external_reconciliations_service.py +104 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/fa_account_determinations.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/fa_account_determinations_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/factoring_indicators.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/financial_years.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/financial_years_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/fiscal_printer.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/fiscal_printer_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/fixed_asset_items_service.py +55 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/form_preferences.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/formatted_searches.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/forms1099.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/gl_account_advanced_rules.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/gl_account_advanced_rules_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/goods_return_request.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/goods_return_request_service.py +69 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/gov_pay_codes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/gov_pay_codes_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/gt_is_service.py +28 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/holidays.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/house_bank_accounts.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/incoming_payments.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/india_hsn.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/india_hsn_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/industries.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/integration_packages_configure.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/integration_packages_configure_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/internal_reconciliations.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/internal_reconciliations_service.py +51 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/intrastat_configuration.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/intrastat_configuration_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/inventory_countings.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/inventory_countings_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/inventory_cycles.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/inventory_gen_entries.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/inventory_gen_entry_service.py +67 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/inventory_gen_exit_service.py +66 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/inventory_gen_exits.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/inventory_opening_balances.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/inventory_opening_balances_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/inventory_postings.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/inventory_postings_service.py +34 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/inventory_transfer_requests.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/inventory_transfer_requests_service.py +43 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/invoices.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/invoices_service.py +100 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/item_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/item_properties.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/items.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/journal_entries.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/journal_entry_document_type_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/journal_entry_document_types.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/journal_vouchers_service.py +45 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/knowledge_base_solutions.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/kp_is.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/kp_is_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/landed_costs.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/landed_costs_codes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/landed_costs_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/legal_data.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/length_measures.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/license_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/local_era.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/manufacturers.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/material_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/material_groups_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/material_revaluation.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/material_revaluation_fifo_service.py +33 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/material_revaluation_snb_service.py +33 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/messages.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/messages_service.py +35 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/mobile_add_on_setting.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/mobile_add_on_setting_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/mobile_app_service.py +240 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/multi_language_translations.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/nature_of_assessees.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/nature_of_assessees_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/ncm_codes_setup.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/ncm_codes_setup_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/nf_models.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/nf_models_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/nf_tax_categories.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/nf_tax_categories_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/nota_fiscal_cfop.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/nota_fiscal_cst.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/nota_fiscal_usage.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/occurrence_codes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/occurrence_codes_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/orders.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/orders_service.py +94 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/packages_types.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/partners_setups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/partners_setups_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/payment_blocks.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/payment_blocks_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/payment_calculation_service.py +37 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/payment_drafts.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/payment_reason_code_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/payment_reason_codes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/payment_run_export.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/payment_terms_types.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/payment_terms_types_service.py +28 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/pick_lists.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/pick_lists_service.py +78 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/pos_daily_summary.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/predefined_texts.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/predefined_texts_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/price_lists.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/product_trees.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/production_orders.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/profit_centers.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/profit_centers_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/project_management_configuration_service.py +333 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/project_management_service.py +104 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/project_management_time_sheet.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/project_managements.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/projects.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/projects_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_credit_notes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_credit_notes_service.py +85 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_delivery_notes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_delivery_notes_service.py +85 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_down_payments.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_down_payments_service.py +70 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_invoices.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_invoices_service.py +85 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_orders.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_orders_service.py +69 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_quotations.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_quotations_service.py +70 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_request_service.py +68 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_requests.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_returns.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_returns_service.py +85 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/purchase_tax_invoices.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/qr_code_service.py +33 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/query_auth_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/query_categories.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/query_service.py +29 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/queue.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/quotations.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/quotations_service.py +69 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/recurring_transaction_service.py +67 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/relationships.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/report_filter.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/report_filter_service.py +30 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/report_layouts_service.py +237 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/report_types.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/report_types_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/resource_capacities.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/resource_capacities_service.py +34 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/resource_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/resource_groups_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/resource_properties.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/resource_properties_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/resources.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/resources_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/retorno_codes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/retorno_codes_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/return_request.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/return_request_service.py +69 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/returns.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/returns_service.py +85 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/route_stages.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/route_stages_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_forecast.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_opportunities.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_opportunity_competitors_setup.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_opportunity_competitors_setup_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_opportunity_interests_setup.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_opportunity_interests_setup_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_opportunity_reasons_setup.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_opportunity_reasons_setup_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_opportunity_sources_setup.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_opportunity_sources_setup_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_persons.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_stages.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_tax_authorities.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_tax_authorities_types.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_tax_codes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sales_tax_invoices.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sbo_bob_service.py +89 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sections.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/sections_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/self_credit_memo_service.py +69 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/self_credit_memos.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/self_invoice_service.py +69 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/self_invoices.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/serial_number_details.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/series_service.py +305 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_call_origins.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_call_origins_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_call_problem_sub_types.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_call_problem_sub_types_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_call_problem_types.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_call_problem_types_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_call_solution_status.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_call_solution_status_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_call_status.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_call_status_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_call_types.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_call_types_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_calls.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_contracts.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_groups_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/service_tax_posting_service.py +36 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/shipping_types.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/short_link_mappings_service.py +26 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/special_prices.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/states.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/states_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/stock_takings.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/stock_transfer_draft_service.py +34 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/stock_transfer_drafts.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/stock_transfer_service.py +43 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/stock_transfers.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/target_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/target_groups_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/tax_code_determinations.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/tax_code_determinations_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/tax_code_determinations_tcd.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/tax_code_determinations_tcd_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/tax_invoice_report.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/tax_web_sites.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/tax_web_sites_service.py +27 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/teams.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/termination_reason.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/termination_reason_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/territories.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/tracking_notes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/tracking_notes_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/transaction_codes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/transaction_codes_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/transportation_document.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/tsr_exceptional_event_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/tsr_exceptional_events.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/unit_of_measurement_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/unit_of_measurement_groups_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/unit_of_measurements.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/unit_of_measurements_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/user_default_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/user_fields_md.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/user_keys_md.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/user_languages.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/user_menu_service.py +103 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/user_objects_md.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/user_permission_tree.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/user_queries.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/user_tables_md.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/users.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/users_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/value_mapping.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/value_mapping_communication.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/value_mapping_service.py +64 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/vat_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/vendor_payments.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/w_tax_type_code_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/w_tax_type_codes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/warehouse_locations.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/warehouse_sublevel_codes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/warehouse_sublevel_codes_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/warehouses.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_bookmark_tile_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_bookmark_tiles.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_dashboard_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_dashboards.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_form_setting_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_form_settings.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_launchpad_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_launchpads.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_listview_filter_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_listview_filters.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_notification_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_notifications.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_preference_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_preferences.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_recent_activities.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_recent_activity_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_variant_group_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_variant_groups.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_variant_service.py +21 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/web_client_variants.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/weight_measures.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/withholding_tax_codes.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/witholding_tax_definition.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/wizard_payment_methods.py +15 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/_generated/workflow_task_service.py +47 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/async_base.py +60 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/base.py +159 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/resources/udo.py +78 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/rest_adapter.py +351 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/testing.py +24 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/tests/__init__.py +0 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/tests/test_01_settings.py +60 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/tests/test_02_rest_adapter.py +177 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/tests/test_03_items_endpoint.py +172 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/tests/test_04_serialnumberdetails_endpoint.py +181 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/tests/test_observability.py +153 -0
- b1sl_python-0.1.0/src/b1sl/b1sl/tests/test_utils.py +24 -0
- b1sl_python-0.1.0/src/b1sl/contrib/__init__.py +0 -0
- b1sl_python-0.1.0/src/b1sl/contrib/django/__init__.py +15 -0
- b1sl_python-0.1.0/src/b1sl/contrib/django/base.py +89 -0
- b1sl_python-0.1.0/src/b1sl/contrib/django/odata_decode_middleware.py +14 -0
- b1sl_python-0.1.0/src/b1sl/contrib/django/odata_transform_url_middleware.py +15 -0
- b1sl_python-0.1.0/src/b1sl/py.typed +0 -0
- b1sl_python-0.1.0/src/b1sl/saphdb/__init__.py +19 -0
- b1sl_python-0.1.0/src/b1sl/saphdb/adapter.py +24 -0
- b1sl_python-0.1.0/src/b1sl/saphdb/client.py +50 -0
- b1sl_python-0.1.0/src/b1sl/saphdb/config.py +68 -0
- b1sl_python-0.1.0/src/b1sl/saphdb/endpoints/serialnumberdetailodbc.py +100 -0
- b1sl_python-0.1.0/src/b1sl/saphdb/exceptions/exceptions.py +19 -0
- b1sl_python-0.1.0/src/b1sl/saphdb/main.py +18 -0
- b1sl_python-0.1.0/src/b1sl/saphdb/models/result.py +18 -0
- b1sl_python-0.1.0/src/b1sl/saphdb/models/serial.py +37 -0
- b1sl_python-0.1.0/src/b1sl/saphdb/odbc_adapter.py +220 -0
- b1sl_python-0.1.0/src/b1sl/saphdb/tests/__init__.py +0 -0
- b1sl_python-0.1.0/src/b1sl/saphdb/tests/test_01_settings.py +37 -0
- b1sl_python-0.1.0/src/b1sl/saphdb/tests/test_02_odbc_adapter.py +96 -0
- b1sl_python-0.1.0/src/b1sl/saphdb/tests/test_04_serialnumberdetails_endpoint.py +131 -0
- b1sl_python-0.1.0/tests/__init__.py +0 -0
- b1sl_python-0.1.0/tests/conftest.py +167 -0
- b1sl_python-0.1.0/tests/fakes/__init__.py +0 -0
- b1sl_python-0.1.0/tests/fakes/fake_rest_adapter.py +174 -0
- b1sl_python-0.1.0/tests/fixtures/__init__.py +0 -0
- b1sl_python-0.1.0/tests/fixtures/mock_responses/items_list.json +15 -0
- b1sl_python-0.1.0/tests/fixtures/mock_responses/items_single.json +6 -0
- b1sl_python-0.1.0/tests/fixtures/test_data.py +20 -0
- b1sl_python-0.1.0/tests/integration/__init__.py +0 -0
- b1sl_python-0.1.0/tests/integration/cassettes/test_items_real/test_get_item_real.yaml +547 -0
- b1sl_python-0.1.0/tests/integration/cassettes/test_items_real/test_list_items_real.yaml +2537 -0
- b1sl_python-0.1.0/tests/integration/conftest.py +69 -0
- b1sl_python-0.1.0/tests/integration/test_items_real.py +32 -0
- b1sl_python-0.1.0/tests/test_async_adapter.py +114 -0
- b1sl_python-0.1.0/tests/test_b1sl_adapter.py +159 -0
- b1sl_python-0.1.0/tests/test_middleware.py +37 -0
- b1sl_python-0.1.0/tests/test_saphdb_adapter.py +40 -0
- b1sl_python-0.1.0/tests/unit/__init__.py +0 -0
- b1sl_python-0.1.0/tests/unit/mocks/items_list.json +12 -0
- b1sl_python-0.1.0/tests/unit/mocks/items_single.json +6 -0
- b1sl_python-0.1.0/tests/unit/test_items_mock.py +82 -0
- b1sl_python-0.1.0/tests/unit/test_rest_adapter.py +69 -0
- b1sl_python-0.1.0/tests/unit/test_service_calls.py +74 -0
- b1sl_python-0.1.0/uv.lock +821 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# SAP B1 - Configuración de Credenciales (Capa 2)
|
|
2
|
+
# COPIAR ESTE ARCHIVO A .env.test PARA PRUEBAS REALES
|
|
3
|
+
|
|
4
|
+
# Service Layer
|
|
5
|
+
B1SL_BASE_URL=https://localhost:50000/b1s/v2
|
|
6
|
+
B1SL_COMPANY_DB=SBODemoMX
|
|
7
|
+
B1SL_USERNAME=manager
|
|
8
|
+
B1SL_PASSWORD=sap
|
|
9
|
+
B1SL_SSL_VERIFY=0
|
|
10
|
+
|
|
11
|
+
# Entorno de ejecución del SDK
|
|
12
|
+
# Valores válidos: dev | test | prod
|
|
13
|
+
# - dev → logs en texto legible (default)
|
|
14
|
+
# - test → igual a dev, indica aislamiento de pruebas
|
|
15
|
+
# - prod → logs en JSON estructurado (para ELK, Datadog, etc.)
|
|
16
|
+
B1SL_ENV=dev
|
|
17
|
+
|
|
18
|
+
# Control de ejecución de tests de integración
|
|
19
|
+
# 1 = Ejecuta integración real (tests/integration/)
|
|
20
|
+
# 0 = Solo mocks (tests/unit/) o salta los marcados con @pytest.mark.integration
|
|
21
|
+
SAP_B1_INTEGRATION=0
|
|
22
|
+
|
|
23
|
+
# --- Advanced Tuning (Opcional) ---
|
|
24
|
+
# B1SL_REUSE_TOKEN=1
|
|
25
|
+
# B1SL_TOKEN_TIMEOUT=900
|
|
26
|
+
# B1SL_MAX_PAGE_SIZE=20
|
|
27
|
+
# B1SL_ETAG_CACHE_SIZE=256
|
|
28
|
+
# B1SL_CONNECT_TIMEOUT=10
|
|
29
|
+
# B1SL_READ_TIMEOUT=60
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py.cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
.pybuilder/
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
88
|
+
# .python-version
|
|
89
|
+
|
|
90
|
+
# pipenv
|
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
94
|
+
# install all needed dependencies.
|
|
95
|
+
# Pipfile.lock
|
|
96
|
+
|
|
97
|
+
# UV
|
|
98
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
99
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
100
|
+
# commonly ignored for libraries.
|
|
101
|
+
# uv.lock
|
|
102
|
+
|
|
103
|
+
# poetry
|
|
104
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
105
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
106
|
+
# commonly ignored for libraries.
|
|
107
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
108
|
+
# poetry.lock
|
|
109
|
+
# poetry.toml
|
|
110
|
+
|
|
111
|
+
# pdm
|
|
112
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
113
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
114
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
115
|
+
# pdm.lock
|
|
116
|
+
# pdm.toml
|
|
117
|
+
.pdm-python
|
|
118
|
+
.pdm-build/
|
|
119
|
+
|
|
120
|
+
# pixi
|
|
121
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
122
|
+
# pixi.lock
|
|
123
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
124
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
125
|
+
.pixi
|
|
126
|
+
|
|
127
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
128
|
+
__pypackages__/
|
|
129
|
+
|
|
130
|
+
# Celery stuff
|
|
131
|
+
celerybeat-schedule
|
|
132
|
+
celerybeat.pid
|
|
133
|
+
|
|
134
|
+
# Redis
|
|
135
|
+
*.rdb
|
|
136
|
+
*.aof
|
|
137
|
+
*.pid
|
|
138
|
+
|
|
139
|
+
# RabbitMQ
|
|
140
|
+
mnesia/
|
|
141
|
+
rabbitmq/
|
|
142
|
+
rabbitmq-data/
|
|
143
|
+
|
|
144
|
+
# ActiveMQ
|
|
145
|
+
activemq-data/
|
|
146
|
+
|
|
147
|
+
# SageMath parsed files
|
|
148
|
+
*.sage.py
|
|
149
|
+
|
|
150
|
+
# Environments
|
|
151
|
+
.env
|
|
152
|
+
.envrc
|
|
153
|
+
.venv
|
|
154
|
+
env/
|
|
155
|
+
venv/
|
|
156
|
+
ENV/
|
|
157
|
+
env.bak/
|
|
158
|
+
venv.bak/
|
|
159
|
+
|
|
160
|
+
# Spyder project settings
|
|
161
|
+
.spyderproject
|
|
162
|
+
.spyproject
|
|
163
|
+
|
|
164
|
+
# Rope project settings
|
|
165
|
+
.ropeproject
|
|
166
|
+
|
|
167
|
+
# mkdocs documentation
|
|
168
|
+
/site
|
|
169
|
+
|
|
170
|
+
# mypy
|
|
171
|
+
.mypy_cache/
|
|
172
|
+
.dmypy.json
|
|
173
|
+
dmypy.json
|
|
174
|
+
|
|
175
|
+
# Pyre type checker
|
|
176
|
+
.pyre/
|
|
177
|
+
|
|
178
|
+
# pytype static type analyzer
|
|
179
|
+
.pytype/
|
|
180
|
+
|
|
181
|
+
# Cython debug symbols
|
|
182
|
+
cython_debug/
|
|
183
|
+
|
|
184
|
+
# PyCharm
|
|
185
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
186
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
187
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
188
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
189
|
+
# .idea/
|
|
190
|
+
|
|
191
|
+
# Abstra
|
|
192
|
+
# Abstra is an AI-powered process automation framework.
|
|
193
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
194
|
+
# Learn more at https://abstra.io/docs
|
|
195
|
+
.abstra/
|
|
196
|
+
|
|
197
|
+
# Visual Studio Code
|
|
198
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
199
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
200
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
201
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
202
|
+
# .vscode/
|
|
203
|
+
|
|
204
|
+
# Ruff stuff:
|
|
205
|
+
.ruff_cache/
|
|
206
|
+
|
|
207
|
+
# PyPI configuration file
|
|
208
|
+
.pypirc
|
|
209
|
+
|
|
210
|
+
# Marimo
|
|
211
|
+
marimo/_static/
|
|
212
|
+
marimo/_lsp/
|
|
213
|
+
__marimo__/
|
|
214
|
+
|
|
215
|
+
# Streamlit
|
|
216
|
+
.streamlit/secrets.toml
|
|
217
|
+
# SAP B1 Test Secrets
|
|
218
|
+
.env.test
|
|
219
|
+
|
|
220
|
+
# SAP Metadata (Sensitive/Real info)
|
|
221
|
+
metadata/**/*.real.xml
|
|
222
|
+
metadata/**/*.real.json
|
|
223
|
+
|
|
224
|
+
# Vscode
|
|
225
|
+
.vscode/
|
|
226
|
+
|
|
227
|
+
# Agent specific
|
|
228
|
+
.agents/
|
|
229
|
+
skills-lock.json
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Eliceo Guzman
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# SAP B1 Python SDK - Testing & Development
|
|
2
|
+
|
|
3
|
+
.PHONY: help test test-vcr test-record test-demo test-ci coverage-html lint clean
|
|
4
|
+
|
|
5
|
+
# Default variables
|
|
6
|
+
PYTHONPATH := src:.
|
|
7
|
+
PYTEST := .venv/bin/pytest
|
|
8
|
+
VENV := .venv
|
|
9
|
+
|
|
10
|
+
help:
|
|
11
|
+
@echo "Available commands:"
|
|
12
|
+
@echo " make test - Run unit tests only (Fast, No network)"
|
|
13
|
+
@echo " make test-vcr - Run integration tests with recorded cassettes (Offline)"
|
|
14
|
+
@echo " make test-record - Record new VCR cassettes against a real SAP server (Requires .env)"
|
|
15
|
+
@echo " make test-demo - Live smoke tests against SAP demo server (APP_ENV=demo)"
|
|
16
|
+
@echo " make test-ci - Full test suite + coverage (for GitHub Actions)"
|
|
17
|
+
@echo " make coverage-html - Run test-ci and open visual HTML gap analysis"
|
|
18
|
+
@echo " make lint - Run static analysis (Ruff + Mypy)"
|
|
19
|
+
@echo " make clean - Remove cache and temporary files"
|
|
20
|
+
|
|
21
|
+
test:
|
|
22
|
+
@echo "🚀 Running unit tests (Layer 1)..."
|
|
23
|
+
PYTHONPATH=$(PYTHONPATH) $(PYTEST) -m "not (integration or vcr)"
|
|
24
|
+
|
|
25
|
+
test-vcr:
|
|
26
|
+
@echo "📽️ Running integration tests with VCR cassettes (Layer 2)..."
|
|
27
|
+
PYTHONPATH=$(PYTHONPATH) $(PYTEST) -m "vcr" --record-mode=none
|
|
28
|
+
|
|
29
|
+
test-record:
|
|
30
|
+
@if [ ! -f .env ]; then echo "❌ Error: .env file required for recording."; exit 1; fi
|
|
31
|
+
@echo "🔴 Recording new cassettes... (Requires connection to SAP)"
|
|
32
|
+
PYTHONPATH=$(PYTHONPATH) $(PYTEST) -m "vcr" --record-mode=all
|
|
33
|
+
|
|
34
|
+
test-demo:
|
|
35
|
+
@if [ ! -f .env ]; then echo "❌ Error: .env file required for demo tests."; exit 1; fi
|
|
36
|
+
@echo "🏗️ Running live smoke tests against demo server..."
|
|
37
|
+
APP_ENV=demo PYTHONPATH=$(PYTHONPATH) $(PYTEST) -m "integration"
|
|
38
|
+
|
|
39
|
+
test-ci:
|
|
40
|
+
@echo "⛓️ Running full CI suite (Unit + VCR + Coverage)..."
|
|
41
|
+
PYTHONPATH=$(PYTHONPATH) $(PYTEST) -m "not integration" --cov=src --cov-report=xml --cov-report=term
|
|
42
|
+
|
|
43
|
+
coverage-html: test-ci
|
|
44
|
+
@echo "📊 Generating visual coverage report..."
|
|
45
|
+
.venv/bin/coverage html -d htmlcov/
|
|
46
|
+
@if [ "$$(uname)" = "Darwin" ]; then open htmlcov/index.html; \
|
|
47
|
+
elif [ "$$(expr substr $$(uname -s) 1 5)" = "Linux" ]; then xdg-open htmlcov/index.html; \
|
|
48
|
+
else echo "Open htmlcov/index.html manually to see report."; fi
|
|
49
|
+
|
|
50
|
+
lint:
|
|
51
|
+
@echo "🧹 Linting code..."
|
|
52
|
+
$(VENV)/bin/ruff check src tests
|
|
53
|
+
$(VENV)/bin/mypy src
|
|
54
|
+
|
|
55
|
+
clean:
|
|
56
|
+
@echo "🧹 Cleaning temporary files..."
|
|
57
|
+
rm -rf .pytest_cache .mypy_cache .coverage htmlcov .ruff_cache coverage.xml
|
|
58
|
+
find . -type d -name "__pycache__" -exec rm -rf {} +
|
|
59
|
+
find . -type f -name "*.pyc" -delete
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: b1sl-python
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A framework-agnostic Python SDK for SAP Business One Service Layer and SAP HANA. (Unofficial)
|
|
5
|
+
Author: Eliceo Guzman
|
|
6
|
+
License: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Keywords: erp,hana,odata,sap,sap-b1,service-layer
|
|
9
|
+
Classifier: Development Status :: 3 - Alpha
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Typing :: Typed
|
|
15
|
+
Requires-Python: <3.13,>=3.11
|
|
16
|
+
Requires-Dist: httpx<1,>=0.28.1
|
|
17
|
+
Requires-Dist: pydantic<3,>=2.0.0
|
|
18
|
+
Requires-Dist: python-dotenv>=1.2.2
|
|
19
|
+
Provides-Extra: all
|
|
20
|
+
Requires-Dist: b1sl[django,generator,hana]; extra == 'all'
|
|
21
|
+
Provides-Extra: dev
|
|
22
|
+
Requires-Dist: mypy; extra == 'dev'
|
|
23
|
+
Requires-Dist: pytest-asyncio>=1.3.0; extra == 'dev'
|
|
24
|
+
Requires-Dist: pytest-cov; extra == 'dev'
|
|
25
|
+
Requires-Dist: pytest-django; extra == 'dev'
|
|
26
|
+
Requires-Dist: pytest-recording>=0.13.4; extra == 'dev'
|
|
27
|
+
Requires-Dist: pytest<9.0,>=8.0; extra == 'dev'
|
|
28
|
+
Requires-Dist: python-dotenv>=1.2.2; extra == 'dev'
|
|
29
|
+
Requires-Dist: responses>=0.26.0; extra == 'dev'
|
|
30
|
+
Requires-Dist: respx>=0.22.0; extra == 'dev'
|
|
31
|
+
Requires-Dist: ruff; extra == 'dev'
|
|
32
|
+
Provides-Extra: django
|
|
33
|
+
Requires-Dist: django<6,>=4.2; extra == 'django'
|
|
34
|
+
Provides-Extra: generator
|
|
35
|
+
Requires-Dist: beautifulsoup4>=4.14.3; extra == 'generator'
|
|
36
|
+
Requires-Dist: lxml>=6.0.2; extra == 'generator'
|
|
37
|
+
Provides-Extra: hana
|
|
38
|
+
Requires-Dist: hdbcli<3,>=2.20.0; extra == 'hana'
|
|
39
|
+
Description-Content-Type: text/markdown
|
|
40
|
+
|
|
41
|
+
# b1sl
|
|
42
|
+
### Modern, async-first Python SDK for SAP Business One Service Layer.
|
|
43
|
+
|
|
44
|
+

|
|
45
|
+
|
|
46
|
+
[](https://www.python.org/downloads/)
|
|
47
|
+
[](https://opensource.org/licenses/MIT)
|
|
48
|
+
[](https://docs.pydantic.dev/)
|
|
49
|
+
[](https://www.python-httpx.org/)
|
|
50
|
+
|
|
51
|
+
b1sl is a high-performance SDK designed for the SAP B1 Service Layer, focusing on concurrency, type safety, and efficient session management.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Key Features
|
|
56
|
+
|
|
57
|
+
* **Async-First Architecture**: Built on top of `httpx` for non-blocking I/O.
|
|
58
|
+
* **Type Safety**: Full Pydantic v2 integration for all SAP entities.
|
|
59
|
+
* **Smart Session Management**: Automatic 401 re-authentication with internal locking to prevent license exhaustion.
|
|
60
|
+
* **Session Hydration**: Reuse existing `B1SESSION` IDs across serverless functions or Temporal activities.
|
|
61
|
+
* **Optimistic Concurrency**: Automated ETag handling with smart cache invalidation on 412 conflicts.
|
|
62
|
+
* **Observability**: Structured logging and event hooks for performance monitoring.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Installation
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Using pip
|
|
70
|
+
pip install b1sl
|
|
71
|
+
|
|
72
|
+
# Using uv
|
|
73
|
+
uv add b1sl
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Quick Start
|
|
79
|
+
|
|
80
|
+
```python
|
|
81
|
+
import asyncio
|
|
82
|
+
from b1sl.b1sl import AsyncB1Client, B1Config
|
|
83
|
+
|
|
84
|
+
async def main():
|
|
85
|
+
config = B1Config.from_env()
|
|
86
|
+
|
|
87
|
+
async with AsyncB1Client(config) as b1:
|
|
88
|
+
# Full type hints for items and major entities
|
|
89
|
+
item = await b1.items.get("C1000")
|
|
90
|
+
print(f"Item: {item.ItemName}")
|
|
91
|
+
|
|
92
|
+
if __name__ == "__main__":
|
|
93
|
+
asyncio.run(main())
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Advanced Usage: FastAPI Integration
|
|
99
|
+
|
|
100
|
+
b1sl is optimized for modern web frameworks. We recommend using the Lifespan pattern to share a single connection pool:
|
|
101
|
+
|
|
102
|
+
```python
|
|
103
|
+
from fastapi import FastAPI
|
|
104
|
+
from contextlib import asynccontextmanager
|
|
105
|
+
from b1sl.b1sl import AsyncB1Client, B1Config
|
|
106
|
+
|
|
107
|
+
b1_client = None
|
|
108
|
+
|
|
109
|
+
@asynccontextmanager
|
|
110
|
+
async def lifespan(app: FastAPI):
|
|
111
|
+
global b1_client
|
|
112
|
+
config = B1Config.from_env()
|
|
113
|
+
b1_client = AsyncB1Client(config)
|
|
114
|
+
await b1_client.connect()
|
|
115
|
+
yield
|
|
116
|
+
await b1_client.aclose()
|
|
117
|
+
|
|
118
|
+
app = FastAPI(lifespan=lifespan)
|
|
119
|
+
|
|
120
|
+
@app.get("/items/{item_code}")
|
|
121
|
+
async def get_item(item_code: str):
|
|
122
|
+
return await b1_client.items.get(item_code)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Architecture Overview
|
|
128
|
+
|
|
129
|
+
| Feature | Implementation | Benefit |
|
|
130
|
+
| :--- | :--- | :--- |
|
|
131
|
+
| **HTTP Engine** | `httpx` (Async/Sync) | Superior performance & timeouts |
|
|
132
|
+
| **Data Models** | `Pydantic v2` | Instant validation & IDE autocomplete |
|
|
133
|
+
| **Auth** | Auto-retry 401 & Hydration | Zero-downtime session management |
|
|
134
|
+
| **Concurrency** | Shared Connection Pool | Prevents SAP License Exhaustion |
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Why b1sl?
|
|
139
|
+
|
|
140
|
+
In production environments, SAP Business One Service Layer is sensitive to session limits and licensing costs. Traditional wrappers often create redundant connections, leading to overhead and frequent auth failures.
|
|
141
|
+
|
|
142
|
+
**b1sl** addresses these issues through:
|
|
143
|
+
1. **Session Persistence**: Maintaining long-lived sessions and performing atomic re-authentication.
|
|
144
|
+
2. **Resource Efficiency**: Validated Pydantic models reduce runtime exceptions and memory footprint.
|
|
145
|
+
3. **Concurrency Control**: Internal locking ensures that concurrent requests wait for a single login attempt instead of triggering multiple auth calls.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## SAP Compatibility
|
|
150
|
+
|
|
151
|
+
This SDK is optimized for modern Service Layer environments and defaults to **v2 (OData V4)**.
|
|
152
|
+
|
|
153
|
+
* **Verified Baseline**: Service Layer **1.27** (SAP 10.0 FP 2405).
|
|
154
|
+
* **Minimum for ETags**: Requires Service Layer **1.21+** (March 2021).
|
|
155
|
+
* **Backward Compatibility**: Supports **v1 (OData V2)** through client configuration.
|
|
156
|
+
|
|
157
|
+
For a detailed history of Service Layer features and specific version support, see the [Full Compatibility Timeline](docs/01-compatibility.md).
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Contributing
|
|
162
|
+
|
|
163
|
+
Contributions are welcome. Please open an issue to discuss proposed changes before submitting a pull request.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## License
|
|
168
|
+
|
|
169
|
+
MIT © 2026.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# b1sl
|
|
2
|
+
### Modern, async-first Python SDK for SAP Business One Service Layer.
|
|
3
|
+
|
|
4
|
+

|
|
5
|
+
|
|
6
|
+
[](https://www.python.org/downloads/)
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
8
|
+
[](https://docs.pydantic.dev/)
|
|
9
|
+
[](https://www.python-httpx.org/)
|
|
10
|
+
|
|
11
|
+
b1sl is a high-performance SDK designed for the SAP B1 Service Layer, focusing on concurrency, type safety, and efficient session management.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Key Features
|
|
16
|
+
|
|
17
|
+
* **Async-First Architecture**: Built on top of `httpx` for non-blocking I/O.
|
|
18
|
+
* **Type Safety**: Full Pydantic v2 integration for all SAP entities.
|
|
19
|
+
* **Smart Session Management**: Automatic 401 re-authentication with internal locking to prevent license exhaustion.
|
|
20
|
+
* **Session Hydration**: Reuse existing `B1SESSION` IDs across serverless functions or Temporal activities.
|
|
21
|
+
* **Optimistic Concurrency**: Automated ETag handling with smart cache invalidation on 412 conflicts.
|
|
22
|
+
* **Observability**: Structured logging and event hooks for performance monitoring.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Installation
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Using pip
|
|
30
|
+
pip install b1sl
|
|
31
|
+
|
|
32
|
+
# Using uv
|
|
33
|
+
uv add b1sl
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Quick Start
|
|
39
|
+
|
|
40
|
+
```python
|
|
41
|
+
import asyncio
|
|
42
|
+
from b1sl.b1sl import AsyncB1Client, B1Config
|
|
43
|
+
|
|
44
|
+
async def main():
|
|
45
|
+
config = B1Config.from_env()
|
|
46
|
+
|
|
47
|
+
async with AsyncB1Client(config) as b1:
|
|
48
|
+
# Full type hints for items and major entities
|
|
49
|
+
item = await b1.items.get("C1000")
|
|
50
|
+
print(f"Item: {item.ItemName}")
|
|
51
|
+
|
|
52
|
+
if __name__ == "__main__":
|
|
53
|
+
asyncio.run(main())
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Advanced Usage: FastAPI Integration
|
|
59
|
+
|
|
60
|
+
b1sl is optimized for modern web frameworks. We recommend using the Lifespan pattern to share a single connection pool:
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
from fastapi import FastAPI
|
|
64
|
+
from contextlib import asynccontextmanager
|
|
65
|
+
from b1sl.b1sl import AsyncB1Client, B1Config
|
|
66
|
+
|
|
67
|
+
b1_client = None
|
|
68
|
+
|
|
69
|
+
@asynccontextmanager
|
|
70
|
+
async def lifespan(app: FastAPI):
|
|
71
|
+
global b1_client
|
|
72
|
+
config = B1Config.from_env()
|
|
73
|
+
b1_client = AsyncB1Client(config)
|
|
74
|
+
await b1_client.connect()
|
|
75
|
+
yield
|
|
76
|
+
await b1_client.aclose()
|
|
77
|
+
|
|
78
|
+
app = FastAPI(lifespan=lifespan)
|
|
79
|
+
|
|
80
|
+
@app.get("/items/{item_code}")
|
|
81
|
+
async def get_item(item_code: str):
|
|
82
|
+
return await b1_client.items.get(item_code)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Architecture Overview
|
|
88
|
+
|
|
89
|
+
| Feature | Implementation | Benefit |
|
|
90
|
+
| :--- | :--- | :--- |
|
|
91
|
+
| **HTTP Engine** | `httpx` (Async/Sync) | Superior performance & timeouts |
|
|
92
|
+
| **Data Models** | `Pydantic v2` | Instant validation & IDE autocomplete |
|
|
93
|
+
| **Auth** | Auto-retry 401 & Hydration | Zero-downtime session management |
|
|
94
|
+
| **Concurrency** | Shared Connection Pool | Prevents SAP License Exhaustion |
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Why b1sl?
|
|
99
|
+
|
|
100
|
+
In production environments, SAP Business One Service Layer is sensitive to session limits and licensing costs. Traditional wrappers often create redundant connections, leading to overhead and frequent auth failures.
|
|
101
|
+
|
|
102
|
+
**b1sl** addresses these issues through:
|
|
103
|
+
1. **Session Persistence**: Maintaining long-lived sessions and performing atomic re-authentication.
|
|
104
|
+
2. **Resource Efficiency**: Validated Pydantic models reduce runtime exceptions and memory footprint.
|
|
105
|
+
3. **Concurrency Control**: Internal locking ensures that concurrent requests wait for a single login attempt instead of triggering multiple auth calls.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## SAP Compatibility
|
|
110
|
+
|
|
111
|
+
This SDK is optimized for modern Service Layer environments and defaults to **v2 (OData V4)**.
|
|
112
|
+
|
|
113
|
+
* **Verified Baseline**: Service Layer **1.27** (SAP 10.0 FP 2405).
|
|
114
|
+
* **Minimum for ETags**: Requires Service Layer **1.21+** (March 2021).
|
|
115
|
+
* **Backward Compatibility**: Supports **v1 (OData V2)** through client configuration.
|
|
116
|
+
|
|
117
|
+
For a detailed history of Service Layer features and specific version support, see the [Full Compatibility Timeline](docs/01-compatibility.md).
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Contributing
|
|
122
|
+
|
|
123
|
+
Contributions are welcome. Please open an issue to discuss proposed changes before submitting a pull request.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## License
|
|
128
|
+
|
|
129
|
+
MIT © 2026.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Roadmap / TODOs (Target: v0.1.x+)
|
|
2
|
+
|
|
3
|
+
## 1. Dynamic UDF (User Defined Fields) Handling
|
|
4
|
+
**Context:** Currently, UDFs (fields starting with `U_`) are either filtered out or treated as raw `str/Any` through Pydantic's `extra="allow"`. If a developer wants strict validation, they must create a custom subclass extending the generated entity.
|
|
5
|
+
**Proposal:**
|
|
6
|
+
- Implement an interceptor at the Pydantic Base model level that automatically parses unknown fields starting with `U_` into a special `udfs` dictionary property.
|
|
7
|
+
- This avoids needing to declare a new class just to serialize/deserialize basic UDFs while keeping the core metadata clean.
|
|
8
|
+
|
|
9
|
+
## 2. Transparent Pagination Generators
|
|
10
|
+
**Context:** The API returns `odata.nextLink` for large recordsets. Currently, the user likely needs to manually inspect `result.next_link` and make a subsequent request.
|
|
11
|
+
**Proposal:**
|
|
12
|
+
- Add an `async for` generator (e.g., `client.items.stream()`) that internally handles fetching the next pages automatically as the developer iterates over the results.
|
|
13
|
+
|
|
14
|
+
## 3. $batch Request Support
|
|
15
|
+
**Context:** SAP B1 Service Layer supports OData `$batch` requests to execute multiple creates/updates in a single HTTP transaction.
|
|
16
|
+
**Proposal:**
|
|
17
|
+
- Implement a `BatchBuilder` utility that allows queuing operations and submitting them together to drastically reduce HTTP overhead for bulk sync processes.
|
|
18
|
+
|
|
19
|
+
## 4. OData Query Builder Enhancements
|
|
20
|
+
**Context:** We have constants for fields (`F.Item.item_code`), but filter construction might still rely on strings (`$filter=ItemCode eq 'A001'`).
|
|
21
|
+
**Proposal:**
|
|
22
|
+
- Allow pythonic operator overloading on the `F` schema constants to automatically build OData strings.
|
|
23
|
+
- Example: `client.items.filter(F.Item.item_code == 'A001' & F.Item.valid == 'tYES')`
|