b1sl-python 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- b1sl/__init__.py +5 -0
- b1sl/b1sl/__init__.py +56 -0
- b1sl/b1sl/_types.py +28 -0
- b1sl/b1sl/adapter.py +40 -0
- b1sl/b1sl/adapter_protocol.py +28 -0
- b1sl/b1sl/async_client.py +268 -0
- b1sl/b1sl/async_rest_adapter.py +347 -0
- b1sl/b1sl/base_adapter.py +394 -0
- b1sl/b1sl/client.py +112 -0
- b1sl/b1sl/config.py +138 -0
- b1sl/b1sl/config_manager.py +77 -0
- b1sl/b1sl/contrib/__init__.py +14 -0
- b1sl/b1sl/contrib/django/__init__.py +13 -0
- b1sl/b1sl/contrib/django/middleware/__init__.py +27 -0
- b1sl/b1sl/contrib/django/middleware/base.py +89 -0
- b1sl/b1sl/contrib/django/middleware/odata_decode_middleware.py +20 -0
- b1sl/b1sl/contrib/django/middleware/odata_transform_url_middleware.py +20 -0
- b1sl/b1sl/entities/__init__.py +2209 -0
- b1sl/b1sl/environment.py +36 -0
- b1sl/b1sl/exceptions/exceptions.py +142 -0
- b1sl/b1sl/fields/__init__.py +2020 -0
- b1sl/b1sl/fields/_generated/__init__.py +0 -0
- b1sl/b1sl/fields/_generated/complex_types.py +6926 -0
- b1sl/b1sl/fields/_generated/entities/__init__.py +0 -0
- b1sl/b1sl/fields/_generated/entities/businesspartners.py +544 -0
- b1sl/b1sl/fields/_generated/entities/finance.py +451 -0
- b1sl/b1sl/fields/_generated/entities/general.py +4587 -0
- b1sl/b1sl/fields/_generated/entities/inventory.py +761 -0
- b1sl/b1sl/fields/_generated/entities/production.py +256 -0
- b1sl/b1sl/fields/_generated/entities/purchasing.py +53 -0
- b1sl/b1sl/fields/_generated/entities/sales.py +244 -0
- b1sl/b1sl/logging_utils.py +119 -0
- b1sl/b1sl/models/__init__.py +13 -0
- b1sl/b1sl/models/_generated/__init__.py +0 -0
- b1sl/b1sl/models/_generated/_types.py +5 -0
- b1sl/b1sl/models/_generated/complex_types.py +6929 -0
- b1sl/b1sl/models/_generated/entities/__init__.py +581 -0
- b1sl/b1sl/models/_generated/entities/businesspartners.py +565 -0
- b1sl/b1sl/models/_generated/entities/finance.py +472 -0
- b1sl/b1sl/models/_generated/entities/general.py +4831 -0
- b1sl/b1sl/models/_generated/entities/inventory.py +786 -0
- b1sl/b1sl/models/_generated/entities/production.py +272 -0
- b1sl/b1sl/models/_generated/entities/purchasing.py +64 -0
- b1sl/b1sl/models/_generated/entities/sales.py +263 -0
- b1sl/b1sl/models/_generated/enums.py +3501 -0
- b1sl/b1sl/models/_generated/resources/__init__.py +0 -0
- b1sl/b1sl/models/_overrides/inventory.py +24 -0
- b1sl/b1sl/models/base.py +209 -0
- b1sl/b1sl/models/odata_query_model.py +50 -0
- b1sl/b1sl/models/paginated_result.py +85 -0
- b1sl/b1sl/models/result.py +17 -0
- b1sl/b1sl/resources/__init__.py +11 -0
- b1sl/b1sl/resources/_generated/__init__.py +0 -0
- b1sl/b1sl/resources/_generated/account_category.py +15 -0
- b1sl/b1sl/resources/_generated/account_category_service.py +21 -0
- b1sl/b1sl/resources/_generated/account_segmentation_categories.py +15 -0
- b1sl/b1sl/resources/_generated/account_segmentations.py +15 -0
- b1sl/b1sl/resources/_generated/accounts_service.py +33 -0
- b1sl/b1sl/resources/_generated/accrual_types.py +15 -0
- b1sl/b1sl/resources/_generated/accrual_types_service.py +21 -0
- b1sl/b1sl/resources/_generated/activities.py +15 -0
- b1sl/b1sl/resources/_generated/activities_service.py +109 -0
- b1sl/b1sl/resources/_generated/activity_locations.py +15 -0
- b1sl/b1sl/resources/_generated/activity_recipient_lists.py +15 -0
- b1sl/b1sl/resources/_generated/activity_recipient_lists_service.py +21 -0
- b1sl/b1sl/resources/_generated/activity_statuses.py +15 -0
- b1sl/b1sl/resources/_generated/activity_types.py +15 -0
- b1sl/b1sl/resources/_generated/additional_expenses.py +15 -0
- b1sl/b1sl/resources/_generated/address_service.py +38 -0
- b1sl/b1sl/resources/_generated/alert_managements.py +16 -0
- b1sl/b1sl/resources/_generated/alternate_cat_num.py +15 -0
- b1sl/b1sl/resources/_generated/alternative_items_service.py +113 -0
- b1sl/b1sl/resources/_generated/approval_requests.py +15 -0
- b1sl/b1sl/resources/_generated/approval_requests_service.py +33 -0
- b1sl/b1sl/resources/_generated/approval_stages.py +15 -0
- b1sl/b1sl/resources/_generated/approval_stages_service.py +21 -0
- b1sl/b1sl/resources/_generated/approval_templates.py +15 -0
- b1sl/b1sl/resources/_generated/approval_templates_service.py +21 -0
- b1sl/b1sl/resources/_generated/asset_capitalization.py +15 -0
- b1sl/b1sl/resources/_generated/asset_capitalization_credit_memo.py +15 -0
- b1sl/b1sl/resources/_generated/asset_capitalization_credit_memo_service.py +37 -0
- b1sl/b1sl/resources/_generated/asset_capitalization_service.py +37 -0
- b1sl/b1sl/resources/_generated/asset_classes.py +15 -0
- b1sl/b1sl/resources/_generated/asset_classes_service.py +21 -0
- b1sl/b1sl/resources/_generated/asset_depreciation_groups.py +15 -0
- b1sl/b1sl/resources/_generated/asset_depreciation_groups_service.py +21 -0
- b1sl/b1sl/resources/_generated/asset_groups.py +15 -0
- b1sl/b1sl/resources/_generated/asset_groups_service.py +21 -0
- b1sl/b1sl/resources/_generated/asset_manual_depreciation.py +15 -0
- b1sl/b1sl/resources/_generated/asset_manual_depreciation_service.py +37 -0
- b1sl/b1sl/resources/_generated/asset_retirement.py +15 -0
- b1sl/b1sl/resources/_generated/asset_retirement_service.py +37 -0
- b1sl/b1sl/resources/_generated/asset_transfer.py +15 -0
- b1sl/b1sl/resources/_generated/asset_transfer_service.py +37 -0
- b1sl/b1sl/resources/_generated/attachments2.py +15 -0
- b1sl/b1sl/resources/_generated/attribute_groups.py +15 -0
- b1sl/b1sl/resources/_generated/attribute_groups_service.py +21 -0
- b1sl/b1sl/resources/_generated/bank_charges_allocation_codes.py +15 -0
- b1sl/b1sl/resources/_generated/bank_charges_allocation_codes_service.py +21 -0
- b1sl/b1sl/resources/_generated/bank_pages.py +15 -0
- b1sl/b1sl/resources/_generated/bank_statements.py +15 -0
- b1sl/b1sl/resources/_generated/bank_statements_service.py +32 -0
- b1sl/b1sl/resources/_generated/banks.py +15 -0
- b1sl/b1sl/resources/_generated/bar_codes.py +15 -0
- b1sl/b1sl/resources/_generated/bar_codes_service.py +21 -0
- b1sl/b1sl/resources/_generated/batch_number_details.py +15 -0
- b1sl/b1sl/resources/_generated/bill_of_exchange_transactions.py +15 -0
- b1sl/b1sl/resources/_generated/bin_location_attributes.py +15 -0
- b1sl/b1sl/resources/_generated/bin_location_attributes_service.py +21 -0
- b1sl/b1sl/resources/_generated/bin_location_fields.py +15 -0
- b1sl/b1sl/resources/_generated/bin_location_fields_service.py +21 -0
- b1sl/b1sl/resources/_generated/bin_locations.py +15 -0
- b1sl/b1sl/resources/_generated/bin_locations_service.py +21 -0
- b1sl/b1sl/resources/_generated/blanket_agreements.py +15 -0
- b1sl/b1sl/resources/_generated/blanket_agreements_service.py +21 -0
- b1sl/b1sl/resources/_generated/boe_document_types.py +15 -0
- b1sl/b1sl/resources/_generated/boe_document_types_service.py +21 -0
- b1sl/b1sl/resources/_generated/boe_instructions.py +15 -0
- b1sl/b1sl/resources/_generated/boe_instructions_service.py +21 -0
- b1sl/b1sl/resources/_generated/boe_lines_service.py +30 -0
- b1sl/b1sl/resources/_generated/boe_portfolios.py +15 -0
- b1sl/b1sl/resources/_generated/boe_portfolios_service.py +21 -0
- b1sl/b1sl/resources/_generated/bp_fiscal_registry_id.py +15 -0
- b1sl/b1sl/resources/_generated/bp_opening_balance_service.py +41 -0
- b1sl/b1sl/resources/_generated/bp_priorities.py +15 -0
- b1sl/b1sl/resources/_generated/branches.py +15 -0
- b1sl/b1sl/resources/_generated/branches_service.py +21 -0
- b1sl/b1sl/resources/_generated/brazil_beverage_indexers.py +15 -0
- b1sl/b1sl/resources/_generated/brazil_beverage_indexers_service.py +21 -0
- b1sl/b1sl/resources/_generated/brazil_fuel_indexers.py +15 -0
- b1sl/b1sl/resources/_generated/brazil_fuel_indexers_service.py +21 -0
- b1sl/b1sl/resources/_generated/brazil_multi_indexers.py +15 -0
- b1sl/b1sl/resources/_generated/brazil_numeric_indexers.py +15 -0
- b1sl/b1sl/resources/_generated/brazil_string_indexers.py +15 -0
- b1sl/b1sl/resources/_generated/budget_distributions.py +15 -0
- b1sl/b1sl/resources/_generated/budget_scenarios.py +15 -0
- b1sl/b1sl/resources/_generated/budgets.py +15 -0
- b1sl/b1sl/resources/_generated/business_partner_groups.py +15 -0
- b1sl/b1sl/resources/_generated/business_partner_properties.py +15 -0
- b1sl/b1sl/resources/_generated/business_partner_properties_service.py +21 -0
- b1sl/b1sl/resources/_generated/business_partners.py +15 -0
- b1sl/b1sl/resources/_generated/business_partners_service.py +47 -0
- b1sl/b1sl/resources/_generated/business_places.py +15 -0
- b1sl/b1sl/resources/_generated/campaign_response_type.py +15 -0
- b1sl/b1sl/resources/_generated/campaign_response_type_service.py +21 -0
- b1sl/b1sl/resources/_generated/campaigns.py +15 -0
- b1sl/b1sl/resources/_generated/campaigns_service.py +21 -0
- b1sl/b1sl/resources/_generated/cash_discounts.py +15 -0
- b1sl/b1sl/resources/_generated/cash_discounts_service.py +21 -0
- b1sl/b1sl/resources/_generated/cash_flow_line_items.py +15 -0
- b1sl/b1sl/resources/_generated/cash_flow_line_items_service.py +21 -0
- b1sl/b1sl/resources/_generated/certificate_series.py +15 -0
- b1sl/b1sl/resources/_generated/certificate_series_service.py +21 -0
- b1sl/b1sl/resources/_generated/change_logs_service.py +51 -0
- b1sl/b1sl/resources/_generated/chart_of_accounts.py +15 -0
- b1sl/b1sl/resources/_generated/check_lines_service.py +38 -0
- b1sl/b1sl/resources/_generated/checksfor_payment.py +15 -0
- b1sl/b1sl/resources/_generated/choose_from_list.py +15 -0
- b1sl/b1sl/resources/_generated/client_mixin.py +3920 -0
- b1sl/b1sl/resources/_generated/closing_date_procedure.py +15 -0
- b1sl/b1sl/resources/_generated/cockpits.py +15 -0
- b1sl/b1sl/resources/_generated/cockpits_service.py +46 -0
- b1sl/b1sl/resources/_generated/commission_groups.py +15 -0
- b1sl/b1sl/resources/_generated/company_service.py +410 -0
- b1sl/b1sl/resources/_generated/contacts.py +15 -0
- b1sl/b1sl/resources/_generated/contract_templates.py +15 -0
- b1sl/b1sl/resources/_generated/correction_invoice.py +15 -0
- b1sl/b1sl/resources/_generated/correction_invoice_reversal.py +15 -0
- b1sl/b1sl/resources/_generated/correction_invoice_reversal_service.py +65 -0
- b1sl/b1sl/resources/_generated/correction_invoice_service.py +78 -0
- b1sl/b1sl/resources/_generated/correction_purchase_invoice.py +15 -0
- b1sl/b1sl/resources/_generated/correction_purchase_invoice_reversal.py +15 -0
- b1sl/b1sl/resources/_generated/correction_purchase_invoice_reversal_service.py +65 -0
- b1sl/b1sl/resources/_generated/correction_purchase_invoice_service.py +78 -0
- b1sl/b1sl/resources/_generated/cost_center_types.py +15 -0
- b1sl/b1sl/resources/_generated/cost_center_types_service.py +21 -0
- b1sl/b1sl/resources/_generated/cost_element_service.py +21 -0
- b1sl/b1sl/resources/_generated/cost_elements.py +15 -0
- b1sl/b1sl/resources/_generated/counties.py +15 -0
- b1sl/b1sl/resources/_generated/counties_service.py +21 -0
- b1sl/b1sl/resources/_generated/countries.py +15 -0
- b1sl/b1sl/resources/_generated/countries_service.py +21 -0
- b1sl/b1sl/resources/_generated/credit_card_payments.py +15 -0
- b1sl/b1sl/resources/_generated/credit_cards.py +15 -0
- b1sl/b1sl/resources/_generated/credit_lines_service.py +38 -0
- b1sl/b1sl/resources/_generated/credit_notes.py +15 -0
- b1sl/b1sl/resources/_generated/credit_notes_service.py +100 -0
- b1sl/b1sl/resources/_generated/credit_payment_methods.py +15 -0
- b1sl/b1sl/resources/_generated/currencies.py +15 -0
- b1sl/b1sl/resources/_generated/customer_equipment_cards.py +15 -0
- b1sl/b1sl/resources/_generated/customs_declaration.py +15 -0
- b1sl/b1sl/resources/_generated/customs_groups.py +15 -0
- b1sl/b1sl/resources/_generated/cycle_count_determinations.py +15 -0
- b1sl/b1sl/resources/_generated/cycle_count_determinations_service.py +21 -0
- b1sl/b1sl/resources/_generated/dashboard_packages_service.py +28 -0
- b1sl/b1sl/resources/_generated/deductible_tax_service.py +21 -0
- b1sl/b1sl/resources/_generated/deductible_taxes.py +15 -0
- b1sl/b1sl/resources/_generated/deduction_tax_groups.py +15 -0
- b1sl/b1sl/resources/_generated/deduction_tax_hierarchies.py +15 -0
- b1sl/b1sl/resources/_generated/deduction_tax_sub_groups.py +15 -0
- b1sl/b1sl/resources/_generated/deduction_tax_sub_groups_service.py +21 -0
- b1sl/b1sl/resources/_generated/delivery_notes.py +15 -0
- b1sl/b1sl/resources/_generated/delivery_notes_service.py +85 -0
- b1sl/b1sl/resources/_generated/departments.py +15 -0
- b1sl/b1sl/resources/_generated/departments_service.py +21 -0
- b1sl/b1sl/resources/_generated/deposits.py +15 -0
- b1sl/b1sl/resources/_generated/deposits_service.py +53 -0
- b1sl/b1sl/resources/_generated/depreciation_areas.py +15 -0
- b1sl/b1sl/resources/_generated/depreciation_areas_service.py +21 -0
- b1sl/b1sl/resources/_generated/depreciation_type_pools.py +15 -0
- b1sl/b1sl/resources/_generated/depreciation_type_pools_service.py +21 -0
- b1sl/b1sl/resources/_generated/depreciation_types.py +15 -0
- b1sl/b1sl/resources/_generated/depreciation_types_service.py +21 -0
- b1sl/b1sl/resources/_generated/determination_criterias.py +15 -0
- b1sl/b1sl/resources/_generated/determination_criterias_service.py +21 -0
- b1sl/b1sl/resources/_generated/dimensions.py +15 -0
- b1sl/b1sl/resources/_generated/dimensions_service.py +21 -0
- b1sl/b1sl/resources/_generated/distribution_rules.py +15 -0
- b1sl/b1sl/resources/_generated/distribution_rules_service.py +21 -0
- b1sl/b1sl/resources/_generated/dnf_code_setup.py +15 -0
- b1sl/b1sl/resources/_generated/dnf_code_setup_service.py +21 -0
- b1sl/b1sl/resources/_generated/down_payments.py +15 -0
- b1sl/b1sl/resources/_generated/down_payments_service.py +68 -0
- b1sl/b1sl/resources/_generated/drafts.py +15 -0
- b1sl/b1sl/resources/_generated/drafts_service.py +86 -0
- b1sl/b1sl/resources/_generated/dunning_letters.py +15 -0
- b1sl/b1sl/resources/_generated/dunning_terms.py +15 -0
- b1sl/b1sl/resources/_generated/dunning_terms_service.py +21 -0
- b1sl/b1sl/resources/_generated/dynamic_system_strings.py +15 -0
- b1sl/b1sl/resources/_generated/electronic_communication_action_service.py +122 -0
- b1sl/b1sl/resources/_generated/electronic_communication_actions_service.py +119 -0
- b1sl/b1sl/resources/_generated/electronic_file_formats.py +15 -0
- b1sl/b1sl/resources/_generated/electronic_file_formats_service.py +21 -0
- b1sl/b1sl/resources/_generated/email_groups.py +15 -0
- b1sl/b1sl/resources/_generated/email_groups_service.py +21 -0
- b1sl/b1sl/resources/_generated/employee_id_type.py +15 -0
- b1sl/b1sl/resources/_generated/employee_id_type_service.py +21 -0
- b1sl/b1sl/resources/_generated/employee_position.py +15 -0
- b1sl/b1sl/resources/_generated/employee_position_service.py +21 -0
- b1sl/b1sl/resources/_generated/employee_roles_setup.py +15 -0
- b1sl/b1sl/resources/_generated/employee_roles_setup_service.py +21 -0
- b1sl/b1sl/resources/_generated/employee_status.py +15 -0
- b1sl/b1sl/resources/_generated/employee_status_service.py +21 -0
- b1sl/b1sl/resources/_generated/employee_transfers.py +15 -0
- b1sl/b1sl/resources/_generated/employee_transfers_service.py +21 -0
- b1sl/b1sl/resources/_generated/employees_info.py +15 -0
- b1sl/b1sl/resources/_generated/employment_category_service.py +21 -0
- b1sl/b1sl/resources/_generated/employment_categorys.py +15 -0
- b1sl/b1sl/resources/_generated/enhanced_discount_groups.py +15 -0
- b1sl/b1sl/resources/_generated/enhanced_discount_groups_service.py +21 -0
- b1sl/b1sl/resources/_generated/exceptional_event_service.py +21 -0
- b1sl/b1sl/resources/_generated/exceptional_events.py +15 -0
- b1sl/b1sl/resources/_generated/extended_translations.py +15 -0
- b1sl/b1sl/resources/_generated/extended_translations_service.py +21 -0
- b1sl/b1sl/resources/_generated/external_calls_service.py +54 -0
- b1sl/b1sl/resources/_generated/external_reconciliations_service.py +104 -0
- b1sl/b1sl/resources/_generated/fa_account_determinations.py +15 -0
- b1sl/b1sl/resources/_generated/fa_account_determinations_service.py +21 -0
- b1sl/b1sl/resources/_generated/factoring_indicators.py +15 -0
- b1sl/b1sl/resources/_generated/financial_years.py +15 -0
- b1sl/b1sl/resources/_generated/financial_years_service.py +21 -0
- b1sl/b1sl/resources/_generated/fiscal_printer.py +15 -0
- b1sl/b1sl/resources/_generated/fiscal_printer_service.py +21 -0
- b1sl/b1sl/resources/_generated/fixed_asset_items_service.py +55 -0
- b1sl/b1sl/resources/_generated/form_preferences.py +15 -0
- b1sl/b1sl/resources/_generated/formatted_searches.py +15 -0
- b1sl/b1sl/resources/_generated/forms1099.py +15 -0
- b1sl/b1sl/resources/_generated/gl_account_advanced_rules.py +15 -0
- b1sl/b1sl/resources/_generated/gl_account_advanced_rules_service.py +21 -0
- b1sl/b1sl/resources/_generated/goods_return_request.py +15 -0
- b1sl/b1sl/resources/_generated/goods_return_request_service.py +69 -0
- b1sl/b1sl/resources/_generated/gov_pay_codes.py +15 -0
- b1sl/b1sl/resources/_generated/gov_pay_codes_service.py +21 -0
- b1sl/b1sl/resources/_generated/gt_is_service.py +28 -0
- b1sl/b1sl/resources/_generated/holidays.py +15 -0
- b1sl/b1sl/resources/_generated/house_bank_accounts.py +15 -0
- b1sl/b1sl/resources/_generated/incoming_payments.py +15 -0
- b1sl/b1sl/resources/_generated/india_hsn.py +15 -0
- b1sl/b1sl/resources/_generated/india_hsn_service.py +21 -0
- b1sl/b1sl/resources/_generated/industries.py +15 -0
- b1sl/b1sl/resources/_generated/integration_packages_configure.py +15 -0
- b1sl/b1sl/resources/_generated/integration_packages_configure_service.py +21 -0
- b1sl/b1sl/resources/_generated/internal_reconciliations.py +15 -0
- b1sl/b1sl/resources/_generated/internal_reconciliations_service.py +51 -0
- b1sl/b1sl/resources/_generated/intrastat_configuration.py +15 -0
- b1sl/b1sl/resources/_generated/intrastat_configuration_service.py +21 -0
- b1sl/b1sl/resources/_generated/inventory_countings.py +15 -0
- b1sl/b1sl/resources/_generated/inventory_countings_service.py +21 -0
- b1sl/b1sl/resources/_generated/inventory_cycles.py +15 -0
- b1sl/b1sl/resources/_generated/inventory_gen_entries.py +15 -0
- b1sl/b1sl/resources/_generated/inventory_gen_entry_service.py +67 -0
- b1sl/b1sl/resources/_generated/inventory_gen_exit_service.py +66 -0
- b1sl/b1sl/resources/_generated/inventory_gen_exits.py +15 -0
- b1sl/b1sl/resources/_generated/inventory_opening_balances.py +15 -0
- b1sl/b1sl/resources/_generated/inventory_opening_balances_service.py +21 -0
- b1sl/b1sl/resources/_generated/inventory_postings.py +15 -0
- b1sl/b1sl/resources/_generated/inventory_postings_service.py +34 -0
- b1sl/b1sl/resources/_generated/inventory_transfer_requests.py +15 -0
- b1sl/b1sl/resources/_generated/inventory_transfer_requests_service.py +43 -0
- b1sl/b1sl/resources/_generated/invoices.py +15 -0
- b1sl/b1sl/resources/_generated/invoices_service.py +100 -0
- b1sl/b1sl/resources/_generated/item_groups.py +15 -0
- b1sl/b1sl/resources/_generated/item_properties.py +15 -0
- b1sl/b1sl/resources/_generated/items.py +15 -0
- b1sl/b1sl/resources/_generated/journal_entries.py +15 -0
- b1sl/b1sl/resources/_generated/journal_entry_document_type_service.py +21 -0
- b1sl/b1sl/resources/_generated/journal_entry_document_types.py +15 -0
- b1sl/b1sl/resources/_generated/journal_vouchers_service.py +45 -0
- b1sl/b1sl/resources/_generated/knowledge_base_solutions.py +15 -0
- b1sl/b1sl/resources/_generated/kp_is.py +15 -0
- b1sl/b1sl/resources/_generated/kp_is_service.py +21 -0
- b1sl/b1sl/resources/_generated/landed_costs.py +15 -0
- b1sl/b1sl/resources/_generated/landed_costs_codes.py +15 -0
- b1sl/b1sl/resources/_generated/landed_costs_service.py +21 -0
- b1sl/b1sl/resources/_generated/legal_data.py +15 -0
- b1sl/b1sl/resources/_generated/length_measures.py +15 -0
- b1sl/b1sl/resources/_generated/license_service.py +21 -0
- b1sl/b1sl/resources/_generated/local_era.py +15 -0
- b1sl/b1sl/resources/_generated/manufacturers.py +15 -0
- b1sl/b1sl/resources/_generated/material_groups.py +15 -0
- b1sl/b1sl/resources/_generated/material_groups_service.py +21 -0
- b1sl/b1sl/resources/_generated/material_revaluation.py +15 -0
- b1sl/b1sl/resources/_generated/material_revaluation_fifo_service.py +33 -0
- b1sl/b1sl/resources/_generated/material_revaluation_snb_service.py +33 -0
- b1sl/b1sl/resources/_generated/messages.py +15 -0
- b1sl/b1sl/resources/_generated/messages_service.py +35 -0
- b1sl/b1sl/resources/_generated/mobile_add_on_setting.py +15 -0
- b1sl/b1sl/resources/_generated/mobile_add_on_setting_service.py +21 -0
- b1sl/b1sl/resources/_generated/mobile_app_service.py +240 -0
- b1sl/b1sl/resources/_generated/multi_language_translations.py +15 -0
- b1sl/b1sl/resources/_generated/nature_of_assessees.py +15 -0
- b1sl/b1sl/resources/_generated/nature_of_assessees_service.py +21 -0
- b1sl/b1sl/resources/_generated/ncm_codes_setup.py +15 -0
- b1sl/b1sl/resources/_generated/ncm_codes_setup_service.py +21 -0
- b1sl/b1sl/resources/_generated/nf_models.py +15 -0
- b1sl/b1sl/resources/_generated/nf_models_service.py +21 -0
- b1sl/b1sl/resources/_generated/nf_tax_categories.py +15 -0
- b1sl/b1sl/resources/_generated/nf_tax_categories_service.py +21 -0
- b1sl/b1sl/resources/_generated/nota_fiscal_cfop.py +15 -0
- b1sl/b1sl/resources/_generated/nota_fiscal_cst.py +15 -0
- b1sl/b1sl/resources/_generated/nota_fiscal_usage.py +15 -0
- b1sl/b1sl/resources/_generated/occurrence_codes.py +15 -0
- b1sl/b1sl/resources/_generated/occurrence_codes_service.py +21 -0
- b1sl/b1sl/resources/_generated/orders.py +15 -0
- b1sl/b1sl/resources/_generated/orders_service.py +94 -0
- b1sl/b1sl/resources/_generated/packages_types.py +15 -0
- b1sl/b1sl/resources/_generated/partners_setups.py +15 -0
- b1sl/b1sl/resources/_generated/partners_setups_service.py +21 -0
- b1sl/b1sl/resources/_generated/payment_blocks.py +15 -0
- b1sl/b1sl/resources/_generated/payment_blocks_service.py +21 -0
- b1sl/b1sl/resources/_generated/payment_calculation_service.py +37 -0
- b1sl/b1sl/resources/_generated/payment_drafts.py +15 -0
- b1sl/b1sl/resources/_generated/payment_reason_code_service.py +21 -0
- b1sl/b1sl/resources/_generated/payment_reason_codes.py +15 -0
- b1sl/b1sl/resources/_generated/payment_run_export.py +15 -0
- b1sl/b1sl/resources/_generated/payment_terms_types.py +15 -0
- b1sl/b1sl/resources/_generated/payment_terms_types_service.py +28 -0
- b1sl/b1sl/resources/_generated/pick_lists.py +15 -0
- b1sl/b1sl/resources/_generated/pick_lists_service.py +78 -0
- b1sl/b1sl/resources/_generated/pos_daily_summary.py +15 -0
- b1sl/b1sl/resources/_generated/predefined_texts.py +15 -0
- b1sl/b1sl/resources/_generated/predefined_texts_service.py +21 -0
- b1sl/b1sl/resources/_generated/price_lists.py +15 -0
- b1sl/b1sl/resources/_generated/product_trees.py +15 -0
- b1sl/b1sl/resources/_generated/production_orders.py +15 -0
- b1sl/b1sl/resources/_generated/profit_centers.py +15 -0
- b1sl/b1sl/resources/_generated/profit_centers_service.py +21 -0
- b1sl/b1sl/resources/_generated/project_management_configuration_service.py +333 -0
- b1sl/b1sl/resources/_generated/project_management_service.py +104 -0
- b1sl/b1sl/resources/_generated/project_management_time_sheet.py +15 -0
- b1sl/b1sl/resources/_generated/project_managements.py +15 -0
- b1sl/b1sl/resources/_generated/projects.py +15 -0
- b1sl/b1sl/resources/_generated/projects_service.py +21 -0
- b1sl/b1sl/resources/_generated/purchase_credit_notes.py +15 -0
- b1sl/b1sl/resources/_generated/purchase_credit_notes_service.py +85 -0
- b1sl/b1sl/resources/_generated/purchase_delivery_notes.py +15 -0
- b1sl/b1sl/resources/_generated/purchase_delivery_notes_service.py +85 -0
- b1sl/b1sl/resources/_generated/purchase_down_payments.py +15 -0
- b1sl/b1sl/resources/_generated/purchase_down_payments_service.py +70 -0
- b1sl/b1sl/resources/_generated/purchase_invoices.py +15 -0
- b1sl/b1sl/resources/_generated/purchase_invoices_service.py +85 -0
- b1sl/b1sl/resources/_generated/purchase_orders.py +15 -0
- b1sl/b1sl/resources/_generated/purchase_orders_service.py +69 -0
- b1sl/b1sl/resources/_generated/purchase_quotations.py +15 -0
- b1sl/b1sl/resources/_generated/purchase_quotations_service.py +70 -0
- b1sl/b1sl/resources/_generated/purchase_request_service.py +68 -0
- b1sl/b1sl/resources/_generated/purchase_requests.py +15 -0
- b1sl/b1sl/resources/_generated/purchase_returns.py +15 -0
- b1sl/b1sl/resources/_generated/purchase_returns_service.py +85 -0
- b1sl/b1sl/resources/_generated/purchase_tax_invoices.py +15 -0
- b1sl/b1sl/resources/_generated/qr_code_service.py +33 -0
- b1sl/b1sl/resources/_generated/query_auth_groups.py +15 -0
- b1sl/b1sl/resources/_generated/query_categories.py +15 -0
- b1sl/b1sl/resources/_generated/query_service.py +29 -0
- b1sl/b1sl/resources/_generated/queue.py +15 -0
- b1sl/b1sl/resources/_generated/quotations.py +15 -0
- b1sl/b1sl/resources/_generated/quotations_service.py +69 -0
- b1sl/b1sl/resources/_generated/recurring_transaction_service.py +67 -0
- b1sl/b1sl/resources/_generated/relationships.py +15 -0
- b1sl/b1sl/resources/_generated/report_filter.py +15 -0
- b1sl/b1sl/resources/_generated/report_filter_service.py +30 -0
- b1sl/b1sl/resources/_generated/report_layouts_service.py +237 -0
- b1sl/b1sl/resources/_generated/report_types.py +15 -0
- b1sl/b1sl/resources/_generated/report_types_service.py +21 -0
- b1sl/b1sl/resources/_generated/resource_capacities.py +15 -0
- b1sl/b1sl/resources/_generated/resource_capacities_service.py +34 -0
- b1sl/b1sl/resources/_generated/resource_groups.py +15 -0
- b1sl/b1sl/resources/_generated/resource_groups_service.py +21 -0
- b1sl/b1sl/resources/_generated/resource_properties.py +15 -0
- b1sl/b1sl/resources/_generated/resource_properties_service.py +21 -0
- b1sl/b1sl/resources/_generated/resources.py +15 -0
- b1sl/b1sl/resources/_generated/resources_service.py +21 -0
- b1sl/b1sl/resources/_generated/retorno_codes.py +15 -0
- b1sl/b1sl/resources/_generated/retorno_codes_service.py +21 -0
- b1sl/b1sl/resources/_generated/return_request.py +15 -0
- b1sl/b1sl/resources/_generated/return_request_service.py +69 -0
- b1sl/b1sl/resources/_generated/returns.py +15 -0
- b1sl/b1sl/resources/_generated/returns_service.py +85 -0
- b1sl/b1sl/resources/_generated/route_stages.py +15 -0
- b1sl/b1sl/resources/_generated/route_stages_service.py +21 -0
- b1sl/b1sl/resources/_generated/sales_forecast.py +15 -0
- b1sl/b1sl/resources/_generated/sales_opportunities.py +15 -0
- b1sl/b1sl/resources/_generated/sales_opportunity_competitors_setup.py +15 -0
- b1sl/b1sl/resources/_generated/sales_opportunity_competitors_setup_service.py +21 -0
- b1sl/b1sl/resources/_generated/sales_opportunity_interests_setup.py +15 -0
- b1sl/b1sl/resources/_generated/sales_opportunity_interests_setup_service.py +21 -0
- b1sl/b1sl/resources/_generated/sales_opportunity_reasons_setup.py +15 -0
- b1sl/b1sl/resources/_generated/sales_opportunity_reasons_setup_service.py +21 -0
- b1sl/b1sl/resources/_generated/sales_opportunity_sources_setup.py +15 -0
- b1sl/b1sl/resources/_generated/sales_opportunity_sources_setup_service.py +21 -0
- b1sl/b1sl/resources/_generated/sales_persons.py +15 -0
- b1sl/b1sl/resources/_generated/sales_stages.py +15 -0
- b1sl/b1sl/resources/_generated/sales_tax_authorities.py +15 -0
- b1sl/b1sl/resources/_generated/sales_tax_authorities_types.py +15 -0
- b1sl/b1sl/resources/_generated/sales_tax_codes.py +15 -0
- b1sl/b1sl/resources/_generated/sales_tax_invoices.py +15 -0
- b1sl/b1sl/resources/_generated/sbo_bob_service.py +89 -0
- b1sl/b1sl/resources/_generated/sections.py +15 -0
- b1sl/b1sl/resources/_generated/sections_service.py +21 -0
- b1sl/b1sl/resources/_generated/self_credit_memo_service.py +69 -0
- b1sl/b1sl/resources/_generated/self_credit_memos.py +15 -0
- b1sl/b1sl/resources/_generated/self_invoice_service.py +69 -0
- b1sl/b1sl/resources/_generated/self_invoices.py +15 -0
- b1sl/b1sl/resources/_generated/serial_number_details.py +15 -0
- b1sl/b1sl/resources/_generated/series_service.py +305 -0
- b1sl/b1sl/resources/_generated/service_call_origins.py +15 -0
- b1sl/b1sl/resources/_generated/service_call_origins_service.py +21 -0
- b1sl/b1sl/resources/_generated/service_call_problem_sub_types.py +15 -0
- b1sl/b1sl/resources/_generated/service_call_problem_sub_types_service.py +21 -0
- b1sl/b1sl/resources/_generated/service_call_problem_types.py +15 -0
- b1sl/b1sl/resources/_generated/service_call_problem_types_service.py +21 -0
- b1sl/b1sl/resources/_generated/service_call_solution_status.py +15 -0
- b1sl/b1sl/resources/_generated/service_call_solution_status_service.py +21 -0
- b1sl/b1sl/resources/_generated/service_call_status.py +15 -0
- b1sl/b1sl/resources/_generated/service_call_status_service.py +21 -0
- b1sl/b1sl/resources/_generated/service_call_types.py +15 -0
- b1sl/b1sl/resources/_generated/service_call_types_service.py +21 -0
- b1sl/b1sl/resources/_generated/service_calls.py +15 -0
- b1sl/b1sl/resources/_generated/service_contracts.py +15 -0
- b1sl/b1sl/resources/_generated/service_groups.py +15 -0
- b1sl/b1sl/resources/_generated/service_groups_service.py +21 -0
- b1sl/b1sl/resources/_generated/service_tax_posting_service.py +36 -0
- b1sl/b1sl/resources/_generated/shipping_types.py +15 -0
- b1sl/b1sl/resources/_generated/short_link_mappings_service.py +26 -0
- b1sl/b1sl/resources/_generated/special_prices.py +15 -0
- b1sl/b1sl/resources/_generated/states.py +15 -0
- b1sl/b1sl/resources/_generated/states_service.py +21 -0
- b1sl/b1sl/resources/_generated/stock_takings.py +15 -0
- b1sl/b1sl/resources/_generated/stock_transfer_draft_service.py +34 -0
- b1sl/b1sl/resources/_generated/stock_transfer_drafts.py +15 -0
- b1sl/b1sl/resources/_generated/stock_transfer_service.py +43 -0
- b1sl/b1sl/resources/_generated/stock_transfers.py +15 -0
- b1sl/b1sl/resources/_generated/target_groups.py +15 -0
- b1sl/b1sl/resources/_generated/target_groups_service.py +21 -0
- b1sl/b1sl/resources/_generated/tax_code_determinations.py +15 -0
- b1sl/b1sl/resources/_generated/tax_code_determinations_service.py +21 -0
- b1sl/b1sl/resources/_generated/tax_code_determinations_tcd.py +15 -0
- b1sl/b1sl/resources/_generated/tax_code_determinations_tcd_service.py +21 -0
- b1sl/b1sl/resources/_generated/tax_invoice_report.py +15 -0
- b1sl/b1sl/resources/_generated/tax_web_sites.py +15 -0
- b1sl/b1sl/resources/_generated/tax_web_sites_service.py +27 -0
- b1sl/b1sl/resources/_generated/teams.py +15 -0
- b1sl/b1sl/resources/_generated/termination_reason.py +15 -0
- b1sl/b1sl/resources/_generated/termination_reason_service.py +21 -0
- b1sl/b1sl/resources/_generated/territories.py +15 -0
- b1sl/b1sl/resources/_generated/tracking_notes.py +15 -0
- b1sl/b1sl/resources/_generated/tracking_notes_service.py +21 -0
- b1sl/b1sl/resources/_generated/transaction_codes.py +15 -0
- b1sl/b1sl/resources/_generated/transaction_codes_service.py +21 -0
- b1sl/b1sl/resources/_generated/transportation_document.py +15 -0
- b1sl/b1sl/resources/_generated/tsr_exceptional_event_service.py +21 -0
- b1sl/b1sl/resources/_generated/tsr_exceptional_events.py +15 -0
- b1sl/b1sl/resources/_generated/unit_of_measurement_groups.py +15 -0
- b1sl/b1sl/resources/_generated/unit_of_measurement_groups_service.py +21 -0
- b1sl/b1sl/resources/_generated/unit_of_measurements.py +15 -0
- b1sl/b1sl/resources/_generated/unit_of_measurements_service.py +21 -0
- b1sl/b1sl/resources/_generated/user_default_groups.py +15 -0
- b1sl/b1sl/resources/_generated/user_fields_md.py +15 -0
- b1sl/b1sl/resources/_generated/user_keys_md.py +15 -0
- b1sl/b1sl/resources/_generated/user_languages.py +15 -0
- b1sl/b1sl/resources/_generated/user_menu_service.py +103 -0
- b1sl/b1sl/resources/_generated/user_objects_md.py +15 -0
- b1sl/b1sl/resources/_generated/user_permission_tree.py +15 -0
- b1sl/b1sl/resources/_generated/user_queries.py +15 -0
- b1sl/b1sl/resources/_generated/user_tables_md.py +15 -0
- b1sl/b1sl/resources/_generated/users.py +15 -0
- b1sl/b1sl/resources/_generated/users_service.py +21 -0
- b1sl/b1sl/resources/_generated/value_mapping.py +15 -0
- b1sl/b1sl/resources/_generated/value_mapping_communication.py +15 -0
- b1sl/b1sl/resources/_generated/value_mapping_service.py +64 -0
- b1sl/b1sl/resources/_generated/vat_groups.py +15 -0
- b1sl/b1sl/resources/_generated/vendor_payments.py +15 -0
- b1sl/b1sl/resources/_generated/w_tax_type_code_service.py +21 -0
- b1sl/b1sl/resources/_generated/w_tax_type_codes.py +15 -0
- b1sl/b1sl/resources/_generated/warehouse_locations.py +15 -0
- b1sl/b1sl/resources/_generated/warehouse_sublevel_codes.py +15 -0
- b1sl/b1sl/resources/_generated/warehouse_sublevel_codes_service.py +21 -0
- b1sl/b1sl/resources/_generated/warehouses.py +15 -0
- b1sl/b1sl/resources/_generated/web_client_bookmark_tile_service.py +21 -0
- b1sl/b1sl/resources/_generated/web_client_bookmark_tiles.py +15 -0
- b1sl/b1sl/resources/_generated/web_client_dashboard_service.py +21 -0
- b1sl/b1sl/resources/_generated/web_client_dashboards.py +15 -0
- b1sl/b1sl/resources/_generated/web_client_form_setting_service.py +21 -0
- b1sl/b1sl/resources/_generated/web_client_form_settings.py +15 -0
- b1sl/b1sl/resources/_generated/web_client_launchpad_service.py +21 -0
- b1sl/b1sl/resources/_generated/web_client_launchpads.py +15 -0
- b1sl/b1sl/resources/_generated/web_client_listview_filter_service.py +21 -0
- b1sl/b1sl/resources/_generated/web_client_listview_filters.py +15 -0
- b1sl/b1sl/resources/_generated/web_client_notification_service.py +21 -0
- b1sl/b1sl/resources/_generated/web_client_notifications.py +15 -0
- b1sl/b1sl/resources/_generated/web_client_preference_service.py +21 -0
- b1sl/b1sl/resources/_generated/web_client_preferences.py +15 -0
- b1sl/b1sl/resources/_generated/web_client_recent_activities.py +15 -0
- b1sl/b1sl/resources/_generated/web_client_recent_activity_service.py +21 -0
- b1sl/b1sl/resources/_generated/web_client_variant_group_service.py +21 -0
- b1sl/b1sl/resources/_generated/web_client_variant_groups.py +15 -0
- b1sl/b1sl/resources/_generated/web_client_variant_service.py +21 -0
- b1sl/b1sl/resources/_generated/web_client_variants.py +15 -0
- b1sl/b1sl/resources/_generated/weight_measures.py +15 -0
- b1sl/b1sl/resources/_generated/withholding_tax_codes.py +15 -0
- b1sl/b1sl/resources/_generated/witholding_tax_definition.py +15 -0
- b1sl/b1sl/resources/_generated/wizard_payment_methods.py +15 -0
- b1sl/b1sl/resources/_generated/workflow_task_service.py +47 -0
- b1sl/b1sl/resources/async_base.py +60 -0
- b1sl/b1sl/resources/base.py +159 -0
- b1sl/b1sl/resources/udo.py +78 -0
- b1sl/b1sl/rest_adapter.py +351 -0
- b1sl/b1sl/testing.py +24 -0
- b1sl/b1sl/tests/__init__.py +0 -0
- b1sl/b1sl/tests/test_01_settings.py +60 -0
- b1sl/b1sl/tests/test_02_rest_adapter.py +177 -0
- b1sl/b1sl/tests/test_03_items_endpoint.py +172 -0
- b1sl/b1sl/tests/test_04_serialnumberdetails_endpoint.py +181 -0
- b1sl/b1sl/tests/test_observability.py +153 -0
- b1sl/b1sl/tests/test_utils.py +24 -0
- b1sl/contrib/__init__.py +0 -0
- b1sl/contrib/django/__init__.py +15 -0
- b1sl/contrib/django/base.py +89 -0
- b1sl/contrib/django/odata_decode_middleware.py +14 -0
- b1sl/contrib/django/odata_transform_url_middleware.py +15 -0
- b1sl/py.typed +0 -0
- b1sl/saphdb/__init__.py +19 -0
- b1sl/saphdb/adapter.py +24 -0
- b1sl/saphdb/client.py +50 -0
- b1sl/saphdb/config.py +68 -0
- b1sl/saphdb/endpoints/serialnumberdetailodbc.py +100 -0
- b1sl/saphdb/exceptions/exceptions.py +19 -0
- b1sl/saphdb/main.py +18 -0
- b1sl/saphdb/models/result.py +18 -0
- b1sl/saphdb/models/serial.py +37 -0
- b1sl/saphdb/odbc_adapter.py +220 -0
- b1sl/saphdb/tests/__init__.py +0 -0
- b1sl/saphdb/tests/test_01_settings.py +37 -0
- b1sl/saphdb/tests/test_02_odbc_adapter.py +96 -0
- b1sl/saphdb/tests/test_04_serialnumberdetails_endpoint.py +131 -0
- b1sl_python-0.1.0.dist-info/METADATA +169 -0
- b1sl_python-0.1.0.dist-info/RECORD +579 -0
- b1sl_python-0.1.0.dist-info/WHEEL +4 -0
- b1sl_python-0.1.0.dist-info/licenses/LICENSE +21 -0
|
File without changes
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from .._generated.entities.inventory import Item as _Item
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Item(_Item):
|
|
5
|
+
"""
|
|
6
|
+
Manual override for Item entity to add business logic.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
@property
|
|
10
|
+
def available_stock(self) -> float:
|
|
11
|
+
"""
|
|
12
|
+
Calculated available stock based on standard SAP logic:
|
|
13
|
+
Available = OnHand - IsCommited + OnOrder
|
|
14
|
+
|
|
15
|
+
Mapping:
|
|
16
|
+
- OnHand: quantity_on_stock
|
|
17
|
+
- IsCommited: quantity_ordered_by_customers
|
|
18
|
+
- OnOrder: quantity_ordered_from_vendors
|
|
19
|
+
"""
|
|
20
|
+
on_hand = self.quantity_on_stock or 0.0
|
|
21
|
+
committed = self.quantity_ordered_by_customers or 0.0
|
|
22
|
+
ordered = self.quantity_ordered_from_vendors or 0.0
|
|
23
|
+
|
|
24
|
+
return on_hand - committed + ordered
|
b1sl/b1sl/models/base.py
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"""
|
|
2
|
+
b1sl.b1sl.models.base
|
|
3
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
4
|
+
Single source of truth for the shared B1Model base class.
|
|
5
|
+
|
|
6
|
+
All SAP B1 Pydantic models in this SDK must inherit from B1Model, never
|
|
7
|
+
directly from pydantic.BaseModel. This guarantees a consistent config
|
|
8
|
+
across the whole model hierarchy:
|
|
9
|
+
|
|
10
|
+
- ``extra='allow'`` — unknown UDFs (U_*) returned by SAP are preserved
|
|
11
|
+
instead of causing a ValidationError.
|
|
12
|
+
- ``populate_by_name=True`` — fields can be set by their Python name
|
|
13
|
+
OR by their SAP alias (whichever is more convenient at the call site).
|
|
14
|
+
|
|
15
|
+
Inbound normalisation contract
|
|
16
|
+
-------------------------------
|
|
17
|
+
``B1Model`` handles SAP-specific encodings transparently via a
|
|
18
|
+
``model_validator(mode='before')`` so every subclass automatically
|
|
19
|
+
receives clean Python values:
|
|
20
|
+
|
|
21
|
+
* ``"tYES"`` / ``"tNO"`` → ``bool``
|
|
22
|
+
* ``"/Date(1735689600000)/"`` → ISO date string ``"2025-01-01"``
|
|
23
|
+
|
|
24
|
+
>>> from b1sl.b1sl.models.base import B1Model
|
|
25
|
+
>>> from pydantic import Field
|
|
26
|
+
>>> class MyModel(B1Model):
|
|
27
|
+
... active: bool | None = Field(None, alias="Active")
|
|
28
|
+
... created: str | None = Field(None, alias="CreateDate")
|
|
29
|
+
>>> MyModel.model_validate({"Active": "tYES", "CreateDate": "/Date(1735689600000)/"})
|
|
30
|
+
MyModel(active=True, created='2025-01-01')
|
|
31
|
+
|
|
32
|
+
Outbound serialisation contract
|
|
33
|
+
---------------------------------
|
|
34
|
+
``to_api_payload()`` reverses the normalisation so SAP receives its native
|
|
35
|
+
format, and enforces ``exclude_unset=True`` to prevent accidental null-
|
|
36
|
+
overwrites on PATCH requests:
|
|
37
|
+
|
|
38
|
+
* ``bool`` → ``"tYES"`` / ``"tNO"``
|
|
39
|
+
* ``datetime.date`` → ISO string ``"YYYY-MM-DD"``
|
|
40
|
+
* ``Valid=True`` → also sets ``Frozen="tNO"`` (SAP invariant)
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
from __future__ import annotations
|
|
44
|
+
|
|
45
|
+
import re
|
|
46
|
+
from datetime import date, datetime, timezone
|
|
47
|
+
from enum import Enum
|
|
48
|
+
from typing import Annotated, Any
|
|
49
|
+
|
|
50
|
+
from pydantic import BaseModel, BeforeValidator, ConfigDict, model_validator
|
|
51
|
+
|
|
52
|
+
# SAP boolean sentinel values — exact set used by the Service Layer.
|
|
53
|
+
_SAP_YES: str = "tYES"
|
|
54
|
+
_SAP_NO: str = "tNO"
|
|
55
|
+
|
|
56
|
+
_SAP_BOOL_TRUE = {"boyes", "tyes", "y", "yes", "true", "1"}
|
|
57
|
+
_SAP_BOOL_FALSE = {"bono", "tno", "n", "no", "false", "0"}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _coerce_sap_boolean(v: Any) -> Any:
|
|
61
|
+
if isinstance(v, str):
|
|
62
|
+
vl = v.lower()
|
|
63
|
+
if vl in _SAP_BOOL_TRUE:
|
|
64
|
+
return True
|
|
65
|
+
elif vl in _SAP_BOOL_FALSE:
|
|
66
|
+
return False
|
|
67
|
+
return v
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
SapBool = Annotated[bool, BeforeValidator(_coerce_sap_boolean)]
|
|
71
|
+
|
|
72
|
+
# /Date(milliseconds_since_epoch)/ — the OData v2 date format SAP uses.
|
|
73
|
+
_SAP_DATE_RE = re.compile(r"^/Date\((\d+)\)/$")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class B1Model(BaseModel):
|
|
77
|
+
"""
|
|
78
|
+
Base for every SAP B1 Pydantic model in the SDK.
|
|
79
|
+
|
|
80
|
+
Subclass this instead of ``pydantic.BaseModel`` to inherit:
|
|
81
|
+
|
|
82
|
+
* Automatic ``/Date(ms)/`` → ISO date string coercion on ingest.
|
|
83
|
+
* ``extra='allow'`` — unknown UDFs (U_* fields) round-trip cleanly.
|
|
84
|
+
* ``populate_by_name=True`` — both Python name and SAP alias accepted.
|
|
85
|
+
* ``to_api_payload()`` — safe outbound serialisation:
|
|
86
|
+
- ``exclude_unset=True`` to prevent over-posting on PATCH.
|
|
87
|
+
- ``bool`` → ``"tYES"``/``"tNO"``
|
|
88
|
+
- ``date`` → ISO string
|
|
89
|
+
- ``Valid`` presence → auto-sets ``Frozen`` to the inverse.
|
|
90
|
+
|
|
91
|
+
UDF Example::
|
|
92
|
+
|
|
93
|
+
class MyItem(B1Model):
|
|
94
|
+
item_code: str = Field(alias="ItemCode")
|
|
95
|
+
custom_field: str | None = Field(None, alias="U_MyCustomField")
|
|
96
|
+
|
|
97
|
+
Because ``extra='allow'`` is set, any *additional* UDFs returned by SAP
|
|
98
|
+
that are not explicitly declared on the subclass are stored in
|
|
99
|
+
``model.__pydantic_extra__`` and round-trip cleanly through
|
|
100
|
+
``to_api_payload()``.
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
model_config = ConfigDict(
|
|
104
|
+
populate_by_name=True, # accept both field name and alias
|
|
105
|
+
extra="allow", # preserve unknown SAP UDFs (U_* fields)
|
|
106
|
+
arbitrary_types_allowed=True,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# ── Inbound coercion (SAP → Python) ─────────────────────────────────── #
|
|
110
|
+
|
|
111
|
+
@model_validator(mode="before")
|
|
112
|
+
@classmethod
|
|
113
|
+
def _coerce_sap_primitives(cls, data: Any) -> Any:
|
|
114
|
+
"""
|
|
115
|
+
Coerce SAP string sentinels to native Python types before
|
|
116
|
+
field-level validation runs.
|
|
117
|
+
|
|
118
|
+
Conversions applied:
|
|
119
|
+
* "/Date(1735689600000)/" → "2025-01-01" (ISO date string)
|
|
120
|
+
* "tYES" / "tNO" etc → bool
|
|
121
|
+
"""
|
|
122
|
+
if not isinstance(data, dict):
|
|
123
|
+
return data
|
|
124
|
+
|
|
125
|
+
coerced: dict[str, Any] = {}
|
|
126
|
+
for key, val in data.items():
|
|
127
|
+
if isinstance(val, str):
|
|
128
|
+
# 1. Check for Dates
|
|
129
|
+
m = _SAP_DATE_RE.match(val)
|
|
130
|
+
if m:
|
|
131
|
+
epoch_ms = int(m.group(1))
|
|
132
|
+
coerced[key] = (
|
|
133
|
+
datetime.fromtimestamp(epoch_ms / 1000, tz=timezone.utc)
|
|
134
|
+
.date()
|
|
135
|
+
.isoformat()
|
|
136
|
+
)
|
|
137
|
+
else:
|
|
138
|
+
# 2. Check for Booleans
|
|
139
|
+
coerced[key] = _coerce_sap_boolean(val)
|
|
140
|
+
else:
|
|
141
|
+
coerced[key] = val
|
|
142
|
+
return coerced
|
|
143
|
+
|
|
144
|
+
# ── Outbound serialisation (Python → SAP) ───────────────────────────── #
|
|
145
|
+
|
|
146
|
+
def get(self, field_alias: str, default: Any = None) -> Any:
|
|
147
|
+
"""
|
|
148
|
+
Access a field's value by its SAP alias (e.g. 'CardCode') or Python name.
|
|
149
|
+
|
|
150
|
+
This is particularly useful when using the ``F`` (fields) constants to
|
|
151
|
+
read data from a model instance dynamically.
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
field_alias (str): The SAP alias or Python attribute name.
|
|
155
|
+
default (Any, optional): Value to return if the field is not found.
|
|
156
|
+
Defaults to None.
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
Any: The field value if found, else the default.
|
|
160
|
+
"""
|
|
161
|
+
# 1. Search in defined Pydantic fields
|
|
162
|
+
for name, field in self.model_fields.items():
|
|
163
|
+
if field.alias == field_alias or name == field_alias:
|
|
164
|
+
return getattr(self, name, default)
|
|
165
|
+
|
|
166
|
+
# 2. Search in 'extra' fields (UDFs) if allowed
|
|
167
|
+
if self.model_extra and field_alias in self.model_extra:
|
|
168
|
+
return self.model_extra[field_alias]
|
|
169
|
+
|
|
170
|
+
return default
|
|
171
|
+
|
|
172
|
+
def to_api_payload(self) -> dict:
|
|
173
|
+
"""
|
|
174
|
+
Serialise this model to an API-ready dict safe for SAP Service Layer.
|
|
175
|
+
|
|
176
|
+
Behaviour:
|
|
177
|
+
* ``exclude_unset=True`` — only fields the developer *explicitly* set
|
|
178
|
+
are included, preventing accidental null-overwrites on PATCH.
|
|
179
|
+
* ``bool`` → ``"tYES"`` / ``"tNO"``
|
|
180
|
+
* ``datetime.date`` → ISO string ``"YYYY-MM-DD"``
|
|
181
|
+
* If ``Valid`` is in the payload, ``Frozen`` is automatically set to
|
|
182
|
+
the inverse value (SAP requires both fields to be kept in sync).
|
|
183
|
+
|
|
184
|
+
Fields explicitly set to ``None`` **are** included (the developer
|
|
185
|
+
intended to clear that SAP field).
|
|
186
|
+
|
|
187
|
+
Outputs SAP field aliases (not Python attribute names) and includes
|
|
188
|
+
any extra UDF fields stored in ``__pydantic_extra__``.
|
|
189
|
+
"""
|
|
190
|
+
raw: dict[str, Any] = self.model_dump(by_alias=True, exclude_unset=True)
|
|
191
|
+
|
|
192
|
+
encoded: dict[str, Any] = {}
|
|
193
|
+
for key, val in raw.items():
|
|
194
|
+
if isinstance(val, bool):
|
|
195
|
+
encoded[key] = _SAP_YES if val else _SAP_NO
|
|
196
|
+
elif isinstance(val, date):
|
|
197
|
+
encoded[key] = val.isoformat()
|
|
198
|
+
elif isinstance(val, Enum):
|
|
199
|
+
# For BoYesNoEnum and others, we might need special handling if they are IntEnums but represent booleans
|
|
200
|
+
if val.name in ("tYES", "boYES"):
|
|
201
|
+
encoded[key] = _SAP_YES
|
|
202
|
+
elif val.name in ("tNO", "boNO"):
|
|
203
|
+
encoded[key] = _SAP_NO
|
|
204
|
+
else:
|
|
205
|
+
encoded[key] = val.value
|
|
206
|
+
else:
|
|
207
|
+
encoded[key] = val
|
|
208
|
+
|
|
209
|
+
return encoded
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""
|
|
2
|
+
b1sl.b1sl.models.odata_query_model
|
|
3
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
4
|
+
Typed container for OData v4 query parameters.
|
|
5
|
+
|
|
6
|
+
``ODataQueryModel`` is used internally by ``BaseResource._build_odata_params``
|
|
7
|
+
to construct validated, serialisable query-parameter dicts. Using a Pydantic
|
|
8
|
+
model here gives us:
|
|
9
|
+
|
|
10
|
+
* ``extra='forbid'`` — typos in keyword arguments raise a ``ValidationError``
|
|
11
|
+
immediately instead of silently being ignored by the HTTP client.
|
|
12
|
+
* A single ``build_query_params()`` method that strips ``None`` values and
|
|
13
|
+
coerces all parameter values to strings as required by ``requests``.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ODataQueryModel(BaseModel):
|
|
22
|
+
"""Typed representation of OData v4 system query options.
|
|
23
|
+
|
|
24
|
+
All fields are optional; only non-``None`` fields are included in the
|
|
25
|
+
generated query-parameter dict.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
select: str | None = Field(None, alias="$select")
|
|
29
|
+
filter_: str | None = Field(None, alias="$filter")
|
|
30
|
+
order_by: str | None = Field(None, alias="$orderby")
|
|
31
|
+
top: int | None = Field(None, alias="$top")
|
|
32
|
+
skip: int | None = Field(None, alias="$skip")
|
|
33
|
+
expand: str | None = Field(None, alias="$expand")
|
|
34
|
+
format: str | None = Field(None, alias="$format")
|
|
35
|
+
count: bool | None = Field(None, alias="$count")
|
|
36
|
+
search: str | None = Field(None, alias="$search")
|
|
37
|
+
|
|
38
|
+
model_config = ConfigDict(
|
|
39
|
+
extra="forbid", # reject unknown keys — catches query-param typos
|
|
40
|
+
populate_by_name=True, # allow both Python name and OData alias
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
def build_query_params(self) -> dict[str, str]:
|
|
44
|
+
"""Return a ``{str: str}`` dict suitable for ``requests`` ``params=``.
|
|
45
|
+
|
|
46
|
+
Only set (non-``None``) fields are included. OData alias names
|
|
47
|
+
(e.g. ``"$select"``) are used as keys.
|
|
48
|
+
"""
|
|
49
|
+
raw = self.model_dump(by_alias=True, exclude_none=True)
|
|
50
|
+
return {k: str(v) for k, v in raw.items()}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""
|
|
2
|
+
b1sl.b1sl.models.paginated_result
|
|
3
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
4
|
+
Generic container for a single SAP B1 OData page.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import (
|
|
10
|
+
Any,
|
|
11
|
+
Generic,
|
|
12
|
+
Iterator,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
from b1sl.b1sl._types import T
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class PaginatedResult(Generic[T]):
|
|
19
|
+
"""
|
|
20
|
+
Wraps one page of SAP B1 OData results together with pagination metadata.
|
|
21
|
+
|
|
22
|
+
Attributes:
|
|
23
|
+
data: An **iterator** yielding validated model instances for
|
|
24
|
+
this page. See the warning below.
|
|
25
|
+
metadata: The ``odata.metadata`` URL string returned by SAP, if any.
|
|
26
|
+
next_params: Query-param dict for the next page (from ``odata.nextLink``),
|
|
27
|
+
or ``None`` if this is the last page.
|
|
28
|
+
|
|
29
|
+
.. warning:: ``data`` is a **one-shot generator**.
|
|
30
|
+
|
|
31
|
+
Iterating over ``data`` a second time returns nothing::
|
|
32
|
+
|
|
33
|
+
result = client.items.list()
|
|
34
|
+
first = list(result.data) # ✅ correct
|
|
35
|
+
second = list(result.data) # ❌ empty — generator exhausted!
|
|
36
|
+
|
|
37
|
+
To consume the page multiple times, call :meth:`to_list` **once** and
|
|
38
|
+
keep a reference to the returned list::
|
|
39
|
+
|
|
40
|
+
items = result.to_list()
|
|
41
|
+
print(items[0]) # ✅ safe — list is cached internally
|
|
42
|
+
print(items[-1]) # ✅ still fine
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(
|
|
46
|
+
self,
|
|
47
|
+
data: Iterator[T],
|
|
48
|
+
metadata: str | None = None,
|
|
49
|
+
next_params: dict[str, Any] | None = None,
|
|
50
|
+
) -> None:
|
|
51
|
+
self._data_iter: Iterator[T] = data
|
|
52
|
+
self._data_cache: list[T] | None = None
|
|
53
|
+
self.metadata = metadata
|
|
54
|
+
self.next_params = next_params
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def data(self) -> Iterator[T]:
|
|
58
|
+
"""
|
|
59
|
+
One-shot iterator over this page's records.
|
|
60
|
+
|
|
61
|
+
If you have already called :meth:`to_list`, subsequent accesses to
|
|
62
|
+
``data`` will replay the cached list so it is not empty.
|
|
63
|
+
"""
|
|
64
|
+
if self._data_cache is not None:
|
|
65
|
+
return iter(self._data_cache)
|
|
66
|
+
return self._data_iter
|
|
67
|
+
|
|
68
|
+
def to_list(self) -> list[T]:
|
|
69
|
+
"""
|
|
70
|
+
Materialise the page into a list and cache it.
|
|
71
|
+
|
|
72
|
+
Safe to call multiple times — the generator is consumed only once and
|
|
73
|
+
the result is stored in ``_data_cache`` for all future accesses via
|
|
74
|
+
either ``to_list()`` or the ``data`` property.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
A list of validated model instances for this page.
|
|
78
|
+
"""
|
|
79
|
+
if self._data_cache is None:
|
|
80
|
+
self._data_cache = list(self._data_iter)
|
|
81
|
+
return self._data_cache
|
|
82
|
+
|
|
83
|
+
def __iter__(self) -> Iterator[T]:
|
|
84
|
+
"""Allow ``for item in paginated_result`` to work transparently."""
|
|
85
|
+
return self.data
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, ConfigDict
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Result(BaseModel):
|
|
7
|
+
status_code: int
|
|
8
|
+
message: str = ""
|
|
9
|
+
data: dict | None = None
|
|
10
|
+
next_link: str | None = None
|
|
11
|
+
next_params: dict | None = None
|
|
12
|
+
metadata: str | None = None
|
|
13
|
+
|
|
14
|
+
# Update configuration for Pydantic V2
|
|
15
|
+
model_config = ConfigDict(
|
|
16
|
+
extra="allow" # Allows extra fields not explicitly defined
|
|
17
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import TYPE_CHECKING, Any
|
|
3
|
+
from b1sl.b1sl.resources.base import GenericResource
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ...models._generated._types import *
|
|
7
|
+
|
|
8
|
+
class AccountCategoryService(GenericResource["AccountCategory"]):
|
|
9
|
+
"""This entity enables you to manipulate 'AccountCategory'."""
|
|
10
|
+
endpoint = "AccountCategory"
|
|
11
|
+
|
|
12
|
+
def __init__(self, adapter):
|
|
13
|
+
from ...models._generated._types import AccountCategory
|
|
14
|
+
self.model = AccountCategory
|
|
15
|
+
super().__init__(adapter)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import TYPE_CHECKING, Any
|
|
3
|
+
from b1sl.b1sl.resources.base import GenericResource
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ...models._generated._types import *
|
|
7
|
+
|
|
8
|
+
class AccountCategoryService(GenericResource[Any]):
|
|
9
|
+
endpoint = "AccountCategoryService"
|
|
10
|
+
|
|
11
|
+
def __init__(self, adapter):
|
|
12
|
+
self.model = None
|
|
13
|
+
super().__init__(adapter)
|
|
14
|
+
|
|
15
|
+
# --- Actions ---
|
|
16
|
+
|
|
17
|
+
def get_category_list(self, payload: dict | None = None) -> Any:
|
|
18
|
+
"""POST AccountCategoryService_GetCategoryList
|
|
19
|
+
Invoke the method 'GetCategoryList' on this service.
|
|
20
|
+
"""
|
|
21
|
+
return self._adapter.post(f"AccountCategoryService_GetCategoryList", data=payload)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import TYPE_CHECKING, Any
|
|
3
|
+
from b1sl.b1sl.resources.base import GenericResource
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ...models._generated._types import *
|
|
7
|
+
|
|
8
|
+
class AccountSegmentationCategoriesService(GenericResource["AccountSegmentationCategory"]):
|
|
9
|
+
"""This entity enables you to manipulate 'AccountSegmentationCategories'. It represents the categories under each of the account segments."""
|
|
10
|
+
endpoint = "AccountSegmentationCategories"
|
|
11
|
+
|
|
12
|
+
def __init__(self, adapter):
|
|
13
|
+
from ...models._generated._types import AccountSegmentationCategory
|
|
14
|
+
self.model = AccountSegmentationCategory
|
|
15
|
+
super().__init__(adapter)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import TYPE_CHECKING, Any
|
|
3
|
+
from b1sl.b1sl.resources.base import GenericResource
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ...models._generated._types import *
|
|
7
|
+
|
|
8
|
+
class AccountSegmentationsService(GenericResource["AccountSegmentation"]):
|
|
9
|
+
"""This entity enables you to manipulate 'AccountSegmentations'."""
|
|
10
|
+
endpoint = "AccountSegmentations"
|
|
11
|
+
|
|
12
|
+
def __init__(self, adapter):
|
|
13
|
+
from ...models._generated._types import AccountSegmentation
|
|
14
|
+
self.model = AccountSegmentation
|
|
15
|
+
super().__init__(adapter)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import TYPE_CHECKING, Any
|
|
3
|
+
from b1sl.b1sl.resources.base import GenericResource
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ...models._generated._types import *
|
|
7
|
+
|
|
8
|
+
class AccountsService(GenericResource[Any]):
|
|
9
|
+
endpoint = "AccountsService"
|
|
10
|
+
|
|
11
|
+
def __init__(self, adapter):
|
|
12
|
+
self.model = None
|
|
13
|
+
super().__init__(adapter)
|
|
14
|
+
|
|
15
|
+
# --- Actions ---
|
|
16
|
+
|
|
17
|
+
def create_open_balance(self, payload: dict | None = None) -> Any:
|
|
18
|
+
"""POST AccountsService_CreateOpenBalance
|
|
19
|
+
Invoke the method 'CreateOpenBalance' on this service by specifying the payload 'OpenningBalanceAccount,GLAccounts' in the JSON format.
|
|
20
|
+
|
|
21
|
+
Example:
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"GLAccounts": {
|
|
25
|
+
"Code": "test"
|
|
26
|
+
},
|
|
27
|
+
"OpenningBalanceAccount": {
|
|
28
|
+
"Date": "2016-08-29"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
"""
|
|
33
|
+
return self._adapter.post(f"AccountsService_CreateOpenBalance", data=payload)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import TYPE_CHECKING, Any
|
|
3
|
+
from b1sl.b1sl.resources.base import GenericResource
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ...models._generated._types import *
|
|
7
|
+
|
|
8
|
+
class AccrualTypesService(GenericResource["AccrualType"]):
|
|
9
|
+
"""This entity enables you to manipulate 'AccrualTypes'."""
|
|
10
|
+
endpoint = "AccrualTypes"
|
|
11
|
+
|
|
12
|
+
def __init__(self, adapter):
|
|
13
|
+
from ...models._generated._types import AccrualType
|
|
14
|
+
self.model = AccrualType
|
|
15
|
+
super().__init__(adapter)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import TYPE_CHECKING, Any
|
|
3
|
+
from b1sl.b1sl.resources.base import GenericResource
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ...models._generated._types import *
|
|
7
|
+
|
|
8
|
+
class AccrualTypesService(GenericResource[Any]):
|
|
9
|
+
endpoint = "AccrualTypesService"
|
|
10
|
+
|
|
11
|
+
def __init__(self, adapter):
|
|
12
|
+
self.model = None
|
|
13
|
+
super().__init__(adapter)
|
|
14
|
+
|
|
15
|
+
# --- Actions ---
|
|
16
|
+
|
|
17
|
+
def get_accrual_type_list(self, payload: dict | None = None) -> Any:
|
|
18
|
+
"""POST AccrualTypesService_GetAccrualTypeList
|
|
19
|
+
Invoke the method 'GetAccrualTypeList' on this service.
|
|
20
|
+
"""
|
|
21
|
+
return self._adapter.post(f"AccrualTypesService_GetAccrualTypeList", data=payload)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import TYPE_CHECKING, Any
|
|
3
|
+
from b1sl.b1sl.resources.base import GenericResource
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ...models._generated._types import *
|
|
7
|
+
|
|
8
|
+
class ActivitiesService(GenericResource["Activity"]):
|
|
9
|
+
"""This entity enables you to manipulate 'Activities'."""
|
|
10
|
+
endpoint = "Activities"
|
|
11
|
+
|
|
12
|
+
def __init__(self, adapter):
|
|
13
|
+
from ...models._generated._types import Activity
|
|
14
|
+
self.model = Activity
|
|
15
|
+
super().__init__(adapter)
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import TYPE_CHECKING, Any
|
|
3
|
+
from b1sl.b1sl.resources.base import GenericResource
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from ...models._generated._types import *
|
|
7
|
+
|
|
8
|
+
class ActivitiesService(GenericResource[Any]):
|
|
9
|
+
endpoint = "ActivitiesService"
|
|
10
|
+
|
|
11
|
+
def __init__(self, adapter):
|
|
12
|
+
self.model = None
|
|
13
|
+
super().__init__(adapter)
|
|
14
|
+
|
|
15
|
+
# --- Actions ---
|
|
16
|
+
|
|
17
|
+
def delete_single_instance_from_series(self, payload: dict | None = None) -> Any:
|
|
18
|
+
"""POST ActivitiesService_DeleteSingleInstanceFromSeries
|
|
19
|
+
Invoke the method 'DeleteSingleInstanceFromSeries' on this service by specifying the payload 'ActivityInstanceParams' in the JSON format.
|
|
20
|
+
|
|
21
|
+
Example:
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"ActivityInstanceParams": {
|
|
25
|
+
"ActivityCode": "3",
|
|
26
|
+
"InstanceDate": "2016-08-30"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
"""
|
|
31
|
+
return self._adapter.post(f"ActivitiesService_DeleteSingleInstanceFromSeries", data=payload)
|
|
32
|
+
|
|
33
|
+
def get_activity_list(self, payload: dict | None = None) -> Any:
|
|
34
|
+
"""POST ActivitiesService_GetActivityList
|
|
35
|
+
Invoke the method 'GetActivityList' on this service.
|
|
36
|
+
"""
|
|
37
|
+
return self._adapter.post(f"ActivitiesService_GetActivityList", data=payload)
|
|
38
|
+
|
|
39
|
+
def get_list_by_attend_user(self, payload: dict | None = None) -> Any:
|
|
40
|
+
"""POST ActivitiesService_GetListByAttendUser
|
|
41
|
+
"""
|
|
42
|
+
return self._adapter.post(f"ActivitiesService_GetListByAttendUser", data=payload)
|
|
43
|
+
|
|
44
|
+
def get_single_instance_from_series(self, payload: dict | None = None) -> Any:
|
|
45
|
+
"""POST ActivitiesService_GetSingleInstanceFromSeries
|
|
46
|
+
Invoke the method 'GetSingleInstanceFromSeries' on this service by specifying the payload 'ActivityInstanceParams' in the JSON format.
|
|
47
|
+
|
|
48
|
+
Example:
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"ActivityInstanceParams": {
|
|
52
|
+
"ActivityCode": "3",
|
|
53
|
+
"InstanceDate": "2016-08-30"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
"""
|
|
58
|
+
return self._adapter.post(f"ActivitiesService_GetSingleInstanceFromSeries", data=payload)
|
|
59
|
+
|
|
60
|
+
def get_top_n_activity_instances(self, payload: dict | None = None) -> Any:
|
|
61
|
+
"""POST ActivitiesService_GetTopNActivityInstances
|
|
62
|
+
Invoke the method 'GetTopNActivityInstances' on this service by specifying the payload 'ActivityInstancesListParams' in the JSON format.
|
|
63
|
+
|
|
64
|
+
Example:
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"ActivityInstancesListParams": {
|
|
68
|
+
"ActivityInstancesListParams": {
|
|
69
|
+
"StartDate": "2016-08-30"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
"""
|
|
75
|
+
return self._adapter.post(f"ActivitiesService_GetTopNActivityInstances", data=payload)
|
|
76
|
+
|
|
77
|
+
def init_data(self, payload: dict | None = None) -> Any:
|
|
78
|
+
"""POST ActivitiesService_InitData
|
|
79
|
+
"""
|
|
80
|
+
return self._adapter.post(f"ActivitiesService_InitData", data=payload)
|
|
81
|
+
|
|
82
|
+
def update_single_instance_in_series(self, payload: dict | None = None) -> Any:
|
|
83
|
+
"""POST ActivitiesService_UpdateSingleInstanceInSeries
|
|
84
|
+
Invoke the method 'UpdateSingleInstanceInSeries' on this service by specifying the payload 'Activity' in the JSON format.
|
|
85
|
+
|
|
86
|
+
Example:
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"Activity": {
|
|
90
|
+
"ActivityDate": "2016-08-30",
|
|
91
|
+
"ActivityTime": "08:13:00",
|
|
92
|
+
"CardCode": "C01",
|
|
93
|
+
"DocEntry": "3",
|
|
94
|
+
"DocNum": "1",
|
|
95
|
+
"DocType": "17",
|
|
96
|
+
"Duration": 15,
|
|
97
|
+
"DurationType": "du_Minuts",
|
|
98
|
+
"EndDueDate": "2016-08-30",
|
|
99
|
+
"EndTime": "08:28:00",
|
|
100
|
+
"Reminder": "tYES",
|
|
101
|
+
"ReminderPeriod": 15,
|
|
102
|
+
"ReminderType": "du_Minuts",
|
|
103
|
+
"StartDate": "2016-08-30",
|
|
104
|
+
"StartTime": "08:13:00"
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
"""
|
|
109
|
+
return self._adapter.post(f"ActivitiesService_UpdateSingleInstanceInSeries", data=payload)
|