b1sl-python 0.2.0__tar.gz → 0.4.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.4.0/CLAUDE.md +114 -0
- b1sl_python-0.4.0/PKG-INFO +315 -0
- b1sl_python-0.4.0/README.md +268 -0
- b1sl_python-0.4.0/ROADMAP.md +14 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/pyproject.toml +1 -1
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/__init__.py +19 -1
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/adapter_protocol.py +4 -4
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/async_client.py +80 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/async_rest_adapter.py +39 -19
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/base_adapter.py +78 -1
- b1sl_python-0.4.0/src/b1sl/b1sl/batch/__init__.py +6 -0
- b1sl_python-0.4.0/src/b1sl/b1sl/batch/_recording_adapter.py +70 -0
- b1sl_python-0.4.0/src/b1sl/b1sl/batch/changeset.py +29 -0
- b1sl_python-0.4.0/src/b1sl/b1sl/batch/client.py +124 -0
- b1sl_python-0.4.0/src/b1sl/b1sl/batch/parser.py +120 -0
- b1sl_python-0.4.0/src/b1sl/b1sl/batch/results.py +56 -0
- b1sl_python-0.4.0/src/b1sl/b1sl/batch/serializer.py +82 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/client.py +81 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/config.py +3 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/exceptions/__init__.py +6 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/exceptions/exceptions.py +95 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/base.py +78 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/result.py +3 -1
- b1sl_python-0.4.0/src/b1sl/b1sl/pagination.py +66 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/async_base.py +121 -7
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/base.py +154 -6
- b1sl_python-0.4.0/src/b1sl/b1sl/resources/crossjoin.py +542 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/odata.py +173 -33
- b1sl_python-0.4.0/src/b1sl/b1sl/resources/sql_queries.py +571 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/rest_adapter.py +24 -18
- b1sl_python-0.4.0/src/b1sl/b1sl/schemas/__init__.py +3 -0
- b1sl_python-0.4.0/src/b1sl/b1sl/schemas/udf.py +79 -0
- b1sl_python-0.4.0/src/b1sl/contrib/mcp/__init__.py +108 -0
- b1sl_python-0.4.0/src/b1sl/contrib/mcp/discovery.py +410 -0
- b1sl_python-0.4.0/src/b1sl/contrib/mcp/formatters.py +182 -0
- b1sl_python-0.4.0/src/b1sl/contrib/mcp/grammar.py +255 -0
- b1sl_python-0.4.0/src/b1sl/contrib/mcp/odata_formatters.py +308 -0
- b1sl_python-0.4.0/src/b1sl/contrib/mcp/odata_grammar.py +316 -0
- b1sl_python-0.4.0/src/b1sl/contrib/mcp/odata_schemas.py +640 -0
- b1sl_python-0.4.0/src/b1sl/contrib/mcp/schemas.py +151 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/fakes/fake_rest_adapter.py +113 -5
- b1sl_python-0.4.0/tests/unit/test_advanced_features.py +156 -0
- b1sl_python-0.4.0/tests/unit/test_batch.py +151 -0
- b1sl_python-0.4.0/tests/unit/test_crossjoin.py +572 -0
- b1sl_python-0.4.0/tests/unit/test_mcp_discovery.py +228 -0
- b1sl_python-0.4.0/tests/unit/test_mcp_helpers.py +461 -0
- b1sl_python-0.4.0/tests/unit/test_mcp_odata.py +400 -0
- b1sl_python-0.4.0/tests/unit/test_mcp_odata_formatters.py +282 -0
- b1sl_python-0.4.0/tests/unit/test_mcp_odata_schemas.py +282 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/unit/test_odata_builder.py +65 -0
- b1sl_python-0.4.0/tests/unit/test_pagination.py +59 -0
- b1sl_python-0.4.0/tests/unit/test_schema_header.py +271 -0
- b1sl_python-0.4.0/tests/unit/test_sql_queries.py +702 -0
- b1sl_python-0.4.0/tests/unit/test_stream_execution.py +152 -0
- b1sl_python-0.4.0/tests/unit/test_udfs.py +176 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/uv.lock +1 -1
- b1sl_python-0.2.0/PKG-INFO +0 -205
- b1sl_python-0.2.0/README.md +0 -158
- b1sl_python-0.2.0/ROADMAP.md +0 -25
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/.env.example +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/.github/workflows/ci.yml +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/.github/workflows/publish.yml +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/.gitignore +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/LICENSE +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/Makefile +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/configs/dev.json +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/configs/qa.json.example +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/adapter.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/config_manager.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/contrib/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/contrib/django/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/contrib/django/middleware/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/contrib/django/middleware/base.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/contrib/django/middleware/odata_decode_middleware.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/contrib/django/middleware/odata_transform_url_middleware.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/entities/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/environment.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/fields/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/fields/_generated/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/fields/_generated/complex_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/fields/_generated/entities/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/fields/_generated/entities/businesspartners.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/fields/_generated/entities/finance.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/fields/_generated/entities/general.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/fields/_generated/entities/inventory.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/fields/_generated/entities/production.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/fields/_generated/entities/purchasing.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/fields/_generated/entities/sales.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/fields/base.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/logging_utils.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/_generated/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/_generated/_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/_generated/complex_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/_generated/entities/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/_generated/entities/businesspartners.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/_generated/entities/finance.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/_generated/entities/general.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/_generated/entities/inventory.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/_generated/entities/production.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/_generated/entities/purchasing.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/_generated/entities/sales.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/_generated/enums.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/_generated/resources/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/_overrides/inventory.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/odata_query_model.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/models/paginated_result.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/account_category.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/account_category_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/account_segmentation_categories.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/account_segmentations.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/accounts_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/accrual_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/accrual_types_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/activities.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/activities_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/activity_locations.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/activity_recipient_lists.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/activity_recipient_lists_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/activity_statuses.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/activity_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/additional_expenses.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/address_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/alert_managements.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/alternate_cat_num.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/alternative_items_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/approval_requests.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/approval_requests_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/approval_stages.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/approval_stages_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/approval_templates.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/approval_templates_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_capitalization.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_capitalization_credit_memo.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_capitalization_credit_memo_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_capitalization_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_classes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_classes_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_depreciation_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_depreciation_groups_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_groups_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_manual_depreciation.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_manual_depreciation_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_retirement.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_retirement_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_transfer.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/asset_transfer_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/attachments2.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/attribute_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/attribute_groups_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bank_charges_allocation_codes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bank_charges_allocation_codes_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bank_pages.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bank_statements.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bank_statements_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/banks.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bar_codes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bar_codes_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/batch_number_details.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bill_of_exchange_transactions.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bin_location_attributes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bin_location_attributes_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bin_location_fields.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bin_location_fields_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bin_locations.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bin_locations_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/blanket_agreements.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/blanket_agreements_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/boe_document_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/boe_document_types_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/boe_instructions.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/boe_instructions_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/boe_lines_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/boe_portfolios.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/boe_portfolios_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bp_fiscal_registry_id.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bp_opening_balance_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/bp_priorities.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/branches.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/branches_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/brazil_beverage_indexers.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/brazil_beverage_indexers_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/brazil_fuel_indexers.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/brazil_fuel_indexers_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/brazil_multi_indexers.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/brazil_numeric_indexers.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/brazil_string_indexers.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/budget_distributions.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/budget_scenarios.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/budgets.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/business_partner_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/business_partner_properties.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/business_partner_properties_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/business_partners.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/business_partners_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/business_places.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/campaign_response_type.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/campaign_response_type_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/campaigns.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/campaigns_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/cash_discounts.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/cash_discounts_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/cash_flow_line_items.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/cash_flow_line_items_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/certificate_series.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/certificate_series_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/change_logs_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/chart_of_accounts.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/check_lines_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/checksfor_payment.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/choose_from_list.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/closing_date_procedure.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/cockpits.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/cockpits_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/commission_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/company_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/contacts.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/contract_templates.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/correction_invoice.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/correction_invoice_reversal.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/correction_invoice_reversal_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/correction_invoice_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/correction_purchase_invoice.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/correction_purchase_invoice_reversal.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/correction_purchase_invoice_reversal_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/correction_purchase_invoice_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/cost_center_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/cost_center_types_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/cost_element_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/cost_elements.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/counties.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/counties_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/countries.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/countries_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/credit_card_payments.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/credit_cards.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/credit_lines_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/credit_notes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/credit_notes_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/credit_payment_methods.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/currencies.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/customer_equipment_cards.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/customs_declaration.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/customs_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/cycle_count_determinations.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/cycle_count_determinations_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/dashboard_packages_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/deductible_tax_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/deductible_taxes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/deduction_tax_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/deduction_tax_hierarchies.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/deduction_tax_sub_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/deduction_tax_sub_groups_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/delivery_notes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/delivery_notes_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/departments.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/departments_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/deposits.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/deposits_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/depreciation_areas.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/depreciation_areas_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/depreciation_type_pools.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/depreciation_type_pools_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/depreciation_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/depreciation_types_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/determination_criterias.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/determination_criterias_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/dimensions.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/dimensions_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/distribution_rules.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/distribution_rules_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/dnf_code_setup.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/dnf_code_setup_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/down_payments.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/down_payments_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/drafts.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/drafts_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/dunning_letters.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/dunning_terms.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/dunning_terms_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/dynamic_system_strings.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/electronic_communication_action_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/electronic_communication_actions_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/electronic_file_formats.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/electronic_file_formats_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/email_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/email_groups_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/employee_id_type.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/employee_id_type_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/employee_position.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/employee_position_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/employee_roles_setup.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/employee_roles_setup_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/employee_status.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/employee_status_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/employee_transfers.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/employee_transfers_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/employees_info.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/employment_category_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/employment_categorys.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/enhanced_discount_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/enhanced_discount_groups_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/exceptional_event_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/exceptional_events.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/extended_translations.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/extended_translations_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/external_calls_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/external_reconciliations_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/fa_account_determinations.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/fa_account_determinations_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/factoring_indicators.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/financial_years.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/financial_years_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/fiscal_printer.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/fiscal_printer_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/fixed_asset_items_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/form_preferences.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/formatted_searches.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/forms1099.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/gl_account_advanced_rules.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/gl_account_advanced_rules_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/goods_return_request.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/goods_return_request_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/gov_pay_codes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/gov_pay_codes_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/gt_is_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/holidays.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/house_bank_accounts.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/incoming_payments.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/india_hsn.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/india_hsn_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/industries.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/integration_packages_configure.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/integration_packages_configure_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/internal_reconciliations.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/internal_reconciliations_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/intrastat_configuration.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/intrastat_configuration_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/inventory_countings.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/inventory_countings_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/inventory_cycles.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/inventory_gen_entries.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/inventory_gen_entry_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/inventory_gen_exit_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/inventory_gen_exits.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/inventory_opening_balances.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/inventory_opening_balances_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/inventory_postings.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/inventory_postings_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/inventory_transfer_requests.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/inventory_transfer_requests_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/invoices.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/invoices_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/item_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/item_properties.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/items.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/journal_entries.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/journal_entry_document_type_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/journal_entry_document_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/journal_vouchers_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/knowledge_base_solutions.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/kp_is.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/kp_is_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/landed_costs.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/landed_costs_codes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/landed_costs_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/legal_data.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/length_measures.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/license_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/local_era.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/manufacturers.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/material_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/material_groups_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/material_revaluation.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/material_revaluation_fifo_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/material_revaluation_snb_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/messages.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/messages_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/mobile_add_on_setting.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/mobile_add_on_setting_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/mobile_app_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/multi_language_translations.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/nature_of_assessees.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/nature_of_assessees_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/ncm_codes_setup.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/ncm_codes_setup_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/nf_models.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/nf_models_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/nf_tax_categories.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/nf_tax_categories_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/nota_fiscal_cfop.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/nota_fiscal_cst.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/nota_fiscal_usage.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/occurrence_codes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/occurrence_codes_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/orders.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/orders_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/packages_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/partners_setups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/partners_setups_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/payment_blocks.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/payment_blocks_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/payment_calculation_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/payment_drafts.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/payment_reason_code_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/payment_reason_codes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/payment_run_export.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/payment_terms_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/payment_terms_types_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/pick_lists.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/pick_lists_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/pos_daily_summary.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/predefined_texts.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/predefined_texts_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/price_lists.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/product_trees.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/production_orders.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/profit_centers.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/profit_centers_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/project_management_configuration_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/project_management_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/project_management_time_sheet.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/project_managements.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/projects.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/projects_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_credit_notes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_credit_notes_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_delivery_notes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_delivery_notes_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_down_payments.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_down_payments_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_invoices.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_invoices_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_orders.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_orders_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_quotations.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_quotations_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_request_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_requests.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_returns.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_returns_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/purchase_tax_invoices.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/qr_code_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/query_auth_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/query_categories.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/query_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/queue.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/quotations.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/quotations_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/recurring_transaction_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/relationships.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/report_filter.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/report_filter_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/report_layouts_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/report_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/report_types_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/resource_capacities.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/resource_capacities_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/resource_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/resource_groups_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/resource_properties.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/resource_properties_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/resources.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/resources_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/retorno_codes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/retorno_codes_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/return_request.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/return_request_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/returns.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/returns_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/route_stages.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/route_stages_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_forecast.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_opportunities.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_opportunity_competitors_setup.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_opportunity_competitors_setup_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_opportunity_interests_setup.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_opportunity_interests_setup_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_opportunity_reasons_setup.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_opportunity_reasons_setup_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_opportunity_sources_setup.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_opportunity_sources_setup_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_persons.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_stages.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_tax_authorities.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_tax_authorities_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_tax_codes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sales_tax_invoices.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sbo_bob_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sections.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/sections_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/self_credit_memo_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/self_credit_memos.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/self_invoice_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/self_invoices.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/serial_number_details.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/series_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_call_origins.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_call_origins_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_call_problem_sub_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_call_problem_sub_types_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_call_problem_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_call_problem_types_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_call_solution_status.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_call_solution_status_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_call_status.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_call_status_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_call_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_call_types_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_calls.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_contracts.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_groups_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/service_tax_posting_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/shipping_types.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/short_link_mappings_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/special_prices.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/states.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/states_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/stock_takings.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/stock_transfer_draft_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/stock_transfer_drafts.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/stock_transfer_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/stock_transfers.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/target_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/target_groups_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/tax_code_determinations.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/tax_code_determinations_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/tax_code_determinations_tcd.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/tax_code_determinations_tcd_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/tax_invoice_report.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/tax_web_sites.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/tax_web_sites_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/teams.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/termination_reason.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/termination_reason_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/territories.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/tracking_notes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/tracking_notes_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/transaction_codes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/transaction_codes_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/transportation_document.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/tsr_exceptional_event_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/tsr_exceptional_events.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/unit_of_measurement_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/unit_of_measurement_groups_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/unit_of_measurements.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/unit_of_measurements_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/user_default_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/user_fields_md.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/user_keys_md.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/user_languages.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/user_menu_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/user_objects_md.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/user_permission_tree.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/user_queries.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/user_tables_md.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/users.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/users_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/value_mapping.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/value_mapping_communication.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/value_mapping_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/vat_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/vendor_payments.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/w_tax_type_code_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/w_tax_type_codes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/warehouse_locations.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/warehouse_sublevel_codes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/warehouse_sublevel_codes_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/warehouses.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_bookmark_tile_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_bookmark_tiles.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_dashboard_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_dashboards.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_form_setting_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_form_settings.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_launchpad_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_launchpads.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_listview_filter_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_listview_filters.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_notification_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_notifications.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_preference_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_preferences.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_recent_activities.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_recent_activity_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_variant_group_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_variant_groups.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_variant_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/web_client_variants.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/weight_measures.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/withholding_tax_codes.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/witholding_tax_definition.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/wizard_payment_methods.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/_generated/workflow_task_service.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/resources/udo.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/testing.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/tests/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/tests/test_01_settings.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/tests/test_02_rest_adapter.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/tests/test_03_items_endpoint.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/tests/test_04_serialnumberdetails_endpoint.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/tests/test_observability.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/b1sl/tests/test_utils.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/contrib/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/contrib/django/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/contrib/django/base.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/contrib/django/odata_decode_middleware.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/contrib/django/odata_transform_url_middleware.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/py.typed +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/saphdb/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/saphdb/adapter.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/saphdb/client.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/saphdb/config.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/saphdb/endpoints/serialnumberdetailodbc.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/saphdb/exceptions/exceptions.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/saphdb/main.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/saphdb/models/result.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/saphdb/models/serial.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/saphdb/odbc_adapter.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/saphdb/tests/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/saphdb/tests/test_01_settings.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/saphdb/tests/test_02_odbc_adapter.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/src/b1sl/saphdb/tests/test_04_serialnumberdetails_endpoint.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/conftest.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/fakes/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/fixtures/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/fixtures/mock_responses/items_list.json +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/fixtures/mock_responses/items_single.json +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/fixtures/test_data.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/integration/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/integration/cassettes/test_items_real/test_get_item_real.yaml +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/integration/cassettes/test_items_real/test_list_items_real.yaml +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/integration/conftest.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/integration/test_items_real.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/test_async_adapter.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/test_b1sl_adapter.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/test_middleware.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/test_saphdb_adapter.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/unit/__init__.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/unit/mocks/items_list.json +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/unit/mocks/items_single.json +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/unit/test_bool_serialisation.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/unit/test_dry_run.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/unit/test_items_mock.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/unit/test_model_resolution.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/unit/test_rest_adapter.py +0 -0
- {b1sl_python-0.2.0 → b1sl_python-0.4.0}/tests/unit/test_service_calls.py +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Project
|
|
6
|
+
|
|
7
|
+
`b1sl-python` — an async-first, metadata-driven Python SDK for the SAP Business One Service Layer (OData v4). Published to PyPI. Optional `saphdb` subpackage wraps SAP HANA via `hdbcli`.
|
|
8
|
+
|
|
9
|
+
## Tooling and commands
|
|
10
|
+
|
|
11
|
+
- **Package manager: `uv` exclusively.** `uv sync` (or `uv sync --all-extras --dev`) for installs. The venv lives at `.venv/`.
|
|
12
|
+
- **Python: 3.11–3.12** (`requires-python = ">=3.11,<3.13"`).
|
|
13
|
+
- Common targets (see `Makefile`):
|
|
14
|
+
- `make test` — unit tests only, no network (`pytest -m "not (integration or vcr)"`).
|
|
15
|
+
- `make test-vcr` — replay recorded cassettes offline (`--record-mode=none`). Requires the `vcr` marker.
|
|
16
|
+
- `make test-record` — re-record cassettes against a real SAP server. Requires `.env`.
|
|
17
|
+
- `make test-demo` — live integration tests, `APP_ENV=demo`, requires `.env`.
|
|
18
|
+
- `make test-ci` — full CI suite with coverage XML.
|
|
19
|
+
- `make lint` — `ruff check .` + `mypy .` (CI parity).
|
|
20
|
+
- **Single test**: `PYTHONPATH=src:. .venv/bin/pytest tests/unit/test_odata_builder.py::test_name -xvs`. The `PYTHONPATH=src:.` prefix matters — the package lives at `src/b1sl/` and tests import via `b1sl.b1sl.…`.
|
|
21
|
+
- CI (`.github/workflows/ci.yml`) runs only `uv run ruff check .` + `uv run pytest tests/unit/`. `mypy` is enforced locally via `make lint`, not in CI.
|
|
22
|
+
- Release: `make release v=X.Y.Z` commits, tags, pushes; `publish.yml` then publishes to PyPI on tag.
|
|
23
|
+
|
|
24
|
+
## Architecture
|
|
25
|
+
|
|
26
|
+
### Three-layer model code: generated / overrides / entities
|
|
27
|
+
|
|
28
|
+
The SDK is **metadata-driven**. Most of `src/b1sl/b1sl/models/` and `src/b1sl/b1sl/resources/` is autogenerated from SAP's OData `$metadata` XML, service document JSON, and API reference HTML (sources versioned under `metadata/<version>/`).
|
|
29
|
+
|
|
30
|
+
- `models/_generated/`, `resources/_generated/` — **NEVER edit**. Wiped on every regeneration. Any structural fix belongs in the generator at `scripts/b1sl_metadata_generator/` (run via `./scripts/generate_models.sh <version>`).
|
|
31
|
+
- `models/_overrides/` — hand-written extensions, calculated properties, `model_rebuild()` calls, metadata quirk fixes.
|
|
32
|
+
- `entities/__init__.py` — the public facade. Blends generated + overridden models. **All public consumption goes through `from b1sl.b1sl import entities as en`**, never from `_generated/` directly.
|
|
33
|
+
|
|
34
|
+
Production metadata should not be committed: place it as `metadata/<version>/metadata_document.real.xml` / `service_document.real.json`. The generator prioritizes `.real.*` over the public files; `.real.*` is gitignored.
|
|
35
|
+
|
|
36
|
+
### `B1Model` base class
|
|
37
|
+
|
|
38
|
+
Every entity inherits from `B1Model` (`models/base.py`), which provides:
|
|
39
|
+
- Boolean coercion (SAP `"tYES"`/`"tNO"` ↔ Python `bool`).
|
|
40
|
+
- Date handling (`/Date(ms)/` ↔ `date`).
|
|
41
|
+
- `.to_api_payload()` uses `exclude_unset=True` — this is the foundation of the **Surgical Delta** pattern. PATCH payloads must contain only the fields the caller explicitly set; never `GET` an entity and resend it.
|
|
42
|
+
- `.udfs` proxy: mapping-like accessor for User-Defined Fields. **Enforces the `U_` prefix** to prevent overwriting SAP core fields.
|
|
43
|
+
|
|
44
|
+
### Elite vs Generic resource access
|
|
45
|
+
|
|
46
|
+
The client exposes ~16 "Elite" aliases as direct properties (`client.items`, `client.business_partners`, `client.orders`, …) — these are the entities with verified ETag concurrency support. Everything else (~1000 endpoints) requires explicit binding:
|
|
47
|
+
|
|
48
|
+
```python
|
|
49
|
+
res = client.get_resource(en.User, "Users")
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The explicit `get_resource` call is a deliberate safety signal: ETag protection is **not guaranteed** for these endpoints. When adding a new alias, only promote to Elite if SAP supports ETag for that endpoint.
|
|
53
|
+
|
|
54
|
+
### Async/Sync symmetry
|
|
55
|
+
|
|
56
|
+
`B1Client` / `AsyncB1Client`, `RestAdapter` / `AsyncRestAdapter`, `GenericResource` / `AsyncGenericResource`, `QueryBuilder` / `AsyncQueryBuilder` — every sync class has an async counterpart. Both surfaces must support the same parameters and methods. When changing one, change the other.
|
|
57
|
+
|
|
58
|
+
### ETag concurrency — proactive invalidation
|
|
59
|
+
|
|
60
|
+
SAP returns `204 No Content` on PATCH/DELETE without a fresh `ETag` header. The adapter's contract is:
|
|
61
|
+
|
|
62
|
+
1. GET caches `ETag`.
|
|
63
|
+
2. PATCH/DELETE sends it as `If-Match`.
|
|
64
|
+
3. **On success, the adapter immediately clears the cached ETag** (proactive invalidation). Skipping this step makes a subsequent DELETE-after-UPDATE use a stale ETag and silently break under load.
|
|
65
|
+
4. 412 → `SAPConcurrencyError`.
|
|
66
|
+
|
|
67
|
+
Adapters map HTTP status to semantic exceptions via a standardized dict: 400 → `B1ValidationError`, 401 → `B1AuthError`, 404 → `B1NotFoundError`, 412 → `SAPConcurrencyError`, else `B1Exception`.
|
|
68
|
+
|
|
69
|
+
### Batch / changesets
|
|
70
|
+
|
|
71
|
+
`src/b1sl/b1sl/batch/` implements `$batch` via a `RecordingAdapter` proxy pattern: `batch.items.create(...)` reuses the exact same resource API but enqueues into `_pending` instead of executing.
|
|
72
|
+
|
|
73
|
+
- `changeset()` blocks → atomic (all-or-nothing).
|
|
74
|
+
- Top-level batch ops → independent (partial success allowed).
|
|
75
|
+
- **`batch.execute()` must NOT raise on individual op failures.** Callers inspect `results.all_ok` / `results.failed`. Each result preserves `r.index` for traceability.
|
|
76
|
+
|
|
77
|
+
### Pagination
|
|
78
|
+
|
|
79
|
+
`.execute()` returns one page. `.stream()` follows `odata.nextLink` via generators (async generators for the async client). `.top(N)` is a global hard cap; `page_size` and `max_pages` are independent safety knobs. Filters survive page boundaries.
|
|
80
|
+
|
|
81
|
+
### Configuration
|
|
82
|
+
|
|
83
|
+
`B1Environment.load()` loads with precedence: env vars > `.env` > `configs/<env>.json`. JSON profiles hold non-sensitive test data only — credentials must come from env/`.env`. `B1SL_ENV` controls `dev` (human logs) vs `test` vs `prod` (structured JSON logs). `B1SL_DRY_RUN=1` (or `with b1.dry_run():` — `ContextVar`-scoped, task-safe) intercepts all writes and returns a fake 204.
|
|
84
|
+
|
|
85
|
+
## Rules and gotchas
|
|
86
|
+
|
|
87
|
+
- **English only** in code, comments, commits, docs.
|
|
88
|
+
- **Never `pip install`** — use `uv add` / `uv sync`.
|
|
89
|
+
- **Never edit `_generated/`**. Fix the generator or add a `_overrides/` file.
|
|
90
|
+
- **Run `make lint` before proposing changes** — it covers the whole repo (CI only runs ruff, so mypy regressions slip past unless you run it locally).
|
|
91
|
+
- **Surgical deltas only**: write `client.items.update("A001", en.Item(item_name="New"))`, never round-trip a fetched object.
|
|
92
|
+
- **Don't promote endpoints to Elite without verifying ETag support** — Elite aliases imply concurrency safety.
|
|
93
|
+
- **VCR cassette hygiene**: `tests/conftest.py` redacts hosts, sessions, credentials, and OData context URLs. Before pushing recorded cassettes, sanity-check with `grep -r "B1SESSION" tests/integration/cassettes/`.
|
|
94
|
+
- **`hdbcli` is mocked at top-level in `tests/conftest.py`** so HANA tests don't require the SAP driver. Don't import `hdbcli` outside the `saphdb` subpackage.
|
|
95
|
+
- Pytest markers: `integration` (live SAP), `vcr` (cassette playback). Default `make test` excludes both.
|
|
96
|
+
|
|
97
|
+
## Where things live
|
|
98
|
+
|
|
99
|
+
- `src/b1sl/b1sl/` — Service Layer SDK (the main product).
|
|
100
|
+
- `src/b1sl/saphdb/` — optional HANA direct-SQL adapter (gated by `hana` extra).
|
|
101
|
+
- `src/b1sl/contrib/` — framework integrations (Django, etc.).
|
|
102
|
+
- `src/b1sl/contrib/mcp/` — MCP helper toolkit (framework-agnostic, no MCP SDK import).
|
|
103
|
+
Seven modules: `discovery.py` (Elite resource catalog + field introspection),
|
|
104
|
+
`grammar.py` / `odata_grammar.py` (SQL and OData grammar constraints + system prompts),
|
|
105
|
+
`schemas.py` / `odata_schemas.py` (tool-definition builders for SQL and OData CRUD),
|
|
106
|
+
`formatters.py` / `odata_formatters.py` (result/error formatters).
|
|
107
|
+
Guide: `docs/16-mcp-helpers.md`. Example: `examples/23_mcp_odata_server.py`.
|
|
108
|
+
- `scripts/b1sl_metadata_generator/` — the generator engine.
|
|
109
|
+
- `scripts/generate_models.sh <version>` — regen entry point.
|
|
110
|
+
- `docs/` — long-form architecture/API guides (excluded from the wheel).
|
|
111
|
+
- `docs/reference/sl/` — verbatim SAP Service Layer reference extracts (e.g. `sql-queries.md`). Read these before guessing endpoint semantics.
|
|
112
|
+
- `examples/`, `skills/`, `agents.md`, `metadata/` — also excluded from the wheel (see `pyproject.toml [tool.hatch.build]`).
|
|
113
|
+
- `src/b1sl/b1sl/resources/sql_queries.py` — specialized resource with bounded function (`/List`) support; the reference implementation for resources that go beyond generic CRUD.
|
|
114
|
+
- `src/b1sl/b1sl/pagination.py` — contains `extract_next_link()` which handles both OData v3 (`odata.nextLink`) and v4 (`@odata.nextLink`) response formats.
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: b1sl-python
|
|
3
|
+
Version: 0.4.0
|
|
4
|
+
Summary: A framework-agnostic Python SDK for SAP Business One Service Layer and SAP HANA. (Unofficial)
|
|
5
|
+
Project-URL: Homepage, https://github.com/operator-ita/b1sl-python
|
|
6
|
+
Project-URL: Repository, https://github.com/operator-ita/b1sl-python
|
|
7
|
+
Project-URL: Bug Tracker, https://github.com/operator-ita/b1sl-python/issues
|
|
8
|
+
Project-URL: Documentation, https://github.com/operator-ita/b1sl-python/tree/main/docs
|
|
9
|
+
Author: Eliceo Guzman
|
|
10
|
+
License: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: erp,hana,odata,sap,sap-b1,service-layer
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Typing :: Typed
|
|
19
|
+
Requires-Python: <3.13,>=3.11
|
|
20
|
+
Requires-Dist: httpx<1,>=0.28.1
|
|
21
|
+
Requires-Dist: pydantic<3,>=2.0.0
|
|
22
|
+
Requires-Dist: python-dotenv>=1.2.2
|
|
23
|
+
Provides-Extra: all
|
|
24
|
+
Requires-Dist: beautifulsoup4>=4.14.3; extra == 'all'
|
|
25
|
+
Requires-Dist: django<6,>=4.2; extra == 'all'
|
|
26
|
+
Requires-Dist: hdbcli<3,>=2.20.0; extra == 'all'
|
|
27
|
+
Requires-Dist: lxml>=6.0.2; extra == 'all'
|
|
28
|
+
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: mypy; extra == 'dev'
|
|
30
|
+
Requires-Dist: pytest-asyncio>=1.3.0; extra == 'dev'
|
|
31
|
+
Requires-Dist: pytest-cov; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-django; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest-recording>=0.13.4; extra == 'dev'
|
|
34
|
+
Requires-Dist: pytest<9.0,>=8.0; extra == 'dev'
|
|
35
|
+
Requires-Dist: python-dotenv>=1.2.2; extra == 'dev'
|
|
36
|
+
Requires-Dist: responses>=0.26.0; extra == 'dev'
|
|
37
|
+
Requires-Dist: respx>=0.22.0; extra == 'dev'
|
|
38
|
+
Requires-Dist: ruff; extra == 'dev'
|
|
39
|
+
Provides-Extra: django
|
|
40
|
+
Requires-Dist: django<6,>=4.2; extra == 'django'
|
|
41
|
+
Provides-Extra: generator
|
|
42
|
+
Requires-Dist: beautifulsoup4>=4.14.3; extra == 'generator'
|
|
43
|
+
Requires-Dist: lxml>=6.0.2; extra == 'generator'
|
|
44
|
+
Provides-Extra: hana
|
|
45
|
+
Requires-Dist: hdbcli<3,>=2.20.0; extra == 'hana'
|
|
46
|
+
Description-Content-Type: text/markdown
|
|
47
|
+
|
|
48
|
+
# b1sl-python
|
|
49
|
+
### Modern, async-first Python SDK for SAP Business One Service Layer.
|
|
50
|
+
|
|
51
|
+

|
|
52
|
+
|
|
53
|
+
[](https://www.python.org/downloads/)
|
|
54
|
+
[](https://opensource.org/licenses/MIT)
|
|
55
|
+
[](https://docs.pydantic.dev/)
|
|
56
|
+
[](https://www.python-httpx.org/)
|
|
57
|
+
|
|
58
|
+
b1sl is a high-performance SDK for the SAP B1 Service Layer, designed around concurrency, type safety, and developer experience. It covers the full lifecycle of a SAP integration — from single-record reads to transactional batch operations over large paginated datasets.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Key Features
|
|
63
|
+
|
|
64
|
+
- **Async-First Architecture**: Built on `httpx` for non-blocking I/O. Full sync client parity for scripts and non-async contexts.
|
|
65
|
+
- **Type Safety**: Pydantic v2 integration for all SAP entities, with IDE autocomplete and runtime validation.
|
|
66
|
+
- **Smart Session Management**: Automatic 401 re-authentication with internal locking to prevent license exhaustion.
|
|
67
|
+
- **Session Hydration**: Reuse existing `B1SESSION` IDs across serverless functions or Temporal activities.
|
|
68
|
+
- **Optimistic Concurrency**: Automated ETag handling with smart cache invalidation on 412 conflicts.
|
|
69
|
+
- **Pythonic Querying**: Fluent OData builder with operator overloading (`F.ItemCode == "A001"`) and type-safe field access.
|
|
70
|
+
- **Transparent Pagination**: Automatic `nextLink` handling via Python generators — `async for item in client.items.stream()`.
|
|
71
|
+
- **`$batch` Support**: Group multiple operations into a single HTTP round-trip with full changeset atomicity.
|
|
72
|
+
- **Dynamic UDFs**: Schema-aware proxy for type-safe interaction with User Defined Fields, including opt-in Pydantic validation.
|
|
73
|
+
- **Observability**: Structured logging and event hooks for performance monitoring.
|
|
74
|
+
- **Safe Development**: Global and per-request Dry Run mode to intercept write operations without hitting SAP.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Installation
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Using pip
|
|
82
|
+
pip install b1sl-python
|
|
83
|
+
|
|
84
|
+
# Using uv
|
|
85
|
+
uv add b1sl-python
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Quick Start
|
|
91
|
+
|
|
92
|
+
```python
|
|
93
|
+
import asyncio
|
|
94
|
+
from b1sl.b1sl import AsyncB1Client, B1Config
|
|
95
|
+
|
|
96
|
+
async def main():
|
|
97
|
+
config = B1Config.from_env()
|
|
98
|
+
|
|
99
|
+
async with AsyncB1Client(config) as b1:
|
|
100
|
+
item = await b1.items.get("I1000")
|
|
101
|
+
print(f"Item: {item.item_name}")
|
|
102
|
+
|
|
103
|
+
# UDF access via protected mapping proxy
|
|
104
|
+
print(f"Custom color: {item.udfs['U_Color']}")
|
|
105
|
+
|
|
106
|
+
asyncio.run(main())
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Pythonic Querying
|
|
112
|
+
|
|
113
|
+
Experience a fluent OData builder that uses operator overloading. You can choose between the zero-import **`F` Proxy** (requires SAP CamelCase names) or **Static Constants** (provides Pythonic snake_case autocomplete).
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
from b1sl.b1sl.resources.odata import F
|
|
117
|
+
from b1sl.b1sl.fields import Item
|
|
118
|
+
|
|
119
|
+
# 1. Dynamic F Proxy (Quick, use SAP field names)
|
|
120
|
+
items = await b1.items.filter(F.QuantityOnStock > 0).top(5).execute()
|
|
121
|
+
|
|
122
|
+
# 2. Static fields (Type-safe, uses Pythonic snake_case autocomplete)
|
|
123
|
+
items = await b1.items.filter(Item.quantity_on_stock > 0).top(5).execute()
|
|
124
|
+
|
|
125
|
+
for item in items:
|
|
126
|
+
print(f"[{item.item_code}] {item.item_name}")
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Transparent Pagination
|
|
132
|
+
|
|
133
|
+
`.execute()` returns only the first page SAP gives you. `.stream()` transparently follows every `odata.nextLink` until the dataset is exhausted.
|
|
134
|
+
|
|
135
|
+
```python
|
|
136
|
+
# Silently incomplete for large collections:
|
|
137
|
+
first_page = await b1.items.execute() # → 20 items (SAP's default page)
|
|
138
|
+
|
|
139
|
+
# Full dataset, zero boilerplate:
|
|
140
|
+
async for item in b1.items.stream(): # → all items, all pages
|
|
141
|
+
process(item)
|
|
142
|
+
|
|
143
|
+
# .top(N) is a hard global cap — not a page size:
|
|
144
|
+
async for item in b1.items.top(100).stream(page_size=20):
|
|
145
|
+
... # exactly 100 items, fetched in batches of 20
|
|
146
|
+
|
|
147
|
+
# Safety ceiling on HTTP requests for large tables:
|
|
148
|
+
async for item in b1.items.stream(page_size=50, max_pages=5):
|
|
149
|
+
... # at most 250 items, at most 5 requests
|
|
150
|
+
|
|
151
|
+
# Filters are preserved across every page boundary:
|
|
152
|
+
async for item in b1.items.filter(F.ItemType == "itItems").stream():
|
|
153
|
+
assert item.item_type == "itItems" # guaranteed on page 2, 3, ...
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
The sync client has full parity:
|
|
157
|
+
|
|
158
|
+
```python
|
|
159
|
+
from itertools import islice
|
|
160
|
+
from b1sl.b1sl import B1Client
|
|
161
|
+
|
|
162
|
+
with B1Client(config) as b1:
|
|
163
|
+
for item in b1.items.top(50).stream(page_size=10):
|
|
164
|
+
print(item.item_code)
|
|
165
|
+
|
|
166
|
+
# islice limits consumption — not HTTP requests.
|
|
167
|
+
# Use .top(N) when you want to limit requests.
|
|
168
|
+
first_5 = list(islice(b1.items.stream(page_size=20), 5))
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## `$batch` Requests
|
|
174
|
+
|
|
175
|
+
Group multiple operations into a single HTTP round-trip. Use changesets for atomic write transactions.
|
|
176
|
+
|
|
177
|
+
```python
|
|
178
|
+
from b1sl.b1sl import entities as en
|
|
179
|
+
|
|
180
|
+
async with AsyncB1Client(config) as b1:
|
|
181
|
+
async with b1.batch() as batch:
|
|
182
|
+
# Reads — enqueued, not executed
|
|
183
|
+
await batch.items.top(1).execute()
|
|
184
|
+
await batch.business_partners.top(1).execute()
|
|
185
|
+
|
|
186
|
+
# Atomic changeset — all succeed or all fail
|
|
187
|
+
async with batch.changeset() as cs:
|
|
188
|
+
await cs.items.create(en.Item(item_code="B001", item_name="New Item"))
|
|
189
|
+
await cs.items.update("A001", en.Item(item_name="Renamed"))
|
|
190
|
+
|
|
191
|
+
results = await batch.execute()
|
|
192
|
+
|
|
193
|
+
if results.all_ok:
|
|
194
|
+
print(f"Created/Updated items successfully")
|
|
195
|
+
else:
|
|
196
|
+
for r in results.failed:
|
|
197
|
+
print(f"Operation {r.index} failed: {r.error}")
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Dynamic UDF Handling
|
|
203
|
+
|
|
204
|
+
Schema discovery, type-safe access, and opt-in Pydantic validation — no manual model extensions required.
|
|
205
|
+
|
|
206
|
+
```python
|
|
207
|
+
# Constructor injection
|
|
208
|
+
new_item = en.Item(item_code="NEW", udfs={"U_Category": "Hardware"})
|
|
209
|
+
|
|
210
|
+
# Surgical update
|
|
211
|
+
await b1.items.update("A001", en.Item(udfs={"U_Status": "Active"}))
|
|
212
|
+
|
|
213
|
+
# Schema discovery
|
|
214
|
+
schema = await b1.items.get_udf_schema()
|
|
215
|
+
print(schema) # UDFSchema(table='OITM', fields=12)
|
|
216
|
+
print("U_Category" in schema) # True
|
|
217
|
+
print(schema["U_Category"].type) # 'db_Alpha'
|
|
218
|
+
|
|
219
|
+
# Opt-in validation — generates a scoped Pydantic model on demand
|
|
220
|
+
DynamicUDFs = schema.to_pydantic_model("ItemUDFs")
|
|
221
|
+
validated = DynamicUDFs.model_validate({"U_Category": "Hardware"})
|
|
222
|
+
|
|
223
|
+
# Or the full shortcut: validate + serialize in one call
|
|
224
|
+
payload = schema.validate_and_dump({"U_Category": "Hardware"})
|
|
225
|
+
await b1.items.update("A001", en.Item(udfs=payload))
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
> [!IMPORTANT]
|
|
229
|
+
> The `.udfs` proxy enforces the `U_` prefix to prevent accidental overwrites of SAP core fields.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Advanced Usage: FastAPI Integration
|
|
234
|
+
|
|
235
|
+
b1sl is optimized for modern web frameworks. Use the Lifespan pattern to share a single connection pool across all requests.
|
|
236
|
+
|
|
237
|
+
```python
|
|
238
|
+
from fastapi import FastAPI
|
|
239
|
+
from contextlib import asynccontextmanager
|
|
240
|
+
from b1sl.b1sl import AsyncB1Client, B1Config
|
|
241
|
+
|
|
242
|
+
b1_client: AsyncB1Client | None = None
|
|
243
|
+
|
|
244
|
+
@asynccontextmanager
|
|
245
|
+
async def lifespan(app: FastAPI):
|
|
246
|
+
global b1_client
|
|
247
|
+
b1_client = AsyncB1Client(B1Config.from_env())
|
|
248
|
+
await b1_client.connect()
|
|
249
|
+
yield
|
|
250
|
+
await b1_client.aclose()
|
|
251
|
+
|
|
252
|
+
app = FastAPI(lifespan=lifespan)
|
|
253
|
+
|
|
254
|
+
@app.get("/items/{item_code}")
|
|
255
|
+
async def get_item(item_code: str):
|
|
256
|
+
return await b1_client.items.get(item_code)
|
|
257
|
+
|
|
258
|
+
@app.get("/items")
|
|
259
|
+
async def list_items():
|
|
260
|
+
# Stream the full catalog without loading it all into memory
|
|
261
|
+
return [item async for item in b1_client.items.stream(page_size=100)]
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Architecture Overview
|
|
267
|
+
|
|
268
|
+
| Feature | Implementation | Benefit |
|
|
269
|
+
|:---|:---|:---|
|
|
270
|
+
| **HTTP Engine** | `httpx` (Async + Sync) | Superior performance, timeouts, connection pooling |
|
|
271
|
+
| **Data Models** | Pydantic v2 | Runtime validation, IDE autocomplete, zero surprises |
|
|
272
|
+
| **Auth** | Auto-retry 401 + Session Hydration | Zero-downtime in serverless and long-running contexts |
|
|
273
|
+
| **Concurrency** | Shared connection pool + internal locking | Prevents SAP license exhaustion under concurrent load |
|
|
274
|
+
| **Pagination** | Generator-based `nextLink` follower | Memory-efficient iteration over arbitrarily large datasets |
|
|
275
|
+
| **Batch** | `RecordingAdapter` proxy pattern | Full SDK API reuse inside transactions, no new methods to learn |
|
|
276
|
+
| **UDFs** | `UDFSchema` container + dynamic Pydantic | Schema discovery, validation, and serialization in one object |
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Why b1sl?
|
|
281
|
+
|
|
282
|
+
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. Beyond auth, naive implementations silently truncate paginated results and require manual OData string construction.
|
|
283
|
+
|
|
284
|
+
b1sl addresses the full stack of these concerns:
|
|
285
|
+
|
|
286
|
+
1. **Session Persistence**: Long-lived sessions with atomic re-authentication and internal locking.
|
|
287
|
+
2. **Complete Data Access**: `.stream()` ensures you never silently miss records due to SAP's default page size.
|
|
288
|
+
3. **Transactional Integrity**: `$batch` with changesets gives you atomicity without writing multipart HTTP by hand.
|
|
289
|
+
4. **Zero Learning Curve for New APIs**: The batch proxy reuses the same SDK API — `batch.items.create()` works identically to `b1.items.create()`.
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## SAP Compatibility
|
|
294
|
+
|
|
295
|
+
Defaults to **OData V4 (Service Layer v2)**.
|
|
296
|
+
|
|
297
|
+
| Requirement | Minimum Version |
|
|
298
|
+
|:---|:---|
|
|
299
|
+
| Verified baseline | Service Layer 1.27 (SAP 10.0 FP 2405) |
|
|
300
|
+
| ETag support | Service Layer 1.21+ (March 2021) |
|
|
301
|
+
| OData V2 fallback | Configurable via client options |
|
|
302
|
+
|
|
303
|
+
For the full compatibility timeline, see [docs/02-compatibility.md](https://github.com/operator-ita/b1sl-python/blob/main/docs/02-compatibility.md).
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## Contributing
|
|
308
|
+
|
|
309
|
+
Contributions are welcome. Please open an issue to discuss proposed changes before submitting a pull request.
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## License
|
|
314
|
+
|
|
315
|
+
MIT © 2026.
|