From 9a432e947e1922504f67cafd087eb52ad0fd976c Mon Sep 17 00:00:00 2001 From: mohammed-alkhazrji Date: Mon, 5 Jan 2026 01:17:42 +0300 Subject: [PATCH] frist moduls odex30 account --- .../account_chart_of_accounts/CHANGELOG.md | 33 + .../account_chart_of_accounts/README.md | 105 + .../account_chart_of_accounts/__init__.py | 3 + .../account_chart_of_accounts/__manifest__.py | 55 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 335 bytes .../data/account_report_data.xml | 7 + .../models/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 418 bytes .../account_account.cpython-311.pyc | Bin 0 -> 9611 bytes .../account_journal.cpython-311.pyc | Bin 0 -> 4759 bytes .../res_config_settings.cpython-311.pyc | Bin 0 -> 3567 bytes .../models/account_account.py | 187 + .../models/account_journal.py | 74 + .../models/res_config_settings.py | 52 + .../report/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 305 bytes .../account_report.cpython-311.pyc | Bin 0 -> 8629 bytes .../report/account_report.py | 217 + .../security/account_security.xml | 12 + .../security/ir.model.access.csv | 4 + .../static/src/js/account_report.js | 62 + .../src/js/account_type_selection_extend.js | 25 + .../static/src/js/filters_patch.js | 15 + .../static/src/scss/account_hierarchy.scss | 39 + .../static/src/xml/filter_full_hierarchy.xml | 24 + .../views/account_account_view.xml | 128 + .../views/res_config_settings_views.xml | 87 + .../exp_asset_base/.idea/exp_asset_base.iml | 12 + .../inspectionProfiles/profiles_settings.xml | 6 + .../exp_asset_base/.idea/misc.xml | 4 + .../exp_asset_base/.idea/modules.xml | 8 + .../exp_asset_base/.idea/workspace.xml | 38 + .../exp_asset_base/__init__.py | 5 + .../exp_asset_base/__manifest__.py | 45 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 322 bytes .../exp_asset_base/data/asset_cron.xml | 11 + .../exp_asset_base/data/asset_data.xml | 41 + .../exp_asset_base/i18n/ar.po | 1410 +++ .../exp_asset_base/i18n/ar_001.po | 912 ++ .../exp_asset_base/i18n/ar_SY.po | 1481 ++++ .../exp_asset_base/models/__init__.py | 8 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 503 bytes .../__pycache__/account_asset.cpython-311.pyc | Bin 0 -> 15348 bytes .../account_asset_adjustment.cpython-311.pyc | Bin 0 -> 7190 bytes .../__pycache__/asset_modify.cpython-311.pyc | Bin 0 -> 13495 bytes .../__pycache__/asset_pause.cpython-311.pyc | Bin 0 -> 2281 bytes .../__pycache__/asset_sell.cpython-311.pyc | Bin 0 -> 6535 bytes .../exp_asset_base/models/account_asset.py | 294 + .../models/account_asset_adjustment.py | 116 + .../exp_asset_base/models/asset_modify.py | 179 + .../exp_asset_base/models/asset_pause.py | 29 + .../exp_asset_base/models/asset_sell.py | 60 + .../exp_asset_base/reports/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 361 bytes .../abstract_report_xlsx.cpython-311.pyc | Bin 0 -> 31080 bytes ...asset_register_report_xlsx.cpython-311.pyc | Bin 0 -> 14630 bytes .../reports/abstract_report_xlsx.py | 688 ++ .../reports/asset_barcode_pdf_report.xml | 50 + .../reports/asset_barcode_zpl_report.xml | 29 + .../reports/asset_depreciation_report_xlsx.py | 126 + .../reports/asset_register_report.py | 74 + .../reports/asset_register_report.xml | 59 + .../reports/asset_register_report_xlsx.py | 126 + .../exp_asset_base/reports/reports.xml | 19 + .../exp_asset_base/security/groups.xml | 23 + .../security/ir.model.access.csv | 13 + .../static/description/assets.png | Bin 0 -> 24904 bytes .../static/description/icon.png | Bin 0 -> 32929 bytes .../views/account_asset_adjustment_view.xml | 94 + .../views/account_asset_view.xml | 343 + .../views/asset_modify_views.xml | 77 + .../views/asset_pause_views.xml | 52 + .../exp_asset_base/views/asset_sell_views.xml | 61 + .../exp_asset_base/views/menus.xml | 84 + .../exp_asset_custody/__init__.py | 4 + .../exp_asset_custody/__manifest__.py | 30 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 279 bytes .../exp_asset_custody/data/asset_data.xml | 34 + .../exp_asset_custody/i18n/ar.po | 883 ++ .../exp_asset_custody/models/__init__.py | 7 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 486 bytes .../__pycache__/account_asset.cpython-311.pyc | Bin 0 -> 4441 bytes .../account_asset_adjustment.cpython-311.pyc | Bin 0 -> 2495 bytes ...ount_asset_multi_operation.cpython-311.pyc | Bin 0 -> 8533 bytes .../account_asset_operation.cpython-311.pyc | Bin 0 -> 10520 bytes .../exp_asset_custody/models/account_asset.py | 67 + .../models/account_asset_adjustment.py | 44 + .../models/account_asset_multi_operation.py | 150 + .../models/account_asset_operation.py | 150 + .../reports/asset_adjustment_report.xml | 232 + .../security/ir.model.access.csv | 6 + .../static/description/icon.png | Bin 0 -> 32929 bytes .../views/account_asset_adjustment_view.xml | 23 + .../account_asset_custody_multi_operation.xml | 274 + .../account_asset_custody_operation_view.xml | 337 + .../views/account_asset_view.xml | 51 + .../exp_asset_custody/views/menus.xml | 56 + .../exp_asset_custody_link/__init__.py | 3 + .../exp_asset_custody_link/__manifest__.py | 23 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 284 bytes .../exp_asset_custody_link/i18n/ar_001.po | 266 + .../exp_asset_custody_link/models/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 363 bytes .../account_asset_operation.cpython-311.pyc | Bin 0 -> 4755 bytes .../employee_custody.cpython-311.pyc | Bin 0 -> 7860 bytes .../models/account_asset_operation.py | 71 + .../models/employee_custody.py | 125 + .../security/ir.model.access.csv | 2 + .../views/employee_custody_action.xml | 95 + .../odex30_account_accountant/__init__.py | 46 + .../odex30_account_accountant/__manifest__.py | 63 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2817 bytes .../data/digest_data.xml | 23 + .../data/ir_cron.xml | 11 + .../data/odex30_account_accountant_tour.xml | 11 + .../odex30_account_accountant/i18n/ar.po | 2950 +++++++ .../models/__init__.py | 20 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1186 bytes .../account_account.cpython-311.pyc | Bin 0 -> 1314 bytes .../account_bank_statement.cpython-311.pyc | Bin 0 -> 13300 bytes .../account_chart_template.cpython-311.pyc | Bin 0 -> 4808 bytes .../account_fiscal_year.cpython-311.pyc | Bin 0 -> 2897 bytes .../account_journal_dashboard.cpython-311.pyc | Bin 0 -> 3534 bytes .../__pycache__/account_move.cpython-311.pyc | Bin 0 -> 51901 bytes .../account_payment.cpython-311.pyc | Bin 0 -> 2457 bytes .../account_reconcile_model.cpython-311.pyc | Bin 0 -> 25315 bytes ...count_reconcile_model_line.cpython-311.pyc | Bin 0 -> 7019 bytes .../__pycache__/account_tax.cpython-311.pyc | Bin 0 -> 3540 bytes .../bank_rec_widget.cpython-311.pyc | Bin 0 -> 96814 bytes .../bank_rec_widget_line.cpython-311.pyc | Bin 0 -> 22995 bytes .../models/__pycache__/digest.cpython-311.pyc | Bin 0 -> 2756 bytes .../__pycache__/ir_model.cpython-311.pyc | Bin 0 -> 1047 bytes .../__pycache__/ir_ui_menu.cpython-311.pyc | Bin 0 -> 1853 bytes .../__pycache__/res_company.cpython-311.pyc | Bin 0 -> 9470 bytes .../res_config_settings.cpython-311.pyc | Bin 0 -> 6194 bytes .../models/account_account.py | 14 + .../models/account_bank_statement.py | 223 + .../models/account_chart_template.py | 51 + .../models/account_fiscal_year.py | 44 + .../models/account_journal_dashboard.py | 62 + .../models/account_move.py | 836 ++ .../models/account_payment.py | 34 + .../models/account_reconcile_model.py | 485 ++ .../models/account_reconcile_model_line.py | 117 + .../models/account_tax.py | 52 + .../models/bank_rec_widget.py | 1785 ++++ .../models/bank_rec_widget_line.py | 503 ++ .../models/digest.py | 33 + .../models/ir_model.py | 14 + .../models/ir_ui_menu.py | 21 + .../models/res_company.py | 208 + .../models/res_config_settings.py | 111 + .../security/ir.model.access.csv | 12 + .../odex30_account_accountant_security.xml | 21 + .../bank_reconciliation/amls_list_view.js | 49 + .../bank_reconciliation/bank_rec_form.xml | 752 ++ .../bank_rec_quick_create.js | 26 + .../bank_rec_quick_create.xml | 29 + .../bank_reconciliation/bank_rec_record.js | 86 + .../bank_reconciliation/embedded_list_view.js | 36 + .../bank_reconciliation/finish_buttons.js | 49 + .../bank_reconciliation/finish_buttons.xml | 10 + .../bank_reconciliation/global_info.js | 24 + .../bank_reconciliation/global_info.xml | 18 + .../components/bank_reconciliation/kanban.js | 1243 +++ .../bank_reconciliation/kanban.scss | 286 + .../components/bank_reconciliation/kanban.xml | 75 + .../components/bank_reconciliation/list.js | 37 + .../bank_reconciliation/list_view_switcher.js | 39 + .../list_view_switcher.xml | 11 + .../many2one_field_multi_edit.js | 21 + .../monetary_field_auto_signed_amount.js | 38 + .../monetary_field_auto_signed_amount.xml | 17 + .../bank_reconciliation/rainbowman_content.js | 19 + .../rainbowman_content.xml | 13 + .../bank_reconciliation/view_embedder.js | 18 + .../bank_reconciliation/view_embedder.xml | 8 + .../export_data_dialog/export_data_dialog.js | 35 + .../matching_link_widget.js | 47 + .../matching_link_widget.xml | 15 + .../attachment_view_move_line.js | 17 + .../move_line_list/move_line_list.js | 125 + .../move_line_list/move_line_list.scss | 68 + .../move_line_list/move_line_list.xml | 52 + .../move_line_list_reconcile.js | 48 + .../move_line_list_reconcile.xml | 28 + .../static/src/img/accounting-bulk.gif.gif | Bin 0 -> 96904 bytes .../static/src/js/tours/account_accountant.js | 78 + .../static/tests/move_line.test.js | 340 + .../test_tour_bank_rec_rainbowman_reset.js | 91 + ...our_bank_rec_save_analytic_distribution.js | 69 + .../tours/test_tour_bank_rec_statements.js | 95 + .../tests/tours/test_tour_bank_rec_ui.js | 960 +++ .../tests/tours/test_tour_bank_rec_widget.js | 236 + .../tours/test_tour_journal_items_export.js | 51 + .../tests/__init__.py | 12 + .../test_account_auto_reconcile_wizard.py | 244 + .../tests/test_account_fiscal_year.py | 128 + .../tests/test_account_payment.py | 34 + .../tests/test_account_reconcile_wizard.py | 856 ++ .../tests/test_bank_rec_widget.py | 3726 ++++++++ .../tests/test_bank_rec_widget_common.py | 68 + .../tests/test_bank_rec_widget_tour.py | 221 + .../tests/test_change_lock_date_wizard.py | 201 + .../tests/test_deferred_management.py | 778 ++ .../tests/test_prediction.py | 203 + .../test_reconciliation_matching_rules.py | 1351 +++ .../tests/test_signature.py | 88 + .../tests/test_ui.py | 64 + .../views/account_fiscal_year_view.xml | 53 + .../views/account_journal_dashboard_views.xml | 44 + .../views/account_move_views.xml | 145 + .../views/account_payment_views.xml | 21 + .../views/account_reconcile_model_views.xml | 22 + .../views/bank_rec_widget_views.xml | 469 + .../views/digest_views.xml | 14 + .../views/odex30_account_account_views.xml | 41 + .../odex30_account_accountant_menuitems.xml | 36 + .../views/odex30_account_reconcile_views.xml | 122 + .../views/product_views.xml | 26 + .../views/report_invoice.xml | 18 + .../views/res_config_settings_views.xml | 98 + .../wizard/__init__.py | 6 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 436 bytes ...ount_auto_reconcile_wizard.cpython-311.pyc | Bin 0 -> 11487 bytes .../account_change_lock_date.cpython-311.pyc | Bin 0 -> 24160 bytes .../account_reconcile_wizard.cpython-311.pyc | Bin 0 -> 47001 bytes .../wizard/account_auto_reconcile_wizard.py | 176 + .../wizard/account_auto_reconcile_wizard.xml | 24 + .../wizard/account_change_lock_date.py | 416 + .../wizard/account_change_lock_date.xml | 236 + .../wizard/account_reconcile_wizard.py | 772 ++ .../wizard/account_reconcile_wizard.xml | 120 + .../wizard/reconcile_model_wizard.xml | 45 + .../odex30_account_asset/__init__.py | 4 + .../odex30_account_asset/__manifest__.py | 46 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 327 bytes .../data/account_report_actions.xml | 8 + .../data/assets_report.xml | 70 + .../odex30_account_asset/data/menuitems.xml | 8 + .../demo/account_asset_demo.xml | 30 + .../odex30_account_asset/i18n/ar.po | 1960 +++++ .../odex30_account_asset/models/__init__.py | 8 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 561 bytes .../__pycache__/account.cpython-311.pyc | Bin 0 -> 2437 bytes .../__pycache__/account_asset.cpython-311.pyc | Bin 0 -> 82428 bytes .../account_asset_group.cpython-311.pyc | Bin 0 -> 2753 bytes .../account_assets_report.cpython-311.pyc | Bin 0 -> 27722 bytes .../__pycache__/account_move.cpython-311.pyc | Bin 0 -> 27796 bytes .../__pycache__/res_company.cpython-311.pyc | Bin 0 -> 1078 bytes .../odex30_account_asset/models/account.py | 34 + .../models/account_asset.py | 1242 +++ .../models/account_asset_group.py | 37 + .../models/account_assets_report.py | 468 + .../models/account_move.py | 397 + .../models/res_company.py | 19 + .../security/account_asset_security.xml | 18 + .../security/ir.model.access.csv | 7 + .../static/description/icon.png | Bin 0 -> 896 bytes .../static/description/icon.svg | 1 + .../depreciation_schedule.scss | 37 + .../depreciation_schedule/filters.xml | 8 + .../depreciation_schedule/groupby.xml | 42 + .../components/move_reversed/move_reversed.js | 16 + .../move_reversed/move_reversed.xml | 6 + .../static/src/scss/account_asset.dark.scss | 8 + .../static/src/scss/account_asset.scss | 77 + .../fields/properties/properties_field.js | 21 + .../static/src/web/form_controller_patch.js | 15 + .../odex30_account_asset/tests/__init__.py | 7 + .../odex30_account_asset/tests/common.py | 36 + .../tests/test_account_asset.py | 3172 +++++++ .../tests/test_board_compute.py | 1321 +++ .../tests/test_reevaluation_asset.py | 1662 ++++ .../views/account_account_views.xml | 50 + .../views/account_asset_group_views.xml | 47 + .../views/account_asset_views.xml | 518 ++ .../views/account_move_views.xml | 68 + .../odex30_account_asset/wizard/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 295 bytes .../__pycache__/asset_modify.cpython-311.pyc | Bin 0 -> 27960 bytes .../wizard/asset_modify.py | 409 + .../wizard/asset_modify_views.xml | 104 + .../odex30_account_auto_transfer/__init__.py | 4 + .../__manifest__.py | 21 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 333 bytes .../data/cron.xml | 10 + .../demo/__init__.py | 1 + .../demo/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 299 bytes .../__pycache__/account_demo.cpython-311.pyc | Bin 0 -> 3155 bytes .../demo/account_demo.py | 63 + .../odex30_account_auto_transfer/i18n/ar.po | 479 ++ .../models/__init__.py | 6 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 466 bytes .../account_journal.cpython-311.pyc | Bin 0 -> 1389 bytes .../__pycache__/account_move.cpython-311.pyc | Bin 0 -> 771 bytes .../account_move_line.cpython-311.pyc | Bin 0 -> 1533 bytes .../transfer_model.cpython-311.pyc | Bin 0 -> 31691 bytes .../models/account_journal.py | 11 + .../models/account_move.py | 9 + .../models/account_move_line.py | 13 + .../models/transfer_model.py | 531 ++ .../account_auto_transfer_security.xml | 11 + .../security/ir.model.access.csv | 7 + .../static/description/icon.png | Bin 0 -> 1277 bytes .../static/description/icon.svg | 1 + .../tests/__init__.py | 3 + .../account_auto_transfer_test_classes.py | 99 + .../tests/test_transfer_model.py | 537 ++ .../tests/test_transfer_model_line.py | 288 + .../views/transfer_model_views.xml | 142 + .../__init__.py | 4 + .../__manifest__.py | 26 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 336 bytes .../demo/partner_bank.xml | 30 + .../i18n/ar.po | 201 + .../models/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 366 bytes .../account_bank_statement.cpython-311.pyc | Bin 0 -> 2209 bytes .../account_journal.cpython-311.pyc | Bin 0 -> 18107 bytes .../models/account_bank_statement.py | 28 + .../models/account_journal.py | 299 + .../static/csv/account.bank.statement.csv | 6 + .../static/description/icon_src.svg | 178 + .../account_bank_statement_import_model.js | 18 + .../src/bank_reconciliation/finish_buttons.js | 10 + .../bank_reconciliation/finish_buttons.xml | 8 + .../static/src/bank_reconciliation/kanban.js | 42 + .../static/src/bank_reconciliation/kanban.xml | 19 + .../static/src/bank_reconciliation/list.js | 43 + .../static/src/bank_reconciliation/list.xml | 19 + .../account_bank_statement_import_view.xml | 27 + .../wizard/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 303 bytes .../__pycache__/setup_wizards.cpython-311.pyc | Bin 0 -> 1488 bytes .../wizard/setup_wizards.py | 16 + .../__init__.py | 3 + .../__manifest__.py | 16 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 303 bytes .../standard-camt053-statement-v2-en_1.pdf | Bin 0 -> 4561065 bytes .../account_bank_statement_import_camt.pot | 1920 +++++ .../i18n/ar.po | 1932 +++++ .../lib/__init__.py | 0 .../lib/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 260 bytes .../lib/__pycache__/camt.cpython-311.pyc | Bin 0 -> 52512 bytes .../lib/camt.py | 806 ++ .../models/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 319 bytes .../account_journal.cpython-311.pyc | Bin 0 -> 11664 bytes .../models/account_journal.py | 175 + .../camt_053_additional_entry_info.xml | 72 + .../test_camt_file/camt_053_custom_codes.xml | 62 + .../test_camt_file/camt_053_exchange_fees.xml | 71 + .../test_camt_file/camt_053_minimal.xml | 55 + .../test_camt_file/camt_053_minimal_EUR.xml | 55 + .../camt_053_minimal_and_multicurrency.xml | 78 + .../camt_053_minimal_and_multicurrency_02.xml | 71 + .../camt_053_minimal_and_multicurrency_03.xml | 73 + .../camt_053_minimal_and_multicurrency_04.xml | 71 + .../camt_053_minimal_and_multicurrency_05.xml | 71 + .../camt_053_minimal_and_multicurrency_06.xml | 71 + .../camt_053_minimal_and_multicurrency_07.xml | 78 + .../camt_053_minimal_charges.xml | 77 + .../camt_053_minimal_charges_02.xml | 69 + .../camt_053_minimal_charges_03.xml | 73 + .../camt_053_minimal_datetime.xml | 55 + .../camt_053_minimal_intraday.xml | 79 + .../test_camt_file/camt_053_namespace.xml | 55 + .../test_camt_file/camt_053_sample.xml | 948 +++ .../test_camt_file/camt_053_several_ibans.xml | 96 + ...everal_minimal_stmt_different_currency.xml | 103 + .../camt_053_several_tx_details.xml | 94 + ...amt_053_several_tx_details_and_charges.xml | 108 + ...veral_tx_details_and_instructed_amount.xml | 94 + ...al_tx_details_and_instructed_amount_02.xml | 90 + ...everal_tx_details_and_multicurrency_01.xml | 104 + ...everal_tx_details_and_multicurrency_02.xml | 104 + ...everal_tx_details_and_multicurrency_03.xml | 97 + ...everal_tx_details_and_multicurrency_04.xml | 100 + ...everal_tx_details_and_multicurrency_05.xml | 103 + .../camt_053_several_tx_details_nordic.xml | 104 + .../test_camt_file/test_camt.xml | 249 + .../test_camt_no_opening_balance.xml | 43 + .../tests/__init__.py | 4 + ...test_account_bank_statement_import_camt.py | 473 ++ .../__init__.py | 4 + .../__manifest__.py | 30 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 347 bytes .../account_bank_statement_import_csv.pot | 56 + .../i18n/ar.po | 62 + .../models/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 318 bytes .../account_journal.cpython-311.pyc | Bin 0 -> 3465 bytes .../models/account_journal.py | 47 + .../static/csv/account.bank.statement.csv | 6 + .../src/bank_statement_csv_import_action.js | 47 + .../src/bank_statement_csv_import_model.js | 37 + .../test_csv_file/test_csv.csv | 20 + .../test_csv_file/test_csv_empty_date.csv | 5 + .../test_csv_file/test_csv_missing_values.csv | 2 + .../test_csv_file/test_csv_non_sorted.csv | 4 + .../test_csv_file/test_csv_without_amount.csv | 3 + .../tests/__init__.py | 4 + .../tests/test_import_bank_statement.py | 117 + .../wizard/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 336 bytes ..._bank_statement_import_csv.cpython-311.pyc | Bin 0 -> 8774 bytes .../account_bank_statement_import_csv.py | 149 + .../__init__.py | 3 + .../__manifest__.py | 23 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 302 bytes .../account_bank_statement_import_ofx.pot | 33 + .../i18n/ar.po | 38 + .../models/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 318 bytes .../account_journal.cpython-311.pyc | Bin 0 -> 11413 bytes .../models/account_journal.py | 182 + .../static/description/icon.png | Bin 0 -> 1007 bytes .../static/description/icon.svg | 1 + .../static/ofx/test_ofx.ofx | 100 + .../static/ofx/test_ofx_unicode_error.ofx | 56 + .../tests/__init__.py | 3 + .../tests/test_import_bank_statement.py | 95 + .../__init__.py | 3 + .../__manifest__.py | 27 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 302 bytes .../account_bank_statement_import_qif.pot | 66 + .../i18n/ar.po | 74 + .../models/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 318 bytes .../account_journal.cpython-311.pyc | Bin 0 -> 6227 bytes .../models/account_journal.py | 112 + .../static/description/icon.png | Bin 0 -> 1814 bytes .../static/description/icon.svg | 1 + .../static/qif/test_qif.qif | 25 + .../tests/__init__.py | 3 + .../tests/test_import_bank_statement.py | 40 + .../views/account_journal_views.xml | 16 + .../odex30_account_batch_payment/__init__.py | 5 + .../__manifest__.py | 35 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 380 bytes .../data/account_batch_payment_data.xml | 18 + .../i18n/account_batch_payment.pot | 922 ++ .../odex30_account_batch_payment/i18n/ar.po | 953 +++ .../models/__init__.py | 6 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 481 bytes .../account_batch_payment.cpython-311.pyc | Bin 0 -> 30626 bytes .../account_journal.cpython-311.pyc | Bin 0 -> 3393 bytes .../account_payment.cpython-311.pyc | Bin 0 -> 4624 bytes .../account_payment_method.cpython-311.pyc | Bin 0 -> 1127 bytes .../models/account_batch_payment.py | 455 + .../models/account_journal.py | 58 + .../models/account_payment.py | 74 + .../models/account_payment_method.py | 13 + .../models/sepa_mapping.py | 175 + .../report/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 319 bytes ...count_batch_payment_report.cpython-311.pyc | Bin 0 -> 1378 bytes .../report/account_batch_payment_report.py | 19 + ...account_batch_payment_report_templates.xml | 56 + .../report/account_batch_payment_reports.xml | 13 + .../account_batch_payment_security.xml | 10 + .../security/ir.model.access.csv | 5 + .../static/description/icon.png | Bin 0 -> 3092 bytes .../static/description/icon.svg | 1 + .../static/src/scss/report_batch_payment.scss | 7 + .../tests/__init__.py | 4 + .../tests/test_account_batch_payment.py | 464 + .../tests/test_sepa_mapping.py | 15 + .../views/account_batch_payment_views.xml | 180 + .../views/account_journal_views.xml | 16 + .../views/account_payment_views.xml | 97 + .../wizard/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 302 bytes .../__pycache__/batch_error.cpython-311.pyc | Bin 0 -> 5007 bytes .../wizard/batch_error.py | 63 + .../wizard/batch_error_views.xml | 56 + .../odex30_account_budget/__init__.py | 10 + .../odex30_account_budget/__manifest__.py | 24 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 774 bytes .../data/account_budget_demo.xml | 65 + .../odex30_account_budget/i18n/ar.po | 773 ++ .../odex30_account_budget/models/__init__.py | 7 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 523 bytes .../account_analytic_account.cpython-311.pyc | Bin 0 -> 1326 bytes .../budget_analytic.cpython-311.pyc | Bin 0 -> 6819 bytes .../__pycache__/budget_line.cpython-311.pyc | Bin 0 -> 9158 bytes .../purchase_order.cpython-311.pyc | Bin 0 -> 3876 bytes .../purchase_order_line.cpython-311.pyc | Bin 0 -> 5528 bytes .../models/account_analytic_account.py | 12 + .../models/budget_analytic.py | 103 + .../models/budget_line.py | 116 + .../models/purchase_order.py | 37 + .../models/purchase_order_line.py | 62 + .../odex30_account_budget/reports/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 298 bytes .../__pycache__/budget_report.cpython-311.pyc | Bin 0 -> 14082 bytes .../reports/budget_report.py | 192 + .../reports/budget_report_view.xml | 92 + .../security/account_budget_security.xml | 32 + .../security/ir.model.access.csv | 8 + .../odex30_account_budget/tests/__init__.py | 9 + .../odex30_account_budget/tests/common.py | 207 + .../tests/test_account_budget.py | 68 + .../tests/test_commited_achieved_amount.py | 669 ++ .../tests/test_purchase_order.py | 75 + .../tests/test_theoreticalamount.py | 52 + .../tests/test_uncommitted_amount.py | 66 + .../views/account_analytic_account_views.xml | 28 + .../views/budget_analytic_views.xml | 169 + .../views/budget_line_view.xml | 94 + .../views/purchase_views.xml | 25 + .../odex30_account_budget/wizards/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 302 bytes .../budget_split_wizard.cpython-311.pyc | Bin 0 -> 5338 bytes .../wizards/budget_split_wizard.py | 64 + .../wizards/budget_split_wizard_view.xml | 38 + .../odex30_account_followup/__init__.py | 5 + .../odex30_account_followup/__manifest__.py | 61 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 330 bytes .../data/account_followup_data.xml | 103 + .../odex30_account_followup/data/cron.xml | 12 + .../demo/account_followup_demo.xml | 64 + .../i18n/account_followup.pot | 975 +++ .../odex30_account_followup/i18n/ar.po | 1235 +++ .../models/__init__.py | 7 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 526 bytes .../account_followup.cpython-311.pyc | Bin 0 -> 7691 bytes .../account_followup_report.cpython-311.pyc | Bin 0 -> 24693 bytes .../account_move_line.cpython-311.pyc | Bin 0 -> 2749 bytes .../ir_actions_report.cpython-311.pyc | Bin 0 -> 3781 bytes .../__pycache__/res_partner.cpython-311.pyc | Bin 0 -> 46204 bytes .../models/account_followup.py | 106 + .../models/account_followup_report.py | 441 + .../models/account_move_line.py | 30 + .../models/ir_actions_report.py | 53 + .../models/res_partner.py | 698 ++ .../security/account_followup_security.xml | 11 + .../security/ir.model.access.csv | 8 + .../security/sms_security.xml | 10 + .../followup_trust_widget.js | 52 + .../followup_trust_widget.scss | 9 + .../followup_trust_widget.xml | 28 + .../download_close_wizard_action.js | 16 + .../odex30_account_followup/tests/__init__.py | 5 + .../odex30_account_followup/tests/common.py | 14 + .../tests/test_account_followup.py | 530 ++ .../tests/test_followup_report.py | 1113 +++ .../views/account_followup_line_views.xml | 104 + .../views/account_followup_views.xml | 53 + .../views/partner_view.xml | 70 + .../views/report_followup.xml | 157 + .../wizard/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 375 bytes .../followup_manual_reminder.cpython-311.pyc | Bin 0 -> 7838 bytes ...llowup_missing_information.cpython-311.pyc | Bin 0 -> 1548 bytes .../wizard/followup_manual_reminder.py | 133 + .../wizard/followup_manual_reminder_views.xml | 98 + .../wizard/followup_missing_information.py | 20 + .../wizard/followup_missing_information.xml | 33 + .../odex30_account_online_sync/__init__.py | 5 + .../__manifest__.py | 51 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 383 bytes .../controllers/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 298 bytes .../__pycache__/portal.cpython-311.pyc | Bin 0 -> 4280 bytes .../controllers/portal.py | 58 + .../data/config_parameter.xml | 13 + .../data/ir_cron.xml | 48 + .../data/mail_activity_type_data.xml | 21 + .../data/neutralize.sql | 4 + .../data/sync_reminder_email_template.xml | 71 + .../i18n/account_online_synchronization.pot | 1322 +++ .../odex30_account_online_sync/i18n/ar.po | 1418 ++++ .../models/__init__.py | 9 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 621 bytes .../account_bank_statement.cpython-311.pyc | Bin 0 -> 8104 bytes .../account_journal.cpython-311.pyc | Bin 0 -> 26737 bytes .../account_online.cpython-311.pyc | Bin 0 -> 69362 bytes .../bank_rec_widget.cpython-311.pyc | Bin 0 -> 1257 bytes .../__pycache__/company.cpython-311.pyc | Bin 0 -> 1153 bytes .../mail_activity_type.cpython-311.pyc | Bin 0 -> 1161 bytes .../__pycache__/odoofin_auth.cpython-311.pyc | Bin 0 -> 2789 bytes .../__pycache__/partner.cpython-311.pyc | Bin 0 -> 709 bytes .../models/account_bank_statement.py | 114 + .../models/account_journal.py | 380 + .../models/account_online.py | 1170 +++ .../models/bank_rec_widget.py | 16 + .../models/company.py | 15 + .../models/mail_activity_type.py | 14 + .../models/odoofin_auth.py | 46 + .../models/partner.py | 7 + .../security/account_online_sync_security.xml | 15 + .../security/ir.model.access.csv | 12 + .../account_duplicate_transaction_form.js | 37 + .../account_duplicate_transaction_hook.js | 6 + .../account_duplicate_transaction_service.js | 21 + .../account_duplicate_transactions_x2many.js | 50 + ...account_duplicate_transactions_x2many.scss | 3 + .../account_duplicate_transactions_x2many.xml | 14 + .../bank_configure/bank_configure.js | 84 + .../bank_configure/bank_configure.scss | 15 + .../bank_configure/bank_configure.xml | 29 + .../fetch_missing_transactions_cog_menu.js | 68 + .../fetch_missing_transactions_cog_menu.xml | 8 + .../find_duplicate_transactions_cog_menu.js | 64 + .../find_duplicate_transactions_cog_menu.xml | 8 + .../connected_until_widget.js | 61 + .../connected_until_widget.xml | 23 + .../online_account_radio.js | 41 + .../online_account_radio.xml | 29 + .../refresh_spin_journal_widget.js | 99 + .../refresh_spin_journal_widget.xml | 42 + ...transient_bank_statement_line_list_view.js | 51 + ...ransient_bank_statement_line_list_view.xml | 28 + .../account_online_authorization_kanban.js | 19 + ...online_authorization_kanban_controller.xml | 12 + .../static/src/js/odoo_fin_connector.js | 86 + .../static/src/js/online_sync_portal.js | 57 + .../tests/helpers/model_definitions_setup.js | 5 + .../static/tests/online_account_radio_test.js | 83 + .../tests/__init__.py | 7 + .../tests/common.py | 110 + ...est_account_missing_transactions_wizard.py | 45 + .../tests/test_account_online_account.py | 491 ++ .../test_online_sync_branch_companies.py | 86 + .../test_online_sync_creation_statement.py | 374 + .../views/account_bank_statement_view.xml | 27 + .../views/account_journal_dashboard_view.xml | 86 + .../views/account_journal_view.xml | 22 + .../account_online_sync_portal_templates.xml | 59 + .../views/account_online_sync_views.xml | 126 + .../wizard/__init__.py | 6 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 536 bytes ...ount_bank_selection_wizard.cpython-311.pyc | Bin 0 -> 2700 bytes ...ccount_bank_statement_line.cpython-311.pyc | Bin 0 -> 4318 bytes ...nal_duplicate_transactions.cpython-311.pyc | Bin 0 -> 4348 bytes ...urnal_missing_transactions.cpython-311.pyc | Bin 0 -> 5691 bytes .../wizard/account_bank_selection_wizard.py | 29 + .../wizard/account_bank_selection_wizard.xml | 26 + .../wizard/account_bank_statement_line.py | 89 + .../wizard/account_bank_statement_line.xml | 34 + .../account_journal_duplicate_transactions.py | 66 + ...account_journal_duplicate_transactions.xml | 50 + .../account_journal_missing_transactions.py | 78 + .../account_journal_missing_transactions.xml | 22 + .../odex30_account_reports/__init__.py | 12 + .../odex30_account_reports/__manifest__.py | 98 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 938 bytes .../controllers/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 294 bytes .../__pycache__/main.cpython-311.pyc | Bin 0 -> 6502 bytes .../controllers/main.py | 85 + .../data/account_report_actions.xml | 165 + .../data/aged_partner_balance.xml | 326 + .../data/balance_sheet.xml | 285 + .../data/bank_reconciliation_report.xml | 474 ++ .../data/cash_flow_report.xml | 19 + .../customer_reports_pdf_export_templates.xml | 62 + .../data/customer_statement.xml | 32 + .../data/deferred_reports.xml | 43 + .../data/executive_summary.xml | 395 + .../data/followup_report.xml | 37 + .../data/general_ledger.xml | 49 + .../data/generic_tax_report.xml | 14 + .../data/journal_report.xml | 239 + .../data/mail_activity_type_data.xml | 42 + .../data/mail_templates.xml | 26 + .../odex30_account_reports/data/menuitems.xml | 25 + .../data/multicurrency_revaluation_report.xml | 107 + .../data/partner_ledger.xml | 61 + .../data/pdf_export_templates.xml | 335 + .../data/profit_and_loss.xml | 139 + .../data/report_send_cron.xml | 11 + .../data/sales_report.xml | 36 + .../data/trial_balance.xml | 26 + .../i18n/account_reports.pot | 4482 ++++++++++ .../odex30_account_reports/i18n/ar_001.po | 4608 ++++++++++ .../odex30_account_reports/models/__init__.py | 32 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2055 bytes .../__pycache__/account.cpython-311.pyc | Bin 0 -> 1078 bytes ...count_aged_partner_balance.cpython-311.pyc | Bin 0 -> 31150 bytes .../account_analytic_report.cpython-311.pyc | Bin 0 -> 18458 bytes .../account_cash_flow_report.cpython-311.pyc | Bin 0 -> 41891 bytes ...account_customer_statement.cpython-311.pyc | Bin 0 -> 2163 bytes .../account_deferred_reports.cpython-311.pyc | Bin 0 -> 41500 bytes .../account_fiscal_position.cpython-311.pyc | Bin 0 -> 2038 bytes .../account_followup_report.cpython-311.pyc | Bin 0 -> 8364 bytes .../account_general_ledger.cpython-311.pyc | Bin 0 -> 45346 bytes ...account_generic_tax_report.cpython-311.pyc | Bin 0 -> 70427 bytes .../account_journal_dashboard.cpython-311.pyc | Bin 0 -> 2866 bytes .../account_journal_report.cpython-311.pyc | Bin 0 -> 73985 bytes .../__pycache__/account_move.cpython-311.pyc | Bin 0 -> 20778 bytes .../account_move_line.cpython-311.pyc | Bin 0 -> 6494 bytes ...urrency_revaluation_report.cpython-311.pyc | Bin 0 -> 27426 bytes .../account_partner_ledger.cpython-311.pyc | Bin 0 -> 53533 bytes .../account_report.cpython-311.pyc | Bin 0 -> 435465 bytes .../account_sales_report.cpython-311.pyc | Bin 0 -> 27164 bytes .../__pycache__/account_tax.cpython-311.pyc | Bin 0 -> 13291 bytes ...count_trial_balance_report.cpython-311.pyc | Bin 0 -> 15019 bytes .../__pycache__/balance_sheet.cpython-311.pyc | Bin 0 -> 1173 bytes ...bank_reconciliation_report.cpython-311.pyc | Bin 0 -> 37316 bytes .../models/__pycache__/budget.cpython-311.pyc | Bin 0 -> 8563 bytes .../chart_template.cpython-311.pyc | Bin 0 -> 2900 bytes .../executive_summary_report.cpython-311.pyc | Bin 0 -> 1536 bytes .../__pycache__/ir_actions.cpython-311.pyc | Bin 0 -> 1028 bytes .../__pycache__/mail_activity.cpython-311.pyc | Bin 0 -> 3293 bytes .../mail_activity_type.cpython-311.pyc | Bin 0 -> 1552 bytes .../__pycache__/res_company.cpython-311.pyc | Bin 0 -> 27559 bytes .../res_config_settings.cpython-311.pyc | Bin 0 -> 5515 bytes .../__pycache__/res_partner.cpython-311.pyc | Bin 0 -> 6235 bytes .../odex30_account_reports/models/account.py | 9 + .../models/account_aged_partner_balance.py | 447 + .../models/account_analytic_report.py | 257 + .../models/account_cash_flow_report.py | 711 ++ .../models/account_customer_statement.py | 24 + .../models/account_deferred_reports.py | 659 ++ .../models/account_fiscal_position.py | 19 + .../models/account_followup_report.py | 109 + .../models/account_general_ledger.py | 761 ++ .../models/account_generic_tax_report.py | 1222 +++ .../models/account_journal_dashboard.py | 28 + .../models/account_journal_report.py | 1385 +++ .../models/account_move.py | 293 + .../models/account_move_line.py | 75 + ...ccount_multicurrency_revaluation_report.py | 386 + .../models/account_partner_ledger.py | 815 ++ .../models/account_report.py | 7553 +++++++++++++++++ .../models/account_sales_report.py | 420 + .../models/account_tax.py | 158 + .../models/account_trial_balance_report.py | 195 + .../models/balance_sheet.py | 11 + .../models/bank_reconciliation_report.py | 620 ++ .../odex30_account_reports/models/budget.py | 116 + .../models/chart_template.py | 39 + .../models/executive_summary_report.py | 14 + .../models/ir_actions.py | 12 + .../models/mail_activity.py | 35 + .../models/mail_activity_type.py | 26 + .../models/res_company.py | 465 + .../models/res_config_settings.py | 74 + .../models/res_partner.py | 104 + .../security/ir.model.access.csv | 19 + .../account_report/account_report.js | 125 + .../account_report/account_report.scss | 465 + .../account_report/account_report.xml | 107 + .../account_report/buttons_bar/buttons_bar.js | 27 + .../buttons_bar/buttons_bar.xml | 15 + .../account_report/cog_menu/cog_menu.js | 31 + .../account_report/cog_menu/cog_menu.xml | 21 + .../components/account_report/controller.js | 820 ++ .../account_report/ellipsis/ellipsis.js | 64 + .../account_report/ellipsis/ellipsis.xml | 28 + .../ellipsis/popover/ellipsis_popover.js | 12 + .../ellipsis/popover/ellipsis_popover.xml | 11 + .../filters/filter_account_type.xml | 21 + .../filters/filter_aml_ir_filters.xml | 21 + .../filters/filter_analytic.xml | 19 + .../filters/filter_analytic_groupby.xml | 24 + .../account_report/filters/filter_budgets.xml | 51 + .../filters/filter_comparison.xml | 163 + .../account_report/filters/filter_date.xml | 110 + .../filters/filter_extra_options.xml | 98 + .../filters/filter_fiscal_position.xml | 43 + .../filters/filter_horizontal_groups.xml | 30 + .../account_report/filters/filter_journal.xml | 39 + .../account_report/filters/filter_partner.xml | 24 + .../filters/filter_rounding_unit.xml | 21 + .../filters/filter_tax_unit.xml | 33 + .../account_report/filters/filter_variant.xml | 26 + .../account_report/filters/filters.js | 647 ++ .../account_report/filters/filters.scss | 98 + .../account_report/filters/filters.xml | 121 + .../account_report/header/header.js | 118 + .../account_report/header/header.xml | 128 + .../components/account_report/line/line.js | 143 + .../components/account_report/line/line.xml | 76 + .../line/popover/debug_popover.js | 12 + .../line/popover/debug_popover.xml | 51 + .../account_report/line_cell/line_cell.js | 178 + .../account_report/line_cell/line_cell.xml | 56 + .../line_cell/popover/carryover_popover.js | 39 + .../line_cell/popover/carryover_popover.xml | 56 + .../line_cell/popover/edit_popover.js | 64 + .../line_cell/popover/edit_popover.xml | 75 + .../line_cell_editable/line_cell_editable.js | 79 + .../line_cell_editable/line_cell_editable.xml | 20 + .../account_report/line_name/line_name.js | 173 + .../account_report/line_name/line_name.xml | 91 + .../line_name/popover/annotations_popover.js | 137 + .../line_name/popover/annotations_popover.xml | 35 + .../popover_line/annotation_popover_line.js | 79 + .../popover_line/annotation_popover_line.xml | 30 + .../account_report/search_bar/search_bar.js | 49 + .../account_report/search_bar/search_bar.xml | 22 + .../components/account_report/warnings.xml | 17 + .../aged_partner_balance.scss | 4 + .../aged_partner_balance/filter_aging.xml | 53 + .../filter_extra_options.xml | 22 + .../aged_partner_balance/filters.js | 29 + .../aged_partner_balance/filters.xml | 21 + .../line_name/line_name.xml | 38 + .../bank_reconciliation_report/warnings.xml | 35 + .../customer_statement.scss | 12 + .../components/deferred_reports/filters.xml | 17 + .../components/deferred_reports/groupby.xml | 42 + .../components/deferred_reports/warnings.xml | 19 + .../components/general_ledger/line_name.xml | 18 + .../journal_dashboard_activity.js | 30 + .../journal_dashboard_activity.xml | 13 + .../journal_report/filter_extra_options.xml | 14 + .../src/components/journal_report/filters.js | 8 + .../src/components/journal_report/filters.xml | 8 + .../journal_report/journal_report.scss | 38 + .../components/journal_report/line/line.js | 39 + .../components/journal_report/line/line.xml | 143 + .../components/journal_report/line_name.xml | 38 + .../move_line_list/move_line_list.js | 23 + .../filters/filter_exchange_rate.xml | 36 + .../filters/filters.js | 23 + .../filters/filters.scss | 21 + .../filters/filters.xml | 12 + .../line_name.xml | 38 + .../warnings.xml | 16 + .../partner_ledger/filter_extra_options.xml | 24 + .../src/components/partner_ledger/filters.xml | 8 + .../components/partner_ledger/line_cell.js | 26 + .../components/partner_ledger/line_cell.xml | 4 + .../components/partner_ledger/line_name.xml | 40 + .../partner_ledger/partner_ledger.scss | 3 + .../redirectAction/redirectAction.js | 30 + .../redirectAction/redirectAction.xml | 13 + .../sales_report/filters/filter_code.xml | 21 + .../sales_report/filters/filters.js | 28 + .../sales_report/filters/filters.xml | 8 + .../src/components/sales_report/warnings.xml | 33 + .../tax_report/filters/filter_date.xml | 32 + .../components/tax_report/filters/filters.xml | 8 + .../src/components/tax_report/line_name.xml | 10 + .../src/components/tax_report/tax_report.scss | 8 + .../src/components/tax_report/warnings.xml | 16 + .../js/action_manager_account_report_dl.js | 34 + .../static/src/js/util.js | 57 + .../scss/account_financial_report.dark.scss | 21 + .../src/scss/account_pdf_export_template.scss | 145 + .../src/scss/pdf/pdf_journal_report.scss | 121 + .../account_report_x2many.js | 346 + .../account_report_x2many.scss | 54 + .../account_report_x2many.xml | 142 + .../account_report/account_report.test.js | 212 + .../line_cell_editable.test.js | 35 + .../tests/legacy/account_report_builder.js | 684 ++ .../action_manager_account_report_dl_tests.js | 52 + .../static/tests/tours/account.js | 35 + .../static/tests/tours/account_reports.js | 262 + .../tours/account_reports_amount_rounding.js | 94 + .../tours/account_reports_analytic_filters.js | 28 + .../tours/account_reports_annotations.js | 298 + .../tours/account_reports_hide_0_lines.js | 107 + .../tests/tours/account_reports_search.js | 43 + .../tests/tours/account_reports_sections.js | 129 + .../tests/tours/account_reports_widgets.js | 82 + .../static/tests/tours/asserts.js | 115 + .../tests/tours/test_tour_bank_rec_ui.js | 25 + .../static/tests/util.test.js | 56 + .../odex30_account_reports/tests/__init__.py | 35 + .../tests/account_sales_report_common.py | 43 + .../odex30_account_reports/tests/common.py | 399 + ...test_account_reports_annotations_export.py | 136 + .../tests/test_account_reports_filters.py | 1617 ++++ .../test_account_reports_journal_filter.py | 731 ++ .../test_account_reports_tax_reminder.py | 135 + .../tests/test_account_reports_tours.py | 87 + .../test_account_sales_report_generic.py | 177 + .../tests/test_aged_payable_report.py | 798 ++ .../tests/test_aged_receivable_report.py | 835 ++ .../tests/test_all_reports_generation.py | 171 + .../tests/test_analytic_reports.py | 708 ++ .../tests/test_balance_sheet_balanced.py | 813 ++ .../tests/test_balance_sheet_report.py | 247 + .../tests/test_budget.py | 716 ++ .../tests/test_cash_flow_report.py | 1348 +++ .../tests/test_currency_table.py | 455 + .../tests/test_deferred_reports.py | 2040 +++++ .../tests/test_financial_report.py | 919 ++ .../tests/test_followup_report.py | 170 + .../tests/test_general_ledger_report.py | 686 ++ .../tests/test_journal_report.py | 513 ++ ...test_multicurrencies_revaluation_report.py | 1219 +++ .../tests/test_partner_ledger_report.py | 714 ++ .../tests/test_reconciliation_report.py | 859 ++ .../tests/test_report_engines.py | 1963 +++++ .../tests/test_report_sections.py | 148 + .../tests/test_tax_report.py | 3174 +++++++ .../tests/test_tax_report_carryover.py | 334 + .../tests/test_tax_report_default_part.py | 1138 +++ .../tests/test_tour_account_reports.py | 40 + .../tests/test_tour_analytic_filters.py | 27 + .../tests/test_trial_balance_report.py | 628 ++ .../views/account_account_views.xml | 13 + .../views/account_activity.xml | 42 + .../views/account_journal_dashboard_view.xml | 48 + .../views/account_move_views.xml | 99 + .../views/account_report_view.xml | 399 + .../views/account_tax_views.xml | 64 + .../views/mail_activity_views.xml | 13 + .../views/report_template.xml | 21 + .../views/res_company_views.xml | 16 + .../views/res_config_settings_views.xml | 55 + .../views/res_partner_views.xml | 46 + .../odex30_account_reports/wizard/__init__.py | 7 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 618 bytes .../account_change_lock_date.cpython-311.pyc | Bin 0 -> 1736 bytes ...file_download_error_wizard.cpython-311.pyc | Bin 0 -> 1499 bytes .../account_report_send.cpython-311.pyc | Bin 0 -> 16888 bytes .../__pycache__/fiscal_year.cpython-311.pyc | Bin 0 -> 1432 bytes .../multicurrency_revaluation.cpython-311.pyc | Bin 0 -> 12927 bytes .../report_export_wizard.cpython-311.pyc | Bin 0 -> 8522 bytes .../wizard/account_change_lock_date.py | 22 + ...count_report_file_download_error_wizard.py | 20 + ...ount_report_file_download_error_wizard.xml | 38 + .../wizard/account_report_send.py | 315 + .../wizard/account_report_send.xml | 92 + .../wizard/fiscal_year.py | 14 + .../wizard/fiscal_year.xml | 20 + .../wizard/mail_activity_schedule_views.xml | 13 + .../wizard/multicurrency_revaluation.py | 192 + .../wizard/multicurrency_revaluation.xml | 31 + .../wizard/report_export_wizard.py | 131 + .../wizard/report_export_wizard.xml | 27 + .../odex30_analytic/__init__.py | 3 + .../odex30_analytic/__manifest__.py | 32 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 277 bytes .../i18n/analytic_enterprise.pot | 36 + .../odex30_analytic/i18n/ar.po | 40 + .../odex30_analytic/models/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 284 bytes .../models/__pycache__/models.cpython-311.pyc | Bin 0 -> 1192 bytes .../odex30_analytic/models/models.py | 11 + .../analytic_line_grid_model.js | 44 + .../analytic_line_grid_view.js | 14 + .../tests/analytic_line_grid_view_tests.js | 117 + .../views/account_analytic_view.xml | 41 + 943 files changed, 145795 insertions(+) create mode 100644 dev_odex30_accounting/account_chart_of_accounts/CHANGELOG.md create mode 100644 dev_odex30_accounting/account_chart_of_accounts/README.md create mode 100644 dev_odex30_accounting/account_chart_of_accounts/__init__.py create mode 100644 dev_odex30_accounting/account_chart_of_accounts/__manifest__.py create mode 100644 dev_odex30_accounting/account_chart_of_accounts/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/account_chart_of_accounts/data/account_report_data.xml create mode 100644 dev_odex30_accounting/account_chart_of_accounts/models/__init__.py create mode 100644 dev_odex30_accounting/account_chart_of_accounts/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/account_chart_of_accounts/models/__pycache__/account_account.cpython-311.pyc create mode 100644 dev_odex30_accounting/account_chart_of_accounts/models/__pycache__/account_journal.cpython-311.pyc create mode 100644 dev_odex30_accounting/account_chart_of_accounts/models/__pycache__/res_config_settings.cpython-311.pyc create mode 100644 dev_odex30_accounting/account_chart_of_accounts/models/account_account.py create mode 100644 dev_odex30_accounting/account_chart_of_accounts/models/account_journal.py create mode 100644 dev_odex30_accounting/account_chart_of_accounts/models/res_config_settings.py create mode 100644 dev_odex30_accounting/account_chart_of_accounts/report/__init__.py create mode 100644 dev_odex30_accounting/account_chart_of_accounts/report/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/account_chart_of_accounts/report/__pycache__/account_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/account_chart_of_accounts/report/account_report.py create mode 100644 dev_odex30_accounting/account_chart_of_accounts/security/account_security.xml create mode 100644 dev_odex30_accounting/account_chart_of_accounts/security/ir.model.access.csv create mode 100644 dev_odex30_accounting/account_chart_of_accounts/static/src/js/account_report.js create mode 100644 dev_odex30_accounting/account_chart_of_accounts/static/src/js/account_type_selection_extend.js create mode 100644 dev_odex30_accounting/account_chart_of_accounts/static/src/js/filters_patch.js create mode 100644 dev_odex30_accounting/account_chart_of_accounts/static/src/scss/account_hierarchy.scss create mode 100644 dev_odex30_accounting/account_chart_of_accounts/static/src/xml/filter_full_hierarchy.xml create mode 100644 dev_odex30_accounting/account_chart_of_accounts/views/account_account_view.xml create mode 100644 dev_odex30_accounting/account_chart_of_accounts/views/res_config_settings_views.xml create mode 100644 dev_odex30_accounting/exp_asset_base/.idea/exp_asset_base.iml create mode 100644 dev_odex30_accounting/exp_asset_base/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 dev_odex30_accounting/exp_asset_base/.idea/misc.xml create mode 100644 dev_odex30_accounting/exp_asset_base/.idea/modules.xml create mode 100644 dev_odex30_accounting/exp_asset_base/.idea/workspace.xml create mode 100644 dev_odex30_accounting/exp_asset_base/__init__.py create mode 100644 dev_odex30_accounting/exp_asset_base/__manifest__.py create mode 100644 dev_odex30_accounting/exp_asset_base/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_base/data/asset_cron.xml create mode 100644 dev_odex30_accounting/exp_asset_base/data/asset_data.xml create mode 100644 dev_odex30_accounting/exp_asset_base/i18n/ar.po create mode 100644 dev_odex30_accounting/exp_asset_base/i18n/ar_001.po create mode 100644 dev_odex30_accounting/exp_asset_base/i18n/ar_SY.po create mode 100644 dev_odex30_accounting/exp_asset_base/models/__init__.py create mode 100644 dev_odex30_accounting/exp_asset_base/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_base/models/__pycache__/account_asset.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_base/models/__pycache__/account_asset_adjustment.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_base/models/__pycache__/asset_modify.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_base/models/__pycache__/asset_pause.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_base/models/__pycache__/asset_sell.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_base/models/account_asset.py create mode 100644 dev_odex30_accounting/exp_asset_base/models/account_asset_adjustment.py create mode 100644 dev_odex30_accounting/exp_asset_base/models/asset_modify.py create mode 100644 dev_odex30_accounting/exp_asset_base/models/asset_pause.py create mode 100644 dev_odex30_accounting/exp_asset_base/models/asset_sell.py create mode 100644 dev_odex30_accounting/exp_asset_base/reports/__init__.py create mode 100644 dev_odex30_accounting/exp_asset_base/reports/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_base/reports/__pycache__/abstract_report_xlsx.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_base/reports/__pycache__/asset_register_report_xlsx.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_base/reports/abstract_report_xlsx.py create mode 100644 dev_odex30_accounting/exp_asset_base/reports/asset_barcode_pdf_report.xml create mode 100644 dev_odex30_accounting/exp_asset_base/reports/asset_barcode_zpl_report.xml create mode 100644 dev_odex30_accounting/exp_asset_base/reports/asset_depreciation_report_xlsx.py create mode 100644 dev_odex30_accounting/exp_asset_base/reports/asset_register_report.py create mode 100644 dev_odex30_accounting/exp_asset_base/reports/asset_register_report.xml create mode 100644 dev_odex30_accounting/exp_asset_base/reports/asset_register_report_xlsx.py create mode 100644 dev_odex30_accounting/exp_asset_base/reports/reports.xml create mode 100644 dev_odex30_accounting/exp_asset_base/security/groups.xml create mode 100644 dev_odex30_accounting/exp_asset_base/security/ir.model.access.csv create mode 100644 dev_odex30_accounting/exp_asset_base/static/description/assets.png create mode 100644 dev_odex30_accounting/exp_asset_base/static/description/icon.png create mode 100644 dev_odex30_accounting/exp_asset_base/views/account_asset_adjustment_view.xml create mode 100644 dev_odex30_accounting/exp_asset_base/views/account_asset_view.xml create mode 100644 dev_odex30_accounting/exp_asset_base/views/asset_modify_views.xml create mode 100644 dev_odex30_accounting/exp_asset_base/views/asset_pause_views.xml create mode 100644 dev_odex30_accounting/exp_asset_base/views/asset_sell_views.xml create mode 100644 dev_odex30_accounting/exp_asset_base/views/menus.xml create mode 100644 dev_odex30_accounting/exp_asset_custody/__init__.py create mode 100644 dev_odex30_accounting/exp_asset_custody/__manifest__.py create mode 100644 dev_odex30_accounting/exp_asset_custody/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_custody/data/asset_data.xml create mode 100644 dev_odex30_accounting/exp_asset_custody/i18n/ar.po create mode 100644 dev_odex30_accounting/exp_asset_custody/models/__init__.py create mode 100644 dev_odex30_accounting/exp_asset_custody/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_custody/models/__pycache__/account_asset.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_custody/models/__pycache__/account_asset_adjustment.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_custody/models/__pycache__/account_asset_multi_operation.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_custody/models/__pycache__/account_asset_operation.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_custody/models/account_asset.py create mode 100644 dev_odex30_accounting/exp_asset_custody/models/account_asset_adjustment.py create mode 100644 dev_odex30_accounting/exp_asset_custody/models/account_asset_multi_operation.py create mode 100644 dev_odex30_accounting/exp_asset_custody/models/account_asset_operation.py create mode 100644 dev_odex30_accounting/exp_asset_custody/reports/asset_adjustment_report.xml create mode 100644 dev_odex30_accounting/exp_asset_custody/security/ir.model.access.csv create mode 100644 dev_odex30_accounting/exp_asset_custody/static/description/icon.png create mode 100644 dev_odex30_accounting/exp_asset_custody/views/account_asset_adjustment_view.xml create mode 100644 dev_odex30_accounting/exp_asset_custody/views/account_asset_custody_multi_operation.xml create mode 100644 dev_odex30_accounting/exp_asset_custody/views/account_asset_custody_operation_view.xml create mode 100644 dev_odex30_accounting/exp_asset_custody/views/account_asset_view.xml create mode 100644 dev_odex30_accounting/exp_asset_custody/views/menus.xml create mode 100644 dev_odex30_accounting/exp_asset_custody_link/__init__.py create mode 100644 dev_odex30_accounting/exp_asset_custody_link/__manifest__.py create mode 100644 dev_odex30_accounting/exp_asset_custody_link/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_custody_link/i18n/ar_001.po create mode 100644 dev_odex30_accounting/exp_asset_custody_link/models/__init__.py create mode 100644 dev_odex30_accounting/exp_asset_custody_link/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_custody_link/models/__pycache__/account_asset_operation.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_custody_link/models/__pycache__/employee_custody.cpython-311.pyc create mode 100644 dev_odex30_accounting/exp_asset_custody_link/models/account_asset_operation.py create mode 100644 dev_odex30_accounting/exp_asset_custody_link/models/employee_custody.py create mode 100644 dev_odex30_accounting/exp_asset_custody_link/security/ir.model.access.csv create mode 100644 dev_odex30_accounting/exp_asset_custody_link/views/employee_custody_action.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/__manifest__.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/data/digest_data.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/data/ir_cron.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/data/odex30_account_accountant_tour.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/i18n/ar.po create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_account.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_bank_statement.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_chart_template.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_fiscal_year.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_journal_dashboard.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_move.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_payment.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_reconcile_model.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_reconcile_model_line.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_tax.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/bank_rec_widget.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/bank_rec_widget_line.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/digest.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/ir_model.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/ir_ui_menu.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/res_company.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/__pycache__/res_config_settings.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/account_account.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/account_bank_statement.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/account_chart_template.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/account_fiscal_year.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/account_journal_dashboard.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/account_move.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/account_payment.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/account_reconcile_model.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/account_reconcile_model_line.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/account_tax.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/bank_rec_widget.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/bank_rec_widget_line.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/digest.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/ir_model.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/ir_ui_menu.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/res_company.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/models/res_config_settings.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/security/ir.model.access.csv create mode 100644 dev_odex30_accounting/odex30_account_accountant/security/odex30_account_accountant_security.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/amls_list_view.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_quick_create.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_quick_create.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_record.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/embedded_list_view.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/finish_buttons.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/finish_buttons.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/global_info.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/global_info.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.scss create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/list.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/list_view_switcher.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/list_view_switcher.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/many2one_field_multi_edit.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/monetary_field_auto_signed_amount.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/monetary_field_auto_signed_amount.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/rainbowman_content.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/rainbowman_content.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/view_embedder.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/view_embedder.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/export_data_dialog/export_data_dialog.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/matching_link_widget/matching_link_widget.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/matching_link_widget/matching_link_widget.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/attachment_view_move_line.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/move_line_list.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/move_line_list.scss create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/move_line_list.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list_reconcile/move_line_list_reconcile.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list_reconcile/move_line_list_reconcile.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/img/accounting-bulk.gif.gif create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/src/js/tours/account_accountant.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/tests/move_line.test.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_rainbowman_reset.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_save_analytic_distribution.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_statements.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_ui.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_widget.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_journal_items_export.js create mode 100644 dev_odex30_accounting/odex30_account_accountant/tests/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/tests/test_account_auto_reconcile_wizard.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/tests/test_account_fiscal_year.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/tests/test_account_payment.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/tests/test_account_reconcile_wizard.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/tests/test_bank_rec_widget.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/tests/test_bank_rec_widget_common.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/tests/test_bank_rec_widget_tour.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/tests/test_change_lock_date_wizard.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/tests/test_deferred_management.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/tests/test_prediction.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/tests/test_reconciliation_matching_rules.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/tests/test_signature.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/tests/test_ui.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/views/account_fiscal_year_view.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/views/account_journal_dashboard_views.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/views/account_move_views.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/views/account_payment_views.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/views/account_reconcile_model_views.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/views/bank_rec_widget_views.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/views/digest_views.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/views/odex30_account_account_views.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/views/odex30_account_accountant_menuitems.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/views/odex30_account_reconcile_views.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/views/product_views.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/views/report_invoice.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/views/res_config_settings_views.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/wizard/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/wizard/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/wizard/__pycache__/account_auto_reconcile_wizard.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/wizard/__pycache__/account_change_lock_date.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/wizard/__pycache__/account_reconcile_wizard.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_accountant/wizard/account_auto_reconcile_wizard.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/wizard/account_auto_reconcile_wizard.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/wizard/account_change_lock_date.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/wizard/account_change_lock_date.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/wizard/account_reconcile_wizard.py create mode 100644 dev_odex30_accounting/odex30_account_accountant/wizard/account_reconcile_wizard.xml create mode 100644 dev_odex30_accounting/odex30_account_accountant/wizard/reconcile_model_wizard.xml create mode 100644 dev_odex30_accounting/odex30_account_asset/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_asset/__manifest__.py create mode 100644 dev_odex30_accounting/odex30_account_asset/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_asset/data/account_report_actions.xml create mode 100644 dev_odex30_accounting/odex30_account_asset/data/assets_report.xml create mode 100644 dev_odex30_accounting/odex30_account_asset/data/menuitems.xml create mode 100644 dev_odex30_accounting/odex30_account_asset/demo/account_asset_demo.xml create mode 100644 dev_odex30_accounting/odex30_account_asset/i18n/ar.po create mode 100644 dev_odex30_accounting/odex30_account_asset/models/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_asset/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_asset/models/__pycache__/account.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_asset/models/__pycache__/account_asset.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_asset/models/__pycache__/account_asset_group.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_asset/models/__pycache__/account_assets_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_asset/models/__pycache__/account_move.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_asset/models/__pycache__/res_company.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_asset/models/account.py create mode 100644 dev_odex30_accounting/odex30_account_asset/models/account_asset.py create mode 100644 dev_odex30_accounting/odex30_account_asset/models/account_asset_group.py create mode 100644 dev_odex30_accounting/odex30_account_asset/models/account_assets_report.py create mode 100644 dev_odex30_accounting/odex30_account_asset/models/account_move.py create mode 100644 dev_odex30_accounting/odex30_account_asset/models/res_company.py create mode 100644 dev_odex30_accounting/odex30_account_asset/security/account_asset_security.xml create mode 100644 dev_odex30_accounting/odex30_account_asset/security/ir.model.access.csv create mode 100644 dev_odex30_accounting/odex30_account_asset/static/description/icon.png create mode 100644 dev_odex30_accounting/odex30_account_asset/static/description/icon.svg create mode 100644 dev_odex30_accounting/odex30_account_asset/static/src/components/depreciation_schedule/depreciation_schedule.scss create mode 100644 dev_odex30_accounting/odex30_account_asset/static/src/components/depreciation_schedule/filters.xml create mode 100644 dev_odex30_accounting/odex30_account_asset/static/src/components/depreciation_schedule/groupby.xml create mode 100644 dev_odex30_accounting/odex30_account_asset/static/src/components/move_reversed/move_reversed.js create mode 100644 dev_odex30_accounting/odex30_account_asset/static/src/components/move_reversed/move_reversed.xml create mode 100644 dev_odex30_accounting/odex30_account_asset/static/src/scss/account_asset.dark.scss create mode 100644 dev_odex30_accounting/odex30_account_asset/static/src/scss/account_asset.scss create mode 100644 dev_odex30_accounting/odex30_account_asset/static/src/views/fields/properties/properties_field.js create mode 100644 dev_odex30_accounting/odex30_account_asset/static/src/web/form_controller_patch.js create mode 100644 dev_odex30_accounting/odex30_account_asset/tests/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_asset/tests/common.py create mode 100644 dev_odex30_accounting/odex30_account_asset/tests/test_account_asset.py create mode 100644 dev_odex30_accounting/odex30_account_asset/tests/test_board_compute.py create mode 100644 dev_odex30_accounting/odex30_account_asset/tests/test_reevaluation_asset.py create mode 100644 dev_odex30_accounting/odex30_account_asset/views/account_account_views.xml create mode 100644 dev_odex30_accounting/odex30_account_asset/views/account_asset_group_views.xml create mode 100644 dev_odex30_accounting/odex30_account_asset/views/account_asset_views.xml create mode 100644 dev_odex30_accounting/odex30_account_asset/views/account_move_views.xml create mode 100644 dev_odex30_accounting/odex30_account_asset/wizard/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_asset/wizard/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_asset/wizard/__pycache__/asset_modify.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_asset/wizard/asset_modify.py create mode 100644 dev_odex30_accounting/odex30_account_asset/wizard/asset_modify_views.xml create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/__manifest__.py create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/data/cron.xml create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/demo/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/demo/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/demo/__pycache__/account_demo.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/demo/account_demo.py create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/i18n/ar.po create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/models/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/models/__pycache__/account_journal.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/models/__pycache__/account_move.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/models/__pycache__/account_move_line.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/models/__pycache__/transfer_model.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/models/account_journal.py create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/models/account_move.py create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/models/account_move_line.py create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/models/transfer_model.py create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/security/account_auto_transfer_security.xml create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/security/ir.model.access.csv create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/static/description/icon.png create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/static/description/icon.svg create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/tests/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/tests/account_auto_transfer_test_classes.py create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/tests/test_transfer_model.py create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/tests/test_transfer_model_line.py create mode 100644 dev_odex30_accounting/odex30_account_auto_transfer/views/transfer_model_views.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/__manifest__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/demo/partner_bank.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/i18n/ar.po create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/models/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/models/__pycache__/account_bank_statement.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/models/__pycache__/account_journal.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/models/account_bank_statement.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/models/account_journal.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/static/csv/account.bank.statement.csv create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/static/description/icon_src.svg create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/static/src/account_bank_statement_import_model.js create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/finish_buttons.js create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/finish_buttons.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/kanban.js create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/kanban.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/list.js create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/list.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/views/account_bank_statement_import_view.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/wizard/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/wizard/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/wizard/__pycache__/setup_wizards.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import/wizard/setup_wizards.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/__manifest__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/doc/standard-camt053-statement-v2-en_1.pdf create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/i18n/account_bank_statement_import_camt.pot create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/i18n/ar.po create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/lib/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/lib/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/lib/__pycache__/camt.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/lib/camt.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/models/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/models/__pycache__/account_journal.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/models/account_journal.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_additional_entry_info.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_custom_codes.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_exchange_fees.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_EUR.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_02.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_03.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_04.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_05.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_06.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_07.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_charges.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_charges_02.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_charges_03.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_datetime.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_intraday.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_namespace.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_sample.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_ibans.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_minimal_stmt_different_currency.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_charges.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_instructed_amount.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_instructed_amount_02.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_01.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_02.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_03.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_04.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_05.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_nordic.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/test_camt.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/test_camt_no_opening_balance.xml create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/tests/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_camt/tests/test_account_bank_statement_import_camt.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/__manifest__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/i18n/account_bank_statement_import_csv.pot create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/i18n/ar.po create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/models/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/models/__pycache__/account_journal.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/models/account_journal.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/static/csv/account.bank.statement.csv create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/static/src/bank_statement_csv_import_action.js create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/static/src/bank_statement_csv_import_model.js create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv.csv create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_empty_date.csv create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_missing_values.csv create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_non_sorted.csv create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_without_amount.csv create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/tests/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/tests/test_import_bank_statement.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/wizard/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/wizard/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/wizard/__pycache__/account_bank_statement_import_csv.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_csv/wizard/account_bank_statement_import_csv.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/__manifest__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/i18n/account_bank_statement_import_ofx.pot create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/i18n/ar.po create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/models/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/models/__pycache__/account_journal.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/models/account_journal.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/description/icon.png create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/description/icon.svg create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/ofx/test_ofx.ofx create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/ofx/test_ofx_unicode_error.ofx create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/tests/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_ofx/tests/test_import_bank_statement.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/__manifest__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/i18n/account_bank_statement_import_qif.pot create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/i18n/ar.po create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/models/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/models/__pycache__/account_journal.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/models/account_journal.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/static/description/icon.png create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/static/description/icon.svg create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/static/qif/test_qif.qif create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/tests/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/tests/test_import_bank_statement.py create mode 100644 dev_odex30_accounting/odex30_account_bank_statement_import_qif/views/account_journal_views.xml create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/__manifest__.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/data/account_batch_payment_data.xml create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/i18n/account_batch_payment.pot create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/i18n/ar.po create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/models/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/models/__pycache__/account_batch_payment.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/models/__pycache__/account_journal.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/models/__pycache__/account_payment.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/models/__pycache__/account_payment_method.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/models/account_batch_payment.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/models/account_journal.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/models/account_payment.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/models/account_payment_method.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/models/sepa_mapping.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/report/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/report/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/report/__pycache__/account_batch_payment_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/report/account_batch_payment_report.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/report/account_batch_payment_report_templates.xml create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/report/account_batch_payment_reports.xml create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/security/account_batch_payment_security.xml create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/security/ir.model.access.csv create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/static/description/icon.png create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/static/description/icon.svg create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/static/src/scss/report_batch_payment.scss create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/tests/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/tests/test_account_batch_payment.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/tests/test_sepa_mapping.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/views/account_batch_payment_views.xml create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/views/account_journal_views.xml create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/views/account_payment_views.xml create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/wizard/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/wizard/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/wizard/__pycache__/batch_error.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/wizard/batch_error.py create mode 100644 dev_odex30_accounting/odex30_account_batch_payment/wizard/batch_error_views.xml create mode 100644 dev_odex30_accounting/odex30_account_budget/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_budget/__manifest__.py create mode 100644 dev_odex30_accounting/odex30_account_budget/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_budget/data/account_budget_demo.xml create mode 100644 dev_odex30_accounting/odex30_account_budget/i18n/ar.po create mode 100644 dev_odex30_accounting/odex30_account_budget/models/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_budget/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_budget/models/__pycache__/account_analytic_account.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_budget/models/__pycache__/budget_analytic.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_budget/models/__pycache__/budget_line.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_budget/models/__pycache__/purchase_order.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_budget/models/__pycache__/purchase_order_line.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_budget/models/account_analytic_account.py create mode 100644 dev_odex30_accounting/odex30_account_budget/models/budget_analytic.py create mode 100644 dev_odex30_accounting/odex30_account_budget/models/budget_line.py create mode 100644 dev_odex30_accounting/odex30_account_budget/models/purchase_order.py create mode 100644 dev_odex30_accounting/odex30_account_budget/models/purchase_order_line.py create mode 100644 dev_odex30_accounting/odex30_account_budget/reports/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_budget/reports/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_budget/reports/__pycache__/budget_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_budget/reports/budget_report.py create mode 100644 dev_odex30_accounting/odex30_account_budget/reports/budget_report_view.xml create mode 100644 dev_odex30_accounting/odex30_account_budget/security/account_budget_security.xml create mode 100644 dev_odex30_accounting/odex30_account_budget/security/ir.model.access.csv create mode 100644 dev_odex30_accounting/odex30_account_budget/tests/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_budget/tests/common.py create mode 100644 dev_odex30_accounting/odex30_account_budget/tests/test_account_budget.py create mode 100644 dev_odex30_accounting/odex30_account_budget/tests/test_commited_achieved_amount.py create mode 100644 dev_odex30_accounting/odex30_account_budget/tests/test_purchase_order.py create mode 100644 dev_odex30_accounting/odex30_account_budget/tests/test_theoreticalamount.py create mode 100644 dev_odex30_accounting/odex30_account_budget/tests/test_uncommitted_amount.py create mode 100644 dev_odex30_accounting/odex30_account_budget/views/account_analytic_account_views.xml create mode 100644 dev_odex30_accounting/odex30_account_budget/views/budget_analytic_views.xml create mode 100644 dev_odex30_accounting/odex30_account_budget/views/budget_line_view.xml create mode 100644 dev_odex30_accounting/odex30_account_budget/views/purchase_views.xml create mode 100644 dev_odex30_accounting/odex30_account_budget/wizards/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_budget/wizards/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_budget/wizards/__pycache__/budget_split_wizard.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_budget/wizards/budget_split_wizard.py create mode 100644 dev_odex30_accounting/odex30_account_budget/wizards/budget_split_wizard_view.xml create mode 100644 dev_odex30_accounting/odex30_account_followup/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_followup/__manifest__.py create mode 100644 dev_odex30_accounting/odex30_account_followup/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_followup/data/account_followup_data.xml create mode 100644 dev_odex30_accounting/odex30_account_followup/data/cron.xml create mode 100644 dev_odex30_accounting/odex30_account_followup/demo/account_followup_demo.xml create mode 100644 dev_odex30_accounting/odex30_account_followup/i18n/account_followup.pot create mode 100644 dev_odex30_accounting/odex30_account_followup/i18n/ar.po create mode 100644 dev_odex30_accounting/odex30_account_followup/models/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_followup/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_followup/models/__pycache__/account_followup.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_followup/models/__pycache__/account_followup_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_followup/models/__pycache__/account_move_line.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_followup/models/__pycache__/ir_actions_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_followup/models/__pycache__/res_partner.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_followup/models/account_followup.py create mode 100644 dev_odex30_accounting/odex30_account_followup/models/account_followup_report.py create mode 100644 dev_odex30_accounting/odex30_account_followup/models/account_move_line.py create mode 100644 dev_odex30_accounting/odex30_account_followup/models/ir_actions_report.py create mode 100644 dev_odex30_accounting/odex30_account_followup/models/res_partner.py create mode 100644 dev_odex30_accounting/odex30_account_followup/security/account_followup_security.xml create mode 100644 dev_odex30_accounting/odex30_account_followup/security/ir.model.access.csv create mode 100644 dev_odex30_accounting/odex30_account_followup/security/sms_security.xml create mode 100644 dev_odex30_accounting/odex30_account_followup/static/src/components/change_trust_widget/followup_trust_widget.js create mode 100644 dev_odex30_accounting/odex30_account_followup/static/src/components/change_trust_widget/followup_trust_widget.scss create mode 100644 dev_odex30_accounting/odex30_account_followup/static/src/components/change_trust_widget/followup_trust_widget.xml create mode 100644 dev_odex30_accounting/odex30_account_followup/static/src/components/download_close_wizard_action/download_close_wizard_action.js create mode 100644 dev_odex30_accounting/odex30_account_followup/tests/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_followup/tests/common.py create mode 100644 dev_odex30_accounting/odex30_account_followup/tests/test_account_followup.py create mode 100644 dev_odex30_accounting/odex30_account_followup/tests/test_followup_report.py create mode 100644 dev_odex30_accounting/odex30_account_followup/views/account_followup_line_views.xml create mode 100644 dev_odex30_accounting/odex30_account_followup/views/account_followup_views.xml create mode 100644 dev_odex30_accounting/odex30_account_followup/views/partner_view.xml create mode 100644 dev_odex30_accounting/odex30_account_followup/views/report_followup.xml create mode 100644 dev_odex30_accounting/odex30_account_followup/wizard/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_followup/wizard/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_followup/wizard/__pycache__/followup_manual_reminder.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_followup/wizard/__pycache__/followup_missing_information.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_followup/wizard/followup_manual_reminder.py create mode 100644 dev_odex30_accounting/odex30_account_followup/wizard/followup_manual_reminder_views.xml create mode 100644 dev_odex30_accounting/odex30_account_followup/wizard/followup_missing_information.py create mode 100644 dev_odex30_accounting/odex30_account_followup/wizard/followup_missing_information.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/__manifest__.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/controllers/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/controllers/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/controllers/__pycache__/portal.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/controllers/portal.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/data/config_parameter.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/data/ir_cron.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/data/mail_activity_type_data.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/data/neutralize.sql create mode 100644 dev_odex30_accounting/odex30_account_online_sync/data/sync_reminder_email_template.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/i18n/account_online_synchronization.pot create mode 100644 dev_odex30_accounting/odex30_account_online_sync/i18n/ar.po create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/account_bank_statement.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/account_journal.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/account_online.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/bank_rec_widget.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/company.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/mail_activity_type.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/odoofin_auth.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/partner.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/account_bank_statement.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/account_journal.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/account_online.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/bank_rec_widget.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/company.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/mail_activity_type.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/odoofin_auth.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/models/partner.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/security/account_online_sync_security.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/security/ir.model.access.csv create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transaction_form.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transaction_hook.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transaction_service.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transactions_x2many.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transactions_x2many.scss create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transactions_x2many.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.scss create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/fetch_missing_transactions_cog_menu.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/fetch_missing_transactions_cog_menu.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/find_duplicate_transactions_cog_menu.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/find_duplicate_transactions_cog_menu.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/connected_until_widget/connected_until_widget.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/connected_until_widget/connected_until_widget.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/online_account_radio/online_account_radio.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/online_account_radio/online_account_radio.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/views/account_online_authorization_kanban.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/components/views/account_online_authorization_kanban_controller.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/js/odoo_fin_connector.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/src/js/online_sync_portal.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/tests/helpers/model_definitions_setup.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/static/tests/online_account_radio_test.js create mode 100644 dev_odex30_accounting/odex30_account_online_sync/tests/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/tests/common.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/tests/test_account_missing_transactions_wizard.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/tests/test_account_online_account.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/tests/test_online_sync_branch_companies.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/tests/test_online_sync_creation_statement.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/views/account_bank_statement_view.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/views/account_journal_dashboard_view.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/views/account_journal_view.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/views/account_online_sync_portal_templates.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/views/account_online_sync_views.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/wizard/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/wizard/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/wizard/__pycache__/account_bank_selection_wizard.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/wizard/__pycache__/account_bank_statement_line.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/wizard/__pycache__/account_journal_duplicate_transactions.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/wizard/__pycache__/account_journal_missing_transactions.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_online_sync/wizard/account_bank_selection_wizard.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/wizard/account_bank_selection_wizard.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/wizard/account_bank_statement_line.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/wizard/account_bank_statement_line.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/wizard/account_journal_duplicate_transactions.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/wizard/account_journal_duplicate_transactions.xml create mode 100644 dev_odex30_accounting/odex30_account_online_sync/wizard/account_journal_missing_transactions.py create mode 100644 dev_odex30_accounting/odex30_account_online_sync/wizard/account_journal_missing_transactions.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_reports/__manifest__.py create mode 100644 dev_odex30_accounting/odex30_account_reports/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/controllers/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_reports/controllers/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/controllers/__pycache__/main.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/controllers/main.py create mode 100644 dev_odex30_accounting/odex30_account_reports/data/account_report_actions.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/aged_partner_balance.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/balance_sheet.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/bank_reconciliation_report.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/cash_flow_report.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/customer_reports_pdf_export_templates.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/customer_statement.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/deferred_reports.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/executive_summary.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/followup_report.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/general_ledger.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/generic_tax_report.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/journal_report.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/mail_activity_type_data.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/mail_templates.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/menuitems.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/multicurrency_revaluation_report.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/partner_ledger.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/pdf_export_templates.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/profit_and_loss.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/report_send_cron.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/sales_report.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/data/trial_balance.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/i18n/account_reports.pot create mode 100644 dev_odex30_accounting/odex30_account_reports/i18n/ar_001.po create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_aged_partner_balance.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_analytic_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_cash_flow_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_customer_statement.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_deferred_reports.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_fiscal_position.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_followup_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_general_ledger.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_generic_tax_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_journal_dashboard.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_journal_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_move.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_move_line.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_multicurrency_revaluation_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_partner_ledger.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_sales_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_tax.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_trial_balance_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/balance_sheet.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/bank_reconciliation_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/budget.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/chart_template.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/executive_summary_report.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/ir_actions.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/mail_activity.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/mail_activity_type.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/res_company.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/res_config_settings.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/__pycache__/res_partner.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_aged_partner_balance.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_analytic_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_cash_flow_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_customer_statement.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_deferred_reports.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_fiscal_position.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_followup_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_general_ledger.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_generic_tax_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_journal_dashboard.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_journal_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_move.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_move_line.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_multicurrency_revaluation_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_partner_ledger.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_sales_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_tax.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/account_trial_balance_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/balance_sheet.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/bank_reconciliation_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/budget.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/chart_template.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/executive_summary_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/ir_actions.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/mail_activity.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/mail_activity_type.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/res_company.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/res_config_settings.py create mode 100644 dev_odex30_accounting/odex30_account_reports/models/res_partner.py create mode 100644 dev_odex30_accounting/odex30_account_reports/security/ir.model.access.csv create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/account_report.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/account_report.scss create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/account_report.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/buttons_bar/buttons_bar.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/buttons_bar/buttons_bar.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/cog_menu/cog_menu.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/cog_menu/cog_menu.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/controller.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/ellipsis.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/ellipsis.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/popover/ellipsis_popover.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/popover/ellipsis_popover.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_account_type.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_aml_ir_filters.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_analytic.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_analytic_groupby.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_budgets.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_date.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_fiscal_position.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_horizontal_groups.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_journal.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_partner.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_rounding_unit.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_tax_unit.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_variant.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filters.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filters.scss create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filters.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/header/header.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/header/header.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line/line.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line/line.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line/popover/debug_popover.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line/popover/debug_popover.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line_cell/line_cell.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line_cell/line_cell.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line_cell/popover/carryover_popover.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line_cell/popover/carryover_popover.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line_cell/popover/edit_popover.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line_cell/popover/edit_popover.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line_cell_editable/line_cell_editable.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line_cell_editable/line_cell_editable.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line_name/line_name.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line_name/line_name.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line_name/popover/annotations_popover.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line_name/popover/annotations_popover.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line_name/popover_line/annotation_popover_line.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/line_name/popover_line/annotation_popover_line.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/search_bar/search_bar.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/search_bar/search_bar.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/warnings.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/aged_partner_balance/aged_partner_balance.scss create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/aged_partner_balance/filter_aging.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/aged_partner_balance/filter_extra_options.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/aged_partner_balance/filters.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/aged_partner_balance/filters.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/aged_partner_balance/line_name/line_name.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/customer_statement/customer_statement.scss create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/deferred_reports/filters.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/deferred_reports/groupby.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/deferred_reports/warnings.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/general_ledger/line_name.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/journal_dashboard_activity/journal_dashboard_activity.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/journal_dashboard_activity/journal_dashboard_activity.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/journal_report/filter_extra_options.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/journal_report/filters.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/journal_report/filters.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/journal_report/journal_report.scss create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/journal_report/line/line.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/journal_report/line/line.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/journal_report/line_name.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/journal_report/move_line_list/move_line_list.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/multicurrency_revaluation_report/filters/filter_exchange_rate.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/multicurrency_revaluation_report/filters/filters.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/multicurrency_revaluation_report/filters/filters.scss create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/multicurrency_revaluation_report/filters/filters.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/multicurrency_revaluation_report/line_name.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/multicurrency_revaluation_report/warnings.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/partner_ledger/filter_extra_options.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/partner_ledger/filters.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/partner_ledger/line_cell.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/partner_ledger/line_cell.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/partner_ledger/line_name.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/partner_ledger/partner_ledger.scss create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/redirectAction/redirectAction.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/redirectAction/redirectAction.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/sales_report/filters/filter_code.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/sales_report/filters/filters.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/sales_report/filters/filters.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/sales_report/warnings.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/tax_report/filters/filter_date.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/tax_report/filters/filters.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/tax_report/line_name.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/tax_report/tax_report.scss create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/components/tax_report/warnings.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/js/action_manager_account_report_dl.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/js/util.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/scss/account_financial_report.dark.scss create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/scss/account_pdf_export_template.scss create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/scss/pdf/pdf_journal_report.scss create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/widgets/account_report_x2many/account_report_x2many.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/widgets/account_report_x2many/account_report_x2many.scss create mode 100644 dev_odex30_accounting/odex30_account_reports/static/src/widgets/account_report_x2many/account_report_x2many.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/account_report/account_report.test.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/account_report/line_cell_editable/line_cell_editable.test.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/legacy/account_report_builder.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/legacy/action_manager_account_report_dl_tests.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/tours/account.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/tours/account_reports.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/tours/account_reports_amount_rounding.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/tours/account_reports_analytic_filters.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/tours/account_reports_annotations.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/tours/account_reports_hide_0_lines.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/tours/account_reports_search.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/tours/account_reports_sections.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/tours/account_reports_widgets.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/tours/asserts.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/tours/test_tour_bank_rec_ui.js create mode 100644 dev_odex30_accounting/odex30_account_reports/static/tests/util.test.js create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/account_sales_report_common.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/common.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_account_reports_annotations_export.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_account_reports_filters.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_account_reports_journal_filter.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_account_reports_tax_reminder.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_account_reports_tours.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_account_sales_report_generic.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_aged_payable_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_aged_receivable_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_all_reports_generation.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_analytic_reports.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_balance_sheet_balanced.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_balance_sheet_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_budget.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_cash_flow_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_currency_table.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_deferred_reports.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_financial_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_followup_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_general_ledger_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_journal_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_multicurrencies_revaluation_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_partner_ledger_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_reconciliation_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_report_engines.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_report_sections.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_tax_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_tax_report_carryover.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_tax_report_default_part.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_tour_account_reports.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_tour_analytic_filters.py create mode 100644 dev_odex30_accounting/odex30_account_reports/tests/test_trial_balance_report.py create mode 100644 dev_odex30_accounting/odex30_account_reports/views/account_account_views.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/views/account_activity.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/views/account_journal_dashboard_view.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/views/account_move_views.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/views/account_report_view.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/views/account_tax_views.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/views/mail_activity_views.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/views/report_template.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/views/res_company_views.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/views/res_config_settings_views.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/views/res_partner_views.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/__init__.py create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/__pycache__/account_change_lock_date.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/__pycache__/account_report_file_download_error_wizard.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/__pycache__/account_report_send.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/__pycache__/fiscal_year.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/__pycache__/multicurrency_revaluation.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/__pycache__/report_export_wizard.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/account_change_lock_date.py create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/account_report_file_download_error_wizard.py create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/account_report_file_download_error_wizard.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/account_report_send.py create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/account_report_send.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/fiscal_year.py create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/fiscal_year.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/mail_activity_schedule_views.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/multicurrency_revaluation.py create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/multicurrency_revaluation.xml create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/report_export_wizard.py create mode 100644 dev_odex30_accounting/odex30_account_reports/wizard/report_export_wizard.xml create mode 100644 dev_odex30_accounting/odex30_analytic/__init__.py create mode 100644 dev_odex30_accounting/odex30_analytic/__manifest__.py create mode 100644 dev_odex30_accounting/odex30_analytic/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_analytic/i18n/analytic_enterprise.pot create mode 100644 dev_odex30_accounting/odex30_analytic/i18n/ar.po create mode 100644 dev_odex30_accounting/odex30_analytic/models/__init__.py create mode 100644 dev_odex30_accounting/odex30_analytic/models/__pycache__/__init__.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_analytic/models/__pycache__/models.cpython-311.pyc create mode 100644 dev_odex30_accounting/odex30_analytic/models/models.py create mode 100644 dev_odex30_accounting/odex30_analytic/static/src/analytic_line_grid/analytic_line_grid_model.js create mode 100644 dev_odex30_accounting/odex30_analytic/static/src/analytic_line_grid/analytic_line_grid_view.js create mode 100644 dev_odex30_accounting/odex30_analytic/static/tests/analytic_line_grid_view_tests.js create mode 100644 dev_odex30_accounting/odex30_analytic/views/account_analytic_view.xml diff --git a/dev_odex30_accounting/account_chart_of_accounts/CHANGELOG.md b/dev_odex30_accounting/account_chart_of_accounts/CHANGELOG.md new file mode 100644 index 0000000..58a83a0 --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/CHANGELOG.md @@ -0,0 +1,33 @@ +# Changelog + +## [18.0.1.0.0] - 2026-01-02 + +### Migration from Odoo 14 +- Replaced `internal_type` with `is_view_account` boolean field +- Replaced `user_type_id` with native `account_type` selection +- Updated all domain filters for compatibility +- Migrated report from old AbstractModel structure to new account.report framework + +### Added +- Full Odoo 18 `account.report` integration +- Support for comparison periods in reports +- Journal filtering in reports +- Hierarchical account display in reports +- Automatic account code generation based on parent +- Level-based account hierarchy + +### Changed +- Report now inherits from `account.report` instead of standalone AbstractModel +- View XML updated to Odoo 18 syntax (removed `attrs`, using `invisible`) +- Dependencies updated (now requires `account_reports`) + +### Fixed +- Domain filters compatibility with Odoo 18 +- Account creation with parent relationships +- Journal account creation with proper account types + +### Technical +- Added `_parent_store` functionality for efficient hierarchy queries +- Implemented `format_value()` method for currency display +- Added balance calculation methods for reports +- Full support for multi-company environments diff --git a/dev_odex30_accounting/account_chart_of_accounts/README.md b/dev_odex30_accounting/account_chart_of_accounts/README.md new file mode 100644 index 0000000..976277e --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/README.md @@ -0,0 +1,105 @@ +# Chart of Accounts Hierarchy - Odoo 18 + +## Description +This module provides hierarchical chart of accounts with parent-child relationships for Odoo 18, +including a complete Chart of Accounts report compatible with the new Odoo 18 reporting framework. + +## Features +- ✅ Hierarchical chart of accounts with parent-child relationships +- ✅ Automatic account code generation +- ✅ View accounts support (parent accounts only) +- ✅ Fixed tree length support +- ✅ Customizable account code padding +- ✅ Integration with journal creation +- ✅ **Chart of Accounts Report** with Odoo 18 compatibility + +## Migration from Odoo 14 +This module has been fully migrated from Odoo 14 with the following major changes: + +### Account Models: +- ❌ Removed `internal_type` field +- ✅ Added `is_view_account` boolean field +- ❌ Removed `user_type_id` (Many2one) +- ✅ Now using `account_type` (Selection field) +- ✅ Updated all domain filters + +### Report Framework: +- ❌ Old: `AbstractModel` with `_name = 'account.coa.report'` +- ✅ New: `AbstractModel` inheriting from `account.report` +- ❌ Old: Simple `_get_lines()` method +- ✅ New: Advanced reporting with options, filters, and hierarchies +- ✅ Compatible with Odoo 18 `account_reports` module + +## Installation +1. Make sure `account_reports` module is installed (Odoo Enterprise) +2. Copy this module to your Odoo addons directory +3. Update the apps list: `Settings → Apps → Update Apps List` +4. Install from Apps menu: Search "Chart of Accounts Hierarchy" + +## Configuration +Navigate to: **Accounting → Configuration → Settings → Chart of Accounts Hierarchy Settings** + +Available options: +- **Automatically Generate Account Codes**: Enable auto-generation based on parent +- **Use Fixed Length**: Enforce a specific tree depth +- **Account Code Padding**: Number of digits for padding +- **Bank/Cash Prefixes**: Define account code prefixes + +## Usage + +### Creating Hierarchical Accounts +1. Go to: **Accounting → Configuration → Chart of Accounts** +2. Create a parent account: + - Check "Is View Account" + - Set the account code (e.g., `1000`) +3. Create child accounts: + - Select the parent account in "Parent Account" field + - Code will be generated automatically (e.g., `10001`, `10002`) + +### Viewing Reports +1. Go to: **Accounting → Reporting → Chart of Accounts** +2. Use filters to customize the view: + - Date range + - Journals + - Comparison periods + - Hierarchy view + +## Technical Details + +### New Fields in account.account: +- `parent_id`: Many2one to parent account +- `is_view_account`: Boolean for view accounts +- `level`: Integer showing hierarchy depth +- `auto_code`: Computed account code +- `child_ids`: One2many to child accounts +- `parent_path`: Hierarchical path (using `_parent_store`) + +### Dependencies: +- `account` (Odoo Community) +- `account_reports` (Odoo Enterprise - required for reports) + +## Troubleshooting + +### Issue: Report not showing +**Solution**: Make sure `account_reports` module is installed + +### Issue: Account codes not generating +**Solution**: Enable "Automatically Generate Account Codes" in settings + +### Issue: Cannot create view accounts +**Solution**: Check "Is View Account" when creating parent accounts + +## Support +For issues or questions, please contact your Odoo partner or open an issue on GitHub. + +## Author +Your Company + +## License +LGPL-3 + +## Version History +- **18.0.1.0.0**: Initial migration from Odoo 14 to Odoo 18 + - Complete rewrite of account models + - New reporting framework implementation + - Full compatibility with Odoo 18 accounting diff --git a/dev_odex30_accounting/account_chart_of_accounts/__init__.py b/dev_odex30_accounting/account_chart_of_accounts/__init__.py new file mode 100644 index 0000000..7db6694 --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from . import models +from . import report diff --git a/dev_odex30_accounting/account_chart_of_accounts/__manifest__.py b/dev_odex30_accounting/account_chart_of_accounts/__manifest__.py new file mode 100644 index 0000000..2d53a00 --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/__manifest__.py @@ -0,0 +1,55 @@ +{ + 'name': 'Chart of Accounts Hierarchy - Odoo 18', + 'version': '18.0.1.0.0', + 'category': 'Accounting', + 'summary': 'Hierarchical Chart of Accounts with Parent-Child Relationships', + 'description': """ + Chart of Accounts Hierarchy for Odoo 18 + ======================================== + + Features: + --------- + * Hierarchical chart of accounts with parent-child relationships + * Automatic account code generation + * View accounts support (parent accounts only) + * Fixed tree length support + * Customizable account code padding + * Integration with journal creation + * Chart of Accounts report with hierarchy support + + Migration from Odoo 14: + ---------------------- + * Replaced internal_type with account_type + * Replaced user_type_id with account_type field + * Added is_view_account boolean field + * Updated all domain filters + * Migrated account.report from AbstractModel to standard Model structure + * Compatible with Odoo 18 accounting framework + """, + 'author': 'Your Company', + 'website': 'https://www.yourcompany.com', + 'depends': ['account', 'odex30_account_reports'], + 'data': [ + 'security/account_security.xml', + 'security/ir.model.access.csv', + 'views/account_account_view.xml', + 'views/res_config_settings_views.xml', + 'data/account_report_data.xml', + ], + 'assets': { + 'web.assets_backend': [ + 'account_chart_of_accounts/static/src/js/account_type_selection_extend.js', + 'account_chart_of_accounts/static/src/js/filters_patch.js', + 'account_chart_of_accounts/static/src/js/account_report.js', + 'account_chart_of_accounts/static/src/xml/filter_full_hierarchy.xml', + ], + 'web.assets_frontend': [ + 'account_chart_of_accounts/static/src/scss/account_hierarchy.scss', + ], + }, + + 'installable': True, + 'application': False, + 'auto_install': False, + 'license': 'LGPL-3', +} diff --git a/dev_odex30_accounting/account_chart_of_accounts/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/account_chart_of_accounts/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6cd4f416c2c85397c69f2156303baf13bb1ff361 GIT binary patch literal 335 zcmZ3^%ge<81X>5eGM#|*V-N=hn4pZ$azMs(h7^Vr#vF!R#wbQc5St0eW{P40vYCS! zG+ACU0u^a8-eSwmPf5)w2C<4#3-XIf{4|+wF%&TaWs6vV#7c(GK$78ChkizWZmND_ zPIg9ORZ&)^en4e%Mq*KJKv8~HYH~@jKG2v7V*? + + + + + + \ No newline at end of file diff --git a/dev_odex30_accounting/account_chart_of_accounts/models/__init__.py b/dev_odex30_accounting/account_chart_of_accounts/models/__init__.py new file mode 100644 index 0000000..994789e --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +from . import account_account +from . import account_journal +from . import res_config_settings diff --git a/dev_odex30_accounting/account_chart_of_accounts/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/account_chart_of_accounts/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a97c9e994a586a39899a27dc8eb94eea08e9a51 GIT binary patch literal 418 zcmZ3^%ge<81X>5eGRuJUV-N=hn4pZ$T0q8hh7^Vr#vF!R#wbQc5St0eW{P40vzdWx z<|t+$naBT9lWV0~8W2N-d60&d*EBOph;4 zEh)*&OE31*WVyvq#0)g1hy_Hj0*RFjpMfO9uYUcE{M=Oi#GLGm#HymKO#Oh$C|tkmR^V*UJ-)Cyw*AeEo5YiOYdVSz=B3}8+HTB4tlS{4sci!2IrGsw)6_>9cd zqQs))j7p%&{Cq_{_Y_lK6PNg34bUHbBABoK(9aP*{TeUhD`YJ}@&f aGCp9Cy?}~tpmKq-Hy9KzU_(V5KvMw4>v`A! literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/account_chart_of_accounts/models/__pycache__/account_account.cpython-311.pyc b/dev_odex30_accounting/account_chart_of_accounts/models/__pycache__/account_account.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9787f8426bebcbde819e71d7ed3400c4e0d26741 GIT binary patch literal 9611 zcmb6tV~196L&E$+BfxN)#pbMv24Fnvq0>B9$3R zwh3x06z-M{)Gkvfjga*sY~eW0+KUKiK3pJM_#+?w=*LhP)U$&%AhZZj|Iu(hf_(Ly zJHz3_(zZJu9nQV?oO562b?Jx2B8`Frs38O2Zx9j2D( z8G1=Kqg&F?=$8yL1{&*iVdIi%#zemL;j$(3jG3l%)H#YV+@u&It6Q|>nBLJ-)IIo9 zo*64+nx_0^PqFAX$fmgv8)kUfv=n97FfZ$a%ORN#_-WblHqUZrIWEdU!OC7==2)H& zMI*B+C-PIK7M|bHQPkhUm|1FuW~dn*L(k|L-Hd_J&lq(SYg)`VkI~!ez#MGa-BdC0I)uRAOrN#2pB6i#>Rc>Lc&gU1y^FxrC4ZI z9U?yrE5O4FmvL-37-N~DJu^TLWY2ow1NSTqzb`%vC~$}_7F*a!{iIwGio{qh5)23C zx#-HWtdGvkL1)HmTqwrkzH;m=uk0&__JFGbuKruj2m_7mf`-d|Nm= zp6R$Kc3fPiI2V#vyg}sBr%o~6{BCE5x=(@Fjb*muu&?741h|$R{wsdHY=aeog$M^C z!6lYMTOym7=u$8g!O@0bA+N_Ph8IF%CdZYRErEG97MKMxneKV|8qoNSip;LSoYB(A zMm`qhSdiXOoaNfE#!867>?#|UjTiC9ujl;G!o7rm^lTtJZG}VLdsjAr91$a3es>Cdzo1G?qe%)lzfYBe} z&OFDxD^`7m{*ZVp5EtDfk!U~7bpsl#yB=2H1=;9VcUArAf(=+&h6T^5Fxg?yxae#! z%nxa**9$E93IOZWcB^>w%)_~zqd9>A?K97X!mw$ebw++=ndLYPKji8?nfnc#6I<;l zKDlmrxgr`{V7YwR5(vzOgFGJy@VKx(pKo0e@#9d6AN+q!12Fk_0sOR1WldCF(--#7 z?LzxScr&#VV(moIzFXInwrA>&BrBxyx-3OoF3?YGm7jK{yE3+3(boIec5cUZE@K-L zZDT_2&FT?P!6qtGv|AWw5T*YWd??~ILR~opqC@9Rc5dG|GXwPj&46!I$Fw*FM9Ks# z)F(lgh*W{N<#1jUsf||{9h#DOW#iG82V1x;?KHLBwYBUj?NxzXu4%ZCq zxIP4A7i+X#EH*}SZXz+xOe4Vr~OSJp(}5tD1%^Ww4xw zMMjt$l^oTg<3M_D$8lJ29F{t}QYO*aCOF%Ea8`dBNzY}RM?~k5$Ii1m&a)ZkInjAe zAaB-^=R&q>63kIJ^db9{fxc!7)|bNAk?b1;xyruj)^+o!==+#$Q1W8q0GN4Kyr@Ny zdn-RvV(|I4zlge|Z{C#9G5UErZb#D;(_-6FiAWbn7tB|E5_CeB&?gKDV{vQZ zE&M|CS^$MbE)Oj&N5QRwy0c&FiMaf%Yk5U6JSMp*z_H8W;4B-^HW$S!ptu4K?FU+T z@M+g$vL4Jo5i{9F+(v+BF;eiCDPmV$;&*REtJC(<_M>CZt#mbXO z)2_p{ab0vYKX$b4I9k)=8Ap%k=t0dNc;No7Ry;BG_{7A{iHS!`nG^4cC*C71lC4Up zIWBnmGq(QZ=noF}-(B0drg9j$+rHiT;OxWW8ONCD7!%B6iUHAt1%`z}Nd)m@5U<{ zyMF=hzbDX$T35PYX{4{Df0ceG-IczPzWU=$Uy-2uq`QAy_XU;cm3Y#pxRD(069$+? z$g%--<0-Zg{UO@)6gQYVgWxn08D(pT4@LM`Fft2)P&mYc^v70~!>p_ivk}=8TwZ1) zjOtT4qAu15_*F&aWD95;6T+A_=S6*r7aa!f@x!HB^5@id0x0HI7EWK5+}_9TwjFm{`j^``9#(#vcz6k&wR=KzPYC3ds=Zqu zZN4Y84GGowK0NVg>ibi|^yQu5%ffJ;fzUpZai104X9e=^YK%h}caP}q5y-pitbgom z*>Sd{{Tb(B(Ro-PujHr`%yloic1<(?6P5u3G0;kOjb>_(v10BKD zGg*m-wr1Erj@-K>JA8?SqPWI9frt=Zirg0f6<9!=5iXSAZIsk1ce8F~_li-6j#c zHGhzj?JGPx8e*@r%v&7G%5LSnnA07QZJ_7SY;m~ixnM&N!3OsZRH%`LD$R$XCSF%6 z&3L{b9b=}8|1|&*T~`eVro~G@a#(U#C(lZbs*SZQWwc+VrP_vDcCq%*-C(A+J7tty zp3NcA)t#mEl~?KQ;cq9!zROBMs%hNfZ~aniKC@GEMyNUS#M|+tu}Sa-GL0XIjUPPI z)6G}uA1Q?373!|iyR}Wp;f=B6Shh0PKasF_g_Z|^3;@Fx1(RA(@&QPOB5^7DioZCR z%u5*WE|e6`URZ*?)?{s?wJ<~|4Mm8AYJmdxUl5q!9*`%WVp}xl>elqoj}~$;I@NMR zKtftHPI>8GrWwPUA%+K1^+_0tr4zgo87=219BC<*!UqDh0u9J0BRH8nJ^U2 zfUy?iq%kOZ;YsLWW+eflVml&Lh1?P*#)|dDJYoM(v$fq$(Hjkgk^sEROWF?+-M6W_ zkLS!$nNoC@enr-W7~+$PL=%^loJv>W1H+UAb)~;pFu$=tx6rCQ>4M-TS63RJesiGk z{8LC>JjG9R8w1nS*Ju~eDa&Oco(auEXs8Dt3$9kz)g#k9kLJ{;*odF4r_g(%1sZzM z@#Rtxg(u$}_Fn-L{uF?9N;r5`dAFw?2EU)f@2NM%smqV20y|TI%v4aE3PRi!Rzfk(t-Bdo#KI`;(_xi2k;PG zt?AVr*Ac;WL~1{jdVSa1a%)NS_6Xko?K7$JC*GFyp^Udn^mc8x?0Am}-t!Q$jAsVV zi-YF{@8l!E*==b4;^gNirD|WgHO=2%6FUY3_n=f=x7C++-S!CX&a6@2S@n$4H@bdA zkTPejRNG5}vqf^jIaXi!szl`GK_`eq=HONF;MLTGRC5sgLiMXp4tHG5~ z({NmDIG!5W^&P~u`NY19%anH99af6j(=@DU78mx#;|A(6n$PEd0&OAr3NSsY@vYZU zg-4D%fOZf5lqc_Y67(D$q7u5>^gqzk@SE1cm>e$t!YzfqIEMl5VLx2MJXL~g05h+d zv?9JnxW6&MEf4g1PwRQj7^1)c>$zX;M_1}h(4a#=7g;kW%!?$n!d^JGu#|TuYnFs* z?|CLHjJbF$j0KH!!j!O}87bnY^|NM8Sh?B;xepMaFCGR}E}K5Q7Ubr64&5?$4S-x342MbnCZAn(kg)}>-T;%2mr$|| zan$IWm&?>IWxdRJ_{3B^mq2zVmBdIUB18UG4knHU~sk-}a2)x&ZIPe&tuNU4Sf3L(3O0 zeg2Zr*8jkmsUH&ShmsDd*87F^b8Gt5?K7F$0kL)T zv=XwPz}Zx}lP1Xn2uP0ZdKx!F(wXz$9};};r~7Z86nsPQZhO9MP`(gOzavh+ zFZI1F_KgTluWwy~D>bpHM`-GK)RrwXR98UywYnmCHfy7taM-8qXKAVR=;PM@o!0*C z)o*V+Y{|5ah^-?jV=9z!`gUzqzn=JbVyi7<^NBW}K;EpGYU-3cjo>4ztl-A(P7_5|QoX$3Sj06D_IM=QZFN#g|oClrC(0*Lo) zssJmpZ_ky;#Sw?@LN-spo$AqOgjFIg%XIFRk0`lZb|xAPv%v@#!a0iFkE12 zfzWa=wji5dkFZCV@P^hhi+5RYAINhU-^yiUU`Rk?$@@yszM1#wsJZ zBjZM~Vi*A)TR9AnIMfc=u3mY}vY?Cbzatct0wthcQ*;RP@gymawwh0YB?9%x{gWKN z_4AU;yM9q}*RD@UmA;f`vpL)PXX2 z+EbUr>NbsyP=68M$_ZfQK~^4QK!sf%!Oq&j=x?OTKOOQ`3GgJZ!fFBX8kAb|o zys7rhL+KHr%Acw7i&g&h@m*&#Av4!)ofJ9;pXqf-000QgRAnPHmP^it^t4n_wN;hw zgPxHs0O*-uSt)x%a&!YG(U>0Du7QczaUynPV>hjzg`t@$*Qam3oAPXVGsaHQ*qPOt zjCj{m3ZLmIlRw|?%n<^aPc-_F3~w(=A(FM^+kwn-^PQ~DO8VFvB8fvos$f3eY!Z!4S)IiQxeWkF=GAIE8s65N(B7Xh4v5BqtggifQ6T_C9@J_^X?0j#Mo*S1 z0@`4TYV%0SF$d*z(qAqc@Y0`XA%`&mQ4EsKksa95#a^Ffmq~JxWO^XckF`;Ll|vUV z8zH;E>|e-=6nI@!xKo-(jhIW>U<9gr%yX;hz3D8Dr zwK5WOV@8=t)QS`orIXC0rRhTseataxjnuDDNmwOCvNWgM93`im=6_`yTp`X(YYy}L z{MPUN`&;U1Wo0=9spI8k?qL;0{fl(+sU+8UHwBG*6icymgo@GuI%)_QqQ-zRY6_TW zGH!^JM9l#+O&O>$iZ$M$SQ9eNmF5XOF;diX_-9kV!j@d1{N^{L>o=*!V4PFUGaQPr zqH2!DSQHUen(@X~mEy^<@>jiRKw z?KbPwOAb`%Wr%zI=y!Bc&8zju&)B_2kAzsPCb7smlJo*C3?->`>$Y6mt)wAo)JGbu zbZAiw^>*xvo}xOs^qloQ(9JB)7qxdmJQv7hOoF}j$J~k)G=L*@XG$8A)+GHAx-wZ& zurDjw+RyGw+fJ&mi$99b0(vxCuF)$M|5;SCPtw%IMxEYLMJfH)He%~pci~A=Xalz4 zfmzQ_r%%Oiw~tPjMm_ESt1ebe7X$0boe++sMYMrk?0GNiG_Tx&F4NGCPok>`n%$-C zDI4q*dV7bkyBFYYVs~i>xTnZn!tw+xCTnLAkA$Fvyg)0#Cq%@0b58}0NVj(?f`TFf z9+8Mw3L~%YLO3Q!gndkXgv3n(IU@xR6ndglS<{MwldQH0XePn4jEHU} z5FbLsIbslKS>g#H6b8xtPSrSzB-M!c1=W00h}{;ETAFjYY5;GUMHB?AYK$O0D^q>m zTI4Ck5M7x#Fya=~dgAjfj}*)Z`nL!Yd01{{27zTmh~aop4Q(v~^*V|{(PA9& zVjpw)SA3%`M}Z4yJM6nBa#ctt4kmL+7kv_^#mjH;o!0` z$MsAtLC6TvDIqq8LXy}6&RXp6g(?>7>Kp9NwzSdxy?GNrp!cw7fyrVEN4JCmni3P{ zV4s20mjD@y^$qr9zXy8qsGP04<4bA{Lv|YzZJCF=RHZun~ooR!dX6S{?*eO{-UBOGDbd>p?x< z+po9>Hr+=z+(&>5Th*nL!X&noWO)v8q2QS3PJm+H0aimP3A z_!WmAJNz#ltLAh?9d7Kz6`gWLXR6izbo$XW?mi*6jwr1o*t$2>?0Y)+Xb|rkm7B+u z<}utHe>L#y;4g#tVoaWlE0b|-^``c;KCORLk2{9sJ;#+j$FX&Hs;T+m;`fWV{jl70 zL}@yLt)8^4@&3Ywtrgo^Q=R*j&Pm*P{*{33?U2*CfyArZ%DEWsOkgoVhF$Kv(|C7} z;_BUW9oldm`nm08Gah5`;Tw1`h`BlJIwZU171#XgXsX%`cCO^;*R@SQ(0K2->^-G; zPvJ8NpPrSyvvO@%sSRU$INjLvaPa%V^-;O8QvuZ*C!R_FSp54U9y}%YOej4Qt0&iL z|9CoWbKSp)ZF?YtGMh~!8%-lGPvft?mYV`fQ((=scKJ`%R9)l!(Yr}t>`2hB8=8L@ z#%+S!A}TGS+#o3p60VWb)&2}+0>M(g&c}vn5Ghvrsws)kfeHqG8S)1xV^kNVnJEQcU-R!@#(SPZ+XBXZ*AbSod zo&zb5_rW-BJ*apNZF;6QJW~)&IB)~sT$VlGD4uV?$*Gq9)L#GNj?^CCV|S*q^!Kzg zLy__=RXR}pUMs4on%azwa=5UoN4EE7oYaBCFUIlES!Lkd=D_8Rfy@6R(`k({83q+PcA3!)KsA18>8KBeQT(!mf!n{4-` zD?IBbaYZ}iR9nZhgO4Nl-~?`i@W76}vb7m&Ib)=(et^7#BY-;VFI6oJL#}>?QOg+y z4x2=Tw5<$tD-n$3W-M@Dgpt5W0{MMCR?*|aButREoA?JPGDe!F)07YYr<|f% cu|8)^U(z&Ds(7__`R>)X+4=XMfoWp?8#ZjWga7~l literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/account_chart_of_accounts/models/__pycache__/res_config_settings.cpython-311.pyc b/dev_odex30_accounting/account_chart_of_accounts/models/__pycache__/res_config_settings.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5880bb4cee68a5f2a4703d722b65f5a95a8001ee GIT binary patch literal 3567 zcma)8&2JmW72hwC%TGlTCCedeF=}mzl1)-F+PZC$#!;%ou1pJcY#=;zyW$MRRmfdt zcPX2!TpNWCZc(5?VL(D4v^oS13L8cLl%+wy#GnNP^wdj1L+Qnr_RTJrpHkD|^3BYf z-^{#u^FHRQa5%s~dHnj0@;8xT{y{r#@pKx;+tAo!5QEqfQ)Y8)nagoyKF61ZoWL?1 z^C5${M-1XIx9!ehp7IRy4E|2Zd2N&cC=Z}~E`JCmBJV9G>H8-gP71_ZP;dzu#9P)7 zE*XTED+*zyygQrL?iR-cI(rOeax7wU9Aa}k$6%o+5aOQmPgxKO{!XDn4IqROgwIBR zVw{3JBMAQx!aITp*oa_v4d0LyAspV0bVtQU%v0z*a~Vu-4EaGR0TTEbHdeKAMOJI| zppK1HzSEgmEy}u?&V;Is&9Rb-t@>IF29w^tO(F z4ct9um!W3ml3ZkOz5p*&eUJZ*li|FO4u!Y4Eq0ejkpmGdYOMalRk%&K_RU(tEaJp`_uk!Wolk65O;b~;ZBc}Q&1xmF zDeEb6rgO!T&6Dz)EEy)4L_OBC0aMXb$;A~kylSG_} zl05*Td1wPd7Xr6Y)TE#ASluDMj_^b$pHT1?ki%A$|%5E*11RJ-4qTm;NU7 z4C)dID6hXr7qv1@%cW0?a$Vn6(i^or1e5ZHu5E+5jWnF_-sKEbns#aVO3G>3+?9;0 zGY~V4@Q&nQ`?>CY(lt$~s6fyF<<G$KuKG-XKl%YYSHYWswVz+-Pa!c1NKdvwa0 zPBx;8&FEt5EPS)Asc*H;%^ei~RQjT1Eq&BDcdbdk_12klhhA%X-kMryO~>2g{x90)>!=E zM@O;b{`U^vwU&Qs#nv0K^=53{5@uTQ#r?H|thI8(if0?~Y%`vu1Ux6-Hr5I1w^#J1q6|TOCKQPlETuONR1XA2#Z9_>J5D^iABE-y6t)4h_TE}qfGku5w(;b+5q7~PJ?}O1MHXz0-_v+v7 zTgWzM*KzU?1*M7&O7c2=^XOM7`2mo6a1~7cq$LJip>K(7GNLcg=}Af!DOsX~`mTPF zl1r4NC`nV2p=22d5mq7Sl9|(lBQvM%sehNQ(eu3T(=H`+KjSYz`aSPEJfE&asWxNSx6G@^H!(K|gC9Gx(`xW9Ao%fDW- zuBle-SJv!<#_WUU>;p@Pw@x2|QTUvr&;w*44GT2)IQpZJ#11-kz9gO-aCId+#*oOz zx~v)sger$=>tIkXuf?~W5c{tF9xOy(u*M#cHqWx`5i@Un)7KWxvk*Z>$>-Bg;;$(G e>)zl7E3)r#ZRTXU?`_UpdSwrOeG0_Z!hZo98P-Jr literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/account_chart_of_accounts/models/account_account.py b/dev_odex30_accounting/account_chart_of_accounts/models/account_account.py new file mode 100644 index 0000000..0b1a7ed --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/models/account_account.py @@ -0,0 +1,187 @@ +from odoo import fields, models, api, _ +from odoo.exceptions import UserError +from odoo.osv import expression + + +class AccountAccount(models.Model): + _inherit = "account.account" + _parent_name = "parent_id" + _parent_store = True + company_id = fields.Many2one('res.company', string='Company', required=True, readonly=True, + default=lambda self: self.env.company) + account_type = fields.Selection( + selection_add=[('view', 'View')], + ondelete={'view': 'cascade'} + ) + automticAccountsCodes = fields.Boolean( + related='company_id.automticAccountsCodes', + ) + internal_group = fields.Selection( + selection_add=[('view', 'View')], + ondelete={'view': lambda recs: recs.write({'internal_group': 'off'})} + ) + + parent_id = fields.Many2one( + comodel_name='account.account', + string='Parent Account', + domain="[('account_type', '=', 'view')]" + ) + + parent_path = fields.Char(index=True) + + child_ids = fields.One2many( + 'account.account', 'parent_id', 'Child Accounts' + ) + + auto_code = fields.Char( + compute='_get_code', default='0', + store=True, size=64, index=True + ) + + level = fields.Integer( + compute="_get_level", store=True, string='Level' + ) + + + @api.depends('code', 'account_type') + def _compute_account_type(self): + + view_accounts = self.filtered(lambda acc: acc.account_type == 'view') + + other_accounts = self - view_accounts + if other_accounts: + super(AccountAccount, other_accounts)._compute_account_type() + + @api.depends('account_type') + def _compute_internal_group(self): + """Override to handle view type""" + for record in self: + if record.account_type == 'view': + record.internal_group = 'view' + else: + super(AccountAccount, record)._compute_internal_group() + + @api.model + def _name_search(self, name, domain=None, operator='ilike', limit=100, order=None): + if domain is None: + domain = [] + + # استبدال internal_type بـ account_type في Odoo 18 + domain = self._replace_internal_type_domain(domain) + + if not self.env.context.get('show_view') and not self.env.context.get('import_file'): + domain += [('account_type', '!=', 'view')] + + return super()._name_search(name, domain, operator, limit, order) + + def _replace_internal_type_domain(self, domain): + """استبدال internal_type بـ account_type""" + new_domain = [] + for condition in domain: + if isinstance(condition, (list, tuple)) and len(condition) >= 3: + if condition[0] in ('internal_type', 'type') and condition[2] == 'view': + new_domain.append(('account_type', condition[1], 'view')) + elif condition[0] in ('internal_type', 'type') and condition[1] == '!=': + new_domain.append(('account_type', '!=', 'view')) + else: + new_domain.append(condition) + else: + new_domain.append(condition) + return new_domain + + @api.depends('parent_id') + def _get_level(self): + for rec in self: + level = 0 + if rec.parent_id: + level = rec.parent_id.level + 1 + if rec.company_id.useFiexedTree and rec.company_id.chart_account_length: + if level > rec.company_id.chart_account_length: + raise UserError( + _('This account level is greater than the chart of account length.')) + rec.level = level + + @api.depends('parent_id', 'code', 'parent_id.code') + def _get_code(self): + for rec in self: + if not rec.company_id.automticAccountsCodes and rec.code: + rec.auto_code = rec.code + continue + + code = str(0) + if rec.parent_id: + default_padding = self.env.company.chart_account_padding + if rec.account_type == 'view': + default_padding = False + + parent_code = rec.parent_id.code or '' + parent_code = int(parent_code) != 0 and str(parent_code) or '' + + siblings = self.search([ + ('parent_id', '=', rec.parent_id.id), + ('id', '!=', rec.id) + ]) + + max_siblings_code = False + if siblings: + sibling_codes = [int(s.code) for s in siblings if s.code and s.code.isdigit()] + if sibling_codes: + max_siblings_code = max(sibling_codes) + + if not max_siblings_code: + code = parent_code + str(1).zfill(default_padding or 0) + else: + code = str(max_siblings_code + 1) + + rec.auto_code = code + else: + rec.auto_code = rec.code or '0' + + @api.model + def search_panel_select_range(self, field_name, **kwargs): + + if field_name != 'parent_id': + return super().search_panel_select_range(field_name, **kwargs) + + + enable_counters = kwargs.get('enable_counters', False) + search_domain = kwargs.get('search_domain', []) + + + all_view_accounts = self.search([('account_type', '=', 'view')], order='code') + + count_by_parent = {} + if enable_counters: + all_accounts = self.search(search_domain) + + for account in all_accounts: + if account.parent_id: + parent_id = account.parent_id.id + count_by_parent[parent_id] = count_by_parent.get(parent_id, 0) + 1 + + ancestor = account.parent_id.parent_id + while ancestor: + count_by_parent[ancestor.id] = count_by_parent.get(ancestor.id, 0) + 1 + ancestor = ancestor.parent_id + + + values = [] + for parent in all_view_accounts: + value = { + 'id': parent.id, + 'display_name': f"{parent.code} {parent.name}" if parent.code else parent.name, + 'parent_id': parent.parent_id.id if parent.parent_id else False, + } + + if enable_counters: + value['__count'] = count_by_parent.get(parent.id, 0) + + values.append(value) + + + result = { + 'parent_field': 'parent_id', + 'values': values, + } + + return result diff --git a/dev_odex30_accounting/account_chart_of_accounts/models/account_journal.py b/dev_odex30_accounting/account_chart_of_accounts/models/account_journal.py new file mode 100644 index 0000000..ffc99bc --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/models/account_journal.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +from odoo import api, fields, models, _ +from odoo.exceptions import UserError + +class AccountJournal(models.Model): + _inherit = "account.journal" + + @api.model + def _fill_missing_values(self, vals): + journal_type = vals.get('type') + if not journal_type: + return + + company = self.env['res.company'].browse(vals['company_id']) if vals.get('company_id') else self.env.company + vals['company_id'] = company.id + + random_account = self.env['account.account'].search([('company_id', '=', company.id)], limit=1) + digits = len(random_account.code) if random_account else 6 + + if journal_type in ('bank', 'cash'): + has_liquidity_accounts = vals.get('default_account_id') + has_payment_accounts = vals.get('payment_debit_account_id') or vals.get('payment_credit_account_id') + has_profit_account = vals.get('profit_account_id') + has_loss_account = vals.get('loss_account_id') + + if journal_type == 'bank': + liquidity_account_prefix = company.bank_account_code_prefix or '' + else: + liquidity_account_prefix = company.cash_account_code_prefix or company.bank_account_code_prefix or '' + + parent = self.env['account.account'].search([('code', '=', liquidity_account_prefix)], limit=1) + if not parent: + raise UserError(_("Can not find account with code (%s).") % (liquidity_account_prefix,)) + + vals['name'] = vals.get('name') or vals.get('bank_acc_number') + + if 'code' not in vals: + vals['code'] = self.get_next_bank_cash_default_code(journal_type, company) + if not vals['code']: + raise UserError(_("Cannot generate an unused journal code. Please fill the 'Shortcode' field.")) + + if not has_liquidity_accounts: + default_account_code = self.env['account.account']._search_new_account_code(company, digits, liquidity_account_prefix) + default_account_vals = self._prepare_liquidity_account_vals(company, default_account_code, vals) + default_account_vals['parent_id'] = parent.id + vals['default_account_id'] = self.env['account.account'].create(default_account_vals).id + + if not has_payment_accounts: + vals['payment_debit_account_id'] = self.env['account.account'].create({ + 'name': _("Outstanding Receipts"), + 'code': self.env['account.account']._search_new_account_code(company, digits, liquidity_account_prefix), + 'reconcile': True, + 'account_type': 'asset_current', + 'company_id': company.id, + 'parent_id': parent.id, + }).id + + vals['payment_credit_account_id'] = self.env['account.account'].create({ + 'name': _("Outstanding Payments"), + 'code': self.env['account.account']._search_new_account_code(company, digits, liquidity_account_prefix), + 'reconcile': True, + 'account_type': 'asset_current', + 'company_id': company.id, + 'parent_id': parent.id, + }).id + + if journal_type == 'cash' and not has_profit_account: + vals['profit_account_id'] = company.default_cash_difference_income_account_id.id + + if journal_type == 'cash' and not has_loss_account: + vals['loss_account_id'] = company.default_cash_difference_expense_account_id.id + + if 'refund_sequence' not in vals: + vals['refund_sequence'] = vals['type'] in ('sale', 'purchase') diff --git a/dev_odex30_accounting/account_chart_of_accounts/models/res_config_settings.py b/dev_odex30_accounting/account_chart_of_accounts/models/res_config_settings.py new file mode 100644 index 0000000..5812ba2 --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/models/res_config_settings.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +from odoo import fields, models, api, _ + +class ResCompany(models.Model): + _inherit = 'res.company' + + chart_account_length = fields.Integer(string='Chart of accounts length') + chart_account_padding = fields.Integer(string='Chart of accounts Padding') + useFiexedTree = fields.Boolean(string='Use Fixed Length Chart of accounts') + automticAccountsCodes = fields.Boolean(string='Automatically Generate Accounts Codes') + parent_bank_cash_account_id = fields.Many2one('account.account') + + @api.model + def setting_chart_of_accounts_action(self): + """Called by the 'Chart of Accounts' button of the setup bar.""" + company = self.env.company + company.sudo().set_onboarding_step_done('account_setup_coa_state') + + if company.opening_move_posted(): + return 'account.action_account_form' + + company.create_op_move_if_non_existant() + + view_id = self.env.ref('account.init_accounts_tree').id + + domain = [ + ('account_type', '!=', 'equity_unaffected'), + # ('is_view_account', '=', False), + ('company_id', '=', company.id) + ] + + return { + 'type': 'ir.actions.act_window', + 'name': _('Chart of Accounts'), + 'res_model': 'account.account', + 'view_mode': 'tree', + 'limit': 99999999, + 'search_view_id': self.env.ref('account.view_account_search').id, + 'views': [[view_id, 'list']], + 'domain': domain, + } + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + chart_account_length = fields.Integer(related='company_id.chart_account_length', readonly=False) + chart_account_padding = fields.Integer(related='company_id.chart_account_padding', readonly=False) + useFiexedTree = fields.Boolean(related='company_id.useFiexedTree', readonly=False) + automticAccountsCodes = fields.Boolean(related='company_id.automticAccountsCodes', readonly=False) + bank_account_code_prefix = fields.Char(string='Bank Prefix', related='company_id.bank_account_code_prefix', readonly=False) + cash_account_code_prefix = fields.Char(string='Cash Prefix', related='company_id.cash_account_code_prefix', readonly=False) diff --git a/dev_odex30_accounting/account_chart_of_accounts/report/__init__.py b/dev_odex30_accounting/account_chart_of_accounts/report/__init__.py new file mode 100644 index 0000000..a9997a1 --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/report/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import account_report diff --git a/dev_odex30_accounting/account_chart_of_accounts/report/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/account_chart_of_accounts/report/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..184dd415feaf257ce2b4ca8b22debcc339c422a1 GIT binary patch literal 305 zcmZ3^%ge<81k=RBGfjc?V-N=hn4pZ$LO{lJh7^Vr#vF!R#wbQch7_h?22JLdj6exZ z##?-e$;tVpc_r~hsRj8(C4QPrw-}0;fpRMuK7-8o)vuqCpPQBfT48Jer1JB14K4H_EU>7NK|Iv-%)E5{l+?0#h+1S(nDrnt zOX4#!Q;QOdk~1oSD)aLVE%YI-(vOeN%*!l^kJl@x{Ka9Do1apelWJGQ0dyb88^y9f U;sY}yBjW=GnG4uZ5gSki06?W!GXMYp literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/account_chart_of_accounts/report/__pycache__/account_report.cpython-311.pyc b/dev_odex30_accounting/account_chart_of_accounts/report/__pycache__/account_report.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21f990106090fc03abe4c019bd709441322bfce8 GIT binary patch literal 8629 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 0 + + parent_line = self._get_account_line( + report, + options, + parent, + all_column_groups_expression_totals, + is_parent=has_children, + level=0 + ) + + if parent_line: + lines.append((0, parent_line)) + + if parent_line.get('unfolded', False) and has_children: + child_lines = self._get_children_lines_recursive( + report, + options, + parent, + all_column_groups_expression_totals, + level=1 + ) + for child_line in child_lines: + lines.append((0, child_line)) + + orphan_accounts = self.env['account.account'].search([ + ('parent_id', '=', False), + ('account_type', '!=', 'view'), + ], order='code, name') + + for orphan in orphan_accounts: + orphan_line = self._get_account_line( + report, + options, + orphan, + all_column_groups_expression_totals, + is_parent=False, + level=0 + ) + + if orphan_line: + lines.append((0, orphan_line)) + + return lines + + def _get_children_lines_recursive(self, report, options, parent_account, all_column_groups_expression_totals, level=1): + lines = [] + + children = self.env['account.account'].search([ + ('parent_id', '=', parent_account.id) + ], order='code, name') + + for child in children: + has_children = len(child.child_ids) > 0 + + child_line = self._get_account_line( + report, + options, + child, + all_column_groups_expression_totals, + is_parent=has_children, + level=level + ) + + if child_line: + lines.append(child_line) + + if child_line.get('unfolded', False) and has_children: + grandchildren = self._get_children_lines_recursive( + report, + options, + child, + all_column_groups_expression_totals, + level=level + 1 + ) + lines.extend(grandchildren) + + return lines + + def _report_expand_unfoldable_line_with_groupby(self, line_dict_id, groupby, options, progress, offset, unfold_all_batch_data=None): + + return { + 'lines': [], + 'offset_increment': 0, + 'has_more': False, + } + + + def _get_account_line(self, report, options, account, all_column_groups_expression_totals, is_parent=False, + level=0): + + columns = [] + for column in options['columns']: + col_group_key = column.get('column_group_key') + expression_totals = all_column_groups_expression_totals.get(col_group_key, {}) + col_value = self._compute_account_balance(account, options, column, expression_totals) + + columns.append(report._build_column_dict( + col_value, + column, + options=options + )) + + line_id = report._get_generic_line_id('account.account', account.id) + has_children = len(account.child_ids) > 0 + + line = { + 'id': line_id, + 'name': f"{account.code} {account.name}", + 'level': level + 2, + 'columns': columns, + 'account_id': account.id, + 'caret_options': 'account.account', + } + + if has_children: + line['unfoldable'] = True + line['unfolded'] = line_id in options.get('unfolded_lines', []) + line['expand_function'] = '_report_expand_unfoldable_line_with_groupby' + else: + line['unfoldable'] = False + line['unfolded'] = False + + return line + + def _compute_account_balance(self, account, options, column, expression_totals): + + if account.account_type == 'view': + children = self.env['account.account'].search([ + ('parent_path', '=like', f'{account.parent_path}%'), + ('id', '!=', account.id), + ('account_type', '!=', 'view') + ]) + + total = 0 + for child in children: + child_balance = self._get_actual_balance(child, options, column) + total += child_balance + + return total + else: + return self._get_actual_balance(account, options, column) + + def _get_actual_balance(self, account, options, column): + + domain = [ + ('account_id', '=', account.id), + ('parent_state', '=', 'posted'), + ] + + if options.get('date'): + date_from = options['date'].get('date_from') + date_to = options['date'].get('date_to') + + if date_from: + domain.append(('date', '>=', date_from)) + if date_to: + domain.append(('date', '<=', date_to)) + + aml_results = self.env['account.move.line'].read_group( + domain, + ['debit:sum', 'credit:sum', 'balance:sum'], + [] + ) + + if aml_results: + expr_label = column.get('expression_label', 'balance') + return aml_results[0].get(expr_label, 0) + + return 0 diff --git a/dev_odex30_accounting/account_chart_of_accounts/security/account_security.xml b/dev_odex30_accounting/account_chart_of_accounts/security/account_security.xml new file mode 100644 index 0000000..c2073dd --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/security/account_security.xml @@ -0,0 +1,12 @@ + + + + + + Account multi-company + + ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] + + + + diff --git a/dev_odex30_accounting/account_chart_of_accounts/security/ir.model.access.csv b/dev_odex30_accounting/account_chart_of_accounts/security/ir.model.access.csv new file mode 100644 index 0000000..44d20bf --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_account_user,account.account.user,account.model_account_account,account.group_account_user,1,1,1,1 +access_account_account_manager,account.account.manager,account.model_account_account,account.group_account_manager,1,1,1,1 +access_account_account_invoice,account.account.invoice,account.model_account_account,account.group_account_invoice,1,0,0,0 diff --git a/dev_odex30_accounting/account_chart_of_accounts/static/src/js/account_report.js b/dev_odex30_accounting/account_chart_of_accounts/static/src/js/account_report.js new file mode 100644 index 0000000..f87fc18 --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/static/src/js/account_report.js @@ -0,0 +1,62 @@ +/** @odoo-module **/ + +import { patch } from "@web/core/utils/patch"; +import { AccountReportController } from "@odex30_account_reports/components/account_report/controller"; + +patch(AccountReportController.prototype, { + + async unfoldLine(lineIndex) { + const targetLine = this.lines[lineIndex]; + + + if (this.options.show_full_hierarchy && targetLine.expand_function === '_report_expand_unfoldable_line_with_groupby') { + + const isCurrentlyUnfolded = targetLine.unfolded; + + if (isCurrentlyUnfolded) { + this.options.unfolded_lines = this.options.unfolded_lines.filter( + id => id !== targetLine.id + ); + } else { + if (!this.options.unfolded_lines.includes(targetLine.id)) { + this.options.unfolded_lines.push(targetLine.id); + } + } + + + this.saveSessionOptions(this.options); + + this.incrementCallNumber(); + + await this.reload(null, this.options); + + return; + } + + return super.unfoldLine(...arguments); + }, + + + foldLine(lineIndex) { + const targetLine = this.lines[lineIndex]; + + + if (this.options.show_full_hierarchy && targetLine.expand_function === '_report_expand_unfoldable_line_with_groupby') { + + this.options.unfolded_lines = this.options.unfolded_lines.filter( + id => id !== targetLine.id + ); + + + this.saveSessionOptions(this.options); + + this.incrementCallNumber(); + + this.reload(null, this.options); + + return; // إيقاف السلوك الافتراضي + } + + return super.foldLine(...arguments); + } +}); diff --git a/dev_odex30_accounting/account_chart_of_accounts/static/src/js/account_type_selection_extend.js b/dev_odex30_accounting/account_chart_of_accounts/static/src/js/account_type_selection_extend.js new file mode 100644 index 0000000..b9c838d --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/static/src/js/account_type_selection_extend.js @@ -0,0 +1,25 @@ +/** @odoo-module **/ + +import { _t } from "@web/core/l10n/translation"; +import { registry } from "@web/core/registry"; +import { AccountTypeSelection } from "@account/components/account_type_selection/account_type_selection"; +import { patch } from "@web/core/utils/patch"; + +patch(AccountTypeSelection.prototype, { + get hierarchyOptions() { + const opts = this.options; + return [ + { name: _t('Balance Sheet') }, + { name: _t('Assets'), children: opts.filter(x => x[0] && x[0].startsWith('asset')) }, + { name: _t('Liabilities'), children: opts.filter(x => x[0] && x[0].startsWith('liability')) }, + { name: _t('Equity'), children: opts.filter(x => x[0] && x[0].startsWith('equity')) }, + { name: _t('Profit & Loss') }, + { name: _t('Income'), children: opts.filter(x => x[0] && x[0].startsWith('income')) }, + { name: _t('Expense'), children: opts.filter(x => x[0] && x[0].startsWith('expense')) }, + { + name: _t('Other'), + children: opts.filter(x => x[0] && (x[0] === 'off_balance' || x[0] === 'view')) + }, + ]; + } +}); diff --git a/dev_odex30_accounting/account_chart_of_accounts/static/src/js/filters_patch.js b/dev_odex30_accounting/account_chart_of_accounts/static/src/js/filters_patch.js new file mode 100644 index 0000000..fcdc340 --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/static/src/js/filters_patch.js @@ -0,0 +1,15 @@ +/** @odoo-module **/ + +import { patch } from "@web/core/utils/patch"; +import { AccountReportFilters } from "@odex30_account_reports/components/account_report/filters/filters"; + +patch(AccountReportFilters.prototype, { + + async toggleFullHierarchy() { + const newValue = !this.controller.options.show_full_hierarchy; + await this.controller.updateOption('show_full_hierarchy', newValue); + this.controller.saveSessionOptions(this.controller.options); + await this.applyFilters('show_full_hierarchy'); + } + +}); diff --git a/dev_odex30_accounting/account_chart_of_accounts/static/src/scss/account_hierarchy.scss b/dev_odex30_accounting/account_chart_of_accounts/static/src/scss/account_hierarchy.scss new file mode 100644 index 0000000..bb42e73 --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/static/src/scss/account_hierarchy.scss @@ -0,0 +1,39 @@ +.o_search_panel.account_account { + .o_search_panel_field.parent_id { + .o_search_panel_category_value { + .o_toggle_fold { + margin-right: 15px; + cursor: pointer; + } + + header { + display: flex; + align-items: center; + padding: 3px 8px; + + &:hover { + color: #f0f0f0; + } + + .o_search_panel_label_title { + flex: 1; + } + + .badge { + margin-left: auto; + font-size: 0.8em; + } + } + + // Levels + &[data-level="0"] { + font-weight: bold; + } + + &[data-level="1"] header { padding-left: 20px; } + &[data-level="2"] header { padding-left: 35px; } + &[data-level="3"] header { padding-left: 50px; } + &[data-level="4"] header { padding-left: 65px; } + } + } +} diff --git a/dev_odex30_accounting/account_chart_of_accounts/static/src/xml/filter_full_hierarchy.xml b/dev_odex30_accounting/account_chart_of_accounts/static/src/xml/filter_full_hierarchy.xml new file mode 100644 index 0000000..a43714c --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/static/src/xml/filter_full_hierarchy.xml @@ -0,0 +1,24 @@ + + + + + + + +
+ +
+
+
+ +
+ +
diff --git a/dev_odex30_accounting/account_chart_of_accounts/views/account_account_view.xml b/dev_odex30_accounting/account_chart_of_accounts/views/account_account_view.xml new file mode 100644 index 0000000..2565afb --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/views/account_account_view.xml @@ -0,0 +1,128 @@ + + + + + + account.account.form.inherit.hierarchy + account.account + + + + + + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + account.account.tree.inherit + account.account + + + + + + + + + + account.account.search.inherit + account.account + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/dev_odex30_accounting/account_chart_of_accounts/views/res_config_settings_views.xml b/dev_odex30_accounting/account_chart_of_accounts/views/res_config_settings_views.xml new file mode 100644 index 0000000..12479e8 --- /dev/null +++ b/dev_odex30_accounting/account_chart_of_accounts/views/res_config_settings_views.xml @@ -0,0 +1,87 @@ + + + + + res.config.settings.view.form.inherit + res.config.settings + + + + + + + +
+ + +
+
+ +
+
+
+
+ + +
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ + + + + + diff --git a/dev_odex30_accounting/exp_asset_base/.idea/exp_asset_base.iml b/dev_odex30_accounting/exp_asset_base/.idea/exp_asset_base.iml new file mode 100644 index 0000000..8b8c395 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/.idea/exp_asset_base.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_base/.idea/inspectionProfiles/profiles_settings.xml b/dev_odex30_accounting/exp_asset_base/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_base/.idea/misc.xml b/dev_odex30_accounting/exp_asset_base/.idea/misc.xml new file mode 100644 index 0000000..445c93b --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_base/.idea/modules.xml b/dev_odex30_accounting/exp_asset_base/.idea/modules.xml new file mode 100644 index 0000000..33cef9b --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_base/.idea/workspace.xml b/dev_odex30_accounting/exp_asset_base/.idea/workspace.xml new file mode 100644 index 0000000..5caca8c --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/.idea/workspace.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + 1697652146581 + + + + \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_base/__init__.py b/dev_odex30_accounting/exp_asset_base/__init__.py new file mode 100644 index 0000000..f97d742 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# © Copyright (C) 2021 Expert Co. Ltd() + +from . import models +from . import reports diff --git a/dev_odex30_accounting/exp_asset_base/__manifest__.py b/dev_odex30_accounting/exp_asset_base/__manifest__.py new file mode 100644 index 0000000..133b49f --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/__manifest__.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +# © 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + 'name': 'Asset Extend', + 'summary': 'Adding new features to asset', + 'description': ''' +Adding the following Features: +============================== + +Alter asset Form + +Alter Asset category Form + +Alter Product Form + +Add asset operations (Transfer, Sell/Dispose, Maitenenace, Assesment) + ''', + 'version': '1.0.0', + 'category': 'Odex30-Accounting/Odex30-Accounting', + 'author': 'Expert Co. Ltd.', + 'website': 'http://www.exp-sa.com', + 'license': 'AGPL-3', + 'application': False, + 'installable': True, + 'depends': [ + 'odex30_account_asset', + 'hr', 'barcodes', 'report_xlsx' + ], + 'data': [ + 'security/groups.xml', + 'security/ir.model.access.csv', + 'data/asset_data.xml', + 'data/asset_cron.xml', + 'reports/reports.xml', + 'reports/asset_barcode_pdf_report.xml', + 'reports/asset_barcode_zpl_report.xml', + 'views/account_asset_view.xml', + 'views/account_asset_adjustment_view.xml', + 'views/menus.xml', + # 'views/asset_modify_views.xml', + # 'views/asset_pause_views.xml', + # 'views/asset_sell_views.xml', + ], +} diff --git a/dev_odex30_accounting/exp_asset_base/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/exp_asset_base/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a547cfd4e2e6620c5608288309d317035e6d523 GIT binary patch literal 322 zcmZ3^%ge<81SagP8O=cYF^B^LOi;#WIUr*?LkdF*V-7O4Z?Wa(r=;c-16k}vsRj8(CB=T4%(obdn1RwoEI?uUBR@A) zKQSjeBeAL|D^ow9GC3o$C^w)eKPxr4q*xzlPKB`nkjl^3HMG!!u)v~52Jwl>$@!&u zC7F5Y`YEYp@esAhqNx=H@rlL7sU`7AiN&e<@$s2?nI-Y@dIgogIBbA!EX_%^E8+w? k1mx~wLm=^inURt40|x`6=miE5WORc8D1rqQu>*Ah0H8rvH~;_u literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_base/data/asset_cron.xml b/dev_odex30_accounting/exp_asset_base/data/asset_cron.xml new file mode 100644 index 0000000..6602fe3 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/data/asset_cron.xml @@ -0,0 +1,11 @@ + + + + Asset Reminder + + code + model._asset_cron() + 1 + days + + \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_base/data/asset_data.xml b/dev_odex30_accounting/exp_asset_base/data/asset_data.xml new file mode 100644 index 0000000..f4b7831 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/data/asset_data.xml @@ -0,0 +1,41 @@ + + + + + Asset Sequence + asset.seq + ASS/%(range_year)s/ + + + + + 6 + + + + Good + + + Scarp + + + \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_base/i18n/ar.po b/dev_odex30_accounting/exp_asset_base/i18n/ar.po new file mode 100644 index 0000000..ae988a1 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/i18n/ar.po @@ -0,0 +1,1410 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * exp_asset_base +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-03 08:16+0000\n" +"PO-Revision-Date: 2023-09-03 08:16+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__asset_adjustment_count +msgid "# of Adjustments" +msgstr "الجرد" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/asset_modify.py:0 +#, python-format +msgid "A gross increase has been created" +msgstr "" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__account_asset_counterpart_id +msgid "Account Asset Counterpart" +msgstr "" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__account_depreciation_id +msgid "Account Depreciation" +msgstr "" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__account_depreciation_expense_id +msgid "Account Depreciation Expense" +msgstr "" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__gain_account_id +msgid "Account used to write the journal item in case of gain" +msgstr "الحساب المستخدم لكتابة بند دفتر اليومية في حالة الربح" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__loss_account_id +msgid "Account used to write the journal item in case of loss" +msgstr "الحساب المستخدم لكتابة بند دفتر اليومية في حالة الخسارة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__action +msgid "Action" +msgstr "إجراء" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__message_needaction +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__message_needaction +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__message_needaction +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__message_needaction +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__message_needaction +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__message_needaction +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__message_needaction +msgid "Action Needed" +msgstr "إجراء مطلوب" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__activity_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__activity_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__activity_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__activity_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__activity_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__activity_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__activity_ids +msgid "Activities" +msgstr "الأنشطة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__activity_exception_decoration +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__activity_exception_decoration +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__activity_exception_decoration +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__activity_exception_decoration +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__activity_exception_decoration +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__activity_exception_decoration +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "زخرفة استثناء النشاط" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__activity_state +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__activity_state +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__activity_state +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__activity_state +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__activity_state +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__activity_state +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__activity_state +msgid "Activity State" +msgstr "حالة النشاط" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__activity_type_icon +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__activity_type_icon +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__activity_type_icon +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__activity_type_icon +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__activity_type_icon +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__activity_type_icon +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__activity_type_icon +msgid "Activity Type Icon" +msgstr "أيقونة نوع النشاط" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line__adjustment_id +msgid "Adjustment" +msgstr "جرد الأصول" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__adjustment_line_ids +msgid "Adjustment Line" +msgstr "تفاصيل الجرد" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_form +msgid "Adjustments" +msgstr "الجرد" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__account_analytic_id +msgid "Analytic Account" +msgstr "الحساب التحليلي" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_modify_form +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_pause_form +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_sell_form +msgid "Approve" +msgstr "إعتماد" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_modify__state__approve +#: model:ir.model.fields.selection,name:exp_asset_base.selection__asset_pause__state__approve +#: model:ir.model.fields.selection,name:exp_asset_base.selection__asset_sell__state__approve +msgid "Approved" +msgstr "إعتماد" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line__asset_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__asset_id +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__asset_id +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__asset_id +msgid "Asset" +msgstr "الأصل" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset.py:0 +#: model:ir.actions.act_window,name:exp_asset_base.action_asset_adjustment +#: model:ir.model,name:exp_asset_base.model_account_asset_adjustment +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_line_tree +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_tree +#, python-format +msgid "Asset Adjustment" +msgstr "جرد الأصول" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_account_asset_adjustment_line +msgid "Asset Adjustment Line" +msgstr "تفاصيل جرد الأصول" + +#. module: exp_asset_base +#: model:res.groups,name:exp_asset_base.group_asset_assessment +msgid "Asset Assessment" +msgstr "إعادة التقييم" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__account_asset_id +msgid "Asset Gross Increase Account" +msgstr "حساب زيادة قيمة الأصل" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_account_asset_location +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__complete_name +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_location_form +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_manufacturer_form +msgid "Asset Location" +msgstr "مواقع الأصول" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_account_asset_manufacturer +msgid "Asset Manufacturer" +msgstr "تصنيع الأصل" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_asset_modify +msgid "Asset Modification" +msgstr "تعديل الأصل" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_asset_pause +msgid "Asset Pause" +msgstr "إيقاف الأصل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__asset_picture +msgid "Asset Picture" +msgstr "صورة الأصل" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/reports/asset_register_report_xlsx.py:0 +#, python-format +msgid "Asset Register" +msgstr "سجل الأصول" + +#. module: exp_asset_base +#: model:ir.actions.server,name:exp_asset_base.asset_cron_ir_actions_server +#: model:ir.cron,cron_name:exp_asset_base.asset_cron +#: model:ir.cron,name:exp_asset_base.asset_cron +msgid "Asset Reminder" +msgstr "" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_asset_sell +msgid "Asset Sell" +msgstr "بيع الأصل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line__asset_status +msgid "Asset Status" +msgstr "حالة العهد" + +#. module: exp_asset_base +#: model:ir.model.constraint,message:exp_asset_base.constraint_account_asset_asset_barcode_uniq +msgid "Asset barcode must be unique." +msgstr "يجب أن يكون باكود الأصل فريدً." + +#. module: exp_asset_base +#: model:ir.actions.report,name:exp_asset_base.action_report_asset_register_xlsx +msgid "Asset register XLSX" +msgstr "سجل الاصول (اكسل)" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/asset_modify.py:0 +#, python-format +msgid "Asset unpaused" +msgstr "" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_account_asset +msgid "Asset/Revenue Recognition" +msgstr "أصل/ إيرادات مقدمة" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_adjustment +msgid "Assets Adjustment" +msgstr "جرد الاصول" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_account_asset_graph +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_graph +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_graph +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_pivot +msgid "Assets Analysis" +msgstr "تحليل الأصول" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_account_asset_location +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_location +msgid "Assets Locations" +msgstr "المواقع" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_management_main +msgid "Assets Management" +msgstr "إدارة الأصول" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_account_asset_manufacturer +msgid "Assets Manufacturer" +msgstr "الشركات المُصنعة" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.asset_modify_menu +msgid "Assets Modification" +msgstr "تعديل الأصول" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_operation +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_operation_main +msgid "Assets Operations" +msgstr "عمليات الأصول" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.asset_pause_menu +msgid "Assets Pause" +msgstr "إيقاف الأصول" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.asset_sell_menu +msgid "Assets Sell" +msgstr "بيع الأصول" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__message_attachment_count +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__message_attachment_count +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__message_attachment_count +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__message_attachment_count +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__message_attachment_count +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__message_attachment_count +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__message_attachment_count +msgid "Attachment Count" +msgstr "عدد المرفقات" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset__status__available +msgid "Available" +msgstr "متوفر" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__barcode +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__barcode +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line__barcode +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_form +msgid "Barcode" +msgstr "الباركود" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment___barcode_scanned +msgid "Barcode Scanned" +msgstr "الباركود" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_form +msgid "Barcode..." +msgstr "باركود..." + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_form +msgid "Basic Info" +msgstr "المعلومات الأساسية" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_adjustment__type__model +msgid "By Model" +msgstr "النموذج" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_adjustment__type__product +msgid "By Product" +msgstr "المنتج" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_adjustment__state__cancel +msgid "Cancel" +msgstr "إلغاء" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/reports/asset_depreciation_report_xlsx.py:0 +#, python-format +msgid "Categories" +msgstr "فئات" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__child_id +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_location_form +msgid "Child Locations" +msgstr "المواقع الفرعية" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__code +msgid "Code" +msgstr "الكود" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__company_id +msgid "Company" +msgstr "الشركة" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_configuration_main +msgid "Configurations" +msgstr "الإعدادات" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_modify_form +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_pause_form +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_sell_form +msgid "Confirm" +msgstr "تأكيد" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_modify__state__confirm +#: model:ir.model.fields.selection,name:exp_asset_base.selection__asset_pause__state__confirm +#: model:ir.model.fields.selection,name:exp_asset_base.selection__asset_sell__state__confirm +msgid "Confirmed" +msgstr "تم الإعتماد" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_search +msgid "Cost Center" +msgstr "مركز التكلفة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__create_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line__create_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__create_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__create_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__create_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__create_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__create_uid +msgid "Created by" +msgstr "أنشئ بواسطة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__create_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line__create_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__create_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__create_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__create_date +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__create_date +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__create_date +msgid "Created on" +msgstr "أنشئ في" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__currency_id +msgid "Currency" +msgstr "العملة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__location_id +msgid "Current Location" +msgstr "الموقع الحالي" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_purchase_tree +msgid "Custody Status" +msgstr "حالة العهدة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__invoice_id +msgid "Customer Invoice" +msgstr "فاتورة العميل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__date +msgid "Date" +msgstr "التاريخ" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__value_residual +msgid "Depreciable Amount" +msgstr "القيمة القابلة للإستهلاك" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__value_residual +msgid "Depreciable Value" +msgstr "القيمة القابلة للإستهلاك" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_depreciation_graph +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_depreciation_pivot +msgid "Depreciation" +msgstr "إستهلاك" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_account_asset_depreciation_analysis +#: model:ir.ui.menu,name:exp_asset_base.menu_account_Depreciation_graph +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_depreciation_graph +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_depreciation_pivot +msgid "Depreciation Analysis" +msgstr "تحليل الإستهلاكات" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_depreciation_graph +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_depreciation_pivot +msgid "Depreciation Date" +msgstr "تاريخ الإستهلاك" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/asset_modify.py:0 +#, python-format +msgid "Depreciation board modified" +msgstr "" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_form +msgid "Details" +msgstr "التفاصيل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line__display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_abstract_report_xlsx__display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_report_report_asset_register_xlsx__display_name +msgid "Display Name" +msgstr "الاسم المعروض" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__asset_sell__action__dispose +msgid "Dispose" +msgstr "إهلاك" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_adjustment__state__done +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_modify__state__done +#: model:ir.model.fields.selection,name:exp_asset_base.selection__asset_pause__state__done +#: model:ir.model.fields.selection,name:exp_asset_base.selection__asset_sell__state__done +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_modify_form +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_pause_form +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_sell_form +msgid "Done" +msgstr "تم" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_adjustment__state__draft +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_modify__state__draft +#: model:ir.model.fields.selection,name:exp_asset_base.selection__asset_pause__state__draft +#: model:ir.model.fields.selection,name:exp_asset_base.selection__asset_sell__state__draft +msgid "Draft" +msgstr "مسودة" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/reports/asset_depreciation_report_xlsx.py:0 +#, python-format +msgid "Duration" +msgstr "الفترة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line__exist +msgid "Exist?" +msgstr "موجود?" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/reports/asset_depreciation_report_xlsx.py:0 +#, python-format +msgid "Fixed Asset Register" +msgstr "سجل الأصول" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__message_follower_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__message_follower_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__message_follower_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__message_follower_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__message_follower_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__message_follower_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__message_follower_ids +msgid "Followers" +msgstr "المتابعون" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__message_channel_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__message_channel_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__message_channel_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__message_channel_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__message_channel_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__message_channel_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__message_channel_ids +msgid "Followers (Channels)" +msgstr "المتابعون (القنوات)" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__message_partner_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__message_partner_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__message_partner_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__message_partner_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__message_partner_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__message_partner_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__message_partner_ids +msgid "Followers (Partners)" +msgstr "المتابعون (الشركاء)" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset__activity_type_icon +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_adjustment__activity_type_icon +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_location__activity_type_icon +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_manufacturer__activity_type_icon +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__activity_type_icon +#: model:ir.model.fields,help:exp_asset_base.field_asset_pause__activity_type_icon +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/reports/asset_depreciation_report_xlsx.py:0 +#, python-format +msgid "From: " +msgstr "من: " + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__asset_sell__gain_or_loss__gain +msgid "Gain" +msgstr "ربح" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__gain_account_id +msgid "Gain Account" +msgstr "حساب الأرباح" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__gain_or_loss +msgid "Gain Or Loss" +msgstr "الربح أو الخسارة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__gain_value +msgid "Gain Value" +msgstr "قيمة الربح" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_adjustment_line__asset_status__good +msgid "Good" +msgstr "جيد" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line__id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__id +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__id +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__id +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_abstract_report_xlsx__id +#: model:ir.model.fields,field_description:exp_asset_base.field_report_report_asset_register_xlsx__id +msgid "ID" +msgstr "المُعرف" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__activity_exception_icon +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__activity_exception_icon +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__activity_exception_icon +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__activity_exception_icon +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__activity_exception_icon +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__activity_exception_icon +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__activity_exception_icon +msgid "Icon" +msgstr "الأيقونة" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset__activity_exception_icon +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_adjustment__activity_exception_icon +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_location__activity_exception_icon +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_manufacturer__activity_exception_icon +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__activity_exception_icon +#: model:ir.model.fields,help:exp_asset_base.field_asset_pause__activity_exception_icon +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "الأيقونة للإشارة إلى استثناء النشاط" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset__message_needaction +#: model:ir.model.fields,help:exp_asset_base.field_account_asset__message_unread +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_adjustment__message_needaction +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_adjustment__message_unread +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_location__message_needaction +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_location__message_unread +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_manufacturer__message_needaction +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_manufacturer__message_unread +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__message_needaction +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__message_unread +#: model:ir.model.fields,help:exp_asset_base.field_asset_pause__message_needaction +#: model:ir.model.fields,help:exp_asset_base.field_asset_pause__message_unread +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__message_needaction +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__message_unread +msgid "If checked, new messages require your attention." +msgstr "إذا كان محددًا، فهناك رسائل جديدة تحتاج لرؤيتها." + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset__message_has_error +#: model:ir.model.fields,help:exp_asset_base.field_account_asset__message_has_sms_error +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_adjustment__message_has_error +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_adjustment__message_has_sms_error +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_location__message_has_error +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_location__message_has_sms_error +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_manufacturer__message_has_error +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_manufacturer__message_has_sms_error +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__message_has_error +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__message_has_sms_error +#: model:ir.model.fields,help:exp_asset_base.field_asset_pause__message_has_error +#: model:ir.model.fields,help:exp_asset_base.field_asset_pause__message_has_sms_error +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__message_has_error +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "إذا كان محددًا، فقد حدث خطأ في تسليم بعض الرسائل." + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_adjustment__state__in_progress +msgid "In Progress" +msgstr "جاري" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_modify_form +msgid "Increase Accounts" +msgstr "حسابات الزيادة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__invoice_line_id +msgid "Invoice Line" +msgstr "بند الفاتورة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__message_is_follower +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__message_is_follower +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__message_is_follower +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__message_is_follower +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__message_is_follower +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__message_is_follower +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__message_is_follower +msgid "Is Follower" +msgstr "متابع" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset____last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment____last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line____last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location____last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer____last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify____last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause____last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell____last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_abstract_report_xlsx____last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_report_report_asset_register_xlsx____last_update +msgid "Last Modified on" +msgstr "آخر تعديل في" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__write_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line__write_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__write_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__write_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__write_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__write_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__write_uid +msgid "Last Updated by" +msgstr "آخر تحديث بواسطة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__write_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line__write_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__write_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__write_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__write_date +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__write_date +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__limit +msgid "Limit" +msgstr "حد" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_location_form +msgid "Location Name..." +msgstr "إسم الموقع..." + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_form +msgid "Lock" +msgstr "إغلاق" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__asset_sell__gain_or_loss__loss +msgid "Loss" +msgstr "خسارة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__loss_account_id +msgid "Loss Account" +msgstr "حساب الخسارة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__message_main_attachment_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__message_main_attachment_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__message_main_attachment_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__message_main_attachment_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__message_main_attachment_id +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__message_main_attachment_id +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__message_main_attachment_id +msgid "Main Attachment" +msgstr "المرفق الرئيسي" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__manufacturer_id +#: model:ir.ui.menu,name:exp_asset_base.menu_account_manufacturer +msgid "Manufacturer" +msgstr "المُصنع" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__message_has_error +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__message_has_error +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__message_has_error +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__message_has_error +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__message_has_error +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__message_has_error +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__message_has_error +msgid "Message Delivery error" +msgstr "خطأ في تسليم الرسائل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__message_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__message_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__message_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__message_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__message_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__message_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__message_ids +msgid "Messages" +msgstr "الرسائل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__model +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__model_id +msgid "Model" +msgstr "النموذج" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_modify_form +msgid "Modification" +msgstr "التعديل" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_modify_form +msgid "Modification reason" +msgstr "سبب التعديل" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_modify_form +msgid "Modification..." +msgstr "التعديل ...." + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_account_asset_modify +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_modify_form +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_modify_tree +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_pause_tree +msgid "Modify Asset" +msgstr "تعديل الأصل" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_modify__method_period__1 +msgid "Months" +msgstr "عدد الشهور" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__my_activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__my_activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__my_activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__my_activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__my_activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__my_activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__name +msgid "Name" +msgstr "الإسم" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__need_date +msgid "Need Date" +msgstr "تحتاج لتاريخ" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset__status__new +msgid "New" +msgstr "جديد" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_modify_form +msgid "New Values" +msgstr "القيمة الجديدة" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__value_residual +msgid "New residual amount for the asset" +msgstr "المبلغ المتبقي الجديد للأصل" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__salvage_value +msgid "New salvage amount for the asset" +msgstr "مبلغ الخردة الجديد للأصل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "الموعد النهائي للنشاط التالي" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__activity_summary +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__activity_summary +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__activity_summary +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__activity_summary +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__activity_summary +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__activity_summary +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__activity_summary +msgid "Next Activity Summary" +msgstr "ملخص النشاط التالي" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__activity_type_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__activity_type_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__activity_type_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__activity_type_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__activity_type_id +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__activity_type_id +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__activity_type_id +msgid "Next Activity Type" +msgstr "نوع النشاط التالي" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__next_maintenance_date +msgid "Next Maintenance Date" +msgstr "تاريخ الصيانة القادم" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__asset_sell__gain_or_loss__no +msgid "No" +msgstr "لأ" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_adjustment.py:0 +#, python-format +msgid "No asset found with the selected barcode" +msgstr "لم يتم العثور على أصل بالباركود المدخل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__salvage_value +msgid "Not Depreciable Amount" +msgstr "قيمة التخريد" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__note +msgid "Note" +msgstr "ملاحظة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__message_needaction_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__message_needaction_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__message_needaction_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__message_needaction_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__message_needaction_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__message_needaction_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__message_needaction_counter +msgid "Number of Actions" +msgstr "عدد الإجراءات" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__method_number +msgid "Number of Depreciations" +msgstr "عدد الإهلاكات" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__method_period +msgid "Number of Months in a Period" +msgstr "عدد الشهور في الفترة" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset__asset_adjustment_count +msgid "Number of adjustments" +msgstr "عدد عمليات الجرد" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__message_has_error_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__message_has_error_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__message_has_error_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__message_has_error_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__message_has_error_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__message_has_error_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__message_has_error_counter +msgid "Number of errors" +msgstr "عدد الاخطاء" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset__message_needaction_counter +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_adjustment__message_needaction_counter +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_location__message_needaction_counter +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_manufacturer__message_needaction_counter +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__message_needaction_counter +#: model:ir.model.fields,help:exp_asset_base.field_asset_pause__message_needaction_counter +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "عدد الرسائل التي تتطلب إجراء" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset__message_has_error_counter +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_adjustment__message_has_error_counter +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_location__message_has_error_counter +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_manufacturer__message_has_error_counter +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__message_has_error_counter +#: model:ir.model.fields,help:exp_asset_base.field_asset_pause__message_has_error_counter +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "عدد الرسائل الحادث بها خطأ في التسليم" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset__message_unread_counter +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_adjustment__message_unread_counter +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_location__message_unread_counter +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_manufacturer__message_unread_counter +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__message_unread_counter +#: model:ir.model.fields,help:exp_asset_base.field_asset_pause__message_unread_counter +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__message_unread_counter +msgid "Number of unread messages" +msgstr "عدد الرسائل الجديدة" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_location__type__ordinary +msgid "Ordinary" +msgstr "عادي" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__parent_id +msgid "Parent" +msgstr "بارينت" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__parent_path +msgid "Parent Path" +msgstr "المسار الأصلي" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset.py:0 +#: model:ir.model,name:exp_asset_base.model_asset_pause +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_pause_form +#, python-format +msgid "Pause Asset" +msgstr "إيقاف الأصل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__date +msgid "Pause date" +msgstr "تاريخ الإيقاف" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__product_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__product_id +msgid "Product" +msgstr "المنتج" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_products +msgid "Products" +msgstr "المنتجات" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__name +msgid "Reason" +msgstr "السبب" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__receive_date +msgid "Receive Date" +msgstr "تاريخ الإستلام" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_form +msgid "Reject" +msgstr "رفض" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_reporting_main +msgid "Reporting" +msgstr "التقارير" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__responsible_dept_id +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_search +msgid "Responsible Department" +msgstr "الإدارة المسئولة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__activity_user_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__responsible_user_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__activity_user_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__activity_user_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__activity_user_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__activity_user_id +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__activity_user_id +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__activity_user_id +msgid "Responsible User" +msgstr "المستخدم المسؤول" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/asset_modify.py:0 +#, python-format +msgid "" +"Reverse the depreciation entries posted in the future in order to modify the" +" depreciation" +msgstr "" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__message_has_sms_error +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__message_has_sms_error +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__message_has_sms_error +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__message_has_sms_error +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__message_has_sms_error +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__message_has_sms_error +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__message_has_sms_error +msgid "SMS Delivery error" +msgstr "خطأ في تسليم الرسائل القصيرة" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_adjustment_line__asset_status__scrap +msgid "Scrap" +msgstr "تالف" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__select_invoice_line_id +msgid "Select Invoice Line" +msgstr "إختار بند الفاتورة" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__asset_sell__action__sell +msgid "Sell" +msgstr "بيع" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset.py:0 +#: model:ir.model,name:exp_asset_base.model_asset_sell +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_sell_form +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_sell_tree +#, python-format +msgid "Sell Asset" +msgstr "بيع الإصل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__serial_no +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line__serial_no +msgid "Serial No" +msgstr "الرقم التسلسلي" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__service_provider_id +msgid "Service Provider" +msgstr "مزود الخدمة" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_modify_form +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_pause_form +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_sell_form +msgid "Set to Draft" +msgstr "تعيين كمسودة" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_form +msgid "Start" +msgstr "بدأ" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__state +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__state +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__state +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__state +msgid "State" +msgstr "الحالة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__state +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__status +msgid "Status" +msgstr "الحالة" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset__activity_state +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_adjustment__activity_state +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_location__activity_state +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_manufacturer__activity_state +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__activity_state +#: model:ir.model.fields,help:exp_asset_base.field_asset_pause__activity_state +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"الحالة على أساس الأنشطة\n" +"المتأخرة: تاريخ الاستحقاق مر\n" +"اليوم: تاريخ النشاط هو اليوم\n" +"المخطط: الأنشطة المستقبلية." + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__gain_value +msgid "" +"Technical field to know if we should display the fields for the creation of " +"gross increase asset" +msgstr "" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__gain_or_loss +msgid "" +"Technical field to know is there was a gain or a loss in the selling of the " +"asset" +msgstr "" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset.py:0 +#, python-format +msgid "The %s with barcode %s has schedule maintenance today ,please follow." +msgstr "%s بالكود %s لديه صيانة مجدولة اليوم,الرجاء المتابعة." + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__method_period +msgid "The amount of time between two depreciations" +msgstr "مقدار الوقت بين انخفاضين" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__asset_id +msgid "The asset to be modified by this wizard" +msgstr "الأصل الذي سيتم تعديله بواسطة هذا المعالج" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__invoice_id +msgid "" +"The disposal invoice is needed in order to generate the closing journal " +"entry." +msgstr "" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset.py:0 +#, python-format +msgid "The warrant period of %s with barcode %s has end!" +msgstr "فترة الضمان للأصل %s بالباركود %s قد إنتهت!" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__invoice_line_id +msgid "There are multiple lines that could be the related to this asset" +msgstr "هناك بنود متعددة يمكن أن تكون مرتبطة بهذا الأصل" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/reports/asset_depreciation_report_xlsx.py:0 +#, python-format +msgid "To: " +msgstr "الى: " + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__type +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__type +msgid "Type" +msgstr "النوع" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset__activity_exception_decoration +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_adjustment__activity_exception_decoration +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_location__activity_exception_decoration +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_manufacturer__activity_exception_decoration +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__activity_exception_decoration +#: model:ir.model.fields,help:exp_asset_base.field_asset_pause__activity_exception_decoration +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "نوع النشاط الاستثنائي المسجل." + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset__state__unlock +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_form +msgid "Unlock" +msgstr "إعادة الفتح" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__message_unread +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__message_unread +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__message_unread +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__message_unread +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__message_unread +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__message_unread +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__message_unread +msgid "Unread Messages" +msgstr "الرسائل الجديدة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__message_unread_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__message_unread_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__message_unread_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__message_unread_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__message_unread_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__message_unread_counter +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__message_unread_counter +msgid "Unread Messages Counter" +msgstr "عدد الرسائل الجديدة" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/asset_modify.py:0 +#, python-format +msgid "Value decrease for: %(asset)s" +msgstr "" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/asset_modify.py:0 +#: code:addons/exp_asset_base/models/asset_modify.py:0 +#, python-format +msgid "Value increase for: %(asset)s" +msgstr "" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_adjustment___barcode_scanned +msgid "Value of the last barcode scanned." +msgstr "قيمة آخر باركود ممسوح ضوئيًا." + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_vendors +msgid "Vendors" +msgstr "المورد" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_location__type__view +msgid "View" +msgstr "عرض" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.view_account_asset_form +msgid "Warranty" +msgstr "ضمان" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__warranty_contract +msgid "Warranty Contract" +msgstr "عقد الضمان" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__warranty_end_date +msgid "Warranty End Date" +msgstr "تاريخ نهاية الضمان" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__warranty_period +msgid "Warranty Period(Months)" +msgstr "فترة الضمان (شهور)" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset__website_message_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment__website_message_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location__website_message_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer__website_message_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_modify__website_message_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_pause__website_message_ids +#: model:ir.model.fields,field_description:exp_asset_base.field_asset_sell__website_message_ids +msgid "Website Messages" +msgstr "رسائل الموقع" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset__website_message_ids +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_adjustment__website_message_ids +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_location__website_message_ids +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_manufacturer__website_message_ids +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_modify__website_message_ids +#: model:ir.model.fields,help:exp_asset_base.field_asset_pause__website_message_ids +#: model:ir.model.fields,help:exp_asset_base.field_asset_sell__website_message_ids +msgid "Website communication history" +msgstr "سجل تواصل الموقع" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset__state +msgid "" +"When an asset is created, the status is 'Draft'.\n" +"If the asset is confirmed, the status goes in 'Running' and the depreciation lines can be posted in the accounting.\n" +"The 'On Hold' status can be set manually when you want to pause the depreciation of an asset for some time.\n" +"You can manually close an asset when the depreciation is over. If the last line of depreciation is posted, the asset automatically goes in that status." +msgstr "" + +#. module: exp_asset_base +#: model:ir.model.fields.selection,name:exp_asset_base.selection__account_asset_modify__method_period__12 +msgid "Years" +msgstr "سنوات" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/asset_sell.py:0 +#, python-format +msgid "" +"You cannot automate the journal entry for an asset that has a running gross " +"increase. Please use 'Dispose' on the increase(s)." +msgstr "" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_adjustment.py:0 +#, python-format +msgid "You should enter the asset status for all assets that marked as exist." +msgstr "يجب تحديد حالة الأصل لجميع الأصول الموجودة." + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_report_asset_abstract_report_xlsx +msgid "asset_abstract_report_xlsx" +msgstr "" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_report_report_asset_register_xlsx +msgid "report_asset_register_xlsx" +msgstr "" \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_base/i18n/ar_001.po b/dev_odex30_accounting/exp_asset_base/i18n/ar_001.po new file mode 100644 index 0000000..66304d1 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/i18n/ar_001.po @@ -0,0 +1,912 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * exp_asset_custody +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-15 06:13+0000\n" +"PO-Revision-Date: 2023-10-15 06:13+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__asset_operation_count +msgid "# Done Operations" +msgstr "العمليات المعتمدة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_needaction +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_needaction +msgid "Action Needed" +msgstr "إجراء مطلوب" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_ids +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_ids +msgid "Activities" +msgstr "الأنشطة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_exception_decoration +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "زخرفة استثناء النشاط" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_state +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_state +msgid "Activity State" +msgstr "حالة النشاط" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_type_icon +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_type_icon +msgid "Activity Type Icon" +msgstr "أيقونة نوع النشاط" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__amount +msgid "Amount" +msgstr "المبلغ" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__asset_id +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Asset" +msgstr "الأصل" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Asset Account" +msgstr "حساب الأصل" + +#. module: exp_asset_custody +#: model:ir.actions.report,name:exp_asset_custody.action_asset_adjustment_report +#: model:ir.model,name:exp_asset_custody.model_account_asset_adjustment +msgid "Asset Adjustment" +msgstr "جرد الأصول" + +#. module: exp_asset_custody +#: model:ir.model,name:exp_asset_custody.model_account_asset_multi_operation +msgid "Asset Multi Operation" +msgstr "العمليات المتعددة" + +#. module: exp_asset_custody +#: model:ir.model,name:exp_asset_custody.model_account_asset_operation +msgid "Asset Operation" +msgstr "" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset.py:0 +#, python-format +msgid "Asset Operations" +msgstr "عمليات الأصول" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Asset Operations in done state" +msgstr "العمليات المعتمدة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__asset_status +msgid "Asset Status" +msgstr "حالة العهد" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_operation.py:0 +#, python-format +msgid "Asset is required to confirm this operation." +msgstr "" + +#. module: exp_asset_custody +#: model:ir.model,name:exp_asset_custody.model_account_asset +msgid "Asset/Revenue Recognition" +msgstr "إثبات الأصل/الربح" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Assets Adjustment Report" +msgstr "تقرير جرد الأصول" + +#. module: exp_asset_custody +#: model:ir.actions.act_window,name:exp_asset_custody.action_account_asset_assignment +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_assignment_form +msgid "Assets Assignment" +msgstr "إسناد عهدة" + +#. module: exp_asset_custody +#: model:ir.actions.act_window,name:exp_asset_custody.action_account_asset_release +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +msgid "Assets Release" +msgstr "إرجاع عهدة" + +#. module: exp_asset_custody +#: model:ir.actions.act_window,name:exp_asset_custody.action_account_asset_transfer +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_transfer_form +msgid "Assets Transfer" +msgstr "نقل العهدة" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset__status__assigned +msgid "Assigned" +msgstr "مسند" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_multi_operation__type__assignment +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__type__assignment +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_asset_assignment +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_multi_asset_assignment +msgid "Assignment" +msgstr "أسناد" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_assignment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Assignment Info" +msgstr "معلومات الإسناد" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.hr_Employee_form_inherit0 +msgid "Assignments" +msgstr "العهد العينية" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_attachment_count +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_attachment_count +msgid "Attachment Count" +msgstr "عدد المرفقات" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__barcode +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__barcode +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Barcode" +msgstr "باركود" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation___barcode_scanned +msgid "Barcode Scanned" +msgstr "باركود" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_assignment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_transfer_form +msgid "Barcode..." +msgstr "الباركود..." + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_adjustment__type__department +msgid "By Department" +msgstr "الإدارة" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_adjustment__type__employee +msgid "By Employee" +msgstr "الموظف" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_adjustment__type__location +msgid "By Location" +msgstr "الموقع" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_multi_operation__state__cancel +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__state__cancel +msgid "Cancel" +msgstr "إلغاء" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_assignment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_transfer_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Confirm" +msgstr "تأكيد" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__create_uid +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__create_uid +msgid "Created by" +msgstr "أنشئ بواسطة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__create_date +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__create_date +msgid "Created on" +msgstr "أنشئ في" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Current" +msgstr "الحالي" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__department_id +msgid "Current Department" +msgstr "الإدارة الحالية" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__employee_id +msgid "Current Employee" +msgstr "الموظف الحالي" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Current Info" +msgstr "المعلومات الحالية" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_form +msgid "Custody Info" +msgstr "معلومات العهدة" + +#. module: exp_asset_custody +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_asset_operation_main +msgid "Custody Operations" +msgstr "عمليات الأصول" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__custody_period +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__custody_period +msgid "Custody Period" +msgstr "فترة العهدة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__custody_type +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__custody_type +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_search +msgid "Custody Type" +msgstr "نوع العهدة" + +#. module: exp_asset_custody +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_asset_custody_operation +msgid "Custody operations" +msgstr "عمليات العهد" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__date +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__date +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Date" +msgstr "التاريخ" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Date:" +msgstr "التاريخ:" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_adjustment__department_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__new_department_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__current_department_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__new_department_id +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_search +msgid "Department" +msgstr "الإدارة" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Description:" +msgstr "الوصف:" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__display_name +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_adjustment__display_name +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__display_name +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__display_name +#: model:ir.model.fields,field_description:exp_asset_custody.field_hr_employee__display_name +msgid "Display Name" +msgstr "الاسم المعروض" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_multi_operation__state__done +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__state__done +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Done" +msgstr "المنتهية" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_multi_operation__state__draft +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__state__draft +msgid "Draft" +msgstr "مسودة" + +#. module: exp_asset_custody +#: model:ir.model,name:exp_asset_custody.model_hr_employee +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_adjustment__employee_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__new_employee_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__current_employee_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__new_employee_id +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_search +msgid "Employee" +msgstr "الموظف" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_follower_ids +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_follower_ids +msgid "Followers" +msgstr "المتابعون" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_channel_ids +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_channel_ids +msgid "Followers (Channels)" +msgstr "المتابعون (القنوات)" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_partner_ids +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_partner_ids +msgid "Followers (Partners)" +msgstr "المتابعون (الشركاء)" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__activity_type_icon +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset__custody_type__general +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__custody_type__general +msgid "General" +msgstr "عام" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__asset_status__good +msgid "Good" +msgstr "جيد" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Group By..." +msgstr "تجميع بـ..." + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_adjustment__id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__id +#: model:ir.model.fields,field_description:exp_asset_custody.field_hr_employee__id +msgid "ID" +msgstr "المُعرف" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_exception_icon +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_exception_icon +msgid "Icon" +msgstr "الأيقونة" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__activity_exception_icon +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "الأيقونة للإشارة إلى استثناء النشاط" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__message_needaction +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__message_unread +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__message_needaction +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__message_unread +msgid "If checked, new messages require your attention." +msgstr "إذا كان محددًا، فهناك رسائل جديدة تحتاج لرؤيتها." + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__message_has_error +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__message_has_sms_error +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__message_has_error +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "إذا كان محددًا، فقد حدث خطأ في تسليم بعض الرسائل." + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_multi_operation__state__in_progress +msgid "In Progress" +msgstr "جاري" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_is_follower +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_is_follower +msgid "Is Follower" +msgstr "متابع" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset____last_update +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_adjustment____last_update +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation____last_update +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation____last_update +#: model:ir.model.fields,field_description:exp_asset_custody.field_hr_employee____last_update +msgid "Last Modified on" +msgstr "آخر تعديل في" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__write_uid +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__write_uid +msgid "Last Updated by" +msgstr "آخر تحديث بواسطة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__write_date +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_adjustment__location_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__new_location_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__current_location_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__new_location_id +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_search +msgid "Location" +msgstr "الموقع" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_main_attachment_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_main_attachment_id +msgid "Main Attachment" +msgstr "المرفقات" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_multi_operation.py:0 +#, python-format +msgid "Make sure you choose an asset in all operation line." +msgstr "" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_multi_operation.py:0 +#, python-format +msgid "Make sure you choose custody period for all operation lines." +msgstr "الرجاء التاكد من إدخال فترة العهدة في جميع العمليات." + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_multi_operation.py:0 +#, python-format +msgid "Make sure you choose custody type for all operation lines." +msgstr "الرجاء التاكد من إدخال نوع العهدة في جميع العمليات." + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_multi_operation.py:0 +#, python-format +msgid "Make sure you enter the return date for all temporary custodies." +msgstr "الرجاء التاكد من إدخال تاريخ الإرجاع للعهد المؤقتة." + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__manual +msgid "Manual" +msgstr "يدوي" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_has_error +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_has_error +msgid "Message Delivery error" +msgstr "خطأ في تسليم الرسائل" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_ids +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_ids +msgid "Messages" +msgstr "الرسائل" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Missing Assets:" +msgstr "الأصول المفقودة:" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__model_id +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Model" +msgstr "النموذج" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__multi_operation_id +msgid "Multi Operation" +msgstr "العمليات المتعددة" + +#. module: exp_asset_custody +#: model:ir.actions.act_window,name:exp_asset_custody.action_multi_asset_assignment +msgid "Multiple Assignment" +msgstr "إسناد العهد" + +#. module: exp_asset_custody +#: model:ir.actions.act_window,name:exp_asset_custody.action_multi_asset_release +msgid "Multiple Release" +msgstr "إرجاع العهد" + +#. module: exp_asset_custody +#: model:ir.actions.act_window,name:exp_asset_custody.action_multi_asset_transfer +msgid "Multiple Transfer" +msgstr "نقل العهد" + +#. module: exp_asset_custody +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_asset_multi_operation +msgid "Multiple operations" +msgstr "العمليات المتعددة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__my_activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__name +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__name +msgid "Name" +msgstr "الإسم" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_transfer_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "New" +msgstr "جديد" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_transfer_tree +msgid "New Department" +msgstr "الإدارة الجديدة" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_transfer_tree +msgid "New Employee" +msgstr "الموظف الجديد" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_transfer_tree +msgid "New Location" +msgstr "الموقع الجديد" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "الموعد النهائي للنشاط التالي" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_summary +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_summary +msgid "Next Activity Summary" +msgstr "ملخص النشاط التالي" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_type_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_type_id +msgid "Next Activity Type" +msgstr "نوع النشاط التالي" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_multi_operation.py:0 +#, python-format +msgid "No asset found with the selected barcode" +msgstr "لم يتم العثور على أصل لهذا الباركود" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__note +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__note +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Note" +msgstr "ملاحظة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_needaction_counter +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_needaction_counter +msgid "Number of Actions" +msgstr "عدد الإجراءات" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset__asset_operation_count +msgid "Number of done asset operations" +msgstr "" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_has_error_counter +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_has_error_counter +msgid "Number of errors" +msgstr "عدد الاخطاء" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__message_needaction_counter +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "عدد الرسائل التي تتطلب إجراء" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__message_has_error_counter +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "عدد الرسائل الحادث بها خطأ في التسليم" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__message_unread_counter +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__message_unread_counter +msgid "Number of unread messages" +msgstr "عدد الرسائل الجديدة" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_operation.py:0 +#, python-format +msgid "Only draft operations can be deleted." +msgstr "لا يمكن حذف العملية الا في الحالة مبدئية" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__operation_ids +msgid "Operation" +msgstr "عملية" + +#. module: exp_asset_custody +#: model:ir.actions.act_window,name:exp_asset_custody.action_account_asset_operation_analysis +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_operation_graph +msgid "Operation Analysis" +msgstr "تحليل العمليات" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_form +msgid "Operations" +msgstr "العمليات" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__state__pending +msgid "Pending" +msgstr "معلق" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset__custody_period__permanent +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__custody_period__permanent +msgid "Permanent" +msgstr "دائمة" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset__custody_type__personal +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__custody_type__personal +msgid "Personal" +msgstr "شخصية" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_hr_employee__petty_cash_counts +msgid "Petty Cash Counts" +msgstr "" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__product_id +msgid "Product" +msgstr "المنتج" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__purpose +msgid "Purpose" +msgstr "الغرض" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_assignment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_transfer_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Reject" +msgstr "رفض" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_multi_operation__type__release +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__type__release +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_asset_release +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_multi_asset_release +msgid "Release" +msgstr "إرجاع" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Release Info" +msgstr "معلومات الإرجاع" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_release_tree +msgid "Release Location" +msgstr "موقع الإرجاع" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__user_id +msgid "Responsible" +msgstr "المسئول" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__responsible_department_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__department_id +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Responsible Department" +msgstr "الإدارة المسئولة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_user_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__responsible_user_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_user_id +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Responsible User" +msgstr "الموظف المسئول" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__return_date +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__return_date +msgid "Return Date" +msgstr "تاريخ الإرجاع" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_has_sms_error +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_has_sms_error +msgid "SMS Delivery error" +msgstr "خطأ في تسليم الرسائل القصيرة" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset__status__scrap +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__asset_status__scrap +msgid "Scrap" +msgstr "تالف" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Serial No" +msgstr "المتسلسل" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_assignment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_transfer_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Set to Draft" +msgstr "تعيين كمسودة" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Signatures:" +msgstr "" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_assignment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_transfer_form +msgid "Start" +msgstr "بدأ" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__state +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__state +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "State" +msgstr "الحالة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__status +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__asset_statuso +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Status" +msgstr "الحالة" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__activity_state +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "الأنشطة المستقبيلة" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__state__submit +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Submit" +msgstr "إرسال" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset__custody_period__temporary +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__custody_period__temporary +msgid "Temporary" +msgstr "مؤقتة" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset.py:0 +#, python-format +msgid "The period of %s is finished %s." +msgstr "فترة %s قد إنتهت %s." + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_multi_operation__type__transfer +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__type__transfer +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_asset_transfer +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_multi_asset_transfer +msgid "Transfer" +msgstr "نقل" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_adjustment__type +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__type +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__type +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Type" +msgstr "النوع" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__activity_exception_decoration +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "نوع النشاط الاستثنائي المسجل." + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Type:" +msgstr "النوع:" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_unread +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_unread +msgid "Unread Messages" +msgstr "الرسائل الجديدة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_unread_counter +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_unread_counter +msgid "Unread Messages Counter" +msgstr "عدد الرسائل الجديدة" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation___barcode_scanned +msgid "Value of the last barcode scanned." +msgstr "قيمة آخر باركود ممسوح ضوئيًا." + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__asset_status__good_v +msgid "Very Good" +msgstr "" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__website_message_ids +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__website_message_ids +msgid "Website Messages" +msgstr "رسائل الموقع" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__website_message_ids +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__website_message_ids +msgid "Website communication history" +msgstr "سجل تواصل الموقع" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_multi_operation.py:0 +#, python-format +msgid "You can not confirm operation without lines." +msgstr "لا يمكن تأكيد العملية دون إدخال التفاصيل" + +#. module: exp_asset_base +#: model:ir.actions.report,name:exp_asset_base.label_barcode_account_asset +msgid "Asset Barcode (ZPL)" +msgstr "باركود الأصل (ZPL)" + +#. module: exp_asset_base +#: model:ir.actions.report,print_report_name:exp_asset_base.report_account_asset_barcode +msgid "'Assets barcode - %s' % (object.name)" +msgstr "'باركود الأصول - %s' % (object.name)" + +#. module: exp_asset_base +#: model:ir.actions.report,name:exp_asset_base.report_account_asset_barcode +msgid "Asset Barcode (PDF)" +msgstr "باركود الأصل (PDF)" + +#. module: exp_asset_base +#: model_terms:ir.ui.view,arch_db:exp_asset_base.report_asset_barcode +msgid "No barcode available" +msgstr "لا يوجد باركود متاح" \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_base/i18n/ar_SY.po b/dev_odex30_accounting/exp_asset_base/i18n/ar_SY.po new file mode 100644 index 0000000..89cf5bc --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/i18n/ar_SY.po @@ -0,0 +1,1481 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * exp_asset_base +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0-20190819\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-03-15 04:52+0000\n" +"PO-Revision-Date: 2021-03-15 04:52+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_asset_operation_count +msgid "# Done Operations" +msgstr "العمليات المعتمدة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_gross_increase_count +msgid "# Gross Increases" +msgstr "الزيادات الإجمالية" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_asset_adjustment_count +msgid "# of Adjustments" +msgstr "الجرد" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:620 +#, python-format +msgid "A gross increase has been created" +msgstr "تم زيادة اجمالي قيمة الاصل" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_operation_gain_account_id +msgid "Account used to write the journal item in case of gain" +msgstr "الحساب المستخدم عند إنشاء القيود في حالة الربح" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_operation_loss_account_id +msgid "Account used to write the journal item in case of loss" +msgstr "الحساب المستخدم عند توليد القيود في حالة الخسارة" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Accounting" +msgstr "الحسابات" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line_adjustment_id +msgid "Adjustment" +msgstr "جرد الأصول" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_adjustment_line_ids +msgid "Adjustment Line" +msgstr "تفاصيل الجرد" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Adjustments" +msgstr "الجرد" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_already_depreciated_amount_import +msgid "Already Depreciated Amount Import" +msgstr "القيمة المهلكة مسبقاً" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_depreciation_amount +msgid "Amount" +msgstr "الزمن" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_asset_parent_id +msgid "An asset has a parent when it is the result of gaining value" +msgstr "الأصل يكون له أب عندما يكون نتيجة لاكتساب القيمة" + +#. module: exp_asset_base +#: selection:account.asset.multi.operation,modify_action:0 +#: selection:account.asset.operation,modify_action:0 +msgid "Assessment" +msgstr "إعادة تقييم" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_category_assessment_gain_account_id +msgid "Assessment Gain Account" +msgstr "حساب أرباح إعادة التقييم" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_category_assessment_loss_account_id +msgid "Assessment Loss Account" +msgstr "حساب خسارة إعادة التقييم" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line_asset_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_asset_id +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_depreciation_asset_id +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_search +msgid "Asset" +msgstr "الأصل" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:656 +#, python-format +msgid "Asset %s" +msgstr "الأصل %s" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_search +msgid "Asset Account" +msgstr "حساب الأصل" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset.py:272 +#: model:ir.actions.act_window,name:exp_asset_base.action_asset_adjustment +#: model:ir.model,name:exp_asset_base.model_account_asset_adjustment +#: model:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_form +#: model:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_line_tree +#: model:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_tree +#, python-format +msgid "Asset Adjustment" +msgstr "جرد الأصول" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_account_asset_adjustment_line +msgid "Asset Adjustment Line" +msgstr "تفاصيل جرد الأصول" + +#. module: exp_asset_base +#: model:res.groups,name:exp_asset_base.group_asset_assessment +msgid "Asset Assessment" +msgstr "إعادة تقييم الأصول" + +#. module: exp_asset_base +#: model:ir.actions.report,name:exp_asset_base.action_report_asset_depr_register_xlsx +msgid "Asset Depreciation register XLSX" +msgstr "Asset Depreciation register XLSX" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_account_asset_counterpart_id +msgid "Asset Gain Account" +msgstr "حساب الأرباح" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_account_asset_id +msgid "Asset Gross Increase Account" +msgstr "حساب زيادة قيمة الأصل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_asset_method_time +msgid "Asset Method Time" +msgstr "طريقة إحتساب مدة الإستهلاك" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_multi_operation_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_form +msgid "Asset Modify" +msgstr "تعديل بيانات الأصل" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_account_asset_multi_operation +msgid "Asset Multi Operation" +msgstr "العمليات المتعددة" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset.py:253 +#, python-format +msgid "Asset Operations" +msgstr "عمليات الأصول" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_search +msgid "Asset Operations in done state" +msgstr "العمليات في الحالة تم" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_asset_picture +msgid "Asset Picture" +msgstr "صورة الأصل" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/reports/asset_register_report_xlsx.py:14 +#: model:ir.actions.act_window,name:exp_asset_base.act_report_asset_register +#: model:ir.ui.menu,name:exp_asset_base.menu_report_asset_register +#, python-format +msgid "Asset Register" +msgstr "سجل الأصول" + +#. module: exp_asset_base +#: model:ir.actions.server,name:exp_asset_base.asset_cron_ir_actions_server +#: model:ir.cron,cron_name:exp_asset_base.asset_cron +#: model:ir.cron,name:exp_asset_base.asset_cron +msgid "Asset Reminder" +msgstr "Asset Reminder" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line_asset_status +msgid "Asset Status" +msgstr "حالة العهد" + +#. module: exp_asset_base +#: sql_constraint:account.asset.asset:0 +msgid "Asset barcode must be unique." +msgstr "يجب أن يكون باكود الأصل فريدً." + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_account_asset_category +msgid "Asset category" +msgstr "فئة الأصل" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_account_asset_depreciation_line +msgid "Asset depreciation line" +msgstr "بند إستهلاك الأصل" + +#. module: exp_asset_base +#: model:ir.actions.report,name:exp_asset_base.action_report_asset_register_xlsx +msgid "Asset register XLSX" +msgstr "Asset register XLSX" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:546 +#, python-format +msgid "Asset sold or disposed. Accounting entry awaiting for validation." +msgstr "بيع/إتلاف الاصل. القيد المحاسبي في إنتظار الإعتماد." + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_account_asset_asset +msgid "Asset/Revenue Recognition" +msgstr "أصل/ إيرادات مقدمة" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_adjustment +msgid "Assets Adjustment" +msgstr "جرد الاصول" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_account_asset_graph +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_graph +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_graph +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_pivot +msgid "Assets Analysis" +msgstr "تحليل الأصول" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_account_asset_location +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_location +msgid "Assets Locations" +msgstr "المواقع" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_management_main +msgid "Assets Management" +msgstr "إدارة الأصول" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_account_asset_manufacturer +msgid "Assets Manufacturer" +msgstr "الشركات المُصنعة" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_multi_operation_form +msgid "Assets Operation" +msgstr "عمليات الأصول" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_operation_main +msgid "Assets Operations" +msgstr "عمليات الأصول" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_account_asset_receive +msgid "Assets Receive" +msgstr "إستلام الأصل" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_asset +msgid "Assets Register" +msgstr "سجل الأصل" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_assent_category +msgid "Assets Types" +msgstr "نوع الأصل" + +#. module: exp_asset_base +#: selection:account.asset.multi.operation,type:0 +#: selection:account.asset.operation,type:0 +msgid "Assignment" +msgstr "إسناد" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_barcode +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line_barcode +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_barcode +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_barcode +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_barcode +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_search +msgid "Barcode" +msgstr "باركود" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_multi_operation_form +msgid "Barcode..." +msgstr "بارمود..." + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Basic Info" +msgstr "Basic Info" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_basic_operation +msgid "Basic operations" +msgstr "العمليات الأساسية" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_book_value +msgid "Book Value" +msgstr "القيمة الدفترية" + +#. module: exp_asset_base +#: selection:account.asset.adjustment,type:0 +msgid "By Category" +msgstr "التصنيف" + +#. module: exp_asset_base +#: selection:account.asset.adjustment,type:0 +msgid "By Department" +msgstr "الإدارة" + +#. module: exp_asset_base +#: selection:account.asset.adjustment,type:0 +msgid "By Employee" +msgstr "الموظف" + +#. module: exp_asset_base +#: selection:account.asset.adjustment,type:0 +msgid "By Location" +msgstr "الموقع" + +#. module: exp_asset_base +#: selection:account.asset.adjustment,type:0 +msgid "By Product" +msgstr "المنتج" + +#. module: exp_asset_base +#: selection:account.asset.adjustment,state:0 +#: selection:account.asset.multi.operation,state:0 +#: selection:account.asset.operation,state:0 +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_modify_tree +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_receive_tree +msgid "Cancel" +msgstr "إلغاء" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/reports/asset_depreciation_report_xlsx.py:46 +#, python-format +msgid "Categories" +msgstr "فئات" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_category_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_category_id +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_category_ids +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_search +msgid "Category" +msgstr "الفئة" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Category of asset" +msgstr "فئة الأصل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_children_ids +msgid "Children" +msgstr "الفروع" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location_code +msgid "Code" +msgstr "الكود" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_report_asset_register_form +msgid "Compute" +msgstr "حساب" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Compute Depreciation" +msgstr "حساب الإهلاك" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_configuration_main +msgid "Configurations" +msgstr "الإعدادات" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_modify_tree +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_multi_operation_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_receive_tree +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_sell_dispose_tree +msgid "Confirm" +msgstr "تأكيد" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_search +msgid "Cost Center" +msgstr "مركز التكلفة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_account_analytic_id +msgid "Cost Centers" +msgstr " مراكز التكلفة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_create_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line_create_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location_create_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer_create_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_create_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_create_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_create_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_depreciation_create_uid +msgid "Created by" +msgstr "أنشئ بواسطة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_create_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line_create_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location_create_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer_create_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_create_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_create_date +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_create_date +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_depreciation_create_date +msgid "Created on" +msgstr "أنشئ في" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_currency_id +msgid "Currency" +msgstr "العملة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_location_id +msgid "Current Location" +msgstr "الموقع الحالي" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_purchase_tree +msgid "Custody Status" +msgstr "حالة العهدة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_invoice_id +msgid "Customer Invoice" +msgstr "الفاتورة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_date +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_depreciation_date +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_search +msgid "Date" +msgstr "التاريخ" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_value_residual +msgid "Depreciable Amount" +msgstr "القيمة القابلة للإستهلاك" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Depreciated Amount" +msgstr "قيمة الإستهلاك" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_depreciation_ids +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Depreciation" +msgstr "إستهلاك" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_account_depreciation_id +msgid "Depreciation Account" +msgstr "حساب الإستهلاك" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_depreciation_amount +msgid "Depreciation Amount" +msgstr "قيمة الإستهلاك" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_account_asset_depreciation_analysis +#: model:ir.ui.menu,name:exp_asset_base.menu_account_Depreciation_graph +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_depreciation_graph +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_depreciation_pivot +msgid "Depreciation Analysis" +msgstr "تحليل الإستهلاكات" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Depreciation Board" +msgstr "لوحة الإستهلاكات" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_account_depreciation_expense_id +msgid "Depreciation Expense Account" +msgstr "حساب مصروفات الإستهلاك" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Depreciation Information" +msgstr "معلومات الإستهلاك" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Depreciation Lines" +msgstr "بنود الإستهلاك" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_depreciation_number_import +msgid "Depreciation Number Import" +msgstr "عدد الإستهلاكات السابقة" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_report_asset_register_form +msgid "Depreciations" +msgstr "الإستهلاكات" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_form +msgid "Details" +msgstr "التفاصيل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line_display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location_display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer_display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_abstract_report_xlsx_display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_depreciation_report_xlsx_display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_depreciation_display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_display_name +#: model:ir.model.fields,field_description:exp_asset_base.field_report_report_asset_register_xlsx_display_name +msgid "Display Name" +msgstr "الاسم المعروض" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:531 +#, python-format +msgid "Disposal" +msgstr "إتلاف" + +#. module: exp_asset_base +#: selection:account.asset.multi.operation,sell_dispose_action:0 +#: selection:account.asset.operation,sell_dispose_action:0 +msgid "Dispose" +msgstr "إتلاف" + +#. module: exp_asset_base +#: selection:account.asset.adjustment,state:0 +#: selection:account.asset.multi.operation,state:0 +#: selection:account.asset.operation,state:0 +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_search +msgid "Done" +msgstr "منتهي" + +#. module: exp_asset_base +#: selection:account.asset.adjustment,state:0 +#: selection:account.asset.multi.operation,state:0 +#: selection:account.asset.operation,state:0 +msgid "Draft" +msgstr "مسودة" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/reports/asset_depreciation_report_xlsx.py:43 +#, python-format +msgid "Duration" +msgstr "الفترة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_end_date +msgid "End Date" +msgstr "تاريخ الإنتهاء" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_method_end +msgid "Ending date" +msgstr "تاريخ الإنتهاء" + +#. module: exp_asset_base +#: selection:account.asset.multi.operation,modify_action:0 +#: selection:account.asset.operation,modify_action:0 +msgid "Enhancement" +msgstr "تحسين" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line_exist +msgid "Exist?" +msgstr "موجود?" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Existing Depreciation Schedule" +msgstr "الإستهلاكات التي تمت مسبقاً" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Existing Depreciations" +msgstr "الإستهلاكات السابقة" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "First Depreciation Date" +msgstr "تاريخ أول إستهلاك" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_first_depreciation_date_import +msgid "First Depreciation Date Import" +msgstr "Fتاريخ أول إستهلاك" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/reports/asset_depreciation_report_xlsx.py:14 +#, python-format +msgid "Fixed Asset Register" +msgstr "سجل الأصول" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/reports/asset_depreciation_report_xlsx.py:43 +#, python-format +msgid "From: " +msgstr "من: " + +#. module: exp_asset_base +#: selection:account.asset.operation,gain_or_loss:0 +msgid "Gain" +msgstr "ربح" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_category_gain_account_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_gain_account_id +msgid "Gain Account" +msgstr "حساب الأرباح" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_gain_or_loss +msgid "Gain Or Loss" +msgstr "ربح/خسارة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_gain_value +msgid "Gain Value" +msgstr "قيمة الربح" + +#. module: exp_asset_base +#: selection:account.asset.adjustment.line,asset_status:0 +msgid "Good" +msgstr "جيد" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset.py:294 +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +#, python-format +msgid "Gross Increase" +msgstr "زيادة القيمة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_gross_increase_value +msgid "Gross Increase Value" +msgstr "قيمة الزيادة الإجمالية" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_search +msgid "Group By..." +msgstr "تجميع حسب.." + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_id +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_abstract_report_xlsx_id +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_depreciation_report_xlsx_id +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_depreciation_id +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_id +#: model:ir.model.fields,field_description:exp_asset_base.field_report_report_asset_register_xlsx_id +msgid "ID" +msgstr "المعرف" + +#. module: exp_asset_base +#: selection:account.asset.adjustment,state:0 +#: selection:account.asset.multi.operation,state:0 +msgid "In Progress" +msgstr "جاري" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_asset_depreciation_number_import +msgid "In case of an import from another software, \n" +" provide the number of depreciations already done before starting with Odoo." +msgstr "في حالة الإستيراد من برنامج آخر, \n" +" قم بإدخال عدد الإستهلاكات التي تم تنفيذها قبل البدأ ب أودو." + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_asset_already_depreciated_amount_import +msgid "In case of an import from another software, \n" +" you might need to use this field to have the right depreciation table report. \n" +" This is the value that was already depreciated with entries not computed from this model" +msgstr "في حالة الإستيراد من برنامج آخر, \n" +" قد تحتاج لإدخال هذه الحقول للحصول على تقرير إستهلاكات صحيح. \n" +" هذه القيمة تتم معالجتها بإستخدام القيود المحاسبية" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_asset_first_depreciation_date_import +msgid "In case of an import from another software, provide the first depreciation date in it." +msgstr "في حالة الإستيراد من برنامج آخر, قم يتحديد تاريخ أول إستهلاك تم مسبقاً." + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_form +msgid "Increase Accounts" +msgstr "حساب الزيادة" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Invoice" +msgstr "الفاتورة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_invoice_line_id +msgid "Invoice Line" +msgstr "عنصر الفاتور" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_form +msgid "Invoicing" +msgstr "تحرير الفواتير" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_product_product_is_asset +#: model:ir.model.fields,field_description:exp_asset_base.field_product_template_is_asset +msgid "Is Asset" +msgstr "عبارة عن أصل" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Items" +msgstr "العناصر" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment___last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line___last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location___last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer___last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation___last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation___last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_abstract_report_xlsx___last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_depreciation_report_xlsx___last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register___last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_depreciation___last_update +#: model:ir.model.fields,field_description:exp_asset_base.field_report_report_asset_register_xlsx___last_update +msgid "Last Modified on" +msgstr "آخر تعديل في" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line_write_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_write_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location_write_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer_write_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_write_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_write_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_depreciation_write_uid +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_write_uid +msgid "Last Updated by" +msgstr "آخر تحديث بواسطة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line_write_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_write_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location_write_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer_write_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_write_date +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_write_date +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_depreciation_write_date +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_category_limit +msgid "Limit" +msgstr "حد" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Lock" +msgstr "اغلاق" + +#. module: exp_asset_base +#: selection:account.asset.operation,gain_or_loss:0 +msgid "Loss" +msgstr "خسارة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_category_loss_account_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_loss_account_id +msgid "Loss Account" +msgstr "حساب الخسارة" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:102 +#, python-format +msgid "Make sure you choose an asset in all operation line." +msgstr "تأكد من إختيار الأصل في جميع عناصر العملية." + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:108 +#, python-format +msgid "Make sure you have a depreciable amount when you modify asset." +msgstr "تأكد من غدخال القيمة القابلة للإستهلاك في عملية تعديل بيانات الأصل." + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:110 +#, python-format +msgid "Make sure you have not depreciable amount when you modify asset." +msgstr "تأكد من إدخال قيمة التخريد في عملية تعديل بيانات الأصل." + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_manual +msgid "Manual" +msgstr "يدوى" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_manufacturer_id +#: model:ir.ui.menu,name:exp_asset_base.menu_account_manufacturer +msgid "Manufacturer" +msgstr "المُصنع" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:106 +#, python-format +msgid "Method end is required when you modify asset with end method time." +msgstr "يجب إدخال تاريخ إيقاف الإستهلاك إذا كانت طريق ." + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:104 +#, python-format +msgid "Method number is required when you modify asset with number method time." +msgstr "يجب إدخال عدد الغستهلاكات في حال كانت طريقة الإستهلاك بإستخدام عدد القيود ." + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_model +msgid "Model" +msgstr "النموذج" + +#. module: exp_asset_base +#: selection:account.asset.multi.operation,type:0 +#: selection:account.asset.operation,type:0 +#: model:ir.ui.menu,name:exp_asset_base.menu_account_modification +msgid "Modification" +msgstr "التعديلات" + +#. module: exp_asset_base +#: selection:account.asset.multi.operation,modify_action:0 +#: selection:account.asset.operation,modify_action:0 +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Modify" +msgstr "تحرير" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_modify_action +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_modify_action +msgid "Modify Action" +msgstr "نوع التعديل" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_asset_modify +#: model:ir.actions.act_window,name:exp_asset_base.action_asset_modify_wiz +#: model:ir.model,name:exp_asset_base.model_account_asset_modify +msgid "Modify Asset" +msgstr "تعديل الأصل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_multi_operation_id +msgid "Multi Operation" +msgstr "عمليات متعددة" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_asset_multi_operation +msgid "Multiple Operations" +msgstr "عمليات متعددة" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_multi_operation +msgid "Multiple operations" +msgstr "عمليات متعددة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location_name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_manufacturer_name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_name +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_name +msgid "Name" +msgstr "الاسم" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_need_date +msgid "Need Date" +msgstr "تحتاج لتاريخ" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_form +msgid "New Values" +msgstr "القيمة الجديدة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_next_maintenance_date +msgid "Next Maintenance Date" +msgstr "تاريخ الصيانة القادم" + +#. module: exp_asset_base +#: selection:account.asset.operation,gain_or_loss:0 +msgid "No" +msgstr "لأ" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_adjustment.py:87 +#: code:addons/exp_asset_base/models/account_asset_operation.py:124 +#, python-format +msgid "No asset found with the selected barcode" +msgstr "لم يتم العثور على أصل بالباركود المدخل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_salvage_value +msgid "Not Depreciable Amount" +msgstr "قيمة التخريد" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_note +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_note +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_form +msgid "Note" +msgstr "ملاحظة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_method_number +msgid "Number of Depreciations" +msgstr "عدد الإستهلاكات" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_asset_asset_adjustment_count +msgid "Number of adjustments" +msgstr "عدد عمليات الجرد" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_asset_gross_increase_count +msgid "Number of assets made to increase the value of the asset" +msgstr "عدد عمليات الزيادة في القيمة الغجمالية للأصل" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_asset_asset_operation_count +msgid "Number of done asset operations" +msgstr "عدد العمليات" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:367 +#, python-format +msgid "Only draft operations can be deleted." +msgstr "يمكن حذف العمليات المبدئية فقط." + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_depreciation_line_operation +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_operation_ids +msgid "Operation" +msgstr "عملية" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_account_asset_operation_analysis +#: model:ir.ui.menu,name:exp_asset_base.menu_account_operation_graph +msgid "Operation Analysis" +msgstr "تحليل العمليات" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Operations" +msgstr "العمليات" + +#. module: exp_asset_base +#: selection:account.asset.location,type:0 +msgid "Ordinary" +msgstr "عادي" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_parent_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location_parent_id +msgid "Parent" +msgstr "الأصل" + +#. module: exp_asset_base +#: selection:account.asset.operation,state:0 +msgid "Pending" +msgstr "في الإنتظار" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_depreciation_period +msgid "Period" +msgstr "الفترة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_method_period +msgid "Period Length" +msgstr "طول الفترة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_product_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_product_id +msgid "Product" +msgstr "المنتج" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_product_template +msgid "Product Template" +msgstr "قالب المنتج" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_products +msgid "Products" +msgstr "المنتجات" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Purchase Info" +msgstr "معلومات الشراء" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_graph +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_pivot +msgid "Purchase Value" +msgstr "قيمة الشراء" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Purchase value" +msgstr "قيمة الشراء" + +#. module: exp_asset_base +#: selection:account.asset.operation,type:0 +msgid "Receive" +msgstr "إستلام" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_assent_receive +msgid "Receive Assets" +msgstr "إستلام الأصل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_receive_date +msgid "Receive Date" +msgstr "تاريخ الإستلام" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_category_location_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_location_id +msgid "Receive location" +msgstr "موقع إستلام الأصل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_ref +msgid "Reference" +msgstr "المرجع" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_multi_operation_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_receive_tree +msgid "Reject" +msgstr "رفض" + +#. module: exp_asset_base +#: selection:account.asset.multi.operation,type:0 +#: selection:account.asset.operation,type:0 +msgid "Release" +msgstr "إعادة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_depreciation_report_id +msgid "Report" +msgstr "التقرير" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_reporting_main +msgid "Reporting" +msgstr "اعداد التقرير " + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Residual" +msgstr "صافي المتبقي" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_user_id +msgid "Responsible" +msgstr "مسئول" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_category_department_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_responsible_department_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_department_id +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_search +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_search +msgid "Responsible Department" +msgstr "الإدارة المسئولة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_responsible_user_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_category_responsible_user_id +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_responsible_user_id +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_search +msgid "Responsible User" +msgstr "الموظف المسئول" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:531 +#, python-format +msgid "Sale" +msgstr "بيع" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_form +msgid "Save" +msgstr "حفظ" + +#. module: exp_asset_base +#: selection:account.asset.adjustment.line,asset_status:0 +msgid "Scrap" +msgstr "تالف" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_select_invoice_line_id +msgid "Select Invoice Line" +msgstr "إختيار عنصر الفاتورة" + +#. module: exp_asset_base +#: selection:account.asset.multi.operation,sell_dispose_action:0 +#: selection:account.asset.operation,sell_dispose_action:0 +msgid "Sell" +msgstr "بيع" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_sell_dispose_action +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_sell_dispose_action +msgid "Sell Dispose Action" +msgstr "نو العملية" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Sell or Dispose" +msgstr "بيع أو تخريد" + +#. module: exp_asset_base +#: selection:account.asset.multi.operation,type:0 +#: selection:account.asset.operation,type:0 +msgid "Sell/Disposal" +msgstr "بيع/إتلاف" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_sell_dispose +msgid "Sell/Dispose" +msgstr "بيع/إتلاف" + +#. module: exp_asset_base +#: model:ir.actions.act_window,name:exp_asset_base.action_asset_sell_dispose +#: model:ir.actions.act_window,name:exp_asset_base.action_asset_sell_dispose_wiz +#: model:ir.model,name:exp_asset_base.model_account_asset_sell_dispose +msgid "Sell/Dispose Asset" +msgstr "بيع/إتلاف الأصل" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_line_serial_no +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_serial_no +msgid "Serial No" +msgstr "الرقم التسلسلي" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_service_provider_id +msgid "Service Provider" +msgstr "مزود الخدمة" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_modify_tree +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_multi_operation_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_receive_tree +msgid "Set to Draft" +msgstr "تعيين كمسودة" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_modify_tree +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_receive_tree +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_sell_dispose_tree +msgid "Setup" +msgstr "الإعداد" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.asset_adjustment_form +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_multi_operation_form +msgid "Start" +msgstr "بدأ" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_report_asset_register_start_date +msgid "Start Date" +msgstr "تاريخ البدء" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_state +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_state +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_state +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_search +msgid "State" +msgstr "المحافظة" + +#. module: exp_asset_base +#: selection:account.asset.operation,state:0 +msgid "Submit" +msgstr "إرسال" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_asset_book_value +msgid "Sum of the depreciable value, the salvage value and the book value of all value increase items" +msgstr "مجموع قيم الإستهلاك, قيمة التخريد و القية الدفترية لجميع عناصر زيادة القيمة" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_suspend_depreciation +msgid "Suspend Depreciation" +msgstr "إيقاف الإستهلاك" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_operation_gain_value +msgid "Technical field to know if we should display the fields for the creation of gross increase asset" +msgstr "Technical field to know if we should display the fields for the creation of gross increase asset" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_operation_gain_or_loss +msgid "Technical field to know is there was a gain or a loss in the selling of the asset" +msgstr "Technical field to know is there was a gain or a loss in the selling of the asset" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset.py:348 +#, python-format +msgid "The %s with barcode %s has schedule maintenance today ,please follow." +msgstr "%s بالكود %s لديه صيانة مجدولة اليوم,الرجاء المتابعة." + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_asset_children_ids +msgid "The children are the gains in value of this asset" +msgstr "The children are the gains in value of this asset" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_operation_invoice_id +msgid "The disposal invoice is needed in order to generate the closing journal entry." +msgstr "فاتورة الإتلاف مطلوبة بإنشاء قيد الإغلاق." + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset.py:358 +#, python-format +msgid "The warrant period of %s with barcode %s has end!" +msgstr "فترة الضمان للأصل %s بالباركود %s قد إنتهت!" + +#. module: exp_asset_base +#: model:ir.model.fields,help:exp_asset_base.field_account_asset_operation_invoice_line_id +msgid "There are multiple lines that could be the related to this asset" +msgstr "There are multiple lines that could be the related to this asset" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Time Method Based On" +msgstr "طريقة الوقت مبنية على" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/reports/asset_depreciation_report_xlsx.py:43 +#, python-format +msgid "To: " +msgstr "الى: " + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_invoice_amount +msgid "Total" +msgstr "الإجمالي " + +#. module: exp_asset_base +#: selection:account.asset.multi.operation,type:0 +#: selection:account.asset.operation,type:0 +msgid "Transfer" +msgstr "نقل العهدة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_adjustment_type +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location_type +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_multi_operation_type +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_type +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_search +msgid "Type" +msgstr "النوع" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Unlock" +msgstr "إعادة الفتح" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:640 +#, python-format +msgid "Value decrease for: %s" +msgstr "تقليل قيمة: %s" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:591 +#: code:addons/exp_asset_base/models/account_asset_operation.py:597 +#, python-format +msgid "Value increase for: %s" +msgstr "زيادة قيمة: %s" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Vendor" +msgstr "المورد" + +#. module: exp_asset_base +#: model:ir.ui.menu,name:exp_asset_base.menu_account_asset_vendors +msgid "Vendors" +msgstr "الموردين" + +#. module: exp_asset_base +#: selection:account.asset.location,type:0 +msgid "View" +msgstr "عرض" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Warranty" +msgstr "ضمان" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_warranty_contract +msgid "Warranty Contract" +msgstr "عقد الضمان" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_warranty_end_date +msgid "Warranty End Date" +msgstr "تاريخ نهاية الضمان" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_asset_warranty_period +msgid "Warranty Period(Months)" +msgstr "فترة الضمان (شهور)" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:457 +#, python-format +msgid "You can't automate the journal entry for an asset that has a running gross increase. Please use 'Dispose' on the increase(s)." +msgstr "لا يمكنك إنشاء قيود محاسبية تلقائيا لاصل لديه قيم زيادة تحت التنفيذ. الرجاء إتلاف جميع الزيادات أولاً." + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:114 +#, python-format +msgid "You have to choose invoice line when selling invoice has more than one line." +msgstr "يجب إختيار عنصر الفاتورة في حال كانت فاتورة البيع تحتوي على أكثر من عنصر." + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_adjustment.py:66 +#, python-format +msgid "You should enter the asset status for all assets that marked as exist." +msgstr "يجب تحديد حالة الأصل لجميع الأصول الموجودة." + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_account_asset_location +msgid "account.asset.location" +msgstr "account.asset.location" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_account_asset_manufacturer +msgid "account.asset.manufacturer" +msgstr "account.asset.manufacturer" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_account_asset_operation +msgid "account.asset.operation" +msgstr "account.asset.operation" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_account_asset_receive +msgid "account.asset.receive" +msgstr "account.asset.receive" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "e.g. Laptop iBook" +msgstr "مثال: كمبيوتر محمول" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:112 +#, python-format +msgid "invoice is required when you selling the asset." +msgstr "يجب إختيار فاتورة البيع." + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_operation_form +msgid "months" +msgstr "أشهر" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_report_asset_abstract_report_xlsx +msgid "report.asset_abstract_report_xlsx" +msgstr "report.asset_abstract_report_xlsx" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_report_asset_depreciation_report_xlsx +msgid "report.asset_depreciation_report_xlsx" +msgstr "report.asset_depreciation_report_xlsx" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_report_report_asset_register_xlsx +msgid "report.report_asset_register_xlsx" +msgstr "report.report_asset_register_xlsx" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_report_asset_register +msgid "report_asset_register" +msgstr "report_asset_register" + +#. module: exp_asset_base +#: model:ir.model,name:exp_asset_base.model_report_asset_register_depreciation +msgid "report_asset_register_depreciation" +msgstr "report_asset_register_depreciation" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_location_account_analytic_id +msgid "Cost Center" +msgstr "مركز التكلفة" + +#. module: exp_asset_base +#: model:ir.model.fields,field_description:exp_asset_base.field_account_asset_operation_move_id +msgid "move" +msgstr "القيد" + +#. module: exp_asset_base +#: code:addons/exp_asset_base/models/account_asset_operation.py:178 +#, python-format +msgid "Asset should be one on lines." +msgstr "يجب ان يظهر الﻷصل مرة واحدو فقط في العملية" + +#. module: exp_asset_base +#: model:ir.ui.view,arch_db:exp_asset_base.view_account_asset_asset_form +msgid "Receive" +msgstr "إستلام" diff --git a/dev_odex30_accounting/exp_asset_base/models/__init__.py b/dev_odex30_accounting/exp_asset_base/models/__init__.py new file mode 100644 index 0000000..f360068 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/models/__init__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +# © Copyright (C) 2021 Expert Co. Ltd() + +from . import account_asset +from . import account_asset_adjustment +from . import asset_modify +from . import asset_pause +from . import asset_sell diff --git a/dev_odex30_accounting/exp_asset_base/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/exp_asset_base/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd4271c01d4a142fc7e89f9b7d3eda079b3b1400 GIT binary patch literal 503 zcmZvZyH3L}7=?f5(pIJ2%VkFDKwT~a17hF-P$jl3mPt&LlEjsrpq7Ql;1LjSlQHVb z)U8stPW(=a)JRxI$KN@zl0V5;zuyI1H*Ggu0eCUCkmo zS^6PY$wbMS@H0(iAQsnS+@!p?ydBk4wO3=dA2dp*G!SpBK6}`T#k_tk_RO`QIJSs2 zWh_dgjIq&tx$E3vnaAQ@^>7~ZN%RzLV-rF)9Ux}~oF1x#^P;H|PKu^VI4+thVNm=h HW&ZasqnVCO literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_base/models/__pycache__/account_asset.cpython-311.pyc b/dev_odex30_accounting/exp_asset_base/models/__pycache__/account_asset.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..355bc9aad350b08a65e5ba2c40fca52e701ea63c GIT binary patch literal 15348 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 Qp$eT(S>3Z2V6X}MFEpEtk^lez literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_base/models/__pycache__/account_asset_adjustment.cpython-311.pyc b/dev_odex30_accounting/exp_asset_base/models/__pycache__/account_asset_adjustment.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57b6a2cad203d1cf65aa8434b19e8c072acdac4e GIT binary patch literal 7190 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 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_base/models/__pycache__/asset_pause.cpython-311.pyc b/dev_odex30_accounting/exp_asset_base/models/__pycache__/asset_pause.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6147190e1817f8fff3151a3a99fecb89a2de445 GIT binary patch literal 2281 zcmb7F&u<$=6rNr0`sW6xO&df=TZam{rok?yl$HWgl{5v3hDePfw52SIXHsvv_PVp{ zP+O^Lp&lX>2@Xi@G2#%Y+5>+A2mS!3id1V(NO0liDm|bc5bw=;t&mhm9k0K6^Ua&t zneV-s{b^_@O`x1g=#{@?g#3YxsOWuTdm4cYHBn_wQH)WQ{9ZKge8`e(O?>>u3(E>{QBlFbl-)i6012=s{gN^?z+h*#&hw*+hOOOWU{-#!7A=e_yX znPO;3_T&kxuR27aMA@8-E(31_nH4QC?vfQUO|HInOIcBtpdFU=ommu- z1UxXKWO=A;fX{=0pF-A-u8{S?1sVBaO;s9mcKJi@X|n}Iq-C5fJkI=8@Z|>q3L3{N zPUx}|4gvHE{cG+7tf2Bk*cIoj>~ZSjf^xYqJSplycHznRk3a(!W9rWUK$eV-^@x&s zPr~X<*Vw=I>0@K!kumY}!ow>aV`9@dyJej1$fuhf`L6YC>)yNTr#oYBY-W#dWsi4~ z$EC8fg%OdoteRbAmL<}b1xeg+(KamWM#FadJ-T!Ok}|){ojR@(20FD0gKdeF1^baM z9K!=AUT!(?sNLiRWRjQcTJt2{15%pQ<-si=Wjg{s{3ycf2$KN!!xWU-aQv7^NPyx0 z1JEA)y2dN*3*C`i`;+eQq0W(0o$Nd9kGjKS?T>%YjIN$uJ9p3hW&YRGznyzLHUDU8 zesgMJYignMCGBL`W`=ELSbMsgJ-oWScKhD#9wBGuR6tYx0;`JZVl`Yr|{=JsVE7LbBV~8*i3|6 zQO>DuWLi};V!Dy6K@`n&`E-JJYp<9J9j4Tv8DEwaQNQuR5^!D$m*NSR5(u9XiI55r zk%VT1RG5TQ5rI=`<^q0>L`V&ZlIXMAl@QDb{=6quTg6vL>K|~=Vk@BkDg60db&RV% zXp;uAZAJinanRUUr7>2ev57R37P1{UcdUS2p9Z$&QVms{tz;*81^9MVY23#6;-$B@ zJ=?v)gC_X%o>XI%rgqXn_K;2@fwsLX5#WVCpSNiX@2g}V+5b}BX2x4u_Y6l4{E;UI zNf+qtu9{`b7TyH#zQ(M6sET(x>3P7Vc96qBTS*e=PLO_OZdWi%(o2q1?g2UafLnp# zrvVF>YGX3HgAS0WunIZ0MWVgxEn#@i@k)%6zAaK6<|geci1cFipi8S2V3q zCu22fvO4xiY^+e9l~pZi%~C}sg%;M3GnTrbT8qi7dPmjWD3eU9q|hK|GDcpvlB}mN z`CfOIH)bv7l&&7B>ok&Fo@QocQ|U_dNZnngC0lH4FB@czHiGq371g?g%($&8WB$@*fZge$Nt*3o}ov;p~myUWc% z={<8LKClZvmJnP~(HGnrU(JWS8v@Hro5&`8^NZeDBdhev+Wf3spmS>PAGcC%qc$J$5AR8wsY`OO%DQ$Gf>#xsywKcAEk-^?I?S*XzOk zN#+*6iJsEr>=cpD6q*NuJxm6D=w2owy~uqw@wcna@RcI>0v8I=sD>!ha$d7wiMS-q z4dG@(tA?m%&M+0XX2`41ohTvF7!Ndu5VEZF3%v7i(h2lJ){#-P$$`huZml)~7= ztRi{3WKB}NUP(12T~UZaphq$&0RhX9W)xkau>X<;G8xS4h$(Q*{c!WQyP)8>UFHC0y%XJPJC zkpOs77Hp*EG)2Mz6DBBI5`bGH(v&w{s%S8Cg3GXGVR>wS3M0X6%dqvQ2|#9mSMFrA zJWg?1LvkO7cO#rw&+0+A@RKzQ#o(IocROi zjVcl%`V+3e4P5|=E$nwg7jaZ@1>JCkF~i+a+C*kCgQk(K@Y4w;Gpnl^fIUkg5LNTK zaU1;xd;{=!TLy?R8-e>k4aLxU=sD=e=s93SY%(MQemW693`FR-i4aU9OsG6dpR2Sg!nR%*wc(8)+pMt^_HASaC##&=A zYd^%9ZtJ(iK7lr)Km-CDoGvC#Ns<_NDDFogQMOmf17EIcKd_slK#JV+*0v3fueErO zE}dWRIri+*r;}?vgLaSkPx15f&cz$fMSXR|a7GN9nrkEG(s?JAuw#i0u`IY12$(oC zb3cYkWhxSwnVy0K1+#gnZv?!#D9ob$ywR@C0s+s z;W`9<8S*x#0w`!%^vM^m0jZw(0+*}XJZs`_Jm?Z3sbX=%4H-GuU(^FVeNedD7Gy22 zq#O1ybbf@d;-< zW#2UHabttyCioG-Hm$EY&f->_h*0!gw(#?7MjnnOT{kRA&O>?=q$t7B z#ZnV#8UwNJgE6Ebg>pF(x8S2I844hu3l9VoMSmKE&b@@3~mt=S$T-80U zZZnZgM3^7YI)((t-l}5ole(@E@9ehgw0|Euke>Ly^!vG9* zrUe-3xP>D?q23~69Vm=802R5|UJ&qp%qQGh$U0oZ;_`fX)Q%ANSmvB-~N zH1_hym5Tv@Ltqg05TSI95=G`5O|hX#b8mb7YL3fjQ6)B(EabkK`bbL>>JJ*55>eftQ{|g6m=+r01aq zUpS^rw`NM#WIdy}vCa7lBpVoh={e*Jv5Xm`loW*EZfF!bH=)qaQ`4K3B!S8NI}ktc z*3=%_;DA8bZQ13tBmhO*r-Z+Zf7I$6J?9)9Up+kG9GC3jt{IK z>{*UDjr;7zed|p-A9XrSy`Sv+hwNl-c;8lV@WD0?;oRd0ro(kYRv-wfz7fWeWtGKim) zK63>cvAl~3Kq*j?tLn8V?mf;3jMRb)XDIMmhj=`))K=%88+uhrOr2i)l`8% zsu+#^I{vHpYIK(q-DO92t@oe$YyD@7YyFq){>#hOqdT^A+}YV@!*4R>OwIv--sRsG zY@Is#Jph^kjiuOnyyfA&FXD-{c;eHZ&#ya|WapA@#}lh@!-*Sq)L=juOLV%?bXu3Q zN;>VNAe>i2s8Yq07p78S*qnmgX4#eA_w|Dy$a+*?{xK&GK3OEg6J}B*u7%u-+Jto z;_!M)XYt~CV~5?@XU9(zN7ftLif=uS?^#-Sc>nQz*oXeh=*}tOCKj`ThDBo*&mEw! zH9$eCNm_1w)cK^t?!SV+rpeW&NvCPDIQqPyV`ZcHb4dV{)})(&?DALv1BRuQNqgP*Ga= z85ZZn0xB8~jfS9@2wlZu=d}>3y%s{X*FvB+n91w*Sv1+GFpa`lK|$f1n8)J2ILL&D znD7u29s=R#E&G;FIxYL`{geLh)@@|x-$AMC;w>z;%eWGt@JgVtW3hJ3fZOe^d)^P2 zE(l}z+N;8KET)AyEE?u^ed5zB+7kJF47Fl*O$9j!@HgEZe+!*1Szt%m-~R#)7$p=x_#)> zYWTDhKD{AC!*CV>LGCl9p6y~d2XA~iWj@a!K9;D3q!+#gGH+pCOEHgN>6;tJktBQ- zQkbWkEVFaNm+*fOm^ht9Uc5^(*MU!eUf?)GHR!{0!Mq0qE*w0+5#{)9o9p`jzjf|_ bUHRLH^zpcqm(%6Qqu5t$?CWpgVAJ~_4K`)q literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_base/models/account_asset.py b/dev_odex30_accounting/exp_asset_base/models/account_asset.py new file mode 100644 index 0000000..86509f8 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/models/account_asset.py @@ -0,0 +1,294 @@ +# -*- coding: utf-8 -*- +# © Copyright (C) 2021 Expert Co. Ltd() + +from odoo import models, fields, api, _ +from datetime import datetime +from odoo.osv import expression +from dateutil.relativedelta import relativedelta +from odoo.tools import DEFAULT_SERVER_DATE_FORMAT + + +class AccountAssetManufacturer(models.Model): + _name = 'account.asset.manufacturer' + _inherit = ["mail.thread", "mail.activity.mixin"] + _description = 'Asset Manufacturer' + + name = fields.Char(required=True, tracking=True) + + +class AccountAssetLocation(models.Model): + _name = 'account.asset.location' + _inherit = ["mail.thread", "mail.activity.mixin"] + _description = 'Asset Location' + _parent_name = "parent_id" + _parent_store = True + _rec_name = 'complete_name' + _order = 'complete_name' + + name = fields.Char(required=True, tracking=True) + complete_name = fields.Char('Asset Location', compute='_compute_complete_name', tracking=True, store=True , recursive=True) + code = fields.Char(required=True, tracking=True) + type = fields.Selection(selection=[('ordinary', 'Ordinary'), ('view', 'View')], default='ordinary', required=True, + tracking=True) + parent_id = fields.Many2one(string='Parent', comodel_name='account.asset.location', domain=[('type', '=', 'view')], + tracking=True) + parent_path = fields.Char(index=True, tracking=True) + child_id = fields.One2many('account.asset.location', 'parent_id', 'Child Locations', tracking=True) + + @api.depends('name', 'parent_id.complete_name') + def _compute_complete_name(self): + for location in self: + if location.parent_id: + location.complete_name = '%s / %s' % (location.parent_id.complete_name, location.name) + else: + location.complete_name = location.name + + +class AccountAssetAsset(models.Model): + _name = 'account.asset' + _inherit = ['account.asset', "mail.thread", "mail.activity.mixin"] + + asset_picture = fields.Binary( + states={'draft': [('readonly', False)], 'unlock': [('readonly', False)]}, + readonly=True, + ) + serial_no = fields.Char( + states={'draft': [('readonly', False)], 'unlock': [('readonly', False)]}, + readonly=True, + ) + model = fields.Char( + states={'draft': [('readonly', False)], 'unlock': [('readonly', False)]}, + readonly=True, + ) + manufacturer_id = fields.Many2one( + comodel_name='account.asset.manufacturer', + states={'draft': [('readonly', False)], 'unlock': [('readonly', False)]}, + readonly=True, + ) + barcode = fields.Char( + states={'draft': [('readonly', False)], 'unlock': [('readonly', False)]}, + readonly=True, index=True, copy=False, + ) + note = fields.Text( + states={'draft': [('readonly', False)], 'unlock': [('readonly', False)]}, + readonly=True, + ) + receive_date = fields.Date( + states={'draft': [('readonly', False)]}, + readonly=True, + ) + service_provider_id = fields.Many2one( + comodel_name='res.partner', + states={'draft': [('readonly', False)], 'unlock': [('readonly', False)]}, + readonly=True, + ) + next_maintenance_date = fields.Date( + states={'draft': [('readonly', False)], 'unlock': [('readonly', False)]}, + readonly=True, + ) + warranty_period = fields.Integer( + states={'draft': [('readonly', False)], 'unlock': [('readonly', False)]}, + readonly=True, string="Warranty Period(Months)" + ) + warranty_end_date = fields.Date( + compute='_compute_warranty_end_date', + readonly=True, store=True, + ) + warranty_contract = fields.Binary( + states={'draft': [('readonly', False)], 'unlock': [('readonly', False)]}, + readonly=True, ) + value_residual = fields.Monetary( + string='Depreciable Value', + compute='_compute_value_residual', + store=True) + product_id = fields.Many2one(comodel_name='product.product', + domain=[('property_account_expense_id.can_create_asset', '=', True), + ('property_account_expense_id.account_type', '=', 'asset_fixed')], + states={'draft': [('readonly', False)], 'unlock': [('readonly', False)]}, + readonly=True, tracking=True) + responsible_dept_id = fields.Many2one(comodel_name='hr.department', string='Responsible Department', + states={'draft': [('readonly', False)], 'model': [('readonly', False)], + 'unlock': [('readonly', False)]}, + readonly=True, + default=lambda self: self.env.user.employee_id.department_id.id, + tracking=True) + responsible_user_id = fields.Many2one( + comodel_name='res.users', + states={'draft': [('readonly', False)], 'model': [('readonly', False)], 'unlock': [('readonly', False)]}, + readonly=True, default=lambda self: self.env.user, tracking=True) + asset_adjustment_count = fields.Integer( + compute='_asset_adjustment_count', + string='# of Adjustments', + help="Number of adjustments") + + status = fields.Selection( + selection=[('new', 'New'), ('available', 'Available')], + default='new', tracking=True) + location_id = fields.Many2one(comodel_name='account.asset.location', string='Current Location', tracking=True) + state = fields.Selection(selection_add=[('unlock', 'Unlock')]) + limit = fields.Float(tracking=True) + + _sql_constraints = [ + ('asset_barcode_uniq', 'unique (barcode)', 'Asset barcode must be unique.') + ] + + def validate(self): + """Validate asset and set it to running state""" + self.ensure_one() # تأكد أن العملية على record واحد فقط + + # تحقق من الشروط + + # غيّر الحالة (tracking سيعمل تلقائياً) + self.write({'state': 'open'}) + + # رسالة + asset_type_labels = { + 'purchase': _('Asset'), + 'sale': _('Deferred revenue'), + 'expense': _('Deferred expense'), + } + + label = asset_type_labels.get(self.asset_type, _('Asset')) + message = _('%s has been validated and is now running.') % label + + self.message_post(body=message) + + return True + + # يجب تحويله إلى analytic_distribution + @api.onchange('location_id') + def onchange_location_id(self): + if self.location_id and self.location_id.analytic_distribution: + self.analytic_distribution = self.location_id.analytic_distribution + + # @api.onchange('location_id') + # def onchange_location_id(self): + # if self.analytic_distribution and self.location_id.account_analytic_id: + # self.analytic_distribution = self.location_id.account_analytic_id.id + + # def action_asset_modify(self): + # """ Returns an action opening the asset modification wizard. + # """ + # self.ensure_one() + # return { + # 'name': _('Modify Asset'), + # 'view_mode': 'form', + # 'res_model': 'account.asset.modify', + # 'type': 'ir.actions.act_window', + # 'target': 'current', + # 'context': { + # 'default_asset_id': self.id, + # }, + # } + + def action_asset_pause(self): + """ Returns an action opening the asset pause wizard.""" + self.ensure_one() + return { + 'name': _('Pause Asset'), + 'view_mode': 'form', + 'res_model': 'asset.pause', + 'type': 'ir.actions.act_window', + 'target': 'current', + 'context': { + 'default_asset_id': self.id, + }, + } + + def action_set_to_close(self): + """ Returns an action opening the asset pause wizard.""" + self.ensure_one() + + return { + 'name': _('Sell Asset'), + 'view_mode': 'form', + 'res_model': 'asset.sell', + 'type': 'ir.actions.act_window', + 'target': 'current', + 'context': { + 'default_asset_id': self.id, + }, + } + + def act_unlock(self): + self.state = 'unlock' + + def act_lock(self): + self.state = 'open' + + def _asset_adjustment_count(self): + for asset in self: + asset.asset_adjustment_count = len( + self.env['account.asset.adjustment.line'].search([('asset_id', '=', asset.id)])) + + def open_asset_adjustment(self): + return { + 'name': _('Asset Adjustment'), + 'view_mode': 'tree', + 'res_model': 'account.asset.adjustment.line', + 'type': 'ir.actions.act_window', + 'domain': [('asset_id', '=', self.id)], + 'flags': {'search_view': True, 'action_buttons': False}, + } + + @api.depends('acquisition_date', 'warranty_period') + def _compute_warranty_end_date(self): + for asset in self: + if asset.acquisition_date: + asset.warranty_end_date = asset.acquisition_date + relativedelta(months=asset.warranty_period) + + @api.depends('name', 'barcode') + def name_get(self): + return [(r.id, r.name + (r.barcode and '-' + r.barcode or '')) for r in self] + + @api.model + def name_search(self, name, args=None, operator='ilike', limit=100): + args = args or [] + domain = [] + if name: + domain = ['|', ('barcode', operator, name), ('name', operator, name)] + if operator in expression.NEGATIVE_TERM_OPERATORS: + domain = ['&', '!'] + domain[1:] + assets = self.search(domain + args, limit=limit) + return assets.name_get() + + @api.model + def create(self, values): + if values.get('state', False) != 'model': + values['serial_no'] = self.env['ir.sequence'].with_context( + ir_sequence_date=values.get('acquisition_date', fields.Date.today())).next_by_code('asset.seq') + return super(AccountAssetAsset, self).create(values) + + def action_save_model(self): + action = super(AccountAssetAsset, self).action_save_model() + action['context']['default_asset_type'] = self.asset_type + return action + + @api.model + def _asset_cron(self): + today = fields.Date.today() + for asset in self.search([('next_maintenance_date', '=', today)]): + self.env['mail.activity'].sudo().create({ + 'res_model_id': self.env.ref('account_asset.model_account_asset_asset').id, + 'res_id': asset.id, + 'user_id': asset.responsible_user_id.id, + 'activity_type_id': self.env.ref('mail.mail_activity_data_todo').id, + 'summary': _('The %s with barcode %s has schedule maintenance today ,please follow.') % ( + asset.name, asset.barcode), + 'date_deadline': asset.next_maintenance_date, + }) + for asset in self.search([('warranty_end_date', '=', today)]): + self.env['mail.activity'].sudo().create({ + 'res_model_id': self.env.ref('account_asset.model_account_asset_asset').id, + 'res_id': asset.id, + 'user_id': asset.responsible_user_id.id, + 'activity_type_id': self.env.ref('mail.mail_activity_data_todo').id, + 'summary': _('The warrant period of %s with barcode %s has end!') % (asset.name, asset.barcode), + 'date_deadline': asset.warranty_end_date, + }) + + @api.onchange('model_id', 'original_value') + def _onchange_model_id(self): + super(AccountAssetAsset, self)._onchange_model_id() + if self.model_id and self.original_value <= self.model_id.limit: + self.method_number = 0 diff --git a/dev_odex30_accounting/exp_asset_base/models/account_asset_adjustment.py b/dev_odex30_accounting/exp_asset_base/models/account_asset_adjustment.py new file mode 100644 index 0000000..93dc1c1 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/models/account_asset_adjustment.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- +# © Copyright (C) 2021 Expert Co. Ltd() + +from odoo import api, fields, models, exceptions, _ +from odoo.exceptions import UserError + + +class AccountAssetAdjustment(models.Model): + _name = 'account.asset.adjustment' + _inherit = ['barcodes.barcode_events_mixin',"mail.thread", "mail.activity.mixin"] + _description = 'Asset Adjustment' + + name = fields.Char( + states={'draft': [('readonly', False)]}, + readonly=True, required=True,tracking=True + ) + date = fields.Date( + default=fields.Date.context_today, + index=True, copy=False, readonly=True, required=True,tracking=True, + states={'draft': [('readonly', False)]} + ) + type = fields.Selection( + selection=[('product', 'By Product'), + ('model', 'By Model')], + states={'draft': [('readonly', False)]}, + readonly=True,tracking=True + ) + product_id = fields.Many2one( + comodel_name='product.product', + domain=[('property_account_expense_id.can_create_asset', '=', True), + ('property_account_expense_id.account_type', '=', 'asset_fixed')], + states={'draft': [('readonly', False)]}, + readonly=True,tracking=True + ) + model_id = fields.Many2one( + comodel_name='account.asset', + domain=[('asset_type', '=', 'purchase'), ('state', '=', 'model')], + states={'draft': [('readonly', False)]}, + readonly=True,tracking=True + ) + barcode = fields.Char( + states={'in_progress': [('readonly', False)]}, + readonly=True,tracking=True + ) + adjustment_line_ids = fields.One2many( + 'account.asset.adjustment.line', 'adjustment_id', + states={'in_progress': [('readonly', False)]}, + readonly=True,tracking=True + ) + state = fields.Selection( + selection=[('draft', 'Draft'), + ('in_progress', 'In Progress'), + ('done', 'Done'), + ('cancel', 'Cancel')], + required=True, default='draft',tracking=True + ) + + def build_domain(self): + return (self.type == 'product' and [('product_id', '=', self.product_id.id)]) or \ + (self.type == 'model' and [('model_id', '=', self.model_id.id)]) or [] + + def act_progress(self): + domain = self.build_domain() + assets = self.env['account.asset'].search(domain+[('asset_type', '=', 'purchase'), + ('state', '!=', 'model'), ('parent_id', '=', False)]) + self.adjustment_line_ids = [(0, 0, {'asset_id': s.id}) for s in assets] + self.state = 'in_progress' + + def act_done(self): + if self.adjustment_line_ids.search([('adjustment_id', '=', self.id), ('exist', '=', True), ('asset_status2', '=', False)]): + raise UserError(_('You should enter the asset status for all assets that marked as exist.')) + self.barcode = False + self.state = 'done' + + def act_cancel(self): + self.state = 'cancel' + + def act_draft(self): + self.state = 'draft' + self.adjustment_line_ids.unlink() + + @api.onchange('type') + def onchange_type(self): + self.product_id = False + self.model_id = False + + def on_barcode_scanned(self, barcode): + if barcode: + line = self.adjustment_line_ids.filtered(lambda x: x.barcode == barcode) + if not line: + raise UserError(_('No asset found with the selected barcode')) + for l in line: + l.exist = True + + @api.onchange('barcode') + def onchange_barcode(self): + self.on_barcode_scanned(self.barcode) + + +class AccountAssetAdjustmentLine(models.Model): + _name = 'account.asset.adjustment.line' + _description = 'Asset Adjustment Line' + + adjustment_id = fields.Many2one(comodel_name='account.asset.adjustment',tracking=True) + asset_id = fields.Many2one(comodel_name='account.asset',tracking=True) + barcode = fields.Char(related='asset_id.barcode',tracking=True) + serial_no = fields.Char(related='asset_id.serial_no',tracking=True) + asset_status = fields.Selection(selection=[('good', 'Good'), ('scrap', 'Scrap')],tracking=True) + asset_status2 = fields.Many2one( + comodel_name='asset.state2', + string='Asset Status',tracking=True) + exist = fields.Boolean(string="Exist?",tracking=True) +class AccountAssestatus(models.Model): + _name = 'asset.state2' + name = fields.Char(string='Name') +# diff --git a/dev_odex30_accounting/exp_asset_base/models/asset_modify.py b/dev_odex30_accounting/exp_asset_base/models/asset_modify.py new file mode 100644 index 0000000..57c11ad --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/models/asset_modify.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- + + +from odoo import api, fields, models, _ +from odoo.exceptions import UserError + + +class AssetModify(models.Model): + _name = 'account.asset.modify' + _description = 'Modify Asset' + _inherit = ['mail.thread', 'mail.activity.mixin'] + + name = fields.Text(string='Reason',tracking=True) + asset_id = fields.Many2one(string="Asset", comodel_name='account.asset', domain="[('asset_type', '=', 'purchase'), ('state', '!=', 'model'), ('parent_id', '=', False)]",required=True, help="The asset to be modified by this wizard", ondelete="cascade",tracking=True) + method_number = fields.Integer(string='Number of Depreciations', required=True,tracking=True) + method_period = fields.Selection([('1', 'Months'), ('12', 'Years')], string='Number of Months in a Period', help="The amount of time between two depreciations",tracking=True) + value_residual = fields.Monetary(string="Depreciable Amount", help="New residual amount for the asset",tracking=True) + salvage_value = fields.Monetary(string="Not Depreciable Amount", help="New salvage amount for the asset",tracking=True) + currency_id = fields.Many2one(related='asset_id.currency_id') + date = fields.Date(default=fields.Date.today(), string='Date',tracking=True) + need_date = fields.Boolean(compute="_compute_need_date") + gain_value = fields.Boolean(compute="_compute_gain_value", help="Technical field to know if we should display the fields for the creation of gross increase asset") + account_asset_id = fields.Many2one('account.account', string="Asset Gross Increase Account",tracking=True) + account_asset_counterpart_id = fields.Many2one('account.account',tracking=True) + account_depreciation_id = fields.Many2one('account.account',tracking=True) + account_depreciation_expense_id = fields.Many2one('account.account',tracking=True) + state = fields.Selection(selection=[('draft', 'Draft'),('confirm', 'Confirmed'),('approve', 'Approved'),('done', 'Done')],default='draft',readonly=True,tracking=True) + + @api.model + def create(self, vals): + if 'asset_id' in vals: + asset = self.env['account.asset'].browse(vals['asset_id']) + if asset.depreciation_move_ids.filtered(lambda m: m.state == 'posted' and not m.reversal_move_id and m.date > fields.Date.today()): + raise UserError(_('Reverse the depreciation entries posted in the future in order to modify the depreciation')) + if 'method_number' not in vals: + vals.update({'method_number': len(asset.depreciation_move_ids.filtered(lambda move: move.state != 'posted')) or 1}) + if 'method_period' not in vals: + vals.update({'method_period': asset.method_period}) + if 'salvage_value' not in vals: + vals.update({'salvage_value': asset.salvage_value}) + if 'value_residual' not in vals: + vals.update({'value_residual': asset.value_residual}) + if 'account_asset_id' not in vals: + vals.update({'account_asset_id': asset.account_asset_id.id}) + if 'account_depreciation_id' not in vals: + vals.update({'account_depreciation_id': asset.account_depreciation_id.id}) + if 'account_depreciation_expense_id' not in vals: + vals.update({'account_depreciation_expense_id': asset.account_depreciation_expense_id.id}) + return super(AssetModify, self).create(vals) + + def act_confirm(self): + self.state = 'confirm' + + def act_approve(self): + self.state = 'approve' + + def act_draft(self): + self.state = 'draft' + + def modify(self): + """ Modifies the duration of asset for calculating depreciation + and maintains the history of old values, in the chatter. + """ + old_values = { + 'method_number': self.asset_id.method_number, + 'method_period': self.asset_id.method_period, + 'value_residual': self.asset_id.value_residual, + 'salvage_value': self.asset_id.salvage_value, + } + + asset_vals = { + 'method_number': self.method_number, + 'method_period': self.method_period, + 'value_residual': self.value_residual, + 'salvage_value': self.salvage_value, + } + if self.need_date: + asset_vals.update({ + 'prorata_date': self.date, + }) + if self.env.context.get('resume_after_pause'): + asset_vals.update({'state': 'open'}) + self.asset_id.message_post(body=_("Asset unpaused")) + else: + self = self.with_context(ignore_prorata=True) + + current_asset_book = self.asset_id.value_residual + self.asset_id.salvage_value + after_asset_book = self.value_residual + self.salvage_value + increase = after_asset_book - current_asset_book + + new_residual = min(current_asset_book - min(self.salvage_value, self.asset_id.salvage_value), self.value_residual) + new_salvage = min(current_asset_book - new_residual, self.salvage_value) + residual_increase = max(0, self.value_residual - new_residual) + salvage_increase = max(0, self.salvage_value - new_salvage) + + if residual_increase or salvage_increase: + move = self.env['account.move'].create({ + 'journal_id': self.asset_id.journal_id.id, + 'date': fields.Date.today(), + 'line_ids': [ + (0, 0, { + 'account_id': self.account_asset_id.id, + 'debit': residual_increase + salvage_increase, + 'credit': 0, + 'name': _('Value increase for: %(asset)s', asset=self.asset_id.name), + }), + (0, 0, { + 'account_id': self.account_asset_counterpart_id.id, + 'debit': 0, + 'credit': residual_increase + salvage_increase, + 'name': _('Value increase for: %(asset)s', asset=self.asset_id.name), + }), + ], + }) + move.action_post() + asset_increase = self.env['account.asset'].create({ + 'name': self.asset_id.name + ': ' + self.name, + 'currency_id': self.asset_id.currency_id.id, + 'company_id': self.asset_id.company_id.id, + 'asset_type': self.asset_id.asset_type, + 'method': self.asset_id.method, + 'method_number': self.method_number, + 'method_period': self.method_period, + 'acquisition_date': self.date, + 'value_residual': residual_increase, + 'salvage_value': salvage_increase, + 'original_value': residual_increase + salvage_increase, + 'account_asset_id': self.account_asset_id.id, + 'account_depreciation_id': self.account_depreciation_id.id, + 'account_depreciation_expense_id': self.account_depreciation_expense_id.id, + 'journal_id': self.asset_id.journal_id.id, + 'parent_id': self.asset_id.id, + 'original_move_line_ids': [(6, 0, move.line_ids.filtered(lambda r: r.account_id == self.account_asset_id).ids)], + }) + asset_increase.validate() + + subject = _('A gross increase has been created') + ': %s' % (asset_increase.id, asset_increase.name) + self.asset_id.message_post(body=subject) + if increase < 0: + if self.env['account.move'].search([('asset_id', '=', self.asset_id.id), ('state', '=', 'draft'), ('date', '<=', self.date)]): + raise UserError('There are unposted depreciations prior to the selected operation date, please deal with them first.') + move = self.env['account.move'].create(self.env['account.move']._prepare_move_for_asset_depreciation({ + 'amount': -increase, + 'asset_id': self.asset_id, + 'move_ref': _('Value decrease for: %(asset)s', asset=self.asset_id.name), + 'date': self.date, + 'asset_remaining_value': 0, + 'asset_depreciated_value': 0, + 'asset_value_change': True, + })).action_post() + + asset_vals.update({ + 'value_residual': new_residual, + 'salvage_value': new_salvage, + }) + self.asset_id.write(asset_vals) + self.asset_id.compute_depreciation_board() + self.asset_id.children_ids.write({ + 'method_number': asset_vals['method_number'], + 'method_period': asset_vals['method_period'], + }) + for child in self.asset_id.children_ids: + child.compute_depreciation_board() + tracked_fields = self.env['account.asset'].fields_get(old_values.keys()) + changes, tracking_value_ids = self.asset_id._message_track(tracked_fields, old_values) + if changes: + self.asset_id.message_post(body=_('Depreciation board modified') + '
' + self.name, tracking_value_ids=tracking_value_ids) + return self.write({'state':'done'}) + + @api.depends('asset_id', 'value_residual', 'salvage_value') + def _compute_need_date(self): + for record in self: + value_changed = record.value_residual + record.salvage_value != record.asset_id.value_residual + record.asset_id.salvage_value + record.need_date = (self.env.context.get('resume_after_pause') and record.asset_id.prorata) or value_changed + + @api.depends('asset_id', 'value_residual', 'salvage_value') + def _compute_gain_value(self): + for record in self: + record.gain_value = record.value_residual + record.salvage_value > record.asset_id.value_residual + record.asset_id.salvage_value diff --git a/dev_odex30_accounting/exp_asset_base/models/asset_pause.py b/dev_odex30_accounting/exp_asset_base/models/asset_pause.py new file mode 100644 index 0000000..9a0598b --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/models/asset_pause.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- + + +from odoo import api, fields, models, _ + + +class AssetPause(models.Model): + _name = 'asset.pause' + _description = 'Pause Asset' + _inherit = ['mail.thread', 'mail.activity.mixin'] + _rec_name = 'asset_id' + + date = fields.Date(string='Pause date', required=True, default=fields.Date.today(),tracking=True) + asset_id = fields.Many2one('account.asset', domain="[('asset_type', '=', 'purchase'), ('state', '!=', 'model'), ('parent_id', '=', False)]",required=True,tracking=True) + state = fields.Selection(selection=[('draft', 'Draft'),('confirm', 'Confirmed'),('approve', 'Approved'),('done', 'Done')],default='draft',readonly=True,tracking=True) + + def act_confirm(self): + self.state = 'confirm' + + def act_approve(self): + self.state = 'approve' + + def act_draft(self): + self.state = 'draft' + + def do_action(self): + for record in self: + record.asset_id.pause(pause_date=record.date) + return self.write({'state':'done'}) diff --git a/dev_odex30_accounting/exp_asset_base/models/asset_sell.py b/dev_odex30_accounting/exp_asset_base/models/asset_sell.py new file mode 100644 index 0000000..1f234b3 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/models/asset_sell.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- + + +from odoo import api, fields, models, _ +from odoo.exceptions import UserError + + +class AssetSell(models.Model): + _name = 'asset.sell' + _description = 'Sell Asset' + _inherit = ['mail.thread', 'mail.activity.mixin'] + _rec_name = 'asset_id' + + asset_id = fields.Many2one('account.asset', domain="[('asset_type', '=', 'purchase'), ('state', '!=', 'model'), ('parent_id', '=', False)]",required=True,tracking=True) + company_id = fields.Many2one('res.company', default=lambda self: self.env.company) + + action = fields.Selection([('sell', 'Sell'), ('dispose', 'Dispose')], required=True, default='sell',tracking=True) + invoice_id = fields.Many2one('account.move', string="Customer Invoice", help="The disposal invoice is needed in order to generate the closing journal entry.", domain="[('move_type', '=', 'out_invoice'), ('state', '=', 'posted')]",tracking=True) + invoice_line_id = fields.Many2one('account.move.line', help="There are multiple lines that could be the related to this asset", domain="[('move_id', '=', invoice_id), ('exclude_from_invoice_tab', '=', False)]",tracking=True) + select_invoice_line_id = fields.Boolean(compute="_compute_select_invoice_line_id") + gain_account_id = fields.Many2one('account.account', domain="[('deprecated', '=', False), ('company_id', '=', company_id),('type','!=','view')]", related='company_id.gain_account_id', help="Account used to write the journal item in case of gain", readonly=False,tracking=True) + loss_account_id = fields.Many2one('account.account', domain="[('deprecated', '=', False), ('company_id', '=', company_id)]", related='company_id.loss_account_id', help="Account used to write the journal item in case of loss", readonly=False,tracking=True) + + gain_or_loss = fields.Selection([('gain', 'Gain'), ('loss', 'Loss'), ('no', 'No')], compute='_compute_gain_or_loss', help="Technical field to know is there was a gain or a loss in the selling of the asset",tracking=True) + state = fields.Selection(selection=[('draft', 'Draft'),('confirm', 'Confirmed'),('approve', 'Approved'),('done', 'Done')],default='draft',readonly=True,tracking=True) + + def act_confirm(self): + self.state = 'confirm' + + def act_approve(self): + self.state = 'approve' + + def act_draft(self): + self.state = 'draft' + + @api.depends('invoice_id', 'action') + def _compute_select_invoice_line_id(self): + for record in self: + record.select_invoice_line_id = record.action == 'sell' and len(record.invoice_id.invoice_line_ids) > 1 + + @api.onchange('action') + def _onchange_action(self): + if self.action == 'sell' and self.asset_id.children_ids.filtered(lambda a: a.state in ('draft', 'open') or a.value_residual > 0): + raise UserError(_("You cannot automate the journal entry for an asset that has a running gross increase. Please use 'Dispose' on the increase(s).")) + + @api.depends('asset_id', 'invoice_id', 'invoice_line_id') + def _compute_gain_or_loss(self): + for record in self: + line = record.invoice_line_id or len(record.invoice_id.invoice_line_ids) == 1 and record.invoice_id.invoice_line_ids or self.env['account.move.line'] + if record.asset_id.value_residual < abs(line.balance): + record.gain_or_loss = 'gain' + elif record.asset_id.value_residual > abs(line.balance): + record.gain_or_loss = 'loss' + else: + record.gain_or_loss = 'no' + + def do_action(self): + self.ensure_one() + invoice_line = self.env['account.move.line'] if self.action == 'dispose' else self.invoice_line_id or self.invoice_id.invoice_line_ids + return self.asset_id.set_to_close(invoice_line_id=invoice_line, date=invoice_line.move_id.invoice_date) diff --git a/dev_odex30_accounting/exp_asset_base/reports/__init__.py b/dev_odex30_accounting/exp_asset_base/reports/__init__.py new file mode 100644 index 0000000..954b437 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/reports/__init__.py @@ -0,0 +1,4 @@ +from . import abstract_report_xlsx +from . import asset_register_report_xlsx +#from . import asset_depreciation_report_xlsx +#from . import asset_register_report \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_base/reports/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/exp_asset_base/reports/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdf3267f9285464dace3e6329d176e8cb77fdd78 GIT binary patch literal 361 zcmZ3^%ge<81SagP8S{bkV-N=hn4pZ$azMs(h7^Vr#vF!R#wbQc5St0eW{P40vYCS! zG+ACU0u^a8-V#YnDlREXOfHEpN-fAQDv7ViDXsvDOC=T;r-B62GmA@7i;!jgG?{NP z6fpz!7qI||l?!qO45)fXd{I#G>4QqWrAXTZlX-=wL5hu_=AP*Mn1BnmJjEsyo7?ducq8khv7qFoscAy>r DMBZt7 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_base/reports/__pycache__/abstract_report_xlsx.cpython-311.pyc b/dev_odex30_accounting/exp_asset_base/reports/__pycache__/abstract_report_xlsx.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a03e20a8f828daac2b8dc75d13a53e356a44a086 GIT binary patch literal 31080 zcmeHwYit`=mL@5QWbq-9k|>FiD2aMYmaM1cNOt^?ZCRFOD=(*$c49EJinioPqPj@M zHZ9F~25GdC@k}(?9z>J%Al$)hn(1V=HQ3HZvpc=(T@0`R7MNubwGdI*00suVjox3% zrW=^{pWSorttwU(i?XCRL2qL!%5l}LbKmEl^WAfAUH+)J*kOX}kj*l4IchTfBRwJU_&qb%D*W@2L>R1009)AFtgiV*ttm$$AYli3rmy6iK%a&EsH8WfECUe=! zTHZ8Wwy{>A3~K{wXBnUl)(+IkI)J)ZC(vTn1+;`M2I^)@fO=Rr&{Ea|w2UnUTF#aM z^|IwaD_AekO11)M6EmZDN~&Hm{m)nJ>3MGqj0iqgSIbE;Jo`KD-#=VlPMMZp9lpa^Dk*M#HgS zNMZ=m(BQ4P=&g9I#G(r8kr~CB{1KfRK34KGo0iSc9)(k)dpfcZjfECs z!TIofgu8vIvq-c=mlneuhoUEXuS1*MjBu}CjYM7#MiyhUz%N>t7THiN+*v3VMZKt;Ha1{i~s9xR-WM zv{&vLbszRD-sW(a#oKd5pvS0^#lReW8puE0HGSds{*Q|Gq?dR12=1OO_vy6zH18f0 z++(Xn8OHUF^KECUqAgjJ@*d=w9)ameF+CY~`Kt3Ph;N$4o|i8x+z=^ffnFs88V5E0 zXTEP)DOxrqWKPY$%jV@GtyDlCni5Kns+pGymkT~A&~mR>fO|J`WCcD$Ia)5%%Fv1p zIMp>%ilFCQ1`UD@iFII$=v_iqY)UM=S++nsSiWCSt%Pdxg!onx-;}_1%(Y2pQw9%oMmfn+N=piseP)` zA~NzAgwZ(@4#z~>bYyO69>$`Li`)z@M&RaJgqsh=qM+uBV04B!FJ!@$0r_PE-jyRk z5#TC-bUH%*vDw&MSS*nOuSse9Aj5?)2MR~#1Em!UFT_Nz zHaaa}C&Rh0mRNJH3W#WnTqW8@bV_x@=20F0Q&d)l^-Vsi@9W)zZIhr?twlZ343D+%7TMi?6UoY?L7kvGz#hJ3ot+E5@ zvIEJd__9HvY;e_8qU97#8hY_{`_r-a5+tIo9vo~h3?9e}&@JkyYAXy0lWN;eE` zy#Ap1!N7xN;qY0$VO(e!2ZnK;@q@D4V(QaO{W=t>OJKTEOxMH4COIK|8%Q&OL~ZhQ zo;e~gM^elY5~nuJ)UJ;wUg4R3f$2{%{Uo$C&9o+FHf)>TO-OH2U?x+{Bze=AW*QR* zH)?t2n7|xM$$y*&+HYE|pD=*v(1{kgs%FIrt`WFp{8eBp>X_lKTbPdgsZ>t>t1p_g%{cY$;kx zwhSy!dFUQ!s!^5=Oo!*@0+N{s#3F&|C5{6H9FVP2k3&|Hmu4c-u);bWS_oVX2bQ8? zHV|0|gdi16D$73lMrd{}bagHpCB%gTN0j6O2c)!uS0i(*K`=LaeI}MKoJ0!F#zJ$m z(*`^<;Sd|dr=gxLA8H1muymxx2Z!uSYcZbrw*DJ_wH6X>ea(Yo|+eQXwIQ7hTc= zEtvd@l&@HNMT;r=)ST*?i)GRqRbPo-ZJ3lsxi*w$s$->%F3Pz}k8&RLk(RwiO3k1* zxJsxtg0jN!!W)1=07ZqC<^b7{K{0(hILnF-gg!J0u>@hy!qU9*%!a3D=RU>z+yj9ziuI<^dZWbkfkFPy0)E>|HTekeYX@BoV)nM^T& zb)`1m*o$ejI>3{(*u8yY!@cmRYJ@63SZJG zlyq*7)HMM>1R?>h6jKj>6cnj}3r=(hD7ptX0E)~SCVg z%K<8s=B^!pIF*XG7!AN|f^>58UEqwq0tBEwV`}V9P6&a+TY;z3fv5SvaUpPg+hn#s zXQq^Q`B%@aUCX$t)@_0-u;uDXySkF+HfA1JAKd(VH}85@a6OwMf7^xGXt{V8=c1(R z{|nqe*Mk=?+bIbM%e{a{)xj*xTGh`nOijArO;I*A9eS|DVO|S!`~udR$x$XL_W*>%+l*u@cb5Db@P4%dgh-d&yEZN`{w<~>&2*p;*#%cq z##Joee&KSjIoBryPaE%Q7hLVhM&8wxah1yN6UPKs|Chx!yW>|TAlrm^OpxpZ)iDB7 zpJ?QnX8Ht^Mz!iuNr*|2zyA$oL)F7ALO+{z{am2#XLzqt90`b*dtn+XIVsXU>txiD z<jm89FSCyeSL797R7fkuz7>w#i|q5|(l`!5_$3A_PK3pLmoyS%r0{UELW^ zEfKqnr&PZE!c)FBnXn7q1H7k8@N^|Zyr(zgsg&O*Rs_!w$YL>AKp-HCKs=^m-?}|d zmNa;~0!l`Tm#Y=g!8Gp0&YSl`dx0GH;+~vm;_xd0TaPTbC_T z-7s(FLknnf_@7=xlNahnxLG~I?|mQB({WhU9IOq-5EHUPQ`2D-0j*9{I{@&2T#C;Xx0?4581L)}s%tmD>p-jqDkOFKz%z0}Ot|c5Cxf31bTo{=M65Rjt1mSK1{s!FtTlc|^5R~A1Ul_>-q8W~ zL`#SarbOJK6~<{+<^+@EL_3Dll)nS1i57AnMO%PV7jn`0OCtou8}pkusi%Jr*rKf< z44`#NOx}uBCKG7c3YPVj+IAuyU^>WDjYG~GDLH=Y(6PlG|qc>Sq{L%jFU#`k#d z@TxuIZ{9X}P$>X;>%!{T+E702~Lyo{$hDB)Z zGXPX*xz^!pPbtYNnrNlPq4570bN~?qm}hd6@Bq_JoV#cyn7D9<>vh}|FlfCyVwt+% zY0B|d17(@Z_G3)!9Uugz1-g#-AlU0Om zX;)iTSycfNTe~HA0&-BQ{g~i6{-xc5N(;z#mbmsaK~Ti?6A;?nO;EK^>x^m5eC0<( zU<+4@G|(Rxm{l-KyHpEH;6=vZ2VCa5WnF-8u+impGR(MP057U3Z2|{d&ILTGsV;yu zOLj40(aa(Mv}ZvW>&V{c42wm`yGY7=G3Lx>1;fRutrK@-*?a@w9=*81{gu?9e6AhJ z_hA3I%nS7NG0TSgG8~xMe^) ztz5S0`*6*C?**utN2=KrlpMhjxwvtddf zsYVf#<)FB1gefxLy%XlzYuH7sH|zwsyhHKxF1&aby4{5Ok)D z*jbbuG`NdS^ho=Pg4emo(js{4iQh)FQujYM3Ow9NWOPdl0r)Fci%Wq^{;MM5#|9KOK~4yxsY&^*jO$X*T!qKi(P z2?gmc1_IT&8Hh(L2zM1zu;Z#)khFr6+)7Ii4*G8pk~Bc$qJtJ1Q;*l>wKMqoGsq=6 z0s1h%ed)AUehHI`N@`!e@Yb$RCM!2=pEU5^5y3mMI+pR(f8coEkvNl_U`b@gCEmhj~b6-QknL2oa_nj1cC$|fWODiAx+Xesdwgqm%C0h|l*aUCK zmUk%a9m@Ec6BB~3C*y0#`0Cc3i847Pxgz+EL2eb5kXuD1N&rLetdRAO~ zh6n@fwjDxMSb}wCIrMt|-a9ds^;ovVu)U>ATd(M-j#Fi=be!EfPINsQr&+aZiFlVS z2~`vJv=$Yxn#TU_rA71@18lKNg)$cQ&`(vmenQNlZtYymp?<5!9O@ocwSBe~ z^gSHI)duO>73R3B!W_Z8^(@Vi$GswwCtDLEMDlZ}NvVXM2KFxty8bH5KRVV5?loZh z>rha+1_gP+Nm&v1zeE^zH1Io=KK>(0NBU}U@6=y-5X=Qs`=X+bf z%Y6@DC;)`x;884=;RkWeaR^~FK!l57$P%(TW?>x+w{uU!iW5K)+#wQ~6ANcyuOtJ{ z*J876ydTaF4XN4G5)^lR7v(F=joe9IA`<;b=T1GgQf#A_U#L1P3(ap&6P`tv)1&fjeB+64lTM!6KANQYfkOICql>=lM)=9P7GSr?rJwO0XmFLdbMgCQ-zfUgYlrD|gt9WS%Yu#99h+MqV772`bL8)#e0vTQ?0r3VoAqL8jb zO82-fUB&sL^e)^0kGdBuG2A&WUEnMLc=@pcF@aaL`n@B7`wYtAQn?fq5J6lDsy3DL zBCV?jxb`Pr1G`?50CE-Q?YClW{kg>)X((2iY0�!~gW!vow?_y=K0VZLOztEugGq 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 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_base/reports/__pycache__/asset_register_report_xlsx.cpython-311.pyc b/dev_odex30_accounting/exp_asset_base/reports/__pycache__/asset_register_report_xlsx.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9abb3367f1ea9c9bbdd1b6451393119f771f4fa GIT binary patch literal 14630 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 Wp-U^L_lLCF=I^QUhdeCQ>;DDUkDt2$ literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_base/reports/abstract_report_xlsx.py b/dev_odex30_accounting/exp_asset_base/reports/abstract_report_xlsx.py new file mode 100644 index 0000000..1738e11 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/reports/abstract_report_xlsx.py @@ -0,0 +1,688 @@ + +# Author: Julien Coux +# Copyright 2016 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo import models + + +class AbstractReportXslx(models.AbstractModel): + _name = 'report.asset_abstract_report_xlsx' + _inherit = 'report.report_xlsx.abstract' + _description = 'asset_abstract_report_xlsx' + + def get_workbook_options(self): + vals = super(AbstractReportXslx, self).get_workbook_options() + vals.update({"constant_memory": True}) + return vals + + def generate_xlsx_report(self, workbook, data, objects): + # Initialize report variables + report_data = { + "workbook": None, + "sheet": None, # main sheet which will contains report + "columns": None, # columns of the report + "row_pos": None, # row_pos must be incremented at each writing lines + "formats": None, + } + self._define_formats(workbook, report_data) + # Get report data + report_name = self._get_report_name(objects, data=data) + report_footer = self._get_report_footer() + filters = self._get_report_filters(objects) + report_data["columns"] = self._get_report_columns(objects) + report_data["workbook"] = workbook + report_data["sheet"] = workbook.add_worksheet(report_name[:31]) + self._set_column_width(report_data) + # Fill report + report_data["row_pos"] = 0 + self._write_report_title(report_name, report_data) + self._write_filters(filters, report_data) + self._generate_report_content(workbook, objects, data, report_data) + self._write_report_footer(report_footer, report_data) + + def _define_formats(self, workbook, report_data): + """Add cell formats to current workbook. + Those formats can be used on all cell. + Available formats are : + * format_bold + * format_right + * format_right_bold_italic + * format_header_left + * format_header_center + * format_header_right + * format_header_amount + * format_amount + * format_percent_bold_italic + """ + currency_id = self.env["res.company"]._default_currency_id() + report_data["formats"] = { + "format_bold": workbook.add_format({"bold": True}), + "format_right": workbook.add_format({"align": "right"}), + "format_left": workbook.add_format({"align": "left"}), + "format_center": workbook.add_format({'align': 'center'}), + "format_right_bold_italic": workbook.add_format( + {"align": "right", "bold": True, "italic": True} + ), + "format_header_left": workbook.add_format( + {"bold": True, "border": True, "bg_color": "#FFFFCC"} + ), + "format_header_center": workbook.add_format( + {"bold": True, "align": "center", "border": True, "bg_color": "#FFFFCC"} + ), + "format_header_right": workbook.add_format( + {"bold": True, "align": "right", "border": True, "bg_color": "#FFFFCC"} + ), + "format_header_amount": workbook.add_format( + {"bold": True, "border": True, "bg_color": "#FFFFCC"} + ).set_num_format("#,##0." + "0" * currency_id.decimal_places), + "format_amount": workbook.add_format().set_num_format( + "#,##0." + "0" * currency_id.decimal_places + ), + "format_amount_bold": workbook.add_format({"bold": True}).set_num_format( + "#,##0." + "0" * currency_id.decimal_places + ), + "format_percent_bold_italic": workbook.add_format( + {"bold": True, "italic": True} + ).set_num_format("#,##0.00%"), + } + + def _set_column_width(self, report_data): + """Set width for all defined columns. + Columns are defined with `_get_report_columns` method. + """ + for position, column in report_data["columns"].items(): + report_data["sheet"].set_column(position, position, column["width"]) + + def _write_report_title(self, title, report_data): + """Write report title on current line using all defined columns width. + Columns are defined with `_get_report_columns` method. + """ + report_data["sheet"].merge_range( + report_data["row_pos"], + 0, + report_data["row_pos"], + len(report_data["columns"]) - 1, + title, + report_data["formats"]["format_bold"], + ) + report_data["row_pos"] += 3 + + def _write_report_footer(self, footer, report_data): + """Write report footer . + Columns are defined with `_get_report_columns` method. + """ + if footer: + report_data["row_pos"] += 1 + report_data["sheet"].merge_range( + report_data["row_pos"], + 0, + report_data["row_pos"], + len(report_data["columns"]) - 1, + footer, + report_data["formats"]["format_left"], + ) + report_data["row_pos"] += 1 + + def _write_filters(self, filters, report_data): + """Write one line per filters on starting on current line. + Columns number for filter name is defined + with `_get_col_count_filter_name` method. + Columns number for filter value is define + with `_get_col_count_filter_value` method. + """ + col_name = 1 + col_count_filter_name = self._get_col_count_filter_name() + col_count_filter_value = self._get_col_count_filter_value() + col_value = col_name + col_count_filter_name + 1 + for title, value in filters: + report_data["sheet"].merge_range( + report_data["row_pos"], + col_name, + report_data["row_pos"], + col_name + col_count_filter_name - 1, + title, + report_data["formats"]["format_header_left"], + ) + report_data["sheet"].merge_range( + report_data["row_pos"], + col_value, + report_data["row_pos"], + col_value + col_count_filter_value - 1, + value, + ) + report_data["row_pos"] += 1 + report_data["row_pos"] += 2 + + def write_array_title(self, title, report_data): + """Write array title on current line using all defined columns width. + Columns are defined with `_get_report_columns` method. + """ + report_data["sheet"].merge_range( + report_data["row_pos"], + 0, + report_data["row_pos"], + len(report_data["columns"]) - 1, + title, + report_data["formats"]["format_bold"], + ) + report_data["row_pos"] += 1 + + def write_array_header(self, report_data): + """Write array header on current line using all defined columns name. + Columns are defined with `_get_report_columns` method. + """ + for col_pos, column in report_data["columns"].items(): + report_data["sheet"].write( + report_data["row_pos"], + col_pos, + column["header"], + report_data["formats"]["format_header_center"], + ) + report_data["row_pos"] += 1 + + def write_line(self, line_object, report_data): + """Write a line on current line using all defined columns field name. + Columns are defined with `_get_report_columns` method. + """ + for col_pos, column in report_data["columns"].items(): + value = getattr(line_object, column["field"]) + cell_type = column.get("type", "string") + if cell_type == "many2one": + report_data["sheet"].write_string( + report_data["row_pos"], + col_pos, + value.name or "", + report_data["formats"]["format_right"], + ) + elif cell_type == "string": + if ( + hasattr(line_object, "account_group_id") + and line_object.account_group_id + ): + report_data["sheet"].write_string( + report_data["row_pos"], + col_pos, + value or "", + report_data["formats"]["format_bold"], + ) + else: + report_data["sheet"].write_string( + report_data["row_pos"], col_pos, value or "" + ) + elif cell_type == "amount": + if ( + hasattr(line_object, "account_group_id") + and line_object.account_group_id + ): + cell_format = report_data["formats"]["format_amount_bold"] + else: + cell_format = report_data["formats"]["format_amount"] + report_data["sheet"].write_number( + report_data["row_pos"], col_pos, float(value), cell_format + ) + elif cell_type == "amount_currency": + if line_object.currency_id: + format_amt = self._get_currency_amt_format(line_object, report_data) + report_data["sheet"].write_number( + report_data["row_pos"], col_pos, float(value), format_amt + ) + report_data["row_pos"] += 1 + + def write_line_from_dict(self, line_dict, report_data): + """Write a line on current line""" + for col_pos, column in report_data["columns"].items(): + value = line_dict.get(column["field"], False) + cell_type = column.get("type", "string") + if cell_type == "string": + if ( + line_dict.get("account_group_id", False) + and line_dict["account_group_id"] + ): + report_data["sheet"].write_string( + report_data["row_pos"], + col_pos, + value or "", + report_data["formats"]["format_bold"], + ) + else: + if ( + not isinstance(value, str) + and not isinstance(value, bool) + and not isinstance(value, int) + ): + value = value and value.strftime("%d/%m/%Y") + report_data["sheet"].write_string( + report_data["row_pos"], col_pos, value or "" + ) + elif cell_type == "amount": + if ( + line_dict.get("account_group_id", False) + and line_dict["account_group_id"] + ): + cell_format = report_data["formats"]["format_amount_bold"] + else: + cell_format = report_data["formats"]["format_amount"] + report_data["sheet"].write_number( + report_data["row_pos"], col_pos, float(value), cell_format + ) + elif cell_type == "amount_currency": + if line_dict.get("currency_name", False): + format_amt = self._get_currency_amt_format_dict( + line_dict, report_data + ) + report_data["sheet"].write_number( + report_data["row_pos"], col_pos, float(value), format_amt + ) + elif cell_type == "currency_name": + report_data["sheet"].write_string( + report_data["row_pos"], + col_pos, + value or "", + report_data["formats"]["format_right"], + ) + report_data["row_pos"] += 1 + + def write_initial_balance(self, my_object, label, report_data): + """Write a specific initial balance line on current line + using defined columns field_initial_balance name. + Columns are defined with `_get_report_columns` method. + """ + col_pos_label = self._get_col_pos_initial_balance_label() + report_data["sheet"].write( + report_data["row_pos"], + col_pos_label, + label, + report_data["formats"]["format_right"], + ) + for col_pos, column in report_data["columns"].items(): + if column.get("field_initial_balance"): + value = getattr(my_object, column["field_initial_balance"]) + cell_type = column.get("type", "string") + if cell_type == "string": + report_data["sheet"].write_string( + report_data["row_pos"], col_pos, value or "" + ) + elif cell_type == "amount": + report_data["sheet"].write_number( + report_data["row_pos"], + col_pos, + float(value), + report_data["formats"]["format_amount"], + ) + elif cell_type == "amount_currency": + if my_object.currency_id: + format_amt = self._get_currency_amt_format( + my_object, report_data + ) + report_data["sheet"].write_number( + report_data["row_pos"], col_pos, float(value), format_amt + ) + elif column.get("field_currency_balance"): + value = getattr(my_object, column["field_currency_balance"]) + cell_type = column.get("type", "string") + if cell_type == "many2one": + if my_object.currency_id: + report_data["sheet"].write_string( + report_data["row_pos"], + col_pos, + value.name or "", + report_data["formats"]["format_right"], + ) + report_data["row_pos"] += 1 + + def write_initial_balance_from_dict(self, my_object, label, report_data): + """Write a specific initial balance line on current line + using defined columns field_initial_balance name. + Columns are defined with `_get_report_columns` method. + """ + col_pos_label = self._get_col_pos_initial_balance_label() + report_data["sheet"].write( + report_data["row_pos"], + col_pos_label, + label, + report_data["formats"]["format_right"], + ) + for col_pos, column in report_data["columns"].items(): + if column.get("field_initial_balance"): + value = my_object.get(column["field_initial_balance"], False) + cell_type = column.get("type", "string") + if cell_type == "string": + report_data["sheet"].write_string( + report_data["row_pos"], col_pos, value or "" + ) + elif cell_type == "amount": + report_data["sheet"].write_number( + report_data["row_pos"], + col_pos, + float(value), + report_data["formats"]["format_amount"], + ) + elif cell_type == "amount_currency": + if my_object["currency_id"]: + format_amt = self._get_currency_amt_format( + my_object, report_data + ) + report_data["sheet"].write_number( + report_data["row_pos"], col_pos, float(value), format_amt + ) + elif column.get("field_currency_balance"): + value = my_object.get(column["field_currency_balance"], False) + cell_type = column.get("type", "string") + if cell_type == "many2one": + if my_object["currency_id"]: + report_data["sheet"].write_string( + report_data["row_pos"], + col_pos, + value.name or "", + report_data["formats"]["format_right"], + ) + report_data["row_pos"] += 1 + + def write_ending_balance(self, my_object, name, label, report_data): + """Write a specific ending balance line on current line + using defined columns field_final_balance name. + Columns are defined with `_get_report_columns` method. + """ + for i in range(0, len(report_data["columns"])): + report_data["sheet"].write( + report_data["row_pos"], + i, + "", + report_data["formats"]["format_header_right"], + ) + row_count_name = self._get_col_count_final_balance_name() + col_pos_label = self._get_col_pos_final_balance_label() + report_data["sheet"].merge_range( + report_data["row_pos"], + 0, + report_data["row_pos"], + row_count_name - 1, + name, + report_data["formats"]["format_header_left"], + ) + report_data["sheet"].write( + report_data["row_pos"], + col_pos_label, + label, + report_data["formats"]["format_header_right"], + ) + for col_pos, column in report_data["columns"].items(): + if column.get("field_final_balance"): + value = getattr(my_object, column["field_final_balance"]) + cell_type = column.get("type", "string") + if cell_type == "string": + report_data["sheet"].write_string( + report_data["row_pos"], + col_pos, + value or "", + report_data["formats"]["format_header_right"], + ) + elif cell_type == "amount": + report_data["sheet"].write_number( + report_data["row_pos"], + col_pos, + float(value), + report_data["formats"]["format_header_amount"], + ) + elif cell_type == "amount_currency": + if my_object.currency_id: + format_amt = self._get_currency_amt_header_format( + my_object, report_data + ) + report_data["sheet"].write_number( + report_data["row_pos"], col_pos, float(value), format_amt + ) + elif column.get("field_currency_balance"): + value = getattr(my_object, column["field_currency_balance"]) + cell_type = column.get("type", "string") + if cell_type == "many2one": + if my_object.currency_id: + report_data["sheet"].write_string( + report_data["row_pos"], + col_pos, + value.name or "", + report_data["formats"]["format_header_right"], + ) + report_data["row_pos"] += 1 + + def write_ending_balance_from_dict(self, my_object, name, label, report_data): + """Write a specific ending balance line on current line + using defined columns field_final_balance name. + Columns are defined with `_get_report_columns` method. + """ + for i in range(0, len(report_data["columns"])): + report_data["sheet"].write( + report_data["row_pos"], + i, + "", + report_data["formats"]["format_header_right"], + ) + row_count_name = self._get_col_count_final_balance_name() + col_pos_label = self._get_col_pos_final_balance_label() + report_data["sheet"].merge_range( + report_data["row_pos"], + 0, + report_data["row_pos"], + row_count_name - 1, + name, + report_data["formats"]["format_header_left"], + ) + report_data["sheet"].write( + report_data["row_pos"], + col_pos_label, + label, + report_data["formats"]["format_header_right"], + ) + for col_pos, column in report_data["columns"].items(): + if column.get("field_final_balance"): + value = my_object.get(column["field_final_balance"], False) + cell_type = column.get("type", "string") + if cell_type == "string": + report_data["sheet"].write_string( + report_data["row_pos"], + col_pos, + value or "", + report_data["formats"]["format_header_right"], + ) + elif cell_type == "amount": + report_data["sheet"].write_number( + report_data["row_pos"], + col_pos, + float(value), + report_data["formats"]["format_header_amount"], + ) + elif cell_type == "amount_currency": + if my_object["currency_id"] and value: + format_amt = self._get_currency_amt_format_dict( + my_object, report_data + ) + report_data["sheet"].write_number( + report_data["row_pos"], col_pos, float(value), format_amt + ) + elif column.get("field_currency_balance"): + value = my_object.get(column["field_currency_balance"], False) + cell_type = column.get("type", "string") + if cell_type == "many2one": + if my_object["currency_id"]: + report_data["sheet"].write_string( + report_data["row_pos"], + col_pos, + value or "", + report_data["formats"]["format_header_right"], + ) + elif cell_type == "currency_name": + report_data["sheet"].write_string( + report_data["row_pos"], + col_pos, + value or "", + report_data["formats"]["format_header_right"], + ) + report_data["row_pos"] += 1 + + def _get_currency_amt_format(self, line_object, report_data): + """ Return amount format specific for each currency. """ + if "account_group_id" in line_object and line_object["account_group_id"]: + format_amt = report_data["formats"]["format_amount_bold"] + field_prefix = "format_amount_bold" + else: + format_amt = report_data["formats"]["format_amount"] + field_prefix = "format_amount" + if "currency_id" in line_object and line_object.get("currency_id", False): + field_name = "{}_{}".format(field_prefix, line_object["currency_id"].name) + if hasattr(self, field_name): + format_amt = getattr(self, field_name) + else: + format_amt = report_data["workbook"].add_format() + report_data["field_name"] = format_amt + format_amount = "#,##0." + ( + "0" * line_object["currency_id"].decimal_places + ) + format_amt.set_num_format(format_amount) + return format_amt + + def _get_currency_amt_format_dict(self, line_dict, report_data): + """ Return amount format specific for each currency. """ + if line_dict.get("account_group_id", False) and line_dict["account_group_id"]: + format_amt = report_data["formats"]["format_amount_bold"] + field_prefix = "format_amount_bold" + else: + format_amt = report_data["formats"]["format_amount"] + field_prefix = "format_amount" + if line_dict.get("currency_id", False) and line_dict["currency_id"]: + if isinstance(line_dict["currency_id"], int): + currency = self.env["res.currency"].browse(line_dict["currency_id"]) + else: + currency = line_dict["currency_id"] + field_name = "{}_{}".format(field_prefix, currency.name) + if hasattr(self, field_name): + format_amt = getattr(self, field_name) + else: + format_amt = report_data["workbook"].add_format() + report_data["field_name"] = format_amt + format_amount = "#,##0." + ("0" * currency.decimal_places) + format_amt.set_num_format(format_amount) + return format_amt + + def _get_currency_amt_header_format(self, line_object, report_data): + """ Return amount header format for each currency. """ + format_amt = report_data["formats"]["format_header_amount"] + if line_object.currency_id: + field_name = "format_header_amount_%s" % line_object.currency_id.name + if hasattr(self, field_name): + format_amt = getattr(self, field_name) + else: + format_amt = report_data["workbook"].add_format( + {"bold": True, "border": True, "bg_color": "#FFFFCC"} + ) + report_data["field_name"] = format_amt + format_amount = "#,##0." + ( + "0" * line_object.currency_id.decimal_places + ) + format_amt.set_num_format(format_amount) + return format_amt + + def _get_currency_amt_header_format_dict(self, line_object, report_data): + """ Return amount header format for each currency. """ + format_amt = report_data["formats"]["format_header_amount"] + if line_object["currency_id"]: + field_name = "format_header_amount_%s" % line_object["currency_name"] + if hasattr(self, field_name): + format_amt = getattr(self, field_name) + else: + format_amt = report_data["workbook"].add_format( + {"bold": True, "border": True, "bg_color": "#FFFFCC"} + ) + report_data["field_name"] = format_amt + format_amount = "#,##0." + ( + "0" * line_object["currency_id"].decimal_places + ) + format_amt.set_num_format(format_amount) + return format_amt + + def _generate_report_content(self, workbook, report, data, report_data): + """ + Allow to fetch report content to be displayed. + """ + raise NotImplementedError() + + def _get_report_complete_name(self, report, prefix, data=None): + if report.company_id: + suffix = " - {} - {}".format( + report.company_id.name, report.company_id.currency_id.name + ) + return prefix + suffix + return prefix + + def _get_report_name(self, report, data=False): + """ + Allow to define the report name. + Report name will be used as sheet name and as report title. + :return: the report name + """ + raise NotImplementedError() + + def _get_report_footer(self): + """ + Allow to define the report footer. + :return: the report footer + """ + return False + + def _get_report_columns(self, report): + """ + Allow to define the report columns + which will be used to generate report. + :return: the report columns as dict + :Example: + { + 0: {'header': 'Simple column', + 'field': 'field_name_on_my_object', + 'width': 11}, + 1: {'header': 'Amount column', + 'field': 'field_name_on_my_object', + 'type': 'amount', + 'width': 14}, + } + """ + raise NotImplementedError() + + def _get_report_filters(self, report): + """ + :return: the report filters as list + :Example: + [ + ['first_filter_name', 'first_filter_value'], + ['second_filter_name', 'second_filter_value'] + ] + """ + raise NotImplementedError() + + def _get_col_count_filter_name(self): + """ + :return: the columns number used for filter names. + """ + raise NotImplementedError() + + def _get_col_count_filter_value(self): + """ + :return: the columns number used for filter values. + """ + raise NotImplementedError() + + def _get_col_pos_initial_balance_label(self): + """ + :return: the columns position used for initial balance label. + """ + raise NotImplementedError() + + def _get_col_count_final_balance_name(self): + """ + :return: the columns number used for final balance name. + """ + raise NotImplementedError() + + def _get_col_pos_final_balance_label(self): + """ + :return: the columns position used for final balance label. + """ + raise NotImplementedError() \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_base/reports/asset_barcode_pdf_report.xml b/dev_odex30_accounting/exp_asset_base/reports/asset_barcode_pdf_report.xml new file mode 100644 index 0000000..469a1ed --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/reports/asset_barcode_pdf_report.xml @@ -0,0 +1,50 @@ + + + + + + + + + Asset Barcode (PDF) + account.asset + qweb-pdf + exp_asset_base.report_assetbarcode + exp_asset_base.report_assetbarcode + 'Assets barcode - %s' % (object.name) + + report + + + diff --git a/dev_odex30_accounting/exp_asset_base/reports/asset_barcode_zpl_report.xml b/dev_odex30_accounting/exp_asset_base/reports/asset_barcode_zpl_report.xml new file mode 100644 index 0000000..f883b84 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/reports/asset_barcode_zpl_report.xml @@ -0,0 +1,29 @@ + + + + + + Asset Barcode (ZPL) + account.asset + qweb-text + exp_asset_base.label_barcode_account_asset_view + exp_asset_base.label_barcode_account_asset_view + + report + + + diff --git a/dev_odex30_accounting/exp_asset_base/reports/asset_depreciation_report_xlsx.py b/dev_odex30_accounting/exp_asset_base/reports/asset_depreciation_report_xlsx.py new file mode 100644 index 0000000..639f9c7 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/reports/asset_depreciation_report_xlsx.py @@ -0,0 +1,126 @@ +# Copyright 2018 Forest and Biomass Romania +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import _, models +from dateutil.rrule import rrule, MONTHLY +from odoo.tools import DEFAULT_SERVER_DATE_FORMAT as DF +from datetime import datetime + +class AssetDepreciationReportXslx(models.AbstractModel): + _name = 'report.asset_depreciation_report_xlsx' + _inherit = 'report.asset_abstract_report_xlsx' + _description = 'asset_depreciation_report_xlsx' + + def _get_report_name(self, report): + return _('Fixed Asset Register') + + def _get_report_columns(self, report): + return { + 0: {'width': 5}, + 1: {'width': 12}, + 2: {'width': 20}, + 3: {'width': 12}, + 4: {'width': 12}, + 5: {'width': 12}, + 6: {'width': 12}, + 7: {'width': 12}, + 8: {'width': 12}, + 9: {'width': 12}, + 10: {'width': 12}, + 11: {'width': 12}, + 12: {'width': 12}, + 13: {'width': 12}, + 14: {'width': 12}, + 15: {'width': 12}, + 16: {'width': 12}, + 17: {'width': 12}, + 18: {'width': 12}, + 19: {'width': 12}, + } + + def _get_report_filters(self, report): + return [ + [ + _('Duration'), _('From: ') + report.start_date + ' ' + _('To: ') + report.end_date + ], + [ + _('Categories'), ', '.join([c.name for c in report.category_ids]), + ], + ] + + def _get_col_count_filter_name(self): + return 1 + + def _get_col_count_filter_value(self): + return 3 + + def _generate_report_content(self, workbook, report): + # For each category + depreciation_line = self.env['account.asset.depreciation.line'] + + start_date = datetime.strptime(report.start_date, DF) + end_date = datetime.strptime(report.end_date, DF) + periods = [dt.strftime("%b-%y") for dt in rrule(MONTHLY, dtstart=start_date, until=end_date)] + + seq = 1 + depreciation_register = self.env['report_asset_register_depreciation'] + for category in report.category_ids: + # Write category info + self.sheet.write(self.row_pos, 0, seq, self.format_header1) + self.sheet.merge_range(self.row_pos, 1, self.row_pos, 2, category.name, self.format_header1) + percentage = 100/(category.method_number*category.method_period/12) + self.sheet.write(self.row_pos, 3, str(round(percentage,2))+"%", self.format_header1) + self.sheet.write(self.row_pos, 4, "", self.format_header1) + self.sheet.merge_range(self.row_pos, 5, self.row_pos, 4+len(periods), "DEPRECIATION BY MONTH", self.format_header1) + self.sheet.write(self.row_pos, 5+len(periods), "Depr'n.", self.format_header1) + self.sheet.write(self.row_pos, 6+len(periods), "Accu Deprn.", self.format_header1) + self.sheet.write(self.row_pos, 7+len(periods), "NBV", self.format_header1) + self.row_pos += 1 + + #Write Header + self.sheet.write(self.row_pos, 0, "", self.format_header2) + self.sheet.write(self.row_pos, 1, "Date", self.format_header2) + self.sheet.write(self.row_pos, 2, "Description of Asset", self.format_header2) + self.sheet.write(self.row_pos, 3, "Ref. Doc.", self.format_header2) + self.sheet.write(self.row_pos, 4, "Amount", self.format_header2) + column_pos = 4 + for p in periods: + column_pos += 1 + self.sheet.write(self.row_pos, column_pos, p, self.format_header2) + self.sheet.write(self.row_pos, column_pos+1, report.start_date+'-'+report.end_date, self.format_header2) + self.sheet.write(self.row_pos, column_pos+2, report.end_date, self.format_header2) + self.sheet.write(self.row_pos, column_pos+3, 'After '+report.end_date, self.format_header2) + self.row_pos += 1 + + #Write Asset + asset_ids = self.env['account.asset'].search([('category_id', '=', category.id), + ('date', '<=', report.end_date)]) + for asset in asset_ids: + + self.sheet.write(self.row_pos, 0, "", self.format_center) + self.sheet.write(self.row_pos, 1, asset.date, self.format_center) + self.sheet.write(self.row_pos, 2, asset.name, self.format_center) + self.sheet.write(self.row_pos, 3, asset.invoice_id.name, self.format_center) + self.sheet.write(self.row_pos, 4, asset.value, self.format_center) + + column_pos = 4 + fy_depreciation = 0 + for p in periods: + column_pos += 1 + depreciation = depreciation_register.search([('report_id', '=', report.id), + ('asset_id', '=', asset.id), + ('period', '=', p)]) + amount = sum([d.amount for d in depreciation]) + fy_depreciation += amount + self.sheet.write(self.row_pos, column_pos, amount, self.format_center) + self.sheet.write(self.row_pos, column_pos+1, fy_depreciation, self.format_center) + accu = depreciation_line.read_group([('depreciation_date', '<=', report.end_date), + ('asset_id','=', asset.id)], + ['asset_id', 'amount'], ['asset_id']) + accu_depreciation = accu and accu[0].get('amount') or 0 + self.sheet.write(self.row_pos, column_pos+2, accu_depreciation, self.format_center) + self.sheet.write(self.row_pos, column_pos+3, asset.value - accu_depreciation, self.format_center) + self.row_pos += 1 + seq += 1 + self.row_pos += 1 + diff --git a/dev_odex30_accounting/exp_asset_base/reports/asset_register_report.py b/dev_odex30_accounting/exp_asset_base/reports/asset_register_report.py new file mode 100644 index 0000000..469f763 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/reports/asset_register_report.py @@ -0,0 +1,74 @@ +# © 2016 Julien Coux (Camptocamp) +# © 2018 Forest and Biomass Romania SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import models, fields, api +from dateutil.rrule import rrule, MONTHLY +from odoo.tools import DEFAULT_SERVER_DATE_FORMAT as DF +from datetime import datetime, timedelta + +class AssetRegisterReport(models.TransientModel): + """ Here, we just define class fields. + For methods, go more bottom at this file. + + The class hierarchy is : + * AssetRegisterReport + ** Asset Category + *** Asset + **** AssetRegisterReportDepreciation + """ + _name = 'report_asset_register' + + # Filters fields, used for data computation + category_ids = fields.Many2many('account.asset.category') + start_date = fields.Date() + end_date = fields.Date() + depreciation_ids = fields.One2many('report_asset_register_depreciation', 'report_id') + + @api.one + def compute_data_for_report(self): + self.depreciation_ids.unlink() + depreciation = self.env['account.asset.depreciation.line'] + depreciation_register = self.env['report_asset_register_depreciation'] + asset = self.env['account.asset'].search([('category_id', 'in', self.category_ids.ids), + ('date', '<=', self.end_date)]) + start_date = datetime.strptime(self.start_date, DF).replace(day=1) + end_date = datetime.strptime(self.end_date, DF) + timedelta(days=1) + dates = [dt for dt in rrule(MONTHLY, dtstart=start_date, until=end_date)] + dates[0] = datetime.strptime(self.start_date, DF) + + for p in range(0, len(dates)): + start = dates[p] + end = p != len(dates)-1 and dates[p+1] or end_date + line = depreciation.search([('depreciation_date', '>=', start.strftime(DF)), + ('depreciation_date', '<', end.strftime(DF)), + ('asset_id', 'in', asset.ids), + ('move_id', '!=', False)]) + for l in line: + val = { + 'report_id': self.id, + 'asset_id': l.asset_id.id, + 'period': start.strftime("%b-%y"), + 'amount': l.amount, + 'date': l.depreciation_date, + + } + depreciation_register.create(val) + + @api.multi + def print_report(self): + self.ensure_one() + return self.env['ir.actions.report'].search( + [('report_name', '=', 'asset_depreciation_report_xlsx'), + ('report_type', '=', 'xlsx')], limit=1).report_action(self) + + +class AssetRegisterReportDepreciation(models.TransientModel): + _name = 'report_asset_register_depreciation' + + report_id = fields.Many2one('report_asset_register', ondelete='cascade', index=True) + asset_id = fields.Many2one('account.asset') + period = fields.Char() + amount = fields.Float() + date = fields.Date() + diff --git a/dev_odex30_accounting/exp_asset_base/reports/asset_register_report.xml b/dev_odex30_accounting/exp_asset_base/reports/asset_register_report.xml new file mode 100644 index 0000000..e743ab6 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/reports/asset_register_report.xml @@ -0,0 +1,59 @@ + + + + + report_asset_register.tree + report_asset_register + + + + + + + + + + + report_asset_register.form + report_asset_register + +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + Asset Register + report_asset_register + form + tree,form + + + + + \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_base/reports/asset_register_report_xlsx.py b/dev_odex30_accounting/exp_asset_base/reports/asset_register_report_xlsx.py new file mode 100644 index 0000000..8ae70b3 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/reports/asset_register_report_xlsx.py @@ -0,0 +1,126 @@ +# Copyright 2018 Forest and Biomass Romania +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import models, _ +from datetime import datetime +from odoo.tools import DEFAULT_SERVER_DATE_FORMAT as DF + + +class AssetRegisterReportXslx(models.AbstractModel): + _name = 'report.report_asset_register_xlsx' + _inherit = 'report.asset_abstract_report_xlsx' + _description = 'report_asset_register_xlsx' + + def _get_report_name(self, report, data=False): + return _('Asset Register') + + def _get_report_columns(self, report): + return { + 0: {'header': 'RN', 'width': 5}, + 1: {'header': 'Serial Number', 'width': 20}, + 2: {'header': 'Asset Name', 'width': 20}, + 3: {'header': 'Model Number', 'width': 14}, + 4: {'header': 'Asset Location', 'width': 14}, + 5: {'header': 'User', 'width': 14}, + 6: {'header': 'Supplier', 'width': 14}, + 7: {'header': 'Invoice Number', 'width': 20}, + 8: {'header': 'Invoice Date', 'width': 12}, + 9: {'header': 'Value', 'type': 'amount', 'width': 14}, + 10: {'header': 'Received Date', 'width': 16}, + 11: {'header': 'Warranty', 'width': 20}, + 12: {'header': 'Registration Number', 'width': 20}, + 13: {'header': 'Registration Date', 'width': 20}, + 14: {'header': '# Existing Depreciation', 'width': 20}, + 15: {'header': 'Existing Depreciation', 'width': 20}, + 16: {'header': 'First Depreciation', 'width': 20}, + 17: {'header': 'Depreciation %', 'width': 16}, + 18: {'header': 'Up to Date', 'width': 12}, + 19: {'header': 'Expired Days', 'width': 14}, + 20: {'header': 'Depreciation', 'width': 14}, + 21: {'header': 'Accumulated Depreciation', 'width': 20}, + 22: {'header': 'Net Value', 'width': 14}, + } + + def _get_report_filters(self, report): + return [] + + def _get_col_count_filter_name(self): + return 0 + + def _get_col_count_filter_value(self): + return 0 + + def _generate_report_content(self, workbook, report, data, report_data): + # For each asset + seq = 1 + # Header + report_data["sheet"].write(report_data["row_pos"], 0, "رقم", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 1, "رقم الأصل", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 2, "الاسم العلمي", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 3, "رقم التصنيع/الهيكل", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 4, "موقع الأصل", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 5, "المستخدم", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 6, "المورد", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 7, "رقم الفاتورة", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 8, "تاريخ الفاتورة", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 9, "القيمة", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 10, "تاريخ الإستلام", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 11, "تفاصيل الضمان", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 12, "رقم القيد", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 13, "تاريخ القيد", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 14, "عدد الاستهلاكات السابقة", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 15, "قيمة الاستهلاك السابق", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 16, "تاريخ اول اسستهلاك", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 17, "نسبة الاستهلاك", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 18, "تاريخ الاحتساب", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 19, "ايام الاستهلاك", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 20, "استهلاك السنة", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 21, "الاستهلاك التراكمي", report_data["formats"]["format_header_center"]) + report_data["sheet"].write(report_data["row_pos"], 22, "صافي القيمة الدفترية", report_data["formats"]["format_header_center"]) + report_data["row_pos"] += 1 + + self.write_array_header(report_data) + for asset in report: + # Write asset line + report_data["sheet"].write_number(report_data["row_pos"], 0, seq, report_data["formats"]["format_center"]) + report_data["sheet"].write_string(report_data["row_pos"], 1, asset.serial_no or '', report_data["formats"]["format_center"]) + report_data["sheet"].write_string(report_data["row_pos"], 2, asset.name or '', report_data["formats"]["format_center"]) + report_data["sheet"].write_string(report_data["row_pos"], 3, asset.model or '', report_data["formats"]["format_center"]) + report_data["sheet"].write_string(report_data["row_pos"], 4, asset.location_id.name or '', report_data["formats"]["format_center"]) + report_data["sheet"].write_string(report_data["row_pos"], 5, asset.responsible_user_id.name or '', report_data["formats"]["format_center"]) + partner = [] + invoice = [] + for orginal_move in asset.original_move_line_ids: + partner.append(orginal_move.partner_id.name) + invoice.append(orginal_move.move_id.name) + report_data["sheet"].write_string(report_data["row_pos"], 6, partner or '', report_data["formats"]["format_center"]) + report_data["sheet"].write_string(report_data["row_pos"], 7, invoice or '', report_data["formats"]["format_center"]) + report_data["sheet"].write_string(report_data["row_pos"], 8, asset.acquisition_date and asset.acquisition_date.strftime("%d/%m/%Y") or '', report_data["formats"]["format_center"]) + report_data["sheet"].write_number(report_data["row_pos"], 9, float(asset.original_value), report_data["formats"]["format_amount"]) + report_data["sheet"].write_string(report_data["row_pos"], 10, asset.receive_date and asset.receive_date.strftime("%d/%m/%Y") or '', report_data["formats"]["format_center"]) + report_data["sheet"].write_string(report_data["row_pos"], 11, asset.warranty_contract or '', report_data["formats"]["format_center"]) + report_data["sheet"].write_string(report_data["row_pos"], 12, '', report_data["formats"]["format_center"]) + report_data["sheet"].write_string(report_data["row_pos"], 13, '', report_data["formats"]["format_center"]) + + report_data["sheet"].write_number(report_data["row_pos"], 14, asset.depreciation_number_import, report_data["formats"]["format_amount"]) + report_data["sheet"].write_number(report_data["row_pos"], 15, asset.already_depreciated_amount_import, report_data["formats"]["format_amount"]) + report_data["sheet"].write_string(report_data["row_pos"], 16, asset.first_depreciation_date_import and asset.first_depreciation_date_import.strftime("%d/%m/%Y") or '', report_data["formats"]["format_center"]) + + percentage = 100/(asset.method_number*int(asset.method_period)/12) + report_data["sheet"].write_number(report_data["row_pos"], 17, float(percentage), report_data["formats"]["format_amount"]) + + posted_depreciation_move_ids = asset.depreciation_move_ids.filtered( + lambda x: x.state == 'posted' and not x.asset_value_change and not x.reversal_move_id).sorted( + key=lambda l: l.date) + calc_date = posted_depreciation_move_ids[-1].date + report_data["sheet"].write_string(report_data["row_pos"], 18, calc_date and calc_date.strftime("%d/%m/%Y") or '', report_data["formats"]["format_center"]) + first_dept = asset.first_depreciation_date_import or asset.receive_date or asset.date + delta = calc_date and first_dept and calc_date-first_dept + days = delta and delta.days or 0 + report_data["sheet"].write_number(report_data["row_pos"], 19, float(days), report_data["formats"]["format_amount"]) + report_data["sheet"].write_number(report_data["row_pos"], 20, float((asset.original_value-asset.already_depreciated_amount_import)*percentage/100), report_data["formats"]["format_amount"]) + report_data["sheet"].write_number(report_data["row_pos"], 21, float(asset.original_value-asset.value_residual), report_data["formats"]["format_amount"]) + report_data["sheet"].write_number(report_data["row_pos"], 22, float(asset.book_value), report_data["formats"]["format_amount"]) + seq += 1 + report_data["row_pos"] += 1 + diff --git a/dev_odex30_accounting/exp_asset_base/reports/reports.xml b/dev_odex30_accounting/exp_asset_base/reports/reports.xml new file mode 100644 index 0000000..cb2ae08 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/reports/reports.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/dev_odex30_accounting/exp_asset_base/security/groups.xml b/dev_odex30_accounting/exp_asset_base/security/groups.xml new file mode 100644 index 0000000..cfa5db2 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/security/groups.xml @@ -0,0 +1,23 @@ + + + + Asset Assessment + + + + + Assets Managment + + + User + + + + Manager + + + + + + + diff --git a/dev_odex30_accounting/exp_asset_base/security/ir.model.access.csv b/dev_odex30_accounting/exp_asset_base/security/ir.model.access.csv new file mode 100644 index 0000000..a17f139 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/security/ir.model.access.csv @@ -0,0 +1,13 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_asset_manufacturer,account.asset.manufacturer,model_account_asset_manufacturer,account.group_account_readonly,1,0,0,0 +access_asset_manufacturer_manager,account.asset.manufacturer,model_account_asset_manufacturer,account.group_account_manager,1,1,1,1 +access_asset_location,account.asset.location,model_account_asset_location,account.group_account_readonly,1,0,0,0 +access_asset_location_manager,account.asset.location,model_account_asset_location,account.group_account_manager,1,1,1,1 +access_asset_adjustment,account.asset.adjustment,model_account_asset_adjustment,account.group_account_readonly,1,0,0,0 +access_asset_adjustment_manager,account.asset.adjustment,model_account_asset_adjustment,account.group_account_manager,1,1,1,1 +access_asset_adjustment_line,account.asset.adjustment.line,model_account_asset_adjustment_line,account.group_account_readonly,1,0,0,0 +access_asset_adjustment_line_manager,account.asset.adjustment.line,model_account_asset_adjustment_line,account.group_account_manager,1,1,1,1 +access_account_asset_modify,access.account.asset.modify,model_account_asset_modify,account.group_account_user,1,1,1,1 +access_asset_pause,access.asset.pause,model_asset_pause,account.group_account_user,1,1,1,1 +access_asset_sell,access.asset.sell,model_asset_sell,account.group_account_user,1,1,1,1 +access_asset_state_operation5_manager,account.state.4multi.operation,model_asset_state2,,1,1,1,1 \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_base/static/description/assets.png b/dev_odex30_accounting/exp_asset_base/static/description/assets.png new file mode 100644 index 0000000000000000000000000000000000000000..88fbda013324cde5a8fd826267102f8721c619ee GIT binary patch literal 24904 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 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_base/static/description/icon.png b/dev_odex30_accounting/exp_asset_base/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4141f52daab6a780510b5f4e3dd762511add78fa GIT binary patch literal 32929 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 OgtWK + + + account.asset.adjustment.line.tree + account.asset.adjustment.line + + + + + + + + + + + + + + account.asset.adjustment.tree + account.asset.adjustment + + + + + + + + + + + + account.asset.adjustment.form + account.asset.adjustment + +
+
+
+ +
+

+ + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + Asset Adjustment + account.asset.adjustment + list,form + + +
\ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_base/views/account_asset_view.xml b/dev_odex30_accounting/exp_asset_base/views/account_asset_view.xml new file mode 100644 index 0000000..83e5dc5 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/views/account_asset_view.xml @@ -0,0 +1,343 @@ + + + + + + + Assets Manufacturer + account.asset.manufacturer + list,form + + + account.asset.manufacturer.form + account.asset.manufacturer + +
+ + + + + + + +
+
+ + + + + Assets Locations + account.asset.location + list,form + + + account.asset.location.form + account.asset.location + +
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + account.asset.search + account.asset + + + + ['|', ('name','ilike',self), ('barcode','ilike',self)] + + + + + + + + + + + + + + + account.asset.form + account.asset + + +
+
+ +
+ +
+
+ +
+ + - + + +
+ + + + + + + + + + + + + + + + + +
+ + + exp_asset_base.group_assets_manager + + + exp_asset_base.group_assets_manager + + + exp_asset_base.group_assets_manager + + + exp_asset_base.group_assets_manager + + + + + + + + + + + + + + + + + +
+
+ + + account.asset.asset.inherit.kanban + account.asset + 1 + + + + + + + + + + + + + +
+
+
+ Asset +
+ +
+
+ + + + + +
+
+
+ +
+
+ + + + + +
+
+ + + +
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+
+ + + account.asset.inherit.tree + account.asset + 1 + + + + + + + + + + + + + Assets + account.asset + [('asset_type', '=', 'purchase'), ('state', '!=', 'model'), ('parent_id', '=', False)] + + {'asset_type': 'purchase', 'default_asset_type': 'purchase'} + + + + + + account.asset.pivot + account.asset + + + + + + + + + + + + account.asset.graph + account.asset + + + + + + + + + + + + Assets Analysis + graph,pivot + + account.asset + + + + + account.asset.depreciation.pivot + account.move + + + + + + + + + + + account.asset.graph + account.move + + + + + + + + + + + Depreciation Analysis + graph,pivot + + account.move + [('asset_id', '!=', False)] + +
diff --git a/dev_odex30_accounting/exp_asset_base/views/asset_modify_views.xml b/dev_odex30_accounting/exp_asset_base/views/asset_modify_views.xml new file mode 100644 index 0000000..bd1e6e5 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/views/asset_modify_views.xml @@ -0,0 +1,77 @@ + + + + + account.asset.modify.tree + account.asset.modify + + + + + + + + + + + + + account.asset.modify.form + account.asset.modify + +
+
+
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + +
+ + +
+
+ + + Asset Modification + account.asset.modify + tree,form + + + + +
diff --git a/dev_odex30_accounting/exp_asset_base/views/asset_pause_views.xml b/dev_odex30_accounting/exp_asset_base/views/asset_pause_views.xml new file mode 100644 index 0000000..275ea9e --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/views/asset_pause_views.xml @@ -0,0 +1,52 @@ + + + + + asset.pause.tree + asset.pause + + + + + + + + + + + asset.pause.form + asset.pause + +
+
+
+ + + + + + + + + + +
+
+ + + Asset Pause + asset.pause + tree,form + + + + +
diff --git a/dev_odex30_accounting/exp_asset_base/views/asset_sell_views.xml b/dev_odex30_accounting/exp_asset_base/views/asset_sell_views.xml new file mode 100644 index 0000000..6a3e1a8 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/views/asset_sell_views.xml @@ -0,0 +1,61 @@ + + + + + asset.sell.tree + asset.sell + + + + + + + + + + + asset.sell.form + asset.sell + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+ + + Asset Sell + asset.sell + tree,form + + + + +
diff --git a/dev_odex30_accounting/exp_asset_base/views/menus.xml b/dev_odex30_accounting/exp_asset_base/views/menus.xml new file mode 100644 index 0000000..d6189dc --- /dev/null +++ b/dev_odex30_accounting/exp_asset_base/views/menus.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/exp_asset_custody/__init__.py b/dev_odex30_accounting/exp_asset_custody/__init__.py new file mode 100644 index 0000000..fca4a5f --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# © Copyright (C) 2021 Expert Co. Ltd() + +from . import models \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_custody/__manifest__.py b/dev_odex30_accounting/exp_asset_custody/__manifest__.py new file mode 100644 index 0000000..76291d8 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody/__manifest__.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# © 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + 'name': 'Asset Custody Management', + 'summary': 'Custody Operations for Asset', + 'description': ''' +Manage Assets transfer between locations, departments and employees + ''', + 'version': '1.0.0', + 'category': 'Odex30-Accounting/Odex30-Accounting', + 'author': 'Expert Co. Ltd.', + 'website': 'http://www.exp-sa.com', + 'license': 'AGPL-3', + 'application': False, + 'installable': True, + 'depends': [ + 'exp_asset_base' + ], + 'data': [ + 'data/asset_data.xml', + 'security/ir.model.access.csv', + 'views/account_asset_view.xml', + 'views/account_asset_adjustment_view.xml', + 'views/account_asset_custody_multi_operation.xml', + 'views/account_asset_custody_operation_view.xml', + 'reports/asset_adjustment_report.xml', + 'views/menus.xml' + ], +} diff --git a/dev_odex30_accounting/exp_asset_custody/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/exp_asset_custody/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c44e9ee60b81917d18c2b9e91cccc919e41457a GIT binary patch literal 279 zcmZ3^%ge<81SagP896}uF^B^LOi;#WAs}NqLkdF*V-7=459iRuyGs>IYONXCxNo1{CFI zr6!jY>jU*w7#jeo{Cr(Q3q1%6ENWyBpO~DSUz%5vnU}7gl3ErIQHv~^T2T<6SX`W1 z5}#aJT#}zssUIJonU`4-AFo$X`HRB_=&aJ5RJ$S$pj$vrEtUroAD9^#89#6^Fp6Ga L5Wz%6Y(O;t&<0F* literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_custody/data/asset_data.xml b/dev_odex30_accounting/exp_asset_custody/data/asset_data.xml new file mode 100644 index 0000000..efe41aa --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody/data/asset_data.xml @@ -0,0 +1,34 @@ + + + + + Asset Operation Sequence + asset.operation.seq + ASS OP/%(range_year)s/ + + + + + 6 + + + Asset Multi Operation Sequence + asset.multi.operation.seq + ASS MOP/%(range_year)s/ + + + + + 6 + + + good + + + scarp + + + available + + + \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_custody/i18n/ar.po b/dev_odex30_accounting/exp_asset_custody/i18n/ar.po new file mode 100644 index 0000000..9fbb6aa --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody/i18n/ar.po @@ -0,0 +1,883 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * exp_asset_custody +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0+e-20210105\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-05-19 04:38+0000\n" +"PO-Revision-Date: 2021-05-19 04:38+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__asset_operation_count +msgid "# Done Operations" +msgstr "العمليات المعتمدة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_needaction +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_needaction +msgid "Action Needed" +msgstr "إجراء مطلوب" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_ids +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_ids +msgid "Activities" +msgstr "الأنشطة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_exception_decoration +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "زخرفة استثناء النشاط" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_state +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_state +msgid "Activity State" +msgstr "حالة النشاط" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_type_icon +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_type_icon +msgid "Activity Type Icon" +msgstr "أيقونة نوع النشاط" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__amount +msgid "Amount" +msgstr "المبلغ" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__asset_id +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Asset" +msgstr "الأصل" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Asset Account" +msgstr "حساب الأصل" + +#. module: exp_asset_custody +#: model:ir.actions.report,name:exp_asset_custody.action_asset_adjustment_report +#: model:ir.model,name:exp_asset_custody.model_account_asset_adjustment +msgid "Asset Adjustment" +msgstr "جرد الأصول" + +#. module: exp_asset_custody +#: model:ir.model,name:exp_asset_custody.model_account_asset_multi_operation +msgid "Asset Multi Operation" +msgstr "العمليات المتعددة" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset.py:0 +#, python-format +msgid "Asset Operations" +msgstr "عمليات الأصول" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Asset Operations in done state" +msgstr "العمليات المعتمدة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__asset_status +msgid "Asset Status" +msgstr "حالة العهد" + +#. module: exp_asset_custody +#: model:ir.model,name:exp_asset_custody.model_account_asset +msgid "Asset/Revenue Recognition" +msgstr "أصل/ إيرادات مقدمة" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Assets Adjustment Report" +msgstr "تقرير جرد الأصول" + +#. module: exp_asset_custody +#: model:ir.actions.act_window,name:exp_asset_custody.action_account_asset_assignment +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_assignment_form +msgid "Assets Assignment" +msgstr "إسناد عهدة" + +#. module: exp_asset_custody +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_asset_operation_main +msgid "Assets Operations" +msgstr "عمليات الأصول" + +#. module: exp_asset_custody +#: model:ir.actions.act_window,name:exp_asset_custody.action_account_asset_release +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +msgid "Assets Release" +msgstr "إرجاع عهدة" + +#. module: exp_asset_custody +#: model:ir.actions.act_window,name:exp_asset_custody.action_account_asset_transfer +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_transfer_form +msgid "Assets Transfer" +msgstr "نقل العهدة" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset__status__assigned +msgid "Assigned" +msgstr "مسند" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset__status__reserved +msgid "Reserved" +msgstr "محجوز" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_multi_operation__type__assignment +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__type__assignment +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_asset_assignment +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_multi_asset_assignment +msgid "Assignment" +msgstr "أسناد" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_assignment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Assignment Info" +msgstr "معلومات الإسناد" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_attachment_count +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_attachment_count +msgid "Attachment Count" +msgstr "عدد المرفقات" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__barcode +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__barcode +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Barcode" +msgstr "باركود" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation___barcode_scanned +msgid "Barcode Scanned" +msgstr "باركود" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_assignment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_transfer_form +msgid "Barcode..." +msgstr "الباركود..." + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_adjustment__type__department +msgid "By Department" +msgstr "الإدارة" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_adjustment__type__employee +msgid "By Employee" +msgstr "الموظف" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_adjustment__type__location +msgid "By Location" +msgstr "الموقع" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_multi_operation__state__cancel +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__state__cancel +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_assignment_tree +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_release_tree +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_transfer_tree +msgid "Cancel" +msgstr "إلغاء" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_assignment_tree +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_assignment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_transfer_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_release_tree +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_transfer_tree +msgid "Confirm" +msgstr "تأكيد" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__create_uid +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__create_uid +msgid "Created by" +msgstr "أنشئ بواسطة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__create_date +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__create_date +msgid "Created on" +msgstr "أنشئ في" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Current" +msgstr "الحالي" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__department_id +msgid "Current Department" +msgstr "الإدارة الحالية" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__employee_id +msgid "Current Employee" +msgstr "الموظف الحالي" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Current Info" +msgstr "المعلومات الحالية" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_form +msgid "Custody Info" +msgstr "معلومات العهدة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__custody_period +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__custody_period +msgid "Custody Period" +msgstr "فترة العهدة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__custody_type +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__custody_type +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_search +msgid "Custody Type" +msgstr "نوع العهدة" + +#. module: exp_asset_custody +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_asset_custody_operation +msgid "Custody operations" +msgstr "عمليات العهد" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__date +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__date +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Date" +msgstr "التاريخ" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Date:" +msgstr "التاريخ:" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_adjustment__department_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__new_department_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__current_department_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__new_department_id +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_search +msgid "Department" +msgstr "الإدارة" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Description:" +msgstr "الوصف:" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__display_name +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_adjustment__display_name +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__display_name +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__display_name +msgid "Display Name" +msgstr "الاسم المعروض" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_multi_operation__state__done +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__state__done +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Done" +msgstr "المنتهية" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_multi_operation__state__draft +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__state__draft +msgid "Draft" +msgstr "مسودة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_adjustment__employee_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__new_employee_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__current_employee_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__new_employee_id +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_search +msgid "Employee" +msgstr "الموظف" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_follower_ids +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_follower_ids +msgid "Followers" +msgstr "المتابعون" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_channel_ids +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_channel_ids +msgid "Followers (Channels)" +msgstr "المتابعون (القنوات)" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_partner_ids +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_partner_ids +msgid "Followers (Partners)" +msgstr "المتابعون (الشركاء)" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__activity_type_icon +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset__custody_type__general +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__custody_type__general +msgid "General" +msgstr "عام" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__asset_status__good +msgid "Good" +msgstr "جيد" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Group By..." +msgstr "تجميع بـ..." + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_adjustment__id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__id +msgid "ID" +msgstr "المُعرف" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_exception_icon +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_exception_icon +msgid "Icon" +msgstr "الأيقونة" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__activity_exception_icon +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "الأيقونة للإشارة إلى استثناء النشاط" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__message_needaction +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__message_unread +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__message_needaction +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__message_unread +msgid "If checked, new messages require your attention." +msgstr "إذا كان محددًا، فهناك رسائل جديدة تحتاج لرؤيتها." + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__message_has_error +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__message_has_sms_error +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__message_has_error +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "إذا كان محددًا، فقد حدث خطأ في تسليم بعض الرسائل." + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_multi_operation__state__in_progress +msgid "In Progress" +msgstr "جاري" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_is_follower +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_is_follower +msgid "Is Follower" +msgstr "متابع" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset____last_update +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_adjustment____last_update +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation____last_update +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation____last_update +msgid "Last Modified on" +msgstr "آخر تعديل في" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__write_uid +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__write_uid +msgid "Last Updated by" +msgstr "آخر تحديث بواسطة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__write_date +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_adjustment__location_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__new_location_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__current_location_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__new_location_id +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_search +msgid "Location" +msgstr "الموقع" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_main_attachment_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_main_attachment_id +msgid "Main Attachment" +msgstr "المرفقات" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_multi_operation.py:0 +#, python-format +msgid "Make sure you choose an asset in all operation line." +msgstr "" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_multi_operation.py:0 +#, python-format +msgid "Make sure you choose custody period for all operation lines." +msgstr "الرجاء التاكد من إدخال فترة العهدة في جميع العمليات." + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_multi_operation.py:0 +#, python-format +msgid "Make sure you choose custody type for all operation lines." +msgstr "الرجاء التاكد من إدخال نوع العهدة في جميع العمليات." + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_multi_operation.py:0 +#, python-format +msgid "Make sure you enter the return date for all temporary custodies." +msgstr "الرجاء التاكد من إدخال تاريخ الإرجاع للعهد المؤقتة." + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__manual +msgid "Manual" +msgstr "يدوي" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_has_error +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_has_error +msgid "Message Delivery error" +msgstr "خطأ في تسليم الرسائل" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_ids +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_ids +msgid "Messages" +msgstr "الرسائل" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Missing Assets:" +msgstr "الأصول المفقودة:" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__model_id +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Model" +msgstr "النموذج" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__multi_operation_id +msgid "Multi Operation" +msgstr "العمليات المتعددة" + +#. module: exp_asset_custody +#: model:ir.actions.act_window,name:exp_asset_custody.action_multi_asset_assignment +msgid "Multiple Assignment" +msgstr "إسناد العهد" + +#. module: exp_asset_custody +#: model:ir.actions.act_window,name:exp_asset_custody.action_multi_asset_release +msgid "Multiple Release" +msgstr "إرجاع العهد" + +#. module: exp_asset_custody +#: model:ir.actions.act_window,name:exp_asset_custody.action_multi_asset_transfer +msgid "Multiple Transfer" +msgstr "نقل العهد" + +#. module: exp_asset_custody +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_asset_multi_operation +msgid "Multiple operations" +msgstr "العمليات المتعددة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__name +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__name +msgid "Name" +msgstr "الإسم" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_transfer_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "New" +msgstr "جديد" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_transfer_tree +msgid "New Department" +msgstr "الإدارة الجديدة" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_transfer_tree +msgid "New Employee" +msgstr "الموظف الجديد" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_transfer_tree +msgid "New Location" +msgstr "الموقع الجديد" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_date_deadline +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "الموعد النهائي للنشاط التالي" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_summary +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_summary +msgid "Next Activity Summary" +msgstr "ملخص النشاط التالي" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_type_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_type_id +msgid "Next Activity Type" +msgstr "نوع النشاط التالي" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_multi_operation.py:0 +#, python-format +msgid "No asset found with the selected barcode" +msgstr "لم يتم العثور على أصل لهذا الباركود" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__note +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__note +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Note" +msgstr "ملاحظة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_needaction_counter +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_needaction_counter +msgid "Number of Actions" +msgstr "عدد الإجراءات" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset__asset_operation_count +msgid "Number of done asset operations" +msgstr "" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_has_error_counter +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_has_error_counter +msgid "Number of errors" +msgstr "عدد الاخطاء" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__message_needaction_counter +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "عدد الرسائل التي تتطلب إجراء" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__message_has_error_counter +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "عدد الرسائل الحادث بها خطأ في التسليم" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__message_unread_counter +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__message_unread_counter +msgid "Number of unread messages" +msgstr "عدد الرسائل الجديدة" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_operation.py:0 +#, python-format +msgid "Only draft operations can be deleted." +msgstr "لا يمكن حذف العملية الا في الحالة مبدئية" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__operation_ids +msgid "Operation" +msgstr "عملية" + +#. module: exp_asset_custody +#: model:ir.actions.act_window,name:exp_asset_custody.action_account_asset_operation_analysis +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_operation_graph +msgid "Operation Analysis" +msgstr "تحليل العمليات" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_form +msgid "Operations" +msgstr "العمليات" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__state__pending +msgid "Pending" +msgstr "معلق" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset__custody_period__permanent +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__custody_period__permanent +msgid "Permanent" +msgstr "دائمة" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset__custody_type__personal +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__custody_type__personal +msgid "Personal" +msgstr "شخصية" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__product_id +msgid "Product" +msgstr "المنتج" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__purpose +msgid "Purpose" +msgstr "الغرض" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_assignment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_transfer_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Reject" +msgstr "رفض" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_multi_operation__type__release +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__type__release +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_asset_release +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_multi_asset_release +msgid "Release" +msgstr "إرجاع" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Release Info" +msgstr "معلومات الإرجاع" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_release_tree +msgid "Release Location" +msgstr "موقع الإرجاع" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__user_id +msgid "Responsible" +msgstr "المسئول" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__responsible_department_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__department_id +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Responsible Department" +msgstr "الإدارة المسئولة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__activity_user_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__responsible_user_id +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__activity_user_id +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Responsible User" +msgstr "الموظف المسئول" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__return_date +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__return_date +msgid "Return Date" +msgstr "تاريخ الإرجاع" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_has_sms_error +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_has_sms_error +msgid "SMS Delivery error" +msgstr "خطأ في تسليم الرسائل القصيرة" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset__status__scrap +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__asset_status__scrap +msgid "Scrap" +msgstr "تالف" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Serial No" +msgstr "المتسلسل" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_assignment_tree +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_assignment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_transfer_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_release_tree +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_transfer_tree +msgid "Set to Draft" +msgstr "تعيين كمسودة" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_assignment_tree +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_release_tree +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_transfer_tree +msgid "Setup" +msgstr "الإعداد" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Signatures:" +msgstr "" + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_assignment_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_release_form +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_multi_transfer_form +msgid "Start" +msgstr "بدأ" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__state +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__state +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "State" +msgstr "الحالة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset__status +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Status" +msgstr "الحالة" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__activity_state +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "الأنشطة المستقبيلة" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__state__submit +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_assignment_tree +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_form +msgid "Submit" +msgstr "إرسال" + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset__custody_period__temporary +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__custody_period__temporary +msgid "Temporary" +msgstr "مؤقتة" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset.py:0 +#, python-format +msgid "The period of %s is finished %s." +msgstr "فترة %s قد إنتهت %s." + +#. module: exp_asset_custody +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_multi_operation__type__transfer +#: model:ir.model.fields.selection,name:exp_asset_custody.selection__account_asset_operation__type__transfer +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_asset_transfer +#: model:ir.ui.menu,name:exp_asset_custody.menu_account_multi_asset_transfer +msgid "Transfer" +msgstr "نقل" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_adjustment__type +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__type +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__type +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.view_account_asset_operation_search +msgid "Type" +msgstr "النوع" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__activity_exception_decoration +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "نوع النشاط الاستثنائي المسجل." + +#. module: exp_asset_custody +#: model_terms:ir.ui.view,arch_db:exp_asset_custody.asset_adjustment_report +msgid "Type:" +msgstr "النوع:" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_unread +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_unread +msgid "Unread Messages" +msgstr "الرسائل الجديدة" + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__message_unread_counter +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__message_unread_counter +msgid "Unread Messages Counter" +msgstr "عدد الرسائل الجديدة" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation___barcode_scanned +msgid "Value of the last barcode scanned." +msgstr "قيمة آخر باركود ممسوح ضوئيًا." + +#. module: exp_asset_custody +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_multi_operation__website_message_ids +#: model:ir.model.fields,field_description:exp_asset_custody.field_account_asset_operation__website_message_ids +msgid "Website Messages" +msgstr "رسائل الموقع" + +#. module: exp_asset_custody +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_multi_operation__website_message_ids +#: model:ir.model.fields,help:exp_asset_custody.field_account_asset_operation__website_message_ids +msgid "Website communication history" +msgstr "سجل تواصل الموقع" + +#. module: exp_asset_custody +#: code:addons/exp_asset_custody/models/account_asset_multi_operation.py:0 +#, python-format +msgid "You can not confirm operation without lines." +msgstr "لا يمكن تأكيد العملية دون إدخال التفاصيل" + +#. module: exp_asset_custody +#: model:ir.model,name:exp_asset_custody.model_account_asset_operation +msgid "account.asset.operation" +msgstr "" diff --git a/dev_odex30_accounting/exp_asset_custody/models/__init__.py b/dev_odex30_accounting/exp_asset_custody/models/__init__.py new file mode 100644 index 0000000..0cdea78 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody/models/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# © Copyright (C) 2021 Expert Co. Ltd() + +from . import account_asset +from . import account_asset_operation +from . import account_asset_adjustment +from . import account_asset_multi_operation \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_custody/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/exp_asset_custody/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94d25a7186d596d1fe3ae4440fb743cb910bed24 GIT binary patch literal 486 zcmZvY%SyvQ6o${_Qmc}+g1S@)Vy9jZ7vdvGLEL0B49Q?plT4XRq;cs>^by3j$ue~7 zN^nu=t}9QHiVZj%{`uxV=gjThadrU5)s`K8~#z#Cqi)@$rMxj-4qYTd8QMQ z)@?`KT$0B+`fI*-?KvnDk5pDIb}c=W4_KnY>Wzjn5tPTzA%9ilh>i+Bv+CuKJ(I4%DRwT(Of04UavbpQYW literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_custody/models/__pycache__/account_asset.cpython-311.pyc b/dev_odex30_accounting/exp_asset_custody/models/__pycache__/account_asset.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..549c2dab1738b63920ce13146bbabdbb4b68b334 GIT binary patch literal 4441 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 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_custody/models/__pycache__/account_asset_multi_operation.cpython-311.pyc b/dev_odex30_accounting/exp_asset_custody/models/__pycache__/account_asset_multi_operation.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2cadc169c24454d03fb46fc0a1b5ef3643d91208 GIT binary patch literal 8533 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 + +from odoo import models, fields, api, _ + + +class AccountAssetAsset(models.Model): + _inherit = 'account.asset' + + custody_type = fields.Selection( + selection=[('personal', 'Personal'), ('general', 'General')], + ) + custody_period = fields.Selection( + selection=[('temporary', 'Temporary'), ('permanent', 'Permanent')], + ) + purpose = fields.Html() + return_date = fields.Date() + department_id = fields.Many2one( + comodel_name='hr.department', + string='Current Department' + ) + employee_id = fields.Many2one( + comodel_name='hr.employee', + string='Current Employee' + ) + status = fields.Selection( + selection_add=[('reserved', 'Reserved'), ('assigned', 'Assigned'), ('scrap', 'Scrap')] + ) + asset_operation_count = fields.Integer( + compute='_asset_operation_count', + string='# Done Operations', + help="Number of done asset operations" + ) + + def _asset_operation_count(self): + for asset in self: + asset.asset_operation_count = len( + self.env['account.asset.operation'].search([('asset_id', '=', asset.id), ('state', '=', 'done')])) + + def open_asset_operation(self): + return { + 'name': _('Asset Operations'), + 'view_type': 'form', + 'view_mode': 'tree,form', + 'res_model': 'account.asset.operation', + 'type': 'ir.actions.act_window', + 'domain': [('asset_id', '=', self.id)], + 'view_id': self.env.ref('exp_asset_custody.view_account_asset_operation_tree').id, + 'views': [(self.env.ref('exp_asset_custody.view_account_asset_operation_tree').id, 'tree'), + (self.env.ref('exp_asset_custody.view_account_asset_operation_form').id, 'form')], + 'context': {'active_model': False, 'search_default_done': True}, + 'flags': {'search_view': True, 'action_buttons': False}, + } + + @api.model + def _asset_cron(self): + super(AccountAssetAsset, self)._asset_cron() + today = fields.Date.today() + for asset in self.search([('return_date', '=', today)]): + self.env['mail.activity'].sudo().create({ + 'res_model_id': self.env.ref('account_asset.model_account_asset_asset').id, + 'res_id': asset.id, + 'user_id': asset.responsible_user_id.id, + 'activity_type_id': self.env.ref('mail.mail_activity_data_todo').id, + 'summary': _('The period of %s is finished %s.') % (asset.name, asset.return_date), + 'date_deadline': asset.return_date, + }) diff --git a/dev_odex30_accounting/exp_asset_custody/models/account_asset_adjustment.py b/dev_odex30_accounting/exp_asset_custody/models/account_asset_adjustment.py new file mode 100644 index 0000000..3978758 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody/models/account_asset_adjustment.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# © Copyright (C) 2021 Expert Co. Ltd() + +from odoo import api, fields, models, exceptions, _ + + +class AccountAssetAdjustment(models.Model): + _inherit = 'account.asset.adjustment' + + type = fields.Selection( + selection_add=[('department', 'By Department'), + ('employee', 'By Employee'), + ('location', 'By Location')], + states={'draft': [('readonly', False)]}, + readonly=True, + ) + department_id = fields.Many2one( + comodel_name='hr.department', + states={'draft': [('readonly', False)]}, + readonly=True, + ) + employee_id = fields.Many2one( + comodel_name='hr.employee', + states={'draft': [('readonly', False)]}, + readonly=True, + ) + location_id = fields.Many2one( + comodel_name='account.asset.location', + states={'draft': [('readonly', False)]}, + readonly=True, + ) + + def build_domain(self): + return self.type == 'employee' and [('employee_id', '=', self.employee_id.id)] or \ + (self.type == 'department' and [('department_id', '=', self.department_id.id)]) or \ + (self.type == 'location' and [('location_id', '=', self.location_id.id)]) or \ + super(AccountAssetAdjustment, self).build_domain() + + @api.onchange('type') + def onchange_type(self): + self.employee_id = False + self.department_id = False + self.location_id = False + super(AccountAssetAdjustment, self).onchange_type() diff --git a/dev_odex30_accounting/exp_asset_custody/models/account_asset_multi_operation.py b/dev_odex30_accounting/exp_asset_custody/models/account_asset_multi_operation.py new file mode 100644 index 0000000..2d45e74 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody/models/account_asset_multi_operation.py @@ -0,0 +1,150 @@ +# -*- coding: utf-8 -*- +# © Copyright (C) 2021 Expert Co. Ltd() + +from odoo import models, fields, api, exceptions, _ + +class AccountAssetMultiOperation(models.Model): + _name = 'account.asset.multi.operation' + _description = 'Asset Multi Operation' + _inherit = ['mail.thread', 'mail.activity.mixin', 'barcodes.barcode_events_mixin'] + + name = fields.Char( + states={'draft': [('readonly', False)]}, + default='/', readonly=True + ) + date = fields.Date( + default=fields.Date.context_today, + index=True, copy=False, readonly=True, required=True, + states={'draft': [('readonly', False)]} + ) + type = fields.Selection( + selection=[('assignment', 'Assignment'), + ('release', 'Release'), + ('transfer', 'Transfer')], + states={'draft': [('readonly', False)]}, + readonly=True, required=True + ) + barcode = fields.Char( + states={'in_progress': [('readonly', False)]}, + readonly=True, + ) + responsible_user_id = fields.Many2one( + comodel_name='res.users', + default=lambda self: self.env.user, + states={'draft': [('readonly', False)]}, + readonly=True, required=True + ) + responsible_department_id = fields.Many2one( + comodel_name='hr.department', + ) + new_employee_id = fields.Many2one( + comodel_name='hr.employee', + states={'draft': [('readonly', False)]}, + readonly=True, string='Employee', + ) + new_department_id = fields.Many2one( + comodel_name='hr.department', + states={'draft': [('readonly', False)]}, + readonly=True, string='Department', + ) + new_location_id = fields.Many2one( + comodel_name='account.asset.location', + states={'draft': [('readonly', False)]}, + readonly=True, string='Location', + ) + manual = fields.Boolean() + note = fields.Text( + states={'draft': [('readonly', False)]}, + readonly=True, required=True + ) + state = fields.Selection( + selection=[('draft', 'Draft'), + ('in_progress', 'In Progress'), + ('done', 'Done'), + ('cancel', 'Cancel')], + required=True, default='draft' + ) + operation_ids = fields.One2many( + 'account.asset.operation', 'multi_operation_id', + states={'in_progress': [('readonly', False)]}, + readonly=False, + ) + + @api.model + def create(self, values): + values['name'] = self.env['ir.sequence'].with_context( + ir_sequence_date=values['date']).next_by_code('asset.multi.operation.seq') + return super(AccountAssetMultiOperation, self).create(values) + + def act_progress(self): + self.state = 'in_progress' + + def act_confirm(self): + if not self.operation_ids: + raise exceptions.Warning(_('You can not confirm operation without lines.')) + for opt in self.operation_ids: + self.check_required_fields(opt) + opt.act_confirm() + self.state = 'done' + + def act_reject(self): + self.state = 'cancel' + + def act_draft(self): + self.state = 'draft' + + def get_asset_domain(self): + if self.type == 'assignment': + return [('status', 'in', ['new','available'])] + elif self.type in ['transfer', 'release']: + return [('status', 'in', ['assigned'])] + return [('status', 'in', ['new', 'available', 'assigned', 'scrap'])] + + @api.onchange('new_employee_id') + def onchange_new_employee(self): + self.new_department_id = self.new_employee_id.department_id.id + + @api.onchange('barcode') + def onchange_barcode(self): + self.on_barcode_scanned(self.barcode) + + def on_barcode_scanned(self, barcode): + if barcode: + operation_vals = self.get_operation_vals() + domain = self.get_asset_domain() + assets = self.barcode and self.env['account.asset'].search(domain + [('barcode', '=', barcode)]) + self.barcode = False + if not assets: + raise exceptions.Warning(_('No asset found with the selected barcode')) + for s in assets: + operation_vals.update({ + 'asset_id': s.id, + 'current_employee_id': s.employee_id.id, + 'current_department_id': s.department_id.id, + 'current_location_id': s.location_id.id, + #'state': 'submit', + }) + self.operation_ids = [(0, 0, operation_vals)] + + def get_operation_vals(self): + return { + 'state': 'draft', + 'type': self.type, + 'date': self.date, + 'note': self.note, + 'multi_operation_id': self.id, + 'user_id': self.responsible_user_id.id, + 'new_employee_id': self.new_employee_id.id, + 'new_department_id': self.new_department_id.id, + 'new_location_id': self.new_location_id.id, + } + + def check_required_fields(self, operation): + if not operation.asset_id: + raise exceptions.Warning(_('Make sure you choose an asset in all operation line.')) + elif not operation.return_date and operation.custody_period == 'temporary': + raise exceptions.Warning(_('Make sure you enter the return date for all temporary custodies.')) + elif not operation.custody_type and operation.type in ['assignment', 'transfer']: + raise exceptions.Warning(_('Make sure you choose custody type for all operation lines.')) + elif not operation.custody_period and operation.type in ['assignment', 'transfer']: + raise exceptions.Warning(_('Make sure you choose custody period for all operation lines.')) \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_custody/models/account_asset_operation.py b/dev_odex30_accounting/exp_asset_custody/models/account_asset_operation.py new file mode 100644 index 0000000..8cca74d --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody/models/account_asset_operation.py @@ -0,0 +1,150 @@ +# -*- coding: utf-8 -*- +# © Copyright (C) 2021 Expert Co. Ltd() + +from odoo import models, fields, api, exceptions, _ + + +class AccountAssetOperation(models.Model): + _name = 'account.asset.operation' + _description = 'Asset Operation' + _inherit = ['mail.thread', 'mail.activity.mixin'] + + multi_operation_id = fields.Many2one(comodel_name='account.asset.multi.operation') + name = fields.Char(required=True, default='/') + type = fields.Selection(selection=[('assignment', 'Assignment'), ('release', 'Release'), + ('transfer', 'Transfer')], required=True) + date = fields.Date(default=fields.Date.context_today, index=True, copy=False, readonly=True, required=True, + states={'draft': [('readonly', False)]}) + user_id = fields.Many2one(comodel_name='res.users',default=lambda self: self.env.user, + states={'draft': [('readonly', False)]},string='Responsible',readonly=True) + asset_id = fields.Many2one(comodel_name='account.asset') + statea = fields.Selection(related='asset_id.status') + barcode = fields.Char(compute="_compute_related_fields", store=True) + department_id = fields.Many2one(comodel_name='hr.department',string='Responsible Department', + compute="_compute_related_fields", store=True) + model_id = fields.Many2one(comodel_name='account.asset',compute="_compute_related_fields",store=True) + state = fields.Selection(selection=[('draft', 'Draft'),('submit', 'Submit'),('done', 'Done'),('pending', 'Pending') + ,('cancel', 'Cancel')],required=True, default='draft') + note = fields.Text(states={'draft': [('readonly', False)]},readonly=True,) + # Asset Custody Operation + custody_type = fields.Selection(selection=[('personal', 'Personal'), ('general', 'General')], + states={'draft': [('readonly', False)]},readonly=True,) + custody_period = fields.Selection(selection=[('temporary', 'Temporary'), ('permanent', 'Permanent')], + states={'draft': [('readonly', False)]},readonly=True) + return_date = fields.Date(states={'draft': [('readonly', False)]},readonly=True) + current_employee_id = fields.Many2one(comodel_name='hr.employee', + states={'draft': [('readonly', False)]},readonly=True, string='Employee') + current_department_id = fields.Many2one(comodel_name='hr.department',states={'draft': [('readonly', False)]}, + readonly=True, string='Department', ) + current_location_id = fields.Many2one(comodel_name='account.asset.location',states={'draft': [('readonly', False)]}, + readonly=True, string='Location') + new_employee_id = fields.Many2one(comodel_name='hr.employee', string='Employee') + new_department_id = fields.Many2one(comodel_name='hr.department', string='Department', ) + new_location_id = fields.Many2one(comodel_name='account.asset.location', string='Location') + amount = fields.Float(states={'draft': [('readonly', False)]}, readonly=True, ) + asset_status = fields.Selection(selection=[('good', 'Good'), ('scrap', 'Scrap')], + states={'draft': [('readonly', False)]}, readonly=True, ) + asset_statuso = fields.Selection(related='asset_id.status') + asset_status2 = fields.Many2one( + comodel_name='asset.states', + string='Asset Status',states={'draft': [('readonly', False)]}) + product_id = fields.Many2one(comodel_name='product.product', + domain=[('property_account_expense_id.can_create_asset', '=', True), + ('property_account_expense_id.user_type_id.internal_group', '=', 'asset')], + states={'draft': [('readonly', False)]}, readonly=True) + + def action_read_operation(self): + self.ensure_one() + return { + 'name': self.display_name, + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'account.asset.operation', + 'res_id': self.id, + } + + @api.depends('asset_id', 'asset_id.model_id', 'asset_id.responsible_dept_id', 'asset_id.barcode') + def _compute_related_fields(self): + for operation in self: + operation.barcode = operation.asset_id.barcode + operation.model_id = operation.asset_id.model_id.id + operation.department_id = operation.asset_id.responsible_dept_id.id + + @api.model + def create(self, values): + values['name'] = self.env['ir.sequence'].with_context( + ir_sequence_date=values['date']).next_by_code('asset.operation.seq') + return super(AccountAssetOperation, self).create(values) + + def unlink(self): + if self.search([('state', '!=', 'draft'), ('id', 'in', self.ids)]): + raise exceptions.Warning(_('Only draft operations can be deleted.')) + return super(AccountAssetOperation, self).unlink() + + @api.model + def _get_tracked_fields(self): + fields = self.fields_get() + dels = [f for f in fields if f in models.LOG_ACCESS_COLUMNS or f.startswith('_') or f == 'id'] + for x in dels: + del fields[x] + return set(fields) + + @api.onchange('new_employee_id') + def onchange_new_employee(self): + self.new_department_id = self.new_employee_id.department_id.id + + @api.onchange('asset_id') + def onchange_asset(self): + self.current_employee_id = self.asset_id.employee_id.id + self.current_department_id = self.asset_id.department_id.id + self.current_location_id = self.asset_id.location_id.id + + def act_submit(self): + self.state = 'submit' + + def act_confirm(self): + if not self.asset_id: + raise exceptions.Warning(_('Asset is required to confirm this operation.')) + if self.type in ('assignment', 'release', 'transfer'): + self.custody_confirm() + self.state = 'done' + + def act_reject(self): + self.state = 'pending' + + def act_cancel(self): + self.state = 'cancel' + + def act_draft(self): + self.state = 'draft' + + def custody_confirm(self): + self.asset_id.employee_id = self.new_employee_id.id + self.asset_id.department_id = self.new_department_id.id + self.asset_id.location_id = self.new_location_id.id + self.asset_id.custody_type = self.custody_type + self.asset_id.custody_period = self.custody_period + self.asset_id.return_date = self.return_date + self.asset_id.purpose = self.note + if self.type == 'assignment': + self.asset_id.status = 'assigned' + elif self.type == 'release': + self.asset_id.status = 'available' + + +""" + def sell_dispose_confirm(self): + super(AccountAssetOperation, self).sell_dispose_confirm() + self.asset_id.custody_type = False + self.asset_id.custody_period = False + self.asset_id.purpose = False + self.asset_id.return_date = False + self.asset_id.department_id = False + self.asset_id.employee_id = False + self.asset_id.location_id = False + self.asset_id.status = False + """ +class AccountAssestatus(models.Model): + _name = 'asset.states' + name = fields.Char(string='Name') diff --git a/dev_odex30_accounting/exp_asset_custody/reports/asset_adjustment_report.xml b/dev_odex30_accounting/exp_asset_custody/reports/asset_adjustment_report.xml new file mode 100644 index 0000000..a73e10d --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody/reports/asset_adjustment_report.xml @@ -0,0 +1,232 @@ + + + + + \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_custody/security/ir.model.access.csv b/dev_odex30_accounting/exp_asset_custody/security/ir.model.access.csv new file mode 100644 index 0000000..9e08178 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody/security/ir.model.access.csv @@ -0,0 +1,6 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_asset_operation,account.asset.operation,model_account_asset_operation,account.group_account_readonly,1,0,0,0 +access_asset_operation_manager,account.asset.operation,model_account_asset_operation,account.group_account_manager,1,1,1,1 +access_asset_multi_operation,account.asset.multi.operation,model_account_asset_multi_operation,account.group_account_readonly,1,0,0,0 +access_asset_multi_operation_manager,account.asset.multi.operation,model_account_asset_multi_operation,account.group_account_manager,1,1,1,1 +access_asset_state_operation_manager,account.state.multi.operation,model_asset_states,,1,1,1,1 \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_custody/static/description/icon.png b/dev_odex30_accounting/exp_asset_custody/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4141f52daab6a780510b5f4e3dd762511add78fa GIT binary patch literal 32929 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 OgtWK + + + account.asset.adjustment.form + account.asset.adjustment + + + + + + + + + + \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_custody/views/account_asset_custody_multi_operation.xml b/dev_odex30_accounting/exp_asset_custody/views/account_asset_custody_multi_operation.xml new file mode 100644 index 0000000..bb94bfb --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody/views/account_asset_custody_multi_operation.xml @@ -0,0 +1,274 @@ + + + + + account.asset.multi.operation.tree + account.asset.multi.operation + + + + + + + + + + + + + + account.asset.multi.assignment.form + account.asset.multi.operation + +
+
+ +
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + account.asset.multi.release.form + account.asset.multi.operation + +
+
+
+ +
+

+ + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + account.asset.multi.transfer.form + account.asset.multi.operation + +
+
+
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + Multiple Assignment + account.asset.multi.operation + list,form + {'default_manual':1, 'default_type':'assignment'} + [('type','=','assignment')] + + + + Multiple Release + account.asset.multi.operation + list,form + {'default_manual':1, 'default_type':'release'} + [('type','=','release')] + + + + Multiple Transfer + account.asset.multi.operation + list,form + {'default_manual':1, 'default_type':'transfer'} + [('type','=','transfer')] + + +
\ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_custody/views/account_asset_custody_operation_view.xml b/dev_odex30_accounting/exp_asset_custody/views/account_asset_custody_operation_view.xml new file mode 100644 index 0000000..13aa20f --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody/views/account_asset_custody_operation_view.xml @@ -0,0 +1,337 @@ + + + + + + account.asset.operation.search + account.asset.operation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + account.asset.operation.tree + account.asset.operation + + + + + + + + + + + + + + account.asset.operation.form + account.asset.operation + +
+
+
+ +
+

+ + - + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + account.asset.assignment.tree + account.asset.operation + + + + + + + + + + + + + + + + + + + + + + + + Assets Assignment + account.asset.operation + list,form + + + {'default_type': 'assignment', 'default_custody_type': 'personal', 'default_custody_period': 'permanent'} + + [('type', '=', 'assignment')] + + + + account.asset.release.tree + account.asset.operation + + + + + + + + + + + + + + + + + + + + + + Assets Release + account.asset.operation + list,form + + {'default_type': 'release'} + [('type', '=', 'release')] + + + + account.asset.transfer.tree + account.asset.operation + + + + + + + + + + + + + + + + + + + + + + + + + Assets Transfer + account.asset.operation + list,form + + {'default_type': 'transfer'} + [('type', '=', 'transfer')] + + + + + + Operation Analysis + graph,pivot,list + + + account.asset.operation + {'search_default_group_by_type': True} + + + asset_operation_form3.extend + account.asset.multi.operation + + + + exp_asset_base.group_assets_manager + + + exp_asset_base.group_assets_manager + + + exp_asset_base.group_assets_manager + + + + + asset_operation_form5.extend + account.asset.operation + + + + exp_asset_base.group_assets_manager + + + exp_asset_base.group_assets_manager + + + exp_asset_base.group_assets_manager + + + + +
diff --git a/dev_odex30_accounting/exp_asset_custody/views/account_asset_view.xml b/dev_odex30_accounting/exp_asset_custody/views/account_asset_view.xml new file mode 100644 index 0000000..f011c6b --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody/views/account_asset_view.xml @@ -0,0 +1,51 @@ + + + + + account.asset.search + account.asset + + + + + + + + + + + + + + + + + account.asset.form + account.asset + + +
+ +
+ + + + + + + + + + + + + + + + +
+
+ +
diff --git a/dev_odex30_accounting/exp_asset_custody/views/menus.xml b/dev_odex30_accounting/exp_asset_custody/views/menus.xml new file mode 100644 index 0000000..d1c4ed7 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody/views/menus.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/exp_asset_custody_link/__init__.py b/dev_odex30_accounting/exp_asset_custody_link/__init__.py new file mode 100644 index 0000000..5305644 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody_link/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_custody_link/__manifest__.py b/dev_odex30_accounting/exp_asset_custody_link/__manifest__.py new file mode 100644 index 0000000..9f6872b --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody_link/__manifest__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +{ + 'name': "HR Custody Integration With Asset Custody", + + 'summary': """ + - Assign Asset as a custody to an employee + - Release Asset as a custody from an employee + """, + 'version': '14.0', + 'sequence': 4, + 'category': 'Odex30-Accounting/Odex30-Accounting', + 'website': 'http://exp-sa.com', + 'license': 'AGPL-3', + 'author': 'Expert Co. Ltd.', + 'depends': ['exp_employee_custody','exp_asset_custody','purchase'], + + # always loaded + 'data': [ + 'security/ir.model.access.csv', + 'views/employee_custody_action.xml', + ], + +} diff --git a/dev_odex30_accounting/exp_asset_custody_link/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/exp_asset_custody_link/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9bdedac34b29a07b84bc9c2ea70acc0c0e6f16bd GIT binary patch literal 284 zcmZ3^%ge<81SagP8M;9FF^B^LOi;#WAs}NqLkdF*V-7=459iRuyGs>IYONXCxNo1{CFI zr6!jY>jU*w7#jeo{Cr(Q3q1%6ENWyBpO~DSUz%5vnU}7gl3ErIQHv~^T2T<6SX`W1 z5}#aJT#}zs8K0Axm#rTkpP83g5+AQuQ2C3)2I#iZoK(9a4xocT?k$!F5+9fu85uvY QF))f=U=YDXMQlJd08M~SNB{r; literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_custody_link/i18n/ar_001.po b/dev_odex30_accounting/exp_asset_custody_link/i18n/ar_001.po new file mode 100644 index 0000000..9468ab6 --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody_link/i18n/ar_001.po @@ -0,0 +1,266 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * exp_asset_custody_link +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-31 13:21+0000\n" +"PO-Revision-Date: 2023-01-31 13:21+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_asset_custody_line__asset_id +msgid "Asset" +msgstr "الأصل" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_custom_employee_custody__asset_assign_count +msgid "Asset Assignment" +msgstr "إسناد أصل" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_asset_custody_line__asset_custody_line +msgid "Asset Custody Line" +msgstr "بند أصل" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_custom_employee_custody__asset_line_ids +msgid "Asset Line" +msgstr "بند الأصول" + +#. module: exp_asset_custody_link +#: model_terms:ir.ui.view,arch_db:exp_asset_custody_link.employee_custody_form_view_inherit +msgid "Asset Lines" +msgstr "بند الأصول" + +#. module: exp_asset_custody_link +#: model:ir.model,name:exp_asset_custody_link.model_account_asset_operation +msgid "Asset Operation" +msgstr "عمليات الأصول" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_custom_employee_custody__asset_release_count +msgid "Asset Release" +msgstr "إرجاع عهدة" + +#. module: exp_asset_custody_link +#: code:addons/exp_asset_custody_link/models/account_asset_operation.py:0 +#, python-format +msgid "Asset is required to confirm this operation." +msgstr "الأصل مطلوب لتأكيد هذه العملية" + +#. module: exp_asset_custody_link +#: model:ir.actions.act_window,name:exp_asset_custody_link.action_account_asset_assignment1 +msgid "Assets Assignment" +msgstr "إسناد عهدة" + +#. module: exp_asset_custody_link +#: model:ir.actions.act_window,name:exp_asset_custody_link.action_account_asset_release1 +msgid "Assets Release" +msgstr "إرجاع عهدة" + +#. module: exp_asset_custody_link +#: code:addons/exp_asset_custody_link/models/employee_custody.py:0 +#: model:ir.model.fields.selection,name:exp_asset_custody_link.selection__asset_custody_line__type__assignment +#: model:ir.model.fields.selection,name:exp_asset_custody_link.selection__custom_employee_custody__state__assign +#, python-format +msgid "Assignment" +msgstr "إسناد" + +#. module: exp_asset_custody_link +#: model_terms:ir.ui.view,arch_db:exp_asset_custody_link.employee_custody_form_view_inherit +msgid "Assignments" +msgstr "الإسناد" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_asset_custody_line__create_uid +msgid "Created by" +msgstr "" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_asset_custody_line__create_date +msgid "Created on" +msgstr "" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_asset_custody_line__custody_period +msgid "Custody Period" +msgstr "فترة العهدة" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_asset_custody_line__custody_type +msgid "Custody Type" +msgstr "نوع العهدة" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_asset_custody_line__date +msgid "Date" +msgstr "التاريخ" + +#. module: exp_asset_custody_link +#: code:addons/exp_asset_custody_link/models/employee_custody.py:0 +#: model:ir.model.fields.selection,name:exp_asset_custody_link.selection__custom_employee_custody__state__direct +#, python-format +msgid "Direct Manager" +msgstr "المدير المباشر" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_account_asset_operation__display_name +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_asset_custody_line__display_name +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_custom_employee_custody__display_name +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_mail_followers__display_name +msgid "Display Name" +msgstr "الاسم المعروض" + +#. module: exp_asset_custody_link +#: model:ir.model,name:exp_asset_custody_link.model_mail_followers +msgid "Document Followers" +msgstr "متابعو المستند" + +#. module: exp_asset_custody_link +#: code:addons/exp_asset_custody_link/models/employee_custody.py:0 +#: model:ir.model.fields.selection,name:exp_asset_custody_link.selection__custom_employee_custody__state__draft +#, python-format +msgid "Draft" +msgstr "مسودة" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_account_asset_operation__emp_asset_custody_id +msgid "Emp Asset Custody" +msgstr "" + +#. module: exp_asset_custody_link +#: model:ir.model,name:exp_asset_custody_link.model_custom_employee_custody +msgid "Employee custody" +msgstr "العهد الغير مالية" + +#. module: exp_asset_custody_link +#: model:ir.model.fields.selection,name:exp_asset_custody_link.selection__asset_custody_line__custody_type__general +msgid "General" +msgstr "عام" + +#. module: exp_asset_custody_link +#: code:addons/exp_asset_custody_link/models/employee_custody.py:0 +#: model:ir.model.fields.selection,name:exp_asset_custody_link.selection__custom_employee_custody__state__admin +#, python-format +msgid "Human Resources Manager" +msgstr "تصديق الموارد البشرية" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_account_asset_operation__id +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_asset_custody_line__id +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_custom_employee_custody__id +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_mail_followers__id +msgid "ID" +msgstr "المُعرف" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_account_asset_operation____last_update +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_asset_custody_line____last_update +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_custom_employee_custody____last_update +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_mail_followers____last_update +msgid "Last Modified on" +msgstr "آخر تعديل في" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_asset_custody_line__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_asset_custody_line__write_date +msgid "Last Updated on" +msgstr "" + +#. module: exp_asset_custody_link +#: model:ir.model.fields.selection,name:exp_asset_custody_link.selection__asset_custody_line__custody_period__permanent +msgid "Permanent" +msgstr "مستديمة" + +#. module: exp_asset_custody_link +#: model:ir.model.fields.selection,name:exp_asset_custody_link.selection__asset_custody_line__custody_type__personal +msgid "Personal" +msgstr "شخصية" + +#. module: exp_asset_custody_link +#: code:addons/exp_asset_custody_link/models/employee_custody.py:0 +#, python-format +msgid "Please Select an asset" +msgstr "الرجاء إختيار أصل" + +#. module: exp_asset_custody_link +#: model_terms:ir.ui.view,arch_db:exp_asset_custody_link.employee_custody_form_view_inherit +msgid "Purchase Request" +msgstr "طلب شراء" + +#. module: exp_asset_custody_link +#: code:addons/exp_asset_custody_link/models/employee_custody.py:0 +#: model:ir.model.fields.selection,name:exp_asset_custody_link.selection__custom_employee_custody__state__refuse +#, python-format +msgid "Refuse" +msgstr "رفض" + +#. module: exp_asset_custody_link +#: model_terms:ir.ui.view,arch_db:exp_asset_custody_link.employee_custody_form_view_inherit +msgid "Releases" +msgstr "رفض" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_asset_custody_line__return_date +msgid "Return Date" +msgstr "تاريخ الإرجاع" + +#. module: exp_asset_custody_link +#: code:addons/exp_asset_custody_link/models/employee_custody.py:0 +#: model:ir.model.fields.selection,name:exp_asset_custody_link.selection__custom_employee_custody__state__done +#, python-format +msgid "Return Done" +msgstr "تم ارجاع العهده" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_custom_employee_custody__state +msgid "State" +msgstr "الحالة" + +#. module: exp_asset_custody_link +#: model:ir.model.fields.selection,name:exp_asset_custody_link.selection__asset_custody_line__custody_period__temporary +msgid "Temporary" +msgstr "موقتة" + +#. module: exp_asset_custody_link +#: model:ir.model.fields,field_description:exp_asset_custody_link.field_asset_custody_line__type +msgid "Type" +msgstr "النوع" + +#. module: exp_asset_custody_link +#: code:addons/exp_asset_custody_link/models/employee_custody.py:0 +#: model:ir.model.fields.selection,name:exp_asset_custody_link.selection__custom_employee_custody__state__wait +#, python-format +msgid "Wait Assignment" +msgstr "إنتظار الإرجاع" + +#. module: exp_asset_custody_link +#: code:addons/exp_asset_custody_link/models/employee_custody.py:0 +#: model:ir.model.fields.selection,name:exp_asset_custody_link.selection__custom_employee_custody__state__wait_release +#, python-format +msgid "Wait Release" +msgstr "إنتظار الإسناد" + +#. module: exp_asset_custody_link +#: model:ir.model,name:exp_asset_custody_link.model_asset_custody_line +msgid "asset.custody.line" +msgstr "" + +#. module: exp_asset_custody_link +#: code:addons/exp_asset_custody_link/models/employee_custody.py:0 +#: model:ir.model.fields.selection,name:exp_asset_custody_link.selection__custom_employee_custody__state__submit +#, python-format +msgid "send" +msgstr "إرسال" diff --git a/dev_odex30_accounting/exp_asset_custody_link/models/__init__.py b/dev_odex30_accounting/exp_asset_custody_link/models/__init__.py new file mode 100644 index 0000000..83a7fdf --- /dev/null +++ b/dev_odex30_accounting/exp_asset_custody_link/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import account_asset_operation +from . import employee_custody \ No newline at end of file diff --git a/dev_odex30_accounting/exp_asset_custody_link/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/exp_asset_custody_link/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f166c2a978cd5c2e611eb6de146bf764cdd4f49f GIT binary patch literal 363 zcmZus!Ab)$5S{E+t3tt>x84-?VAHAx58@|Cp|^sBusgVEv&oWVrRxv)34Vh3H$6(P zp1c)$>&aQWLJtnZo0pe2;30s}XG_{opLVAxu*b;>Hq)$ literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_custody_link/models/__pycache__/account_asset_operation.cpython-311.pyc b/dev_odex30_accounting/exp_asset_custody_link/models/__pycache__/account_asset_operation.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8a58804ecb75887f5e42955cc16a46ac0474017 GIT binary patch literal 4755 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 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/exp_asset_custody_link/models/__pycache__/employee_custody.cpython-311.pyc b/dev_odex30_accounting/exp_asset_custody_link/models/__pycache__/employee_custody.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a769fe2469a01b138b03e00dfd9485891f79a114 GIT binary patch literal 7860 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 + + + Assets Assignment + account.asset.operation + list,form + { 'create': False } + [('emp_asset_custody_id', '=', active_id),('type', '=', 'assignment')] + + + + + Assets Release + account.asset.operation + list,form + { 'create': False } + [('emp_asset_custody_id', '=', active_id),('type', '=', 'release')] + + + + + Employee Custody With Asset + custom.employee.custody + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + +
+
+ + hr_employee.extend1.form2 + hr.employee + + + + + + + + + +
+ diff --git a/dev_odex30_accounting/odex30_account_accountant/__init__.py b/dev_odex30_accounting/odex30_account_accountant/__init__.py new file mode 100644 index 0000000..a31a691 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/__init__.py @@ -0,0 +1,46 @@ + +from . import models +from . import wizard + +from odoo import Command + +import logging + +_logger = logging.getLogger(__name__) + + +def _odex30_account_accountant_post_init(env): + country_code = env.company.country_id.code + if country_code: + module_list = [] + + # SEPA zone countries will be using SEPA + sepa_zone = env.ref('base.sepa_zone', raise_if_not_found=False) + sepa_zone_country_codes = sepa_zone and sepa_zone.mapped('country_ids.code') or [] + + if country_code in sepa_zone_country_codes: + module_list.extend(['account_iso20022', 'account_bank_statement_import_camt']) + + module_ids = env['ir.module.module'].search([('name', 'in', module_list), ('state', '=', 'uninstalled')]) + if module_ids: + module_ids.sudo().button_install() + + for company in env['res.company'].search([('chart_template', '!=', False)], order="parent_path"): + ChartTemplate = env['account.chart.template'].with_company(company) + ChartTemplate._load_data({ + 'res.company': ChartTemplate._get_account_accountant_res_company(company.chart_template), + }) + + +def uninstall_hook(env): + # Disable the basic group to remove access menus defined in account + group_basic = env.ref('account.group_account_basic') + group_manager = env.ref('account.group_account_manager') + if group_basic: + group_basic.write({ + 'users': [Command.clear()], + 'category_id': env.ref("base.module_category_hidden").id, + }) + group_manager.write({ + 'implied_ids': [Command.unlink(group_basic.id)], + }) diff --git a/dev_odex30_accounting/odex30_account_accountant/__manifest__.py b/dev_odex30_accounting/odex30_account_accountant/__manifest__.py new file mode 100644 index 0000000..9506e4b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/__manifest__.py @@ -0,0 +1,63 @@ +{ + 'name': 'Invoicing', + 'version': '1.1', + 'category': 'Odex30-Accounting/Odex30-Accounting', + 'sequence': 30, + 'summary': 'Manage financial and analytic accounting', + 'description': """ + Accounting Access Rights + ======================== + It gives the Administrator user access to all accounting features such as journal items and the chart of accounts. + + It assigns manager and user access rights to the Administrator for the accounting application and only user rights to the Demo user. + """, + 'author': "Expert Co. Ltd.", + 'website': "http://www.exp-sa.com", + 'depends': ['account', 'web_tour'], + 'data': [ + 'data/ir_cron.xml', + 'data/digest_data.xml', + 'data/odex30_account_accountant_tour.xml', + + 'security/ir.model.access.csv', + 'security/odex30_account_accountant_security.xml', + + 'views/odex30_account_account_views.xml', + 'views/account_fiscal_year_view.xml', + 'views/account_journal_dashboard_views.xml', + 'views/account_move_views.xml', + 'views/account_payment_views.xml', + 'views/odex30_account_reconcile_views.xml', + 'views/account_reconcile_model_views.xml', + 'views/odex30_account_accountant_menuitems.xml', + 'views/digest_views.xml', + 'views/res_config_settings_views.xml', + 'views/product_views.xml', + 'views/bank_rec_widget_views.xml', + 'views/report_invoice.xml', + + 'wizard/account_change_lock_date.xml', + 'wizard/account_auto_reconcile_wizard.xml', + 'wizard/account_reconcile_wizard.xml', + 'wizard/reconcile_model_wizard.xml', + ], + + 'installable': True, + 'auto_install': True, + 'post_init_hook': '_odex30_account_accountant_post_init', + 'uninstall_hook': "uninstall_hook", + 'assets': { + 'web.assets_backend': [ + 'odex30_account_accountant/static/src/js/tours/account_accountant.js', + 'odex30_account_accountant/static/src/components/**/*', + 'odex30_account_accountant/static/src/**/*.xml', + ], + 'web.assets_unit_tests': [ + 'odex30_account_accountant/static/tests/**/*', + ('remove', 'odex30_account_accountant/static/tests/tours/**/*'), + ], + 'web.assets_tests': [ + 'odex30_account_accountant/static/tests/tours/**/*', + ], + } +} diff --git a/dev_odex30_accounting/odex30_account_accountant/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5474856a402dc41842da8e69d2222691fed8c89 GIT binary patch literal 2817 zcmah~O>7fK6rS~Z?X`E4Msb`tbpkXLs6}wn019fLqAeno2q|jmpQU!Scs9-&d)Lfv zps}1PQhSK1O8pTPRn;G#Xe&5ys(R$uX*h zdGF1eZ+;yZh$CplpWoHrk0A69oAevsBOZMW#4Uso=1Qo{ozTVn?vXh{JSkD;>hPH7sFBL<5+kHWyA+;HN(+J*~D7OV$==2 zsuKKw>A*DlhFLDF242qlc3>e2f9B_-=@9d=hKexhwxTargtczl;A$NCu7EZ|HB|4% z*I)ET%;C^o{x)dbd7{PFc#^E~^>9G6H^JdxbQKQlhihCdd>xUoTBt5ORZGB;LMW)o zf&VxfjaC(z2FTQI)D`Xy>8IhKZ_Mnxd~LhG{D+=9+=4LwOi%vaaaZ z%I2Xw>5!WDc#3YBbF;H^b9AcDxuP0Z70Xs_t*jZgqL(Wsv6Z}9wyQ%r$wGCnm9*YK z!-iVcXh=6QJQX}8%AKLonxPvoE0r`{m59bREmu@y9i#^Ht18$7>y;AhQ4PIt<~)@u zDq)*dRC^U-5KMwKQXTENl=W1yeU;1rjrQ!(_>;(J*o%xO+6vr3wNlYAjcA|PngOGw zsU*Kj!`2!$>EM+$+cpiQ=OdMG==Q4On^a1siWRKdDm|zaG+XIsrZ=kKD8$rPAVY9& z8Ikguah=M2e>`8LZnBh;ZrL>E9}^w(Nifnq876PhcuxV&i6p=*9e9If>vAty7AyG! zz4rLCnN_o_&8VfTt7?@L^_ffSEK%i4#4Kug+nNEBpB$fs!8DJ(d@9?eJnr0VKPcTO z%wX-h(v{uG4RZP`5d4e+nbU1W$yV0si@P*;$SD=mg8Bhbas>QlkaNWS+tQemo^vGjwdJvvyss(ma}LZoCq8iYf7p<7uAFn^ z+;%eMj30HA)2-z3X7c#Gl|S+Q3(m<)&fBJQqS8oSbCcJ$;%zC}L0oL6EsuWn))#Lz z+3m#W*Bfr)P%AOrOiVl3i_WoS=e@j>m~JGno4_3u79_9R zindc}XX1pLI@wCS-b}rIf4-5r;HEBY4Yb8%OFYmN547d+@6WW-OU?AsU+=pY^Nloi z)40Qjrs5A#C?@^Oy3UhM=o^0oNkxJ8gdwi?o}7bJv-hOVMD{ei3svA)eZox`2pA-db$r-2zcRpRO6o53+_|k z_M$AqSPy3-%hhxri3-GAtMqGJ0rb`L)ybzX!c(sn0L9WCM)xju9w4t^0urz47;8o* zM1?g=BNmnX6&+IvK)0l8nBjFMLPjCMRJcKOTO;gvsgN%Lo&oFvvaJ~<-ME_J$$qvX zbsh8^qXXSZ&k>8A24Dv{%mfF0h*nlj^C~$G%!BZ^{(x>1Z4W1J9r^Z%^Za~c_>?<* zYV$&SWUPBH7aAj{-I3Fq7u(U{4vGp=TTHaX@uoQb_vqx!@;By9(@7p~r}zCb|HHg< z@N6Ufn#;a(9f42BI|#amh-Wno9ZaDUQEap&rki3KF2YZXKQ8~aaQD^5#4GN^D^7X= zuEFHfuYq?VByhp=gS-T;XC#UUiFh!wJ zKz+vYpvud}@5nRgrR%YHx_f}Hk_9l!D&P7Px(?5A+%_6?`GkQ+a=8SO+yI0(t_vJ#u_?L7bf0~M6PI{*Lx literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_accountant/data/digest_data.xml b/dev_odex30_accounting/odex30_account_accountant/data/digest_data.xml new file mode 100644 index 0000000..666229e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/data/digest_data.xml @@ -0,0 +1,23 @@ + + + + + True + + + + + Tip: Bulk update journal items + 900 + + +
+ Tip: Bulk update journal items +

From any list view, select multiple records and the list becomes editable. If you update a cell, selected records are updated all at once. Use this feature to update multiple journal entries from the General Ledger, or any Journal view.

+ +
+
+
+ +
+
diff --git a/dev_odex30_accounting/odex30_account_accountant/data/ir_cron.xml b/dev_odex30_accounting/odex30_account_accountant/data/ir_cron.xml new file mode 100644 index 0000000..3398c92 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/data/ir_cron.xml @@ -0,0 +1,11 @@ + + + + Try to reconcile automatically your statement lines + + code + model._cron_try_auto_reconcile_statement_lines(batch_size=100) + 1 + days + + diff --git a/dev_odex30_accounting/odex30_account_accountant/data/odex30_account_accountant_tour.xml b/dev_odex30_accounting/odex30_account_accountant/data/odex30_account_accountant_tour.xml new file mode 100644 index 0000000..4346f60 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/data/odex30_account_accountant_tour.xml @@ -0,0 +1,11 @@ + + + + odex30_account_accountant_tour + 50 + Good job! You went through all steps of this tour. +
See how to manage your customer invoices in the Customers/Invoices menu + ]]>
+
+
diff --git a/dev_odex30_accounting/odex30_account_accountant/i18n/ar.po b/dev_odex30_accounting/odex30_account_accountant/i18n/ar.po new file mode 100644 index 0000000..580292e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/i18n/ar.po @@ -0,0 +1,2950 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_accountant +# +# Translators: +# Martin Trigaux, 2024 +# Mustafa J. Kadhem , 2024 +# Wil Odoo, 2025 +# Malaz Abuidris , 2025 +# Weblate , 2025. +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-10-16 18:48+0000\n" +"PO-Revision-Date: 2025-11-10 12:44+0000\n" +"Last-Translator: Weblate \n" +"Language-Team: Arabic \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" +"X-Generator: Weblate 5.12.2\n" + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget_line.py:0 +msgid "" +"%(display_name_html)s with an open amount of %(open_amount)s will be fully " +"reconciled by the transaction." +msgstr "" +"%(display_name_html)s مع مبلغ مفتوح قدره %(open_amount)s ستتم تسويته تماماً " +"بواسطة المعاملة. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget_line.py:0 +msgid "" +"%(display_name_html)s with an open amount of %(open_amount)s will be reduced " +"by %(amount)s." +msgstr "" +"%(display_name_html)s مع مبلغ مفتوح قدره %(open_amount)s سيتم تقليله بـ %" +"(amount)s. " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_form +msgid "-> Reconcile" +msgstr "-> تسوية " + +#. module: odex30_account_accountant +#: model_terms:digest.tip,tip_description:odex30_account_accountant.digest_tip_account_accountant_0 +msgid "Tip: Bulk update journal items" +msgstr "نصيحة: قم بتحديث بنود اليومية بالجملة" + +#. module: odex30_account_accountant +#: model_terms:digest.tip,tip_description:odex30_account_accountant.digest_tip_account_accountant_1 +msgid "" +"Tip: Find an Accountant or register your Accounting " +"Firm" +msgstr "" +"نصيحة: اعثر على محاسب ليقوم بتسجيل شركة المحاسبة " +"الخاصة بك" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.account_reconcile_model_form_inherit_account_accountant +msgid "" +"\n" +" Run manually" +msgstr "" +"\n" +" التشغيل يدوياً " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "Lock transactions up to specific dates, inclusive" +msgstr "قفل المعاملات حتى تواريخ محددة، شاملة التواريخ نفسها " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_form_inherit +msgid "1 Bank Transaction" +msgstr "معاملة بنكية واحدة 1" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_form_inherit +msgid "Bank Statement" +msgstr "كشف حساب بنكي " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_reconcile_wizard +msgid "" +" in " +msgstr "" +" في " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_reconcile_wizard +msgid "" +" in " +msgstr "" +" في " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "" +"\n" +" This change is irreversible\n" +" " +msgstr "" +"\n" +" لا يمكن التراجع عن هذا " +"التغيير\n" +" " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "" +"\n" +" ; \n" +" " +msgstr "" +"\n" +" ; \n" +" " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "" +"\n" +" ; \n" +" " +msgstr "" +"\n" +" ; \n" +" " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "" +"\n" +" ; \n" +" " +msgstr "" +"\n" +" ; \n" +" " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "" +"\n" +" ; \n" +" " +msgstr "" +"\n" +" ; \n" +" " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "" +"\n" +" but allow exceptions\n" +" " +msgstr "" +"\n" +" ولكن يُسمَح بالاستثناءات\n" +" " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "" +"\n" +" after a tax closing\n" +" " +msgstr "" +"\n" +" بعد الإقفال الضريبي\n" +" " + +#. module: odex30_account_accountant +#: model_terms:digest.tip,tip_description:odex30_account_accountant.digest_tip_account_accountant_1 +msgid "Find an Accountant" +msgstr "اعثر على محاسب" + +#. module: odex30_account_accountant +#: model_terms:digest.tip,tip_description:odex30_account_accountant.digest_tip_account_accountant_1 +msgid "Register your Accounting Firm" +msgstr "" +"قم بتسجيل شركة المحاسبة الخاصة بك" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_reconcile_wizard +msgid " (" +msgstr " (" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_reconcile_wizard +msgid ")" +msgstr ")" + +#. module: odex30_account_accountant +#: model_terms:web_tour.tour,rainbow_man_message:odex30_account_accountant.odex30_account_accountant_tour +msgid "" +"Good job! You went through all steps of this tour.\n" +"
See how to manage your customer invoices in the Customers/" +"Invoices menu\n" +"
" +msgstr "" +"عمل رائع! لقد اجتزت كافة خطوات هذه الجولة.\n" +"
تعرّف على كيفية إدارة فواتير العملاء من قائمة العملاء/" +"فواتير العملاء\n" +"
" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "Exception" +msgstr "استثناء " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.js:0 +#: model:ir.model,name:odex30_account_accountant.model_account_account +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__account_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__account_id +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +msgid "Account" +msgstr "الحساب " + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_account_chart_template +msgid "Account Chart Template" +msgstr "نموذج مخطط الحساب " + +#. module: odex30_account_accountant +#: model:ir.actions.act_window,name:odex30_account_accountant.action_account_group_tree +#: model:ir.ui.menu,name:odex30_account_accountant.menu_account_group +msgid "Account Groups" +msgstr "مجموعات الحساب" + +#. module: odex30_account_accountant +#: model:ir.actions.act_window,name:odex30_account_accountant.account_tag_action +#: model:ir.ui.menu,name:odex30_account_accountant.account_tag_menu +msgid "Account Tags" +msgstr "علامات تصنيف الحساب " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__transfer_from_account_id +msgid "Account Transfer From" +msgstr "استمارة تحويل الحساب " + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_account_auto_reconcile_wizard +msgid "Account automatic reconciliation wizard" +msgstr "معالج تسوية الحساب الآلية " + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_account_reconcile_wizard +msgid "Account reconciliation wizard" +msgstr "معالج تسوية الحساب " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_res_config_settings__deferred_expense_account_id +msgid "Account used for deferred expenses" +msgstr "الحساب المستخدم للنفقات المؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_res_config_settings__deferred_revenue_account_id +msgid "Account used for deferred revenues" +msgstr "الحساب المستخدم للإيرادات المؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_auto_reconcile_wizard__account_ids +msgid "Accounts" +msgstr "الحسابات" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement__message_needaction +msgid "Action Needed" +msgstr "إجراء مطلوب" + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_quick_create.xml:0 +msgid "Add & Close" +msgstr "إضافة وإغلاق " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_quick_create.xml:0 +msgid "Add & New" +msgstr "إضافة وجديد " + +#. module: odex30_account_accountant +#: model_terms:ir.actions.act_window,help:odex30_account_accountant.account_tag_action +msgid "Add a new tag" +msgstr "إضافة علامة تصنيف جديدة " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/js/tours/odex30_account_accountant.js:0 +msgid "" +"After the data extraction, check and validate the bill. If no vendor has " +"been found, add one before validating." +msgstr "" +"بعد استخلاص البيانات، تحقق من الفاتورة وقم بتصديقها. في حال عدم إيجادك " +"لمورّد، قم بإضافة واحد قبل التصديق. " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/finish_buttons.xml:0 +msgid "All Transactions" +msgstr "كافة المعاملات " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__reco_model_autocomplete_ids +msgid "All reconciliation models" +msgstr "كافة نماذج التسوية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__allow_partials +msgid "Allow partials" +msgstr "السماج بالأجزاء " + +#. module: odex30_account_accountant +#: model:res.groups,name:odex30_account_accountant.group_fiscal_year +msgid "Allow to define fiscal years of more or less than a year" +msgstr "السماح بإنشاء سنوات مالية أطول أو أقصر من عام" + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.js:0 +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__amount_currency +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_reconcile_wizard +msgid "Amount" +msgstr "مبلغ" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__amount_currency +msgid "Amount Currency" +msgstr "عملة المبلغ" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_list_bank_rec_widget +msgid "Amount Due" +msgstr "المبلغ المستحق" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_list_bank_rec_widget +msgid "Amount Due (in currency)" +msgstr "المبلغ المستحق (بالعملة) " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.js:0 +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__amount_transaction_currency +msgid "Amount in Currency" +msgstr "المبلغ بالعملة" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__amount +msgid "Amount in company currency" +msgstr "المبلغ بعملة الشركة " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_reconcile_wizard.py:0 +msgid "" +"An entry will transfer %(amount)s from %(from_account)s to %(to_account)s." +msgstr "سيقوم القيد بتحويل %(amount)s من %(from_account)s إلى %(to_account)s. " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.js:0 +msgid "Analytic" +msgstr "تحليلي" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__analytic_distribution +msgid "Analytic Distribution" +msgstr "التوزيع التحليلي" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__analytic_precision +msgid "Analytic Precision" +msgstr "الدقة التحليلية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__use_anglo_saxon +msgid "Anglo-Saxon Accounting" +msgstr "المحاسبة الأنجلو-ساكسونية" + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_change_lock_date__current_hard_lock_date +#: model:ir.model.fields,help:odex30_account_accountant.field_account_change_lock_date__hard_lock_date +msgid "" +"Any entry up to and including that date will be postponed to a later time, " +"in accordance with its journal sequence. This lock date is irreversible and " +"does not allow any exception." +msgstr "" +"سيتم تأجيل أي قيد حتى ذلك التاريخ إلى وقت لاحق، وفقًا لتسلسل دفتر اليومية " +"الخاص به. لا يمكن التراجع عن تاريخ القفل هذا ولا يسمح بأي استثناء. " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_change_lock_date__fiscalyear_lock_date +msgid "" +"Any entry up to and including that date will be postponed to a later time, " +"in accordance with its journal's sequence." +msgstr "" +"أي قيد إلى ذلك التاريخ سيتم تأجيله إلى وقت لاحق، وفقًا لتسلسله في دفتر " +"اليومية. " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_change_lock_date__tax_lock_date +msgid "" +"Any entry with taxes up to and including that date will be postponed to a " +"later time, in accordance with its journal's sequence. The tax lock date is " +"automatically set when the tax closing entry is posted." +msgstr "" +"سيتم تأجيل أي قيد يتضمن ضرائب حتى ذلك التاريخ إلى وقت لاحق، وفقاً لتسلسل دفتر " +"اليومية الخاص به. يتم تعيين تاريخ قفل الضرائب تلقائياً عند ترحيل قيد الإقفال " +"الضريبي. " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_change_lock_date__purchase_lock_date +msgid "" +"Any purchase entry prior to and including this date will be postponed to a " +"later date, in accordance with its journal's sequence." +msgstr "" +"أي قيد شراء قبل ذلك التاريخ سيتم تأجيله إلى تاريخ لاحق، وفقاً لتسلسله في دفتر " +"اليومية. " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_change_lock_date__sale_lock_date +msgid "" +"Any sales entry prior to and including this date will be postponed to a " +"later date, in accordance with its journal's sequence." +msgstr "" +"أي قيد بيع قبل ذلك التاريخ سيتم تأجيله إلى تاريخ لاحق، وفقاً لتسلسله في دفتر " +"اليومية. " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement__message_attachment_count +msgid "Attachment Count" +msgstr "عدد المرفقات" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__sign_invoice +msgid "Authorized Signatory on invoice" +msgstr "الموقِّع المصرّح له في الفاتورة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.report_invoice_document +msgid "Authorized signatory" +msgstr "الموقِّع المصرّح له " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/move_line_list_reconcile/move_line_list_reconcile.xml:0 +msgid "Auto-reconcile" +msgstr "التسوية التلقائية " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_auto_reconcile_wizard.py:0 +msgid "Automatically Reconciled Entries" +msgstr "القيود المسواة آلياً " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__available_reco_model_ids +msgid "Available Reco Model" +msgstr "نموذج التسوية المتاح " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/finish_buttons.xml:0 +msgid "Back to" +msgstr "العودة إلى " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/global_info.xml:0 +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__balance +msgid "Balance" +msgstr "الرصيد" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_digest_digest__kpi_account_bank_cash +msgid "Bank & Cash Moves" +msgstr "تحركات النقد والبنوك " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__bank_account +msgid "Bank Account" +msgstr "الحساب البنكي" + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_bank_statement.py:0 +#: model:ir.actions.act_window,name:odex30_account_accountant.action_bank_statement_line_transactions +#: model:ir.actions.act_window,name:odex30_account_accountant.action_bank_statement_line_transactions_kanban +msgid "Bank Reconciliation" +msgstr "التسوية البنكية" + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_account_bank_statement +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_form_bank_rec_widget +msgid "Bank Statement" +msgstr "كشف الحساب البنكي " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_bank_statement.py:0 +msgid "Bank Statement %s.pdf" +msgstr "كشف الحساب البنكي %s.pdf " + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "بند كشف الحساب البنكي" + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_bank_statement.py:0 +msgid "Bank Statement.pdf" +msgstr "كشف الحساب البنكي.pdf" + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_bank_rec_widget +msgid "Bank reconciliation widget for a single statement line" +msgstr "أداة التسوية البنكية لبند كشف حساب واحد " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "Based on" +msgstr "بناءً على" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_reconcile_model_widget_wizard +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_form_bank_rec_widget +msgid "Cancel" +msgstr "إلغاء" + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_account_change_lock_date +msgid "Change Lock Date" +msgstr "تغيير تاريخ الإقفال" + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_reconcile_wizard__to_check +msgid "Check if you are not certain of all the information of the counterpart." +msgstr "تحقق من تأكدك من كافة المعلومات المقابلة. " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__st_line_checked +msgid "Checked" +msgstr "تم تحديده " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/move_line_list/move_line_list.xml:0 +msgid "Choose a line to preview its attachments." +msgstr "قم بتحديد بند لمعاينة مرفقاته. " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__account_auto_reconcile_wizard__search_mode__zero_balance +msgid "Clear Account" +msgstr "تصفية الحساب " + +#. module: odex30_account_accountant +#: model_terms:ir.actions.act_window,help:odex30_account_accountant.actions_account_fiscal_year +msgid "Click here to create a new fiscal year." +msgstr "انقر هنا لإنشاء سنة مالية جديدة." + +#. module: odex30_account_accountant +#: model_terms:digest.tip,tip_description:odex30_account_accountant.digest_tip_account_accountant_1 +msgid "" +"Click here to find an accountant or if you want to list out your accounting " +"services on Odoo" +msgstr "" +"انقر هنا لإيجاد محاسب أو إذا كنت ترغب في إدراج خدماتك المحاسبية على أودو " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/js/tours/odex30_account_accountant.js:0 +msgid "" +"Click on a fetched bank transaction to start the reconciliation process." +msgstr "انقر على المعاملة المصرفية التي تم جلبها لبدء عملية التسوية. " + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_res_company +msgid "Companies" +msgstr "الشركات" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_auto_reconcile_wizard__company_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__company_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_fiscal_year__company_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__company_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__company_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__company_id +msgid "Company" +msgstr "الشركة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__company_currency_id +msgid "Company currency" +msgstr "عملة الشركة " + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_res_config_settings +msgid "Config Settings" +msgstr "تهيئة الإعدادات " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/js/tours/odex30_account_accountant.js:0 +msgid "Confirm the transaction." +msgstr "قم بتأكيد المعاملة. " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/rainbowman_content.xml:0 +msgid "Congrats, you're all done!" +msgstr "تهانينا، لقد انتهيت!" + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/js/tours/odex30_account_accountant.js:0 +msgid "Connect your bank and get your latest transactions." +msgstr "قم بربط مصرفك لتتمكن من رؤية أحدث معاملاتك. " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_reconcile_model_widget_wizard +msgid "Counterpart Values" +msgstr "قيم مقابلة" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__country_code +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__country_code +msgid "Country Code" +msgstr "رمز الدولة " + +#. module: odex30_account_accountant +#: model:ir.actions.act_window,name:odex30_account_accountant.action_bank_statement_form_bank_rec_widget +msgid "Create Statement" +msgstr "إنشاء كشف الحساب" + +#. module: odex30_account_accountant +#: model_terms:ir.actions.act_window,help:odex30_account_accountant.action_account_group_tree +msgid "Create a new account group" +msgstr "إنشاء مجموعة حساب جديدة " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/js/tours/odex30_account_accountant.js:0 +msgid "Create a new transaction." +msgstr "إنشاء معاملة جديدة. " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "Create model" +msgstr "إنشاء نموذج " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/js/tours/odex30_account_accountant.js:0 +msgid "" +"Create your first vendor bill.

Tip: If you don’t have one on " +"hand, use our sample bill." +msgstr "" +"أنشئ فاتورة المورّد الأولى الخاصة بك.

نصيحة: إذا لم تكن لديك " +"فاتورة في متناول اليد، فبإمكانك الاستعانة بنموذج الفاتورة لدينا. " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_auto_reconcile_wizard__create_uid +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__create_uid +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_fiscal_year__create_uid +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__create_uid +msgid "Created by" +msgstr "أنشئ بواسطة" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_auto_reconcile_wizard__create_date +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__create_date +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_fiscal_year__create_date +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__create_date +msgid "Created on" +msgstr "أنشئ في" + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.js:0 +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__credit +msgid "Credit" +msgstr "الدائن" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement_line__cron_last_check +msgid "Cron Last Check" +msgstr "آخر فحص Cron " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.js:0 +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__currency_id +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Currency" +msgstr "العملة" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__reco_currency_id +msgid "Currency to use for reconciliation" +msgstr "العملة لاستخدامها في التسوية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__current_hard_lock_date +msgid "Current Hard Lock" +msgstr "تاريخ القفل الثابت الحالي " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget.py:0 +msgid "Customer/Vendor" +msgstr "العميل/المورد" + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.js:0 +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__date +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__date +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_search_bank_rec_widget +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +msgid "Date" +msgstr "التاريخ" + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_move_line__deferred_end_date +msgid "Date at which the deferred expense/revenue ends" +msgstr "التاريخ الذي تنتهي فيه النفقات/الإيرادات المؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_move_line__deferred_start_date +msgid "Date at which the deferred expense/revenue starts" +msgstr "التاريخ الذي تبدأ فيه النفقات/الإيرادات المؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__res_company__deferred_expense_amount_computation_method__day +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__res_company__deferred_revenue_amount_computation_method__day +msgid "Days" +msgstr "أيام " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.js:0 +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__debit +msgid "Debit" +msgstr "المدين" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__journal_default_account_id +msgid "Default Account" +msgstr "الحساب الافتراضي " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_move.py:0 +msgid "Deferral of %s" +msgstr "تأجيل %s " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_move.py:0 +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement_line__deferred_move_ids +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_move__deferred_move_ids +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_form_inherit +msgid "Deferred Entries" +msgstr "القيم المؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement_line__deferred_entry_type +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_move__deferred_entry_type +msgid "Deferred Entry Type" +msgstr "نوع القيد المؤجل " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__account_move__deferred_entry_type__expense +msgid "Deferred Expense" +msgstr "النفقات المؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_company__deferred_expense_account_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__deferred_expense_account_id +msgid "Deferred Expense Account" +msgstr "حساب النفقات المؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_company__deferred_expense_amount_computation_method +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__deferred_expense_amount_computation_method +msgid "Deferred Expense Based on" +msgstr "النفقات المؤجلة بناءً على " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_company__deferred_expense_journal_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__deferred_expense_journal_id +msgid "Deferred Expense Journal" +msgstr "حساب الإيرادات المؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__account_move__deferred_entry_type__revenue +msgid "Deferred Revenue" +msgstr "الإيرادات المؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_company__deferred_revenue_account_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__deferred_revenue_account_id +msgid "Deferred Revenue Account" +msgstr "حساب الإيرادات المؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_company__deferred_revenue_amount_computation_method +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__deferred_revenue_amount_computation_method +msgid "Deferred Revenue Based on" +msgstr "الإيرادات المؤجلة بناءً على " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_company__deferred_revenue_journal_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__deferred_revenue_journal_id +msgid "Deferred Revenue Journal" +msgstr "دفتر يومية الإيرادات المؤجلة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "Deferred expense" +msgstr "النفقة المؤجلة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "Deferred expense entries:" +msgstr "قيود النفقات المؤجلة: " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "Deferred revenue" +msgstr "الإيرادات المؤجلة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "Deferred revenue entries:" +msgstr "قيود الإيرادات المؤجلة: " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "Define fiscal years of more or less than one year" +msgstr "تحديد السنوات المالية التي تزيد أو تقل عن السنة." + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +msgid "Deposits" +msgstr "الدفعات المقدّمة" + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_digest_digest +msgid "Digest" +msgstr "الموجز " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_auto_reconcile_wizard +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_reconcile_wizard +msgid "Discard" +msgstr "إهمال " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Discount Amount" +msgstr "مبلغ الخصم " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Discount Date" +msgstr "تاريخ الخصم" + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "Discuss" +msgstr "المناقشة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__display_allow_partials +msgid "Display Allow Partials" +msgstr "عرض خيار السماح بعمليات التسوية الجزئية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_auto_reconcile_wizard__display_name +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__display_name +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_fiscal_year__display_name +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__display_name +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__display_name +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__display_name +msgid "Display Name" +msgstr "اسم العرض " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__display_stroked_amount_currency +msgid "Display Stroked Amount Currency" +msgstr "عرض عملة المبلغ المشطوب " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__display_stroked_balance +msgid "Display Stroked Balance" +msgstr "عرض الرصيد المشطوب " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_company__sign_invoice +msgid "Display signing field on invoices" +msgstr "عرض حقل التوقيع على الفاتورة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__distribution_analytic_account_ids +msgid "Distribution Analytic Account" +msgstr "حساب التوزيع التحليلي " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/digest.py:0 +msgid "Do not have access, skip this data for user's digest email" +msgstr "لا تملك صلاحيات الوصول. تخط هذه البيانات لبريد الملخص للمستخدم. " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_list_bank_rec_widget +msgid "Document" +msgstr "المستند " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_change_lock_date.py:0 +msgid "Draft Entries" +msgstr "القيود في حالة المسودة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__edit_mode +msgid "Edit Mode" +msgstr "وضع التحرير " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__edit_mode_amount +msgid "Edit Mode Amount" +msgstr "وضع التحرير للمبلغ " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__edit_mode_reco_currency_id +msgid "Edit Mode Reco Currency" +msgstr "وضع التحرير لعملة التسوية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__edit_mode_amount_currency +msgid "Edit mode amount" +msgstr "وضع التحرير للمبلغ " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_fiscal_year__date_to +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_move_line__deferred_end_date +msgid "End Date" +msgstr "تاريخ الانتهاء" + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_fiscal_year__date_to +msgid "Ending Date, included in the fiscal year." +msgstr "تاريخ الانتهاء، ضمن السنة المالية. " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_res_company__invoicing_switch_threshold +#: model:ir.model.fields,help:odex30_account_accountant.field_res_config_settings__invoicing_switch_threshold +msgid "" +"Every payment and invoice before this date will receive the 'From Invoicing' " +"status, hiding all the accounting entries related to it. Use this option " +"after installing Accounting if you were using only Invoicing before, before " +"importing all your actual accounting data in to Odoo." +msgstr "" +"سوف يكون لكل فاتورة وعملية دفع قبل هذا التاريخ حالة ’من تطبيق الفوترة‘ والتي " +"ستخفي كافة القيود المحاسبية المتعلقة بها. استخدم هذا الخيار بعد تثبيت تطبيق " +"المحاسبة إذا كنت تستخدم تطبيق الفوترة وحده من قبل، قبل إدخالك لكافة بياناتك " +"المحاسبية الفعلية في أودو. " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__exception_duration +msgid "Exception Duration" +msgstr "مدة الاستثناء " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__exception_needed_fields +msgid "Exception Needed Fields" +msgstr "الحقول التي تحتاج إلى استثناء " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__exception_reason +msgid "Exception Reason" +msgstr "سبب الاستثناء " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__exception_applies_to +msgid "Exception applies" +msgstr "يمكن تطبيق الاستثناء " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__exception_needed +msgid "Exception needed" +msgstr "بحاجة إلى استثناء " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget.py:0 +msgid "Exchange Difference: %s" +msgstr "فرق سعر الصرف: %s" + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_account_fiscal_year +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "Fiscal Year" +msgstr "سنة مالية" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.action_account_fiscal_year_form +msgid "Fiscal Year 2018" +msgstr "السنة المالية 2018" + +#. module: odex30_account_accountant +#: model:ir.actions.act_window,name:odex30_account_accountant.actions_account_fiscal_year +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__group_fiscal_year +#: model:ir.ui.menu,name:odex30_account_accountant.menu_account_fiscal_year +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "Fiscal Years" +msgstr "السنوات المالية" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__fiscalyear_last_day +msgid "Fiscalyear Last Day" +msgstr "آخر أيام السنة المالية" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__fiscalyear_last_month +msgid "Fiscalyear Last Month" +msgstr "آخر شهور السنة المالية" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__flag +msgid "Flag" +msgstr "إبلاغ" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement__message_follower_ids +msgid "Followers" +msgstr "المتابعين" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement__message_partner_ids +msgid "Followers (Partners)" +msgstr "المتابعين (الشركاء) " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "For everyone:" +msgstr "للجميع: " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "For me:" +msgstr "لي: " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__force_partials +msgid "Force Partials" +msgstr "فرض عمليات التسوية الجزئية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__force_price_included_taxes +msgid "Force Price Included Taxes" +msgstr "فرض الأسعار شاملة الضريبة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__transaction_currency_id +msgid "Foreign Currency" +msgstr "عملة أجنبية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__form_index +msgid "Form Index" +msgstr "فهرس النموذج" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_auto_reconcile_wizard__from_date +msgid "From" +msgstr "من" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +msgid "From Trade Payable accounts" +msgstr "من الحسابات الدائنة التجارية " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +msgid "From Trade Receivable accounts" +msgstr "من الحسابات المدينة التجارية " + +#. module: odex30_account_accountant +#: model_terms:digest.tip,tip_description:odex30_account_accountant.digest_tip_account_accountant_0 +msgid "" +"From any list view, select multiple records and the list becomes editable. " +"If you update a cell, selected records are updated all at once. Use this " +"feature to update multiple journal entries from the General Ledger, or any " +"Journal view." +msgstr "" +"قم باختيار سجلات متعددة من أي نافذة عرض القائمة، وستصبح القائمة قابلة " +"للتحرير. إذا قمت بتحديث إحدى الخلايا، يتم تحديث كافة السجلات المختارة دفعة " +"واحدة. استخدم هذه الخاصية لتحديث عدة بنود في اليومية من دفتر الأستاذ العام " +"أو أي نافذة عرض لليومية. " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__res_company__deferred_expense_amount_computation_method__full_months +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__res_company__deferred_revenue_amount_computation_method__full_months +msgid "Full Months" +msgstr "أشهر كاملة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_company__generate_deferred_expense_entries_method +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__generate_deferred_expense_entries_method +msgid "Generate Deferred Expense Entries" +msgstr "إنشاء قيود النفقات المؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_company__generate_deferred_revenue_entries_method +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__generate_deferred_revenue_entries_method +msgid "Generate Deferred Revenue Entries" +msgstr "إنشاء قيود الإيرادات المؤجلة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "Generate Entries" +msgstr "إنشاء القيود" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +msgid "Group By" +msgstr "تجميع حسب" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__group_tax_id +msgid "Group Tax" +msgstr "مجموعة الضريبة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__hard_lock_date +msgid "Hard Lock" +msgstr "تاريخ القفل الثابت " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_move_line__has_abnormal_deferred_dates +msgid "Has Abnormal Deferred Dates" +msgstr "يحتوي على تواريخ مؤجلة غير معتادة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_move_line__has_deferred_moves +msgid "Has Deferred Moves" +msgstr "يحتوي على حركات مؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement__has_message +msgid "Has Message" +msgstr "يحتوي على رسالة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_auto_reconcile_wizard__id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_fiscal_year__id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__id +msgid "ID" +msgstr "المُعرف" + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_bank_statement__message_needaction +msgid "If checked, new messages require your attention." +msgstr "إذا كان محددًا، فهناك رسائل جديدة عليك رؤيتها. " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_bank_statement__message_has_error +#: model:ir.model.fields,help:odex30_account_accountant.field_account_bank_statement__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "إذا كان محددًا، فقد حدث خطأ في تسليم بعض الرسائل." + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_bank_rec_widget__st_line_checked +msgid "" +"If this checkbox is not ticked, it means that the user was not sure of all " +"the related information at the time of the creation of the move and that the " +"move needs to be checked again." +msgstr "" +"إذا لم يكن هذا المربع محدداً، هذا يعني أن المستخدم لم يكن متأكداً من كافة " +"المعلومات ذات الصلة في الوقت الذي أُنشئت فيه الحركة، وأنه يجب التحقق من " +"الحركة مجدداً. " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "In Company Currency" +msgstr "بعملة الشركة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "In Currency" +msgstr "بالعملة " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "In Foreign Currency" +msgstr "بالعملة الأجنبية " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_search_bank_rec_widget +msgid "Incoming" +msgstr "واردة " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/res_config_settings.py:0 +msgid "" +"Incorrect fiscal year date: day is out of range for month. Month: %(month)s; " +"Day: %(day)s" +msgstr "" +"تاريخ السنة المالية غير صحيح: اليوم المدخل غير موجود في هذا الشهر. الشهر: %" +"(month)s;اليوم:%(day)s " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__index +msgid "Index" +msgstr "الفهرس " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/demo/odex30_account_accountant_demo.py:0 +msgid "Insurance 12 months" +msgstr "ضمان لمدة 12 شهر " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__bank_rec_widget__state__invalid +msgid "Invalid" +msgstr "غير صالح " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +msgid "Invalid statements" +msgstr "كشوفات الحساب غير صالحة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_bank_rec_widget__state +msgid "" +"Invalid: The bank transaction can't be validate since the suspense account " +"is still involved\n" +"Valid: The bank transaction can be validated.\n" +"Reconciled: The bank transaction has already been processed. Nothing left to " +"do." +msgstr "" +"غير صالح: لا يمكن تصديق المعاملة البنكية بما أن الحساب المعلق لا يزال " +"موجوداً\n" +"صالح: يمكن تصديق المعاملة البنكية.\n" +"تمت التسوية: لقد تمت تسوية المعاملة البنكية بالفعل. لم يتبقَّ شيء للقيام به. " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_list_bank_rec_widget +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_search_bank_rec_widget +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Invoice Date" +msgstr "تاريخ الفاتورة" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_company__invoicing_switch_threshold +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__invoicing_switch_threshold +msgid "Invoicing Switch Threshold" +msgstr "الحد الأدنى لتبديل الفوترة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement__message_is_follower +msgid "Is Follower" +msgstr "متابع" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__is_multi_currency +msgid "Is Multi Currency" +msgstr "متعدد العملات " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__is_rec_pay_account +msgid "Is Rec Pay Account" +msgstr "حساب دفع التسوية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__st_line_is_reconciled +msgid "Is Reconciled" +msgstr "تمت تسويته " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__is_write_off_required +msgid "Is a write-off move required to reconcile" +msgstr "حركة الشطب مطلوبة للمساواة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__is_transfer_required +msgid "Is an account transfer required" +msgstr "تحويل الحساب مطلوب " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__transfer_warning_message +msgid "Is an account transfer required to reconcile" +msgstr "تحويل الحساب مطلوب للتسوية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__lock_date_violated_warning_message +msgid "Is the date violating the lock date of moves" +msgstr "التاريخ يتعدى على تاريخ إقفال الحركات " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_change_lock_date.py:0 +msgid "It is not possible to decrease or remove the Hard Lock Date." +msgstr "لا يمكن تقديم تاريخ القفل الثابت أو إزالته. " + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_account_journal +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__journal_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__st_line_journal_id +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +msgid "Journal" +msgstr "دفتر اليومية" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__journal_currency_id +msgid "Journal Currency" +msgstr "عملة اليومية " + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_account_move +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__move_id +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_search_bank_rec_widget +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Journal Entry" +msgstr "قيد اليومية" + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_account_move_line +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_search_bank_rec_widget +msgid "Journal Item" +msgstr "عنصر اليومية" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Journal Items" +msgstr "عناصر اليومية" + +#. module: odex30_account_accountant +#: model:ir.actions.act_window,name:odex30_account_accountant.action_move_line_posted_unreconciled +msgid "Journal Items to reconcile" +msgstr "عناصر دفتر اليومية المُراد تسويتها " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +msgid "Journal items where matching number isn't set" +msgstr "عناصر دفتر اليومية التي لم يتم تعيين رقم مطابق لها " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +msgid "" +"Journal items where the account allows reconciliation no matter the residual " +"amount" +msgstr "" +"بنود دفتر اليومية حيث يسمح الحساب بالتسوية بغض النظر عن المبلغ المتبقي " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_res_config_settings__deferred_expense_journal_id +#: model:ir.model.fields,help:odex30_account_accountant.field_res_config_settings__deferred_revenue_journal_id +msgid "Journal used for deferred entries" +msgstr "دفتر اليومية المستخدم للقيود المؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_digest_digest__kpi_account_bank_cash_value +msgid "Kpi Account Bank Cash Value" +msgstr "حساب المؤشر الرئيسي للأداء للقيمة النقدية للبنك " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__label +msgid "Label" +msgstr "بطاقة عنوان" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "Last Day" +msgstr "اليوم الأخير" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.account_journal_dashboard_kanban_view +msgid "Last Statement" +msgstr "آخر كشف حساب " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_auto_reconcile_wizard__write_uid +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__write_uid +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_fiscal_year__write_uid +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__write_uid +msgid "Last Updated by" +msgstr "آخر تحديث بواسطة" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_auto_reconcile_wizard__write_date +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__write_date +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_fiscal_year__write_date +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.account_journal_dashboard_kanban_view +msgid "Latest Statement" +msgstr "أحدث كشف حساب " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "Legal signatory" +msgstr "الطرف الموقِّع القانوني " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/js/tours/odex30_account_accountant.js:0 +msgid "Let’s go back to the dashboard." +msgstr "فلنعد إلى لوحة البيانات. " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_auto_reconcile_wizard__line_ids +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__line_ids +msgid "Line" +msgstr "البند " + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_bank_rec_widget_line +msgid "Line of the bank reconciliation widget" +msgstr "بند أداة التسوية البنكية " + +#. module: odex30_account_accountant +#: model:ir.ui.menu,name:odex30_account_accountant.menu_action_change_lock_date +msgid "Lock Dates" +msgstr "تواريخ الإقفال" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__fiscalyear_lock_date +msgid "Lock Everything" +msgstr "قفل الكل " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__fiscalyear_lock_date_for_everyone +msgid "Lock Everything For Everyone" +msgstr "إقفال كل شيء للجميع " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__fiscalyear_lock_date_for_me +msgid "Lock Everything For Me" +msgstr "إقفال كل شيء بالنسبة لي " + +#. module: odex30_account_accountant +#: model:ir.actions.act_window,name:odex30_account_accountant.action_view_account_change_lock_date +msgid "Lock Journal Entries" +msgstr "إقفال قيود اليومية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__purchase_lock_date +msgid "Lock Purchases" +msgstr "إقفال المشتريات " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__purchase_lock_date_for_everyone +msgid "Lock Purchases For Everyone" +msgstr "إقفال المشتريات للجميع " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__purchase_lock_date_for_me +msgid "Lock Purchases For Me" +msgstr "إقفال المشتريات بالنسبة لي " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__sale_lock_date +msgid "Lock Sales" +msgstr "إقفال المبيعات " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__sale_lock_date_for_everyone +msgid "Lock Sales For Everyone" +msgstr "إقفال المبيعات للجميع " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__sale_lock_date_for_me +msgid "Lock Sales For Me" +msgstr "إقفال المبيعات بالنسبة لي " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__tax_lock_date +msgid "Lock Tax Return" +msgstr "إقفال الإقرار الضريبي " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__tax_lock_date_for_everyone +msgid "Lock Tax Return For Everyone" +msgstr "إقفال الإقرار الضريبي للجميع " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__tax_lock_date_for_me +msgid "Lock Tax Return For Me" +msgstr "إقفال الإقرار الضريبي بالنسبة لي " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement__message_main_attachment_id +msgid "Main Attachment" +msgstr "المرفق الرئيسي" + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "Manual Operations" +msgstr "العمليات اليدوية " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__res_company__generate_deferred_expense_entries_method__manual +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__res_company__generate_deferred_revenue_entries_method__manual +msgid "Manually & Grouped" +msgstr "يدوياً ومجمع " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__manually_modified +msgid "Manually Modified" +msgstr "تم التعديل يدوياً " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/list_view_switcher.js:0 +msgid "Match" +msgstr "مطابقة" + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "Match Existing Entries" +msgstr "مطابقة القيود الموجودة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_kanban_bank_rec_widget +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +msgid "Matched" +msgstr "تمت المطابقة " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_payment.py:0 +msgid "Matched Transactions" +msgstr "المعاملات المتطابقة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Matching" +msgstr "مطابقة" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__matching_rules_allow_auto_reconcile +msgid "Matching Rules Allow Auto Reconcile" +msgstr "تسمح قواعد المطابقة بالتسوية التلقائية " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_quick_create_form_bank_rec_widget +msgid "Memo" +msgstr "مذكرة " + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_ir_ui_menu +msgid "Menu" +msgstr "القائمة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement__message_has_error +msgid "Message Delivery error" +msgstr "خطأ في تسليم الرسائل" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement__message_ids +msgid "Messages" +msgstr "الرسائل" + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_res_config_settings__deferred_expense_amount_computation_method +#: model:ir.model.fields,help:odex30_account_accountant.field_res_config_settings__deferred_revenue_amount_computation_method +msgid "Method used to compute the amount of deferred entries" +msgstr "الطريقة المستخدمة لاحتساب مبلغ القيود المؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_res_config_settings__generate_deferred_expense_entries_method +#: model:ir.model.fields,help:odex30_account_accountant.field_res_config_settings__generate_deferred_revenue_entries_method +msgid "Method used to generate deferred entries" +msgstr "الطريقة المستخدمة لإنشاء القيود المؤجلة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__min_fiscalyear_lock_date_exception_for_everyone_id +msgid "Min Fiscalyear Lock Date Exception For Everyone" +msgstr "الحد الأدنى لاستثناء تاريخ إقفال السنة المالية للجميع " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__min_fiscalyear_lock_date_exception_for_me_id +msgid "Min Fiscalyear Lock Date Exception For Me" +msgstr "الحد الأدنى لاستثناء تاريخ إقفال السنة المالية بالنسبة لي " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__min_purchase_lock_date_exception_for_everyone_id +msgid "Min Purchase Lock Date Exception For Everyone" +msgstr "الحد الأدنى لاستثناء تاريخ إقفال المشتريات للجميع " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__min_purchase_lock_date_exception_for_me_id +msgid "Min Purchase Lock Date Exception For Me" +msgstr "الحد الأدنى لاستثناء تاريخ إقفال المشتريات بالنسبة لي " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__min_sale_lock_date_exception_for_everyone_id +msgid "Min Sale Lock Date Exception For Everyone" +msgstr "الحد الأدنى لاستثناء تاريخ إقفال المبيعات للجميع " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__min_sale_lock_date_exception_for_me_id +msgid "Min Sale Lock Date Exception For Me" +msgstr "الحد الأدنى لاستثناء تاريخ إقفال المبيعات بالنسبة لي " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__min_tax_lock_date_exception_for_everyone_id +msgid "Min Tax Lock Date Exception For Everyone" +msgstr "الحد الأدنى لاستثناء تاريخ الإقفال الضريبي للجميع " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__min_tax_lock_date_exception_for_me_id +msgid "Min Tax Lock Date Exception For Me" +msgstr "الحد الأدنى لاستثناء تاريخ الإقفال الضريبي بالنسبة لي " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget.py:0 +msgid "Misc" +msgstr "متنوعات" + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_ir_model +msgid "Models" +msgstr "النماذج" + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__res_company__deferred_expense_amount_computation_method__month +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__res_company__deferred_revenue_amount_computation_method__month +msgid "Months" +msgstr "شهور " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "More" +msgstr "المزيد " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_move_line__move_attachment_ids +msgid "Move Attachment" +msgstr "نقل المرفق " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__move_line_ids +msgid "Move lines to reconcile" +msgstr "بنود الحركات بانتظار التسوية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_fiscal_year__name +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__name +msgid "Name" +msgstr "الاسم" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__narration +msgid "Narration" +msgstr "" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "Need an irreversible lock to ensure inalterability, for all users?" +msgstr "هل تحتاج إلى قفل دائم لضمان عدم قابلية التغيير لكافة المستخدمين؟ " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "New" +msgstr "جديد" + +#. module: odex30_account_accountant +#: model:ir.actions.act_window,name:odex30_account_accountant.action_bank_statement_line_form_bank_rec_widget +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_form_bank_rec_widget +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_quick_create_form_bank_rec_widget +msgid "New Transaction" +msgstr "معاملة جديدة " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/move_line_list/move_line_list.xml:0 +msgid "No attachments linked." +msgstr "لم يتم ربط أي مرفقات. " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +msgid "No statement" +msgstr "لا يوجد كشف حساب " + +#. module: odex30_account_accountant +#: model_terms:ir.actions.act_window,help:odex30_account_accountant.action_bank_statement_line_transactions +#: model_terms:ir.actions.act_window,help:odex30_account_accountant.action_bank_statement_line_transactions_kanban +msgid "No transactions matching your filters were found." +msgstr "لم يتم العثور على أي معاملات تطابق عوامل التصفية الخاصة بك. " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +msgid "Not Matched" +msgstr "غير مطابق " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "Not locked" +msgstr "لم يتم إقفاله " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_tree_bank_rec_widget +msgid "Notes" +msgstr "الملاحظات" + +#. module: odex30_account_accountant +#: model_terms:ir.actions.act_window,help:odex30_account_accountant.action_bank_statement_line_transactions +#: model_terms:ir.actions.act_window,help:odex30_account_accountant.action_bank_statement_line_transactions_kanban +msgid "Nothing to do here!" +msgstr "لا شيء لتفعله هنا! " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/js/tours/odex30_account_accountant.js:0 +msgid "Now, we'll create your first invoice (accountant)" +msgstr "والآن، سوف نقوم بإنشاء فاتورتك الأولى (محاسب) " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement__message_needaction_counter +msgid "Number of Actions" +msgstr "عدد الإجراءات" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement__message_has_error_counter +msgid "Number of errors" +msgstr "عدد الأخطاء " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_bank_statement__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "عدد الرسائل التي تتطلب اتخاذ إجراء" + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_bank_statement__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "عدد الرسائل الحادث بها خطأ في التسليم" + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__res_company__generate_deferred_expense_entries_method__on_validation +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__res_company__generate_deferred_revenue_entries_method__on_validation +msgid "On bill validation" +msgstr "عند تصديق فاتورة المورّد " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_change_lock_date.py:0 +msgid "Only Billing Administrators are allowed to change lock dates!" +msgstr "مديرو الفوترة وحدهم المصرح لهم بتغيير تواريخ الإقفال! " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_reconcile_wizard +msgid "" +"Only partial reconciliation is possible. Proceed in multiple steps if you " +"want to full reconcile." +msgstr "" +"يُسمَح بالتسوية الجزئية فقط. يمكنك الاستمرار بعدة خطوات إذا أردت التسوية " +"الكلية. " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/move_line_list/move_line_list.xml:0 +msgid "Open attachment in pop out" +msgstr "فتح المرفق في نافذة منبثقة " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget.py:0 +msgid "Open balance of %(amount)s" +msgstr "رصيد مفتوح بقيمة %(amount)s " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_move.py:0 +msgid "Original Deferred Entries" +msgstr "القيود المؤجلة الأصلية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement_line__deferred_original_move_ids +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_move__deferred_original_move_ids +msgid "Original Invoices" +msgstr "الفواتير الأصلية " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Originator Tax" +msgstr "ضريبة المُنشئ " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_search_bank_rec_widget +msgid "Outgoing" +msgstr "الصادرة " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.js:0 +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__to_partner_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__partner_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__partner_id +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_quick_create_form_bank_rec_widget +msgid "Partner" +msgstr "الشريك" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__partner_currency_id +msgid "Partner Currency" +msgstr "عملة الشريك " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__partner_name +msgid "Partner Name" +msgstr "اسم الشريك" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__partner_payable_account_id +msgid "Partner Payable Account" +msgstr "حساب الشريك الدائن " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__partner_payable_amount +msgid "Partner Payable Amount" +msgstr "مبلغ الشريك الدائن " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__partner_receivable_account_id +msgid "Partner Receivable Account" +msgstr "حساب الشريك المدين " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__partner_receivable_amount +msgid "Partner Receivable Amount" +msgstr "مبلغ الشريك المدين " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_auto_reconcile_wizard__partner_ids +msgid "Partners" +msgstr "الشركاء" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +msgid "Payable" +msgstr "الدائن" + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "Payable:" +msgstr "الدائن: " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_payment_form_inherit_account_accountant +msgid "Payment Matching" +msgstr "مطابقة المدفوعات" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement_line__payment_state_before_switch +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_move__payment_state_before_switch +msgid "Payment State Before Switch" +msgstr "حالة الدفع قبل التحويل " + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_account_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +msgid "Payments" +msgstr "الدفعات" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.account_journal_dashboard_kanban_view +msgid "Payments Matching" +msgstr "مطابقة المدفوعات" + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__account_auto_reconcile_wizard__search_mode__one_to_one +msgid "Perfect Match" +msgstr "مطابق تماماً " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_move.py:0 +msgid "Please set the deferred accounts in the accounting settings." +msgstr "يرجى تعيين الحسابات المؤجلة في إعدادات المحاسبة. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_move.py:0 +msgid "Please set the deferred journal in the accounting settings." +msgstr "يرجى إعداد دفتر اليومية المؤجل في إعدادات المحاسبة. " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_company__predict_bill_product +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__predict_bill_product +msgid "Predict Bill Product" +msgstr "توقع منتج الفاتورة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "Predict vendor bill product" +msgstr "توقع منتج فاتورة المورّد " + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_account_reconcile_model +msgid "" +"Preset to create journal entries during a invoices and payments matching" +msgstr "الإعداد المسبق لإنشاء قيود يومية خلال مطابقة الفواتير والدفعات" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement__rating_ids +msgid "Ratings" +msgstr "التقييمات " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "Reason..." +msgstr "السبب..." + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +msgid "Receivable" +msgstr "المدين" + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "Receivable:" +msgstr "المدين: " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_auto_reconcile_wizard__search_mode +#: model:ir.ui.menu,name:odex30_account_accountant.menu_account_reconcile +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_auto_reconcile_wizard +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_reconcile_wizard +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_payment_tree +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_tree +msgid "Reconcile" +msgstr "تسوية" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_reconcile_wizard +msgid "Reconcile & open" +msgstr "تسوية وفتح " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__reco_account_id +msgid "Reconcile Account" +msgstr "تسوية الحساب " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__reconcile_model_id +msgid "Reconcile Model" +msgstr "نموذج التسوية " + +#. module: odex30_account_accountant +#: model:ir.actions.act_window,name:odex30_account_accountant.action_open_auto_reconcile_wizard +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_auto_reconcile_wizard +msgid "Reconcile automatically" +msgstr "التسوية تلقائياً " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_auto_reconcile_wizard__search_mode +msgid "" +"Reconcile journal items with opposite balance or clear accounts with a zero " +"balance" +msgstr "" +"تسوية بنود دفتر اليومية ذات الرصيد المعاكس أو تصفية الحسابات ذات الرصيد " +"الصفري " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__bank_rec_widget__state__reconciled +msgid "Reconciled" +msgstr "تمت التسوية" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__reco_model_id +msgid "Reconciliation model" +msgstr "نموذج التسوية " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "Record cost of goods sold in your journal entries" +msgstr "سجّل تكاليف البضاعة المباعة في قيود اليومية الخاصة بك " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__ref +msgid "Ref" +msgstr "المرجع " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "Reference" +msgstr "الرقم المرجعي " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_form_inherit +msgid "Related Purchase(s)" +msgstr "عمليات الشراء ذات الصلة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_form_inherit +msgid "Related Sale(s)" +msgstr "المبيعات ذات الصلة " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "Reset" +msgstr "إعادة الضبط " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Residual" +msgstr "المتبقي" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Residual in Currency" +msgstr "المتبقي بالعملة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__return_todo_command +msgid "Return Todo Command" +msgstr "إرجاع أمر قائمة المهام " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "Review" +msgstr "مراجعة" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "Revoke" +msgstr "إلغاء " + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_account_reconcile_model_line +msgid "Rules for the reconciliation model" +msgstr "قواعد نموذج التسوية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement__message_has_sms_error +msgid "SMS Delivery error" +msgstr "خطأ في تسليم الرسائل النصية القصيرة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "Save" +msgstr "حفظ" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_form_bank_rec_widget +msgid "Save & Close" +msgstr "حفظ وإغلاق" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_form_bank_rec_widget +msgid "Save & New" +msgstr "حفظ و جديد" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +msgid "Search Journal Items to Reconcile" +msgstr "البحث عن القيود اليومية المُراد تسويتها " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_res_config_settings__signing_user +msgid "" +"Select a user here to override every signature on invoice by this user's " +"signature" +msgstr "" +"قم بتحديد مستخدم هنا لاستبدال كل توقيع في الفاتورة بتوقيع هذا المستخدم " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__selected_aml_ids +msgid "Selected Aml" +msgstr "Aml المحددة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__selected_reco_model_id +msgid "Selected Reco Model" +msgstr "تحديد نموذج التسوية " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/js/tours/odex30_account_accountant.js:0 +msgid "Set an amount." +msgstr "قم بتعيين مبلغ. " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "Set as Checked" +msgstr "التعيين كتمّ التحقق منه " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/js/tours/odex30_account_accountant.js:0 +msgid "Set the payment reference." +msgstr "قم بتعيين مرجع الدفع. " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_change_lock_date__show_draft_entries_warning +msgid "Show Draft Entries Warning" +msgstr "إظهار تحذير القيود بحالة المسودة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement_line__show_signature_area +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_move__show_signature_area +msgid "Show Signature Area" +msgstr "إظهار مكان التوقيع " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__module_sign +msgid "Sign" +msgstr "توقيع" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement_line__signature +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_move__signature +msgid "Signature" +msgstr "التوقيع " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_config_settings__signing_user +msgid "Signature used to sign all the invoice" +msgstr "التوقيع المستَخدَم للتوقيع على الفاتورة بأكملها " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement_line__signing_user +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_move__signing_user +msgid "Signer" +msgstr "الطرف الموقِّع " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_res_company__signing_user +msgid "Signing User" +msgstr "المُستخدِم الموقِّع " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__single_currency_mode +msgid "Single Currency Mode" +msgstr "وضع العملة الواحدة " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__source_aml_id +msgid "Source Aml" +msgstr "Aml المصدرية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__source_aml_move_id +msgid "Source Aml Move" +msgstr "حركة Aml المصدرية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__source_aml_move_name +msgid "Source Aml Move Name" +msgstr "اسم حركة Aml المصدرية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__source_amount_currency +msgid "Source Amount Currency" +msgstr "عملة المبلغ المصدري " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__source_balance +msgid "Source Balance" +msgstr "الرصيد المصدري " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__source_credit +msgid "Source Credit" +msgstr "مصدر الائتمان" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__source_debit +msgid "Source Debit" +msgstr "مصدر الخصم" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__source_rate +msgid "Source Rate" +msgstr "" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__st_line_id +msgid "St Line" +msgstr "بند كشف الحساب " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__st_line_transaction_details +msgid "St Line Transaction Details" +msgstr "تفاصيل معاملة بند كشف الحساب " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_fiscal_year__date_from +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_move_line__deferred_start_date +msgid "Start Date" +msgstr "تاريخ البدء " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_fiscal_year__date_from +msgid "Start Date, included in the fiscal year." +msgstr "تاريخ البداية، ضمن السنة المالية. " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__state +msgid "State" +msgstr "الحالة" + +#. module: odex30_account_accountant +#: model:ir.actions.server,name:odex30_account_accountant.action_bank_statement_attachment +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_kanban_bank_rec_widget +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +msgid "Statement" +msgstr "كشف الحساب" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +msgid "Statement Line" +msgstr "بند كشف الحساب" + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/demo/odex30_account_accountant_demo.py:0 +msgid "Subscription 12 months" +msgstr "اشتراك لمدة 12 شهر " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__suggestion_amount_currency +msgid "Suggestion Amount Currency" +msgstr "عملة المبلغ المقترح " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__suggestion_balance +msgid "Suggestion Balance" +msgstr "الرصيد المقترح " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__suggestion_html +msgid "Suggestion Html" +msgstr "Html المقترح " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_list_bank_rec_widget +msgid "Suggestions" +msgstr "الاقتراحات " + +#. module: odex30_account_accountant +#: model:ir.model,name:odex30_account_accountant.model_account_tax +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__tax_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__tax_ids +msgid "Tax" +msgstr "الضريبة" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__tax_base_amount_currency +msgid "Tax Base Amount Currency" +msgstr "عملة المبلغ الأساسي للضريبة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Tax Grids" +msgstr "شبكات الضرائب" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__tax_repartition_line_id +msgid "Tax Repartition Line" +msgstr "بند التوزيع الضريبي" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__tax_tag_ids +msgid "Tax Tag" +msgstr "علامة تصنيف الضريبة " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.js:0 +msgid "Taxes" +msgstr "الضرائب" + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/rainbowman_content.xml:0 +msgid "That's on average" +msgstr "هذا في المتوسط" + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_bank_rec_widget__country_code +#: model:ir.model.fields,help:odex30_account_accountant.field_bank_rec_widget_line__country_code +msgid "" +"The ISO country code in two chars. \n" +"You can use this field for quick search." +msgstr "" +"كود الدولة حسب المعيار الدولي أيزو المكون من حرفين.\n" +"يمكنك استخدام هذا الحقل لإجراء بحث سريع." + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_bank_rec_widget_line__amount_transaction_currency +msgid "" +"The amount expressed in an optional other currency if it is a multi-currency " +"entry." +msgstr "يتم عرض المبلغ بعملة اختيارية أخرى إذا كان قيداً متعدد العملات. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_reconcile_wizard.py:0 +msgid "" +"The amount of the write-off of a single credit line should be strictly " +"negative." +msgstr "يجب أن يكون مبلغ الشطب لبند ائتماني واحد قيمة سالبة فقط. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_reconcile_wizard.py:0 +msgid "" +"The amount of the write-off of a single debit line should be strictly " +"positive." +msgstr "يجب أن يكون مبلغ الشطب لبند خصم واحد قيمة موجبة فقط. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_reconcile_wizard.py:0 +msgid "The amount of the write-off of a single line cannot be 0." +msgstr "لا يمكن أن يكون مبلغ الشطب لبند واحد 0. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_reconcile_wizard.py:0 +msgid "" +"The date you set violates the lock date of one of your entry. It will be " +"overriden by the following date : %(replacement_date)s" +msgstr "" +"التاريخ الذي قمت بتحديده يتضارب مع تاريخ الإقفال لإحدى قيودك. سيتم تجاوزه من " +"قِبَل التاريخ التالي: %(replacement_date)s" + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_bank_statement_line__deferred_move_ids +#: model:ir.model.fields,help:odex30_account_accountant.field_account_move__deferred_move_ids +msgid "The deferred entries created by this invoice" +msgstr "القيود المؤجلة التي تم إنشاؤها من قِبَل هذه الفاتورة " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_fiscal_year.py:0 +msgid "The ending date must not be prior to the starting date." +msgstr "يجب ألا يقع تاريخ الانتهاء قبل تاريخ البداية. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget_line.py:0 +msgid "" +"The invoice %(display_name_html)s with an open amount of %(open_amount)s " +"will be entirely paid by the transaction." +msgstr "" +"الفاتورة %(display_name_html)s التي بها مبلغ مفتوح قيمته %(open_amount)s " +"سيتم دفعها كاملة بواسطة المعاملة. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget_line.py:0 +msgid "" +"The invoice %(display_name_html)s with an open amount of %(open_amount)s " +"will be reduced by %(amount)s." +msgstr "" +"الفاتورة %(display_name_html)s مع مبلغ مفتوح قدره %(open_amount)s سيتم " +"تقليله بـ %(amount)s. " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "" +"The invoices before this date will not be taken into account as accounting " +"entries" +msgstr "لن يتم اعتبار الفواتير قبل هذا التاريخ كقيود محاسبية " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_bank_rec_widget_line__transaction_currency_id +msgid "The optional other currency if it is a multi-currency entry." +msgstr "العملة الاختيارية الأخرى إذا كان القيد متعدد العملات." + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_bank_statement_line__deferred_original_move_ids +#: model:ir.model.fields,help:odex30_account_accountant.field_account_move__deferred_original_move_ids +msgid "The original invoices that created the deferred entries" +msgstr "الفواتير الأصلية التي قامت بإنشاء القيود المؤجلة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "" +"The system will try to predict the product on vendor bill lines based on the " +"label of the line" +msgstr "سيحاول النظام توقع المنتج في بنود فاتورة المورد بناءً على عنوان البند. " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_change_lock_date +msgid "" +"There are still draft entries in the period you want to lock.\n" +" You should either post or delete them." +msgstr "" +"لا تزال هناك قيود بحالة المسودة في الفترة التي تريد إقفالها.\n" +" عليك إما ترحيلها أو حذفها. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_bank_statement.py:0 +msgid "" +"This bank transaction has been automatically validated using the " +"reconciliation model '%s'." +msgstr "" +"هذه المعاملة البنكية قد تم تصديقها تلقائياً باستخدام نموذج التسوية '%s'. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget.py:0 +msgid "" +"This bank transaction is locked up tighter than a squirrel in a nut factory! " +"You can't hit the reset button on it. So, do you want to \"unreconcile\" it " +"instead?" +msgstr "" +"هذه المعاملة البنكية مغلقة بإحكام أكثر من السنجاب في مصنع الجوز! لا يمكنك " +"الضغط على زر إعادة ضبطها. لذا، أترغب في \"إلغاءها\" عوضاً عن ذلك؟ " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_reconcile_wizard.py:0 +msgid "This can only be used on journal items" +msgstr "يمكن استخدام ذلك فقط في عناصر اليومية " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_reconcile_model_line.py:0 +msgid "" +"This reconciliation model can't be used in the manual reconciliation widget " +"because its configuration is not adapted" +msgstr "" +"لا يمكن استخدام نموذج التسوية في أداة التسوية اليدوية لعدم اعتماد تهيئته " + +#. module: odex30_account_accountant +#: model:digest.tip,name:odex30_account_accountant.digest_tip_account_accountant_0 +msgid "Tip: Bulk update journal items" +msgstr "نصيحة: قم بتحديث قيود اليومية بالجملة " + +#. module: odex30_account_accountant +#: model:digest.tip,name:odex30_account_accountant.digest_tip_account_accountant_1 +msgid "Tip: Find an Accountant or register your Accounting Firm" +msgstr "نصيحة: ابحث عن محاسب أو قم بتسجيل شركتك المحاسبة الخاصة بك " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_auto_reconcile_wizard__to_date +msgid "To" +msgstr "إلى" + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_reconcile_wizard__to_check +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +msgid "To Check" +msgstr "للتحقق منه " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_kanban_bank_rec_widget +msgid "To check" +msgstr "للتحقق منه " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.res_config_settings_view_form +msgid "To enhance authenticity, add a signature to your invoices" +msgstr "لتعزيز صحة مستنداتك، أضف توقيعاً إلى فواتيرك " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__todo_command +msgid "Todo Command" +msgstr "أمر قائمة المهام " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Total Balance" +msgstr "الرصيد الكلي " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Total Credit" +msgstr "إجمالي الائتمان" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Total Debit" +msgstr "إجمالي الدين" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Total Residual" +msgstr "إجمالي المتبقي " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_move_line_reconcile_tree +msgid "Total Residual in Currency" +msgstr "إجمالي المتبقي بالعملة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_line_search_bank_rec_widget +msgid "Transaction" +msgstr "معاملة" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__transaction_currency_id +msgid "Transaction Currency" +msgstr "عملة المعاملة " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "Transaction Details" +msgstr "تفاصيل المعاملة " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.account_journal_dashboard_kanban_view +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_bank_statement_tree +msgid "Transactions" +msgstr "المعاملات " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_reconcile_wizard.py:0 +msgid "Transfer from %s" +msgstr "التحويل من %s" + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_reconcile_wizard.py:0 +msgid "Transfer to %s" +msgstr "التحويل إلى %s" + +#. module: odex30_account_accountant +#: model:ir.actions.server,name:odex30_account_accountant.auto_reconcile_bank_statement_line_ir_actions_server +msgid "Try to reconcile automatically your statement lines" +msgstr "حاول تسوية بنود كشف حسابك تلقائياً " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +msgid "Unreconciled" +msgstr "غير المسواة" + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/res_company.py:0 +msgid "Unreconciled statements lines" +msgstr "بنود كشف الحساب غير المسواة " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__bank_rec_widget__state__valid +msgid "Valid" +msgstr "صالح" + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_reconcile_model_widget_wizard +msgid "Validate" +msgstr "تصديق " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/list_view_switcher.js:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_list_bank_rec_widget +msgid "View" +msgstr "أداة العرض" + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget.py:0 +msgid "View Reconciled Entries" +msgstr "عرض القيود المسواة " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "View models" +msgstr "عرض النماذج " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_account_bank_statement__website_message_ids +msgid "Website Messages" +msgstr "رسائل الموقع الإلكتروني " + +#. module: odex30_account_accountant +#: model:ir.model.fields,help:odex30_account_accountant.field_account_bank_statement__website_message_ids +msgid "Website communication history" +msgstr "سجل تواصل الموقع الإلكتروني " + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_move_line_reconcile_search +msgid "With residual" +msgstr "مع متبقي " + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__wizard_id +msgid "Wizard" +msgstr "المعالج" + +#. module: odex30_account_accountant +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget__company_currency_id +#: model:ir.model.fields,field_description:odex30_account_accountant.field_bank_rec_widget_line__company_currency_id +msgid "Wizard Company Currency" +msgstr "معالج عملة الشركة " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_reconcile_wizard.py:0 +msgid "Write-Off" +msgstr "شطب" + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_reconcile_wizard.py:0 +msgid "Write-Off Entry" +msgstr "شطب القيد " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_fiscal_year.py:0 +msgid "" +"You can not have an overlap between two fiscal years, please correct the " +"start and/or end dates of your fiscal years." +msgstr "" +"لا يمكن أن يكون هناك تداخل بين سنتين ماليتين، الرجاء تصحيح تواريخ بدء و/أو " +"انتهاء سنواتك المالية. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_reconcile_wizard.py:0 +msgid "You can only reconcile entries with up to two different accounts: %s" +msgstr "يمكنك فقط تسوية القيود حتى حسابين مختلفين: %s" + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget.py:0 +msgid "You can't hit the reset button on a secured bank transaction." +msgstr "لا يمكنك الضغط على زر إعادة الضبط في معاملة بنكية مؤمَّنة. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_move.py:0 +msgid "" +"You cannot change the account for a deferred line in %(move_name)s if it has " +"already been deferred." +msgstr "" +"لا يمكنك تغيير الحساب للبند المؤجل %(move_name)s إذا كان مؤجلاً بالفعل. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_move.py:0 +msgid "You cannot create a deferred entry with a start date but no end date." +msgstr "لا يمكنك إنشاء قيد مؤجل مع تاريخ بدء ودون تاريخ انتهاء. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_move.py:0 +msgid "" +"You cannot create a deferred entry with a start date later than the end date." +msgstr "لا يمكنك إنشاء قيد مؤجل مع تاريخ بدء أبعد من تاريخ انتهاء. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_move.py:0 +msgid "You cannot generate deferred entries for a miscellaneous journal entry." +msgstr "لا يمكنك إنشاء قيود مؤجلة لقيد يومية من المتفرقات. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_fiscal_year.py:0 +msgid "You cannot have a fiscal year on a child company." +msgstr "لا يمكن أن يكون لديك عام مالي في شركة تابعة. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/account_move.py:0 +msgid "" +"You cannot reset to draft an invoice that is grouped in deferral entry. You " +"can create a credit note instead." +msgstr "" +"لا يمكنك إعادة تعيين فاتورة قد تم تجميعها في قيد مؤجل إلى حالة المسودة. " +"يمكنك إنشاء إشعار دائن عوضاً عن ذلك. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_change_lock_date.py:0 +msgid "You cannot set a Lock Date in the future." +msgstr "لا يمكنك تعيين تاريخ إقفال في المستقبل. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget_line.py:0 +msgid "You might want to %(btn_start)sfully reconcile%(btn_end)s the document." +msgstr "قد ترغب بإجراء %(btn_start)sالتسوية الكلية%(btn_end)s للمستند. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget_line.py:0 +msgid "" +"You might want to make a %(btn_start)spartial reconciliation%(btn_end)s " +"instead." +msgstr "قد ترغب بإجراء %(btn_start)sالتسوية الجزئية%(btn_end)s عوضاً عن ذلك. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget_line.py:0 +msgid "You might want to record a %(btn_start)spartial payment%(btn_end)s." +msgstr "قد ترغب بتسجيل %(btn_start)sالتسوية الجزئية%(btn_end)s. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/models/bank_rec_widget_line.py:0 +msgid "" +"You might want to set the invoice as %(btn_start)sfully paid%(btn_end)s." +msgstr "قد ترغب بتعيين الفاتورة كـ %(btn_start)sمدفوعة بالكامل%(btn_end)s. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_change_lock_date.py:0 +msgid "You need to select a duration for the exception." +msgstr "عليك تحديد مدة للاستثناء. " + +#. module: odex30_account_accountant +#. odoo-python +#: code:addons/odex30_account_accountant/wizard/account_change_lock_date.py:0 +msgid "You need to select who the exception applies to." +msgstr "عليك تحديد الأفراد الذين ينطبق عليهم الاستثناء. " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/rainbowman_content.xml:0 +msgid "You reconciled" +msgstr "لقد قمت بتسوية " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__bank_rec_widget_line__flag__aml +msgid "aml" +msgstr "aml" + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__bank_rec_widget_line__flag__auto_balance +msgid "auto_balance" +msgstr "auto_balance" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.view_account_reconcile_model_widget_wizard +msgid "e.g. Bank Fees" +msgstr "مثال: الرسوم البنكية " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__bank_rec_widget_line__flag__early_payment +msgid "early_payment" +msgstr "early_payment" + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__bank_rec_widget_line__flag__exchange_diff +msgid "exchange_diff" +msgstr "exchange_diff" + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__account_change_lock_date__exception_duration__1h +msgid "for 1 hour" +msgstr "لمدة ساعة واحدة " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__account_change_lock_date__exception_duration__15min +msgid "for 15 minutes" +msgstr "لمدة 15 دقيقة " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__account_change_lock_date__exception_duration__24h +msgid "for 24 hours" +msgstr "لمدة 24 ساعة " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__account_change_lock_date__exception_duration__5min +msgid "for 5 minutes" +msgstr "لمدة 5 دقائق " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__account_change_lock_date__exception_applies_to__everyone +msgid "for everyone" +msgstr "للجميع " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__account_change_lock_date__exception_applies_to__me +msgid "for me" +msgstr "لي " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__account_change_lock_date__exception_duration__forever +msgid "forever" +msgstr "للأبد " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml:0 +msgid "in" +msgstr "في" + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__bank_rec_widget_line__flag__liquidity +msgid "liquidity" +msgstr "السيولة " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__bank_rec_widget_line__flag__manual +msgid "manual" +msgstr "اليدوية " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__bank_rec_widget_line__flag__new_aml +msgid "new_aml" +msgstr "new_aml" + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/rainbowman_content.xml:0 +msgid "seconds per transaction." +msgstr "ثوان لكل معاملة. " + +#. module: odex30_account_accountant +#: model:ir.model.fields.selection,name:odex30_account_accountant.selection__bank_rec_widget_line__flag__tax_line +msgid "tax_line" +msgstr "tax_line" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.account_journal_dashboard_kanban_view +msgid "to check" +msgstr "للتفقد" + +#. module: odex30_account_accountant +#: model_terms:ir.ui.view,arch_db:odex30_account_accountant.account_journal_dashboard_kanban_view +msgid "to reconcile" +msgstr "بانتظار التسوية " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/rainbowman_content.xml:0 +msgid "transaction in" +msgstr "معاملة في " + +#. module: odex30_account_accountant +#. odoo-javascript +#: code:addons/odex30_account_accountant/static/src/components/bank_reconciliation/rainbowman_content.xml:0 +msgid "transactions in" +msgstr "معاملات في " diff --git a/dev_odex30_accounting/odex30_account_accountant/models/__init__.py b/dev_odex30_accounting/odex30_account_accountant/models/__init__.py new file mode 100644 index 0000000..ca01d9a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import account_account +from . import account_bank_statement +from . import account_chart_template +from . import account_fiscal_year +from . import account_journal_dashboard +from . import account_move +from . import account_payment +from . import account_reconcile_model +from . import account_reconcile_model_line +from . import account_tax +from . import digest +from . import res_config_settings +from . import res_company +from . import bank_rec_widget +from . import bank_rec_widget_line +from . import ir_ui_menu +from . import ir_model diff --git a/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79af41b7c007d27c10f470ee8cbbeb2098743737 GIT binary patch literal 1186 zcmZ{iOK%e~5XZfFZXTP>qY5noBoGJ%iEe=l2L#^$RYF{RvD{rZak`JlyD1Ig#uwnm zM?id=6&F^$a^hC0x1N}BvM5Hu8vXtAjP056?l;G26Bs|gyqBLUg#5xqIbf~F^$(c7 zl7IwONFs|`7IFo+LMxi9z*Sn+Tm!Drn&vuioz^usfE%=-xe45)P0cp2O>NCB;1+FZ zZUeVzTXP4vLpz$gz+Kwa>;OB|(cA;>(Vk`(*rl%KK5(D*H4lIXbO1bjM<%1+7Bn`o zE?w^X$uiE^W(L=|be-_{jHMaRL?q&DJL1o{${6?;Aw(fED$ktC)aM~v39i6>P`c;I zQpMm8cse^txC$WHErU^Vj(7YmWx-dQgty8qO880a%TTZ=2}B6H@BAmkLK)+2oid*B z3s^P+ITa~3F;XIBaNDVzvQ%W5jHfB?U%R6Pk5{mCb@PyxeUQOa;K99rTxF)VRBS03 zl)QvpHmr1wZzsb`qN?!Bs)kZWX`nPwY?KxX{)MW8(nWDldMGYRA7y|tL>Ym6C)c3l z=Ce0TBH{7yY{oyTx%7@#_+g@BmCS{or5-%h#fu}DlH}>LmxpW8-seZ<2Z#2(K%BGn z-feIBfSZ}enWq~|J;r1#GsX@Vs~h_jIG3S#t@fcN{HxM8pjTDPvaW1m-OI_{Z7ayb z+_YVu`#CYJAdhp?3UWI)tuPZo(t literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_account.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_account.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71119478c7a7033f497eb871639e6e864d8927c9 GIT binary patch literal 1314 zcmZuw%}X0W6rb5m;x;t~skTW`8bzo%XsljTtki?(r6Nc@gu<}wjLoK-UAw#SBc$NL zgLu(G!Aqez*%o`~pOTb7!$403OK*{Q^3*p;b~UxL%lo}~U-Ld@K1Cv71nd0c3;j1n z=$F`dE7)cl&wx2W6j5xTv_Q$gIVmk+B%vil<$Xj0Ov=ih<0)`w{w^J$cnu|ke}sA^ ziFqhzQD!)rXD$%VZmvcQ-~=(0#uTL`iqkTc_7TL8Ax41rENGgQH{CWAqH1eD-bT#} zB%+A|L>i5AASbAZN`SZ5DTvN|F$TM=ABEz$uPI4BdxN3UDOjKR9&fSRb*;_@Jidsj zd>!i_AE_vnymosIO{4)DgnUAta6|6&glr`dc@7MUqRpX|LceZ9J6zo|9f4$9H>tH< zn1`r#w_mw{1;w))pg%ZZfiIIWD6lZ`w?=Oiec!ohP&~ZJz#&%jM zqP86%d#I*#A4LzN6(wF(;$BwZjBUzRSL^dR!H zx3AheR2uuHREK9Oy|dNc*@I9`={brVMvjZ6wa+78AD8b>R+Oo#GF4WlYQv)kk>gB7 zc~pxIl$C)7oDDBA$Q43NHOC0yVFJ^qc|-8sguKbCMq8s0-OMmsckMp#`hx6!0Q;UG z;>I?KV4P7Pd;V98Cia%=flzR;j&74y5aE^#+7SRA5W};@#Ch;JOvGqKe+Yu>6R(uH xR+jVjASlF}bJl^>WsGqRh4-3Y4LvA#{`Jru40+rp$LsH3UI_W+f0WI0{{jZcO!NQ% literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_bank_statement.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_bank_statement.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c50e6afd43c7321fd94c4c8a57fc03fea8ba204 GIT binary patch literal 13300 zcmb_jYit`=cAnvLNbx00)Qb{LJuNx59+u)qEXkJRhnzUF<40mEacGJ&l4$dx+@UO+ zp;`k?v2yBSl^{jD3#ZF2jI0;y0xA#`-lDt6kHt1ci(*L3LW2Pe7${I6|7au&r1{lz z?r=zsBs=N0*P}C+_nx`WbI<+Gx!1pNyPXV#r$4(8`>Kaw{u6)b!CH!Z{a+CIgy9*U zjWg5uHpSV5Y1))9Pn#2#X-mR7ZDldt9JeLx({>uS#JPlH+Ck&ixHC~RT|?uxxGUkF zcGI{$?n!v3y)@3neTmxXS{ir6wsZFb2+Y-by+MNiGnQd~1%FzYZZI(?7~c6l z!`BGbtBrd4XJ+7nzY3o+F;8x!KZsM-=K zUWki*tlB6>lCg9wBZMQ-XlgN;4ks5AGXjAu#|2R!#|TN`56^r$5#O^AkHnH`;YJ!# z+(d{+(y{9Tl$4G@f_;Ic_{AvZS%owa1c=yPi;!!J3(->Z>C065@ioj5OohNqvph3x z;@N344|L8nZQ;%DGt*Yy0@TJ^p({4EenM;Ckx25|xpX8gB!px-(@<)4{|qGei{-7CjT_e+j7I0Xmz6)$U0{!t= zQs^_O0a1vM=zN$LW+RL7bhtc3;TW$rZ^*owS|rIx9J5>oMs}>vtXh(hgrIu$lALBL%||liYHZ-l&FFlDB+ii3 zRUw)d2SBcG3=hI9mD)YDzh8^d)IEc`h{uw11H5oOtnpT-8dLO~NHRU3Etmm)k+al;nqHK> zd)K}16uj>!wf>Krp9~B?TvB!qJq*jc4;8KEHcyd3!ZEEo9}KTqKDSFP`=#asMK|LM zvriej&-o3KB4c+rzlMq!!xC{p0$n0cU=BV(VMZ1j45D9N5PB}YjSFX)t^RuJ#loA6 zigDSLWsWkJKV3FwO}QUZhb7DA%FC^~Em=#}Tv>b%&7Z+y{Z)Cvz74Tu>#{9tzQI`QV)|~VhIBmxM^LC!g;@1wnG>FrU4uA8G zdmH#Ou*F18;j&`6^S3Z=HTt*J?=17sX{-xWO3hTJHbzQPDfSa#Aw|-e9lDk&NvoEu zFOZ5>!EJyDB4`jX0hQ`M$50rww16@|9+xkwB298}37pHj_4 zm{onCgp#~K!tX8#GhwXN42-I$(qim{YKy`ak``#a1f@!~hEWfaR*b_Qh{FTpfO@RY zPPSueLyVMCM5u%^(0Uuo3PVrUzEd6L4AobTmUvVp>JFD;VeGVsf)>&O31PJ@ zrMa0Ck^+G?hbvvl3_MTuZ1F)53KUJS+Cb;Dci(T4c8FBxN`-@#a-z5!P%y(RpJ1$AwcBQ$k$T%HdN>)xP+xM<-KUmm)Fu#3F-aaO|T9xjD z>)odc-KV72E=zL@@?2W#K9%oYl)D%6u8x%xtCtm*UvhQHuC51`huqqBxp!i{ce2ns zsT@E3yQI|g?x(EOGPHK!^YMJs5xMDz)O6$z({D*{FXX4+m8aiTnnFtJZly7(wDsHz zD=nS(b`{QJM!qLU-CuHx0#7&S6 z7>lVsyUK;>%!k9OGmL_^7#AS!3WwiajKonU!eO!pCxQ#dlJf$IrAa&dBrgH^B}0p$ z6Ggn3iUj|}6F_d2|0%AnTgMdNZfW3zgceRczP4Q~f-7w_gB@3YfxM6%N! z-ow|xFE4Ka)#6o~wi3frfK&*oO2e*$dKnx3HL5xQ>@07JA*eM^kse6N1gex22tMqw zNj|j{j>c1fS`PsSp)!mcMo3#9wWakTMy?AQUuNgC+N1Bv72XjjNb~@K72#`uJy-JX zmAJih$PEq0M$?AlHu=BZE;ns{EN_M_sJuz>=E@cnW3w!88HHN1I55_!@BCYiN#^7; zVU6BRBb*5%b_~y^NTQ6^N)SffrlY?KLMtgKunEkXlC8l{!#5HXM{=6df?SiP9BtYx zh}fl2X=c3DGm{jSGQB@&UVw8Slp-Dl0RM_zkJ`%@y0qO@LF1*T3SXb2)WBTHZRLT-@gAY(9briec75 zOuQ)x^Mb2s+4@X?uq9Ny zy#1cp$OV>)4P=9x%1r!8LIB7XPJy)*&hPA#XJeTBc>kegbhZzJ`*>8q^O5&7=bR zTZo|g$-#SbFe>l=FN3zSmB6yVr9*=uwY<21qZ|j5*Rm0hgVvTph?a$}84Bx28^$(nAI&9^qgE_6 zU;*~h8Z&#IDPYh1hKlP9)boRly53!K?*X}YRO#7yKPC6<$M>Al-FN@ZqQiOSH)VEO-3_YMpKn3M4Ov8_uAF)63e8Q}-E6j>#*37f-bIazm&I|8~ zzhi5CWfZ6nJh!WS9=xftYvn9eg_fh}@0c_3);ZQ_8dXH(2D@wlZEF!tJadl8S}WoO zIacBUejpLM*qzr#EX#I!#R0oV6IWBsKkP%l52IE4{ky6@xB^OKVf$ zZRxs7V%AncNya)h_6&T3_GK#0Ck*K7-<`xr*462Hts%A}#VCkh)DzCI8|8u3XhD>p5GL z=B#*lNfi3w*LicOel~^lKqZN<;axf0^)`j-a;}yK?`n(Am_sGDDe!LNm~8k3J*_xD z9(s(qFfJVLrR#}XW$zs8WYYU96?8G=z_Kg-QY9sa+HzCiebqCWMpRx3S(mXsqi2(4 zF2QPDcKw+P>i!EYw!|(mH_VrqB^J{D8cZc65I|4!! z#IJn-FaO4j2N}!kZ7Z?fw(=}OKmex9G5}OmsJHDoNZA~W6{f2;1>X8_gA&5!4%-3x zpsLIea7UY$&9`m2s&6axfPyvg4)85OZsq7=*#hm{nJ#;=K#gor!?&#^wbGac-pUkJ zHUaP-T6pHR)u3W5p!(Ta6X1oKsjm=q0|s@+(DkA@nFXHUDm<>%Xug~Y;hbD`rW&z?KK zD}=B@wZ>zKSX#BF2zZmg|81d27KV)>xVTlDhDB6!Tu4%Q(Z{LVpk=eMIdGHnU?0(1 z)mkDTE(Yhc4r7Rbg`CAgxDwQWR?bAy;LjJ~$VM}$oB)Zy1(gP8n20+RbqU?NbxSjP zgS7lb@CNB6gwv_Y&}3rIgf3y){WQ55jx1JxQgQatc8dL@@l-St7svabU)4ouoA?hv zz6BH=>XKY-O3$EF|I+F!x!Mn>R;SkZm19qQyOr8t&YYY6Mfm68eD_|td+%@BzKlo* z&g2iAk%4xfk$kT!wQYC7YqU@9J}CJ{0V6kfR*n~)OjGM8?|t-MZtt338jr5Nmv7|d zMt)^d@irG3lY8jXXs-7siF=6$R|~=YQgFZ0wd=vO+_hisf@0d0KxgjN+;r|$IWV}& zDRlvF{JNOutQ5uvw^@X&D(mbxWy z3kj*&*|4}cHz$bbHdKAFf6Dufd_wIBc_3f!5O&mB8;?B(;Jq0sTOr(X+|s@F{N z3JgYDJ@n?}v9rfO97C}r_*Fy4PoE84ICFI3{4s+2S;mX@J+`}FJ89`-3C@OUy&j3j z_{>}9=VM|Bc|uk8UT8i7iGq*}Veg=6;E0XKZ-(eMu!8u|q6lpbrRRl^J|xV@rTX9`q^d8E^;0Q`kz?5=+j4 zR~-sctyI3jflpFPFkef+M|LAK7cTXw&r8)7Nnomz>Q1V=ND6tcVycf0ESUAWZX|Kc zyM}p9$(ap(6%p-?a4a7@BnJ%8-*ip1*PkS z`>&L?faAFfx#M!+1=s?7{tvB+zxm^fQgA@_53c*i3jQ(a^^5ZBZ%O{Ky#H<4|Mt57 zO2L0cibV5%UiR}acCKyfuAzc!DDN7UUBi-V7<`L&vUisX-X6)@^I)(1!UcF2P43z@ zrM_jo{)IyQ3;Fupa{X?p9*-^L#$8~``}ZnM+wXbTn??#vBfn`^T5l??p`V@n>B-z2 zTL0s6&+F?w7YjWXrAy&_&lS1nO1?EBw?>{?%?Ddxjt{m-O(Rbkb2CnOa{vy2fpARo z(Aq>EeAi8b|NZUb#t>9g3&%A&d0Zd(TiH@{0&eJ z5RUP;txn><4<|utzb)243Gn{!qK9$R{@C+@M{4SO@RHQHH_z>pxqTA152o7%HJKgr ztP<+F&q;m9<vvd;QtOaDoa z^r7LcL z7~-*OLJ7<*L;!H4!>L&~tU&m!*^C(eC^bP z{tC?rupX#kx`1&rA@Cw+fT-TGaWk`+PQ!f&pXO)(JIwSz53BAM64XZ8K;umc%@;q9 zu^4i5v#~gw2MK^w^#P-|F0e1EB_4w#Airjn>lm?g0ZnZV!&NeUM8dNql>ijIumF~d zx-AS|fzp+d88FP?n6l5I8PRpd)}e%m)bggsP^z0+3nd;=wQEOM5GgfIbplw{V6uo8 zQS>+}z%snlpk*x>-^OWs&MEXJ-k(B&;vCGv=3@igVSRTFA;RiZ>KZ>jB)K|hnp^`Q z&g~d|+;QMhm;BOe`Hm^MV@h&uSG<7vYTTnrU}$ZhGR7Ug#Z{4$Z)m z?~Tg6(Yx-)f#BWcd|p!%(eKdx(7UHWkJrw(8tKj5Voq|T!cf-6iv>>kBC;RuW z`wtcTFmL7w)~UE_?_87`24wf(y8C#+ef*2`@BTdRep7b8Su`WV6W1PSEJOg?HNbfw zkQFD4K}#3np6!&tt(%7J>kS7A4KU&PhC_10p_LPg7r-0q-hTJMdSG86u&cu7|olqPXhyfar)Kq!G}2KO7;=fmaeRjRg+S+3O5x z2Yp?}NTBmgTOTS_a~XFWaOz@dP$rbNdjqN}?@|kJOmF-S@R6DLpIP4q?out_Uo5p5 z{R1>Sx6NfPW8F|1dMT|_YRy9ACSFB`^*yUP;I13o*8)!vnS!#Zy$myWMpq6E}?aw8LQkFA5^{^uQYj2KAAqirT5F)Y-v& z2PG-e%Nx3jA@kC+cOO)<&-+$_y2RfD0e9bqYpYL!A&CnpUN8tujsp!zESY?(QnL-J-NV|M`|C3=W%^UZsh*B)VXi% zY`%WKT)%(inBuL+LiSV&c`@%Bl6^yxZ>Uu3i#h)TsC7R)^b#%dzgXcPdAL9C8jHwQ&Z>rOjFdaMsmLA0pyE0l8KFr+9b4EioI@*t0tOaVp=i zLvGk{>vYk=TK7SpbYe4G(RR~`i?KQ0zf?3iF+nF!&5X^fr#3n9+F6-29bv6#PHpv? zG>urnXe*OA>$QT~dLi}FJ%*MM1=)hNuuVWa?;dvDis&$>QNieIlq{O{~KWV-wOn72-N|u zS)wtQa0XmrB6xDDIurE&F^CbkZi3iYb%6MvqV6wk`tM+(^)+;qY4`i+oEhg4P#w%W zc=E={zX3byKXEV6qM2n`h4I{?|DG^Ar0;ta=BQ+R6sB7;KATgXFoTluQJ6N#_$W++ zWPCRBJaGnAcF4}a-O0SOTXuHevKK9FEM808n%>=eZ}ch6`=**>{9O|ZaufjNmAumO zBX5`bDwXIEpe&$6fVPkh4ZvI+xenkS{U`L$14%3(VSyF~iURG8hH@x$>dY>eAF^!N ztsQjrIQu^5&HQHG%v*gC3Jnl=KK|@oH4e4EW5azs?aIL{RJMssWU7%o%~FbWPUG@? zmZyXxKO{2$36TYbUliQMw|PSD!q0iK9@+C#lJNcun+a<94JBXFBtwC^H(!($P0zKb z+Apr%ICvE*zlO~flBF`qax%^GGWQ9|3RN;sVOxLJQzff3>jn0LH8PXS70U(V`?n-! z{H(pl`l#geCUe-Gbob7=yWnO%_@TH55$N3}6|#uE_OnRc+6Gr4wcb_k0IAU1Fzar2 zCST!YI@TGlb)e{UL8ZcV0aM9s;C#2keM3M!D}2p0L+?Uz8(MceJ+nvJ8y=9;+Zpbu zR5*}}@5)v2^c#xy$prEtF80%vv@}u?j@L&P`cZ)O{%2b6d1QUynbvzBS#P^H@^~uw zef{fY{~rXEf@cLXhl5PfleuEPBo)?j9XkVKbonU!4qgGWO;qrmo55dz9XBZW3wZ4^ zxfiI=3in%XD+Ih~f;$Ym9=TX7vx1~`JK6(xNP@Sxuga?U0*|=&R=K6MI~qGDL6{2uTR3OSiErYa?+{Uy{}D*ZQg2OAtfuzqBFO* zx4*|7kqSo2IismI2hl!AqI-~%rM1I>w5;X~#Aj-KZswR%m=qTj!)58dfwc&@ifvqz zX|0%(G<_=Bj@y6q#mDl%I9Zlr)xjHf4V-c)W3&iXLx7EsR2EJ$;1k|(uuNU zNY+VNnO7K7WKmfyDFs~-+t7=u+%w3OWu;Jl%%Ho{Md8?$-NA&wMnDqw5|U9QF(8RS zi&qNEmana|6}N%uN7Rv-2gEE6cJZj7jBZ855>o&#ttiR%jAQwGEkRebd26VjCBs8+ z2{stP_TJ7mA*Os-RuLK;)G=;=uffA2xa3<;VYv0n|Eb9zY$KG;dE8lkDc6k$BdoZizS<}-S%4#HP&HR5jT0lCcE} zuCaUO-nl=XyL0}_^U!F-=gs(hHMH*!?)gtO{ik*oYR2x5%(LnH`G$Ya^v~7(bFeft zvUP1gb;(Tq#7w>0B4qL{u6{$=yP-C3sL))ZSGk7-($8DmSI+DIWO6Iu85?R5B)l&& z&?3IT06PJ2_T@FSrk&UR1`+A^bekAGv8z9e)Oto>Rr`4)vvC#3!rcsVd_L^wJWD>M zHOD+cT=JnPQ=lE_E0Yz4Ax8Z>>ZOh+=(5t+P@pvjYfS&&y zg6|;nBod5sc20f%dcegi=q7R7-XTfX;p&nr!}XzHI97jQDo%i6`Wrx8E9>>R-nH`k zW=5>%STn=w8HQ%Yce})Ks)NiR!h^Ss7Xc5u2#l>^O_e@SHPu-Anvj`BeR3J($&cJpQ;y_dMsOk8OsX3fNGi$nuM50Ny2->$yB^YVkp%X^XWW@Nm6da4nb zHY3w5LWlG8uhEzjD0aVFpPVr#uIx=*ZBATmOk6W3uE9tnu9y%W7M2=O&5UX-4+)Lc z$1XL3Z?uAB_|(_L^H+|X=)cFysW;-f3I1JPYed)0==xL0`LV+jEq^@El}3EU1kYI8 zXhc6UqaXF~MD+(qWTZOiIE~Npi()~_E23x(h$4Ipl{KsfMe)P3q_s!Z}Ghd$r0-oUh?T629UTp~x58UoLNIMD#vXA)j3fuDs*NtTNRJ=qR%N$1PX`PWG2i;iK&v;>^b1gwT;KF|#&<&1aW z8&R_bc0#=!i19n&(4Tg2nPM~0L>2X40%`G-(g$R!-e2}ftlnQ*LXv`FkCL5B=E>AU M9Qf*(QCr3T0HFJh5C8xG literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_fiscal_year.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_fiscal_year.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e83ec3c318d4de99451b452e7e84c868ee9abfc9 GIT binary patch literal 2897 zcmai0O>7fK6rNqLf8w94lYk*9vf7A1W;RuP=U6%z;?4U#+$5n&FmV8 zm8cftkOPNQq9O+><7aNyWuZ{^U#23e}LQY9p+O1&AuiBsR~+KvsBuD#E1-uvdw zn{VdL_@_i7is1R?`?FeK7@;Su(RzYS<=J^qZX=8^r=ud5<2a`CI$sRr0!1Mw6oa{7 zF_a5=_JAHPhI3&K@#r|h!VQFjBsdvq1zidtbPrzt$@SpSX_OBC!0 z8b>KLX7!O_R5XL00ly%$fVdWy{sabTxo@$$Jw8@IB;VyoY5XIy75zxf=9YYtM z%yKi_3eU4VwAx(H24(^?{1h7<(RFs~=zx|D$4cwL+!FM-*Y4Hby3XRa3u3Yz;|=ln z?g-tj>l`a@h}kapd;kY=sB4r?Ul@mR1oz-5AX+IS=mSOjlBI=e&!mm&w6svK#_B*_ zO3Vr~Xt9H(HXO|e-7~_8DUY8wFw)!Iqq}vTyZIMJP#5BOWzQL?UgFmz+YVB(Y}t}w z+R_A(N>nqcWSd@zTkI%crORNM%8qkpSyB~)K?}+iA}O7RfMgnAPz#!lrRL_!xV(ld z{Dy;+RjbP#bh()q+%R1WtqOnOARY9SLkB54gDd4`d@mP&07Ejb5UMLB$j!b=2pm0E z&CXG+5vimT#Ud~!rBJvliA#!svoIN$sy6{kGV{{3S*Bh6GwFzzkCzK&Tc5HO@iXoz zDU=vC6bW4iMmKK3X{Q!s@5D_9=>RkG`RSDiZU~!2MKdh6i6!<>R;_MaRtrR(k{Od$ z66apWXiPdiP6 zc$!er;E0e2}|dAbPWMv#0N1zgDFX4FiR#CXdk5$8H>Vbd9^iUn zFSy11;1>6TTijng{Wi z{HKe9cTX$__tk>?8vN=Ygz j;{4y2^?Tbv>pQ=V&_<5U_4RTgbSM7Q^F99$gqQNaO-A3H literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_journal_dashboard.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_journal_dashboard.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3031d953699f9a175f31af292abc3de879e2c0b0 GIT binary patch literal 3534 zcmcInO-vML82;vGmjxDg%R&JyLJiigExV#7h2^(AW|<^w5Kc9(wF?A)Bz7lSxm#t-&UZr@rs(&g`(eHKs{F;F<6L z=Y78CeLsF|Yil8p;;UEn$!0?Sz=D@TmCVjb$b3r}VM2yvg$Y3*BKe3g@it+SCd`W7 zfX5Oc>+n}j6B3ihNiy^&7L$S#&YDciSZbx&{dhxnPDAl4SVSWe0wWV56JR(jFd;Ju zFvMiQFbe@T-62x~3*U}RMDCDfVWJrpX>wwUs+tRiO=ryoZYY_YSCOhzs6t@jFywKg zI}X6NHRFU;t})$yv9DsT6t<-- zTd}pQX4t8WZfKt-C8wQfQ_4cdHz(DZ(_?80S7&I0roA;yhH2BRVyiP6TN9j^H$pWH zTU)ksojOk`s;!%bgTSTgLiXoj`GHEJ4~BilFUHAm8nMduJqiK|g_UNa~jnR>%?#cf#9*|cUmA{?`o zPMMr8XEShS*t~3MnJEiN>3{KEddAFZX(cl^qvZIkp1yojol$u9GB;;6)wa^*1Hi{L z2Zv6kj<`9u_Nad>-Iz`@ZISLiEY|L>@yr0nPnV^W_6$?G(v$(ElcvI1YW}9v89bwR zJS}&yW{_t}*A#xYCODsU7hr`HBhd%3d$G+(Pa)EikMulkjom+$?>?Gu#ouD0>*2}# z8>b41)7y#3t;FQh!>Nr!#i8TBbQO=DC^gA%wwDNkL^@RA83}jnd5%yb;kG@ccGA&} z!;cjb!`q2-TZwZeLe2~4#b<ZIvCtTAg~2GAt{N5CCItnkbG!{Y@F+qIU`^()VLpM-fzXN21yH_c95?B7 z1o`x)$_>1XPOsPNIMpS9dNzx(#Qo)b_whpP#CGh)R_w;pchbedp^a4gB>2 zRR|J^Q{*q+0{q2WfWPJzz7OWy#R)nh*OC68oCH}2=9&0NWXK6Hx$d)xF{jK)Qmk73 zLny>yvrcqQF~9@RDVl zy|EHOh>*Q~rPfzs!w+j;!g{EXS@@O{69PBi4>4XVe%+hzS5yN}<50$=-Ad4ff7gby zuSOVtyuq*%4VGMiB;~3$oTf_9a3pZhbyW2Qsq(!U^{33$`pm}euR7o`Sit%K0O+cd zN__AqdtiN-GqnT23CxMw%bVwiB#lr$|si(d}r zS@@B-(Nrr+8+~3S?cUWYJUr{u?mi&u$QZ}voYo5EhLY7>*PBbYF9Mz6W1{>Bgli?7 z0mZvM7rk#%bfWO`;0k4CR?!XD7bIJFJI)xPl{>}{L9xa;SD!-F$z6x-gsg>mjXSMw zBrR_Wmh8qEn<-T@ie*u1A%XoXu1n`fAfNM|UfxSJ6&ODR9jxyG{$3#<{AfH7d7ljb zdS-j%!q&)z-#_0Rxn3B#j^Q{Oe{kvErOjw>A=;ad_SS{xV&Cx3>XYHZ$R~x7tNHz( z<$JGHBX%hyVYo&JH3-*#?IH2byG!?%wqpmjVh1*31BKW?J~H5jfn*EVjUow@IxQ5Q zW^5sY`6#7dEGU^uON8pijK+1F?}cOWK7<1ZZzG^VoVJRwR4tRCG%0Y`3MhedWwYVk ztFe}B)5e|#S#hN{zwQk=tGB}bL%=n*y_Wcw$MQw{VL#|-rdev zQg&o~>v7bc6S@cwxQyGfM#{ZVU@s!?m2GpD<9|7LF6$ydNfHF1NV@X7e@o%h0&Jrm RzMguRd4~1R8#KDh{R4f^MEU># literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_move.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_move.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f915e00ec3e2273b7bf34eff7407255b5ba3900 GIT binary patch literal 51901 zcmc${33wY>ejkXF1PG7-N$|eFn-C9?6m_4JNSzd=mZ+AREr|`WKoSxUbpg82;IuMs z?@+z6hwV?3W@cp%J?J>= zzD@S`e}yVk0bq}2*86RVdZ>C=y?V$0{qOg?g@pwMT=vy-!MDC;F#H8QD3>*L^Vt`; zdEdYpIOD8goPJHS#yQit$w>F+S@WD_+`{fHv(~x1@jP~KoXsE4XJu^THvC#=?Q;d= z1#^yZ$DDKAIafGdI9D`Y#Pa6Ny5`*DZg!tPTRc}XUc&Bev!!#ManD@Yc$v{)G6eFk zmMe`5RD8#1Fnomn@-<$`*~hE6g7IpT;fR5Aykp>;0ms!ECH*^Qxwc_YwZf*LWVwldn8;R?f)farvB$vmLXa;;hEb-MJntn_+adV5xSgD!o5+w_hxqgT9KCtBXfbs=oxx)C;W zJqTO4%?MlB7xv-{+t^(n?%D$#?7sgUTSi^JCBtpw_$I8utx3n={2j{1gmdSBd!47r87V%MYK`}pTw5rzonEdqQh7-Tuk?r2CWLdeFH)-OhCAM| zJJ$o~t9*c=zLy3IgW?=q?Ht~!cldNT6>PA@8f7BCqCc;#&MgC}eC@>qC z3oCe_UZ)eHLT(x z`{ImPBFK^6h!%~UDQcWh>xvq#s^Imix&dipS5>g5t)DaN>%GQmSu|-&rt4c(0iv!B zi@uIUbJP$uMgW3Wwb|5r&YJl(LxxMQFIu9Ot9eSMtLm36TB9a@0BP!muu!FaddW8B zMe}%j)OtNnTXvp$(UR`P`$JJPUxZwa+~1#-{~~7q*vK2z4JvgZEu_!75NtfCdMM;X zMc*~j_U{gcCPMyMO!0-u8w7B^YfM^bK82`HykGqK=9z`Lz-IsKwHbeezZ%?p`VP6Nj_Lg4!EG%^Q?dXy3SZsgqL<$IDrf=o~Hz(x0+E{&zlH#8aZSuaH*%q2d{d|l!Ck}SvG~^G zv8~6&ts~Ob5utD7uHiEz7!F5@uJ}U%wqhsvg@tg$#h$16g&Wt|vdZ24w0NoeuTmxK z;*9eA#+aE#lX=${LV%q5MRqkZI7cqPvf?w*RPM~0@5W!u;)6$Qtp3TGt zU%hMK`w`=_C2do|S%9Pfmvm}@PSPBhznQcU{7IVmz*N#c;}1=+k4zRY>}>uH;0N!c zTJnypeBR?U0ArX5N6%NBChx+uLb5gIU+v=jFLrsfbc-fE{0Af z3+c5Jlm7V$YEp>SnpeK$u4qO?r19sD?;&Ih{VjsKh8N}4@6Y|loX|3YKe7CzRDN>F zk!bE%a!5Asi|YD^9S^(L1|IGB{XPG1kFevY*m+FqJQk}yw&Y64iSg>bSaqM!e@Ltz zlB$Q6TrVnXSKbmUH^nOkVig0z)>rW-R-BhA&aWGs_JC0imyWDE4fU;3-Dat7&(i1% zSN*!dQW!8MyzP>AyWqY4DlFc$=xEjTV5Q0O=#yR?eG)N_bb0&_cLLFQxey!((h&?tecDkbQypr>gH<} z{d7zNxm6W-Bb$10Mm=DC*Mbc~1@3A#+$>pu@0ozvWNs2>Y!cK4c5wj96DkN-fb^n? zvqVklTu~FiaVvnhISr0iRp6`CMZbCocGae&Ma}8A+;3wb(mEO`)-2lV3w+o=tLrHh zYR;pYZx}b~DW~CjyB0We#+!!g^&9nzzJ(}jzh_*?M|rhR2<`$H?4#EwtsL*43Mcch z4kiP$KmztqEL)`$sg=WE1>a5aWy;Qeotpw0N8g0?=`-D_QOF^nP`R8F9V&?^XjcGs|S=;5eTyIrW=tTvubV02MMG1( zVN0xGi`cMLYS=2&Y+bif{JPCh*D2JFJl-O084)&*tlJGnBb&E}$9#5v2dd|HQm~tX zZ3vR3p_zqS3@)&SO@K=DC+!3$*fYPKGFd`5xP@d9#ip~O2lrB9G26Z-<^h+&3oJQV zu5=#o=b3Z~evn>!96^XCDuJK_a-X&0F;f5KefAoadxQWz^rEWnVdcZRcvWw#s#oY6 z603%#s^O)g^*lpe(jiA*^CUnTu{!lY&yIE1Cf~2%p2EK1Yi>H>lAs6lI^}cZW3# z9{@pJHXC4FCOrVsKk**CoxUyW(!bqkxc_R@gk@ z_G7sr8nh0O^BdQ(Yg)13LSYaI(*YzY1XhYvnwSfOXBIecNapV(ZL`7o02V7TPW;!e zV=JykAFRP?7i!GsrsW3l)*7KVYB<&Lule7L%XktR0tEu&U4#|;X-CU)X%^^Az zMu6%0Npbmm6%Q)jultRjsm(p9M=p30G;{)f;p5imrai)&F=Q z<{B1U!#{3*#{Fn6K6)iKdPSJLEsoxiM(>EnBhv8*QWI`Z+`T#G-YmNNBzK?S?)zE7 zRkl=^y*JSmW7F(^!Obr-&Gf^zXw<@G{xF`@y=qmRICzzMW$tgGE|gLCr`%J8%a~#> zvojg7@5$528@d*}PID(5Ak2D#O@m1ulMLkaG?;CXLn-`sLo~R@e*-X#4}eKG83dMo z#Xo;7qeh>NAHzo`9ezfI%CoXK=iUR^V; zwLI#MZ`vK(v|HG7S==-sZJLl15>EI1qhB9+cSNYVEIKD7=S18&6LZdp&a0C1s^Gku zaFr|-WKS+)5wgkkF(6dtj~FlkEDwqYW&QkTB&RfiI<{nh8e^2wlbX+>|r|IZF1IAJg{QtMLf zqEWk9MKw**cNu56#$dv$hWCwVzRUwR{e*^VlsMC~f%#;$3d0rFlfoYhA&aS}H(4m> zNHNZ29Lvk_g)i)T2%v-8y)V+KT_IO)gu__x4Aax#SW4zaG$2HT+F#<|U4u|Ghrg$n zel4`TS1R2ty7ow}Jx|_@xemxF+K?@R$lPlSH@rX~f$VsR!U}uC3tsj%uYX=)oynXt z@aq_P2mW1fKE>Pf&obWLogQzho)mx0>!%wo81|y#0P=%$^>aOAAX`frPy^gV$zH?BbSv9U zW#~pz0w`Z<8@-9ANaaR@7e#95KO+Eqd+sPojl`?t(yOz$7mMa3gpN7MF-MT>wCQKglS%~}6({zszsfDLaiK;rOYID5mV65t(ST!V74J{QV998QE zt9@&tvTfa9E-YoivW0E7jWKuQV@_~4itgQ#dw1MD7;_IMJk={>@w#oXx^0ic-@Eg) zC4TU=*umGtgRe^mUl;2xN_7|4&89=fl1~k$;?mD4z^<;A2{t2yRs7G159t5vYIW`kY=mNMwYjZ8_c;x7Bzh^?3gBNHlG8a1v`omrP2 zOc)Je4KNFM6J9mgKZ&CyBnM}@Wh=17^$5gLXF3w znglaw;>w)~{|ziN?7;ruEKj^6z6U`TU#LYpFXa`a0VgT$*1J@aq=VpY4aEn}#Rkra z1LviI^TNPe!o@eFi*MbP*+PfGu_t0ne&Kc8C5x2Rm|7)-Qt)m{$&+8_OCbkEdLWns zPoSj|Damf|65>OzBES*?z4WcRZ`KLzZ{bg@ib_>cO#8zpmWm`>pJY3fu$9Mctub4x zXls{j?Sicx^YI(6uePk!i%r`_*AB_GBktNCbL|&hgOY1dunlHUO`1+@YJL?rFFSHT z-we6w9Q{P$ofu(t!lseWvxIA;w&Xe@*p9G~VslTo&}gXG zaD4?gG+aQ8b^^~g(z1{*-lu)yj8#g)%MF={Gl8j2Tq<>d?)QTqrG4I&;vn&qg|DNa z9>HPEf3`gD;z2_h(om!XLMGO^Y=6<>27CibWOQ*#P^2gRY=@$FR^2fwBx*R;WcT;cznk~Y{!DQ<4tMDo7hsi22E=_*LLFWwsFw3Y?0g@ zg1h5IXRmU*Zda<5SBw_Ws=)jpP$LY1F=~<#Cmu|@sBzJR;V`9#LpvBGf#E1s#eucx z7^Ox~djuZ_zJM{kLQp~-j72NSWwbbVng^h*P5WLwi04e{DIs&;d8h=SR_g|}YTK*% zvX`pW8ns3(^ks{AQ8QUM}0>}|Bmkdovg60%RA=> zeDZc|>60UXSaM$fbv`(YIQb1eFSvAG|LiRLvJj-d-VWfHlK^V!2hQHnHrv;uzU*uu z;KkQ!cqpLO$&-8u%-y z$C9e2C9HvGob^$jo)BELMJ-Vqtx>#<{W6$iO2wH|ac1IS=H^{eEA`M}(Y|3`v^*nk zLDbIMq6q2R04?wx^Tuf2Sp%03cwvkDiaM*cz#_F+iMAs~BU=Zwnx~sqdqecfOkSXKE}X5K;U!83o9?h26f6!l=-O1g47c&w*tl#lh>cj zC#Bf@EB;xMiX@BVFP}gOw)`B7$fetfzNDR%rG=Jsq^hKc5PH^-g1Gdg(db*|3Esy8L(jmb)lqf6}DmDv+^atkYN?pv= zCb-(3*LOZP3ibVBeZN%SzwAh~_dPx#w(oyh`Rs%^cz)&RazUbV`;$(wbNFdQ7@H7} zOsrg8b|xxo0kixAEL-UR zrO^cygp>dj**R-EB?YqbxV)$>YTtv}?t8W9gg$pPFLTLjsZ`|6PuCpH*XIq>)JDD?^^3ERvg!1qxzM0l{LBASy^sGykrt)bhN0gB$>}@&yp(KtJUF{1!#6TtWJa zzLN)5CH|*sQTppi)RLR=7bJ2?Z7b(U*R)D=E$fO}^&|YDF>3oTi$S?;ynj4u0YG*7 z-`65wyLg6y?ehA)v%yf9kP|M**yes&!404gx~~LAb0AA8{KF4yh#(I`gaY&=!w3~} z5BE&>csp)ERU(i|>hta;up18aburwozso!8zY>`319~MF?pJaki85|U<>*I_o}M0` zT6r21B-r*=dkWG|1iAKIUR0lgSABTs?NuN9cX|7Jdl$RZYW}VZquJ>vyOcV(!Qad?c~kr0kg!Db>M=)IOxaycH2& zIZ=5%e#DCb|TJ)QdTp&d3AhxAJ26-b8@;Ou3DaD17`Evh;6gD*2M@;1}PtKjR zP&WP{eavsBK8Ca|A#{`r^53MS{{}&bRu)YF<&t;Ex-V^1#JBMtnbH0q(mQ?~>khkQ zxuL{EqDC+@>+P;jDOehMUe)lhCSKJQtLj=C6Z(%x-ABc$V^Yl>K?omuh|8C3m39lI-H$gt&3pRh$M#tNF`@t1i#Ff#k(I;mol1CWf0}3THm`15Yy4p6+EuY( zr_``>+4;QAyIQ_x{Ge*>s93jEs@wW63!n7~J5Gu_PD%*tPA(U`Xljc$9gH;{Oq_i~ z;O1gy=Y+F!%R>*2N}d+Ub4tKp=#~_E>vKqtj6=lh4I39s36FPm6K(#s-`o4dFLWLd zI}b<*y$2wMU8#C->QlS5x#V*Lg5~^`y!TwoE@%T3mVW)@yC*^N*Ayj6${%zHH9b(m{|XiHPZ59)Cmb!ApPHI5 zL0Je)P4NWQ`9Gjw7X?JCD|Gi=T(an`U=MBO1eh~*LbDsC<(Vsm{x7Qa+X%pxUN_{s z3(~=-PD63ya>YvPPaTFr&;3y_;%fB^@p!D{__OUl+9jO7C`?R==ck03Yr@={SoHJ8 zqa@)uZejwUQYHXG2z{yAq8If|4;Q5R-bCtmJs***au$3FEg`I71nXv9dt}BbV|4r% zT+k)`L$uphz_Q$U>v1DpkZk`xJ21QwGCVhv0%+a7Is#vlr@ zK?u>9zwrk43;KUR-Y-gXjC!PD<6VMHi@!ldp|2zO87@Xe)q3MKdt)_wpKwoKeR}lS zoLF;Fs<|j!x-8X92)4>Z&u*dTkWkXJx=kwCB$RA=R=1SDZqoHjdc-t$PDA_l$6t}! z4nH#rt;dCvmxKwwFmgp`nOrYK=}&2>KTnOfJ%>&KY1A@!NPX@Uf347DDhW~sGp#D*2P&KWuVV! zPaas}`NU@D@>1l36D?1}5*2>TJ9P2t-T_|8MrG3khrX;zW{{3pXyfn9Ab>KzGiv&h zvUYuL{nJ;CM7rX?760?_T`J*~o9y5UvaJX}^#0bn)%U7bX{Kad`mqETD?enskK9*P zv#v!Oo?J@7MLV8I;Kr`S0z9S1pje6L9H}ungE1~qVzs|f+bZo(Sr_MgRH*NRs6FgU zXG40CK0Sg&J$cHx2uuT#lxCE5!`Kb@-bakLM>!(s6A;+HKwDn6)sv>%X`W%h%a%&@ znq?jap7X~0|Fdp2m7uRxeU-F1=5-@is{j6XYeB|V(D!9toG09uj=QRE@Vc6-l^puM zA}lIx)Tvuzs;MXHsZ~m+^KxbPYPoXVJJcD(RXogC0g!B3bGLq}dZ`xJn3=15hvp;+ zz1YRM87}6`g^TIG0d?o)uKQkfG=C~Xjm`*$(fw7-U}D#2UEr_k=F*}gyg!`@YzeD= zRKU#fF#OB8SQstDlXI~s>P+`iw1}(Pg9`2!-Y-M%dX>7kYIT@4Xi4~xk{3w)aQZ%K z{q+nBDSeBL#29nozgyRGSOaCX{6A33>HoXci}~-?p!b`V_be8Nk16-y73b^UK`box z)g_Ci(US0qjdOBN;-05gfGJu`c14RG^nP2qO!^MvRf-vD%)skw(tWj97WDwHFN>C@ zEWS0YD1N3AQYu`rciTYGa_pkzoDMUo{b8pa+A63hNX3i6toL78kN8+DNfVRNX012leMMF%%9wPywy)~4C^$gRz0Ldup(I0bvOuCrcA>~&7_?vQbj4RR@QxA#mzU&DH4A-1GXUX?^)B` zsUzi8JurSRum%9-#rUrR8s$*Sx?l1B;SLDU}PjY>;i~K$^U?YKc;|D z#~m zT9(hR1lG-l;<5)ep{h%AcgNjFWA3BRDt=TgoEsM|`K3!i@mx^2HZNQcgHnFec!DV9 zlcrZlRkHXDvCI&Ht);D)(Z0$2lu9Y<5?M}3DxtdZ1E`V5?+EQ6`Kh1CBGqLJ3!r5`@EQoVXn4T9WFemN^k+<2j7^G=&$aI7z#39oqdYUjz(j=+j zC=MamDP`p^+BSW#Ahqp)%@q3uJEg1~oD?N6D=lGdl9?#~0!`J;8X7^i>JQ*X4>VVE zuWXH)pMC>VRQ=3J$K(xoWtg8NQ`%%cbp0ZLH%VtoKoDMlSz>N|&tDqgax@OI4(Jn) zwDVYe=PR+DuLx&emCj6xJ2`15cQ<7kY~)|Zm-;&SxADUa4U;yskb%{-!Zv@GQVD%d z)+pOqS|}oG8PLb26ICflu0%zgl7`PYN~RO}3-tDF^!746w<#qINpD;Xj`P1y`5#bz z_;t8G>z@qBGM@jD;{S|-e@p>^h@=^NFRZY+kPJ>4HnK$64&aQ}vKq&;nxl;{d-hnfuf`Y!In*tpe0>t6hoGIrCvjN9CuW;!(=G~rx}q< zB_l-qTc|+M8|B-SHJoDoAV*fpb3%KMl1??NRb#AFJar``fW5+q+IJYwJaKBV@Sis-a zdFkpM0J&?%S53qQeYsq&25QV@r7^FIwHKw@i(<(ospOL2yp)jBCzSMyV(lfV_L5j~ zSt_|KI4{3wXcTO<2|0v{SRsT{4^GBCn_`|#Lgy9yiJnQxGr4YPv-f{W0n}2VttW2L>1tK)r#Vtt3ewCy`2_8ph{jz2s4r{_80>NVl~tayG_LO3!jmd;6~ zbHepEW2J8jrEfx<_hI4VGlF-A=-nY9^z2wZN^hx-yBcGz##O)IY7|`^lB;9wXuNAr ztZUEHVxen~*mX$iIwZIP_=~ad>D%!mmt#jR3zM91WyFMu?6+A7g z+y}E#+jgOC?~{J9WS>;BZ|Tqrr#J3wk2%|+`tyAAwnuM08TkGlY4-_n^N6&0MCdu0 zsPB>L`xMT<`dinQsHjd<)sCt3!+N`K6JVHXYmM8wVz#c|8~dlN!p@UI z|ESn~O6oo(+D=Qh(}L~vi+ZnMt4TD&8pZp`rtY;lVec#ArZdu}GwTMo9cC>EL}%N* zQ%hsZ+gDyocw0Vj!UpL?$%|(1c~@%G8UkgFig`tm2O@etc0F zJ0}jGi)}q8;LqDff3Hu#Uqf?yym>g*Jp7b<_Uf~v!mE>FGbc53LSRa2o)+BR#I{4i zwi812rZpfo{Q~}8xx5U8$;Q<&sda0-b$6_F_md-H>yXqsB)W%SzLRh_$K9J^Zmg>l zYe580%Ab}$Gk#o!Tl|Uc5y?FwxJMH14%xysjZkfT=QM2I|0F8)j6CxT-KT}KlR{ux zI5Q)31tIh3gY^#r$UN8`*#YH~36L7Ns9(H>>iTche6vPq-62-(l&W?v6+QQLtz8!O zo)dkqO1@WVba${obha*?T-lWxVZ@mVchCqANbTG8BfMk75q?GJKO=UZmAcQ0wlT>z zCfLT1x2!qt>5O?gg)R<%q9-7E0?=x;6~}FrF7KgwD&x&679R< zw!xTf@M##fAfjzVvW*DJpRC8G#o}z(9SGz5jL0d%_EzzmeGw`8ks1xggi)tnn!(oO z%$$X@g4|XqzBFBsrt+rDV6Xjr%i|2i)wCFw13Puv2=8_9U-!_&6+DFUsLwI_MOl#V zkqvS~^gD42+w8(E-h<}Lgai?d5Xa6(1~xV~z8MVMQqcp|dL+yT0{s7u;$sjD*M^`} zJvl?U{5NL9vd)%3c*~Tm{ zJe|)yWkPv}=89RRfhh+9bnGJ?Vak}k_ZE|H@;E8#-&|A$#gUJ>EDP&2b&U+X{z zr7rEv)>AyHSZWh2_lVn&b#Xd#DXuV0J!@w+=5^7-3@2e=BQlSbqr3sV5~))C#mOuo zn6nPc?&;FAoHrt;&vcm0S^Op~;O)(g@r38`Rtjd&K)#p)TB{(n^AVfOqj?IJk)4Wb zXXI7NnVyk^_QNjjI%$)!NeQ)yy(})Z0I5<%@wiq$`BdX#Mri5ng1#*0Ewm{_82`qz zwNLc)OP+r1Y{gU^ky=g*6|V^8XAL4E| zFRf<>P{Ab%P=q-PBZZ(aV@$e~SOwTw_&4w&$#(cVBSn}AHtx)|gW~BS$c%dc!#VQR z5J&FZz_0D)YKZh}389xOLkfH$5-VZCxk_RF8+VIZcxdH4lawy zA0mGR$=DkRwDa)fY{+5k>_xQRz-y!09wKLmb`CHY6lW-Qdo@gC(;FE(4@+-$B0NLhB#2GrpYVsnP^c%k{QrzF zly4Yi|0G&fP<^+(OxJFOI;mE6L`qh<7Z+#D+{$DxC)(1o0UcBZ%9&HHoQqH2MhLts z?6mmsPcOVCFXm_QxqXI^<(BET`8C5WK-Aap>2eCTQSuW4!-|mq3S1V!bI}YLTQaY} z@O=QcBG~nA2Cxv>@+)Q|g;<&QNshN5V`Ywol|3}X^XT1V)tA-97U^cnR)lxl3_^O# ziic!j*hQpdI?igNNmG|KX|zrGJ(?sE%Kl9D(DF%P$-VRU&&LbfVufvDVTV-Mf!)sD zw>FfhYn1BxVc=C#9xrK*l{7yc6H1!JlH*dzalx7T0~H}vc0Vo>E5Q#j7Q(U{LCUd5 zPt4sTx_c#eufYD`wGA2a6=QAo8emuUK4^xfY{FUGh5=Za8>X>@5Gjy-FlZdyV*aBo zmci}$f3(Yp&}STjk3ybU;l56Ihmr?wB3Up&G~5jg=|s{wG4bXN|11em@nnO)LRh;5 z!zpu%L+}urthp|Gu$H&8i7U*5^+X81UM6Rf_LDHP=!c>29husrT_|ZktGH6;f0dqX zEE9~IWv74n2NxC~U!Ug*DM{uXgbQo_4nKkio(QL8J{KV4iV#mrk#D7dnDG1r1ve>( zQt&DT4G73e7$hkZ7x2GBv5b@dW4a^mG4H_O^Tiaf&7zj>yc7_$;R%lNG=-9dDc5YI zH!v{)t4KE4kYY&jqTQ600@5-IokmIQ0m{FGtM2YmSQ9q)thRm7DQrC>ymnb=nh={N zq^1eM(g1b{#AkU@Wkm`P!{?&4+ zu`l6j(ib=^7igjaO;n%>1?o|trgNoDs@{}vwY+e4CY+tvS4s=8jTCQ|OVm(_8Y)qP z5*6zngQt0U+k^eE$w-uW6Ylo4FlDq`J;;avh76v(yCZOpTH{-3d)OoN4GYzW#p=US z^K_5TsM_k$=51{pPCJM zyV7x+40*+Je$iSbS*zAf#a42NNFimdPRF(7Ss@SHC~#Y?;DY4{iVCdoW051Mv|111 zO&f$I7VA-@YC>nKsX}qLXzh`#J?kc`6^kDMwRE!@Qv@XWo!8b)ZtG?+GOe2_)ulwV zsEMagz1w<NVT!n5OqDLQ0y$IyH48=52aMK}s9E?FEA>&KeQJURl$M_6zefir^M!cGDK|qI4$d2lgR$1yy^Ng>hrrCz!$An%H+58K9@D|PUE0(2q=V~dAi@u^MpUzrC(5>j(D7l(#~Mkk3KqFe;L z2+8>DXL!#qL#&be9yrgi=s^#TIMA?9Hliu?69*1%etww@h8j#B^7!A1=JO93k*I>c zlp^wbs8Rh|tsQ=D{&A-I^P(-RnofWv0L%O|(A5JsYWu3P5h#7jexqg_&|tV)phS{q zay$eiPH?d*~+D7?$nr96N zzHov;-J>uwz_?&0TF^ud1vy~j6G{rxMu{w(IdyJysH3$bE8Q3B^0szxfyp4vL8c}X z@`ZdbL2vC~W_!MncW`tFPfCr5phV>nR5)UWhR+_NiWYbd2SBIMV!W7So}3`-<>X!A7jEGofxo8Y zBj_F=;>?IGRSvnsM1k^TpChyBWs7S5IAylJc_YBzNm}9W*$+V!K@xICX%D?QE59XK zt7jsq-^RXx4G4dXYAT~5YO3;K;5s5&d6H=Y8g6g;k}Vkd6R1Q-hZ3Oe(e=TPktIaT zNe~XtJyq`=d2l4|@x?s8wbsXFPpnUFiJl{p=Llq^?VTSi#@lzq+II*$N5%G2Qu`^v z){ewj(P zR*R&H&GCwDv5IZN_S0g;D^kTPOGiKHgqQP^&u&Ynro_%^sdHLzcHkZHmTj??ZI5pV z+fO{TeC!ZTP7A?#v1LJOSrD9!iJFFZO?RxOdo3XJ9E79Fx1OF9&R!5}UXyBGTN-&@ zTE1>F77rU=G;L2bv`Y=!66FwPv?gj>9-c^)H>?-iJz#So_?&`u=nNEr5OKr%T&2wF zBKDSY5xim0^Pk}6mxG>b4YI;Ar;G_ud$kR-* zC=8$XAO&%1jfk^Q-2G*J-VDHRCI~%?nF<&)H6g+n?!dfyo*=n9B#5wWW)WRaYMrmUvxOE zfxi%yebK|tL&NDF(fX<5hqXTF_;WwoPo9V3y z@(E1RkJO2(-)6sRy#H!g#e}oG@2eXXK2g0gz3-F6BXZe$nqfvbFN=6@WN4tVJCF_E zNn9`cF@dKNW?8@k+oJ!ogf!jJy9mbdUmCLt;tfS6HC7cei%<6w*_=W_aO5|^f}yp8 z=^PU02wO;S$_ppMz?amwULhZNN~s>K0r_+*mfw*q$wsZx%Yd=0WH}iTR?OirPnw@e zCzz4g=I$_77F#QP2=R)GU<>IwYWRc%JFo;&3xIM)$}$%K^HThuX!5Tj9g`n?8fWDS zWTg%G1EUXwZ(#)smM!q)D0w>9&GzC7oGT+$_O4rTOPrlLsj_E1pB`*@Sh*-wZd&6W zEl52FVwDGk$^)NNH-9*os9a1mwSCYfHSGptrnMZr{?>BnZ?U_Y3f$G;P3E$SpZyd% zZ)N1S_v?%AF0PD;t|rOVB-om=MFBLa*@EfE4GG==y-FF+8PD>SHec3x$n+5ZS9WG< zX5GtQM}Gb?`r^AOAD9GEbUrW#35aMtW6N8d7AIE5Tt=AxZ|YfM=R#OQZZM4uVo(T; zL+E)!@os2oNOCp{&SpB_g5U{-G9y5Rc{-UhtsnNu{}XOfpFE@gwYvGI@ z;HM#h7DD8fWuYFW8c3|tb!s67XUddUMo>l%AvjY65SbK<;L8rJPapWn<;$ov28Uoa zyY2^>`%)l{#dwz09M*6*UCgfE-p{OSu&Ug^Z6ijH*egKJW)=)CV$G&dX3jMpP3bqX)LG%HTc5Zl@jJUbHmy z!tH@mQ}FYOD=;-A&!%-VZa?uflCtX2mCKT+EAAPNd7!K(9fmdzC%tj=r)Y@rh-_vu zN4NzZ_Y{Jai*OzO$w=%2zf94=&Y-);2KY%b-Vx0BrcO60F+tioda2 z$|~0L;YC|=b_vcdtn*Z3zhv3{JA53?!BzZbU*AF0M`|=wU^Ko2a{CU*76UC5q7=<{ zcBS_&4n7mFcj#(Vkq{*}{r&4bu4n%oQr&i#dHy;Beh1IuA(B161IMrodsrc^LftT#|fR zW(<}cz|G6fqmUg~ks*Cb1HlUV|6S84&J^Wmv0UZ#pV^yrX~~-krqjF|o!~V^yC_1x z9NBBAAA49ozMwN_24b!O(X~x-Z6grgooMeOz}_OTKZ5P-tfTJiwe)w|2mCy~Ug-ov zm$Rl+O^!|gJBZm=liKyV^}AlEMY}_#b!+%a#8X*z@x{4wVgFIG z81DC^kpqi7mt+J?+ge7AWbYPxX}9RwaJNvqF+K5GsUu&(%TvCxO$-g75J*C4g;Yu% zS2%2ZZ26v3>OCeuJmaKMPQFcaZho`}9>$n!?4LmuT`e!85d>^>eM$Q)>&pagQhhn4 z?@PW}+e`3IqJgbie=eEF5oJ;Ws0HtkFMf-*PQFW#ok1)c4(7Aa3%^d@`33S<&7ONACx5AGaOgOE+~T-j z+1^>L4(NIsJ4s{snP>+cvrDIvWH47Ft=Us6N48FyQ@@68RQ<1qfm&MZVVYB<2M3Oc zxiE}5CG{SbZ=aVpd}tJ!f};1T8#KT;o8*%D2xv(lNil z%}87%b}S+si=>LbDSCOy%Zue9sXQdOLq8)&?aI4l;HNG{G>?XwO~n=5Fi)&-tFF3N z9*pWv#>w8w3DLyFHLq$x1>)o@lc*#eT&+F}&MePx(vhl9ZNcNgsF|SzKOs@OY~9V2 zZV4L&n57xYZ1GYw82=eX02Kpcj`6}n^noD4yt1>Y4EMd56F7Zz3bX>u!*c*%o$D`M z<}Eb79O`D6WpU|}HBnT#ax_-dA{4bGs+vEXdtwsWc8hJhC4^PGVZ7ulrX#6Vszqmu zyf4YwiuKum0J^G_ihvio%a)wkdlr2+8@2&-JV_+sQvy-hS0)C?q%%hNXW2kU51vi% zW%7l4b*kv8iJ=VX5y3A0jMf`Y=FqDix-q4+YPwVF2xB&uf$mI9wyG{$dqej$76O>*0e4J^@ z3=8gqnEhs%0DB*~VCldZ-eIUcJ;JjL$^Me=evg6=5g`9Hx?iAxSao_GH)gfJGYg36 zrh3XWRO^UAG1@;s6aO{TO1ugKsduOWD5{^D4MoMv9ssPh0Xii2$>7=^v2&l)xlb(I zFBR_pVd>McX9Lm+zc_eB8oUC>mx6O1Ci>cH4(SxF782lYfcMbFoQaby3 z`dGjN#+m#c?im63hP>+e{|ym2;C8N0-bjubXu3WFHPbOuTYOta1mL zNy9!4Z1130c~z>s%5-1AVkw0xErO+dTFk^>vDf@&^UCx;=z7?-))=eq6skKP=RYxi zui#1F_X^{^!?E7sXN^Mdu-H2y^^U;YQ#$=x{IoxI+AmB^3#a|!=^5$tOsscC=$%QF zmMtB7QCht;DuW1h>EZ)aB;!Be0Z4|99jS%FfXSM2`dJ7k^H7vdvoYtL`sXyT_=RfJ z_{(NBYM#?I;!PTtpLo*v(&q9Wl2j{S)-U6q;uA@OS9UKsiH(1H0q3beOPl#FAlwlP zhVU?!mH!G&BQ@!}=41hQ7&x7bIg7WDW}(dg%ftzIk^aCe}?9 zXB$RM!%9@D?)s#6*OP%Cdc@wtzygG7|4Ivs7OK0R4GFJYl145|BmUDlw* z!3)yC3qo^rbwGe8_~v~A{w~vLn$qPv(&Z@REGx$zyq)@C-U*>oLrUEF3h764Lb+5{ zH!T;MAG#5=e(9Xh`K`bR>Ymdh_zTsjpJi6C0i|EGc@Y26>DInWPx9P%P#2S)09YEdc0v(-K3Os z`qk%An7LM&nM*H(uWTHxN2=Ci^dx)wOfhTWcG`a%-l;FT zudl&ReNKD;Kx`<)-`^uS*jcn*7=u691LI-!2s(Iu-XyxZBv+SU>&nKd)CKWvRFKY=3aClI2&Kk>Y}Y0sHP`W9_v9Xm)G$n>E1IUEcopx* zNR*THzWpu6Pk+k@M+d&{N0pB^OTL3~-?5nQ*pD~;s9U&jIey`0?7~g)!foloZSnXW z>G&Pd7m<9CrNff5O>njm-$JP*d&p>7vWZR(qG-rg5s`i6I5QA=Lni7*Edx^vb2h;4 z%*d}I#XwB)#c45I?qvdF6twOm{Fg6A=&OSn$_MF9aED!x?;2M%%TS5WTx|2D$VWJ9 z)}^0PjCRuT9;g`%(XGdg9x^aB7PXnmdN#3*60SgGEfGZ%0nC5nZ4IlG??Zh$12M+J zOPR6ItYSwGYf(zsx7Qp^8dABuYgm2rgF8a|@Z&*gVEC@=UnT;xnn^lhswZ8=tzg8@ zb4-N{9A9v8$qs;&%3&A`x8&@JrnFr?osd=s)BI<~SV{AI;8wB>E^3(Q4b&GPZtXlynr&VEIj{fc1w%9kv^e~3ow=TdHlKqj|pp-~H6U#<*Ua{a0XSy%); z$ytKN+@%R^)GtyjiM&x9a{z%hlVT-JQ+zUSiu^0h&;ec3&}Nvy$ogs8TtT30QQySU z&<(Md0a(Z+2w`LgW=}(X2ZAtWjtQ%R9Kr#@6u+dzEt&$S*%Y9Y4j1DtZ_I_W1Z1Zp zg6sI&*rQAF?tQWDeNS$R-G`;_!%z8V#;3g0eH;_S?OC1?Tn+MRtE)q67|sF7H6Yjq zwekh0uMjP=IQ1QA$`+}4EKP-aX^5B3b)8O= zQ7Y7&=910<)65Kh(W05d!Cn(8B-E-sXlvtaX&Pp=Kz)hkMh`c0pE3g_>;nB{(nEH% zgmzzc>E5nAj|RP+eL=yyFlt6W6-`6s<2u|*GZ8NGruPj@TvtjU+kqOA#=W5Q+i}O! z)Mq{_WiM`f5ErRR!A&Ly*Kzs3D23WBAlOuJnjjrCD8MI;G%0ZQN^o|zCpATTW^)5rLecud;af}vI>t*j9WqmO91WU-&avA2*ulMbxx5d!D( zVKZP#c^SOFiis;Xg0q~m{AkZ$*>uNt$#SRM8Q-GC`PXCneVrJ*rt=)B;( z0F#&9@Fj08cfjPO+_6*ulb71qZEu%Bhl--$`wQ`(fsP$OzyLaoI26kSbc)X6 z+W-aAFE1$5f~~-qy+ngx$mJ^yP*zniqNLF;fQTUt4)jYAs=UO^PhDvM!vbL$ z?Oa}NG%IR<8MI2j>=*5JL)7y3Oi{}`**@o1^v&==pBo72RDA*1^k1k;#i=OzRQ=Op z0cVF=pbCzl!&a{=Ul7$R7CZFcl+j-Wx>2I>XV+?xa;N>(y$23E{?2+N!}Gkp#k#i^ z>7FwDDsM3I1#qZi%?*0>eM<+sJ#y=vtm@mM*R;5r?k|_NpOpKIwc&_5_@Qv4k_z?C zjIrU0Qxdx7sDmp>Z)}{#lQ!o;T5;|)ay?2MVnADY&FX6@OP4xpnBUZF2sfqM(t@M1 zaA0~%I%buqiL5Kr#)nLM=PkDkvY{_Q3SY(O;Yf+%#F%YU%+faLNo_tbdXV+738F`; zU*FW$;fpr5@7l9(Z|ml-9O&xV-E#5uiR*&Fpn+^tYJKkH4E$F>mpdvMNp zD-fKX33tF9U^sLWsv-+~M=LbfwfiG`aSu}t?DDoBZ1;JiQSzyrqiB05Nax13BVSex z?KowveGsM52pImuz2kiN3u8ybigvYzB4>|4mHxE%;A=VF9ppA@QLgy(p*nsd8VVT8 zN)wzvHg+`oCDg2wgJZ*Ijt!0+8y_C>La9IN8=!#SRghI-2o9_#15^RZ$Pc+Q;y_$> zd?@A2s)bs3c6em?(3ob7y1e1g1Qkow+oSYcmzQnNWLN;t8uV_;m9tW>_wbohCvieC zwGtK5P_x2lEg|}fr9xx}VO8lCAr(fHw{EJRGXSb_=I#De>%hT4vfW z>jN_|5%PKX-@<&0Q0Z^ZG(Jt|Tp27szcG)OcZL{t-0`e6v|V1!mrn zv`m7FkTgy5pagFRCU3yr4Cw7-cq#yMbDT`gT(u_c!?z~`Y#t@^CuSF>rvp6Pxhip~ z1NUS^Gv?VT zdUi{m-7pd)!*bz@Q;-1EVqW7D_Bzd0^+?230Bh;lUAV#F%LD2`yV! z@bAe$eE0d-ZX8xWA?|)d+WkhndL~vq^V|&&nr&-V(cL4td+@YwGL&6_l4Tt*;$kRQ zBKXvrR|8uQ1WPAy7@oUyIq=}B;PT?{d41z*``Ye*X@-jC-ZP}3x$`V3aw5ci!x-Ho zTy~K5-O>9e;?9Pcv*ANzcei@hn+)*h*t9R!v=4?eO-H1rBk`uuSkvf_L&Dit|IO_m z-4>fJNKF@>S5&WT`*6$Z+hX%}sd;<6c~7i)&y#CUE(xP=2%}R1Hzn?!7Mo|J<{7af zC{+X#W%Y^Lo^@YYBkWWVd`tUFfLEtYMT$~J?`>MDbl zN#W*CO3RmTzPJ0q?$zSo*uT7g_2!!YgFBC_r1srUCZ8UD*7xzTXF+M`g1GNOto?$} zej!ogUD=wbs9W(rxU*U-RrCn%9w?3!ZvNR%;d%>tvnGs&HvGg{8h6&koOMF|anX4~ za-I;BKT?1iF_PPeJknmc5h8rz2j=10BfW-y-B?IrZ_CjN^RsdzLLGBbWxWl|KDsEncS-JDh_o@k z*5E3vjR{*`6)up!ebE+?Y!Sg0QBwzmZHJ!~3g=%JE=`HHX~{M%*rwIgS47(x$p-tu zGYK5tSKAk>?R(tvJ>QeD?@v4n;D`sY_I0WDb-`AZaMZ4PR`X(xHo?)xwjzod792kO z{obU|e@N^Zf@0i{&CiB@G$M^$6pvn#j$VrOToQUNB}z#JIN|av-H;g>>T1Hrs_M#@P9%RQ(dk6zoo|?Q9u@_{J*2%-%}t^K-1b^i9m;4{*nt!R|i=e zzf?W4EQ=VHWRM*Cr7EG)Z1LT|Sv|jWEwWfmUmj<*kjE&fE2Ke(NIe&$fNTdCxPX9* z={s$v2m&48yFzjW?+O55=`T#?$qz}Vw#B>(OG3o3QYj5tPqIvf9--?nxtPM4s{kW8 zbf^>{qRl1}Ecs`s^seEPjbMrB?w8#CeA{4S zFQyZlpbxSyJ*Q`b1q>je=QrsWC)2f@#e3DooHqXD-vE$OQ3vh&wP?gN?7+Tl)V~9$ zks&wd6D3uSChk??iH^gTaUN(cG=(n#_%Nh7l4-7(4!IyV)KKgCZS-_R#VZuT4=j5U zPlOct1ZF8y`AQo5Ac!zVArN_ruVw;~!#;BayQFgBFgddZ%bz8UMQXF41gccB9`+US z)aNoKd6FvpU3w%Th02{`4N=~o-rY0zakhY2n@HG^+Q*YFW!a=&D(~qU##g#A8QZ!_ z)+w*vn5|KyVye%~xV)w9U5;>Rn0de75o?C3ZeLl(q+M! zH>9B$?p0|B2sOB^(G!L^$KD1QXhS|#3XndjSA~H#5LhLEfu*ClfRqBZg4`HSj^~+$ zWJEcp2QZHD^Z*MBWMfHa!g4Y+Ocp_=8lY1MWmo%OGlK>(GS zV)!xvoDGKWKtOzloS#6QB?NvrD7wi&@Ft58Oy<@qMPw6y;;a*29(5`FVd!OijP|C@I4P&B1!_e6VPCO~J`q*J-=%SIhy*PIUA$tw~6G6Lqaiqf4VN>e}Fhw6gZ0O=#?wD!0Td_s1%6M3HsSSdf6# z=>?&@9bQZ0h5KTK`-s^m?SEC+e^nU2ERA20#;=Nn*QCO0>t@RT0&09#x*<7p{mSjN zo+qt>4?c}-c0iI29lpQI3WD4cM>ZS{wvGUH1Ly)&jxTTi?C-x*!_m+_DgR6k`;&A#2W@; z4FiwIzV{k!SHdfxig6s>n_>emHSlyCl7k(p)FHI&crx_;Q_`N%Sj(u;GMXrD7jVvx zN}#fJq~nSaLdQ0>Z5T}1*yk#ua+qwNX$^Y#zrvHcRjKAV ze}PzaLrQNvxkaYLGt&d!&<{~w-9AEBU}p3(8w8mTjQ}mRej6uaG83gd9I|W5GBYx3 zTbFwqi6W1_O9SmYC5C;uz4^kj0>8fumQzO!c4N*e^@x63k8L40XEy|!@UI3b3lnP;CT45hD5|0BQxPoo zQ%d?=&6LibamPGe>q^QQ3R3O27Y-R;Md>M8kJxTRO@ge#l$%@vlC17RoJkMQfy|q7GdZ9hmd9DN z9v$f%tqs{4nm1&6UDVd0VSnUtnMzmanUB;S)^kRoCZi(yP+cP;Lfsja0ij>*w}M5I z;r|h-1TWa7(_+nCS02>9GHTEhN+2x?Mw5=vjkyVS%qZxCKS$+X*hhvBk9m)uI)-yj zNQ+s~^Zz0r$}7a(WTs2w4ZQ%93SFbPZww=P^v< zE!QWAJt!LimFS|G=sj65=f4JzD&#?tKZSadHj;~wgha;R2^q)s#X+40tVsAnC8&#& zm1xg^>}DEj*VCYM|d1>W)+aGL? zmv+ZWyVvHQ1jN!IsdPwi4kfDU<5j*`m2a)(QRm}Dv1(YV8eS?Q5lPXzMayrkjy@j! z;h}`HEa7y=o%Jy%se-<>cJj$q(K#qN2Z7k$A6?nEHXu5CC1>xa`IccL&{zt|$3O5` z1jMXy{1i-37!G*#6%9W|MLQ+uPDI~7x_lXS>2YU&%-R2VAHiM7V4SZ@&eu^d9SDPf z>MD>Kr0T3kKd5lUfF9Ji%}c;a1<0VHmjxR%crh3?FVT{mutAk(arQK} zwSoM`$`xdOi@uF80W41UcLq$?v^Sk67fh#91dY2Og17>`E;`9L1!8z|#>W3=3jPZP ze~fA(B{D1-Jb0FriWorAz>@<0pHof~MuPzc-u(Ymc0HkOTVY%_evV_OR^lnCV|(cw z62)0E$7`By%d-4wHiewkDKzkP&Jor-M<(d>M3O2Qvcmpobnd2s`C8aw&w} z2Tw*2VHjkmT~o+ur+vRqvTA3}VCeC)^}T=6ll1Amr}uq7{Np)Q9-x!sb*~Hd0To8( zI&F_CE1tVwkmWe5i9T=tl#(!iq>N?+<*-sfd%8-&vqL2R>D}xQ|6Nf5N+CptOG<${ z0exz1TE<2wIGNmGCf~^9cPmzA*3Qg+Q+iyiU8bcP^_Lr}E>-;~s~=`xZ)EZPb87!f zD_gR&rCQwSAN(QyeZ2l?*Vs3HzexgP$4hA}x~zKV-E z1(+si3fGU~YY>ES{USFX+`q_d9^XRt3ogz3fS&=gkik8mc^_~C0I#C#gV9{UKd5wb z4*#wI;EAdkX$=_6GGw0t;3KFRB^wCxTS_acD&|8-F9X=az+Wf_w%+D%fUgk&D@d~r z;8kWAg}F0A+^271_fG(K_R$|V@j5Ya|Cn!J7vGrKU~bv%v(G~a_!SY)==PyIr?okK z7pg@f-l$$XN`d-fW_Lzjy)9E~R%*>ot${ovtfX~{p{ek+)1TkFckrPTA0he-=iKsf zEDWj*0<3#ts*SiZJXQ}si8<AVxq$S805dL>Y>=j0Qn~ujlMz`c$zj79Htb^ev1Yni@>8t&~h#U#4|$&1c|6f;|x8ZGi0)l2+o_pPYZ$OMfM`H z1%3($k|8ul7w8KL7~ZyFBr3ilNgF1EVh%|>pr+wNQ3d=#d*Igw!RQ>$s1qIpVi5X} z@=A$`PpLMbUj&O%tybZtIZm8MZXYgs*RiIz_*{|#LnI)|arsj=TEK`>M zhpx)Q^E^3Xen)D970fo#18!~JWtyL6?*seUzE`k?)qA{#)z!}jsBU1j_-^smt>WtXDlHgaFVU#rv}omaQb20*<0qd2^I;*%=%qEjxpw6l7;`lz5dl zN9nEdcGQ{RRQmSaZZ%$zN=I;%N!cxs){SKzPuS6P{hAdWx1;0L9+C}ar83}XuMi%G r?}P)y%F`Wd`p)!ojyq{japjy54&a_U`=|EF&en4`{^UQBar6HJE`krB literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_payment.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_payment.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..554b4f6a9fa41b8da258831c63e129156718c955 GIT binary patch literal 2457 zcmcIlO>7%Q6rNrGWaBtlr*2a_afzu=Qb($tf}pKb^@q}?Ky4!aB&@2Vt!L7#yWTak z>ol=aDTjips!{DH{WRH3?6mzDNBTWu>!J{(8ok@0voKL_n9 zT1E|+>~0T0^{}fJz^>dyAwsgd(h$4DZ37}c0PBa{9k&G7-@OI)nbp5#T=wr5Eej;D zg}ehnToxPQtzBCq65Nhm?(WYI;-O`23;rFl%~oKn*)TveE*Q-)RIN~M}<85PRh z@f}7MQwYTXN7V)8nns`Sgu0Sht5!7?>{EN%!>i-QnSM7yb+g7OHgxI+sJ`G1;5mcg z#frxLMz+NeP)y5>YN|zfypj?e|%n*^@y)oe>ku3gYMKVh8`%vP7&Bb{)KD%EjC(Q9y0KUJ#2Qx91u*Qr%M z-doUqs{eB%uPXC*5G!ayir$y+%4<^6k&?EQY$j6QO7_bqoW#k;i3{tA3oV3Zgc$~$3i_!#w*=p zvfp6v|1lW}^zciU+2;b+g&o|}T_d3_9wXszMQeaZ-)^L@mzRE&djBJU5BdxBF`vV) zDf*49X+b4$ZqM>cXCr_Fb)jE;@;5a8H&SAh*UCP>yiKdk2`Z`Y&ns4Go|5#3Owr8_ z$3P85ffks8iBVBh-Ie{FK4AoPr9v}dCW9{);|?d`nR~C)dxt!(y`Qgp$bZ$qM%~E$ zcuY5-5|i<($_Ok0oyl1x%|^M8v1>KUfyG@!WBKa3e6=|?-q_!;oXNMH$-F&Uu#@j?jE*-arksgO&cx+k-*+ZvTcNP2=Mz#-Bp% zcUB~<>hqMT78`?I>|!q_d^ zm>dPN8i&pea`I!mguHaPp*+x<*7kUmYxz06D4t8F+TovO)1c!CGp~SX1q4CZK#>*i e(?p~8Uf)(YB|u2K#TOrcedQ_FKigx`^ZpMJ1AfE+ literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_reconcile_model.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/account_reconcile_model.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..382e5c79787b597f4a0a5cb3c1cb573d1a0ff77d GIT binary patch literal 25315 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

2`vKGMd$l&~| zumQ`YYt89l&eEl67U+yPJ4L5#DMrHol~a3iNW4nzd5&js)FHVdM zUKEDl29lgKaBCEJ|KV=*Z*avag{!5oH-8o{ClZCjQxg-kT#rpmVID#fKRU(5-G=F| z%G-aGfoZS{dHh&0w5@(!#Ca~Xe0b$mwyh_+?Q~?@X=&RTw(X2qbB3OoPd-S6|4CKI zQ6{~D7!Xir47a)ZbUcGg!omVsrpB}6>c9(yK!#HBVtChp9^5pv_2BRDDqX4ggJTWe zKsWnB%Iju%-O!`S^8q;X-r9eAzvL{%gva^{CvWehncC>m1iN&NU7E#Bsrq#W7<`=t zUzgK<;14eQ-Y$w&*0aikv6daIrAKVJ{O|?V_d>MqY^3k3)Q6CWI4`f;ZG{tXzen(g z9C8DI+{)!T(bFh88hKA3*!sYL!ux|W<)4N-)IstlH8>d09we3Z84Rz%xNC6m6&P(O zPwYGiZiYs}!@~GAQf`Rb2Zv^+r*LzcZ+{T1LbxH&l#Dx$4^7@^g9A6+C?%eG5XQ$N zaOp`tisA*TQ!CgMldin%dISrE;_FJ8ZIG(O)1N|kRN*bT0#C5FXN1i~x6W@;$oxuLO<}=p{gwJ+hs4DP6S^=pdj=I=S@oI^CNk z@G}Isq4zJ*)z=7cPcj@ZS2>cfUe@@_g1pbl$t#JUzTh-Szp;3kkqppZZ%K-@hz zI6N^F4iAsOQ}Q4rn53^qV7ju>0?2F|ey?G3Fd@%6#wGXfg-9S*KUPo`^AyG4kTfSRmg|SvQ65qP zK$|Ep+`)K0Pc`^U2lz*1xpS^i(4Q)>?idb#;C z)2Vp?@V4AM*_Ni=D_icjNR4|~;~p`cym`9I7y6m2Y~7ZgPa8NDWJ60AHC?yaaxPfc zbDeHv1@J=xH~ZF$EX8$88TWE9U{IA}s!B0cr5F`002x|Tzj&P$*2M}?oF+6y5mEr4 zDT|M24DoUd@zS3wzgv!;%&=tS-aPr)mlw+< zdj+#stlO&X9qSf=57R6e0qqW0J&6gu_CwIGC8#Im_iB`+Vs49M-^T3Q)@>Q~9k5%o z@1T_1wL4xdPZ8l`>^m4z*_?K`m;|7tJGDC{T2i%~X?C=%g`oaFH1D%q6 z7qjoe0OF|$QtI9MJv3e(dhYBZ8o83$E7xsq`!q5pNJ*>ods`5b^Rq9m+p_HNc##Y! zwMTtkp`;DiF`famhjinJ)lOMxASVsqMIR_2JHvhqB``p524$lGuhTw&1O`~rP6;${ z+3K=4!lSYZ%AE9A110#y9QX~rtHn2BF$b$ znJ6GT&Ayd>DgZw*+%=GGv)5A172wFS_n_en(67~u*AX3Ns%?S&AkrIPi`TxFI!ggq zKsdh2q@@5r!$Il|epd(bUX=*GhJv_L+5KTF5Eeiw!Y2(jD&+cbV*H}OY1Xe0Y4{dB zN}mc%P01b&`Idn8K>~3kxUE#Yk{-7}xr@9hygG8Rg>n*T7cPWbW)S5$%&qC;9-a;9D=a%obkP^&N7L9vgQB?>_7ms=_}I}U@8)RmOY~Rj9GSysm_>X ei)cRAGp>|c(P^pSV*lM^AM$5E+#m&ShyMr7UpN>5 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/bank_rec_widget_line.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/bank_rec_widget_line.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44ad487d0d6595b42de7d0b7f7ef813b98d86827 GIT binary patch literal 22995 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 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/digest.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/digest.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57baa4605701e90d83f46029bb60dfa360f7c78d GIT binary patch literal 2756 zcma)8O>7&-6`uX0NQys>q!^Jct82Njz&IhTI))7=v0YhJTA+3fILU#qz1ZvwsU?@Y z?CesJ78Gg}2Fex!>PujuXaF4ow}ErYr8)N4<5D0XVt@b!a>|W{9U#c5Z+5j5rK&(i z+?jcA-psr=^Sy8Mk8C!Lp#0&p56ycDLf>*BE+B{H#c!c`j4;B2g&IOxXozL8A(bV8 z>qJX#C}l-JB6=TT=^?^05o?LPx#)?6&{O!LQXa#~9aKns$Hjug5*3qJ*ky@^gNfxb zK`RJs{FjD7T=!R$I@H*k7&h@TFKQtE30xwmEMQa?u~3#oMC4lRGPw0bfQ{jcN;wgZ zkHs>UzLXDHB(d@kl~Wy55pd#RvYhUqHK9BX?vAmRI)M z?yjgeomJwpH#Ea(G+Q3g>P=JA4Z~^Kp5{58ZfPHbwPt{=wyIk#0-=uW85=`K!NDYa zJk%F|1MOqfMm*f8)P{E3Vyqi&v2ZXbcg7orjF6Yww>^A72j~4!Xrt}nVeZdD=m`i< zhl;!4=Z3H$Zb+kEVrhD4u{}h>Pz4<hp?jqbrLEM4@ixat{i}tT=WA>v+Vb}J{%ZTZcH-cPv=uEA zk8YmF2w*XO%RjMq!Nn?dTFv2gw_HN~D@%@QJD$3tuM!pP0Mc)&ZryCE-iqm}Sod_b z;!u?v&x0HyOC=56wERrGZUaEYWUwW^c=bIdyjzg`e9dW58}MY}qPN~8Of>C+$YhQz zCUcOnG{=>0uY(EAf!qEuy|E9(D{iY%$TEr8t4!wGv($?2YGDkN-xuXq&rWJp;)O7d zA>Gue-XI>KE*sY<(Q!0~Nhaj5j7`I%{Awat!}d&q71+tqOgNkaV@!65Rbh(j>D1#s zVU~)#HzA#P=sHVKVmK624l9>KM2*UiozjZaASK{=RV}g|)gIKuBf9OCBEBl^(Lr;aa;W(WOA$T% zbPmY!h@M0B0QK{en`@gJyZN&_`Ln_Njc$IamtPtnA*Bi5Oq}{m57fKe*?Ya&d)MEwK+XjJWN^x6FLMeYh*sG%; zbYXeVbZmHOTTRX;bb{MRlvIE{a6zFnAcy%yC-+8NmeMrC(p^{6Tuul)=N`~GZa5E> zKXU}yha1g;h3iB0!vpk9Zt~ORt)*`6bT4;$H+N|#cj@b~e@}ID%e~xkN9rfX|C;_w zI+!{ayj2bAPOt9n)<4;)e=0t@C#g`+^9j+{XAcDozhrFNqh>t@J8mRmE ziB6iHf$a+!mee#GXiL*rTGJqLTNdwUH0}2--P#*TYNowHsOeFT4>q>wI2O@u`Z|}A zHyxV*J+0G|Acmj%(dRkwLqTk&n;}9{k#-hsRVP??p(DuR}JK!4dlGSQ*NZ5la$E; z`e{{o7@;e-3P~n&LJUKt9P<(1=ee>-)(p}Nu@XK7Ot}dxXoWMsK+!530zW3-jgImv yy$m9c*=;~IkOV;(B#>|>Ky&}^*GKcg!QUWpLV#HQx9WVfdG|TjzdT|vbmzY?Tf8&? literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/ir_model.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/ir_model.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8af2c8378eecb288ce2fc028750b327df274e6f GIT binary patch literal 1047 zcmaJCS0SO*~BOQYyGpQ~oMFX^k^PQP;Qu|O;eu!{Uie#(l zM(IZ2FfX)|67fwcVy@T7#=s;Fn36+GnWgH97U)BTAgemSqT#%QneM|OF*C>|N0}YI zD;T<}%k`McmgbpLDnWNyMtDa~;U#fMhXkuF96++Jw|{>nl4JnZ4bVTF$B9*6hV@Dl`g z*B|IpEB0=zQOmZ2w%>C7s^PE>o#tNk&Jq%r<+qGjN@%zu;7nOz5B^E(ZjZ{i~ ztHCIZvQ&(#?Fsu9rO(@zH;bs$^=pi~EiT5ya{`3MC^s9R%{-6NBH?-ThTE&RAM^wd>C8 z3QI_}4}m(xmzIXKB~a6Y`{6=+DdcC!#$dD1Q%|`mIEUa<-|TAFmQzDJ(!6=|zUF#72r7bR&AYVV?rrHT9)llC<-F`H+hSJdLP>;MVxe|B0WzxA3&UEV7RxPX6--M*DOpM2@j))FAk+iFqh|E#_t+Qn%KeiD(R{!9X zG-t~WcSVqH5Oqz*jx|Casd$!a8Xo7&HfrEyRku7{3L0@9AxBBr1F#Q&1@HhrL}k=K zAI~-MePszK;X11-6#a&`pw`=Qy?-D1FM8e8+>EuO_vG1KkK-DDt!&IgJ(L;f;`3ZL z1taDnu^pEzLUCwT^HpY7eU-CCUlSg6e8r?$)mL)kKITAT)}oLdGd8w%w2?166_(en zPs@6pFPZuIno-tyWu7}r%y30MOgkKobNR|-ZalyO>f3RdO}mt*tV+5|B&pq$s6fyT z`EdO5CMTX5^h0jBc9fnH%r%_K@^t-jG*>xNHHEogu|SHLROF^C$IvY?or}d~0YwSG z^EK2)X!M$L5Bb_)wFgSKj)w+ah8h1I>nYAE=v`)K8d#`le%uYI@r zXmx*dVs~_6XY`#t`JX&#E5r}sDLMTK;Vm=nzw&~QJPiWA<_X}Y%eo*z7iW_^Bk2js z7QB*wE{Y6-^7}gj0%;2(6@I2{Qp)T&Za+)*Cl=GP8S` z**1D9eWk5vV=uQ+1X{hXwR=wIIm}J#`bQ!1G$_Qg0Its+42*1!?hK5#ddCkkL#@;h zKM(F?@k}=9rwFn23M0htAp|WCnvvFM{>zM&qfZKl>ME@ZdkH CKI9qz literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/res_company.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/models/__pycache__/res_company.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aedf37f16efadba5a98a069b3830f00ddcefb50e GIT binary patch literal 9470 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', start_time.date() - relativedelta(months=3)), + ('company_id', 'in', configured_company.ids), + ] + st_lines = self.search(domain, limit=limit, order="cron_last_check ASC NULLS FIRST, id") + if batch_size and len(st_lines) > batch_size: + remaining_line_id = st_lines[batch_size].id + st_lines = st_lines[:batch_size] + return st_lines, remaining_line_id + + start_time = fields.Datetime.now() + + configured_company = children_company = self.env['account.reconcile.model'].search_fetch([ + ('auto_reconcile', '=', True), + ('rule_type', 'in', ('writeoff_suggestion', 'invoice_matching')), + ], ['company_id']).company_id + if not configured_company: + return + while children_company := children_company.child_ids: + configured_company += children_company + + st_lines, remaining_line_id = (self, None) if self else _compute_st_lines_to_reconcile(configured_company) + + if not st_lines: + return + + + self.env.cr.execute("SELECT 1 FROM account_bank_statement_line WHERE id in %s FOR UPDATE", [tuple(st_lines.ids)]) + + nb_auto_reconciled_lines = 0 + for index, st_line in enumerate(st_lines): + if limit_time and fields.Datetime.now().timestamp() - start_time.timestamp() > limit_time: + remaining_line_id = st_line.id + st_lines = st_lines[:index] + break + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_trigger_matching_rules() + if wizard.state == 'valid' and wizard.matching_rules_allow_auto_reconcile: + try: + wizard._action_validate() + if st_line.is_reconciled: + st_line.move_id.message_post(body=_( + "This bank transaction has been automatically validated using the reconciliation model '%s'.", + ', '.join(st_line.move_id.line_ids.reconcile_model_id.mapped('name')), + )) + nb_auto_reconciled_lines += 1 + except UserError as e: + _logger.info("Failed to auto reconcile statement line %s due to user error: %s", + st_line.id, + str(e) + ) + continue + + st_lines.write({'cron_last_check': start_time}) + + # If the next statement line has never been auto reconciled yet, force the trigger. + if remaining_line_id: + remaining_st_line = self.env['account.bank.statement.line'].browse(remaining_line_id) + if nb_auto_reconciled_lines or not remaining_st_line.cron_last_check: + self.env.ref('odex30_account_accountant.auto_reconcile_bank_statement_line')._trigger() + + def _retrieve_partner(self): + self.ensure_one() + + # Retrieve the partner from the statement line. + if self.partner_id: + return self.partner_id + + # Retrieve the partner from the bank account. + if self.account_number: + account_number_nums = sanitize_account_number(self.account_number) + if account_number_nums: + domain = [('sanitized_acc_number', 'ilike', account_number_nums)] + for extra_domain in ([('company_id', 'parent_of', self.company_id.id)], [('company_id', '=', False)]): + bank_accounts = self.env['res.partner.bank'].search(extra_domain + domain) + if len(bank_accounts.partner_id) == 1: + return bank_accounts.partner_id + else: + # We have several partner with same account, possibly some archived partner + # so try to filter out inactive partner and if one remains, select this one + bank_accounts = bank_accounts.filtered(lambda bacc: bacc.partner_id.active) + if len(bank_accounts) == 1: + return bank_accounts.partner_id + + # Retrieve the partner from the partner name. + if self.partner_name: + # using 'complete_name' instead of 'name', + # as 'complete_name' is the first search criteria in _rec_names_search, + # and trigram indexed accordingly. + domains = product( + [ + ('complete_name', '=ilike', self.partner_name), + ('complete_name', 'ilike', self.partner_name), + ], + [ + ('company_id', 'parent_of', self.company_id.id), + ('company_id', '=', False), + ], + ) + for domain in domains: + partner = self.env['res.partner'].search(list(domain) + [('parent_id', '=', False)], limit=2) + if len(partner) == 1: + return partner + # Retrieve the partner from the 'reconcile models'. + rec_models = self.env['account.reconcile.model'].search([ + *self.env['account.reconcile.model']._check_company_domain(self.company_id), + ('rule_type', '!=', 'writeoff_button'), + ]) + for rec_model in rec_models: + partner = rec_model._get_partner_from_mapping(self) + if partner and rec_model._is_applicable_for(self, partner): + return partner + + return self.env['res.partner'] + + def _get_st_line_strings_for_matching(self, allowed_fields=None): + + self.ensure_one() + + st_line_text_values = [] + if not allowed_fields or 'payment_ref' in allowed_fields: + if self.payment_ref: + st_line_text_values.append(self.payment_ref) + if not allowed_fields or 'narration' in allowed_fields: + value = html2plaintext(self.narration or "") + if value: + st_line_text_values.append(value) + if not allowed_fields or 'ref' in allowed_fields: + if self.ref: + st_line_text_values.append(self.ref) + return st_line_text_values diff --git a/dev_odex30_accounting/odex30_account_accountant/models/account_chart_template.py b/dev_odex30_accounting/odex30_account_accountant/models/account_chart_template.py new file mode 100644 index 0000000..166ba8f --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/account_chart_template.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +from odoo.addons.account.models.chart_template import template +from odoo import models + +class AccountChartTemplate(models.AbstractModel): + _inherit = 'account.chart.template' + + def _get_account_accountant_res_company(self, chart_template): + company = self.env.company + data = self._get_chart_template_data(chart_template) + company_data = data['res.company'].get(company.id, {}) + + # Pre-reload to ensure the necessary xmlids for the load exist in case they were deleted or not created yet. + required_data = {k: v for k, v in data.items() if k in ['account.journal', 'account.account']} + self._pre_reload_data(company, data['template_data'], required_data) + + return { + company.id: { + 'deferred_expense_journal_id': company.deferred_expense_journal_id.id or company_data.get('deferred_expense_journal_id'), + 'deferred_revenue_journal_id': company.deferred_revenue_journal_id.id or company_data.get('deferred_revenue_journal_id'), + 'deferred_expense_account_id': company.deferred_expense_account_id.id or company_data.get('deferred_expense_account_id'), + 'deferred_revenue_account_id': company.deferred_revenue_account_id.id or company_data.get('deferred_revenue_account_id'), + } + } + + def _get_chart_template_data(self, chart_template): + + data = super()._get_chart_template_data(chart_template) + + for _company_id, company_data in data['res.company'].items(): + company_data['deferred_expense_journal_id'] = ( + company_data.get('deferred_expense_journal_id') + or next((xid for xid, d in data['account.journal'].items() if d['type'] == 'general'), None) + ) + + company_data['deferred_revenue_journal_id'] = ( + company_data.get('deferred_revenue_journal_id') + or next((xid for xid, d in data['account.journal'].items() if d['type'] == 'general'), None) + ) + + company_data['deferred_expense_account_id'] = ( + company_data.get('deferred_expense_account_id') + or next((xid for xid, d in data['account.account'].items() if d['account_type'] == 'asset_current'), None) + ) + + company_data['deferred_revenue_account_id'] = ( + company_data.get('deferred_revenue_account_id') + or next((xid for xid, d in data['account.account'].items() if d['account_type'] == 'liability_current'), None) + ) + + return data diff --git a/dev_odex30_accounting/odex30_account_accountant/models/account_fiscal_year.py b/dev_odex30_accounting/odex30_account_accountant/models/account_fiscal_year.py new file mode 100644 index 0000000..01555d4 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/account_fiscal_year.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +from odoo.exceptions import ValidationError +from odoo import api, fields, models, _ + + +from datetime import datetime + + +class AccountFiscalYear(models.Model): + _name = 'account.fiscal.year' + _description = 'Fiscal Year' + + name = fields.Char(string='Name', required=True) + date_from = fields.Date(string='Start Date', required=True, + help='Start Date, included in the fiscal year.') + date_to = fields.Date(string='End Date', required=True, + help='Ending Date, included in the fiscal year.') + company_id = fields.Many2one('res.company', string='Company', required=True, + default=lambda self: self.env.company) + + @api.constrains('date_from', 'date_to', 'company_id') + def _check_dates(self): + + for fy in self: + # Starting date must be prior to the ending date + date_from = fy.date_from + date_to = fy.date_to + if date_to < date_from: + raise ValidationError(_('The ending date must not be prior to the starting date.')) + if fy.company_id.parent_id: + raise ValidationError(_('You cannot have a fiscal year on a child company.')) + + domain = [ + ('id', '!=', fy.id), + ('company_id', '=', fy.company_id.id), + '|', '|', + '&', ('date_from', '<=', fy.date_from), ('date_to', '>=', fy.date_from), + '&', ('date_from', '<=', fy.date_to), ('date_to', '>=', fy.date_to), + '&', ('date_from', '<=', fy.date_from), ('date_to', '>=', fy.date_to), + ] + + if self.search_count(domain) > 0: + raise ValidationError(_('You can not have an overlap between two fiscal years, please correct the start and/or end dates of your fiscal years.')) diff --git a/dev_odex30_accounting/odex30_account_accountant/models/account_journal_dashboard.py b/dev_odex30_accounting/odex30_account_accountant/models/account_journal_dashboard.py new file mode 100644 index 0000000..85f14c9 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/account_journal_dashboard.py @@ -0,0 +1,62 @@ +from odoo import models + + +class account_journal(models.Model): + _inherit = "account.journal" + + def action_open_reconcile(self): + self.ensure_one() + + if self.type in ('bank', 'cash', 'credit'): + return self.env['account.bank.statement.line']._action_open_bank_reconciliation_widget( + default_context={ + 'default_journal_id': self.id, + 'search_default_journal_id': self.id, + 'search_default_not_matched': True, + }, + ) + else: + # Open reconciliation view for customers/suppliers + return self.env['ir.actions.act_window']._for_xml_id('odex30_account_accountant.action_move_line_posted_unreconciled') + + def action_open_to_check(self): + self.ensure_one() + return self.env['account.bank.statement.line']._action_open_bank_reconciliation_widget( + default_context={ + 'search_default_to_check': True, + 'search_default_journal_id': self.id, + 'default_journal_id': self.id, + }, + ) + + def action_open_bank_transactions(self): + self.ensure_one() + return self.env['account.bank.statement.line']._action_open_bank_reconciliation_widget( + default_context={ + 'search_default_journal_id': self.id, + 'default_journal_id': self.id + }, + kanban_first=False, + ) + + def action_open_reconcile_statement(self): + return self.env['account.bank.statement.line']._action_open_bank_reconciliation_widget( + default_context={ + 'search_default_statement_id': self.env.context.get('statement_id'), + }, + ) + + def open_action(self): + # EXTENDS account + # set default action for liquidity journals in dashboard + + if self.type in ('bank', 'cash', 'credit') and not self._context.get('action_name'): + self.ensure_one() + return self.env['account.bank.statement.line']._action_open_bank_reconciliation_widget( + extra_domain=[('line_ids.account_id', '=', self.default_account_id.id)], + default_context={ + 'default_journal_id': self.id, + 'search_default_journal_id': self.id, + }, + ) + return super().open_action() diff --git a/dev_odex30_accounting/odex30_account_accountant/models/account_move.py b/dev_odex30_accounting/odex30_account_accountant/models/account_move.py new file mode 100644 index 0000000..7f549b8 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/account_move.py @@ -0,0 +1,836 @@ +import calendar +from contextlib import contextmanager +from itertools import chain +from dateutil.relativedelta import relativedelta +import logging +import re + +from odoo import fields, models, api, _, Command +from odoo.exceptions import UserError +from odoo.osv import expression +from odoo.tools import SQL, float_compare + + +_logger = logging.getLogger(__name__) + + +DEFERRED_DATE_MIN = '1900-01-01' +DEFERRED_DATE_MAX = '9999-12-31' + + +class AccountMove(models.Model): + _inherit = "account.move" + + # Technical field to keep the value of payment_state when switching from invoicing to accounting + # (using invoicing_switch_threshold setting field). It allows keeping the former payment state, so that + # we can restore it if the user misconfigured the switch date and wants to change it. + payment_state_before_switch = fields.Char(string="Payment State Before Switch", copy=False) + + # Deferred management fields + deferred_move_ids = fields.Many2many( + string="Deferred Entries", + comodel_name='account.move', + relation='account_move_deferred_rel', + column1='original_move_id', + column2='deferred_move_id', + help="The deferred entries created by this invoice", + copy=False, + ) + deferred_original_move_ids = fields.Many2many( + string="Original Invoices", + comodel_name='account.move', + relation='account_move_deferred_rel', + column1='deferred_move_id', + column2='original_move_id', + help="The original invoices that created the deferred entries", + copy=False, + ) + deferred_entry_type = fields.Selection( + string="Deferred Entry Type", + selection=[ + ('expense', 'Deferred Expense'), + ('revenue', 'Deferred Revenue'), + ], + compute='_compute_deferred_entry_type', + copy=False, + ) + + signing_user = fields.Many2one( + string='Signer', + comodel_name='res.users', + compute='_compute_signing_user', store=True, + copy=False, + ) + show_signature_area = fields.Boolean(compute='_compute_signature') + signature = fields.Binary(compute='_compute_signature') # can't be `related`: the sign module might not be there + + @api.depends('state', 'move_type', 'invoice_user_id') + def _compute_signing_user(self): + other_moves = self.filtered(lambda move: not move.is_sale_document()) + other_moves.signing_user = False + + is_odoobot_user = self.env.user == self.env.ref('base.user_root') + is_backend_user = self.env.user.has_group('base.group_user') + + for invoice in (self - other_moves).filtered(lambda inv: inv.state == 'posted'): + # signer priority: + # - res.user set in res.settings + # - real backend user posting the invoice + # - if odoobot: the person that initiated the invoice ie: The salesman + # - if invoice initiated by a portal user -> No signature + representative = invoice.company_id.signing_user + # checking `has_group('base.group_user')` ensure we never keep a portal user to sign + if is_odoobot_user: + user_can_sign = invoice.invoice_user_id and invoice.invoice_user_id.has_group('base.group_user') + invoice.signing_user = representative or invoice.invoice_user_id if user_can_sign else False + else: + invoice.signing_user = representative or self.env.user if is_backend_user else False + + @api.depends('state') + def _compute_signature(self): + is_portal_user = self.env.user.has_group('base.group_portal') + # Checking `company_id.sign_invoice` removes the needs to check if the sign module is installed + # Setting it to True through `res.settings` auto install the sign module + moves_not_to_sign = self.filtered( + lambda inv: not inv.company_id.sign_invoice + or inv.state in {'draft', 'cancel'} + or not inv.is_sale_document() + # Allow signature for portal user only if the invoice already went through the send&print workflow + or (is_portal_user and not inv.invoice_pdf_report_id) + ) + moves_not_to_sign.show_signature_area = False + moves_not_to_sign.signature = None + + invoice_with_signature = self - moves_not_to_sign + invoice_with_signature.show_signature_area = True + for invoice in invoice_with_signature: + invoice.signature = invoice.signing_user.sudo().sign_signature + + def _post(self, soft=True): + # Deferred management + posted = super()._post(soft) + for move in self: + if move._get_deferred_entries_method() == 'on_validation' and any(move.line_ids.mapped('deferred_start_date')): + move._generate_deferred_entries() + return posted + + def action_post(self): + # EXTENDS 'account' to trigger the CRON auto-reconciling the statement lines. + res = super().action_post() + if self.statement_line_id and not self._context.get('skip_statement_line_cron_trigger'): + self.env.ref('odex30_odex30_account_accountant.auto_reconcile_bank_statement_line')._trigger() + return res + + def button_draft(self): + if any(len(deferral_move.deferred_original_move_ids) > 1 for deferral_move in self.deferred_move_ids): + raise UserError(_("You cannot reset to draft an invoice that is grouped in deferral entry. You can create a credit note instead.")) + reversed_moves = self.deferred_move_ids._unlink_or_reverse() + if reversed_moves: + for move in reversed_moves: + move.with_context(skip_readonly_check=True).write({ + 'date': move._get_accounting_date(move.date, move._affect_tax_report()), + }) + self.deferred_move_ids |= reversed_moves + return super().button_draft() + + def unlink(self): + # Prevent deferred moves under audit trail restriction from being unlinked + deferral_moves = self.filtered(lambda move: move._is_protected_by_audit_trail() and move.deferred_original_move_ids) + deferral_moves.deferred_original_move_ids.deferred_move_ids = False + deferral_moves._reverse_moves() + return super(AccountMove, self - deferral_moves).unlink() + + # ============================= START - Deferred Management ==================================== + + def _get_deferred_entries_method(self): + self.ensure_one() + if self.is_purchase_document(): + return self.company_id.generate_deferred_expense_entries_method + return self.company_id.generate_deferred_revenue_entries_method + + @api.depends('deferred_original_move_ids') + def _compute_deferred_entry_type(self): + for move in self: + if move.deferred_original_move_ids: + move.deferred_entry_type = 'expense' if move.deferred_original_move_ids[0].is_purchase_document() else 'revenue' + else: + move.deferred_entry_type = False + + @api.model + def _get_deferred_diff_dates(self, start, end): + """ + Returns the number of months between two dates [start, end[ + The computation is done by using months of 30 days so that the deferred amount for february + (28-29 days), march (31 days) and april (30 days) are all the same (in case of monthly computation). + See test_deferred_management_get_diff_dates for examples. + """ + if start > end: + start, end = end, start + nb_months = end.month - start.month + 12 * (end.year - start.year) + start_day, end_day = start.day, end.day + if start_day == calendar.monthrange(start.year, start.month)[1]: + start_day = 30 + if end_day == calendar.monthrange(end.year, end.month)[1]: + end_day = 30 + nb_days = end_day - start_day + return (nb_months * 30 + nb_days) / 30 + + @api.model + def _get_deferred_period_amount(self, method, period_start, period_end, line_start, line_end, balance): + """ + Returns the amount to defer for the given period taking into account the deferred method (day/month/full_months). + """ + if period_end <= line_start or period_end <= period_start: + return 0 # invalid period + if method == 'day': + amount_per_day = balance / (line_end - line_start).days + return (period_end - period_start).days * amount_per_day + elif method in ('month', 'full_months'): + if method == 'full_months': + reset_day_1 = relativedelta(day=1) + line_start, line_end = line_start + reset_day_1, line_end + reset_day_1 + period_start, period_end = period_start + reset_day_1, period_end + reset_day_1 + line_diff = self._get_deferred_diff_dates(line_end, line_start) + period_diff = self._get_deferred_diff_dates(period_end, period_start) + return period_diff / line_diff * balance if line_diff else balance + + @api.model + def _get_deferred_amounts_by_line(self, lines, periods, deferred_type): + """ + :return: a list of dictionaries containing the deferred amounts for each line and each period + E.g. (where period1 = (date1, date2, label1), period2 = (date2, date3, label2), ...) + [ + {'account_id': 1, period_1: 100, period_2: 200}, + {'account_id': 1, period_1: 100, period_2: 200}, + {'account_id': 2, period_1: 300, period_2: 400}, + ] + """ + values = [] + for line in lines: + line_start = fields.Date.to_date(line['deferred_start_date']) + line_end = fields.Date.to_date(line['deferred_end_date']) + if line_end < line_start: + # This normally shouldn't happen, but if it does, would cause calculation errors later on. + # To not make the reports crash, we just set both dates to the same day. + # The user should fix the dates manually. + line_end = line_start + + columns = {} + for period in periods: + if period[2] == 'not_started' and line_start <= period[0]: + # The 'Not Started' column only considers lines starting the deferral after the report end date + columns[period] = 0.0 + continue + # periods = [Total, Not Started, Before, ..., Current, ..., Later] + # The dates to calculate the amount for the current period + period_start = max(period[0], line_start) + period_end = min(period[1], line_end) + relativedelta(days=1) # +1 to include end date of report + + columns[period] = self._get_deferred_period_amount( + self.env.company.deferred_expense_amount_computation_method if deferred_type == "expense" else self.env.company.deferred_revenue_amount_computation_method, + period_start, period_end, + line_start, line_end + relativedelta(days=1), # +1 to include the end date of the line + line['balance'] + ) + + values.append({ + **self.env['account.move.line']._get_deferred_amounts_by_line_values(line), + **columns, + }) + return values + + @api.model + def _get_deferred_lines(self, line, deferred_account, deferred_type, period, ref, force_balance=None, grouping_field='account_id'): + """ + :return: a list of Command objects to create the deferred lines of a single given period + """ + deferred_amounts = self._get_deferred_amounts_by_line(line, [period], deferred_type)[0] + balance = deferred_amounts[period] if force_balance is None else force_balance + return [ + Command.create({ + **self.env['account.move.line']._get_deferred_lines_values(account.id, coeff * balance, ref, line.analytic_distribution, line), + 'partner_id': line.partner_id.id, + 'product_id': line.product_id.id, + }) + for (account, coeff) in [(deferred_amounts[grouping_field], 1), (deferred_account, -1)] + ] + + def _generate_deferred_entries(self): + """ + Generates the deferred entries for the invoice. + """ + self.ensure_one() + if self.state != 'posted': + return + if self.is_entry(): + raise UserError(_("You cannot generate deferred entries for a miscellaneous journal entry.")) + deferred_type = "expense" if self.is_purchase_document(include_receipts=True) else "revenue" + deferred_account = self.company_id.deferred_expense_account_id if deferred_type == "expense" else self.company_id.deferred_revenue_account_id + deferred_journal = self.company_id.deferred_expense_journal_id if deferred_type == "expense" else self.company_id.deferred_revenue_journal_id + if not deferred_journal: + raise UserError(_("Please set the deferred journal in the accounting settings.")) + if not deferred_account: + raise UserError(_("Please set the deferred accounts in the accounting settings.")) + + moves_vals_to_create = [] + lines_vals_to_create = [] + lines_periods = [] + for line in self.line_ids.filtered(lambda l: l.deferred_start_date and l.deferred_end_date): + periods = line._get_deferred_periods() + if not periods: + continue + + start_date = line.deferred_start_date + end_date = line.deferred_end_date + accounting_date = line.date + + # When using the 'full_months' computation method, every consumed month counts as a full month. + # We therefore need to subtract one month from the end date for the following check on dates. + if line.company_id.deferred_expense_amount_computation_method == 'full_months': + # We need to add one day to the end date since it's excluded by _get_deferred_diff_dates(). + if self._get_deferred_diff_dates(start_date.replace(day=1), end_date + relativedelta(days=1)) < 2: + end_date += relativedelta(months=-1) + + # When all move line dates (start, end, accounting) are within the same month, we skip the line. + # It would otherwise lead to the creation of both a reversal and a deferral move that would cancel each other out. + if start_date.replace(day=1) == end_date.replace(day=1) == accounting_date.replace(day=1): + continue + + ref = _("Deferral of %s", line.move_id.name or '') + + moves_vals_to_create.append({ + 'move_type': 'entry', + 'deferred_original_move_ids': [Command.set(line.move_id.ids)], + 'journal_id': deferred_journal.id, + 'company_id': self.company_id.id, + 'partner_id': line.partner_id.id, + 'auto_post': 'at_date', + 'ref': ref, + 'name': False, + 'date': line.move_id.date, + }) + lines_vals_to_create.append([ + self.env['account.move.line']._get_deferred_lines_values(account.id, coeff * line.balance, ref, line.analytic_distribution, line) + for (account, coeff) in [(line.account_id, -1), (deferred_account, 1)] + ]) + lines_periods.append((line, periods)) + # create the deferred moves + moves_fully_deferred = self.create(moves_vals_to_create) + # We write the lines after creation, to make sure the `deferred_original_move_ids` is set. + # This way we can avoid adding taxes for deferred moves. + for move_fully_deferred, lines_vals in zip(moves_fully_deferred, lines_vals_to_create): + for line_vals in lines_vals: + # This will link the moves to the lines. Instead of move.write('line_ids': lines_ids) + line_vals['move_id'] = move_fully_deferred.id + self.env['account.move.line'].create(list(chain(*lines_vals_to_create))) + + deferral_moves_vals = [] + deferral_moves_line_vals = [] + # Create the deferred entries for the periods [deferred_start_date, deferred_end_date] + for (line, periods), move_vals in zip(lines_periods, moves_vals_to_create): + remaining_balance = line.balance + for period_index, period in enumerate(periods): + # For the last deferral move the balance is forced to remaining balance to avoid rounding errors + force_balance = remaining_balance if period_index == len(periods) - 1 else None + deferred_amounts = self._get_deferred_amounts_by_line(line, [period], deferred_type)[0] + balance = deferred_amounts[period] if force_balance is None else force_balance + remaining_balance -= line.currency_id.round(balance) + deferral_moves_vals.append({**move_vals, 'date': period[1]}) + deferral_moves_line_vals.append([ + { + **self.env['account.move.line']._get_deferred_lines_values(account.id, coeff * balance, move_vals['ref'], line.analytic_distribution, line), + 'partner_id': line.partner_id.id, + 'product_id': line.product_id.id, + } + for (account, coeff) in [(deferred_amounts['account_id'], 1), (deferred_account, -1)] + ]) + + deferral_moves = self.create(deferral_moves_vals) + for deferral_move, lines_vals in zip(deferral_moves, deferral_moves_line_vals): + for line_vals in lines_vals: + # This will link the moves to the lines. Instead of move.write('line_ids': lines_ids) + line_vals['move_id'] = deferral_move.id + self.env['account.move.line'].create(list(chain(*deferral_moves_line_vals))) + + # Avoid having deferral moves with a total amount of 0. + to_unlink = deferral_moves.filtered(lambda move: move.currency_id.is_zero(move.amount_total)) + to_unlink.unlink() + + (moves_fully_deferred + deferral_moves - to_unlink)._post(soft=True) + + def open_deferred_entries(self): + self.ensure_one() + return { + 'type': 'ir.actions.act_window', + 'name': _("Deferred Entries"), + 'res_model': 'account.move.line', + 'domain': [('id', 'in', self.deferred_move_ids.line_ids.ids)], + 'views': [(self.env.ref('odex30_account_accountant.view_deferred_entries_tree').id, 'list')], + 'context': { + 'search_default_group_by_move': True, + 'expand': True, + } + } + + def open_deferred_original_entry(self): + self.ensure_one() + action = { + 'type': 'ir.actions.act_window', + 'name': _("Original Deferred Entries"), + 'res_model': 'account.move.line', + 'domain': [('id', 'in', self.deferred_original_move_ids.line_ids.ids)], + 'views': [(False, 'list'), (False, 'form')], + 'context': { + 'search_default_group_by_move': True, + 'expand': True, + } + } + if len(self.deferred_original_move_ids) == 1: + action.update({ + 'res_model': 'account.move', + 'res_id': self.deferred_original_move_ids[0].id, + 'views': [(False, 'form')], + }) + return action + + # ============================= END - Deferred management ====================================== + + def action_open_bank_reconciliation_widget(self): + return self.statement_line_id._action_open_bank_reconciliation_widget( + default_context={ + 'search_default_journal_id': self.statement_line_id.journal_id.id, + 'search_default_statement_line_id': self.statement_line_id.id, + 'default_st_line_id': self.statement_line_id.id, + } + ) + + def action_open_bank_reconciliation_widget_statement(self): + return self.statement_line_id._action_open_bank_reconciliation_widget( + extra_domain=[('statement_id', 'in', self.statement_id.ids)], + ) + + def action_open_business_doc(self): + if self.statement_line_id: + return self.action_open_bank_reconciliation_widget() + else: + action = super().action_open_business_doc() + # prevent propagation of the following keys + action['context'] = action.get('context', {}) | { + 'preferred_aml_value': None, + 'preferred_aml_currency_id': None, + } + return action + + def _get_mail_thread_data_attachments(self): + res = super()._get_mail_thread_data_attachments() + res += self.statement_line_id.statement_id.attachment_ids + return res + + @contextmanager + def _get_edi_creation(self): + with super()._get_edi_creation() as move: + previous_lines = move.invoice_line_ids + yield move.with_context(disable_onchange_name_predictive=True) + for line in move.invoice_line_ids - previous_lines: + line._onchange_name_predictive() + + +class AccountMoveLine(models.Model): + _name = "account.move.line" + _inherit = "account.move.line" + + move_attachment_ids = fields.One2many('ir.attachment', compute='_compute_attachment') + + # Deferred management fields + deferred_start_date = fields.Date( + string="Start Date", + compute='_compute_deferred_start_date', store=True, readonly=False, + index='btree_not_null', + copy=False, + help="Date at which the deferred expense/revenue starts" + ) + deferred_end_date = fields.Date( + string="End Date", + index='btree_not_null', + copy=False, + help="Date at which the deferred expense/revenue ends" + ) + has_deferred_moves = fields.Boolean(compute='_compute_has_deferred_moves') + has_abnormal_deferred_dates = fields.Boolean(compute='_compute_has_abnormal_deferred_dates') + + def _order_to_sql(self, order, query, alias=None, reverse=False): + sql_order = super()._order_to_sql(order, query, alias, reverse) + preferred_aml_residual_value = self._context.get('preferred_aml_value') + preferred_aml_currency_id = self._context.get('preferred_aml_currency_id') + if preferred_aml_residual_value and preferred_aml_currency_id and order == self._order: + currency = self.env['res.currency'].browse(preferred_aml_currency_id) + # using round since currency.round(55.55) = 55.550000000000004 + preferred_aml_residual_value = round(preferred_aml_residual_value, currency.decimal_places) + sql_residual_currency = self._field_to_sql(alias or self._table, 'amount_residual_currency', query) + sql_currency = self._field_to_sql(alias or self._table, 'currency_id', query) + return SQL( + "ROUND(%(residual_currency)s, %(decimal_places)s) = %(value)s " + "AND %(currency)s = %(currency_id)s DESC, %(order)s", + residual_currency=sql_residual_currency, + decimal_places=currency.decimal_places, + value=preferred_aml_residual_value, + currency=sql_currency, + currency_id=currency.id, + order=sql_order, + ) + return sql_order + + def copy_data(self, default=None): + data_list = super().copy_data(default=default) + for line, values in zip(self, data_list): + if 'move_reverse_cancel' in self._context: + values['deferred_start_date'] = line.deferred_start_date + values['deferred_end_date'] = line.deferred_end_date + return data_list + + def write(self, vals): + """ Prevent changing the account of a move line when there are already deferral entries. + """ + if 'account_id' in vals: + for line in self: + if ( + line.has_deferred_moves + and line.deferred_start_date + and line.deferred_end_date + and vals['account_id'] != line.account_id.id + ): + raise UserError(_( + "You cannot change the account for a deferred line in %(move_name)s if it has already been deferred.", + move_name=line.move_id.display_name + )) + return super().write(vals) + + # ============================= START - Deferred management ==================================== + def _compute_has_deferred_moves(self): + for line in self: + line.has_deferred_moves = line.move_id.deferred_move_ids + + @api.depends('deferred_start_date', 'deferred_end_date') + def _compute_has_abnormal_deferred_dates(self): + + for line in self: + line.has_abnormal_deferred_dates = ( + line.deferred_start_date + and line.deferred_end_date + and float_compare( + self.env['account.move']._get_deferred_diff_dates(line.deferred_start_date, line.deferred_end_date + relativedelta(days=1)) % 1, # end date is included + 1 / 30, + precision_digits=2 + ) == 0 + ) + + def _has_deferred_compatible_account(self): + self.ensure_one() + return ( + self.move_id.is_purchase_document(include_receipts=True) + and + self.account_id.account_type in ('expense', 'expense_depreciation', 'expense_direct_cost') + ) or ( + self.move_id.is_sale_document(include_receipts=True) + and + self.account_id.account_type in ('income', 'income_other') + ) + + @api.onchange('deferred_start_date') + def _onchange_deferred_start_date(self): + if not self._has_deferred_compatible_account(): + self.deferred_start_date = False + + @api.onchange('deferred_end_date') + def _onchange_deferred_end_date(self): + if not self._has_deferred_compatible_account(): + self.deferred_end_date = False + + @api.depends('deferred_end_date', 'move_id.invoice_date', 'move_id.state') + def _compute_deferred_start_date(self): + for line in self: + if not line.deferred_start_date and line.move_id.invoice_date and line.deferred_end_date: + line.deferred_start_date = line.move_id.invoice_date + + @api.constrains('deferred_start_date', 'deferred_end_date', 'account_id') + def _check_deferred_dates(self): + for line in self: + if line.deferred_start_date and not line.deferred_end_date: + raise UserError(_("You cannot create a deferred entry with a start date but no end date.")) + elif line.deferred_start_date and line.deferred_end_date and line.deferred_start_date > line.deferred_end_date: + raise UserError(_("You cannot create a deferred entry with a start date later than the end date.")) + + @api.model + def _get_deferred_ends_of_month(self, start_date, end_date): + + dates = [] + while start_date <= end_date: + start_date = start_date + relativedelta(day=31) # Go to end of month + dates.append(start_date) + start_date = start_date + relativedelta(days=1) # Go to first day of next month + return dates + + def _get_deferred_periods(self): + + self.ensure_one() + periods = [ + (max(self.deferred_start_date, date.replace(day=1)), min(date, self.deferred_end_date), 'current') + for date in self._get_deferred_ends_of_month(self.deferred_start_date, self.deferred_end_date) + ] + if not periods or len(periods) == 1 and periods[0][0].replace(day=1) == self.date.replace(day=1): + return [] + else: + return periods + + @api.model + def _get_deferred_amounts_by_line_values(self, line): + return { + 'account_id': line['account_id'], + # line either be a dict with ids (coming from SQL query), or a real account.move.line object + 'product_id': line['product_id'] if isinstance(line, dict) else line['product_id'].id, + 'product_category_id': line['product_category_id'] if isinstance(line, dict) else line['product_category_id'].id, + 'balance': line['balance'], + 'move_id': line['move_id'], + } + + @api.model + def _get_deferred_lines_values(self, account_id, balance, ref, analytic_distribution, line=None): + return { + 'account_id': account_id, + # line either be a dict with ids (coming from SQL query), or a real account.move.line object + 'product_id': line['product_id'] if isinstance(line, dict) else line['product_id'].id, + 'product_category_id': line['product_category_id'] if isinstance(line, dict) else line['product_category_id'].id, + 'balance': balance, + 'name': ref, + 'analytic_distribution': analytic_distribution, + } + + + def _get_computed_taxes(self): + if self.move_id.deferred_original_move_ids: + + return self.tax_ids + return super()._get_computed_taxes() + + def _compute_attachment(self): + for record in self: + record.move_attachment_ids = self.env['ir.attachment'].search(expression.OR(record._get_attachment_domains())) + + def action_reconcile(self): + + self = self.filtered(lambda x: x.balance or x.amount_currency) # noqa: PLW0642 + if not self: + return + + wizard = self.env['account.reconcile.wizard'].with_context( + active_model='account.move.line', + active_ids=self.ids, + ).new({}) + return wizard._action_open_wizard() if (wizard.is_write_off_required or wizard.force_partials) else wizard.reconcile() + + def _get_predict_postgres_dictionary(self): + lang = self._context.get('lang') and self._context.get('lang')[:2] + return {'fr': 'french'}.get(lang, 'english') + + @api.model + def _build_predictive_query(self, move_id, additional_domain=None): + move_query = self.env['account.move']._where_calc([ + ('move_type', '=', move_id.move_type), + ('state', '=', 'posted'), + ('partner_id', '=', move_id.partner_id.id), + ('company_id', '=', move_id.journal_id.company_id.id or self.env.company.id), + ]) + move_query.order = 'account_move.invoice_date' + move_query.limit = int(self.env["ir.config_parameter"].sudo().get_param( + "account.bill.predict.history.limit", + '100', + )) + return self.env['account.move.line']._where_calc([ + ('move_id', 'in', move_query), + ('display_type', '=', 'product'), + ] + (additional_domain or [])) + + def _predicted_field(self, name, partner_id, field, query=None, additional_queries=None): + + if not name or not partner_id: + return False + + psql_lang = self._get_predict_postgres_dictionary() + description = name + ' account_move_line' # give more priority to main query than additional queries + move_id = self.env.context.get('predicted_field_move', self.move_id) + parsed_description = re.sub(r"[*&()|!':<>=%/~@,.;$\[\]]+", " ", description) + parsed_description = ' | '.join(parsed_description.split()) + + try: + main_source = (query if query is not None else self._build_predictive_query(move_id)).select( + SQL("%s AS prediction", field), + SQL( + "setweight(to_tsvector(%s, account_move_line.name), 'B') || setweight(to_tsvector('simple', 'account_move_line'), 'A') AS document", + psql_lang + ), + ) + if "(" in field.code: # aggregate function + main_source = SQL("%s %s", main_source, SQL("GROUP BY account_move_line.id, account_move_line.name, account_move_line.partner_id")) + + self.env.cr.execute(SQL(""" + WITH account_move_line AS MATERIALIZED (%(account_move_line)s), + + source AS (%(source)s), + + ranking AS ( + SELECT prediction, ts_rank(source.document, query_plain) AS rank + FROM source, to_tsquery(%(lang)s, %(description)s) query_plain + WHERE source.document @@ query_plain + ) + + SELECT prediction, MAX(rank) AS ranking, COUNT(*) + FROM ranking + GROUP BY prediction + ORDER BY ranking DESC, count DESC + LIMIT 2 + """, + account_move_line=self._build_predictive_query(move_id).select(SQL('*')), + source=SQL('(%s)', SQL(') UNION ALL (').join([main_source] + (additional_queries or []))), + lang=psql_lang, + description=parsed_description, + )) + result = self.env.cr.dictfetchall() + if result: + # Only confirm the prediction if it's at least 10% better than the second one + if len(result) > 1 and result[0]['ranking'] < 1.1 * result[1]['ranking']: + return False + return result[0]['prediction'] + except Exception: + + _logger.exception('Error while predicting invoice line fields') + return False + + def _predict_taxes(self): + field = SQL('array_agg(account_move_line__tax_rel__tax_ids.id ORDER BY account_move_line__tax_rel__tax_ids.id)') + query = self._build_predictive_query(self.move_id) + query.left_join('account_move_line', 'id', 'account_move_line_account_tax_rel', 'account_move_line_id', 'tax_rel') + query.left_join('account_move_line__tax_rel', 'account_tax_id', 'account_tax', 'id', 'tax_ids') + query.add_where('account_move_line__tax_rel__tax_ids.active IS NOT FALSE') + predicted_tax_ids = self._predicted_field(self.name, self.partner_id, field, query) + if predicted_tax_ids == [None]: + return False + if predicted_tax_ids is not False and set(predicted_tax_ids) != set(self.tax_ids.ids): + return predicted_tax_ids + return False + + @api.model + def _predict_specific_tax(self, move, name, partner, amount_type, amount, type_tax_use): + field = SQL('array_agg(account_move_line__tax_rel__tax_ids.id ORDER BY account_move_line__tax_rel__tax_ids.id)') + query = self._build_predictive_query(move) + query.left_join('account_move_line', 'id', 'account_move_line_account_tax_rel', 'account_move_line_id', 'tax_rel') + query.left_join('account_move_line__tax_rel', 'account_tax_id', 'account_tax', 'id', 'tax_ids') + query.add_where(""" + account_move_line__tax_rel__tax_ids.active IS NOT FALSE + AND account_move_line__tax_rel__tax_ids.amount_type = %s + AND account_move_line__tax_rel__tax_ids.type_tax_use = %s + AND account_move_line__tax_rel__tax_ids.amount = %s + """, (amount_type, type_tax_use, amount)) + return self.with_context(predicted_field_move=move)._predicted_field(name, partner, field, query) + + def _predict_product(self): + predict_product = int(self.env['ir.config_parameter'].sudo().get_param('account_predictive_bills.predict_product', '1')) + if predict_product and self.company_id.predict_bill_product: + query = self._build_predictive_query(self.move_id, ['|', ('product_id', '=', False), ('product_id.active', '=', True)]) + predicted_product_id = self._predicted_field(self.name, self.partner_id, SQL('account_move_line.product_id'), query) + if predicted_product_id and predicted_product_id != self.product_id.id: + return predicted_product_id + return False + + def _predict_account(self): + field = SQL('account_move_line.account_id') + if self.move_id.is_purchase_document(True): + excluded_group = 'income' + else: + excluded_group = 'expense' + account_query = self.env['account.account']._where_calc([ + *self.env['account.account']._check_company_domain(self.move_id.company_id or self.env.company), + ('deprecated', '=', False), + ('internal_group', 'not in', (excluded_group, 'off')), + ('account_type', 'not in', ('liability_payable', 'asset_receivable')), + ]) + account_name = self.env['account.account']._field_to_sql('account_account', 'name') + psql_lang = self._get_predict_postgres_dictionary() + additional_queries = [SQL(account_query.select( + SQL("account_account.id AS account_id"), + SQL("setweight(to_tsvector(%(psql_lang)s, %(account_name)s), 'B') AS document", psql_lang=psql_lang, account_name=account_name), + ))] + query = self._build_predictive_query(self.move_id, [('account_id', 'in', account_query)]) + + predicted_account_id = self._predicted_field(self.name, self.partner_id, field, query, additional_queries) + if predicted_account_id and predicted_account_id != self.account_id.id: + return predicted_account_id + return False + + @api.onchange('name') + def _onchange_name_predictive(self): + if ((self.move_id.quick_edit_mode or self.move_id.move_type == 'in_invoice') and self.name and self.display_type == 'product' + and not self.env.context.get('disable_onchange_name_predictive', False)): + + if not self.product_id: + predicted_product_id = self._predict_product() + if predicted_product_id: + # We only update the price_unit, tax_ids and name in case they evaluate to False + protected_fields = ['price_unit', 'tax_ids', 'name'] + to_protect = [self._fields[fname] for fname in protected_fields if self[fname]] + with self.env.protecting(to_protect, self): + self.product_id = predicted_product_id + + # In case no product has been set, the account and taxes + # will not depend on any product and can thus be predicted + if not self.product_id: + # Predict account. + predicted_account_id = self._predict_account() + if predicted_account_id: + self.account_id = predicted_account_id + + # Predict taxes + predicted_tax_ids = self._predict_taxes() + if predicted_tax_ids: + self.tax_ids = [Command.set(predicted_tax_ids)] + + def _read_group_select(self, aggregate_spec, query): + # Enable to use HAVING clause that sum rounded values depending on the + # currency precision settings. Limitation: we only handle a having + # clause of one element with that specific method :sum_rounded. + fname, __, func = models.parse_read_group_spec(aggregate_spec) + if func != 'sum_rounded': + return super()._read_group_select(aggregate_spec, query) + currency_alias = query.make_alias(self._table, 'currency_id') + query.add_join('LEFT JOIN', currency_alias, 'res_currency', SQL( + "%s = %s", + self._field_to_sql(self._table, 'currency_id', query), + SQL.identifier(currency_alias, 'id'), + )) + + return SQL( + 'SUM(ROUND(%s, %s))', + self._field_to_sql(self._table, fname, query), + self.env['res.currency']._field_to_sql(currency_alias, 'decimal_places', query), + ) + + def _read_group_groupby(self, groupby_spec, query): + # enable grouping by :abs_rounded on fields, which is useful when trying + # to match positive and negative amounts + if ':' in groupby_spec: + fname, method = groupby_spec.split(':') + if method == 'abs_rounded': + # rounds with the used currency settings + currency_alias = query.make_alias(self._table, 'currency_id') + query.add_join('LEFT JOIN', currency_alias, 'res_currency', SQL( + "%s = %s", + self._field_to_sql(self._table, 'currency_id', query), + SQL.identifier(currency_alias, 'id'), + )) + + return SQL( + 'ROUND(ABS(%s), %s)', + self._field_to_sql(self._table, fname, query), + self.env['res.currency']._field_to_sql(currency_alias, 'decimal_places', query), + ) + + return super()._read_group_groupby(groupby_spec, query) diff --git a/dev_odex30_accounting/odex30_account_accountant/models/account_payment.py b/dev_odex30_accounting/odex30_account_accountant/models/account_payment.py new file mode 100644 index 0000000..d441aca --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/account_payment.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +import ast +from odoo import models, _ + + +class AccountPayment(models.Model): + _inherit = "account.payment" + + def action_open_manual_reconciliation_widget(self): + + self.ensure_one() + action_values = self.env['ir.actions.act_window']._for_xml_id('odex30_account_accountant.action_move_line_posted_unreconciled') + if self.partner_id: + context = ast.literal_eval(action_values['context']) + context.update({'search_default_partner_id': self.partner_id.id}) + if self.partner_type == 'customer': + context.update({'search_default_trade_receivable': 1}) + elif self.partner_type == 'supplier': + context.update({'search_default_trade_payable': 1}) + action_values['context'] = context + return action_values + + def button_open_statement_lines(self): + + self.ensure_one() + + return self.env['account.bank.statement.line']._action_open_bank_reconciliation_widget( + extra_domain=[('id', 'in', self.reconciled_statement_line_ids.ids)], + default_context={ + 'create': False, + 'default_st_line_id': self.reconciled_statement_line_ids.ids[-1], + }, + name=_("Matched Transactions") + ) diff --git a/dev_odex30_accounting/odex30_account_accountant/models/account_reconcile_model.py b/dev_odex30_accounting/odex30_account_accountant/models/account_reconcile_model.py new file mode 100644 index 0000000..7b0652d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/account_reconcile_model.py @@ -0,0 +1,485 @@ +from odoo import fields, models, Command, tools +from odoo.tools import SQL + +import re +from collections import defaultdict +from dateutil.relativedelta import relativedelta + + +class AccountReconcileModel(models.Model): + _inherit = 'account.reconcile.model' + + #################################################### + # RECONCILIATION PROCESS + #################################################### + + def _apply_lines_for_bank_widget(self, residual_amount_currency, partner, st_line): + + self.ensure_one() + currency = st_line.foreign_currency_id or st_line.journal_id.currency_id or st_line.company_currency_id + vals_list = [] + for line in self.line_ids: + vals = line._apply_in_bank_widget(residual_amount_currency, partner, st_line) + amount_currency = vals['amount_currency'] + + if currency.is_zero(amount_currency): + continue + + vals_list.append(vals) + residual_amount_currency -= amount_currency + + return vals_list + + + def _apply_rules(self, st_line, partner): + + available_models = self.filtered(lambda m: m.rule_type != 'writeoff_button').sorted() + + for rec_model in available_models: + + if not rec_model._is_applicable_for(st_line, partner): + continue + + if rec_model.rule_type == 'invoice_matching': + rules_map = rec_model._get_invoice_matching_rules_map() + for rule_index in sorted(rules_map.keys()): + for rule_method in rules_map[rule_index]: + candidate_vals = rule_method(st_line, partner) + if not candidate_vals: + continue + + if candidate_vals.get('amls'): + res = rec_model._get_invoice_matching_amls_result(st_line, partner, candidate_vals) + if res: + return { + **res, + 'model': rec_model, + } + else: + return { + **candidate_vals, + 'model': rec_model, + } + + elif rec_model.rule_type == 'writeoff_suggestion': + return { + 'model': rec_model, + 'status': 'write_off', + 'auto_reconcile': rec_model.auto_reconcile, + } + return {} + + def _is_applicable_for(self, st_line, partner): + + self.ensure_one() + + # Filter on journals, amount nature, amount and partners + # All the conditions defined in this block are non-match conditions. + if ((self.match_journal_ids and st_line.move_id.journal_id not in self.match_journal_ids) + or (self.match_nature == 'amount_received' and st_line.amount < 0) + or (self.match_nature == 'amount_paid' and st_line.amount > 0) + or (self.match_amount == 'lower' and abs(st_line.amount) >= self.match_amount_max) + or (self.match_amount == 'greater' and abs(st_line.amount) <= self.match_amount_min) + or (self.match_amount == 'between' and (abs(st_line.amount) > self.match_amount_max or abs(st_line.amount) < self.match_amount_min)) + or (self.match_partner and not partner) + or (self.match_partner and self.match_partner_ids and partner not in self.match_partner_ids) + or (self.match_partner and self.match_partner_category_ids and not (partner.category_id & self.match_partner_category_ids)) + ): + return False + + # Filter on label, note and transaction_type + for record, rule_field, record_field in [(st_line, 'label', 'payment_ref'), (st_line.move_id, 'note', 'narration'), (st_line, 'transaction_type', 'transaction_type')]: + rule_term = (self['match_' + rule_field + '_param'] or '').lower() + record_term = (record[record_field] or '').lower() + + # This defines non-match conditions + if ((self['match_' + rule_field] == 'contains' and rule_term not in record_term) + or (self['match_' + rule_field] == 'not_contains' and rule_term in record_term) + or (self['match_' + rule_field] == 'match_regex' and not re.match(rule_term, record_term)) + ): + return False + + return True + + def _get_invoice_matching_amls_domain(self, st_line, partner): + aml_domain = st_line._get_default_amls_matching_domain() + + if st_line.amount > 0.0: + aml_domain.append(('balance', '>', 0.0)) + else: + aml_domain.append(('balance', '<', 0.0)) + + currency = st_line.foreign_currency_id or st_line.currency_id + if self.match_same_currency: + aml_domain.append(('currency_id', '=', currency.id)) + + if partner: + aml_domain.append(('partner_id', '=', partner.id)) + + if self.past_months_limit: + date_limit = fields.Date.context_today(self) - relativedelta(months=self.past_months_limit) + aml_domain.append(('date', '>=', fields.Date.to_string(date_limit))) + + return aml_domain + + def _get_st_line_text_values_for_matching(self, st_line): + + self.ensure_one() + allowed_fields = [] + if self.match_text_location_label: + allowed_fields.append('payment_ref') + if self.match_text_location_note: + allowed_fields.append('narration') + if self.match_text_location_reference: + allowed_fields.append('ref') + return st_line._get_st_line_strings_for_matching(allowed_fields=allowed_fields) + + def _get_invoice_matching_st_line_tokens(self, st_line): + + st_line_text_values = self._get_st_line_text_values_for_matching(st_line) + significant_token_size = 4 + numerical_tokens = [] + exact_tokens = set() # preventing duplicates + text_tokens = [] + for text_value in st_line_text_values: + split_text = (text_value or '').split() + # Exact tokens + exact_tokens.add(text_value) + exact_tokens.update( + token for token in split_text + if len(token) >= significant_token_size + ) + # Text tokens + tokens = [ + ''.join(x for x in token if re.match(r'[0-9a-zA-Z\s]', x)) + for token in split_text + ] + + # Numerical tokens + for token in tokens: + # The token is too short to be significant. + if len(token) < significant_token_size: + continue + + text_tokens.append(token) + + formatted_token = ''.join(x for x in token if x.isdecimal()) + + # The token is too short after formatting to be significant. + if len(formatted_token) < significant_token_size: + continue + + numerical_tokens.append(formatted_token) + + return numerical_tokens, list(exact_tokens), text_tokens + + def _get_invoice_matching_amls_candidates(self, st_line, partner): + + def get_order_by_clause(prefix=SQL()): + direction = SQL(' DESC') if self.matching_order == 'new_first' else SQL(' ASC') + return SQL(", ").join( + SQL("%s%s%s", prefix, SQL(field), direction) + for field in ('date_maturity', 'date', 'id') + ) + + assert self.rule_type == 'invoice_matching' + self.env['account.move'].flush_model() + self.env['account.move.line'].flush_model() + + aml_domain = self._get_invoice_matching_amls_domain(st_line, partner) + query = self.env['account.move.line']._where_calc(aml_domain) + tables = query.from_clause + where_clause = query.where_clause or SQL("TRUE") + + aml_cte = SQL() + sub_queries: list[SQL] = [] + numerical_tokens, exact_tokens, _text_tokens = self._get_invoice_matching_st_line_tokens(st_line) + if numerical_tokens or exact_tokens: + aml_cte = SQL(''' + WITH aml_cte AS ( + SELECT + account_move_line.id as account_move_line_id, + account_move_line.date as account_move_line_date, + account_move_line.date_maturity as account_move_line_date_maturity, + account_move_line.name as account_move_line_name, + account_move_line__move_id.name as account_move_line__move_id_name, + account_move_line__move_id.ref as account_move_line__move_id_ref + FROM %s + JOIN account_move account_move_line__move_id ON account_move_line__move_id.id = account_move_line.move_id + WHERE %s + ) + ''', tables, where_clause) + if numerical_tokens: + for table_alias, field in ( + ('account_move_line', 'name'), + ('account_move_line__move_id', 'name'), + ('account_move_line__move_id', 'ref'), + ): + sub_queries.append(SQL(r''' + SELECT + account_move_line_id as id, + account_move_line_date as date, + account_move_line_date_maturity as date_maturity, + UNNEST( + REGEXP_SPLIT_TO_ARRAY( + SUBSTRING( + REGEXP_REPLACE(%(field)s, '[^0-9\s]', '', 'g'), + '\S(?:.*\S)*' + ), + '\s+' + ) + ) AS token + FROM aml_cte + WHERE %(field)s IS NOT NULL + ''', field=SQL("%s_%s", SQL(table_alias), SQL(field)))) + if exact_tokens: + for table_alias, field in ( + ('account_move_line', 'name'), + ('account_move_line__move_id', 'name'), + ('account_move_line__move_id', 'ref'), + ): + sub_queries.append(SQL(''' + SELECT + account_move_line_id as id, + account_move_line_date as date, + account_move_line_date_maturity as date_maturity, + %(field)s AS token + FROM aml_cte + WHERE %(field)s != '' + ''', field=SQL("%s_%s", SQL(table_alias), SQL(field)))) + if sub_queries: + order_by = get_order_by_clause(prefix=SQL('sub.')) + candidate_ids = [r[0] for r in self.env.execute_query(SQL( + ''' + %s + SELECT + sub.id, + COUNT(*) AS nb_match + FROM (%s) AS sub + WHERE sub.token IN %s + GROUP BY sub.date_maturity, sub.date, sub.id + HAVING COUNT(*) > 0 + ORDER BY nb_match DESC, %s + ''', + aml_cte, + SQL(" UNION ALL ").join(sub_queries), + tuple(numerical_tokens + exact_tokens), + order_by, + ))] + if candidate_ids: + return { + 'allow_auto_reconcile': True, + 'amls': self.env['account.move.line'].browse(candidate_ids), + } + elif self.match_text_location_label or self.match_text_location_note or self.match_text_location_reference: + # In the case any of the Label, Note or Reference matching rule has been toggled, and the query didn't return + # any candidates, the model should not try to mount another aml instead. + return + + if not partner: + st_line_currency = st_line.foreign_currency_id or st_line.journal_id.currency_id or st_line.company_currency_id + if st_line_currency == self.company_id.currency_id: + aml_amount_field = SQL('amount_residual') + else: + aml_amount_field = SQL('amount_residual_currency') + + order_by = get_order_by_clause(prefix=SQL('account_move_line.')) + rows = self.env.execute_query(SQL( + ''' + SELECT account_move_line.id + FROM %s + WHERE + %s + AND account_move_line.currency_id = %s + AND ROUND(account_move_line.%s, %s) = ROUND(%s, %s) + ORDER BY %s + ''', + tables, + where_clause, + st_line_currency.id, + aml_amount_field, + st_line_currency.decimal_places, + -st_line.amount_residual, + st_line_currency.decimal_places, + order_by, + )) + amls = self.env['account.move.line'].browse([row[0] for row in rows]) + else: + amls = self.env['account.move.line'].search(aml_domain, order=get_order_by_clause().code) + + if amls: + return { + 'allow_auto_reconcile': False, + 'amls': amls, + } + + def _get_invoice_matching_rules_map(self): + + rules_map = defaultdict(list) + rules_map[10].append(self._get_invoice_matching_amls_candidates) + return rules_map + + def _get_partner_from_mapping(self, st_line): + + self.ensure_one() + + if self.rule_type not in ('invoice_matching', 'writeoff_suggestion'): + return self.env['res.partner'] + + for partner_mapping in self.partner_mapping_line_ids: + match_payment_ref = True + if partner_mapping.payment_ref_regex: + match_payment_ref = re.match(partner_mapping.payment_ref_regex, st_line.payment_ref) if st_line.payment_ref else False + + match_narration = True + if partner_mapping.narration_regex: + match_narration = re.match( + partner_mapping.narration_regex, + tools.html2plaintext(st_line.narration or '').rstrip(), + flags=re.DOTALL, # Ignore '/n' set by online sync. + ) + + if match_payment_ref and match_narration: + return partner_mapping.partner_id + return self.env['res.partner'] + + def _get_invoice_matching_amls_result(self, st_line, partner, candidate_vals): + def _create_result_dict(amls_values_list, status): + if 'rejected' in status: + return + + result = {'amls': self.env['account.move.line']} + for aml_values in amls_values_list: + result['amls'] |= aml_values['aml'] + + if 'allow_write_off' in status and self.line_ids: + result['status'] = 'write_off' + + if 'allow_auto_reconcile' in status and candidate_vals['allow_auto_reconcile'] and self.auto_reconcile: + result['auto_reconcile'] = True + + return result + + st_line_currency = st_line.foreign_currency_id or st_line.currency_id + st_line_amount = st_line._prepare_move_line_default_vals()[1]['amount_currency'] + sign = 1 if st_line_amount > 0.0 else -1 + + amls = candidate_vals['amls'] + amls_values_list = [] + amls_with_epd_values_list = [] + same_currency_mode = amls.currency_id == st_line_currency + for aml in amls: + aml_values = { + 'aml': aml, + 'amount_residual': aml.amount_residual, + 'amount_residual_currency': aml.amount_residual_currency, + } + + amls_values_list.append(aml_values) + + # Manage the early payment discount. + if aml.move_id._is_eligible_for_early_payment_discount(st_line_currency, st_line.date): + + rate = abs(aml.amount_currency) / abs(aml.balance) if aml.balance else 1.0 + amls_with_epd_values_list.append({ + **aml_values, + 'amount_residual': st_line.company_currency_id.round(aml.discount_amount_currency / rate), + 'amount_residual_currency': aml.discount_amount_currency, + }) + else: + amls_with_epd_values_list.append(aml_values) + + def match_batch_amls(amls_values_list): + if not same_currency_mode: + return None, [] + + kepts_amls_values_list = [] + sum_amount_residual_currency = 0.0 + for aml_values in amls_values_list: + + if st_line_currency.compare_amounts(st_line_amount, -aml_values['amount_residual_currency']) == 0: + # Special case: the amounts are the same, submit the line directly. + return 'perfect', [aml_values] + + if st_line_currency.compare_amounts(sign * (st_line_amount + sum_amount_residual_currency), 0.0) > 0: + # Here, we still have room for other candidates ; so we add the current one to the list we keep. + # Then, we continue iterating, even if there is no room anymore, just in case one of the following candidates + # is an exact match, which would then be preferred on the current candidates. + kepts_amls_values_list.append(aml_values) + sum_amount_residual_currency += aml_values['amount_residual_currency'] + + if st_line_currency.is_zero(sign * (st_line_amount + sum_amount_residual_currency)): + return 'perfect', kepts_amls_values_list + elif kepts_amls_values_list: + return 'partial', kepts_amls_values_list + else: + return None, [] + + # Try to match a batch with the early payment feature. Only a perfect match is allowed. + match_type, kepts_amls_values_list = match_batch_amls(amls_with_epd_values_list) + if match_type != 'perfect': + kepts_amls_values_list = [] + + # Try to match the amls having the same currency as the statement line. + if not kepts_amls_values_list: + _match_type, kepts_amls_values_list = match_batch_amls(amls_values_list) + + # Try to match the whole candidates. + if not kepts_amls_values_list: + kepts_amls_values_list = amls_values_list + + # Try to match the amls having the same currency as the statement line. + if kepts_amls_values_list: + status = self._check_rule_propositions(st_line, kepts_amls_values_list) + result = _create_result_dict(kepts_amls_values_list, status) + if result: + return result + + def _check_rule_propositions(self, st_line, amls_values_list): + + self.ensure_one() + + if not self.allow_payment_tolerance: + return {'allow_write_off', 'allow_auto_reconcile'} + + st_line_currency = st_line.foreign_currency_id or st_line.currency_id + st_line_amount_curr = st_line._prepare_move_line_default_vals()[1]['amount_currency'] + amls_amount_curr = sum( + st_line._prepare_counterpart_amounts_using_st_line_rate( + aml_values['aml'].currency_id, + aml_values['amount_residual'], + aml_values['amount_residual_currency'], + )['amount_currency'] + for aml_values in amls_values_list + ) + sign = 1 if st_line_amount_curr > 0.0 else -1 + amount_curr_after_rec = st_line_currency.round( + sign * (amls_amount_curr + st_line_amount_curr) + ) + + if st_line_currency.is_zero(amount_curr_after_rec): + return {'allow_auto_reconcile'} + + + if amount_curr_after_rec > 0.0: + return {'allow_auto_reconcile'} + + if self.payment_tolerance_param == 0: + return {'rejected'} + + + if self.payment_tolerance_type == 'fixed_amount' and st_line_currency.compare_amounts(-amount_curr_after_rec, self.payment_tolerance_param) <= 0: + return {'allow_write_off', 'allow_auto_reconcile'} + + reconciled_percentage_left = (abs(amount_curr_after_rec / amls_amount_curr)) * 100.0 + if self.payment_tolerance_type == 'percentage' and st_line_currency.compare_amounts(reconciled_percentage_left, self.payment_tolerance_param) <= 0: + return {'allow_write_off', 'allow_auto_reconcile'} + + return {'rejected'} + + def run_auto_reconciliation(self): + + + cron_limit_time = tools.config['limit_time_real_cron'] or -1 + limit_time = cron_limit_time if 0 < cron_limit_time < 180 else 180 + self.env['account.bank.statement.line']._cron_try_auto_reconcile_statement_lines(limit_time=limit_time) diff --git a/dev_odex30_accounting/odex30_account_accountant/models/account_reconcile_model_line.py b/dev_odex30_accounting/odex30_account_accountant/models/account_reconcile_model_line.py new file mode 100644 index 0000000..4be6936 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/account_reconcile_model_line.py @@ -0,0 +1,117 @@ +from odoo import models, Command, _ +from odoo.exceptions import UserError + +import re + +from math import copysign + + +class AccountReconcileModelLine(models.Model): + _inherit = 'account.reconcile.model.line' + + def _prepare_aml_vals(self, partner): + """ Prepare a dictionary that will be used later to create a new journal item (account.move.line) for the + given reconcile model line. + + :param partner: The partner to be linked to the journal item. + :return: A python dictionary. + """ + self.ensure_one() + + taxes = self.tax_ids + if taxes and partner: + fiscal_position = self.env['account.fiscal.position']._get_fiscal_position(partner) + if fiscal_position: + taxes = fiscal_position.map_tax(taxes) + + values = { + 'name': self.label, + 'partner_id': partner.id, + 'analytic_distribution': self.analytic_distribution, + 'tax_ids': [Command.set(taxes.ids)], + 'reconcile_model_id': self.model_id.id, + } + if self.account_id: + values['account_id'] = self.account_id.id + return values + + def _apply_in_manual_widget(self, residual_amount_currency, partner, currency): + """ Prepare a dictionary that will be used later to create a new journal item (account.move.line) for the + given reconcile model line used by the manual reconciliation widget. + + Note: 'journal_id' is added to the returned dictionary even if it is a related readonly field. + It's a hack for the manual reconciliation widget. Indeed, a single journal entry will be created for each + journal. + + :param residual_amount_currency: The current balance expressed in the account's currency. + :param partner: The partner to be linked to the journal item. + :param currency: The currency set on the account in the manual reconciliation widget. + :return: A python dictionary. + """ + self.ensure_one() + + if self.amount_type == 'percentage': + amount_currency = currency.round(residual_amount_currency * (self.amount / 100.0)) + elif self.amount_type == 'fixed': + sign = 1 if residual_amount_currency > 0.0 else -1 + amount_currency = currency.round(self.amount * sign) + else: + raise UserError(_("This reconciliation model can't be used in the manual reconciliation widget because its " + "configuration is not adapted")) + + return { + **self._prepare_aml_vals(partner), + 'currency_id': currency.id, + 'amount_currency': amount_currency, + 'journal_id': self.journal_id.id, + } + + def _apply_in_bank_widget(self, residual_amount_currency, partner, st_line): + """ Prepare a dictionary that will be used later to create a new journal item (account.move.line) for the + given reconcile model line used by the bank reconciliation widget. + + :param residual_amount_currency: The current balance expressed in the statement line's currency. + :param partner: The partner to be linked to the journal item. + :param st_line: The statement line mounted inside the bank reconciliation widget. + :return: A python dictionary. + """ + self.ensure_one() + currency = st_line.foreign_currency_id or st_line.journal_id.currency_id or st_line.company_currency_id + + aml_values = {'currency_id': currency.id} + + if self.amount_type == 'percentage_st_line': + transaction_amount, transaction_currency, journal_amount, journal_currency, _company_amount, _company_currency \ + = st_line._get_accounting_amounts_and_currencies() + if self.model_id.rule_type == 'writeoff_button' and self.model_id.counterpart_type in ('sale', 'purchase'): + # The invoice should be created using the transaction currency. + aml_values['amount_currency'] = currency.round(-transaction_amount * self.amount / 100.0) + aml_values['percentage_st_line'] = self.amount / 100.0 + aml_values['currency_id'] = transaction_currency.id + else: + # The additional journal items follow the journal currency. + aml_values['amount_currency'] = currency.round(-journal_amount * self.amount / 100.0) + aml_values['currency_id'] = journal_currency.id + elif self.amount_type == 'regex': + match = re.search(self.amount_string, st_line.payment_ref) + if match: + sign = 1 if residual_amount_currency > 0.0 else -1 + decimal_separator = self.model_id.decimal_separator + try: + extracted_match_group = re.sub(r'[^\d' + decimal_separator + ']', '', match.group(1)) + extracted_balance = float(extracted_match_group.replace(decimal_separator, '.')) + aml_values['amount_currency'] = copysign(extracted_balance * sign, residual_amount_currency) + except ValueError: + aml_values['amount_currency'] = 0.0 + else: + aml_values['amount_currency'] = 0.0 + + if 'amount_currency' not in aml_values: + aml_values.update(self._apply_in_manual_widget(residual_amount_currency, partner, currency)) + else: + aml_values.update(self._prepare_aml_vals(partner)) + + if not aml_values.get('name', False): + aml_values['name'] = st_line.payment_ref + + return aml_values diff --git a/dev_odex30_accounting/odex30_account_accountant/models/account_tax.py b/dev_odex30_accounting/odex30_account_accountant/models/account_tax.py new file mode 100644 index 0000000..5e3dca9 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/account_tax.py @@ -0,0 +1,52 @@ +from odoo import models + + +class AccountTax(models.Model): + _inherit = "account.tax" + + def _prepare_base_line_for_taxes_computation(self, record, **kwargs): + # EXTENDS 'account' + results = super()._prepare_base_line_for_taxes_computation(record, **kwargs) + results['deferred_start_date'] = self._get_base_line_field_value_from_record(record, 'deferred_start_date', kwargs, False) + results['deferred_end_date'] = self._get_base_line_field_value_from_record(record, 'deferred_end_date', kwargs, False) + return results + + def _prepare_tax_line_for_taxes_computation(self, record, **kwargs): + # EXTENDS 'account' + results = super()._prepare_tax_line_for_taxes_computation(record, **kwargs) + results['deferred_start_date'] = self._get_base_line_field_value_from_record(record, 'deferred_start_date', kwargs, False) + results['deferred_end_date'] = self._get_base_line_field_value_from_record(record, 'deferred_end_date', kwargs, False) + return results + + def _prepare_base_line_grouping_key(self, base_line): + # EXTENDS 'account' + results = super()._prepare_base_line_grouping_key(base_line) + results['deferred_start_date'] = base_line['deferred_start_date'] + results['deferred_end_date'] = base_line['deferred_end_date'] + return results + + def _prepare_base_line_tax_repartition_grouping_key(self, base_line, base_line_grouping_key, tax_data, tax_rep_data): + # EXTENDS 'account' + results = super()._prepare_base_line_tax_repartition_grouping_key(base_line, base_line_grouping_key, tax_data, tax_rep_data) + record = base_line['record'] + if ( + isinstance(record, models.Model) + and record._name == 'account.move.line' + and record._has_deferred_compatible_account() + and base_line['deferred_start_date'] + and base_line['deferred_end_date'] + and not tax_rep_data['tax_rep'].use_in_tax_closing + ): + results['deferred_start_date'] = base_line['deferred_start_date'] + results['deferred_end_date'] = base_line['deferred_end_date'] + else: + results['deferred_start_date'] = False + results['deferred_end_date'] = False + return results + + def _prepare_tax_line_repartition_grouping_key(self, tax_line): + # EXTENDS 'account' + results = super()._prepare_tax_line_repartition_grouping_key(tax_line) + results['deferred_start_date'] = tax_line['deferred_start_date'] + results['deferred_end_date'] = tax_line['deferred_end_date'] + return results diff --git a/dev_odex30_accounting/odex30_account_accountant/models/bank_rec_widget.py b/dev_odex30_accounting/odex30_account_accountant/models/bank_rec_widget.py new file mode 100644 index 0000000..3e4fa8d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/bank_rec_widget.py @@ -0,0 +1,1785 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from collections import defaultdict +from contextlib import contextmanager +import json +import markupsafe + +from odoo import _, api, fields, models, Command +from odoo.addons.web.controllers.utils import clean_action +from odoo.exceptions import UserError, RedirectWarning +from odoo.tools.misc import formatLang + + +class BankRecWidget(models.Model): + _name = "bank.rec.widget" + _description = "Bank reconciliation widget for a single statement line" + + # This model is never saved inside the database. + # _auto=False' & _table_query = "0" prevent the ORM to create the corresponding postgresql table. + _auto = False + _table_query = "0" + + # ==== Business fields ==== + st_line_id = fields.Many2one(comodel_name='account.bank.statement.line') + move_id = fields.Many2one( + related='st_line_id.move_id', + depends=['st_line_id'], + ) + st_line_checked = fields.Boolean( + related='st_line_id.move_id.checked', + depends=['st_line_id'], + ) + st_line_is_reconciled = fields.Boolean( + related='st_line_id.is_reconciled', + depends=['st_line_id'], + ) + st_line_journal_id = fields.Many2one( + related='st_line_id.journal_id', + depends=['st_line_id'], + ) + st_line_transaction_details = fields.Html( + compute='_compute_st_line_transaction_details', + ) + transaction_currency_id = fields.Many2one( + comodel_name='res.currency', + compute='_compute_transaction_currency_id', + ) + journal_currency_id = fields.Many2one( + comodel_name='res.currency', + compute='_compute_journal_currency_id', + ) + partner_id = fields.Many2one( + comodel_name='res.partner', + string="Partner", + compute='_compute_partner_id', + store=True, + readonly=False, + ) + line_ids = fields.One2many( + comodel_name='bank.rec.widget.line', + inverse_name='wizard_id', + compute='_compute_line_ids', + compute_sudo=False, + store=True, + readonly=False, + ) + available_reco_model_ids = fields.Many2many( + comodel_name='account.reconcile.model', + compute='_compute_available_reco_model_ids', + store=True, + readonly=False, + ) + selected_reco_model_id = fields.Many2one( + comodel_name='account.reconcile.model', + compute='_compute_selected_reco_model_id', + ) + partner_name = fields.Char( + related='st_line_id.partner_name', + ) + + company_id = fields.Many2one( + comodel_name='res.company', + related='st_line_id.company_id', + depends=['st_line_id'], + ) + + country_code = fields.Char(related='company_id.country_id.code', depends=['company_id']) + + company_currency_id = fields.Many2one( + string="Wizard Company Currency", + related='company_id.currency_id', + depends=['st_line_id'], + ) + matching_rules_allow_auto_reconcile = fields.Boolean() + + # ==== Display fields ==== + state = fields.Selection( + selection=[ + ('invalid', "Invalid"), + ('valid', "Valid"), + ('reconciled', "Reconciled"), + ], + compute='_compute_state', + store=True, + help="Invalid: The bank transaction can't be validate since the suspense account is still involved\n" + "Valid: The bank transaction can be validated.\n" + "Reconciled: The bank transaction has already been processed. Nothing left to do." + ) + is_multi_currency = fields.Boolean( + compute='_compute_is_multi_currency', + ) + + # ==== JS fields ==== + selected_aml_ids = fields.Many2many( + comodel_name='account.move.line', + compute='_compute_selected_aml_ids', + ) + todo_command = fields.Json( + store=False, + ) + return_todo_command = fields.Json( + store=False, + ) + form_index = fields.Char() + + + @api.depends('st_line_id') + def _compute_line_ids(self): + for wizard in self: + if wizard.st_line_id: + + # Liquidity line. + line_ids_commands = [ + Command.clear(), + Command.create(wizard._lines_prepare_liquidity_line()), + ] + + _liquidity_lines, _suspense_lines, other_lines = wizard.st_line_id._seek_for_lines() + for aml in other_lines: + exchange_diff_amls = (aml.matched_debit_ids + aml.matched_credit_ids) \ + .exchange_move_id.line_ids.filtered(lambda l: l.account_id != aml.account_id) + if wizard.state == 'reconciled' and exchange_diff_amls: + line_ids_commands.append( + Command.create(wizard._lines_prepare_aml_line( + aml, # Create the aml line with un-squashed amounts (aml - exchange diff) + balance=aml.balance - sum(exchange_diff_amls.mapped('balance')), + amount_currency=aml.amount_currency - sum(exchange_diff_amls.mapped('amount_currency')), + )) + ) + for exchange_diff_aml in exchange_diff_amls: + line_ids_commands.append( + Command.create(wizard._lines_prepare_aml_line(exchange_diff_aml)) + ) + else: + line_ids_commands.append(Command.create(wizard._lines_prepare_aml_line(aml))) + + wizard.line_ids = line_ids_commands + + wizard._lines_add_auto_balance_line() + + else: + + wizard.line_ids = [Command.clear()] + + @api.depends('st_line_id') + def _compute_available_reco_model_ids(self): + for wizard in self: + if wizard.st_line_id: + available_reco_models = self.env['account.reconcile.model'].search([ + ('rule_type', '=', 'writeoff_button'), + ('company_id', '=', wizard.st_line_id.company_id.id), + '|', + ('match_journal_ids', '=', False), + ('match_journal_ids', '=', wizard.st_line_id.journal_id.id), + ]) + available_reco_models = available_reco_models.filtered( + lambda x: x.counterpart_type == 'general' + or len(x.line_ids.journal_id) <= 1 + ) + wizard.available_reco_model_ids = [Command.set(available_reco_models.ids)] + else: + wizard.available_reco_model_ids = [Command.clear()] + + @api.depends('line_ids.reconcile_model_id') + def _compute_selected_reco_model_id(self): + for wizard in self: + selected_reconcile_models = wizard.line_ids.reconcile_model_id.filtered(lambda x: x.rule_type == 'writeoff_button') + if len(selected_reconcile_models) == 1: + wizard.selected_reco_model_id = selected_reconcile_models.id + else: + wizard.selected_reco_model_id = None + + @api.depends('st_line_id', 'line_ids.account_id') + def _compute_state(self): + for wizard in self: + if not wizard.st_line_id: + wizard.state = 'invalid' + elif wizard.st_line_id.is_reconciled: + wizard.state = 'reconciled' + else: + suspense_account = wizard.st_line_id.journal_id.suspense_account_id + if suspense_account in wizard.line_ids.account_id: + wizard.state = 'invalid' + else: + wizard.state = 'valid' + + @api.depends('st_line_id') + def _compute_journal_currency_id(self): + for wizard in self: + wizard.journal_currency_id = wizard.st_line_id.journal_id.currency_id \ + or wizard.st_line_id.journal_id.company_id.currency_id + + def _format_transaction_details(self): + """ Format the 'transaction_details' field of the statement line to be more readable for the end user. + + Example: + { + "debtor": { + "name": None, + "private_id": None, + }, + "debtor_account": { + "iban": "BE84103080286059", + "bank_transaction_code": None, + "credit_debit_indicator": "DBIT", + "status": "BOOK", + "value_date": "2022-12-29", + "transaction_date": None, + "balance_after_transaction": None, + }, + } + + Becomes: + debtor_account: + iban: BE84103080286059 + credit_debit_indicator: DBIT + status: BOOK + value_date: 2022-12-29 + + :return: An html representation of the transaction details. + """ + self.ensure_one() + details = self.st_line_id.transaction_details + if not details: + return + + if isinstance(details, str): + details = json.loads(details, strict=False) + + def node_to_html(header, node): + if not node: + return "" + + if isinstance(node, dict): + li_elements = markupsafe.Markup("").join(node_to_html(f"{k}: ", v) for k, v in node.items()) + value = li_elements and markupsafe.Markup('

    %s
') % li_elements + elif isinstance(node, (tuple, list)): + li_elements = markupsafe.Markup("").join(node_to_html(f"{i}: ", v) for i, v in enumerate(node, start=1)) + value = li_elements and markupsafe.Markup('
    %s
') % li_elements + else: + value = node + + if not value: + return "" + + return markupsafe.Markup('
  • %(header)s%(value)s
  • ') % { + 'header': header, + 'value': value, + } + + main_html = node_to_html('', details) + return markupsafe.Markup("
      %s
    ") % main_html + + @api.depends('st_line_id') + def _compute_st_line_transaction_details(self): + for wizard in self: + wizard.st_line_transaction_details = wizard._format_transaction_details() + + @api.depends('st_line_id') + def _compute_transaction_currency_id(self): + for wizard in self: + wizard.transaction_currency_id = wizard.st_line_id.foreign_currency_id or wizard.journal_currency_id + + @api.depends('st_line_id') + def _compute_partner_id(self): + for wizard in self: + if wizard.st_line_id: + wizard.partner_id = wizard.st_line_id._retrieve_partner() + else: + wizard.partner_id = None + + @api.depends('company_id') + def _compute_is_multi_currency(self): + self.is_multi_currency = self.env.user.has_groups('base.group_multi_currency') + + @api.depends('company_id', 'line_ids.source_aml_id') + def _compute_selected_aml_ids(self): + for wizard in self: + wizard.selected_aml_ids = [Command.set(wizard.line_ids.source_aml_id.ids)] + + # ------------------------------------------------------------------------- + # ONCHANGE METHODS + # ------------------------------------------------------------------------- + + @api.onchange('todo_command') + def _onchange_todo_command(self): + self.ensure_one() + todo_command = self.todo_command + self.todo_command = None + self.return_todo_command = None + + # Ensure the lines are well loaded. + # Suppose the initial values of 'line_ids' are 2 lines, + # "self.line_ids = [Command.create(...)]" will produce a single new line in 'line_ids' but three lines in case + # the field is accessed before. + self._ensure_loaded_lines() + + method_name = todo_command['method_name'] + getattr(self, f'_js_action_{method_name}')(*todo_command.get('args', []), **todo_command.get('kwargs', {})) + + # ------------------------------------------------------------------------- + # LOW-LEVEL METHODS + # ------------------------------------------------------------------------- + + @api.model + def new(self, values=None, origin=None, ref=None): + widget = super().new(values=values, origin=origin, ref=ref) + + # Ensure the lines are well loaded. + # Suppose the initial values of 'line_ids' are 2 lines, + # "self.line_ids = [Command.create(...)]" will produce a single new line in 'line_ids' but three lines in case + # the field is accessed before. + widget.line_ids + + return widget + + # ------------------------------------------------------------------------- + # INIT + # ------------------------------------------------------------------------- + + @api.model + def fetch_initial_data(self): + # Fields. + fields = self.fields_get() + field_attributes = self.env['ir.ui.view']._get_view_field_attributes() + for field_name, field in self._fields.items(): + if field.type == 'one2many': + fields[field_name]['relatedFields'] = self[field_name]\ + .fields_get(attributes=field_attributes) + del fields[field_name]['relatedFields'][field.inverse_name] + for one2many_fieldname, one2many_field in self[field_name]._fields.items(): + if one2many_field.type == "many2many": + comodel = self.env[one2many_field.comodel_name] + fields[field_name]['relatedFields'][one2many_fieldname]['relatedFields'] = comodel \ + .fields_get(allfields=['id', 'display_name'], attributes=field_attributes) + elif field.name == 'available_reco_model_ids': + fields[field_name]['relatedFields'] = self[field_name]\ + .fields_get(allfields=['id', 'display_name'], attributes=field_attributes) + + fields['todo_command']['onChange'] = True + + # Initial values. + initial_values = {} + for field_name, field in self._fields.items(): + if field.type == 'one2many': + initial_values[field_name] = [] + else: + initial_values[field_name] = field.convert_to_read(self[field_name], self, {}) + + return { + 'initial_values': initial_values, + 'fields': fields, + } + + # ------------------------------------------------------------------------- + # LINES METHODS + # ------------------------------------------------------------------------- + + def _ensure_loaded_lines(self): + # Ensure the lines are well loaded. + # Suppose the initial values of 'line_ids' are 2 lines, + # "self.line_ids = [Command.create(...)]" will produce a single new line in 'line_ids' but three lines in case + # the field is accessed before. + self.line_ids + + def _lines_turn_auto_balance_into_manual_line(self, line): + # When editing an auto_balance line, it becomes a custom manual line. + if line.flag == 'auto_balance': + line.flag = 'manual' + + def _lines_get_line_in_edit_form(self): + self.ensure_one() + + if not self.form_index: + return + + return self.line_ids.filtered(lambda x: x.index == self.form_index) + + def _lines_prepare_aml_line(self, aml, **kwargs): + self.ensure_one() + return { + 'flag': 'aml', + 'source_aml_id': aml.id, + **kwargs, + } + + def _lines_prepare_liquidity_line(self): + """ Create a line corresponding to the journal item having the liquidity account on the statement line.""" + self.ensure_one() + st_line = self.st_line_id + + # In case of a different currencies on the journal and on the transaction, we need to retrieve the transaction + # amount on the suspense line because a journal item can only have one foreign currency. Indeed, in such + # configuration, the foreign currency amount expressed in journal's currency is set on the liquidity line but + # the transaction amount is on the suspense account line. + liquidity_line, _suspense_lines, _other_lines = st_line._seek_for_lines() + + return self._lines_prepare_aml_line(liquidity_line, flag='liquidity') + + def _lines_prepare_auto_balance_line(self): + """ Create the auto_balance line if necessary in order to have fully balanced lines.""" + self.ensure_one() + st_line = self.st_line_id + + # Compute the current open balance. + transaction_amount, transaction_currency, journal_amount, _journal_currency, company_amount, _company_currency \ + = self.st_line_id._get_accounting_amounts_and_currencies() + open_amount_currency = -transaction_amount + open_balance = -company_amount + for line in self.line_ids: + if line.flag in ('liquidity', 'auto_balance'): + continue + + open_balance -= line.balance + journal_transaction_rate = abs(transaction_amount / journal_amount) if journal_amount else 0.0 + company_transaction_rate = abs(transaction_amount / company_amount) if company_amount else 0.0 + if line.currency_id == self.transaction_currency_id: + open_amount_currency -= line.amount_currency + elif line.currency_id == self.journal_currency_id: + open_amount_currency -= transaction_currency.round(line.amount_currency * journal_transaction_rate) + else: + open_amount_currency -= transaction_currency.round(line.balance * company_transaction_rate) + + # Create a new auto-balance line. + account = None + partner = self.partner_id + if partner: + name = _("Open balance of %(amount)s", amount=formatLang(self.env, transaction_amount, currency_obj=transaction_currency)) + partner_is_customer = partner.customer_rank and not partner.supplier_rank + partner_is_supplier = partner.supplier_rank and not partner.customer_rank + if partner_is_customer: + account = partner.with_company(st_line.company_id).property_account_receivable_id + elif partner_is_supplier: + account = partner.with_company(st_line.company_id).property_account_payable_id + elif st_line.amount > 0: + account = partner.with_company(st_line.company_id).property_account_receivable_id + else: + account = partner.with_company(st_line.company_id).property_account_payable_id + + if not account: + name = st_line.payment_ref + account = st_line.journal_id.suspense_account_id + + return { + 'flag': 'auto_balance', + + 'account_id': account.id, + 'name': name, + 'amount_currency': open_amount_currency, + 'balance': open_balance, + } + + def _lines_add_auto_balance_line(self): + ''' Add the line auto balancing the debit/credit. ''' + + # Drop the existing line then re-create it to ensure this line is always the last one. + line_ids_commands = [] + for auto_balance_line in self.line_ids.filtered(lambda x: x.flag == 'auto_balance'): + line_ids_commands.append(Command.unlink(auto_balance_line.id)) + + # Re-create a new auto-balance line if needed. + auto_balance_line_vals = self._lines_prepare_auto_balance_line() + if not self.company_currency_id.is_zero(auto_balance_line_vals['balance']): + line_ids_commands.append(Command.create(auto_balance_line_vals)) + self.line_ids = line_ids_commands + + def _lines_prepare_new_aml_line(self, aml, **kwargs): + return self._lines_prepare_aml_line( + aml, + flag='new_aml', + currency_id=aml.currency_id.id, + amount_currency=-aml.amount_residual_currency, + balance=-aml.amount_residual, + source_amount_currency=-aml.amount_residual_currency, + source_balance=-aml.amount_residual, + source_rate=(aml.amount_currency / aml.balance) if aml.balance else 0.0, + **kwargs, + ) + + def _lines_check_partial_amount(self, line): + if line.flag != 'new_aml': + return None + + exchange_diff_line = self.line_ids\ + .filtered(lambda x: x.flag == 'exchange_diff' and x.source_aml_id == line.source_aml_id) + auto_balance_line_vals = self._lines_prepare_auto_balance_line() + + auto_balance = auto_balance_line_vals['balance'] + current_balance = line.balance + exchange_diff_line.balance + has_enough_comp_debit = self.company_currency_id.compare_amounts(auto_balance, 0) < 0 \ + and self.company_currency_id.compare_amounts(current_balance, 0) > 0 \ + and self.company_currency_id.compare_amounts(current_balance, -auto_balance) > 0 + has_enough_comp_credit = self.company_currency_id.compare_amounts(auto_balance, 0) > 0 \ + and self.company_currency_id.compare_amounts(current_balance, 0) < 0 \ + and self.company_currency_id.compare_amounts(-current_balance, auto_balance) > 0 + + auto_amount_currency = auto_balance_line_vals['amount_currency'] + current_amount_currency = line.amount_currency + has_enough_curr_debit = line.currency_id.compare_amounts(auto_amount_currency, 0) < 0 \ + and line.currency_id.compare_amounts(current_amount_currency, 0) > 0 \ + and line.currency_id.compare_amounts(current_amount_currency, -auto_amount_currency) > 0 + has_enough_curr_credit = line.currency_id.compare_amounts(auto_amount_currency, 0) > 0 \ + and line.currency_id.compare_amounts(current_amount_currency, 0) < 0 \ + and line.currency_id.compare_amounts(-current_amount_currency, auto_amount_currency) > 0 + + if line.currency_id == self.transaction_currency_id: + if has_enough_curr_debit or has_enough_curr_credit: + amount_currency_after_partial = current_amount_currency + auto_amount_currency + + # Get the bank transaction rate. + transaction_amount, _transaction_currency, _journal_amount, _journal_currency, company_amount, _company_currency \ + = self.st_line_id._get_accounting_amounts_and_currencies() + rate = abs(company_amount / transaction_amount) if transaction_amount else 0.0 + + # Compute the amounts to make a partial. + balance_after_partial = line.company_currency_id.round(amount_currency_after_partial * rate) + new_line_balance = line.company_currency_id.round(balance_after_partial * abs(line.balance) / abs(current_balance)) + exchange_diff_line_balance = balance_after_partial - new_line_balance + return { + 'exchange_diff_line': exchange_diff_line, + 'amount_currency': amount_currency_after_partial, + 'balance': new_line_balance, + 'exchange_balance': exchange_diff_line_balance, + } + elif has_enough_comp_debit or has_enough_comp_credit: + # Compute the new value for balance. + balance_after_partial = current_balance + auto_balance + + # Get the rate of the original journal item. + rate = line.source_rate + + # Compute the amounts to make a partial. + new_line_balance = line.company_currency_id.round(balance_after_partial * abs(line.balance) / abs(current_balance)) + exchange_diff_line_balance = balance_after_partial - new_line_balance + amount_currency_after_partial = line.currency_id.round(new_line_balance * rate) + return { + 'exchange_diff_line': exchange_diff_line, + 'amount_currency': amount_currency_after_partial, + 'balance': new_line_balance, + 'exchange_balance': exchange_diff_line_balance, + } + return None + + def _do_amounts_apply_for_early_payment(self, open_amount_currency, total_early_payment_discount): + return self.transaction_currency_id.compare_amounts(open_amount_currency, total_early_payment_discount) == 0 + + def _lines_check_apply_early_payment_discount(self): + """ Try to apply the early payment discount on the currently mounted journal items. + :return: True if applied, False otherwise. + """ + all_aml_lines = self.line_ids.filtered(lambda x: x.flag == 'new_aml') + + # Get the balance without the 'new_aml' lines. + auto_balance_line_vals = self._lines_prepare_auto_balance_line() + open_balance_wo_amls = auto_balance_line_vals['balance'] + sum(all_aml_lines.mapped('balance')) + open_amount_currency_wo_amls = auto_balance_line_vals['amount_currency'] + sum(all_aml_lines.mapped('amount_currency')) + + # Get the balance after adding the 'new_aml' lines but without considering the partial amounts. + open_balance = open_balance_wo_amls - sum(all_aml_lines.mapped('source_balance')) + open_amount_currency = open_amount_currency_wo_amls - sum(all_aml_lines.mapped('source_amount_currency')) + + is_same_currency = all_aml_lines.currency_id == self.transaction_currency_id + at_least_one_aml_for_early_payment = False + + early_pay_aml_values_list = [] + total_early_payment_discount = 0.0 + + for aml_line in all_aml_lines: + aml = aml_line.source_aml_id + + if aml.move_id._is_eligible_for_early_payment_discount(self.transaction_currency_id, self.st_line_id.date): + at_least_one_aml_for_early_payment = True + total_early_payment_discount += aml.amount_currency - aml.discount_amount_currency + + early_pay_aml_values_list.append({ + 'aml': aml, + 'amount_currency': aml_line.amount_currency, + 'balance': aml_line.balance, + }) + + line_ids_create_command_list = [] + is_early_payment_applied = False + + # Cleanup the existing early payment discount lines. + for line in self.line_ids.filtered(lambda x: x.flag == 'early_payment'): + line_ids_create_command_list.append(Command.unlink(line.id)) + + if is_same_currency \ + and at_least_one_aml_for_early_payment \ + and self._do_amounts_apply_for_early_payment(open_amount_currency, total_early_payment_discount): + # == Compute the early payment discount lines == + # Remove the partials on existing lines. + for aml_line in all_aml_lines: + aml_line.amount_currency = aml_line.source_amount_currency + aml_line.balance = aml_line.source_balance + + # Add the early payment lines. + early_payment_values = self.env['account.move']._get_invoice_counterpart_amls_for_early_payment_discount( + early_pay_aml_values_list, + open_balance, + ) + + for vals_list in early_payment_values.values(): + for vals in vals_list: + line_ids_create_command_list.append(Command.create({ + 'flag': 'early_payment', + 'account_id': vals['account_id'], + 'date': self.st_line_id.date, + 'name': vals['name'], + 'partner_id': vals['partner_id'], + 'currency_id': vals['currency_id'], + 'amount_currency': vals['amount_currency'], + 'balance': vals['balance'], + 'analytic_distribution': vals.get('analytic_distribution'), + 'tax_ids': vals.get('tax_ids', []), + 'tax_tag_ids': vals.get('tax_tag_ids', []), + 'tax_repartition_line_id': vals.get('tax_repartition_line_id'), + 'group_tax_id': vals.get('group_tax_id'), + })) + is_early_payment_applied = True + + if line_ids_create_command_list: + self.line_ids = line_ids_create_command_list + + return is_early_payment_applied + + def _lines_check_apply_partial_matching(self): + """ Try to apply a partial matching on the currently mounted journal items. + :return: True if applied, False otherwise. + """ + all_aml_lines = self.line_ids.filtered(lambda x: x.flag == 'new_aml') + if all_aml_lines: + last_line = all_aml_lines[-1] + + # Cleanup the existing partials if not on the last line. + line_ids_commands = [] + lines_impacted = self.env['bank.rec.widget.line'] + for aml_line in all_aml_lines: + is_partial = aml_line.display_stroked_amount_currency or aml_line.display_stroked_balance + if is_partial and not aml_line.manually_modified: + line_ids_commands.append(Command.update(aml_line.id, { + 'amount_currency': aml_line.source_amount_currency, + 'balance': aml_line.source_balance, + })) + lines_impacted |= aml_line + if line_ids_commands: + self.line_ids = line_ids_commands + self._lines_recompute_exchange_diff(lines_impacted) + + # Check for a partial reconciliation. + partial_amounts = self._lines_check_partial_amount(last_line) + + if partial_amounts: + # Make a partial: an auto-balance line is no longer necessary. + last_line.amount_currency = partial_amounts['amount_currency'] + last_line.balance = partial_amounts['balance'] + exchange_line = partial_amounts['exchange_diff_line'] + if exchange_line: + exchange_line.balance = partial_amounts['exchange_balance'] + if exchange_line.currency_id == self.company_currency_id: + exchange_line.amount_currency = exchange_line.balance + return True + + return False + + def _lines_load_new_amls(self, amls, reco_model=None): + """ Create counterpart lines for the journal items passed as parameter.""" + # Create a new line for each aml. + line_ids_commands = [] + kwargs = {'reconcile_model_id': reco_model.id} if reco_model else {} + for aml in amls: + aml_line_vals = self._lines_prepare_new_aml_line(aml, **kwargs) + line_ids_commands.append(Command.create(aml_line_vals)) + + if not line_ids_commands: + return + + self.line_ids = line_ids_commands + + def _prepare_base_line_for_taxes_computation(self, line): + """ Convert the current dictionary in order to use the generic taxes computation method defined on account.tax. + :return: A python dictionary. + """ + self.ensure_one() + tax_type = line.tax_ids[0].type_tax_use if line.tax_ids else None + is_refund = (tax_type == 'sale' and line.balance > 0.0) or (tax_type == 'purchase' and line.balance < 0.0) + + if line.force_price_included_taxes and line.tax_ids: + special_mode = 'total_included' + base_amount = line.tax_base_amount_currency + else: + special_mode = 'total_excluded' + base_amount = line.amount_currency + + return self.env['account.tax']._prepare_base_line_for_taxes_computation( + line, + price_unit=base_amount, + quantity=1.0, + is_refund=is_refund, + special_mode=special_mode, + ) + + def _prepare_tax_line_for_taxes_computation(self, line): + """ Convert the current dictionary in order to use the generic taxes computation method defined on account.tax. + :return: A python dictionary. + """ + self.ensure_one() + return self.env['account.tax']._prepare_tax_line_for_taxes_computation(line) + + def _lines_prepare_tax_line(self, tax_line_vals): + self.ensure_one() + + tax_rep = self.env['account.tax.repartition.line'].browse(tax_line_vals['tax_repartition_line_id']) + name = tax_rep.tax_id.name + if self.st_line_id.payment_ref: + name = f'{name} - {self.st_line_id.payment_ref}' + currency = self.env['res.currency'].browse(tax_line_vals['currency_id']) + amount_currency = tax_line_vals['amount_currency'] + balance = self.st_line_id._prepare_counterpart_amounts_using_st_line_rate(currency, None, amount_currency)['balance'] + + return { + 'flag': 'tax_line', + + 'account_id': tax_line_vals['account_id'], + 'date': self.st_line_id.date, + 'name': name, + 'partner_id': tax_line_vals['partner_id'], + 'currency_id': currency.id, + 'amount_currency': amount_currency, + 'balance': balance, + + 'analytic_distribution': tax_line_vals['analytic_distribution'], + 'tax_repartition_line_id': tax_rep.id, + 'tax_ids': tax_line_vals['tax_ids'], + 'tax_tag_ids': tax_line_vals['tax_tag_ids'], + 'group_tax_id': tax_line_vals['group_tax_id'], + } + + def _lines_recompute_taxes(self): + self.ensure_one() + AccountTax = self.env['account.tax'] + base_amls = self.line_ids.filtered(lambda x: x.flag == 'manual' and not x.tax_repartition_line_id) + base_lines = [self._prepare_base_line_for_taxes_computation(x) for x in base_amls] + tax_amls = self.line_ids.filtered(lambda x: x.flag == 'tax_line') + tax_lines = [self._prepare_tax_line_for_taxes_computation(x) for x in tax_amls] + AccountTax._add_tax_details_in_base_lines(base_lines, self.company_id) + AccountTax._round_base_lines_tax_details(base_lines, self.company_id) + AccountTax._add_accounting_data_in_base_lines_tax_details(base_lines, self.company_id, include_caba_tags=True) + tax_results = AccountTax._prepare_tax_lines(base_lines, self.company_id, tax_lines=tax_lines) + + line_ids_commands = [] + + # Update the base lines. + for base_line, to_update in tax_results['base_lines_to_update']: + line = base_line['record'] + amount_currency = to_update['amount_currency'] + balance = self.st_line_id\ + ._prepare_counterpart_amounts_using_st_line_rate(line.currency_id, None, amount_currency)['balance'] + + line_ids_commands.append(Command.update(line.id, { + 'balance': balance, + 'amount_currency': amount_currency, + 'tax_tag_ids': to_update['tax_tag_ids'], + })) + + # Tax lines that are no longer needed. + for tax_line_vals in tax_results['tax_lines_to_delete']: + line_ids_commands.append(Command.unlink(tax_line_vals['record'].id)) + + # Newly created tax lines. + for tax_line_vals in tax_results['tax_lines_to_add']: + line_ids_commands.append(Command.create(self._lines_prepare_tax_line(tax_line_vals))) + + # Update of existing tax lines. + for tax_line_vals, grouping_key, to_update in tax_results['tax_lines_to_update']: + new_line_vals = self._lines_prepare_tax_line({**grouping_key, **to_update}) + line_ids_commands.append(Command.update(tax_line_vals['record'].id, { + 'amount_currency': new_line_vals['amount_currency'], + 'balance': new_line_vals['balance'], + })) + + self.line_ids = line_ids_commands + + def _get_key_mapping_aml_and_exchange_diff(self, line): + if line.source_aml_id: + return 'source_aml_id', line.source_aml_id.id + return None, None + + def _reorder_exchange_and_aml_lines(self): + # Reorder to put each exchange line right after the corresponding new_aml. + new_lines_ids = [] + exchange_lines = self.line_ids.filtered(lambda x: x.flag == 'exchange_diff') + source_2_exchange_mapping = defaultdict(lambda: self.env['bank.rec.widget.line']) + for line in exchange_lines: + source_2_exchange_mapping[self._get_key_mapping_aml_and_exchange_diff(line)] |= line + for line in self.line_ids: + if line in exchange_lines: + continue + + new_lines_ids.append(line.id) + line_key = self._get_key_mapping_aml_and_exchange_diff(line) + if line_key in source_2_exchange_mapping: + new_lines_ids += source_2_exchange_mapping[line_key].mapped('id') + self.line_ids = self.env['bank.rec.widget.line'].browse(new_lines_ids) + + def _remove_related_exchange_diff_lines(self, lines): + """ Delete the exchange_diff_lines related to the lines given in parameter. + If the parameter (lines) is not set, then all exchange_diff_lines will be removed + """ + exch_diff_command_unlink = [] + for line in lines: + if line.flag == 'exchange_diff': + continue + + line_source_key, line_source_id = self._get_key_mapping_aml_and_exchange_diff(line) + if not line_source_key: + continue + exch_diff_command_unlink += [ + Command.unlink(exch_diff.id) + for exch_diff in self.line_ids.filtered(lambda x: x[line_source_key] and x[line_source_key].id == line_source_id) + ] + + if exch_diff_command_unlink: + self.line_ids = exch_diff_command_unlink + + def _lines_get_account_balance_exchange_diff(self, currency, balance, amount_currency): + # Compute the balance of the line using the rate/currency coming from the bank transaction. + amounts_in_st_curr = self.st_line_id._prepare_counterpart_amounts_using_st_line_rate( + currency, + balance, + amount_currency, + ) + origin_balance = amounts_in_st_curr['balance'] + if currency == self.company_currency_id and self.transaction_currency_id != self.company_currency_id: + # The reconciliation will be expressed using the rate of the statement line. + origin_balance = balance + elif currency != self.company_currency_id and self.transaction_currency_id == self.company_currency_id: + # The reconciliation will be expressed using the foreign currency of the aml to cover the Mexican + # case. + origin_balance = currency\ + ._convert(amount_currency, self.transaction_currency_id, self.company_id, self.st_line_id.date) + + # Compute the exchange difference balance. + exchange_diff_balance = origin_balance - balance + if self.company_currency_id.is_zero(exchange_diff_balance): + return self.env['account.account'], 0.0 + + expense_exchange_account = self.company_id.expense_currency_exchange_account_id + income_exchange_account = self.company_id.income_currency_exchange_account_id + + if exchange_diff_balance > 0.0: + account = expense_exchange_account + else: + account = income_exchange_account + return account, exchange_diff_balance + + def _lines_get_exchange_diff_values(self, line): + if line.flag != 'new_aml': + return [] + account, exchange_diff_balance = self._lines_get_account_balance_exchange_diff(line.currency_id, line.balance, line.amount_currency) + if line.currency_id.is_zero(exchange_diff_balance): + return [] + return [{ + 'flag': 'exchange_diff', + 'source_aml_id': line.source_aml_id.id, + 'account_id': account.id, + 'date': line.date, + 'name': _("Exchange Difference: %s", line.name), + 'partner_id': line.partner_id.id, + 'currency_id': line.currency_id.id, + 'amount_currency': exchange_diff_balance if line.currency_id == self.company_currency_id else 0.0, + 'balance': exchange_diff_balance, + 'source_amount_currency': line.amount_currency, + 'source_balance': exchange_diff_balance, + }] + + def _lines_recompute_exchange_diff(self, lines): + """ Recompute the exchange_diffs for the given lines, creating some if necessary. + If lines are not given, the method will be applied on all new_amls + """ + self.ensure_one() + # If the method is called after deleting lines we should delete the related exchange diffs + deleted_lines = lines - self.line_ids + self._remove_related_exchange_diff_lines(deleted_lines) + lines = lines - deleted_lines + + exchange_diffs_aml = self.line_ids.filtered(lambda x: x.flag == 'exchange_diff').grouped('source_aml_id') + line_ids_commands = [] + reorder_needed = False + + for line in lines: + exchange_diff_values = self._lines_get_exchange_diff_values(line) + if line.source_aml_id and line.source_aml_id in exchange_diffs_aml: + line_ids_commands += [ + Command.update(exchange_diffs_aml[line.source_aml_id].id, exch_diff_val) + for exch_diff_val in exchange_diff_values + ] + else: + line_ids_commands += [ + Command.create(exch_diff_val) + for exch_diff_val in exchange_diff_values + ] + reorder_needed = True + + if line_ids_commands: + self.line_ids = line_ids_commands + if reorder_needed: + self._reorder_exchange_and_aml_lines() + + def _lines_prepare_reco_model_write_off_vals(self, reco_model, write_off_vals): + self.ensure_one() + + balance = self.st_line_id\ + ._prepare_counterpart_amounts_using_st_line_rate(self.transaction_currency_id, None, write_off_vals['amount_currency'])['balance'] + + return { + 'flag': 'manual', + + 'account_id': write_off_vals['account_id'], + 'date': self.st_line_id.date, + 'name': write_off_vals['name'], + 'partner_id': write_off_vals['partner_id'], + 'currency_id': write_off_vals['currency_id'], + 'amount_currency': write_off_vals['amount_currency'], + 'balance': balance, + 'tax_base_amount_currency': write_off_vals['amount_currency'], + 'force_price_included_taxes': True, + + 'reconcile_model_id': reco_model.id, + 'analytic_distribution': write_off_vals['analytic_distribution'], + 'tax_ids': write_off_vals['tax_ids'], + } + + # ------------------------------------------------------------------------- + # LINES UPDATE METHODS + # ------------------------------------------------------------------------- + + def _line_value_changed_account_id(self, line): + self.ensure_one() + self._lines_turn_auto_balance_into_manual_line(line) + + # Recompute taxes. + if line.flag not in ('tax_line', 'early_payment') and line.tax_ids: + self._lines_recompute_taxes() + self._lines_add_auto_balance_line() + + def _line_value_changed_date(self, line): + self.ensure_one() + if line.flag == 'liquidity' and line.date: + self.st_line_id.date = line.date + self._action_reload_liquidity_line() + self.return_todo_command = {'reset_global_info': True, 'reset_record': True} + + def _line_value_changed_ref(self, line): + self.ensure_one() + if line.flag == 'liquidity': + self.st_line_id.move_id.ref = line.ref + self._action_reload_liquidity_line() + self.return_todo_command = {'reset_record': True} + + def _line_value_changed_narration(self, line): + self.ensure_one() + if line.flag == 'liquidity': + self.st_line_id.move_id.narration = line.narration + self._action_reload_liquidity_line() + self.return_todo_command = {'reset_record': True} + + def _line_value_changed_name(self, line): + self.ensure_one() + if line.flag == 'liquidity': + self.st_line_id.payment_ref = line.name + self._action_reload_liquidity_line() + self.return_todo_command = {'reset_global_info': True, 'reset_record': True} + return + + self._lines_turn_auto_balance_into_manual_line(line) + + def _line_value_changed_amount_transaction_currency(self, line): + self.ensure_one() + if line.flag == 'liquidity': + if line.transaction_currency_id != self.journal_currency_id: + self.st_line_id.amount_currency = line.amount_transaction_currency + self.st_line_id.foreign_currency_id = line.transaction_currency_id + else: + self.st_line_id.amount_currency = 0.0 + self.st_line_id.foreign_currency_id = None + self._action_reload_liquidity_line() + self.return_todo_command = {'reset_global_info': True, 'reset_record': True} + + def _line_value_changed_transaction_currency_id(self, line): + self._line_value_changed_amount_transaction_currency(line) + + def _line_value_changed_amount_currency(self, line): + self.ensure_one() + if line.flag == 'liquidity': + self.st_line_id.amount = line.amount_currency + self._action_reload_liquidity_line() + self.return_todo_command = {'reset_global_info': True, 'reset_record': True} + return + + self._lines_turn_auto_balance_into_manual_line(line) + + sign = -1 if line.amount_currency < 0.0 else 1 + if line.flag == 'new_aml': + # The balance must keep the same sign as the original aml and must not exceed its original value. + line.amount_currency = sign * max(0.0, min(abs(line.amount_currency), abs(line.source_amount_currency))) + line.manually_modified = True + + # If the user remove completely the value, reset to the original balance. + if not line.amount_currency: + line.amount_currency = line.source_amount_currency + + elif not line.amount_currency: + line.amount_currency = 0.0 + + if line.currency_id == line.company_currency_id: + # Single currency: amount_currency must be equal to balance. + line.balance = line.amount_currency + elif line.flag == 'new_aml': + if line.currency_id.compare_amounts(abs(line.amount_currency), abs(line.source_amount_currency)) == 0.0: + # The value has been reset to its original value. Reset the balance as well to avoid rounding issues. + line.balance = line.source_balance + else: + # Apply the rate. + if line.source_rate: + line.balance = line.company_currency_id.round(line.amount_currency / line.source_rate) + else: + line.balance = 0.0 + elif line.flag in ('manual', 'early_payment', 'tax_line'): + if line.currency_id in (self.transaction_currency_id, self.journal_currency_id): + line.balance = self.st_line_id\ + ._prepare_counterpart_amounts_using_st_line_rate(line.currency_id, None, line.amount_currency)['balance'] + else: + line.balance = line.currency_id\ + ._convert(line.amount_currency, self.company_currency_id, self.company_id, self.st_line_id.date) + + if line.flag not in ('tax_line', 'early_payment'): + if line.tax_ids: + # Manual edition of amounts. Disable the price_included mode. + line.force_price_included_taxes = False + self._lines_recompute_taxes() + self._lines_recompute_exchange_diff(line) + + self._lines_add_auto_balance_line() + + def _line_value_changed_balance(self, line): + self.ensure_one() + if line.flag == 'liquidity': + self.st_line_id.amount = line.balance + self._action_reload_liquidity_line() + self.return_todo_command = {'reset_global_info': True, 'reset_record': True} + return + + self._lines_turn_auto_balance_into_manual_line(line) + + sign = -1 if line.balance < 0.0 else 1 + if line.flag == 'new_aml': + # The balance must keep the same sign as the original aml and must not exceed its original value. + line.balance = sign * max(0.0, min(abs(line.balance), abs(line.source_balance))) + line.manually_modified = True + + # If the user remove completely the value, reset to the original balance. + if not line.balance: + line.balance = line.source_balance + + elif not line.balance: + line.balance = 0.0 + + # Single currency: amount_currency must be equal to balance. + if line.currency_id == line.company_currency_id: + line.amount_currency = line.balance + self._line_value_changed_amount_currency(line) + elif line.flag == 'exchange_diff': + self._lines_add_auto_balance_line() + else: + self._lines_recompute_exchange_diff(line) + self._lines_add_auto_balance_line() + + def _line_value_changed_currency_id(self, line): + self.ensure_one() + self._line_value_changed_amount_currency(line) + + def _line_value_changed_tax_ids(self, line): + self.ensure_one() + self._lines_turn_auto_balance_into_manual_line(line) + + if line.tax_ids: + # Adding taxes but no tax before. + if not line.tax_base_amount_currency: + line.tax_base_amount_currency = line.amount_currency + line.force_price_included_taxes = True + else: + if line.force_price_included_taxes: + # Removing taxes letting the field empty. + # If the user didn't touch the amount_currency/balance, restore the original amount. + line.amount_currency = line.tax_base_amount_currency + self._line_value_changed_amount_currency(line) + line.tax_base_amount_currency = False + + self._lines_recompute_taxes() + self._lines_add_auto_balance_line() + + def _line_value_changed_partner_id(self, line): + self.ensure_one() + if line.flag == 'liquidity': + self.st_line_id.partner_id = line.partner_id + self._action_reload_liquidity_line() + self.return_todo_command = {'reset_global_info': True, 'reset_record': True} + return + + self._lines_turn_auto_balance_into_manual_line(line) + + new_account = None + if line.partner_id: + partner_is_customer = line.partner_id.customer_rank and not line.partner_id.supplier_rank + partner_is_supplier = line.partner_id.supplier_rank and not line.partner_id.customer_rank + is_partner_receivable_amount_zero = line.partner_currency_id.is_zero(line.partner_receivable_amount) + is_partner_payable_amount_zero = line.partner_currency_id.is_zero(line.partner_payable_amount) + if partner_is_customer or not is_partner_receivable_amount_zero and is_partner_payable_amount_zero: + new_account = line.partner_receivable_account_id + elif partner_is_supplier or is_partner_receivable_amount_zero and not is_partner_payable_amount_zero: + new_account = line.partner_payable_account_id + elif self.st_line_id.amount < 0.0: + new_account = line.partner_payable_account_id or line.partner_receivable_account_id + else: + new_account = line.partner_receivable_account_id or line.partner_payable_account_id + + if new_account: + # Set the new receivable/payable account if any. + line.account_id = new_account + self._line_value_changed_account_id(line) + elif line.flag not in ('tax_line', 'early_payment') and line.tax_ids: + # Recompute taxes. + self._lines_recompute_taxes() + self._lines_add_auto_balance_line() + + def _line_value_changed_analytic_distribution(self, line): + self.ensure_one() + self._lines_turn_auto_balance_into_manual_line(line) + + if line.flag == 'liquidity': + st_line = self.st_line_id + liquidity_line, _suspense_lines, _write_off_lines = self.st_line_id._seek_for_lines() + liquidity_line.analytic_distribution = line.analytic_distribution + # We need to keep track of the statement line to avoid losing the data. + # Will be improved in master by turning _action_reload_liquidity_line into a context manager. + self.with_context(default_st_line_id=st_line.id)._action_reload_liquidity_line() + return + + # Recompute taxes. + if line.flag not in ('tax_line', 'early_payment') and any(x.analytic for x in line.tax_ids): + self._lines_recompute_taxes() + self._lines_add_auto_balance_line() + + # ------------------------------------------------------------------------- + # ACTIONS + # ------------------------------------------------------------------------- + + def _action_trigger_matching_rules(self): + self.ensure_one() + + if self.st_line_id.is_reconciled: + return + + reconcile_models = self.env['account.reconcile.model'].search([ + ('rule_type', '!=', 'writeoff_button'), + ('company_id', '=', self.company_id.id), + '|', + ('match_journal_ids', '=', False), + ('match_journal_ids', '=', self.st_line_id.journal_id.id), + ]) + matching = reconcile_models._apply_rules(self.st_line_id, self.partner_id) + + if matching.get('amls'): + reco_model = matching['model'] + # In case there is a write-off, keep the whole amount and let the write-off doing the auto-balancing. + allow_partial = matching.get('status') != 'write_off' + self._action_add_new_amls(matching['amls'], reco_model=reco_model, allow_partial=allow_partial) + if matching.get('status') == 'write_off': + reco_model = matching['model'] + self._action_select_reconcile_model(reco_model) + if matching.get('auto_reconcile'): + self.matching_rules_allow_auto_reconcile = True + return matching + + def _prepare_embedded_views_data(self): + self.ensure_one() + st_line = self.st_line_id + + context = { + 'search_view_ref': 'odex30_account_accountant.view_account_move_line_search_bank_rec_widget', + 'list_view_ref': 'odex30_account_accountant.view_account_move_line_list_bank_rec_widget', + } + + if self.partner_id: + context['search_default_partner_id'] = self.partner_id.id + + dynamic_filters = [] + + # == Dynamic Customer/Vendor filter == + journal = st_line.journal_id + + account_ids = set() + + inbound_accounts = journal._get_journal_inbound_outstanding_payment_accounts() - journal.default_account_id + outbound_accounts = journal._get_journal_outbound_outstanding_payment_accounts() - journal.default_account_id + + # Matching on debit account. + for account in inbound_accounts: + account_ids.add(account.id) + + # Matching on credit account. + for account in outbound_accounts: + account_ids.add(account.id) + + rec_pay_matching_filter = { + 'name': 'receivable_payable_matching', + 'description': _("Customer/Vendor"), + 'domain': [ + '|', + # Matching invoices. + '&', + ('account_id.account_type', 'in', ('asset_receivable', 'liability_payable')), + ('payment_id', '=', False), + # Matching Payments. + '&', + ('account_id', 'in', tuple(account_ids)), + ('payment_id', '!=', False), + ], + 'no_separator': True, + 'is_default': False, + } + + misc_matching_filter = { + 'name': 'misc_matching', + 'description': _("Misc"), + 'domain': ['!'] + rec_pay_matching_filter['domain'], + 'is_default': False, + } + + dynamic_filters.append(rec_pay_matching_filter) + dynamic_filters.append(misc_matching_filter) + + # Stringify the domain. + for dynamic_filter in dynamic_filters: + dynamic_filter['domain'] = str(dynamic_filter['domain']) + + return { + 'amls': { + 'domain': st_line._get_default_amls_matching_domain(), + 'dynamic_filters': dynamic_filters, + 'context': context, + }, + } + + def _action_mount_st_line(self, st_line): + self.ensure_one() + self.st_line_id = st_line + self.form_index = self.line_ids[0].index if self.state == 'reconciled' else None + self._action_trigger_matching_rules() + + def _js_action_mount_st_line(self, st_line_id): + self.ensure_one() + st_line = self.env['account.bank.statement.line'].browse(st_line_id) + self._action_mount_st_line(st_line) + self.return_todo_command = self._prepare_embedded_views_data() + + def _js_action_restore_st_line_data(self, initial_data): + self.ensure_one() + initial_values = initial_data['initial_values'] + + self.st_line_id = self.env['account.bank.statement.line'].browse(initial_values['st_line_id']) + return_todo_command = initial_values['return_todo_command'] + + # Skip restore and trigger matching rules if the liquidity line was modified + liquidity_line = self.line_ids.filtered(lambda l: l.flag == 'liquidity') + initial_liquidity_line_values = next((cmd[2] for cmd in initial_values['line_ids'] if cmd[2]['flag'] == 'liquidity'), {}) + initial_liquidity_line = self.env['bank.rec.widget.line'].new(initial_liquidity_line_values) + for field in initial_liquidity_line_values.keys() - ['index', 'suggestion_html']: + if initial_liquidity_line[field] != liquidity_line[field]: + self._js_action_mount_st_line(self.st_line_id.id) + return + + # If the user goes to reco model and create a new one, we want to make it appearing when coming back. + # That's why we pop 'available_reco_model_ids' as well. + for field_name in ('id', 'st_line_id', 'todo_command', 'return_todo_command', 'available_reco_model_ids'): + initial_values.pop(field_name, None) + + st_line_domain = self.st_line_id._get_default_amls_matching_domain() + initial_values['line_ids'] = self._process_restore_lines_ids(initial_values['line_ids']) + self.update(initial_values) + + if ( + return_todo_command + and return_todo_command.get('res_model') == 'account.move' + and (created_invoice := self.env['account.move'].browse(return_todo_command['res_id'])) + and created_invoice.state == 'posted' + ): + lines = created_invoice.line_ids.filtered_domain(st_line_domain) + self._action_add_new_amls(lines) + else: + self._lines_add_auto_balance_line() + + self.return_todo_command = self._prepare_embedded_views_data() + + def _process_restore_lines_ids(self, initial_commands): + st_line_domain = self.st_line_id._get_default_amls_matching_domain() + still_available_aml_ids = self.env['account.move.line'].browse( + orm_command[2]['source_aml_id'] + for orm_command in initial_commands + if orm_command[0] == Command.CREATE and orm_command[2].get('source_aml_id') + ).filtered_domain(st_line_domain).ids + still_available_aml_ids += [None] # still available if there was no source + line_ids_commands = [Command.clear()] + for orm_command in initial_commands: + match orm_command: + case (Command.CREATE, _, values) if values.get('source_aml_id' in still_available_aml_ids): + # Discard the virtual id coming from the client + line_ids_commands.append(Command.create(values)) + case _: + line_ids_commands.append(orm_command) + return line_ids_commands + + def _action_reload_liquidity_line(self): + self.ensure_one() + self = self.with_context(default_st_line_id=self.st_line_id.id) + + self.invalidate_model() + + # Ensure the lines are well loaded. + # Suppose the initial values of 'line_ids' are 2 lines, + # "self.line_ids = [Command.create(...)]" will produce a single new line in 'line_ids' but three lines in case + # the field is accessed before. + self.line_ids + + self._action_trigger_matching_rules() + + # Focus back the liquidity line. + self._js_action_mount_line_in_edit(self.line_ids.filtered(lambda x: x.flag == 'liquidity').index) + + def _validation_lines_vals(self, line_ids_create_command_list, aml_to_exchange_diff_vals, to_reconcile): + # Check which partner to set. + lines = self.line_ids.filtered(lambda x: x.flag != 'liquidity') + partners = lines.partner_id + partner_to_set = self.env['res.partner'] + if len(partners) == 1: + # To avoid "Incompatible companies on records" error, make sure the user is linked to a main company. + allowed_companies = partners.company_id.root_id + if len(lines.company_id) == 1: + # Or the user is linked to the aml's company. + allowed_companies |= lines.company_id + # Or the user is not linked to any company. + if not partners.company_id or partners.company_id in allowed_companies: + partner_to_set = partners + + source2exchange = self.line_ids.filtered(lambda l: l.flag == 'exchange_diff').grouped('source_aml_id') + for line in self.line_ids: + if line.flag == 'exchange_diff': + continue + + amount_currency = line.amount_currency + balance = line.balance + if line.flag == 'new_aml': + to_reconcile.append((len(line_ids_create_command_list) + 1, line.source_aml_id)) + exchange_diff = source2exchange.get(line.source_aml_id) + if exchange_diff: + aml_to_exchange_diff_vals[len(line_ids_create_command_list) + 1] = { + 'amount_residual': exchange_diff.balance, + 'amount_residual_currency': exchange_diff.amount_currency, + 'analytic_distribution': exchange_diff.analytic_distribution, + } + # Squash amounts of exchange diff into corresponding new_aml + amount_currency += exchange_diff.amount_currency + balance += exchange_diff.balance + line_ids_create_command_list.append(Command.create(line._get_aml_values( + sequence=len(line_ids_create_command_list) + 1, + partner_id=partner_to_set.id if line.flag in ('liquidity', 'auto_balance') else line.partner_id.id, + amount_currency=amount_currency, + balance=balance, + ))) + + def _action_validate(self): + self.ensure_one() + # Prepare the lines to be created. + to_reconcile = [] + line_ids_create_command_list = [] + aml_to_exchange_diff_vals = {} + + self._validation_lines_vals(line_ids_create_command_list, aml_to_exchange_diff_vals, to_reconcile) + + st_line = self.st_line_id + move = st_line.move_id + + # Update the move. + move_ctx = move.with_context( + force_delete=True, + skip_readonly_check=True, + ) + move_ctx.write({'line_ids': [Command.clear()] + line_ids_create_command_list}) + + AccountMoveLine = self.env['account.move.line'] + sequence2lines = move_ctx.line_ids.grouped('sequence') + lines = [ + (sequence2lines[index], counterpart_aml) + for index, counterpart_aml in to_reconcile + ] + all_line_ids = tuple({_id for line, counterpart in lines for _id in (line + counterpart).ids}) + # Handle exchange diffs + exchange_diff_moves = None + lines_with_exch_diff = AccountMoveLine + if aml_to_exchange_diff_vals: + exchange_diff_vals_list = [] + for line, counterpart in lines: + line = line.with_prefetch(all_line_ids) + counterpart = counterpart.with_prefetch(all_line_ids) + exchange_diff_amounts = aml_to_exchange_diff_vals.get(line.sequence, {}) + exchange_analytic_distribution = exchange_diff_amounts.pop('analytic_distribution', False) + if exchange_diff_amounts: + related_exchange_diff_amls = line if exchange_diff_amounts['amount_residual'] * line.amount_residual > 0 else counterpart + exchange_diff_vals_list.append(related_exchange_diff_amls._prepare_exchange_difference_move_vals( + [exchange_diff_amounts], + exchange_date=max(line.date, counterpart.date), + exchange_analytic_distribution=exchange_analytic_distribution, + )) + lines_with_exch_diff += line + exchange_diff_moves = AccountMoveLine._create_exchange_difference_moves(exchange_diff_vals_list) + + # Perform the reconciliation. + self.env['account.move.line']\ + .with_context(no_exchange_difference_no_recursive=True)._reconcile_plan([ + (line + counterpart).with_prefetch(all_line_ids) + for line, counterpart in lines + ]) + + # Assign exchange move to partials. + for index, line in enumerate(lines_with_exch_diff): + exchange_move = exchange_diff_moves[index] + for debit_credit in ('debit', 'credit'): + partials = line[f'matched_{debit_credit}_ids'] \ + .filtered(lambda partial: partial[f'{debit_credit}_move_id'].move_id != exchange_move) + partials.exchange_move_id = exchange_move + + # Fill missing partner. + st_line_ctx = st_line.with_context(skip_account_move_synchronization=True, skip_readonly_check=True) + + # Create missing partner bank if necessary. + if st_line.account_number and st_line.partner_id: + st_line_ctx.partner_bank_id = st_line._find_or_create_bank_account() or st_line.partner_bank_id + + # Refresh analytic lines. + move.line_ids.with_context(validate_analytic=True)._inverse_analytic_distribution() + + @contextmanager + def _action_validate_method(self): + self.ensure_one() + st_line = self.st_line_id + + yield + + # The current record has been invalidated. Reload it completely. + self.st_line_id = st_line + self._ensure_loaded_lines() + self.return_todo_command = {'done': True} + + def _js_action_validate(self): + with self._action_validate_method(): + self._action_validate() + + def _action_to_check(self): + self.st_line_id.move_id.checked = False + self.invalidate_recordset(fnames=['st_line_checked']) + self._action_validate() + + def _js_action_to_check(self): + self.ensure_one() + + if self.state == 'valid': + # The validation can be performed. + with self._action_validate_method(): + self._action_to_check() + else: + # No need any validation. + self.st_line_id.move_id.checked = False + self.invalidate_recordset(fnames=['st_line_checked']) + self.return_todo_command = {'done': True} + + def _js_action_reset(self): + self.ensure_one() + st_line = self.st_line_id + + # Hashed entries shouldn't be modified; we will provide clear errors as well as redirect the user if needed. + if st_line.inalterable_hash: + if not st_line.has_reconciled_entries: + raise UserError(_("You can't hit the reset button on a secured bank transaction.")) + else: + raise RedirectWarning( + message=_("This bank transaction is locked up tighter than a squirrel in a nut factory! You can't hit the reset button on it. So, do you want to \"unreconcile\" it instead?"), + action=st_line.move_id.open_reconcile_view(), + button_text=_('View Reconciled Entries'), + ) + + st_line.action_undo_reconciliation() + + # The current record has been invalidated. Reload it completely. + self.st_line_id = st_line + self._ensure_loaded_lines() + self._action_trigger_matching_rules() + self.return_todo_command = {'done': True} + + def _js_action_set_as_checked(self): + self.ensure_one() + self.st_line_id.move_id.checked = True + self.invalidate_recordset(fnames=['st_line_checked']) + self.return_todo_command = {'done': True} + + def _action_clear_manual_operations_form(self): + self.form_index = None + + def _action_remove_lines(self, lines): + self.ensure_one() + if not lines: + return + + is_taxes_recomputation_needed = bool(lines.tax_ids) + has_new_aml = any(line.flag == 'new_aml' for line in lines) + + # Update 'line_ids'. + self.line_ids = [ + Command.unlink(line.id) + for line in lines + ] + self._remove_related_exchange_diff_lines(lines) + + # Recompute taxes and auto balance the lines. + if is_taxes_recomputation_needed: + self._lines_recompute_taxes() + if has_new_aml and not self._lines_check_apply_early_payment_discount(): + self._lines_check_apply_partial_matching() + self._lines_add_auto_balance_line() + self._action_clear_manual_operations_form() + + def _js_action_remove_line(self, line_index): + self.ensure_one() + line = self.line_ids.filtered(lambda x: x.index == line_index) + self._action_remove_lines(line) + + def _action_select_reconcile_model(self, reco_model): + self.ensure_one() + + # Cleanup a previously selected model. + self.line_ids = [ + Command.unlink(x.id) + for x in self.line_ids + if x.flag not in ('new_aml', 'liquidity') and x.reconcile_model_id and x.reconcile_model_id != reco_model + ] + self._lines_recompute_taxes() + + if reco_model.to_check: + self.st_line_id.move_id.checked = False + self.invalidate_recordset(fnames=['st_line_checked']) + + # Compute the residual balance on which apply the newly selected model. + auto_balance_line_vals = self._lines_prepare_auto_balance_line() + residual_balance = auto_balance_line_vals['amount_currency'] + + write_off_vals_list = reco_model._apply_lines_for_bank_widget(residual_balance, self.partner_id, self.st_line_id) + + if reco_model.rule_type == 'writeoff_button' and reco_model.counterpart_type in ('sale', 'purchase'): + invoice = self._create_invoice_from_write_off_values(reco_model, write_off_vals_list) + + action = { + 'type': 'ir.actions.act_window', + 'res_model': 'account.move', + 'context': {'create': False}, + 'view_mode': 'form', + 'res_id': invoice.id, + } + self.return_todo_command = clean_action(action, self.env) + else: + # Apply the newly generated lines. + self.line_ids = [ + Command.create(self._lines_prepare_reco_model_write_off_vals(reco_model, x)) + for x in write_off_vals_list + ] + + self._lines_recompute_taxes() + self._lines_add_auto_balance_line() + + def _js_action_select_reconcile_model(self, reco_model_id): + self.ensure_one() + reco_model = self.env['account.reconcile.model'].browse(reco_model_id) + self._action_select_reconcile_model(reco_model) + + def _create_invoice_from_write_off_values(self, reco_model, write_off_vals_list): + # Create a new invoice/bill and redirect the user to it. + journal = reco_model.line_ids.journal_id[:1] + + invoice_line_ids = [] + total_amount_currency = 0.0 + percentage_st_line = 0.0 + for write_off_values in write_off_vals_list: + write_off_values = dict(write_off_values) + total_amount_currency -= ( + write_off_values['amount_currency'] + if 'percentage_st_line' not in write_off_values + else 0 + ) + percentage_st_line += write_off_values.pop('percentage_st_line', 0) + write_off_values.pop('currency_id', None) + write_off_values.pop('partner_id', None) + write_off_values.pop('reconcile_model_id', None) + invoice_line_ids.append(write_off_values) + + st_line_amount = self.st_line_id.amount_currency if self.st_line_id.foreign_currency_id else self.st_line_id.amount + total_amount_currency += self.transaction_currency_id.round(st_line_amount * percentage_st_line) + + # Type of move depends on debit or credit of bank statement line and reconciliation model chosen. + if reco_model.counterpart_type == 'sale': + move_type = 'out_invoice' if total_amount_currency > 0 else 'out_refund' + else: + move_type = 'in_invoice' if total_amount_currency < 0 else 'in_refund' + + price_unit_sign = 1 if total_amount_currency < 0.0 else -1 + invoice_line_ids_commands = [] + for line_values in invoice_line_ids: + price_total = price_unit_sign * line_values.pop('amount_currency') + taxes = self.env['account.tax'].browse(line_values['tax_ids'][0][2]) + line_values['price_unit'] = self._get_invoice_price_unit_from_price_total(price_total, taxes) + invoice_line_ids_commands.append(Command.create(line_values)) + + invoice_values = { + 'invoice_date': self.st_line_id.date, + 'move_type': move_type, + 'partner_id': self.st_line_id.partner_id.id, + 'currency_id': self.transaction_currency_id.id, + 'payment_reference': self.st_line_id.payment_ref, + 'invoice_line_ids': invoice_line_ids_commands, + } + if journal: + invoice_values['journal_id'] = journal.id + + invoice = self.env['account.move'].create(invoice_values) + if not invoice.currency_id.is_zero(invoice.amount_total - total_amount_currency): + invoice._check_total_amount(abs(total_amount_currency)) + return invoice + + def _get_invoice_price_unit_from_price_total(self, price_total, taxes): + """ Determine price unit based on the total amount and taxes applied. """ + self.ensure_one() + taxes_computation = taxes._get_tax_details( + price_total, + 1.0, + precision_rounding=self.transaction_currency_id.rounding, + rounding_method=self.company_id.tax_calculation_rounding_method, + special_mode='total_included', + ) + return taxes_computation['total_excluded'] + sum(x['tax_amount'] for x in taxes_computation['taxes_data'] if x['tax'].price_include) + + def _action_add_new_amls(self, amls, reco_model=None, allow_partial=True): + self.ensure_one() + existing_amls = set(self.line_ids.filtered(lambda x: x.flag in ('new_aml', 'aml', 'liquidity')).source_aml_id) + amls = amls.filtered(lambda x: x not in existing_amls) + if not amls: + return + + self._lines_load_new_amls(amls, reco_model=reco_model) + added_lines = self.line_ids.filtered(lambda x: x.flag == 'new_aml' and x.source_aml_id in amls) + self._lines_recompute_exchange_diff(added_lines) + if not self._lines_check_apply_early_payment_discount() and allow_partial: + self._lines_check_apply_partial_matching() + self._lines_add_auto_balance_line() + self._action_clear_manual_operations_form() + + def _js_action_add_new_aml(self, aml_id): + self.ensure_one() + aml = self.env['account.move.line'].browse(aml_id) + self._action_add_new_amls(aml) + + def _action_remove_new_amls(self, amls): + self.ensure_one() + to_remove = self.line_ids.filtered(lambda x: x.flag == 'new_aml' and x.source_aml_id in amls) + self._action_remove_lines(to_remove) + + def _js_action_remove_new_aml(self, aml_id): + self.ensure_one() + aml = self.env['account.move.line'].browse(aml_id) + self._action_remove_new_amls(aml) + + def _js_action_mount_line_in_edit(self, line_index): + self.ensure_one() + self.form_index = line_index + + def _js_action_line_changed(self, form_index, field_name): + self.ensure_one() + line = self.line_ids.filtered(lambda x: x.index == form_index) + + # Invalidate the cache of newly set value to force the recomputation of computed fields. + value = line[field_name] + line.invalidate_recordset(fnames=[field_name], flush=False) + line[field_name] = value + + getattr(self, f'_line_value_changed_{field_name}')(line) + + def _js_action_line_set_partner_receivable_account(self, form_index): + self.ensure_one() + line = self.line_ids.filtered(lambda x: x.index == form_index) + line.account_id = line.partner_receivable_account_id + self._line_value_changed_account_id(line) + + def _js_action_line_set_partner_payable_account(self, form_index): + self.ensure_one() + line = self.line_ids.filtered(lambda x: x.index == form_index) + line.account_id = line.partner_payable_account_id + self._line_value_changed_account_id(line) + + def _js_action_redirect_to_move(self, form_index): + self.ensure_one() + line = self.line_ids.filtered(lambda x: x.index == form_index) + move = line.source_aml_move_id + + action = { + 'type': 'ir.actions.act_window', + 'context': {'create': False}, + 'view_mode': 'form', + } + + if move.origin_payment_id: + action.update({ + 'res_model': 'account.payment', + 'res_id': move.origin_payment_id.id, + }) + else: + action.update({ + 'res_model': 'account.move', + 'res_id': move.id, + }) + self.return_todo_command = clean_action(action, self.env) + + def _js_action_apply_line_suggestion(self, form_index): + self.ensure_one() + line = self.line_ids.filtered(lambda x: x.index == form_index) + + # Since 'balance'/'amount_currency' are both dependencies of 'suggestion_balance'/'suggestion_amount_currency', + # keep the value in variable before assigning anything to avoid an inconsistency after applying + # 'suggestion_amount_currency' but before updating 'balance'. + suggestion_amount_currency = line.suggestion_amount_currency + suggestion_balance = line.suggestion_balance + + line.amount_currency = suggestion_amount_currency + line.balance = suggestion_balance + + if line.currency_id == line.company_currency_id: + self._line_value_changed_balance(line) + else: + self._line_value_changed_amount_currency(line) + + @api.model + def collect_global_info_data(self, journal_id): + journal = self.env['account.journal'].browse(journal_id) + balance = '' + if journal.exists() and any(company in journal.company_id._accessible_branches() for company in self.env.companies): + balance = formatLang(self.env, + journal.current_statement_balance, + currency_obj=journal.currency_id or journal.company_id.sudo().currency_id) + return {'balance_amount': balance} diff --git a/dev_odex30_accounting/odex30_account_accountant/models/bank_rec_widget_line.py b/dev_odex30_accounting/odex30_account_accountant/models/bank_rec_widget_line.py new file mode 100644 index 0000000..98f2e9e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/bank_rec_widget_line.py @@ -0,0 +1,503 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from odoo import _, api, fields, models, Command +from odoo.osv import expression +from odoo.tools.misc import formatLang, frozendict + +import markupsafe +import uuid + + +class BankRecWidgetLine(models.Model): + _name = "bank.rec.widget.line" + _inherit = "analytic.mixin" + _description = "Line of the bank reconciliation widget" + + # This model is never saved inside the database. + # _auto=False' & _table_query = "0" prevent the ORM to create the corresponding postgresql table. + _auto = False + _table_query = "0" + + wizard_id = fields.Many2one(comodel_name='bank.rec.widget') + index = fields.Char(compute='_compute_index') + flag = fields.Selection( + selection=[ + ('liquidity', 'liquidity'), + ('new_aml', 'new_aml'), + ('aml', 'aml'), + ('exchange_diff', 'exchange_diff'), + ('tax_line', 'tax_line'), + ('manual', 'manual'), + ('early_payment', 'early_payment'), + ('auto_balance', 'auto_balance'), + ], + ) + + journal_default_account_id = fields.Many2one( + related='wizard_id.st_line_id.journal_id.default_account_id', + depends=['wizard_id'], + ) + account_id = fields.Many2one( + comodel_name='account.account', + compute='_compute_account_id', + store=True, + readonly=False, + check_company=True, + domain="""[ + ('deprecated', '=', False), + ('id', '!=', journal_default_account_id), + ('account_type', 'not in', ('asset_cash', 'off_balance')), + ]""", + ) + date = fields.Date( + compute='_compute_date', + store=True, + readonly=False, + ) + name = fields.Char( + compute='_compute_name', + store=True, + readonly=False, + ) + partner_id = fields.Many2one( + comodel_name='res.partner', + compute='_compute_partner_id', + store=True, + readonly=False, + ) + currency_id = fields.Many2one( + comodel_name='res.currency', + compute='_compute_currency_id', + store=True, + readonly=False, + ) + company_id = fields.Many2one(related='wizard_id.company_id') + country_code = fields.Char(related='company_id.country_id.code', depends=['company_id']) + company_currency_id = fields.Many2one(related='wizard_id.company_currency_id') + amount_currency = fields.Monetary( + currency_field='currency_id', + compute='_compute_amount_currency', + store=True, + readonly=False, + ) + balance = fields.Monetary( + currency_field='company_currency_id', + compute='_compute_balance', + store=True, + readonly=False, + ) + transaction_currency_id = fields.Many2one( + related='wizard_id.st_line_id.foreign_currency_id', + depends=['wizard_id'], + ) + amount_transaction_currency = fields.Monetary( + currency_field='transaction_currency_id', + related='wizard_id.st_line_id.amount_currency', + depends=['wizard_id'], + ) + debit = fields.Monetary( + currency_field='company_currency_id', + compute='_compute_from_balance', + ) + credit = fields.Monetary( + currency_field='company_currency_id', + compute='_compute_from_balance', + ) + force_price_included_taxes = fields.Boolean() + tax_base_amount_currency = fields.Monetary( + currency_field='currency_id', + ) + + source_aml_id = fields.Many2one(comodel_name='account.move.line') + source_aml_move_id = fields.Many2one( + comodel_name='account.move', + compute='_compute_source_aml_fields', + store=True, + readonly=False, + ) + source_aml_move_name = fields.Char( + compute='_compute_source_aml_fields', + store=True, + readonly=False, + ) + tax_repartition_line_id = fields.Many2one( + comodel_name='account.tax.repartition.line', + compute='_compute_tax_repartition_line_id', + store=True, + readonly=False, + ) + tax_ids = fields.Many2many( + comodel_name='account.tax', + compute='_compute_tax_ids', + store=True, + readonly=False, + check_company=True, + ) + tax_tag_ids = fields.Many2many( + comodel_name='account.account.tag', + compute='_compute_tax_tag_ids', + store=True, + readonly=False, + ) + group_tax_id = fields.Many2one( + comodel_name='account.tax', + compute='_compute_group_tax_id', + store=True, + readonly=False, + ) + reconcile_model_id = fields.Many2one(comodel_name='account.reconcile.model') + source_amount_currency = fields.Monetary(currency_field='currency_id') + source_balance = fields.Monetary(currency_field='company_currency_id') + source_debit = fields.Monetary( + currency_field='company_currency_id', + compute='_compute_from_source_balance', + ) + source_credit = fields.Monetary( + currency_field='company_currency_id', + compute='_compute_from_source_balance', + ) + source_rate = fields.Float() + + display_stroked_amount_currency = fields.Boolean(compute='_compute_display_stroked_amount_currency') + display_stroked_balance = fields.Boolean(compute='_compute_display_stroked_balance') + + partner_currency_id = fields.Many2one( + comodel_name='res.currency', + compute='_compute_partner_info', + ) + partner_receivable_account_id = fields.Many2one( + comodel_name='account.account', + compute='_compute_partner_info', + ) + partner_payable_account_id = fields.Many2one( + comodel_name='account.account', + compute='_compute_partner_info', + ) + partner_receivable_amount = fields.Monetary( + currency_field='partner_currency_id', + compute='_compute_partner_info', + ) + partner_payable_amount = fields.Monetary( + currency_field='partner_currency_id', + compute='_compute_partner_info', + ) + + bank_account = fields.Char( + compute='_compute_bank_account', + ) + suggestion_html = fields.Html( + compute='_compute_suggestion', + sanitize=False, + ) + suggestion_amount_currency = fields.Monetary( + currency_field='currency_id', + compute='_compute_suggestion', + ) + suggestion_balance = fields.Monetary( + currency_field='company_currency_id', + compute='_compute_suggestion', + ) + ref = fields.Char( + compute='_compute_ref_narration', + store=True, + readonly=False, + ) + narration = fields.Html( + compute='_compute_ref_narration', + store=True, + readonly=False, + ) + + manually_modified = fields.Boolean() + + def _compute_index(self): + for line in self: + line.index = uuid.uuid4() + + @api.depends('source_aml_id') + def _compute_account_id(self): + for line in self: + if line.flag in ('aml', 'new_aml', 'liquidity', 'exchange_diff'): + line.account_id = line.source_aml_id.account_id + else: + line.account_id = line.account_id + + @api.depends('source_aml_id') + def _compute_date(self): + for line in self: + if line.flag in ('aml', 'new_aml', 'exchange_diff'): + line.date = line.source_aml_id.date + elif line.flag in ('liquidity', 'auto_balance', 'manual', 'early_payment', 'tax_line'): + line.date = line.wizard_id.st_line_id.date + else: + line.date = line.date + + @api.depends('source_aml_id') + def _compute_name(self): + for line in self: + if line.flag in ('aml', 'new_aml', 'liquidity'): + # In the case the source_aml_id is from a credit note, the aml might not have a name set + line.name = line.source_aml_id.name or line.source_aml_move_name + else: + line.name = line.name + + @api.depends('source_aml_id') + def _compute_partner_id(self): + for line in self: + if line.flag in ('aml', 'new_aml'): + line.partner_id = line.source_aml_id.partner_id + elif line.flag in ('liquidity', 'auto_balance', 'manual', 'early_payment', 'tax_line'): + line.partner_id = line.wizard_id.partner_id + else: + line.partner_id = line.partner_id + + @api.depends('source_aml_id') + def _compute_currency_id(self): + for line in self: + if line.flag in ('aml', 'new_aml', 'liquidity', 'exchange_diff'): + line.currency_id = line.source_aml_id.currency_id + elif line.flag in ('auto_balance', 'manual', 'early_payment'): + line.currency_id = line.wizard_id.transaction_currency_id + else: + line.currency_id = line.currency_id + + @api.depends('source_aml_id') + def _compute_balance(self): + for line in self: + if line.flag in ('aml', 'liquidity'): + line.balance = line.source_aml_id.balance + else: + line.balance = line.balance + + @api.depends('source_aml_id') + def _compute_amount_currency(self): + for line in self: + if line.flag in ('aml', 'liquidity'): + line.amount_currency = line.source_aml_id.amount_currency + else: + line.amount_currency = line.amount_currency + + @api.depends('balance') + def _compute_from_balance(self): + for line in self: + line.debit = line.balance if line.balance > 0.0 else 0.0 + line.credit = -line.balance if line.balance < 0.0 else 0.0 + + @api.depends('source_balance') + def _compute_from_source_balance(self): + for line in self: + line.source_debit = line.source_balance if line.source_balance > 0.0 else 0.0 + line.source_credit = -line.source_balance if line.source_balance < 0.0 else 0.0 + + @api.depends('source_aml_id', 'account_id', 'partner_id') + def _compute_analytic_distribution(self): + cache = {} + for line in self: + if line.flag in ('liquidity', 'aml'): + line.analytic_distribution = line.source_aml_id.analytic_distribution + elif line.flag in ('tax_line', 'early_payment'): + line.analytic_distribution = line.analytic_distribution + else: + arguments = frozendict({ + "partner_id": line.partner_id.id, + "partner_category_id": line.partner_id.category_id.ids, + "account_prefix": line.account_id.code, + "company_id": line.company_id.id, + }) + if arguments not in cache: + cache[arguments] = self.env['account.analytic.distribution.model']._get_distribution(arguments) + line.analytic_distribution = cache[arguments] or line.analytic_distribution + + @api.depends('source_aml_id') + def _compute_tax_repartition_line_id(self): + for line in self: + if line.flag == 'aml': + line.tax_repartition_line_id = line.source_aml_id.tax_repartition_line_id + else: + line.tax_repartition_line_id = line.tax_repartition_line_id + + @api.depends('source_aml_id') + def _compute_tax_ids(self): + for line in self: + if line.flag == 'aml': + line.tax_ids = [Command.set(line.source_aml_id.tax_ids.ids)] + else: + line.tax_ids = line.tax_ids + + @api.depends('source_aml_id') + def _compute_tax_tag_ids(self): + for line in self: + if line.flag == 'aml': + line.tax_tag_ids = [Command.set(line.source_aml_id.tax_tag_ids.ids)] + else: + line.tax_tag_ids = line.tax_tag_ids + + @api.depends('source_aml_id') + def _compute_group_tax_id(self): + for line in self: + if line.flag == 'aml': + line.group_tax_id = line.source_aml_id.group_tax_id + else: + line.group_tax_id = line.group_tax_id + + @api.depends('currency_id', 'amount_currency', 'source_amount_currency') + def _compute_display_stroked_amount_currency(self): + for line in self: + line.display_stroked_amount_currency = \ + line.flag == 'new_aml' \ + and line.currency_id.compare_amounts(line.amount_currency, line.source_amount_currency) != 0 + + @api.depends('currency_id', 'balance', 'source_balance') + def _compute_display_stroked_balance(self): + for line in self: + line.display_stroked_balance = \ + line.flag in ('new_aml', 'exchange_diff') \ + and line.currency_id.compare_amounts(line.balance, line.source_balance) != 0 + + @api.depends('flag') + def _compute_source_aml_fields(self): + for line in self: + line.source_aml_move_id = None + line.source_aml_move_name = None + if line.flag in ('new_aml', 'liquidity'): + line.source_aml_move_id = line.source_aml_id.move_id + line.source_aml_move_name = line.source_aml_id.move_id.name + elif line.flag == 'aml': + partials = line.source_aml_id.matched_debit_ids + line.source_aml_id.matched_credit_ids + all_counterpart_lines = partials.debit_move_id + partials.credit_move_id + counterpart_lines = all_counterpart_lines - line.source_aml_id - partials.exchange_move_id.line_ids + if len(counterpart_lines) == 1: + line.source_aml_move_id = counterpart_lines.move_id + line.source_aml_move_name = counterpart_lines.move_id.name + + @api.depends('wizard_id.form_index', 'partner_id') + def _compute_partner_info(self): + for line in self: + line.partner_receivable_amount = 0.0 + line.partner_payable_amount = 0.0 + line.partner_currency_id = None + line.partner_receivable_account_id = None + line.partner_payable_account_id = None + + if not line.partner_id or line.index != line.wizard_id.form_index: + continue + + line.partner_currency_id = line.company_currency_id + partner = line.partner_id.with_company(line.wizard_id.company_id) + common_domain = [('parent_state', '=', 'posted'), ('partner_id', '=', partner.id)] + line.partner_receivable_account_id = partner.property_account_receivable_id + if line.partner_receivable_account_id: + results = self.env['account.move.line']._read_group( + domain=expression.AND([common_domain, [('account_id', '=', line.partner_receivable_account_id.id)]]), + aggregates=['amount_residual:sum'], + ) + line.partner_receivable_amount = results[0][0] + line.partner_payable_account_id = partner.property_account_payable_id + if line.partner_payable_account_id: + results = self.env['account.move.line']._read_group( + domain=expression.AND([common_domain, [('account_id', '=', line.partner_payable_account_id.id)]]), + aggregates=['amount_residual:sum'], + ) + line.partner_payable_amount = results[0][0] + + @api.depends('flag') + def _compute_bank_account(self): + for line in self: + bank_account = line.wizard_id.st_line_id.partner_bank_id.display_name or line.wizard_id.st_line_id.account_number + if line.flag == 'liquidity' and bank_account: + line.bank_account = bank_account + else: + line.bank_account = None + + @api.depends('wizard_id.form_index', 'amount_currency', 'balance') + def _compute_suggestion(self): + for line in self: + line.suggestion_html = None + line.suggestion_amount_currency = None + line.suggestion_balance = None + + if line.flag != 'new_aml' or line.index != line.wizard_id.form_index: + continue + + aml = line.source_aml_id + wizard = line.wizard_id + residual_amount_before_reco = abs(aml.amount_residual_currency) + residual_amount_after_reco = abs(aml.amount_residual_currency + line.amount_currency) + reconciled_amount = residual_amount_before_reco - residual_amount_after_reco + is_fully_reconciled = aml.currency_id.is_zero(residual_amount_after_reco) + is_invoice = aml.move_id.is_invoice(include_receipts=True) + + if is_fully_reconciled: + lines = [ + _("The invoice %(display_name_html)s with an open amount of %(open_amount)s will be entirely paid by the transaction.") + if is_invoice else + _("%(display_name_html)s with an open amount of %(open_amount)s will be fully reconciled by the transaction.") + ] + partial_amounts = wizard._lines_check_partial_amount(line) + if partial_amounts: + lines.append( + _("You might want to record a %(btn_start)spartial payment%(btn_end)s.") + if is_invoice else + _("You might want to make a %(btn_start)spartial reconciliation%(btn_end)s instead.") + ) + line.suggestion_amount_currency = partial_amounts['amount_currency'] + line.suggestion_balance = partial_amounts['balance'] + else: + if is_invoice: + lines = [ + _("The invoice %(display_name_html)s with an open amount of %(open_amount)s will be reduced by %(amount)s."), + _("You might want to set the invoice as %(btn_start)sfully paid%(btn_end)s."), + ] + else: + lines = [ + _("%(display_name_html)s with an open amount of %(open_amount)s will be reduced by %(amount)s."), + _("You might want to %(btn_start)sfully reconcile%(btn_end)s the document."), + ] + line.suggestion_amount_currency = line.source_amount_currency + line.suggestion_balance = line.source_balance + + display_name_html = markupsafe.Markup(""" + + """) % { + 'display_name': aml.move_id.display_name, + } + + extra_text = markupsafe.Markup('
    ').join(lines) % { + 'amount': formatLang(self.env, reconciled_amount, currency_obj=aml.currency_id), + 'open_amount': formatLang(self.env, residual_amount_before_reco, currency_obj=aml.currency_id), + 'display_name_html': display_name_html, + 'btn_start': markupsafe.Markup( + ''), + } + line.suggestion_html = markupsafe.Markup("""
    %s
    """) % extra_text + + @api.depends('flag') + def _compute_ref_narration(self): + for line in self: + if line.flag == 'liquidity': + line.ref = line.wizard_id.st_line_id.ref + line.narration = line.wizard_id.st_line_id.narration + else: + line.ref = line.narration = None + + def _get_aml_values(self, **kwargs): + self.ensure_one() + create_dict = { + 'name': self.name, + 'account_id': self.account_id.id, + 'currency_id': self.currency_id.id, + 'amount_currency': self.amount_currency, + 'balance': self.debit - self.credit, + 'reconcile_model_id': self.reconcile_model_id.id, + 'analytic_distribution': self.analytic_distribution, + 'tax_repartition_line_id': self.tax_repartition_line_id.id, + 'tax_ids': [Command.set(self.tax_ids.ids)], + 'tax_tag_ids': [Command.set(self.tax_tag_ids.ids)], + 'group_tax_id': self.group_tax_id.id, + **kwargs, + } + if self.flag == 'early_payment': + create_dict['display_type'] = 'epd' + return create_dict diff --git a/dev_odex30_accounting/odex30_account_accountant/models/digest.py b/dev_odex30_accounting/odex30_account_accountant/models/digest.py new file mode 100644 index 0000000..9be0abc --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/digest.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- + +from odoo import fields, models, _ +from odoo.exceptions import AccessError + + +class Digest(models.Model): + _inherit = 'digest.digest' + + kpi_account_bank_cash = fields.Boolean('Bank & Cash Moves') + kpi_account_bank_cash_value = fields.Monetary(compute='_compute_kpi_account_total_bank_cash_value') + + def _compute_kpi_account_total_bank_cash_value(self): + if not self.env.user.has_group('account.group_account_user'): + raise AccessError(_("Do not have access, skip this data for user's digest email")) + + start, end, companies = self._get_kpi_compute_parameters() + data = self.env['account.move']._read_group([ + ('date', '>=', start), + ('date', '<', end), + ('journal_id.type', 'in', ('cash', 'bank')), + ('company_id', 'in', companies.ids), + ], ['company_id'], ['amount_total:sum']) + data = dict(data) + + for record in self: + company = record.company_id or self.env.company + record.kpi_account_bank_cash_value = data.get(company) + + def _compute_kpis_actions(self, company, user): + res = super(Digest, self)._compute_kpis_actions(company, user) + res.update({'kpi_account_bank_cash': 'account.open_account_journal_dashboard_kanban?menu_id=%s' % (self.env.ref('account.menu_finance').id)}) + return res diff --git a/dev_odex30_accounting/odex30_account_accountant/models/ir_model.py b/dev_odex30_accounting/odex30_account_accountant/models/ir_model.py new file mode 100644 index 0000000..1ac8373 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/ir_model.py @@ -0,0 +1,14 @@ +from odoo import api, models + + +class IrModel(models.Model): + _inherit = 'ir.model' + + @api.model + def _is_valid_for_model_selector(self, model): + return model not in { + # bank.rec.widget* does not have a psql table with _auto=False & _table_query="0", + # which makes the models unusable in the model selector. + 'bank.rec.widget', + 'bank.rec.widget.line', + } and super()._is_valid_for_model_selector(model) diff --git a/dev_odex30_accounting/odex30_account_accountant/models/ir_ui_menu.py b/dev_odex30_accounting/odex30_account_accountant/models/ir_ui_menu.py new file mode 100644 index 0000000..ce62e0d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/ir_ui_menu.py @@ -0,0 +1,21 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models + + +class IrUiMenu(models.Model): + _inherit = 'ir.ui.menu' + + def _visible_menu_ids(self, debug=False): + visible_ids = super()._visible_menu_ids(debug) + # These menus should only be visible to accountants (users with group_account_readonly) and the group specified on the menu + # We want to avoid moving these menus to the new `accountant` module + if not self.env.user.has_group('account.group_account_readonly'): + accounting_menus = [ + 'odex30_account_accountant.account_tag_menu', + 'odex30_account_accountant.menu_account_group', + 'odex30_account_reports.menu_action_account_report_multicurrency_revaluation', + ] + hidden_menu_ids = {self.env.ref(r).sudo().id for r in accounting_menus if self.env.ref(r, raise_if_not_found=False)} + return visible_ids - hidden_menu_ids + return visible_ids diff --git a/dev_odex30_accounting/odex30_account_accountant/models/res_company.py b/dev_odex30_accounting/odex30_account_accountant/models/res_company.py new file mode 100644 index 0000000..2c72f7c --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/res_company.py @@ -0,0 +1,208 @@ +from odoo import models, fields, _ +from odoo.tools.misc import DEFAULT_SERVER_DATE_FORMAT + +from datetime import timedelta +from odoo.tools import date_utils + + +class ResCompany(models.Model): + _inherit = 'res.company' + + invoicing_switch_threshold = fields.Date(string="Invoicing Switch Threshold", help="Every payment and invoice before this date will receive the 'From Invoicing' status, hiding all the accounting entries related to it. Use this option after installing Accounting if you were using only Invoicing before, before importing all your actual accounting data in to Odoo.") + predict_bill_product = fields.Boolean(string="Predict Bill Product") + + sign_invoice = fields.Boolean(string='Display signing field on invoices') + signing_user = fields.Many2one(comodel_name='res.users') + + # Deferred expense management + deferred_expense_journal_id = fields.Many2one( + comodel_name='account.journal', + string="Deferred Expense Journal", + ) + deferred_expense_account_id = fields.Many2one( + comodel_name='account.account', + string="Deferred Expense Account", + ) + generate_deferred_expense_entries_method = fields.Selection( + string="Generate Deferred Expense Entries", + selection=[ + ('on_validation', 'On bill validation'), + ('manual', 'Manually & Grouped'), + ], + default='on_validation', + required=True, + ) + deferred_expense_amount_computation_method = fields.Selection( + string="Deferred Expense Based on", + selection=[ + ('day', 'Days'), + ('month', 'Months'), + ('full_months', 'Full Months'), + ], + default='month', + required=True, + ) + + # Deferred revenue management + deferred_revenue_journal_id = fields.Many2one( + comodel_name='account.journal', + string="Deferred Revenue Journal", + ) + deferred_revenue_account_id = fields.Many2one( + comodel_name='account.account', + string="Deferred Revenue Account", + ) + generate_deferred_revenue_entries_method = fields.Selection( + string="Generate Deferred Revenue Entries", + selection=[ + ('on_validation', 'On bill validation'), + ('manual', 'Manually & Grouped'), + ], + default='on_validation', + required=True, + ) + deferred_revenue_amount_computation_method = fields.Selection( + string="Deferred Revenue Based on", + selection=[ + ('day', 'Days'), + ('month', 'Months'), + ('full_months', 'Full Months'), + ], + default='month', + required=True, + ) + + def write(self, vals): + old_threshold_vals = {} + for record in self: + old_threshold_vals[record] = record.invoicing_switch_threshold + + rslt = super(ResCompany, self).write(vals) + + for record in self: + if 'invoicing_switch_threshold' in vals and old_threshold_vals[record] != vals['invoicing_switch_threshold']: + self.env['account.move.line'].flush_model(['move_id', 'parent_state']) + self.env['account.move'].flush_model(['company_id', 'date', 'state', 'payment_state', 'payment_state_before_switch']) + if record.invoicing_switch_threshold: + # If a new date was set as threshold, we switch all the + # posted moves and payments before it to 'invoicing_legacy'. + # We also reset to posted all the moves and payments that + # were 'invoicing_legacy' and were posterior to the threshold + self.env.cr.execute(""" + update account_move_line aml + set parent_state = 'posted' + from account_move move + where aml.move_id = move.id + and move.payment_state = 'invoicing_legacy' + and move.date >= %(switch_threshold)s + and move.company_id = %(company_id)s; + + update account_move + set state = 'posted', + payment_state = payment_state_before_switch, + payment_state_before_switch = null + where payment_state = 'invoicing_legacy' + and date >= %(switch_threshold)s + and company_id = %(company_id)s; + + update account_move_line aml + set parent_state = 'cancel' + from account_move move + where aml.move_id = move.id + and move.state = 'posted' + and move.date < %(switch_threshold)s + and move.company_id = %(company_id)s; + + update account_move + set state = 'cancel', + payment_state_before_switch = payment_state, + payment_state = 'invoicing_legacy' + where state = 'posted' + and date < %(switch_threshold)s + and company_id = %(company_id)s; + """, {'company_id': record.id, 'switch_threshold': record.invoicing_switch_threshold}) + else: + # If the threshold date has been emptied, we re-post all the + # invoicing_legacy entries. + self.env.cr.execute(""" + update account_move_line aml + set parent_state = 'posted' + from account_move move + where aml.move_id = move.id + and move.payment_state = 'invoicing_legacy' + and move.company_id = %(company_id)s; + + update account_move + set state = 'posted', + payment_state = payment_state_before_switch, + payment_state_before_switch = null + where payment_state = 'invoicing_legacy' + and company_id = %(company_id)s; + """, {'company_id': record.id}) + + self.env['account.move.line'].invalidate_model(['parent_state']) + self.env['account.move'].invalidate_model(['state', 'payment_state', 'payment_state_before_switch']) + + return rslt + + def compute_fiscalyear_dates(self, current_date): + """Compute the start and end dates of the fiscal year where the given 'date' belongs to. + + :param current_date: A datetime.date/datetime.datetime object. + :return: A dictionary containing: + * date_from + * date_to + * [Optionally] record: The fiscal year record. + """ + self.ensure_one() + date_str = current_date.strftime(DEFAULT_SERVER_DATE_FORMAT) + + # Search a fiscal year record containing the date. + # If a record is found, then no need further computation, we get the dates range directly. + fiscalyear = self.env['account.fiscal.year'].search([ + ('company_id', '=', self.id), + ('date_from', '<=', date_str), + ('date_to', '>=', date_str), + ], limit=1) + if fiscalyear: + return { + 'date_from': fiscalyear.date_from, + 'date_to': fiscalyear.date_to, + 'record': fiscalyear, + } + + date_from, date_to = date_utils.get_fiscal_year( + current_date, day=self.fiscalyear_last_day, month=int(self.fiscalyear_last_month)) + + date_from_str = date_from.strftime(DEFAULT_SERVER_DATE_FORMAT) + date_to_str = date_to.strftime(DEFAULT_SERVER_DATE_FORMAT) + + # Search for fiscal year records reducing the delta between the date_from/date_to. + # This case could happen if there is a gap between two fiscal year records. + # E.g. two fiscal year records: 2017-01-01 -> 2017-02-01 and 2017-03-01 -> 2017-12-31. + # => The period 2017-02-02 - 2017-02-30 is not covered by a fiscal year record. + + fiscalyear_from = self.env['account.fiscal.year'].search([ + ('company_id', '=', self.id), + ('date_from', '<=', date_from_str), + ('date_to', '>=', date_from_str), + ], limit=1) + if fiscalyear_from: + date_from = fiscalyear_from.date_to + timedelta(days=1) + + fiscalyear_to = self.env['account.fiscal.year'].search([ + ('company_id', '=', self.id), + ('date_from', '<=', date_to_str), + ('date_to', '>=', date_to_str), + ], limit=1) + if fiscalyear_to: + date_to = fiscalyear_to.date_from - timedelta(days=1) + + return {'date_from': date_from, 'date_to': date_to} + + def _get_unreconciled_statement_lines_redirect_action(self, unreconciled_statement_lines): + # OVERRIDE account + return self.env['account.bank.statement.line']._action_open_bank_reconciliation_widget( + extra_domain=[('id', 'in', unreconciled_statement_lines.ids)], + name=_('Unreconciled statements lines'), + ) diff --git a/dev_odex30_accounting/odex30_account_accountant/models/res_config_settings.py b/dev_odex30_accounting/odex30_account_accountant/models/res_config_settings.py new file mode 100644 index 0000000..dce9496 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/models/res_config_settings.py @@ -0,0 +1,111 @@ +from datetime import date + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + fiscalyear_last_day = fields.Integer(related='company_id.fiscalyear_last_day', required=True, readonly=False) + fiscalyear_last_month = fields.Selection(related='company_id.fiscalyear_last_month', required=True, readonly=False) + use_anglo_saxon = fields.Boolean(string='Anglo-Saxon Accounting', related='company_id.anglo_saxon_accounting', readonly=False) + invoicing_switch_threshold = fields.Date(string="Invoicing Switch Threshold", related='company_id.invoicing_switch_threshold', readonly=False) + group_fiscal_year = fields.Boolean(string='Fiscal Years', implied_group='odex30_account_accountant.group_fiscal_year') + predict_bill_product = fields.Boolean(string="Predict Bill Product", related='company_id.predict_bill_product', readonly=False) + + sign_invoice = fields.Boolean(string='Authorized Signatory on invoice', related='company_id.sign_invoice', readonly=False) + signing_user = fields.Many2one( + comodel_name='res.users', + string="Signature used to sign all the invoice", + readonly=False, + related='company_id.signing_user', + help="Select a user here to override every signature on invoice by this user's signature" + ) + module_sign = fields.Boolean(string='Sign', compute='_compute_module_sign_status') + + # Deferred expense management + deferred_expense_journal_id = fields.Many2one( + comodel_name='account.journal', + help='Journal used for deferred entries', + readonly=False, + related='company_id.deferred_expense_journal_id', + ) + deferred_expense_account_id = fields.Many2one( + comodel_name='account.account', + help='Account used for deferred expenses', + readonly=False, + related='company_id.deferred_expense_account_id', + ) + generate_deferred_expense_entries_method = fields.Selection( + related='company_id.generate_deferred_expense_entries_method', + readonly=False, required=True, + help='Method used to generate deferred entries', + ) + deferred_expense_amount_computation_method = fields.Selection( + related='company_id.deferred_expense_amount_computation_method', + readonly=False, required=True, + help='Method used to compute the amount of deferred entries', + ) + + # Deferred revenue management + deferred_revenue_journal_id = fields.Many2one( + comodel_name='account.journal', + help='Journal used for deferred entries', + readonly=False, + related='company_id.deferred_revenue_journal_id', + ) + deferred_revenue_account_id = fields.Many2one( + comodel_name='account.account', + help='Account used for deferred revenues', + readonly=False, + related='company_id.deferred_revenue_account_id', + ) + generate_deferred_revenue_entries_method = fields.Selection( + related='company_id.generate_deferred_revenue_entries_method', + readonly=False, required=True, + help='Method used to generate deferred entries', + ) + deferred_revenue_amount_computation_method = fields.Selection( + related='company_id.deferred_revenue_amount_computation_method', + readonly=False, required=True, + help='Method used to compute the amount of deferred entries', + ) + + @api.depends('sign_invoice') + def _compute_module_sign_status(self): + sign_installed = 'sign' in self.env['ir.module.module']._installed() + for settings in self: + settings.module_sign = sign_installed or settings.company_id.sign_invoice + + @api.constrains('fiscalyear_last_day', 'fiscalyear_last_month') + def _check_fiscalyear(self): + # We try if the date exists in 2020, which is a leap year. + # We do not define the constrain on res.company, since the recomputation of the related + # fields is done one field at a time. + for wiz in self: + try: + date(2020, int(wiz.fiscalyear_last_month), wiz.fiscalyear_last_day) + except ValueError: + raise ValidationError( + _('Incorrect fiscal year date: day is out of range for month. Month: %(month)s; Day: %(day)s', + month=wiz.fiscalyear_last_month, day=wiz.fiscalyear_last_day), + ) + + @api.model_create_multi + def create(self, vals_list): + # Amazing workaround: non-stored related fields on company are a BAD idea since the 2 fields + # must follow the constraint '_check_fiscalyear_last_day'. The thing is, in case of related + # fields, the inverse write is done one value at a time, and thus the constraint is verified + # one value at a time... so it is likely to fail. + for vals in vals_list: + fiscalyear_last_day = vals.pop('fiscalyear_last_day', False) or self.env.company.fiscalyear_last_day + fiscalyear_last_month = vals.pop('fiscalyear_last_month', False) or self.env.company.fiscalyear_last_month + vals = {} + if fiscalyear_last_day != self.env.company.fiscalyear_last_day: + vals['fiscalyear_last_day'] = fiscalyear_last_day + if fiscalyear_last_month != self.env.company.fiscalyear_last_month: + vals['fiscalyear_last_month'] = fiscalyear_last_month + if vals: + self.env.company.write(vals) + return super().create(vals_list) diff --git a/dev_odex30_accounting/odex30_account_accountant/security/ir.model.access.csv b/dev_odex30_accounting/odex30_account_accountant/security/ir.model.access.csv new file mode 100644 index 0000000..34dba06 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/security/ir.model.access.csv @@ -0,0 +1,12 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_account_change_lock_date","access.account.change.lock.date","model_account_change_lock_date","account.group_account_manager",1,1,1,0 +"access_account_secure_entries_wizard","access.account.secure.entries.wizard","account.model_account_secure_entries_wizard","account.group_account_user",1,1,1,0 +"access_account_auto_reconcile_wizard","access.account.auto.reconcile.wizard","model_account_auto_reconcile_wizard","account.group_account_user",1,1,1,0 +"access_account_reconcile_wizard","access.account.reconcile.wizard","model_account_reconcile_wizard","account.group_account_user",1,1,1,0 + +access_account_fiscal_year_readonly,account.fiscal.year.user,model_account_fiscal_year,account.group_account_readonly,1,0,0,0 +access_account_fiscal_year_basic,account.fiscal.year.basic,model_account_fiscal_year,account.group_account_basic,1,0,0,0 +access_account_fiscal_year_manager,account.fiscal.year.manager,model_account_fiscal_year,account.group_account_manager,1,1,1,1 + +access_bank_rec_widget,access.bank.rec.widget,model_bank_rec_widget,account.group_account_user,1,1,1,1 +access_bank_rec_widget_line,access.bank.rec.widget.line,model_bank_rec_widget_line,account.group_account_user,1,1,1,1 diff --git a/dev_odex30_accounting/odex30_account_accountant/security/odex30_account_accountant_security.xml b/dev_odex30_accounting/odex30_account_accountant/security/odex30_account_accountant_security.xml new file mode 100644 index 0000000..d81eca8 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/security/odex30_account_accountant_security.xml @@ -0,0 +1,21 @@ + + + + + + + + + Invoicing & Banks + + + + + + + + + Allow to define fiscal years of more or less than a year + + + diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/amls_list_view.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/amls_list_view.js new file mode 100644 index 0000000..b4aabbc --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/amls_list_view.js @@ -0,0 +1,49 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { EmbeddedListView } from "./embedded_list_view"; +import { ListRenderer } from "@web/views/list/list_renderer"; +import { useState, onWillUnmount } from "@odoo/owl"; + +export class BankRecAmlsRenderer extends ListRenderer { + setup() { + super.setup(); + this.globalState = useState(this.env.methods.getState()); + + onWillUnmount(this.saveSearchState); + } + + /** @override **/ + getRowClass(record) { + const classes = super.getRowClass(record); + const amlId = this.globalState.bankRecRecordData.selected_aml_ids.currentIds.find((x) => x === record.resId); + if (amlId){ + return `${classes} o_rec_widget_list_selected_item table-info`; + } + return classes; + } + + /** @override **/ + async onCellClicked(record, column, ev) { + const amlId = this.globalState.bankRecRecordData.selected_aml_ids.currentIds.find((x) => x === record.resId); + if (amlId) { + this.env.config.actionRemoveNewAml(record.resId); + } else { + this.env.config.actionAddNewAml(record.resId); + } + } + + /** Backup the search facets in order to restore them when the user comes back on this view. **/ + saveSearchState() { + const initParams = this.globalState.bankRecEmbeddedViewsData.amls; + const searchModel = this.env.searchModel; + initParams.exportState = {searchModel: JSON.stringify(searchModel.exportState())}; + } +} + +export const BankRecAmls = { + ...EmbeddedListView, + Renderer: BankRecAmlsRenderer, +}; + +registry.category("views").add("bank_rec_amls_list_view", BankRecAmls); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml new file mode 100644 index 0000000..9537584 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_form.xml @@ -0,0 +1,752 @@ + + + + + +
    + + + + + + + +
    +
    + + + +
    +
    + + + + +
    + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + Create model + + + View models + + + +
    + +
    +
    + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + New + + + + + +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + : + + + + + + + + + + + + + +
    +
    +
    +
    + + + +
    + +
    +
    + + + + + +
    + + + + +
    +
    + + + + +
    +
    + +
    +
    +
    + +
    + +
    + + in + +
    + +
    +
    +
    +
    + + + +
    +
    + +
    +
    +
    + +
    + +
    + + in + +
    + +
    +
    +
    +
    + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    + +
    +
    +
    + + + +
    +
    + +
    +
    +
    + +
    +
    +
    + + + +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + - + +
    +
    +
    + + +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + + +
    + +
    +
    + + + +
    +
    + +
    +
    +
    + + + +
    + + +
    +
    +
    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + + + + + diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_quick_create.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_quick_create.js new file mode 100644 index 0000000..b1aca6e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_quick_create.js @@ -0,0 +1,26 @@ +import { KanbanRecordQuickCreate, KanbanQuickCreateController } from "@web/views/kanban/kanban_record_quick_create"; + +export class BankRecQuickCreateController extends KanbanQuickCreateController { + static template = "account.BankRecQuickCreateController"; +} + +export class BankRecQuickCreate extends KanbanRecordQuickCreate { + static template = "account.BankRecQuickCreate"; + static props = { + ...Object.fromEntries(Object.entries(KanbanRecordQuickCreate.props).filter(([k, v]) => k !== 'group')), + globalState: { type: Object, optional: true }, + }; + static components = { BankRecQuickCreateController }; + + /** + Overriden. + **/ + async getQuickCreateProps(props) { + await super.getQuickCreateProps({...props, + group: { + resModel: props.globalState.quickCreateState.resModel, + context: props.globalState.quickCreateState.context, + } + }); + } +} diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_quick_create.xml b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_quick_create.xml new file mode 100644 index 0000000..c1359f7 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_quick_create.xml @@ -0,0 +1,29 @@ + + + + + + + + +
    + +
    + + + + +
    +
    +
    + +
    diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_record.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_record.js new file mode 100644 index 0000000..89aef87 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/bank_rec_record.js @@ -0,0 +1,86 @@ +/** @odoo-module **/ + +import { Record } from "@web/model/relational_model/record"; +import { RelationalModel } from "@web/model/relational_model/relational_model"; +import { parseServerValue } from "@web/model/relational_model/utils"; + +export class BankRecRecord extends Record { + + /** + * override + * Track the changed field on lines. + */ + async _update(changes) { + if(this.resModel === "bank.rec.widget.line"){ + for(const fieldName of Object.keys(changes)){ + this.model.lineIdsChangedField = fieldName; + } + } + return super._update(...arguments); + } + + async updateToDoCommand(methodName, args, kwargs) { + this.dirty = true; + + const onChangeFields = ["todo_command"]; + const changes = { + todo_command: { + method_name: methodName, + args: args, + kwargs: kwargs, + }, + }; + + const localChanges = this._getChanges( + { ...this._changes, ...changes }, + { withReadonly: true } + ); + const otherChanges = await this.model._onchange(this.config, { + changes: localChanges, + fieldNames: onChangeFields, + evalContext: this.evalContext, + }); + + const data = { ...this.data, ...changes }; + for (const fieldName in otherChanges) { + data[fieldName] = parseServerValue(this.fields[fieldName], otherChanges[fieldName]); + } + const applyChanges = () => { + Object.assign(changes, this._parseServerValues(otherChanges, this.data)); + if (Object.keys(changes).length > 0) { + this._applyChanges(changes); + } + }; + return { data, applyChanges }; + } + + /** + * Bind an action to be called when a field on lines changed. + * @param {Function} callback: The action to call taking the changed field as parameter. + */ + bindActionOnLineChanged(callback){ + this._onUpdate = async () => { + const lineIdsChangedField = this.model.lineIdsChangedField; + if(lineIdsChangedField){ + this.model.lineIdsChangedField = null; + await callback(lineIdsChangedField); + } + } + } +} + +export class BankRecRelationalModel extends RelationalModel{ + setup(params, { action, dialog, notification, rpc, user, view, company }) { + super.setup(...arguments); + this.lineIdsChangedField = null; + } + + load({ values }) { + this.root = this._createRoot(this.config, values); + } + + getInitialValues() { + return this.root._getChanges(this.root.data, { withReadonly: true }) + } +} +BankRecRelationalModel.Record = BankRecRecord; diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/embedded_list_view.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/embedded_list_view.js new file mode 100644 index 0000000..bc7ebe2 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/embedded_list_view.js @@ -0,0 +1,36 @@ +/** @odoo-module **/ + +import { ListController } from "@web/views/list/list_controller"; +import { listView } from "@web/views/list/list_view"; + +export class BankRecEmbeddedListController extends ListController { + /** Remove the Export Cog **/ + static template = "odex30_account_accountant.BankRecEmbeddedListController"; +} + + +export class BankRecWidgetFormEmbeddedListModel extends listView.Model { + setup(params, { action, dialog, notification, rpc, user, view, company }) { + super.setup(...arguments); + this.storedDomainString = null; + } + + /** + * @override + * the list of AMLs don't need to be fetched from the server every time the form view is re-rendered. + * this disables the retrieval, while still ensuring that the search bar works. + */ + async load(params = {}) { + const currentDomain = params.domain.toString(); + if (currentDomain !== this.storedDomainString) { + this.storedDomainString = currentDomain; + return super.load(params); + } + } +} + +export const EmbeddedListView = { + ...listView, + Controller: BankRecEmbeddedListController, + Model: BankRecWidgetFormEmbeddedListModel, +}; diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/finish_buttons.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/finish_buttons.js new file mode 100644 index 0000000..56adc44 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/finish_buttons.js @@ -0,0 +1,49 @@ +/** @odoo-module **/ +import { Component, useState } from "@odoo/owl"; + +export class BankRecFinishButtons extends Component { + static template = "odex30_account_accountant.BankRecFinishButtons"; + static props = {}; + + setup() { + this.breadcrumbs = useState(this.env.config.breadcrumbs); + } + + getJournalFilter() { + // retrieves the searchModel's searchItem for the journal + return Object.values(this.searchModel.searchItems).filter(i => i.type == "field" && i.fieldName == "journal_id")[0]; + } + + get searchModel() { + return this.env.searchModel; + } + + get otherFiltersActive() { + const facets = this.searchModel.facets; + const journalFilterItem = this.getJournalFilter(); + for (const facet of facets) { + if (facet.groupId !== journalFilterItem.groupId) { + return true; + } + } + return false; + } + + clearFilters() { + const facets = this.searchModel.facets; + const journalFilterItem = this.getJournalFilter(); + for (const facet of facets) { + if (facet.groupId !== journalFilterItem.groupId) { + this.searchModel.deactivateGroup(facet.groupId); + } + } + } + + breadcrumbBackOrDashboard() { + if (this.breadcrumbs.length > 1) { + this.env.services.action.restore(); + } else { + this.env.services.action.doAction("account.open_account_journal_dashboard_kanban", {clearBreadcrumbs: true}); + } + } +} diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/finish_buttons.xml b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/finish_buttons.xml new file mode 100644 index 0000000..d13871c --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/finish_buttons.xml @@ -0,0 +1,10 @@ + + + +

    All Transactions

    +

    + + Back to +

    +
    +
    diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/global_info.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/global_info.js new file mode 100644 index 0000000..e14bd7e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/global_info.js @@ -0,0 +1,24 @@ +/** @odoo-module **/ +import { Component, onWillStart } from "@odoo/owl"; +import { user } from "@web/core/user"; + +export class BankRecGlobalInfo extends Component { + static template = "odex30_account_accountant.BankRecGlobalInfo"; + static props = { + journalId: { type: Number }, + journalBalanceAmount: { type: String }, + }; + + setup() { + this.hasGroupReadOnly = false; + onWillStart(async () => { + this.hasGroupReadOnly = await user.hasGroup("account.group_account_readonly"); + }) + } + + /** Open the bank reconciliation report. **/ + actionOpenBankGL() { + this.env.methods.actionOpenBankGL(this.props.journalId); + } + +} diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/global_info.xml b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/global_info.xml new file mode 100644 index 0000000..3a836f8 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/global_info.xml @@ -0,0 +1,18 @@ + + + + +
    + + Balance + + +
    +
    + +
    diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.js new file mode 100644 index 0000000..fd0597e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.js @@ -0,0 +1,1243 @@ +/** @odoo-module **/ + +import { _t } from "@web/core/l10n/translation"; +import { registry } from "@web/core/registry"; +import { useService } from "@web/core/utils/hooks"; +import { scrollTo } from "@web/core/utils/scrolling"; +import { getCurrency } from "@web/core/currency"; +import { formatMonetary } from "@web/views/fields/formatters"; +import { formatDate } from "@web/core/l10n/dates"; +import { localization } from "@web/core/l10n/localization"; + +import { CallbackRecorder, useSetupAction } from "@web/search/action_hook"; +import { RelationalModel } from "@web/model/relational_model/relational_model"; +import { makeActiveField } from "@web/model/relational_model/utils"; +import { kanbanView } from "@web/views/kanban/kanban_view"; +import { KanbanController } from "@web/views/kanban/kanban_controller"; +import { KanbanRenderer } from "@web/views/kanban/kanban_renderer"; +import { KanbanRecord } from "@web/views/kanban/kanban_record"; + +import { Dropdown } from "@web/core/dropdown/dropdown"; +import { DropdownItem } from "@web/core/dropdown/dropdown_item"; +import { Chatter } from "@mail/chatter/web_portal/chatter"; +import { Many2ManyTagsField } from "@web/views/fields/many2many_tags/many2many_tags_field"; +import { Many2OneField } from "@web/views/fields/many2one/many2one_field"; +import { DateTimeField } from "@web/views/fields/datetime/datetime_field"; +import { CharField } from "@web/views/fields/char/char_field"; +import { AnalyticDistribution } from "@analytic/components/analytic_distribution/analytic_distribution"; +import { TagsList } from "@web/core/tags_list/tags_list"; +import { HtmlField } from "@web_editor/js/backend/html_field"; +import { RainbowMan } from "@web/core/effects/rainbow_man"; +import { Notebook } from "@web/core/notebook/notebook"; +import { user } from "@web/core/user"; + +import { BankRecRelationalModel } from "./bank_rec_record"; +import { BankRecMonetaryField } from "./monetary_field_auto_signed_amount"; +import { BankRecViewEmbedder } from "./view_embedder"; +import { BankRecRainbowContent } from "./rainbowman_content"; +import { BankRecFinishButtons } from "./finish_buttons"; +import { BankRecGlobalInfo } from "./global_info"; +import { BankRecQuickCreate } from "./bank_rec_quick_create"; + +import { onPatched, useState, useEffect, useRef, useChildSubEnv, markRaw } from "@odoo/owl"; + +export class BankRecKanbanRecord extends KanbanRecord { + static template = "account.BankRecKanbanRecord"; + + setup(){ + super.setup(); + this.state = useState(this.env.methods.getState()); + } + + /** @override **/ + getRecordClasses() { + let classes = `${super.getRecordClasses()} w-100 o_bank_rec_st_line`; + if (this.props.record.resId === this.state.bankRecStLineId) { + classes = `${classes} o_bank_rec_selected_st_line table-info`; + } + return classes; + } +} + + +export class BankRecKanbanController extends KanbanController { + static template = "account.BankRecoKanbanController"; + static props = { + ...KanbanController.props, + skipRestore: { optional: true }, + }; + static components = { + ...KanbanController.components, + Dropdown, + DropdownItem, + Many2OneField, + Many2ManyTagsField, + DateTimeField, + CharField, + AnalyticDistribution, + Chatter, + TagsList, + HtmlField, + BankRecMonetaryField, + Notebook, + BankRecViewEmbedder, + }; + + async setup() { + super.setup(); + + // ==================== INITIAL SETUP ==================== + + // Actions. + this.action = useService("action"); + this.orm = useService("orm"); + this.ui = useService("ui"); + + // RelationalModel services. + this.relationalModelServices = Object.fromEntries( + RelationalModel.services.map((servName) => { + return [servName, useService(servName)]; + }) + ); + this.relationalModelServices.orm = useService("orm"); + + useChildSubEnv(this.getChildSubEnv()); + + // Mount the correct statement line when the search panel changed + this.env.searchModel.addEventListener( + "update", + () => { + this.model.bus.addEventListener( + "update", + this.onKanbanSearchModelChanged.bind(this), + { once: true }, + ); + }, + ); + + // ==================== STATE ==================== + + this.bankRecModel = null; + + this.state = useState({ + // BankRec. + bankRecStLineId: null, + bankRecRecordData: null, + bankRecEmbeddedViewsData: null, + bankRecNotebookPage: null, + bankRecClickedColumn: null, + + // Global info. + journalId: null, + journalBalanceAmount: "", + + // Asynchronous validation stuff. + lockedStLineIds: new Set(), + lockedAmlIds: new Set(), + + quickCreateState : { + isVisible: false, + view: this.props.archInfo.quickCreateView, + context: this.props.context, + }, + }); + + this.counter = { + // Counter state is separated as it should not be impacted by asynchronous changes, the last update is final. + startTime: null, + timeDiff: null, + count: null, + }; + + // When focusing the manual operations tab, mount the last line in edition automatically. + useEffect( + () => { + if( + this.state.bankRecNotebookPage === "manual_operations_tab" + && this.state.bankRecRecordData + && !this.state.bankRecRecordData.form_index + ){ + this.actionMountLastLineInEdit(); + } + }, + () => [this.state.bankRecNotebookPage], + ); + + // ==================== EXPORT STATE ==================== + + this.viewRef = useRef("root"); + + useSetupAction({ + rootRef: this.viewRef, + getLocalState: () => { + const exportState = {}; + if(this.bankRecModel.root.data.st_line_id){ + exportState.backupValues = Object.assign( + {}, + this.state.bankRecEmbeddedViewsData, + { + bankRecStLineId: this.state.bankRecStLineId, + initial_values: this.bankRecModel.getInitialValues(), + }, + ); + } + return exportState; + } + }); + + onPatched(() => { + if( + this.state.bankRecClickedColumn + && this.focusManualOperationField(this.state.bankRecClickedColumn) + ){ + this.state.bankRecClickedColumn = null; + } + }); + + // ==================== LOCK SCREEN ==================== + + this.kanbanLock = false; + this.bankRecLock = false; + this.bankRecPromise = null; + } + + // ----------------------------------------------------------------------------- + // HELPERS CONCURRENCY + // ----------------------------------------------------------------------------- + + /** + * Execute the function passed as parameter initiated by the kanban. + * If some action is already processing by bankRecForm, it will wait until its completion. + * @param {Function} func: The action to execute. + */ + async execProtectedAction(func){ + if(this.kanbanLock){ + return; + } + this.kanbanLock = true; + if(this.bankRecPromise){ + await this.bankRecPromise; + } + await func(); + this.kanbanLock = false; + } + + /** + * Execute the function passed as parameter initiated by bankRecForm. + * If some concurrent actions are triggered by bankRecForm, the second one is ignored. + * @param {Function} func: The action to execute. + */ + async execProtectedBankRecAction(func){ + if(this.bankRecLock){ + return; + } + this.bankRecLock = true; + try { + this.bankRecPromise = func(); + await this.bankRecPromise; + } finally { + this.bankRecPromise = null; + this.bankRecLock = false; + } + } + + // ----------------------------------------------------------------------------- + // HELPERS STATE + // ----------------------------------------------------------------------------- + + getState(){ + return this.state; + } + + /** + * Since the kanban is driven by a reactive state for the additional stuff but by deep render + * in its base implementation, the code is turning crazy with rendering everytime a deep render + * is triggered. Indeed, notifying the model then changing things on the state could trigger a lot of + * mount/unmount of components implying useless rpc requests (when mounting multiple times an + * embedded list view for example). + * To avoid that, this method must be used everywhere to update only once the state and to delay + * the notify (itself triggering the deep render) after the update of the state. + * @param {Function} func: The action to execute taking the newState as parameter. + */ + async withNewState(func){ + const newState = {...this.state}; + await func(newState); + if (newState.__commitChanges) { + newState.__commitChanges(); + delete newState.__commitChanges; + } + Object.assign(this.state, newState); + } + + // ----------------------------------------------------------------------------- + // KANBAN OVERRIDES + // ----------------------------------------------------------------------------- + + /** override **/ + get modelOptions() { + return { + ...super.modelOptions, + onWillStartAfterLoad: this.onWillStartAfterLoad.bind(this), + } + } + + /** + * Define the sub environment allowing the sub-components to access some methods from + * the kanban. + */ + getChildSubEnv(){ + return { + // We don't care about subview states but we want to avoid them to record + // some callbacks in the BankRecKanbanController callback recorders passed + // by the action service. + __beforeLeave__: new CallbackRecorder(), + __getLocalState__: new CallbackRecorder(), + __getGlobalState__: new CallbackRecorder(), + __getContext__: new CallbackRecorder(), + + // Accessible methods from sub-components. + methods: { + withNewState: this.withNewState.bind(this), + actionOpenBankGL: this.actionOpenBankGL.bind(this), + focusManualOperationField: this.focusManualOperationField.bind(this), + getState: this.getState.bind(this), + actionAddNewAml: this.actionAddNewAml.bind(this), + actionRemoveNewAml: this.actionRemoveNewAml.bind(this), + showRainbowMan: this.showRainbowMan.bind(this), + initReconCounter: this.initReconCounter.bind(this), + getCounterSummary: this.getCounterSummary.bind(this), + getRainbowManContentProps: this.getRainbowManContentProps.bind(this), + updateJournalState: this.updateJournalState.bind(this), + }, + }; + } + + /** Called when the kanban is initialized. **/ + async onWillStartAfterLoad(){ + // Fetch groups. + this.hasGroupAnalyticAccounting = await user.hasGroup("analytic.group_analytic_accounting"); + this.hasGroupReadOnly = await user.hasGroup("account.group_account_readonly"); + + + // Prepare bankRecoModel. + await this.initBankRecModel(); + + let stLineId = null; + let backupValues = null; + + // Try to restore. + if(this.props.state && this.props.state.backupValues && !this.props.skipRestore){ + const backupStLineId = this.props.state.backupValues.bankRecStLineId; + if(this.model.root.records.find(x => x.resId === backupStLineId)){ + stLineId = backupStLineId; + backupValues = this.props.state.backupValues; + } + } + + // Find the next transaction to mount. + if(!stLineId){ + stLineId = this.getNextAvailableStLineId(); + } + + await this.withNewState(async (newState) => { + + // Mount the transaction if any. + if(stLineId){ + await this._mountStLineInEdit(newState, stLineId, backupValues); + }else{ + await this.updateJournalState(newState); + } + + this.initReconCounter(); + }); + } + + /** Called when the something changed in the kanban search model. **/ + async onKanbanSearchModelChanged(){ + await this.execProtectedAction(async () => { + await this.withNewState(async (newState) => { + if(this.model.root.records.find(x => x.resId === newState.bankRecStLineId)){ + return; + } + + const nextStLineId = this.getNextAvailableStLineId(); + await this._mountStLineInEdit(newState, nextStLineId); + }); + }); + } + + /** + Method called when the user clicks on a card. + **/ + async openRecord(record, mode) { + const currentStLineId = this.bankRecModel ? this.bankRecModel.root.data.st_line_id[0] : null; + const isSameStLineId = currentStLineId && currentStLineId === record.resId; + if (isSameStLineId) { + return; + } + await this.execProtectedAction(async () => { + await this.withNewState(async (newState) => { + await this._mountStLineInEdit(newState, record.resId); + }); + }); + } + + /** + Method called when the user changes the search pager. + **/ + async onUpdatedPager() { + await this.execProtectedAction(async () => { + await this.withNewState(async (newState) => { + const nextStLineId = this.getNextAvailableStLineId(); + await this._mountStLineInEdit(newState, nextStLineId); + }); + }); + } + + onPageUpdate(page) { + if (this.state.bankRecNotebookPage !== page) { + this.state.bankRecNotebookPage = page; + } + } + + /** + Overriden. + **/ + get canQuickCreate() { + return true; + } + + /** + Overriden. + **/ + createRecord() { + const { onCreate } = this.props.archInfo; + const searchModel = this.env.searchModel; + const journalFilter = Object.values(searchModel.searchItems).filter(i => i.type == "field" && i.fieldName == "journal_id")[0]; + + // If there are no records, deactivate all filters except the journal one. + if (!this.model.root.records.length) { + searchModel.facets.forEach(facet => { + if(facet.groupId !== journalFilter.groupId) + searchModel.deactivateGroup(facet.groupId) + }); + } + + if (onCreate === "quick_create" && this.canQuickCreate) { + this.state.quickCreateState = { + ...this.state.quickCreateState, + isVisible: true, + resModel: this.props.resModel, + model: this.model, + }; + } + } + + // ----------------------------------------------------------------------------- + // NEXT STATEMENT LINE + // ----------------------------------------------------------------------------- + + /** + Get the next eligible statement line for reconciliation. + @param afterStLineId: An optional id of a statement line indicating we want the + next available line after this one. + @param records: An optional list of records. + **/ + getNextAvailableStLineId(afterStLineId=null, records=null) { + const stLines = this.model.root.records; + + // Find all available records that need to be validated. + const isRecordReady = (x) => (!x.data.is_reconciled || !x.data.checked); + let waitBeforeReturn = Boolean(afterStLineId); + let availableRecordIds = []; + for (const stLine of (records || stLines)) { + if (waitBeforeReturn) { + if (stLine.resId === afterStLineId) { + waitBeforeReturn = false; + } + } else if (isRecordReady(stLine)) { + availableRecordIds.push(stLine.resId); + } + } + + // No records left, focus the first record instead. This behavior is mainly there when clicking on "View" from + // the list view to show an already reconciled line. + if (!availableRecordIds.length && stLines.length === 1) { + availableRecordIds = [stLines[0].resId]; + } + + if (availableRecordIds.length){ + return availableRecordIds[0]; + } else if(stLines.length) { + return stLines[0].resId; + } else { + return null; + } + } + + /** + Mount the statement line passed as parameter into the edition widget. + @param stLineId: The id of the statement line to mount. + **/ + async _mountStLineInEdit(newState, stLineId, initialData = null) { + newState.bankRecStLineId = stLineId; + let data = {}; + if (initialData) { + // Restore an existing transaction. + data = await this.onchange(newState, "restore_st_line_data", [initialData]); + const bankRecEmbeddedViewsData = data.return_todo_command; + for (const [key, value] of Object.entries(bankRecEmbeddedViewsData)) { + if (value instanceof Object) { + bankRecEmbeddedViewsData[key] = Object.assign( + {}, + initialData[key] || {}, + value + ); + } else { + bankRecEmbeddedViewsData[key] = value; + } + } + newState.bankRecEmbeddedViewsData = markRaw(bankRecEmbeddedViewsData); + newState.bankRecNotebookPage = null; + } else if (stLineId) { + // Mount a new transaction. + data = await this.onchange(newState, "mount_st_line", [stLineId]); + const bankRecEmbeddedViewsData = data.return_todo_command + newState.bankRecEmbeddedViewsData = bankRecEmbeddedViewsData; + newState.bankRecNotebookPage = null; + } else { + // No transaction mounted. + newState.bankRecNotebookPage = null; + newState.bankRecRecordData = null; + } + + // Refresh balance. + await this.updateJournalState(newState, data); + + // Scroll to the next kanban card iff the view is mounted, a line is selected and the kanban + // card is in the view (cannot use .o_bank_rec_selected_st_line as the dom may not be patched yet) + if (stLineId && this.viewRef.el) { + const selectedKanbanCardEl = this.viewRef.el.querySelector( + `[st-line-id="${stLineId}"]` + ); + if (selectedKanbanCardEl) { + scrollTo(selectedKanbanCardEl, {}); + } + } + } + + /** + Mount the statement line passed as parameter into the edition widget. + @param stLineId: The id of the statement line to mount. + **/ + async mountStLineInEdit(stLineId, initialData=null){ + await this.withNewState(async (newState) => { + await this._mountStLineInEdit(newState, stLineId, initialData); + }); + } + + // ----------------------------------------------------------------------------- + // BANK_REC_RECORD + // ----------------------------------------------------------------------------- + + async initBankRecModel(){ + const initialData = await this.orm.call( + "bank.rec.widget", + "fetch_initial_data", + ); + + // Services. + function makeActiveFields(fields) { + const activeFields = {}; + for (const fieldName in fields) { + const field = fields[fieldName]; + activeFields[fieldName] = makeActiveField({ onChange: field.onChange}); + if (field.relatedFields) { + activeFields[fieldName].related = { + fields: field.relatedFields, + activeFields: makeActiveFields(field.relatedFields), + } + } + } + return activeFields; + } + const activeFields = makeActiveFields(initialData.fields); + this.bankRecModel = new BankRecRelationalModel( + this.env, + { + config: { + resModel: "bank.rec.widget", + fields: initialData.fields, + activeFields, + mode: "edit", + isMonoRecord: true, + } + }, + this.relationalModelServices, + ); + + // Initial loading. + await this.bankRecModel.load({ + values: initialData.initial_values, + }); + + const record = this.bankRecModel.root; + record.bindActionOnLineChanged(async (changedField) => { + await this.actionLineChanged(changedField); + }); + } + + getBankRecRecordLineInEdit(){ + const data = this.state.bankRecRecordData; + const lineIndex = data.form_index; + return data.line_ids.records.find((x) => x.data.index === lineIndex); + } + + // ----------------------------------------------------------------------------- + // GLOBAL INFO + // ----------------------------------------------------------------------------- + + async updateJournalState(newState, data = {}) { + // Find the journal. + let journalId = null; + const stLineJournalId = data.st_line_journal_id; + if(stLineJournalId){ + journalId = stLineJournalId[0]; + }else if(this.model.root.records.length){ + journalId = this.model.root.records[0].data.journal_id[0]; + }else{ + journalId = this.props.context.default_journal_id; + } + newState.journalId = journalId; + const values = await this.orm.call( + "bank.rec.widget", + "collect_global_info_data", + [journalId], + ); + newState.journalBalanceAmount = values.balance_amount; + } + + // ----------------------------------------------------------------------------- + // COUNTER / RAINBOWMAN + // ----------------------------------------------------------------------------- + + /** Reset the timing and reconciliation counter */ + initReconCounter() { + this.counter.startTime = luxon.DateTime.now(); + this.counter.timeDiff = null; + this.counter.count = 0; + } + + /** Increment the timing and reconciliation counter */ + incrementReconCounter() { + const start = this.counter.startTime.set({millisecond: 0}); + const end = luxon.DateTime.now().set({millisecond: 0}); + this.counter.timeDiff = end.diff(start, "seconds"); + this.counter.count += 1; + } + + showRainbowMan(){ + return this.counter.count > 0; + } + + getCounterSummary() { + const diff = this.counter.timeDiff; + const total = this.counter.count; + const diffInSeconds = diff.seconds; + let units = ["seconds"]; + if (diffInSeconds > 60) { + units.unshift("minutes"); + } + if (diffInSeconds > 3600) { + units.unshift("hours"); + } + return { + counter: total, + secondsPerTransaction: Math.round(diffInSeconds / total), + formattedDuration: diff.toFormat(localization.timeFormat.replace(/HH/, "hh")), + humanDuration: diff.shiftTo(...units).toHuman(), + } + } + + getRainbowManContentProps(){ + return { + fadeout: "no", + message: "", + imgUrl: "/web/static/img/smile.svg", + Component: BankRecRainbowContent, + close: () => {}, + } + } + + // ----------------------------------------------------------------------------- + // HELPERS BANK_REC_RECORD + // ----------------------------------------------------------------------------- + + async moveToNextLine(newState){ + const records = this.model.root.records; + const counter = newState.counter; + await this.model.root.load(); + + const nextStLineId = this.getNextAvailableStLineId(newState.bankRecStLineId, records); + if(nextStLineId != newState.bankRecStLineId){ + await this._mountStLineInEdit(newState, nextStLineId); + } + newState.counter = counter; + newState.__kanbanNotify = true; + } + + formatMonetaryField(amount, currencyId){ + const currencyDigits = getCurrency(currencyId)?.digits; + return formatMonetary(amount, { + digits: currencyDigits, + currencyId: currencyId, + }); + } + + isMonetaryZero(amount, currencyId){ + const currencyDigits = getCurrency(currencyId)?.digits; + return Number(amount.toFixed(currencyDigits ? currencyDigits[1] : 2)) === 0; + } + + formatDateField(date){ + return formatDate(date); + } + + async onchange(newState, methodName, args, kwargs){ + const record = this.bankRecModel.root; + const { data, applyChanges } = await record.updateToDoCommand(methodName, args, kwargs); + + newState.__commitChanges = () => { + applyChanges(); + newState.bankRecRecordData = record.data; + newState.__bankRecRecordNotify = true; + }; + return data; + } + + getOne2ManyColumns() { + const data = this.state.bankRecRecordData; + let lineIdsRecords = data.line_ids.records; + + // Prepare columns. + let columns = [ + ["date", _t("Date")], + ["partner", _t("Partner")], + ]; + if(lineIdsRecords.some((x) => Boolean(Object.keys(x.data.analytic_distribution).length))){ + columns.push(["analytic_distribution", _t("Analytic")]); + } + if(lineIdsRecords.some((x) => x.data.tax_ids.records.length)){ + columns.push(["taxes", _t("Taxes")]); + } + if(lineIdsRecords.some((x) => x.data.currency_id[0] !== data.company_currency_id[0])){ + columns.push(["amount_currency", _t("Amount in Currency")], ["currency", _t("Currency")]); + } + if (this.hasGroupReadOnly) { + columns.unshift(["account", _t("Account")]); + columns.push( + ["debit", _t("Debit")], + ["credit", _t("Credit")], + ["__trash", ""], + ); + } else { + columns.push( + ["balance", _t("Amount")], + ["__trash", ""], + ); + } + + return columns; + } + + getKey(lineData) { + return `${lineData.index} ${JSON.stringify(lineData.analytic_distribution)}`; + } + + checkBankRecLineRequiredField(line, invalidFields, fieldName, condition){ + if(!line.data[fieldName] && (!condition || condition())){ + invalidFields.push(fieldName); + } + } + + getBankRecLineInvalidFields(line){ + const invalidFields = []; + this.checkBankRecLineRequiredField(line, invalidFields, "account_id"); + this.checkBankRecLineRequiredField(line, invalidFields, "date", () => line.data.flag === "liquidity"); + return invalidFields; + } + + checkBankRecLinesInvalidFields(data){ + return data.line_ids.records.filter((l) => this.getBankRecLineInvalidFields(l).length > 0).length === 0; + } + + notebookAmlsListViewProps(){ + const initParams = this.state.bankRecEmbeddedViewsData.amls; + const ctx = initParams.context; + const suspenseLine = this.state.bankRecRecordData.line_ids.records.filter((l) => l.data.flag == "auto_balance"); + if (suspenseLine.length) { + // Change the sort order of the AML's in the list view based on the amount of the suspense line + // This is done from JS instead of python because the embedded_views_data is only prepared when selecting + // a statement line, and not after mounting an AML that would change the auto_balance value (suspense line) + ctx['preferred_aml_value'] = suspenseLine[0].data.amount_currency * -1; + ctx['preferred_aml_currency_id'] = suspenseLine[0].data.currency_id[0]; + } + return { + type: "list", + noBreadcrumbs: true, + resModel: "account.move.line", + searchMenuTypes: ["filter", "favorite"], + domain: initParams.domain, + dynamicFilters: initParams.dynamic_filters, + context: ctx, + allowSelectors: false, + searchViewId: false, // little hack: force to load the search view info + globalState: initParams.exportState, + loadIrFilters: true, + } + } + + /** + Focus the field corresponding to the column name passed as parameter inside the + manual operation page. + **/ + focusManualOperationField(clickedColumn){ + // Focus the field corresponding to the clicked column. + if (['debit', 'credit'].includes(clickedColumn)) { + if (this.focusElement("div[name='balance'] input")) { + return true; + } + if (this.focusElement("div[name='amount_currency'] input")) { + return true; + } + } + + if (this.focusElement(`div[name='${clickedColumn}'] input`)) { + return true; + } + if (this.focusElement(`input[name='${clickedColumn}']`)) { + return true; + } + return false; + } + + /** Helper to find the corresponding field to focus inside the DOM. **/ + focusElement(selector) { + const inputEl = this.viewRef.el.querySelector(selector); + if (!inputEl) { + return false; + } + + if (inputEl.tagName === "INPUT") { + inputEl.focus(); + inputEl.select(); + } else { + inputEl.focus(); + } + return true; + } + + // ----------------------------------------------------------------------------- + // RPC + // ----------------------------------------------------------------------------- + + async actionOpenBankGL(journalId) { + const actionData = await this.orm.call( + "account.journal", + "action_open_bank_balance_in_gl", + [journalId], + ); + this.action.doAction(actionData); + } + + async actionRemoveLine(line){ + await this.execProtectedBankRecAction(async () => { + await this.withNewState(async (newState) => { + await this.onchange(newState, "remove_line", [line.data.index]); + + if(newState.bankRecNotebookPage === "manual_operations_tab"){ + newState.bankRecNotebookPage = "amls_tab"; + } + }); + }); + } + + async actionSelectRecoModel(recoModel){ + await this.execProtectedBankRecAction(async () => { + await this.withNewState(async (newState) => { + const data = newState.bankRecRecordData; + if(recoModel.resId == data.selected_reco_model_id.id){ + return; + } + const { return_todo_command: actionData } = await this.onchange(newState, "select_reconcile_model", [recoModel.resId]) + if(actionData){ + this.action.doAction(actionData); + } + }); + }); + } + + actionCreateRecoModel(){ + this.execProtectedBankRecAction(async () => { + const journalId = this.state.bankRecRecordData.st_line_journal_id[0]; + const lines = this.state.bankRecRecordData.line_ids.records; + + const defaultLineIds = []; + let balance = lines.filter(line => line.data.flag === "liquidity")[0].data.balance + if(!this.isMonetaryZero(balance, this.state.bankRecRecordData.company_currency_id[0])){ + for (const line of lines) { + const data = line.data; + if (!["manual", "aml"].includes(data.flag)){ + continue; + } + + defaultLineIds.push([0, 0, { + label: data.name, + account_id: data.account_id[0], + tax_ids: [[6, 0, data.tax_ids.currentIds]], + amount_type: "percentage", + amount_string: ((-data.balance / balance) * 100).toFixed(5), + }]); + balance += data.balance; + } + } + + this.action.doAction({ + type: "ir.actions.act_window", + res_model: "account.reconcile.model", + views: [[false, "form"]], + target: "current", + context: { + default_match_journal_ids: [journalId], + default_line_ids: defaultLineIds, + default_to_check: !this.state.bankRecRecordData.checked, + }, + }); + }); + } + + actionViewRecoModels(){ + this.execProtectedBankRecAction(async () => { + this.action.doAction("account.action_account_reconcile_model"); + }); + } + + async _actionValidate(newState){ + const { return_todo_command: result } = await this.onchange(newState, "validate"); + if(result.done){ + this.incrementReconCounter(); + await this.moveToNextLine(newState); + } + return result; + } + + async actionValidate(){ + await this.execProtectedBankRecAction(async () => { + await this.withNewState(async (newState) => { + await this._actionValidate(newState); + }); + }); + } + + async actionReset(){ + await this.execProtectedBankRecAction(async () => { + await this.withNewState(async (newState) => { + const { return_todo_command: result } = await this.onchange(newState, "reset"); + + if(result.done){ + await this.model.root.load(); + + const stLineId = newState.bankRecStLineId; + if(!stLineId){ + return; + } + + const records = this.model.root.records; + if(!records.length){ + // The transaction is not longer available on the kanban. + newState.bankRecStLineId = null; + newState.bankRecNotebookPage = null; + newState.bankRecRecordData = null; + }else if(!records.find((x) => x.resId === stLineId)){ + // Move to the next available transaction. + const nextStLineId = this.getNextAvailableStLineId(stLineId); + await this._mountStLineInEdit(newState, nextStLineId); + } + + if(newState.bankRecNotebookPage != "amls_tab"){ + newState.bankRecNotebookPage = "amls_tab"; + } + + newState.__kanbanNotify = true; + } + }); + }); + } + + async actionToCheck(){ + await this.execProtectedBankRecAction(async () => { + await this.withNewState(async (newState) => { + const { return_todo_command: result } = await this.onchange(newState, "to_check"); + if(result.done){ + await this.moveToNextLine(newState); + } + }); + }); + } + + async actionSetAsChecked(){ + await this.execProtectedBankRecAction(async () => { + await this.withNewState(async (newState) => { + const data = await this.onchange(newState, "set_as_checked"); + const result = data.return_todo_command; + if(result.done && data.state === "reconciled"){ + await this.moveToNextLine(newState); + }else{ + await this.model.root.load(); + newState.__kanbanNotify = true; + } + }); + }); + } + + async actionAddNewAml(amlId){ + await this.execProtectedBankRecAction(async () => { + await this.withNewState(async (newState) => { + await this.onchange(newState, "add_new_aml", [amlId]); + }); + }); + } + + async actionRemoveNewAml(amlId){ + await this.execProtectedBankRecAction(async () => { + await this.withNewState(async (newState) => { + await this.onchange(newState, "remove_new_aml", [amlId]); + }); + }); + } + + async _actionMountLineInEdit(newState, line){ + const data = newState.bankRecRecordData; + const currentLineIndex = data.form_index; + if(line.data.index != currentLineIndex){ + // Mount the line in edition on the form. + await this.onchange(newState, "mount_line_in_edit", [line.data.index]); + } + + if(newState.bankRecNotebookPage !== "manual_operations_tab"){ + newState.bankRecNotebookPage = "manual_operations_tab"; + } + } + + async actionMountLineInEdit(line){ + await this.execProtectedBankRecAction(async () => { + await this.withNewState(async (newState) => { + await this._actionMountLineInEdit(newState, line); + }); + }); + } + + async actionMountLastLineInEdit(){ + await this.execProtectedBankRecAction(async () => { + await this.withNewState(async (newState) => { + const data = newState.bankRecRecordData; + const line = data.line_ids.records.at(-1); + await this._actionMountLineInEdit(newState, line); + }); + }); + } + + async postprocessLineChangedReturnTodoCommand(newState, data) { + const todo = data.return_todo_command; + if(!todo){ + return; + } + if(todo.reset_record){ + await this.model.root.load(); + newState.__kanbanNotify = true; + } + if(todo.reset_global_info){ + await this.updateJournalState(newState, data); + } + } + + async actionLineChanged(fieldName){ + await this.execProtectedBankRecAction(async () => { + const line = this.getBankRecRecordLineInEdit(); + await this.withNewState(async (newState) => { + if(line){ + const data = await this.onchange(newState, "line_changed", [line.data.index, fieldName]); + await this.postprocessLineChangedReturnTodoCommand(newState, data); + } + }); + }); + } + + async actionSetPartnerReceivableAccount(){ + await this.execProtectedBankRecAction(async () => { + const line = this.getBankRecRecordLineInEdit(); + await this.withNewState(async (newState) => { + if(line){ + const data = await this.onchange(newState, "line_set_partner_receivable_account", [line.data.index]) + await this.postprocessLineChangedReturnTodoCommand(newState, data); + } + }); + }); + } + + async actionSetPartnerPayableAccount(){ + await this.execProtectedBankRecAction(async () => { + const line = this.getBankRecRecordLineInEdit(); + await this.withNewState(async (newState) => { + if(line){ + const data = await this.onchange(newState, "line_set_partner_payable_account", [line.data.index]) + await this.postprocessLineChangedReturnTodoCommand(newState, data); + } + }); + }); + } + + async actionRedirectToSourceMove(line){ + await this.execProtectedBankRecAction(async () => { + await this.withNewState(async (newState) => { + const { return_todo_command: actionData } = await this.onchange(newState, "redirect_to_move", [line.data.index]) + if(actionData){ + this.action.doAction(actionData); + } + }); + }); + } + + async actionApplyLineSuggestion(){ + await this.execProtectedBankRecAction(async () => { + const line = this.getBankRecRecordLineInEdit(); + await this.withNewState(async (newState) => { + if(line){ + await this.onchange(newState, "apply_line_suggestion", [line.data.index]) + } + }); + }); + } + + async handleLineClicked(ev, line){ + const lineIndexBeforeClick = this.state.bankRecRecordData.form_index; + await this.actionMountLineInEdit(line); + + let clickedColumn = null; + const target = ev.target.tagName === "TD" ? ev.target : ev.target.closest("td"); + if (target?.attributes && target.attributes.field) { + clickedColumn = target.attributes.field.value; + } + + // Track the clicked column to focus automatically the corresponding field on the manual operations page. + // In case we did not change the selected line we directly focus the corresponding field. + if(clickedColumn){ + if(lineIndexBeforeClick === line.data.index) { + this.focusManualOperationField(clickedColumn); + this.state.bankRecClickedColumn = null; + } else { + this.state.bankRecClickedColumn = clickedColumn; + } + } + } + + async handleSuggestionHtmlClicked(ev){ + if (ev.target.tagName === "BUTTON"){ + const buttonName = ev.target.attributes && ev.target.attributes.name ? ev.target.attributes.name.value : null; + if (!buttonName) { + return; + } + + if (buttonName === "action_redirect_to_move"){ + const line = this.getBankRecRecordLineInEdit(); + await this.actionRedirectToSourceMove(line); + } else if (buttonName === "action_apply_line_suggestion"){ + await this.actionApplyLineSuggestion(); + } + } + } + +} + +export class BankRecKanbanRenderer extends KanbanRenderer { + static template = "account.BankRecKanbanRenderer"; + static components = { + ...KanbanRenderer.components, + KanbanRecord: BankRecKanbanRecord, + RainbowMan, + BankRecFinishButtons, + BankRecGlobalInfo, + BankRecQuickCreate, + }; + setup() { + super.setup(); + this.globalState = useState(this.env.methods.getState()); + this.action = useService("action"); + } + + /** + Prepares a list of statements based on the statement_id of the bank statement line records. + Statements are only displayed above the first line of the statement (all lines might not be visible in the kanban) + **/ + groups() { + const { list } = this.props; + let statementGroups = []; + for (const record of list.records) { + let lastItem = statementGroups.slice(-1); + let statementId = record.data.statement_id && record.data.statement_id[0]; + if (statementId && (!lastItem.length || lastItem[0].id != statementId)) { + statementGroups.push({ + id: statementId, + name: record.data.statement_name, + balance: formatMonetary(record.data.statement_balance_end_real, {currencyId: record.data.currency_id[0]}), + }); + } + } + return statementGroups; + } + + openStatementDialog(statementId) { + const action = { + type: "ir.actions.act_window", + res_model: "account.bank.statement", + res_id: statementId, + views: [[false, "form"]], + target: "current", + context: { + form_view_ref: "odex30_account_accountant.view_bank_statement_form_bank_rec_widget", + }, + }; + + this.action.doAction(action); + } + + // ----------------------------------------------------------------------------- + // QUICK CREATE CALLBACKS + // ----------------------------------------------------------------------------- + + /** + Overriden. + **/ + cancelQuickCreate() { + this.globalState.quickCreateState.isVisible = false; + } + + /** + Overriden. + **/ + validateQuickCreate(_recordId, mode) { + this.globalState.quickCreateState.model.load() + if (mode === "add_close") { + this.globalState.quickCreateState.isVisible = false; + } + } +} + +export const BankRecKanbanView = { + ...kanbanView, + Controller: BankRecKanbanController, + Renderer: BankRecKanbanRenderer, + searchMenuTypes: ["filter", "favorite"], +}; + +registry.category("views").add('bank_rec_widget_kanban', BankRecKanbanView); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.scss b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.scss new file mode 100644 index 0000000..9942d7e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.scss @@ -0,0 +1,286 @@ +.o_bank_rec_main_div { + display: flex; + background-color: $o-view-background-color; + width: 100%; + height: 100%; + + .o_form_view.o_xxl_form_view.o_view_controller .o_form_view_container { + width: 100%; + } + + .o_kanban_renderer { + border-top: 0; + } + + .o_bank_rec_kanban_div{ + width: 30%; + height: 100%; + position: relative; + overflow: auto; + padding: 0; + margin: 0; + --KanbanRecord-padding-h: #{$o-kanban-inside-hgutter * 1.5}; + --KanbanRecord-padding-v: #{$o-kanban-inside-vgutter}; + --KanbanRecord-margin-h: #{$o-kanban-record-margin}; + + .o_reward { + .o_reward_rainbow_man { + top: -25% !important; + } + } + + .journal-balance { + margin: 0px var(--KanbanRecord-margin-h) -1px; + padding: $o-kanban-inside-vgutter calc(var(--KanbanRecord-padding-h)); + min-height: $o-statbutton-height; + } + + .kanban-statement { + margin: 0px var(--KanbanRecord-margin-h) -1px; + padding: $o-kanban-inside-vgutter calc(var(--KanbanRecord-padding-h)); + .kanban-statement-subline { + border: none; + font-size: 16px; + padding: 16px 0 0 0; + } + } + + .o_bank_rec_st_line{ + margin: 0px var(--KanbanRecord-margin-h) (-$border-width) !important; + align-items: center; + + &:hover { + .statement_separator .btn-sm { + opacity: 100; + } + } + + &.o_bank_rec_selected_st_line { + background-color: var(--table-bg); + } + + .statement_separator { + position: absolute; + height: 4px; + margin: 0; + padding: 2px 0 0 0; + border: 0; + z-index: 2; + background-color: transparent; + + .btn-sm { + position: relative; + padding-top: 0; + padding-bottom: 0; + top: -21px; + opacity: 0; // display: none doesn't work with tour + } + } + } + } + + .o_bank_rec_right_div { + flex: 1 1 70%; + width: 70%; + border-left: 1px solid $border-color; + height: 100%; + position: relative; + overflow: auto; + + .o_content{ + .o_form_nosheet{ + padding-left: 0 !important; + padding-right: 0 !important; + + .row { + margin-left: 0 !important; + margin-right: 0 !important; + } + + table tr td:first-child, table th:first-child { + padding-left: 10px; + } + + .o_list_table { + --ListRenderer-thead-padding-y: #{$table-cell-padding-y-sm}; + th { + border-left: none !important; + } + } + + .o_bank_rec_stats_buttons{ + display: flex; + flex-flow: row nowrap; + margin-top: -$o-sheet-vpadding; + white-space: nowrap; + border-bottom: 1px solid $border-color; + height: fit-content; + min-height: $o-statbutton-height; + + .o_bank_rec_stats_buttons_aside_left{ + flex-grow: 0; + display: flex !important; + flex-flow: row nowrap; + border-right: 1px solid $border-color; + + .btn { + margin-right: $o-statbutton-spacing; + } + } + + .o_bank_rec_stats_buttons_aside_right{ + width: 100%; + overflow: auto; + overflow-y: hidden; + justify-content: right; + flex-grow: 1; + margin: 0px !important; + + .available_reco_model_ids { + margin-bottom: 0; + width: 100%; + height: 100%; + display: flex; + justify-content: flex-end; + + .o_bank_rec_reco_models_widget_div{ + display: flex; + flex-wrap: wrap; + height: 100%; + width: 100%; + flex: 1 0; + justify-content: flex-end; + + .recon_model_button { + flex: 0 1 auto; + } + } + + .bank_rec_reco_model_dropdown { + display: flex; + flex-shrink: 0; + } + } + } + } + + .bank_rec_widget_form_discuss_anchor, .bank_rec_widget_form_transaction_details_anchor{ + padding: 0 20px; + } + + .o_form_label { + text-wrap: nowrap; + } + } + + .o_notebook { + --notebook-margin-x: 0 !important; + } + } + } +} +@include media-breakpoint-down(md) { + .o_bank_rec_widget_kanban_view { + --ControlPanel-border-bottom: initial; + } + + .o_bank_rec_main_div { + .o_bank_rec_kanban_div { + --KanbanRecord-margin-h: #{-$border-width}; + } + + .o_bank_rec_kanban_div, .o_bank_rec_right_div { + flex: 1 0 95vw; + } + } +} + +@include media-only(print) { + .o_bank_rec_widget_kanban_view .o_control_panel { + margin-bottom: $border-width; + } +} + +.o_bank_rec_liquidity_line{ + font-weight: bold; +} + +.o_bank_rec_auto_balance_line{ + color: $text-muted; +} + +.o_bank_rec_lines_widget_table{ + th{ + border-top: none; + } +} + +.o_bank_rec_model_button{ + margin: 3px; +} + +.o_bank_rec_selected_line > td { + background-color: var(--table-bg) !important; +} + +.o_bank_rec_expanded_line{ + border-bottom: transparent; + td { + padding-bottom: 0; + } +} + +.o_bank_rec_second_line { + td { + padding-top: 0; + padding-bottom: 1rem; + } + .o_form_uri { + cursor: pointer; + } +} + +.o_bank_rec_quick_create { + .o_form_renderer.o_form_nosheet.o_form_editable.d-block { + padding: 0; + } + + &.o_form_view { + height: auto; + } + + &.o_kanban_record > div:not(.o_dropdown_kanban) { + height: auto; + } + + .o_inner_group { + display: flex; + + .o_cell:first-child { + input,span { + font-weight: bold; + } + } + + .o_cell:nth-child(2) { + input { + font-style: italic; + } + } + } + + .o_wrap_field > :first-child { + flex: 0 0 27%; + } + + .o_inner_group > .o_wrap_field:first-child > :first-child { + flex: 0 0 17%; + } +} + +@media (min-width: 768px) { + .o_bank_rec_quick_create.o_form_view { + height: auto; + min-height: auto; + } +} diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.xml b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.xml new file mode 100644 index 0000000..757adb4 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/kanban.xml @@ -0,0 +1,75 @@ + + + + + + + 'o_bank_rec_main_div overflow-auto' + + +
    + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + +
    +
    +
    +
    + +
    diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/list.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/list.js new file mode 100644 index 0000000..643aea9 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/list.js @@ -0,0 +1,37 @@ +/** @odoo-module */ + +import { registry } from "@web/core/registry"; +import { listView } from "@web/views/list/list_view"; +import { ListController } from "@web/views/list/list_controller"; + +import { useChildSubEnv } from "@odoo/owl"; + +export class BankRecListController extends ListController { + + setup() { + super.setup(...arguments); + + this.skipKanbanRestore = {}; + + useChildSubEnv({ + skipKanbanRestoreNeeded: (stLineId) => this.skipKanbanRestore[stLineId], + }); + } + + /** + * Override + * Don't allow bank_rec_form to be restored with previous values since the statement line has changed. + */ + async onRecordSaved(record) { + this.skipKanbanRestore[record.resId] = true; + return super.onRecordSaved(...arguments); + } + +} + +export const bankRecListView = { + ...listView, + Controller: BankRecListController, +} + +registry.category("views").add("bank_rec_list", bankRecListView); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/list_view_switcher.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/list_view_switcher.js new file mode 100644 index 0000000..0e08a60 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/list_view_switcher.js @@ -0,0 +1,39 @@ +/** @odoo-module **/ + +import { _t } from "@web/core/l10n/translation"; +import { registry } from "@web/core/registry"; +import { useService } from "@web/core/utils/hooks"; +import { standardFieldProps } from "@web/views/fields/standard_field_props"; +import { Component } from "@odoo/owl"; + +export class ListViewSwitcher extends Component { + static template = "odex30_account_accountant.ListViewSwitcher"; + static props = standardFieldProps; + + setup() { + this.action = useService("action"); + } + + /** Called when the Match/View button is clicked. **/ + switchView() { + // Add a new search facet to restrict the results to the selected statement line. + const searchItem = Object.values(this.env.searchModel.searchItems).find((i) => i.fieldName === "statement_line_id"); + const stLineId = this.props.record.resId; + const autocompleteValue = { + label: this.props.record.data.move_id[1], + operator: "=", + value: stLineId, + } + this.env.searchModel.addAutoCompletionValues(searchItem.id, autocompleteValue); + + // Switch to the kanban. + this.action.switchView("kanban", { skipRestore: this.env.skipKanbanRestoreNeeded(stLineId) }); + } + + /** Give the button's label for the current record. **/ + get buttonLabel() { + return this.props.record.data.is_reconciled ? _t("View") : _t("Match"); + } +} + +registry.category("fields").add('bank_rec_list_view_switcher', {component: ListViewSwitcher}); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/list_view_switcher.xml b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/list_view_switcher.xml new file mode 100644 index 0000000..8a4ae88 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/list_view_switcher.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/many2one_field_multi_edit.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/many2one_field_multi_edit.js new file mode 100644 index 0000000..9c5011b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/many2one_field_multi_edit.js @@ -0,0 +1,21 @@ +/** @odoo-module **/ +import { registry } from "@web/core/registry"; +import { Many2OneField, many2OneField } from "@web/views/fields/many2one/many2one_field"; + +export class BankRecMany2OneMultiID extends Many2OneField { + + get Many2XAutocompleteProps() { + const props = super.Many2XAutocompleteProps; + if (this.props.record.selected && this.props.record.model.multiEdit) { + props.context.active_ids = this.env.model.root.selection.map((r) => r.resId); + } + return props; + } +} + +export const bankRecMany2OneMultiID = { + ...many2OneField, + component: BankRecMany2OneMultiID, +}; + +registry.category("fields").add("bank_rec_list_many2one_multi_id", bankRecMany2OneMultiID); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/monetary_field_auto_signed_amount.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/monetary_field_auto_signed_amount.js new file mode 100644 index 0000000..37c01fe --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/monetary_field_auto_signed_amount.js @@ -0,0 +1,38 @@ +/** @odoo-module **/ +import { MonetaryField, monetaryField } from "@web/views/fields/monetary/monetary_field"; + +export class BankRecMonetaryField extends MonetaryField{ + static template = "odex30_account_accountant.BankRecMonetaryField"; + static props = { + ...MonetaryField.props, + hasForcedNegativeValue: { type: Boolean }, + }; + + /** Override **/ + get inputOptions(){ + const options = super.inputOptions; + const parse = options.parse; + options.parse = (value) => { + let parsedValue = parse(value); + if (this.props.hasForcedNegativeValue) { + parsedValue = -Math.abs(parsedValue); + } + return parsedValue; + }; + return options; + } + + /** Override **/ + get value() { + let value = super.value; + if(this.props.hasForcedNegativeValue){ + value = Math.abs(value); + } + return value; + } +} + +export const bankRecMonetaryField = { + ...monetaryField, + component: BankRecMonetaryField, +}; diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/monetary_field_auto_signed_amount.xml b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/monetary_field_auto_signed_amount.xml new file mode 100644 index 0000000..651e62d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/monetary_field_auto_signed_amount.xml @@ -0,0 +1,17 @@ + + + + + + - + + + + - + + + - + + + + diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/rainbowman_content.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/rainbowman_content.js new file mode 100644 index 0000000..3eed2dc --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/rainbowman_content.js @@ -0,0 +1,19 @@ +/** @odoo-module **/ +import { BankRecFinishButtons } from "./finish_buttons"; +import { Component, onMounted, onWillUnmount } from "@odoo/owl"; + +export class BankRecRainbowContent extends Component { + static template = "odex30_account_accountant.BankRecRainbowContent"; + static components = { BankRecFinishButtons }; + static props = {}; + + setup() { + onWillUnmount(() => { + this.env.methods.initReconCounter(); + }); + onMounted(() => { + document.querySelector(".o_reward").style.pointerEvents = "none"; + document.querySelector(".o_reward_msg").style.pointerEvents = "auto"; + }); + } +} diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/rainbowman_content.xml b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/rainbowman_content.xml new file mode 100644 index 0000000..69d619f --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/rainbowman_content.xml @@ -0,0 +1,13 @@ + + + + +

    Congrats, you're all done!

    +

    You reconciled transactions in transaction in . + +
    That's on average seconds per transaction. +
    +

    + +
    +
    diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/view_embedder.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/view_embedder.js new file mode 100644 index 0000000..3cfaf1d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/view_embedder.js @@ -0,0 +1,18 @@ +/** @odoo-module */ +import { View } from "@web/views/view"; +import { Component, useSubEnv } from "@odoo/owl"; + +export class BankRecViewEmbedder extends Component { + static props = ["viewProps"]; + static template = "odex30_account_accountant.BankRecViewEmbedder"; + static components = { View }; + + setup() { + // Little hack while better solution from framework js. + // Reset the config, especially the ControlPanel which was coming from a parent form view. + // It also reset the view switchers which was necessary to make them disappear. + useSubEnv({ + config: {...this.env.methods}, + }); + } +} diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/view_embedder.xml b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/view_embedder.xml new file mode 100644 index 0000000..6a782e3 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/bank_reconciliation/view_embedder.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/export_data_dialog/export_data_dialog.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/export_data_dialog/export_data_dialog.js new file mode 100644 index 0000000..fa72931 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/export_data_dialog/export_data_dialog.js @@ -0,0 +1,35 @@ +/** @odoo-module **/ + +import { patch } from "@web/core/utils/patch"; +import { rpc } from "@web/core/network/rpc"; +import { ExportDataDialog } from "@web/views/view_dialogs/export_data_dialog"; + +patch(ExportDataDialog.prototype, { + async fetchFields(value) { + await super.fetchFields(value); + + const analyticLineIdsField = this.knownFields['analytic_line_ids']; + if (analyticLineIdsField) { + // If analytic_distribution field is here, we remove it to replace it by the new fields + this.state.exportList = this.state.exportList.filter( + (field) => field.id !== 'analytic_distribution' + ); + const analyticLineFields = await rpc("/web/export/get_fields", { + model: analyticLineIdsField.params.model, + prefix: analyticLineIdsField.params.prefix, + parent_name: analyticLineIdsField.params.parent_field.string, + import_compat: analyticLineIdsField.default_export, + parent_field_type: analyticLineIdsField.params.parent_field.type, + domain:[], + }); + // We exclude auto_account_id as it's a magic field who doesn't need to be exported + const filteredAnalyticLineFields = analyticLineFields.filter( + (field) => field.params?.model === 'account.analytic.account' + && !field.id.includes('auto_account_id') + || field.id === 'analytic_line_ids/amount' + ); + + this.state.exportList.push(...filteredAnalyticLineFields); + } + }, +}); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/matching_link_widget/matching_link_widget.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/matching_link_widget/matching_link_widget.js new file mode 100644 index 0000000..d45a9f7 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/matching_link_widget/matching_link_widget.js @@ -0,0 +1,47 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { useService } from "@web/core/utils/hooks"; +import { standardFieldProps } from "@web/views/fields/standard_field_props"; +import { Component } from "@odoo/owl"; + +class MatchingLink extends Component { + static props = { ...standardFieldProps }; + static template = "odex30_account_accountant.MatchingLink"; + + setup() { + this.orm = useService("orm"); + this.action = useService("action"); + } + + async reconcile() { + this.action.doAction("odex30_account_accountant.action_move_line_posted_unreconciled", { + additionalContext: { + search_default_partner_id: this.props.record.data.partner_id[0], + search_default_account_id: this.props.record.data.account_id[0], + }, + }); + } + + async viewMatch() { + const action = await this.orm.call("account.move.line", "open_reconcile_view", [this.props.record.resId], {}); + this.action.doAction(action, { additionalContext: { is_matched_view: true } }); + } + + get colorCode() { + const matchValue = this.props.record.data[this.props.name]; + const matchColorValue = matchValue.replace('P', ''); + if (matchColorValue === '*') { + // reserve color code 0 for multi partial matches + return 0; + } else { + // there is 12 available color palette for 'o_tag_color_*' + // since the color code 0 has been reserved by 'P*', we can only use color codes between 1 and 11 + return parseInt(matchColorValue) % 11 + 1; + } + } +} + +registry.category("fields").add("matching_link_widget", { + component: MatchingLink, +}); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/matching_link_widget/matching_link_widget.xml b/dev_odex30_accounting/odex30_account_accountant/static/src/components/matching_link_widget/matching_link_widget.xml new file mode 100644 index 0000000..07f52d7 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/matching_link_widget/matching_link_widget.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/attachment_view_move_line.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/attachment_view_move_line.js new file mode 100644 index 0000000..9e0db1b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/attachment_view_move_line.js @@ -0,0 +1,17 @@ +import { AttachmentView } from "@mail/core/common/attachment_view"; +import { onMounted } from "@odoo/owl"; +import { useBus } from "@web/core/utils/hooks"; + +export class AttachmentViewMoveLine extends AttachmentView { + static props = [...AttachmentView.props, "openInPopout"]; + static components = { AttachmentView }; + + setup() { + super.setup(); + if (this.props.openInPopout) { + onMounted(this.onClickPopout); + } + + useBus(this.uiService.bus, "resize", () => this.env.setPopout(false)); + } +} diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/move_line_list.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/move_line_list.js new file mode 100644 index 0000000..d5f9bf9 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/move_line_list.js @@ -0,0 +1,125 @@ +import { AttachmentViewMoveLine } from "./attachment_view_move_line"; + +import { registry } from "@web/core/registry"; +import { useService } from "@web/core/utils/hooks"; +import { listView } from "@web/views/list/list_view"; +import { ListRenderer } from "@web/views/list/list_renderer"; +import { ListController } from "@web/views/list/list_controller"; +import { SIZES } from "@web/core/ui/ui_service"; +import { useChildSubEnv, useState } from "@odoo/owl"; +import { makeActiveField } from "@web/model/relational_model/utils"; + +export class AccountMoveLineListController extends ListController { + static template = "odex30_account_accountant.MoveLineListView"; + static components = { + ...ListController.components, + AttachmentViewMoveLine, + }; + setup() { + super.setup(); + /** @type {import("@mail/core/common/store_service").Store} */ + this.store = useState(useService("mail.store")); + this.ui = useState(useService("ui")); + this.mailPopoutService = useState(useService("mail.popout")); + this.attachmentPreviewState = useState({ + displayAttachment: + localStorage.getItem("account.move_line_pdf_previewer_hidden") !== "false", + selectedRecord: false, + thread: null, + }); + this.popout = useState({ active: false }); + + useChildSubEnv({ + setPopout: this.setPopout.bind(this), + }); + + // We need to override the openRecord from ListController since it does things we do not want like opening the default form view + this.openRecord = () => {} + } + + get previewEnabled() { + return ( + !this.env.searchModel.context.disable_preview && + (this.ui.size >= SIZES.XXL || this.mailPopoutService.externalWindow) + ); + } + + get modelParams() { + const params = super.modelParams; + params.config.activeFields.move_attachment_ids = makeActiveField(); + params.config.activeFields.move_attachment_ids.related = { + fields: { + mimetype: { name: "mimetype", type: "char" }, + }, + activeFields: { + mimetype: makeActiveField(), + }, + }; + return params; + } + + togglePreview() { + this.attachmentPreviewState.displayAttachment = + !this.attachmentPreviewState.displayAttachment; + localStorage.setItem( + "account.move_line_pdf_previewer_hidden", + this.attachmentPreviewState.displayAttachment + ); + } + + setPopout(value) { + + if (this.attachmentPreviewState.thread?.attachmentsInWebClientView.length) { + this.popout.active = value; + } + } + + setSelectedRecord(accountMoveLineData) { + this.attachmentPreviewState.selectedRecord = accountMoveLineData; + this.setThread(this.attachmentPreviewState.selectedRecord); + } + + async setThread(accountMoveLineData) { + if (!accountMoveLineData || !accountMoveLineData.data.move_attachment_ids.records.length) { + this.attachmentPreviewState.thread = null; + return; + } + const thread = this.store.Thread.insert({ + attachments: accountMoveLineData.data.move_attachment_ids.records.map((attachment) => ({ + id: attachment.resId, + mimetype: attachment.data.mimetype, + })), + id: accountMoveLineData.data.move_id[0], + model: accountMoveLineData.fields["move_id"].relation, + }); + if (!thread.mainAttachment && thread.attachmentsInWebClientView.length > 0) { + thread.update({ mainAttachment: thread.attachmentsInWebClientView[0] }); + } + this.attachmentPreviewState.thread = thread; + } +} + +export class AccountMoveLineListRenderer extends ListRenderer { + static props = [...ListRenderer.props, "setSelectedRecord?"]; + onCellClicked(record, column, ev) { + this.props.setSelectedRecord(record); + super.onCellClicked(record, column, ev); + } + + findFocusFutureCell(cell, cellIsInGroupRow, direction) { + const futureCell = super.findFocusFutureCell(cell, cellIsInGroupRow, direction); + if (futureCell) { + const dataPointId = futureCell.closest("tr").dataset.id; + const record = this.props.list.records.filter((x) => x.id === dataPointId)[0]; + this.props.setSelectedRecord(record); + } + return futureCell; + } +} +export const AccountMoveLineListView = { + ...listView, + Renderer: AccountMoveLineListRenderer, + Controller: AccountMoveLineListController, +}; + +registry.category("views").add("account_move_line_list", AccountMoveLineListView); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/move_line_list.scss b/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/move_line_list.scss new file mode 100644 index 0000000..0b845c8 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/move_line_list.scss @@ -0,0 +1,68 @@ +.o_move_line_list_view { + &.o_view_controller > .o_content { + overflow: hidden; + display: flex; + .o_list_renderer { + @include media-only(screen) { + overflow: auto; + height: 100%; + flex: 1 1 100%; + } + } + } + + .o_attachment_preview { + height: 100%; + width: 40%; + border-left: $border-width solid $border-color; + + .o_attachment_control.toggle { + border-radius: 0 30px 30px 0; + padding: 15px 15px 15px 5px; + &::after { + color: white; + content: '>>'; + } + } + + &.hidden { + width: 0; + .o_attachment_control.toggle { + right: 0; + border-radius: 30px 0 0 30px; + padding: 15px 0 15px 15px; + &::after { + content: '<'; + } + &:hover { + padding-right: 5px; + ::after { + content: '<<'; + } + } + } + } + } + + .o_popout_icon { + position: absolute; + top: 8%; + background-color: black; + opacity: 0.3; + margin-top: -15px; + transition: all 0.3s; + z-index: $zindex-dropdown; + right: 0; + border-radius: 30px 0 0 30px; + padding: 15px 0 15px 15px; + &:hover { + padding-right: 15px; + } + } + + @include media-only(print) { + .o_search_panel { + display: none; + } + } +} diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/move_line_list.xml b/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/move_line_list.xml new file mode 100644 index 0000000..0505f08 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list/move_line_list.xml @@ -0,0 +1,52 @@ + + + + + + + + + this.setSelectedRecord + + + + + + + +
    + + + + + +

    Choose a line to preview its attachments.

    +
    + +

    No attachments linked.

    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    +
    + + diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list_reconcile/move_line_list_reconcile.js b/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list_reconcile/move_line_list_reconcile.js new file mode 100644 index 0000000..ceadab6 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list_reconcile/move_line_list_reconcile.js @@ -0,0 +1,48 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { useSubEnv } from "@odoo/owl"; +import { AccountMoveLineListController, AccountMoveLineListRenderer, AccountMoveLineListView } from "../move_line_list/move_line_list"; + + +export class AccountMoveLineReconcileListController extends AccountMoveLineListController { + + setup() { + super.setup(); + useSubEnv({ + callAutoReconcileAction: this.openAutoReconcileWizard.bind(this), + }); + } + + openAutoReconcileWizard(group=null) { + if (group) { + return this.actionService.doAction("odex30_account_accountant.action_open_auto_reconcile_wizard", { + additionalContext: { + domain: group.list.domain, + } + }); + } else { + return this.actionService.doAction("odex30_account_accountant.action_open_auto_reconcile_wizard"); + } + } +} + +export class AccountMoveLineReconcileListRenderer extends AccountMoveLineListRenderer { + + static groupRowTemplate = "odex30_account_accountant.AccountMoveLineReconcileGroupRow"; + + setup() { + super.setup(); + this.props.list.groups?.map(group => this.toggleGroup(group)); // unfold the first groups (account_id) + } + +} + +export const AccountMoveLineReconcileLineListView = { + ...AccountMoveLineListView, + Controller: AccountMoveLineReconcileListController, + Renderer: AccountMoveLineReconcileListRenderer, + buttonTemplate: "odex30_account_accountant.ListViewReconcile.Buttons", +} + +registry.category("views").add("account_move_line_reconcile_list", AccountMoveLineReconcileLineListView); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list_reconcile/move_line_list_reconcile.xml b/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list_reconcile/move_line_list_reconcile.xml new file mode 100644 index 0000000..770a72a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/src/components/move_line_list_reconcile/move_line_list_reconcile.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_accountant/static/src/img/accounting-bulk.gif.gif b/dev_odex30_accounting/odex30_account_accountant/static/src/img/accounting-bulk.gif.gif new file mode 100644 index 0000000000000000000000000000000000000000..55f247e92beb0a6867129917eebb2f8bba519b53 GIT binary patch literal 96904 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

    d9R~x{Y|K7In|=??Fu@LH z+la+`zWErmP(QM+CV?+E{}M@3tP>$fVOtbOczQf;Bvv!>L|I_LVl!FizRrT~L!%2O zW$jx!TWJU@cB>f4V2rTC8CSlY%9?*8>?9RyDY`7$?&Rn^Z8Hk@I@{aH)!S!hQw*fA zW6N_R7-Pwe5Z-6YjJkciS=1+Kw^uADuUuY`?y+whoEbj0TUwO5Z&+NQJho9((z4I- z=vepKXrrul(XLVrXS3pM9?p32%Ud~hgREz5b-G_Pmx$obZ) zvRc~C{otq-9nM)pvzluExox*ZrKbJxe&y#*bPMOR#^XitFWtS1S3GZiE>=A2_=WX; zzh?vPz=uHx80+1^7IApo_fd?izL>}}MmvG3Rru@Bgp}Xca2^+~2FL4dS+bGgxTfUGEIasmHJLjO$DvnUM;%-J6}PxI*Zc&o zS=~Mca*jBoLn)muK1H(DT&%~6e7@L7P~f@TOxAb0+)B5ux!lh7{Cv5S7s2ymwV|o)4x8RNT^+UU)Leb;I{$q21%=J~^LT*r+0U;dthGPCO^AH? zc`~iQ`|EUG|JkqaOV+i&&fa@|`E`zt;Qf8EnfC1W{v6YTWAsmQ4!IW&u>PCTZ4ikD@;P)1)G3W3AWyG@clJu{y#~M_)Nki}e zMcK8r+Q~Gzd0>DKEG{Lwo1ONc`gFx)y5NrTAG(?sF9*H9ZjljmjC4)&PBoV?$ zGt=SZVL6Gxz=F`?G`!LrVvMu^#U-jOX(|r|L0(1{frI}1CO?1-W8q+aa}j|2bLFuA zr6q&0@wBJ_$p3KV2-p=xYUG0%X#dfYvFP0~ApgPWFd2=%uAC@BJ$T^VUNAO^j?*6t zM-JzfZ`TEqUM3VrreaqU%&7Y9mlG0|(;hXu(CBjX2Tmvcf34*!6V^{q%;7 zzqDkb;Ps)GMqWXiuQcS@nd6oDy_K;Htjf1iF&55Nnprse_CH#(VF{gM)7}SiO_K~% zw)@SM_=lJziGPP$daUP~mCCjluhB<3Y4lbulEk<@GNE@*bCs zNLN%9bd>DdR%eyuh2k>uDF+fQ^K|qQDeBN8TMg+y$pQ^AQPX?1HpM)m_q^K~Q-=Kp#{Z;Sx&H$DtVtkY@T+2UfzXCnaGH zMAZ*#2l|2D0Lz5rT4Uw2zY)Xby8JfC!n!6$#4M7XmbR zseu|g5yO|*a6I@ej!SfWDBk)?+vzeGm-Ds9u1?7Dy%!t$nr8*uxdHcK+c9gRr-OEq zg1y+5kKEw$h{w_-bnZleHS9Vgpz!qFCoXwUHk3bH?5EX|kR83?gqgj87(D2x=km>0 zPA}O;hJs;)&fK^kFDP{H>lCT^m%DweMMu1;zB~5(HyAy6_C$l}AQ}U?$Jpcy5K|oW^!ukmQeo9k)(W;Y z!Y+vk0Q?h_`0ZhkHA7XL4=U)o&7lXk$?{-Mf)>3iySy>vs(@#HYorR~aueN}7IVgA z6hTjWehKEoM4hFnDZ?Q2*-lB+Na<@qZ_t*1ZRD|XAl#{x7xr2;4xs^}I^3YQlkd12ZvqXYqYAp!zYxSQ!T$u{n>RFj zdClYJbDTM}Nyh(b4;;urg46dS_lp%fh+mP=7vJBeMK5reIWjRz(O}my%AL+V zPAw1cCv|FRdEA=^3 z=9)XcSBpY9O?H&u9X2=DcugKuZ5oxm`SHCr5WmU{+n()Fex7sW!zv5P@ueZLv-*U% zDoa+C3UGYF7o4#mGd_jleGco;~#(jIPU=v z)CFRzqCw}B_lbkQ#F!1BvBWQWiQ?-*Syey5jW7DBrs~2)CO+ZziwH+V*G4L+u9IY4 z46v!yN9#|lQ*>So^2OK3X!A$YL|hDsPGL~G6C1a$E{2f=4G9sdn+&T<3Lu<+KAMC8 zt~_8Q;1+-x^U=HxWC#uk4GWKm3?%^ZU`4$Q11ZTXfv6J_I4P9ql$5CA(<9mC*|999UD=(9|5-T3g>p*w;TWI7t1bosI)*XljTa(pFCwj7`79_I9eM zN8zIqgpGCi-S*DzTHQw(WqCyYxgRx!!#O0}G}q@ z7&0#PHVLUf6{%?4cMv|seRSqj9wd3-35lF)OabUE_fHTDUNOhd_$DIPB3V6m<6%|y zRU|NqLq3a*Ueeyl9-H1kQ&E6Fjc1Jc)*`#6bNql(4?G#qiSuFP$10WRY)0*Um+luk z$hIr9dyR7Ll)~NnbR_hWcnVzUh=^GfB_rJYiGA2re-9)a z2USgre+H7jcA$f52!s<=J1{2Z@OP#}c-0QxE8kgBJuLqSW0A z#TrT#M!b2*DIzKkmdMvetqoy*BrA0KEFB6#Tb3WgNk~93y=c9mipOMQG?(?2c9c3iv0n zM-}!V|I?&GkZtTH1@=r?}f7Y5hcO>0jz2ML1n+~$YD?(r^ zjlgO&xiVFlvdm@`3IyvC5@L&(Slc^fhFDe7bqJSkD~+o8e0!Cboyn|}I?7mY{VEXi z7wV6W=~+zrq;VCq&xI)KuY5~w3*BT>Vjnl8347I!SHc%T-EZo_>eVd)=ZhMhuo827 z#>s}n3J(wRg-)iwm$G6{Y*5X8igwZv08}EJ0hDBj6t5?NYp+MAJmgA;dp1XcnZfW`G(t#a$YijNNjdapDS-S8PCP*(bO z_cF-o&F9x$6Q%cWjjC5IBVrWN+2$C2fFO8gfV*B&I8{SHjkQCd(nye;=a}}axlW<@ zMw!9`npY0n+8NBv)G!9SAl*xVC5D|gt9A@xyg*wa0KE%LMC?`HPb_-e%(n zm5cXpdo=B-JZyMr%}%t8=UgI$ONA`IF6zDGC=8~bKtk%>$|v=X0r!eOy`+O73CH&I z`_yy*Jc9sIEFS<7BoOP_QwIoBLNKXLDgYJ-1l@NIgvL@-dh6~^-bd?$ArxTqxN3(m z;l+mQZ_l%B9&#$mL@UYt2uEZrP~$UYHde8p0XSi4#rNe_zzBpEZ~FUtP_y#=OzoN} zpwc)CuX&4`tRrtXTv&SN0C1?+3H%@#l1ZKCjFWugi~b?jKF7TG!p*ev zQJTQ4W86W>)mn;jxY*35x^g35~e-WY^5)!L-|1ndDR1oB%@C6bRsP__#5QM%b z4SV5Ap`|FS9v-Tm(zoko)TtnPpLR7tzjIp=MLU@&HOH>5K;+H)p)Fp^@p zEN)a0F-{fRvlUyW!8#)vx9t_&IUwl_RA?>aPZy2Jg1vkV6KPe%5*3u+Nq>nWs;m>L zu-_JbX&v{A4FZaa`>;#!m?}Q4kI13qCBgEG!qbek#Fml7@xKk!XC&3V3UHeVN3juk=qMc6h|7*BcAEzhX{6|Rrx^UV zf%^XkZ`Q>2#W`gXN-mmkIjx-~)LSX2V>c~y)G3fUy-6@VtUW!*BR%q7NGx?m$9DQl z!)F|98R?h0$%YwNUKtse8RX3wBnE*wIGH8)j0-S5lv1vx%bA%`Y1w;vetVfs-YVtg znW4Rz&Fxu-?pfVJp{2)-Y_rWk1TP$BCIgjW^9>EI1>x6tNpZs37 zd@`B>9?SgOV>f|%W}18`M*$aHhAFdvji&IHPyRDd0k=;f;VH)JE~FhRLS5(z=Jw>ohJa&R?By#@?v%Vs$!xz2yn4>5;;?Ga#5jtW|5^> z9t3W752;24Gb*$ef@yfmG6Gf?Orj`(Zr_2#0BZ#|5T8c~@v%>so8bzp5LO)+SO+*h z6CupglDIAe0+9gxJy}dL|0zeIpbwT`J3s+YHn|BV3FN&;%C&cjDTOr94gn->n>Z^Q z^EsQ;J}KQwF8z82ph1hM43_uFl@>4od60Hwd}2B$U}8*DF0#sQUnEA%79O5K1r@(@*?P(&5mktmac}F0Wk`=`@Lks zx@M75XHwZ8ZZB}=R@&fGf7DU8v0uzEUc*?aOTg*hs$5(2!$p*+&Q`bXvZLOh7$|%l zSY|2@CO6h##%+*1sNCBJwyp4jR~wmp8z@!k?~jAYj(vV})Tj!UQ*u;)p$5l0-&9l@ z;DYy+s*833!rMT18UsF*hZhZ45M`^p(4;J6kunJ6oz@~~^-;~L_(ju7LR&e*1`tGm z!ARhz!AFdMR^f!!ZPpedUtJzll~ZMF`Zn;3vK`0MMz1I=D50 zR=dzs)J43>4;R3PFw&0ha5XmcX*P7=FnW0fx}8wrMFZfj)F%mS;X#yw20cWy0WL8u zBFGkAWNRI%w!3)e0BvP4r(0cgsk4=#%Xno?Rt5WUWlC5Z-*hD|AMoCFLI(_?E}-$4 z1W_i+*j;p92|X^|#_h5~wgriIiWsZ)U)3fpv`fSoEv#y6b%FukYhUVj-%|msK5Z*9 zZqxtK;#KJwO{v|W--xQL$QJ`Tb6VlnnJ#v|0WDPi_|cgZV<$lVh8x;;npN?X{0+yk ztd@8o1~|pn)of~CQbYxCS_GwF^N1rK-EnTb^8~z=-bgvuFL(m5s05M%+8ZbUj-B9p z0>Gwy5FD@NWpXbyK%4YfUv<1v>*phpr*<3;jqsG-B!%`mYh%6lPaigS7cuuG6*sD? zRL}xi-&vy$$hv;}sDU-wXc484@O<%f-f)mVx*s@jJ=T0nw`}cNMIfLHc#jAS`3@}D z0tDED$uvef$8T^MF`Nd@F&5&0(V7FTt?_aMqEy_W2XAxO;jpc2QB!`xL%FlFS$UBE z7^F`=2Gg+N?i}tk0h`dapV?PnIrL~cRGG32=Q{L={~Y0Q2H)3cbI=D>cYw;W1t@`S5PzdO;)XH@w59>~e~%}PlVJWqdF0ZdF+ zxkDz7SQ}7LosGEi!9Hp$hPL}o*veK(>~|Xdni!zDb{wPy3|Kp8)qO7^-2yil#q)Mg zV^7y}Jk$@tbHB$uN6I>?7ClZb?h{uzONZaY`|!!65Lm5ywuKyoKBy#Unzl7@U-4~o z(3?X}Ox-pHawgQ*j1O#8f;9(PK3deO<$y$nfjcDwMmcYucD^|qw-Qzvjq?RduU2!R zT5cUr)t_iEI0iVZ0a;8I?g54)#2@b(&&K_F$6TTnwgTj+lDIytqd#un$$q9-J*`Fu z!U0rec{zwoHX9IP4?4eSNoo_gKF7Ze?u#cmaTRdO3FvhDi@e*+dBFO&n*#BX%Eo1o;cimH2y&TREz97xwd z-j=<&*hL+-I`;arK&K`X)j|BimM<_B@%@WfGiQ~q#|eJ{k<0)v+u7&-17q9ava3-G zvcvt)OP9uneyiI-GtBjUhrOH3-E2oIiHlO``!cV`mo`TPduOC52FNd!!#g}Vef@@b zaOKG7+w`_DK|Iv;t=j00@fR>@1v|X1ay;b)Uexlj)Tr^zu|7csXl5zIhPTdyWg`Uz z+?ORWLvU7S(=}Q8WoxHm!vNzyrkZtItm*@&PD{6@JonHUSi+k`}{7;KL6E^vxZ%5*JH!}Yn_4>{ckI;L7kDNU)$KKyAnH@zkSC=zoZlWNw=mh zTJ+1`@tode4To}?7cjmkcD9n(jp6-m{Ti72cMU&bD1r@`vGx_Lsy6jG;!b7Cz+3ryDrht?wf;?sU1X zfjY{#a92(`Gl~x5U^cPRzyqk*LU-$3-EOAXd69q)^a&)4>P^jUzgJT*`!?g;lvVL| z4`?{p*f5QCV(RA~+?;;gw*gSL?AGE8R$fp`gLqXreT75gm$rqD(zjJtdhK#1BG z9?Ufz1vkkPQZCH(Z7P4sG1Ls3`AU6qcR2 zun#BmqKZk0NLe%(EAol&>iK<)(%Jx>(X=^RNCuFD87$ zGxF~C$SpjPTt-=Hg3(!Xfbyz&u!i0@`>UL+T`kV%2t*~cdIZX^ck-kl!@IBFQgwU` zY+c^&@9oA4P$N0k3pex~=a$V0esBNgBm5pRJ10U|tq>*hb585SxBG1)sTi8M==c4W zvzL3Ia*zsT`$kymYzXyl?Bs=w0K|3uaOu4VbMSZ7TdI#N!&$1Kud^r?p6hyl%@oX z#N+v3OKYTo3@oyR8zk)Eu`8iy=6qJ|erG_d-+~T}Z1+M3Im4@)=gmE?K5wwn+?9dT zgVm4d{pLPC;SW7+4c*^Ie&=<0O|x;h{aSbNMc&6ODuv7WHiiaf|Kb(s(Wg}Ta@WQ- z9{2_;4H$-Dpq_EdZyEamb>{yIRwCo?bTNPE>dA0Q+Ul>E?)fn=s`}vjBbDdPX!>pY z;@vy$Fi_ZzEBMx88Mw9P64;!E2BXvN@1RFBAy4c}vjz3oES+)(a?1;C}(pu<3`&I?ML@e59%+Y*uVA_Ky9}Bi1|NYrNEt*Vjg%Db(SE`1q=8rH!|dto2bP> z^A|b92JGA$@D-IB-cf}J@f)n9Rc`qPD~--cQj#@mVYn|GjvlOkK|WcYBfRn*;U1Dm zaI&T$LFpLTnnj88EVm-N@{<=K#)Ofg+#y+fd>g$tCyk_8k^c)TX{N-jpim$Piijg? zrlx=oX;3B=RBScV@{W!k?jIEtG`W-abITbeC;OFsG&4S1+pw4*3Cj;HrdO2P&>@_U zX!rjoQF;3~sWsP}Iox`@?{TjDZ=%wflGBE1MgzMgdkjp?^Pfber{|n8HE$WytV8o@ z_U6Bd$~igEa^5bSoxpg^zlqA8BU{F`jX6!w&w`)-Br0m%E!K^qY75OJo$(vtY&M5a!qOyIi7^@mw8K6YB{cyO?jm%dA}tp9ku?cRepbA z!nxnzL$y}2Ea`DHn4OxabM*dTEYCf!#l1Bw zoeFG>EIJ5bXz^(&?GsGsMoC2dQ=#H~T1+N@j~lVbK8;|q8ojL8s#Nf$11ct(Br7i^ zh4Y?@Vi=^M)3+6gk_A|!BN?vbWF$B?q2HZ=1?T!Plnfl9lTF7i{;tPh4u83&yGz2J zq?}3&>oZ6B9V9%}x~S=^dV^pmX8Ms2<;=?&11n>)W^4u4Glo};mxR06tk613Op zYH@Z-VBojFVCE~(ZBB0nsyfg8^FOfr3#(%1S!mn~Kot}U!5|kg!9KMf*hbOKPF!up z?v;aKvtKkOIQm>=tx%^8y=w$C;u205>Q5c1+{SMC9lyi(shs|lhd`PJ3)AQ`_7aL& zt@gQ#qIWdygN4?6MDI1=;%Qfd4Y$|#%Oi+iafe2sM^U|jP2npVNRjtFvCHJ~Funkd zeJKzD(Eg<;KWF&m_YMrJ8_UC;l4bnR=c7zexJh5lu;bj%!iQ5kZ3di$rAwwxkm}hr zVRveDzp5wGG9_;ep5TUOiQXTB7DPhP*xe zetExTMioxUmKh9&21gC2uepXWf1-HR*%f@8BUM{t^UH70+fQJcu?UzbWRqO_AQDk1 zbdU%r`0QkI?P*pZy^l9Wd!r_-Jn^yfZtcO7kn61~lH|8=T;PWDC0e#q;2RnAvHN?g z!0llV(eFgz{wuZALC>Rotlj$u{o>nXhEL}V1nQW`G|^v|{#^4G`OJNM{W*%8*ji{G zuzlL^0(^Hsm;=@F@4Z6v{X!wqRXXRhS@yx5ZS~X70<-y*q=NV>lKz_kc!ikvy{SL6 zhHmqrpKb_Ls&uX51~e0nkdhK=`+;3P?XKTCSruM+?EooNV33gM9?e+xnIY;an- z?DC`dOH3YKtvK9_sB5M#x-FZ;kv-8hX6`PeLL7gO1_#h!1t$T|kIh+vbjATQ1#o~8K>ilL3 zxS@8QI>TiFQa8X9HIYDQv4tCKj7B)@Fpf$!yk<43(n7di=MbbCUPYbAYH~=Y8jT-w zn2nWCj&Ki9B(LKKEjCj%P6dbZ)Ag&;$<{Q5k;%Pc)$oLfzh@a zc=aRj8;`O{8KGM)O_APP&@C;ZJ+u@WBi7q?nZvsYVc&jCzJ!ssrGl3ekkPgVE9uL4 zac0W)f|b=}4C~<39;HM(W%)Zt#2;ZCWTI5hMx2hoYSr;doukV7^8ER5a)|KJdtgKJ zybmKI;*D?y`D0-v^2RTM!bhW~+YoU$xmP9DKgA&hXPtn@Hj}Rvp z$|Z?Sa~mSu6qmZ3Ad9Fd*E$B94X3&{?!gG=Kt;`viE=lNQk597FCT?f2m4u%27sfD zNHK$H5#K6xPOM-lbFdyIyjnG!-wK!~P|kjZP*ojVlrFE$3Vv6oSe!2-mn>7}C9S*w zc4Qr{%LmuK$U~47%9WU39J$1fIN;RLLVDU!i$md`;uSx};3@!{&q6T#LSFY$Dghzj z8Dh4s36jPRG6-sZ2tTM9O`kTRNP9djaO|D+SU~zns)%Bmvy2=dLXT3(Q5)RODf6Bd zQB*=+bRAqq3vbjblNUdpYpv?g3#Xh9&L6>XtBY4NfBP8%rwKP(F9J|X9)+%MOS#m6 z_i3l6xs^jv8AOk;!?$q+co6dxaE<&^yEYrs&T&)ClTWZetLLZ%EZ19?%)t81v`?sL z%Z$&j0Hpa5?Xi8-T@qC*WgusMlP z+SM}^AtQIzGGTu6hU)L5?WOO%WZ~NuAAhMlAHAO(c`wMQxONFH^n&#w1*yGEssg}V z;IYp&@T$=xe4Lp|(UYIHm5hu>ioC{Lw`Uo$7mn)GQTi5$w5Lzw5usBdJlHN8(}GxW zd()SfI0%m&k+dOKPff5PE$DzoYpxMl&bc~maBZswDc$`2h{_sxUM+e4xARCQ?d*%l zKdS-d_(j6Dq360$5AEzml_~hYFls9+O6KZ-caxuJms>RFqT*^&l(fEeYW=uu6JzTF z_{A35=cZ0#igqmv(c%7L9=kr!BGbxT-Uipo{q^&-9|aT9Q_>jhou z1^?BfM$`}Wh6!WS5BFxGiWcsI;{qj5D_HRae~+bnL`3+A2@U7^g4ekIijCL50+`s3 z!;lRvNuGdf?6{@Q{l@v;t3uB6my*BNxR3KBA3&a;Q2vW{xRdo7v5Tw|t*rLfF|SK- zf%ejy|HaS=r;!Yr zYr3aNxFfG{$=TGb{tVQ81j|tV4gXxA8gwbA&^tw1FEcIjUV&G3c3aL!MAo4~N?Kx8 zL0fhMR}%*9n{C^+lJ;tz_4stgDBI=C!td2DZF(qzThJ~v(+)DzgNm?LJkujp({8*i z!A2t+Cgj`liT(=2oF^c~S>sjHPWO69MAr^=PdUnsX|x*V+bN4F(8hqEAHuR_$_#}cz3 zZm>XWFe1)RsPVHPpQ|J+v><8Uqm+ZEWmc$gsC3TH5>## zTQEdgvhf|z?Cg=YTXNdcv(6o`u^+M*9&n&rLEo*m)6-k=1X(rzKKN;3C3I53n4=4!2CTK+!l zNRp30G4U{@;z;S_P;ky#OSk;Q(Nt|!PxSQ&7yp<<4(3e%NUPyk4ZFxdZi~8@Y(K;1 zySa^7;Q_Ia%}Im}nysi|yN%6Qx#$q3I(gU>tgtR0!SBO0M|M*jbW=-wBP&x=>;5Af zbUWr)3v?L$BZV!K%&i^H9V&rSZ?!E?@)JAub=S%*YH9`dIXjtH3vO;Z9bMA)3>%+z z039YwXpm7@p)K~#NqD_oOF{U8vhAlrd#F%1AmVkcA2z8M<&2K-EK$uKd~NSvc=}u6 zD7?OpHrYPb^gI%#qtINbO-O60Ey*h^U_=wgVQkuk5!+Ep!a~ z=Agb)lEY%tndsD2=+xcd)YI?OJLlB5&)W5xyJa`M zA=HhEr;^`Mf4KW5>_Izl%cgrn=zB->aLbr=$0%k+ z*5SbcC19Mtqa8nCJ9VIkdO&%jDu~zaUR^x{@rKyn|K#{m#gDcZOYVc0e6W{7l9%kfqa=fr6vwYt(s_q!klGKg_fRi& z3~vnzZ%qzw^`b~;H++OVV%-nkdcofMN!|uU-iE=yCBAss@-6d>{z^?0c2bYD;sjYx z_*ioISc&^szxS~*^Re!T{9NO0pXB3E!{eCmzAh31OrV+-|h!|-)y@NxC? zaTNFUdjBBadC#)?+hjo6;A?{Q&As~<-;W&+){hk4yS_n1-aZdi&TIFkcK!YXzTx72 zw)4JC=f0629)o{Wg%CVKPwL{sYsq+c3^8R@Qz6tY$nY&N+zW)BPez-4XWaa*81OC<=&uQ~dIs5*V zS>8qCKG{kB(aY#DJ&@4+$M)(c8~Nt|J&@Ws$hkT)PwzR>As`52+#xu?4<=w8w&Qb> zaJ{^bjXB8G9Aw_%YoiasjRx5gMt64jHJ=i-ynmno@Pw!Mw8=BHbBJ{$>C`bq4{-R{ z+D8I&Kn-U1c7$d&$&rl|A2X8fW25Tqau?xMyCZP-^wS|ikR`^e4MyNn);)}VH@DVejDas1B&&vt zGoi+ZXCdf2KN&_y$Vt@wiry!BkM5IooBIv)FxPHer9m2EiG|NXap8Y9`6Fk>BhAGl z|AHORV&81Lz#R$9*_kKo15VE1ZJnaF0q5!xF)*Bm5qhO7^M@>}yiTo(TkeE9u!_kBu zDZ#c^6*-paI`)LNIb7{Ts4=Rm=oW?1e)|q|?LTwu%QUFs9imF^OC6*4Pl=r!Cw)v@ z`L}JqNv^1jkjSt78k^->R!L8F1F@}Z9vYH1UM8>+RfHUzpwaL9W$&15gh+J&%3ltn`Pqv{X@)7lnTG#@jusQp860Ch7eq)Lm|1Z zpE?Fxf$_dq=qq6r(kNWz1V!+0mye71r-DVr3Gl=%ytHzEL*ZL@T3JMFb-DIpajG3p67Cs()Ro*#@BhF*>mkRwf?C`G%QYDlqy;WGRJ?U`L`c831uUva94tv>ib=h7JoDfLk#EGY%Uz0E&(77!G&|%Q_fMQ zrst`dRIQ~mC7)6UV0cn3Yq*;gkDyl6`jxWatH;%1#oOX{3J)wcLo?e&HrU=1rp;Wb zh-jZzaQwklkwNEy9bu*CcsD+2!`+f23l2GZrp|Vd;))yUTytQ~s1mWz%7|Q~7Z{#o zddtSfRW)O=yVT5iH{;lBD$s;7*r#3}lp{5n}w*otppJ%P0<8n;TllR)FxAQ31!WH8Rz!5L=Ww)$DYRtONF$oCmEnAUvk`Wz6%% znr*e(WVQH7jw|(3UR=EJWvT_tx;y9EwYGGnI?J`I(U$K%8$&;_X!6&tG@HBC`IuCt zOa-j=ZCcj{{dMBmy3p;!&a5`eSTMmcQnowG_>x!;F$S`1Ob)$oG-P8nes}S8B6U=t zUI@`%nq_k_wY{}cl+984b38KNeUohlwv82w(SpH!bM~mc9{*M*iI){o|6ew@aF*?T z?2gVcQCByFB}H7$j;^^+>|SLo-_A8Vx)%%Bd|KjKH#gsAGGFUl+gNsPQy;3fuNr)L zkWC5mTY9fQaRg@hoBrzeM!)al2>MB)7wW;+|N56BB!_R8;JgC@61$0=DBgqT=^R84 zYQ&*t-A5wOM~p(_jO3}?mp)G$l6mBereZz764ysm72tx#YSkT3HFl1&2XVzPIq$!^ zc8>A&-zo`m?qd&kj*WV?AafF&I*?<<4xW zJ8rtM9)DlSojpuyi!r}HWhBOvo3?$-5!W^ADkq!a8@SKA+%pqzPaeLt_Z?!brg+^NU zN~PGlTCMsEotEye4MFeftk}LAEO)QA_rGiKtp9HE^LZJQ(7Ixu^-=}LXmRjFLTjb! z(uSvJV=joVwT$h`L91tTwV$uOrT)srvuA7Pm9KLc%69FZ*0X&g#^1eM?+ifQTFM#o zYI^r+&wsgR=f0o6|7ZP=Pd|HhUtjqluB7C!y9_tJ9M4MpFSCQph|u7o5^+xXWniJ!TIUoS{I!r5bKV<{J>4Bapt0 z9q&CAg9aw3ZE5&j@7ed=s3>5$ z2JnGUxo=4$m}jL=&6ciO^onH7aO*JfSMzk=H5NYV*Ke-ANl6Lk78GydmYQ!Pi#|^f zdGE-FhKJ&Dgb}{^ALE{`kEt}kYpRZr<1Vo$=s1tSg-uZ}SWw(zQH$_2Iaqj0RV^Uq z!Rd$3KyH?v`13r?&To9*l@&>j#^xXWGm`W}xG)?({A*&r%++Q-iN921B={j$=N}yW zZ1ANEw147(c{11cV>;*Qyj$$>``$5^3olObwwBggQAawsBPisgy5li_CU|9jue77! z*7)<=uJ0;C(VzB*uHRf{XXm@;1!gx`lFyR6P#wb;_{i`kGaR_$!*jD_i?OhZL|E*i zJ+j@1!0cxiQ|K&8z6~W&NTDO{&T@fy^rR^=c`?qmGRStXtlS(WV5byqtkfMV=3NMUCAlGv7zX--Ur8!{S?vlC=nD+mGtBAkH~CloKvjxs!24Lgb}34wu(T|`@QMVaUh^l%BQ41gZWja>S69E_)4gsDOu`;I)`Vn+m24v$(S znMg!^N4}3GX^vRN9Y%xKZiU`WWu8uSt#c@McSxgKCVx^AxngnHM}uV!A{W zq>)3;Qy@Mf<}2agwxSuD!%+hXY%0GWD}(OSkf}+ElUs3$edFXdQ$r@lES7H2J2ru7KSZa19a#pu1iRf=?p6?47n*;t}XGdtwfN^5tz75;{Wrh%5>snn|N zN6q7K6IygfTm9y5vZgl70Vf>AQV!3j=1X)A{YMNt6rl$t=Q=dZrAr?7ww(979HeFR zQuflCRz}YSF}4=L*Oj=bbm8=Nq0Ee)eD>JrcF?+Nu&kw4|8Znyd6bl0NUC+1A%oM( z8RiVoJb5pMz9y9&TGOL5*4S2M#(f%=NpB&=m}bhfd`zLgYWruh?9jy~SX0tp4P++5 z_-T_NvkfBO{kdPiy_?W+m}zmwE3HR=Y1y^CC;m=6 zU-r*Xo4+>2On22c7AF;}we_}41@zWgtJKC9q`^y8)jPF~QtP2gWG84vb+2@Ku}u82 zCNM$f+2l@nH8tsidu7SiaVBOD1}9EFmGZdB!6DDCk(~+=4LXWc;s`G&$)(J~S7eiJnF~{Q4%7MtsfgoBYWD=KVdx}gZDvJigbM@2(k;|qfSc;~^@$)+RAk*t*9{YN**e(!MtV_>WE_5I!w7cw4zW8bl zMRg7cs^49$<(*??y{O&FtRH`^uZLmtPpv2OVS@+J_GZ?2ie0xV6&}BuCaG4bbh9dB zf1ja-S|VlUFuB$sg;k)K9!2qeM}e`J^2Ql!quheorwXGYrgp{OX;_|Qzvd=9yK}|A zaJ_8!w(p;VsaEx!_{aX&hAVas2)XNx5W^1`j-Q*3qhd8H^@uXmJ5iLHWsniO_`k{l{Cv9*cqt zn*qBCn}Z97zX?a23k#zOSK0kdsrbi0<^~`FSS0~tZ{;Q7f87c!MBMed|I9@HrEGn=A0qtuov>R1ks^FzMyi*S4}*2V661GVL^iq> zmz_d7<(Mpz))hI9a6etNFN;oFYCKx>=vzB3D{@2k(?5B>_6vSiH6qL9O#C{Zuf^w+ zVBYRH{cK1x!yl3Xc^LLX!wATSjgFZ^c=p z{GJ+_nlZRigr<>PnpI@c^d(+sLEOwCd+(3kc}$`Z%(aSwcedpZ;)(C<52HR);T$NM z2|gtxjl9dqd5`59uF4O!Ig3|Z2WRa@i!PnfW~*27RwU|L`X6K(U+Zh~Ygmq(sM%+( z(?-3|jiSlea6dcEH;|KCOqybSwltZ9_fvV7$QOWBE~rz>9-21`e!Cu=Y|X=#)34-qlU_iDrr-N43qj^HVtE1xv_qs zhEs9JY6-fzonrMQy_?|Vf79N_=N9i~1#sjb1M<$SVeq|?=0F5GDh-)Ag_ho*fbnNk zFGXpBdYL6{UsOOFa=DwNA`GXxCNjE$$?tVzJuV&uI?~40aak2rzOOKlSnfJFH#eD0 zvW~xeUuCv0Tqu!rAQ!$nu0IM|22{S+U95sh5`Tf@Nv}weNb@1>*jP6IMde61l2FOa zDXaW_dZTg@A*ej4q+ZiXl>1>9t!oW}J z3PYiUY#yGRn;c3LL-ZrA$P>b5|Mm8t07(CjmH6ALpYFd_{V}m|@d=4Z$tkI6=^2?> z**Up+`2~eV#U-U><)z3~)it%B>*^c6G&VK2w6?W(bar+3^!D`+KnDL=^^c8DOim!o z%+Ad(EG{jtd|h2z-`L#R{i=hgeVjy0fzf12`y9FK?c?Vv5;(MC2QQJ%L%BB|@>V{; zzgcvNgd^k>K<$i81>(??Le-k;6(xqkdw|HspZ@?i5oowtOCeY=$1uqDNY;pYzJow? zIeX^+(m^_mZ(bI}rpWyy|>#seK#->Sn&R6vQ( zCG@9gi9#pQ1$>p{8YlHEy&VucE42U!Q3;zteVd}b%|Ry4>UjskOkTxENh z-RH8sP9l2ZcRR>ij^F4>q_Ij8{#?e0O(|UweT1nr?t%%%94<9(j>Cw&T3laik*B<; zuaxayxPtm9=d07@;Wj=jw%|98L$v6?%#Mhz*S4jNSm66Gc*U1Tjz;;B5J&=rdevdm zMki*WKYb<3&%AoMN=WYQvjB5fs0k*-K6~jN5JtyH35Lv<%jh_q?alHm1p-C<5^RoaNfFk#o|In zx<*+?K292X!_3fdbW0cTDv9zXL?6_(G>MpMLFQ9@MQ>1!uE#qg6=+rc3dHR&sZdip z$lWGrs;9ojP+Wie`HfZK;>S7~Vku-7Bn1hnU94~D`Q<+S_C!ZlU=b1hH0&y)SF4#E z3565m4y{QhVRZ~UASyCTEx)RAC7tjo*uOCg<>Ki)ZA}1ldkM1OpC=!4+OdYfqWkUC z`tXZJKE3yW7=%8PVzzwUiwf?^!$9jlr3W}Ck!V@rv_E5){uK!KpRFc^tpf4asn%KF zP8HUPF(zFrCc7fGgrbWkm-I7X!d!k_y`=D_PIJSzs^=ll=J8y`m%u6~Dk)Sj7uDoVd^}ORwMtr*(cWxDJ?S4Q(6X+EbwY^bTpqkgR3c$*d;{>KPPOIGo>CAW=JtZt;Ya?v?SWI zkTQFJBWls%ZVL?%k9}XLZSQ^cab2voAl3_-IhOC3@5Uy_*wnr*cTV)j1|K@qcl1NS-DX)S6SX zW{&8EpC;84o71aQj+u>~ru5$~>UPu}BYk|DHb-yC9#=Wx&U>1%S8K^#n>pd@d75=g zY{@@WIThM^n)91$DSVhY75nov{~)2H1)9~DATgXVzE#r47tNFw-i*~HLiRzi3~8zS z&F$okBra~dQ!Vg;T;6gTeVZ{|gW@O_CcgR|?`XIk006|#9Yen?B@A))^yTSVf;z{U=jMWmJa7N&e3h_9-PYjL-J zZF>Uz7<{?c^7yV|6JO1s4ggAmV;SzELm=2QbAbU!XvNUkS^CqlK z0s^90@^&&M|H(;*e8?UhLXveAPVD?bME-ydFs0mfc9W=H3mL5ZW3p*pB+Sp%H-*l3 z4U=t#e<~DQ$)mgD@z*=*`1|F=N{rL*`}EaT8R+4-G(vgqJn2bSdzbXv0NG^$kSq^J z>whWGOw(LRWYfXoh9mI^UEXYy&{+m->3!CD>MU-kQz`)wk%uajMBjRQh`8msyZ4D! zFlRHo;U%1f|}kS zKD4abpedj^8t8gL^ZP?Ys!80A5P1FjgKqb9vzOwjafyzFsYIs z70)EKtHnjj8RklW99aOWb!v9~z~#~pmv&&@5U{id_|n(^bUcLgF}#6Vn`gm0L670U zGjeh9(;{DZ^j$d9gqyItOGmTUds>d6w_7`mfCv6SDyrz9-(K^WKy^>T@^`LDl2k5! z5iSD0P3f`#d$d%)h}{&r@(0g=vjBBiFO6}4IKLN{hX<}lIDZuJ5Eg+tW3W{<9?G6d z6=Fn-j}hM)Y<&~M&>dNQ$%k(Hz!pRgvIXWJK5=6LZ^_v>ek+Fbugr;qAIGcYCYyi` zQ3+&wA=7-&c<+4-cuwZAiD=7euuf-879q^0y++bQK$YJo52}RD(0Kd|jl;8q04^Bv z#>he&SFI|89lDqW2vCW@@JDAtm0!e@UgAY3ju>Zx1w&G#La>Gc5a%h5QX>WEmNI7^ z%v>zThXbC6Bz`|l%y+sHZ@_@meh{iKW?VNyJ zcX!v_kKU=qLu3LH9i$y<5TLI+%5QipiPvDs<<0_j0#A9SBw%O|1* z1v2$hypaIlXex5ONpcIn{I3p?CIp$2w}BjtU_%GIgGvA3sE=he7%*o5=`5ZO{jBVX z#O8C!lF6(^-6T*d17(!fe0HJD6Hs*>bv`TGMIe7+A^T?4ThJFws+fZW2>*Q;p-nB8 za)Q&z4YVJEeW*!^ss31rgiRDn52?<1!Ag&<$^N|&T#)UyA`#?$>v*A;*`w+9#?~c@ zIOMAvWY<5$Np~f3F6EoqM~w+)V%`AYxzn5Vv)9k_o%Mqba}*?zGevVrv5`J)+LK}y zCo{TLM2tsr?`2ZOV&uYrIV6DVDTUktg}4ih&fS8DljV3f0pgBHNEhV|Hrd48sUSz! z&;9}K#1VD=RO=@pv5X&C&0(ps{E3Gugl}QXS7}f1s)#~LV@fMqZ^>?`%BqNJys|?; zGA^0Vl}j6ytjHQ%Po?XtwANDDta=`f9Yq06aR-aEWld#68Wk<}8t(1{^f~E%wc_fQ zlpX}xsL|ZQ4CP>?3W=qFej!@XPBPhRP{w{1HW%W(M4*e zkAq`I?J@vX>JFgn>G8Bt8w6x0RVYSNpz36cSmTL%C>pC`Rs_};dj>w^eQ`>sNDUlZcIyA*KlRbIXELBF z${&p9(wA9$mIn!C zf6V6rVGST!oZ<23{te}U^N+Ytr=Bm0{V;dky9E6Owr*>9gDuJ)*XmU}=B^ETkei3D zBwfr{d0Yxo90IojJma=a%r06(mw;g`LC$Kjm!W4&$Q1yFI1q{^s_u1&B|?hj#JN2z z_A)F%IwB=9B4a!v7dWDjKcdt-qOv`r_A;VQI;tr$s%<>V?{1}^KWf-JYP|ig!A?46 zDKchlJZ8ANY4dviW6cokRoa`Ejp^-jKh+?aj6)4v9L0Xc@qqA2F_v9UwOU^ClyY=&e5 zDhnfyzssA>j>1$c7sh$szSDIljtY)wBE>FkW3#1?&V3)J(aj5n_@;Kpra`rfG=RQ| zULX?cN?UIn*&iygJy)4Y>Qtr=+|8?6Z1dKl*+L>iA^Me;!s4&@or?@^57TSi&MQ#) zJgi2yM;{K;M>n`*C=BxFSv+4)B7X0H0yN3BqGR(*gS+m3=ffv}U``RGppEkyHl z{hLw14onGXpzfbc9EZ$q{;m$x^+LvVm~8Ds!iMVUM&xRS3L`?N*>Id{f`YtUBF=EK z=C(E4$ENn#LliJbPHH&ZG zilm;_Db%**m%Ukix_y$a*WIs@-dEgd92fxo3H464X)u#lTQNJzNU= z%8&<|Fld^9>RNAQkho$PzG44m`w?SUxjs*+_ckZEn!VsM`aI33{9((3)wilSj>?!>jViyPzXvK&SNUlIPhb!<1X+bxAo=De3vt{L2lj*pKjYKyXdF z^3$pBpG21DHH_nJ_CFUq8;)uw8e5gqNZSZ19KS2y;Yymms|jv zPbceE&{t!?DX~o72Q2Jbx#7CydVf2hpG#l{ zoewI?MOj);&ov#Gi>MU4^A#-0p15Era%6gc;HE^xg?Hx<%?nK`4xLXQIS0xSr}LYU zPdOA!3AK4IGQa04o>wlYOHz_gI=w@S!4hh0<4EY^&jd%xeDV0#?@|D$i)$to|F@aX-)jo7pnN!3NXB zKttxJKRcfiIWYWVVB0DM|9tB%1p|>P3Z zDf0HPuTvPJv0@xT6H_yDk?@OoFvkf<9K?~k)0i~hM>}J07&v(-3UX&0MamYNOwzj=g{4qk^=}z zODf%{l!%B*DJ4p`%;x*{f1mBO_Q8JFbMPKL>v>P!gXjL;*Tp5rFF#1*=+Ft#t5U3Z zx;KJ-Xb2D4HNj962a;hDl5k9&+savu5Q<^gq%xi5;pPa~f8b+Zp5#dQPhj-O6@BK; z;{@k0}f51po1*opy3 zod!}k+R`Mz6k3BaAx^65&gRbMrKdB|&5(aA^=vrp7-eC0DRcP6g{f$pfpG}&agyel z$rDMB(qteqC9lyg^4#K$_SkEMI;E1n#Rpw(^4OKN9I9WLT6#DE<}yk$SwY9Et%Gsx zpInZ%)G;AX^gpK-4rpu_zyI{pNiM{|mQ}x87I)aGhA@4+|E^r8%+r8XR}2~Onf#F} z8u7L@)~kCHRN*`ZC9>8M)wHLJryxn%NPvFotPEQ*#ANZqT-Y#zbWpQwsyk2+x)Ae3~hJ35PSinUtqgj;n% z#P5iW6w_EsZP<+Vw_|CjDQ{ifW9!0i zpZus3Mmo`4I@K^MFtdU|1crQ$rJ(CC0$*;$A&AUsJt_ubNHok#GOt3cR`el%7?o*; zWn9@hLBpjjBVUjasB&U6D!jXcQ{ns0mFuvzlfZ?SO_FC(rvh@MHd@fHBF<*5s?Gab zfheN#=*_x<{}C&%^AZy1EP8iXyXCtTgGWBUJ4y(U?;G})fkIwj4SX~HHGtpj%&)*0 z{5jk6@ZqKA@ck_wXmB6)n@aGuItw<21Eo6X|GJ*g0>KzeG6c5bY{mHhAec?gjHC!< z%wyOy^k`pcy`O{h#Ec`$IkmTkaeq&99yLfe-%LT}hnE?!JU)a`;|j0>XhDcbhtp+) zE3~0&Y=(O?q9=<3=`+c0{MHuJ*lj8RZml{H5XOW07T9Z>&3m=(uNZ0rNFR1}Syk<- zHGdJFN`Huf#H}F1B5HCGT;mo$yd3r()MCQQypkiugYuRoPvSCt$9Y$#_S_t|$mI+z~QALdWr}oaJS%qu-KVZ?cD(G{>D9ze&g2Y@ELC};U&B%75 z9JHD!5i!O>bCQI3^fLUHD|(Wwn^sL$j~M4MJ4rE_tET9l8s`r^Nwv9W37+^LuBc`W z&F85JvA&aZ@3b1aUBo1O?Ia_3u7=@iYVzsrNhb2YTv3FA!r!bU%~}@9=_wWXY4(4) zqH5FXW~VttbG01e)Bl?*3a#T(Rh!W-In8U({NG&BzSI2Hv^u`$YO`kl;fl`H@dr)M zTHT%&4*iEKsy1gwb5=B^i4rRO4_EZ8cs>m!Qm^*j)$FVUy*h^y>z;n^8G2T_0j-yq zRQupta#prS#!pp64H9Xvj); zVxB9QQ|k_yD8N1`eH6rOt&25V&XKydloURgNq`$*5#gH$WPkwm5xi2RaCYoUMKV%R zes4@7bxmIs0>gkX^l2sXa-tWeEqCfp*+t+ehe^RG;S$UqBDd{cW#C9~p?Falt;sIO z$@yNy;R3nl*6v#EKmDPG0N-Vr#U?s@nH8&#bzalr7-^X2D++j~t5m=t1*Dq*2IE_@ zNFMX-<%{I2!~=}<<@6g-%@}4{ly?0k1*TMU{vJQka>{j_?VT&4?ai$O0x>)WR%x25 zU$c1UZ&3ydChm_R2?y#o^{dQHa!yQUJuB8WUTnE13SDoXoO7HkB$D_yi|tu*xwodI zjB5~cGZizN@xm?HHn4&{N-uxK2#_JQl$jckcr!m+BF7U!PUOT%B~64!D%zsbLYBL4 z#yaNS?O}gxnhZS5hVEMh(cY+Ma&OxLQ!zQQta~+FN^{M-S02me0ZlL_p*1Zc02UE& z$Z1f~_UDD7xhe~p31Y;wHHk|+$kqkt0EE9ZRy}r9$t@_mj$g$P=Zt}y!J->LMCN_n zG;s6;5q0+j*Fj>ec{tf6XQ#tM?w2E@Bnb$8%9c{tsz{}guo%~jyJ?V@f>mkO&Tj`p z0&71{9ykK?dxcT#q>pr^f|Ohg?^r>dQF85xXXY4fUl^95CVu>wI@e>88Cf}CMVc(2 zFAQ)}=3*oCK{8lhrSmS#n+=!aQ z@Z1+K#%TpM{VA3IS0gxY|DDfsAgQx}iFVmm^o3c7oaJU6 zRqlo@;G_^u!-}QxsD$MZUsgcs*Rgc3fxR>b2Zl-MkeSq%>*JmIuLo5mGzb|aTCox) zKc@g<1Lm`d-D=>;3~HNVKCYouw+sVcG($K0GBwK-TRSA48Pd@o%AcvJPPc}7=+c>W zA&}21NbdZib5q?0*x6>NgM`-Ky<;0TqH}YI56CTi)ed+6& z72zZ@2>2Q37i8>Amp`@|;Sh7Ni(BbLkzZ=Kvm=)DBeyq%+kDc?!=8w*mLhmX2 zh{XHb@~5Yt87^AVmd{@5rP>T;S{+gpAJkYhMjo+*E^rQ9%+TELn*MoCr2B5fLV)}o zh7gX9Pd=71iHIM&iJa}T;5yF&L1IcrfZzhn<1K5IDxmx?-56$-EXie9KEMszQD=>#b> z1#<6po=_&C00aLGiGYm-19yECCDaM@zH5IU^T-$6mClO+7|>;~*{ zH_Cogsu53tWOhkZ%2nu)&=Z1IPan!SOm}fWj2KHy zr43b^D0%gX)R~hJzc-cHsXNdq>Ki5XN&!nYB9`xj6-dg>oEukEWL9z=yN9x_nqsUL z_xim-ec?prm`i>$kuo`~f4>r673a3b><^-hj=G45YH;r3N_0sGVFe}dI&(QnfNy;8 zq#$I70N{}x@WX@-`Mf9FFD_|)kkCe)f3^F!BG*xa^u270S_lEnr3-6&x=gJ5VMC&= zqMjv1<|)MbR>TOtXtWXSzTwU1_?)kcNOV)rUhz6f+b%RrpIv?^_L;4*xjyN-a)eFw zb4Mq3_+s2%9hzinisSL{SrAUZ4e5=y)B}XC<|khnY1-X*kj7p*Y$T(XlW^6w^OV-N$Ay1l3da3Q zO=8iOy&<&Ux+LGKX?#>w6K|9z$#TU(N=!0cM9ZUO5TAs0& z^%na^-&n;?m+qPBe!9>;4AJTyEzj;0hhefCNfOYoYf9?+(!Y6eFR9%psU~v~y+Bs> z&$JRNv=UNMiQD%dt|-B6B@s;(3A~ETtcoJEimIfF=D*TRhTAG8nraq!HJe%WBUhBG zq?)I%nlH54_7NmXQzHbg5izR~3$2kTse$*^NYm6zAOBaH39nT$t5pfDMU>R4_tk2y z)oS0?>eAHd!|M$GE6p@1sWa=VvskOMx~;RpMahVu9)~-f9;KNjDAztT%6$#xd5iL< zsizmI_cyB#e7yKCssE2PbFDt|wjN2-5Cd=D-^t z>7NCmjYTDmkJ8MtwZ@9u#>zhUQ=5X?Tm7ogmkq9sImh5LiOja#m#r!CJBFxvb=v>M_wZ)PRL|n?1UH0x~m_-_!0HQ`a zd)sG8N+KSn(u^=^N`SK#dB}@y(wt8wqq+3JYY6vos3F+EwcSA|`?Y;E6Xq}Z^%Ug}Euf2Mhjf?czqWuWggv`^%jKcz6ygsw$oiYz+e*8U2n$jg#U6vThR!?VaMENL~X6UgrEs5S2{lP6zbtpEEDMW25 zEhFa~@j1w%8(7NHrM8>qZU^ei;r$~fqJNQwqP0ZTpi5no!FP{ianHr`i?fu)3hSDT z-<9@!XBT*5-fOrAEm+E`PJn-iB|w?>Fp0e>=|1Pp~KI|Hh z=UX!d7jj2QeY4PR~qkBXy3t=QsZ}7+@D}hZh z?92rUHOG}q$~2zhXlwb^z+y^4(_EEud&!)fMQo))Y|0$+6FJ=w{ElBi9ru_m7bavZC#8tAU%)6G$XpfA?stHiF9=T`4&aS-0hJ_$<$;o0h7c$*CA^QNV*94Z)YlDR=6y0=|>VPVm%BK)t61 z9vJ`F7qI6>`f6T3j1#jbDqU52`r@OaU)R0#2TyDe=RoueyRLNkHyq@1T>F7E3>bk2{^v?G z>hT^ylP`}?$viG;5`IPhy^c#nULwvif`{2OKy7N~*n8<#H2OtEbP;5J*^YsCFH7eA zHgru_5tI&Jx>KBjis0Wr@DZ({V3aA&GIP?xRL(iGqBx$|lW zX+w~3LB34J*u&_n>Hbz=ciBJaY~@DkZ8F(KQ}=avk{BTQ*4fXg$TMft9jAdU($XWT zIlnsT2P&F|F(%TGnwE z`4bFVe$gK0qb@BrMN5;Um712buhxIqJ)~0h8y9Acd|CD9?ORPNEMG@_euSM*(ud+r zX5o2OoEv|gboAk`)97fl|f@^^5#NQ?HlR~1jc%l$?=YHIOK;O?Z{#%s&w`~1y zCFvue{va%ghrcL+XEcau7N89fAAcXPLB?GLF5 z`F#)7;*rs^^q_ACoV6?N?VZWx)*N$zkz9AK56H-Ge;7*Mev8o1UF2fo{__MFom^=R zp-aU03=PlHW3C#B2O~67ZERI)@C2>SA)?VLeBNW^0EpF^^w4k&A6SY-x(AzeyH%e~S`!Iu-P4P}VpFOFj$+rQDM;nrq7Gum-7qWo z%XfK3r%M;6N@V({cc7GFkYLvRj@4?ML*D@^G_3oNWoP(ixx--~i$r-EL@9u{Z~;OU z_vA?KSqIUyB6%~lQV+~;G*K*);tlbz9B81KN<@9rcD?#dT4WE*@)k?OsD(1RwH^pI zv3T`3Bl9oCW}k?RO)QD%8fp1yz#feKvQIq0D88cK-_o=#fFaE{w&*%sPl!InBkPZp z*5P+lB3mB%7`Ji92=mglZcrS6NjLM161*u7xR)nlLWrdak46_vU!_P-D#csHkyOW* zMRSU<3^U+Nbe7&vh9z>Gu- z9Z|)Ki@HPr=w-7L0pyA~+159Hh*ANaZM}&x%IrbBv7CxyCOHggLHgwZLQH!B`ORan zApk5qh%R|6eh5?qO9}yCl4R{8QY2zn0m6YFs2M>UR4yBO`3*25LT!0R3$X-}m}q0- z9+ARab~`(OZ(N0Uw&Y{#^CK}Wj@6aBRz>$$!h8g7jHQ6Cu7*MQqAvnqMS~o|CaJx} zEs4jWBEo+&f$fOX6>2)wR>(i=p8Mvc?=f$Yn?i`iFCgtOK8t;&Y;2Lcv+{awmG>%D zJcCCLQ1NP>m|$7|j5Q0_L#!6S8Y8k_0#9@F?8$UkA_Ut5D_gJx0lWrnGLB_v=PZO_b0k;@12mbghAmOc973x)mSI_I92sCz1_p1VnfZg zIjJ_&N9?R6t%cmT9_F|cgn+Q21vS=JB3*m~{pU)854t<@Psg$j2?TqH7y${INJUUf zq+EI9{XiEIoHK+|HDu-I57c*!H8c7q^TT8M6R>QybxGHLPH=;GTdUxE_}w95B%+?= z+{NbewZONfG2RyFc}~nrup7VSh*8!qKroFerPPf!BZN+GLtt}(mXNXuQR;YVEr zD5u&4daM18r;MdS@+1ju{`(wDC4vXlK|I8W)9#5OCV?nt|Vn^Bg}`sf@{9lqQMxU^rIl2jHr!*v;1; zP{#rZYk&b302H@622bu#4G4p!2F-mME#sz6ZJQ*A>8arzV_&OE=R&Tkd;BDCQ5`?9 z8$j@rU3>%Gura$PFBy`pOGZ9IqP0@b?YqzrtH)bj-*Z*Hv!7+30yg6fy`mSL{+(|v zR7nsvtu);_t)Sn;B$TeIe0A(D;X#XykrET*f~6X2+`RJ*Km>j{a1g(aSG>QTSH*%l zi}Uce**&i2lw3SXn)V*{ALGb1ltb!=?0+OkNoDw{Ipx=2tW6W=S`&tv&p9lp;(-X-V)l3$=R!1M&tqC9rdoa2rDu=c*c*|*|1t1R`Bo36*kVMw zEX}y`>#GERd!ijtc6m}3Qfh^mGv%n7j482X3nWkPKmO!)Jn~4Dp*K)Nem$C1pxW<0 zaE}`r$8ie4ojQj{vT3~SqERjGO1;j3y>+GfX)?pyGI==2F=|BtY<)6|B?v6XB}D&1 zvfOyJmAw6`oI3kmKqkIidT|oLV8}(d+BsT#?OmkcHuE?rNwV&o?rXXP8UN`(GGg`{ zg3(GrffF(%S1|zyuF4WuUO<*OOw$d6OE;1U+OGfI?^BxoMW!a%tr2_PurG5?MxG_#I?&G*!%VmF z@k4h^(+QvZD)Ux|NdvZyyi>#0clf(|>wFF%-x5asuu|>h-u~8q5%&H3b@$u9>3_oy z!+zZV=^jMmA0zR?H!uWxh6yu{<9Ne2pfWac}?Lz`Mi2(tsmqdQ{lfvT6*7mWt^2AhVM%M?fn=8U_Ii70O?bCD8+qB; z^7hCp^KShx@@nAk+rLqS_ZxUo*JA?jPBJs^cX*?2=DgmWy&(LzrxA6#-16?xF7ofU zTh!h9-*;Dogb&B5QTICngEt>DAI=|bRKL9j?|u-XuVP9d`=a60eJutBEVn+Dq&Zt z@Ik1^KlxN(^-h#M{n{=^9ucoX){;Za#(_^4=ZWyc-N8)pV)kOMmn=<+D`>DQqT^qPElV^~J8lclBoq7>G z4p^-46<**9V7cMB--J^&kj{QZP&!LaNKZ%<%ixV5?T2BsIH>YTHxn%-GwqFkdXKHT z+7#{=J$lUoqc7L-SEpgqRMerOs&EzIPcIiYW_!O9)fV%Xo>Mf)2P?E6fWA_*y|wQ&|zjQqaJa z^P*U)LXJES6S;f}tZd*&p@uhrEn|Bb9wL&g)#2n_qr7VOEkhkc#B${{3pvhWNEHbml0xLV;r5e5=)xzk(7EN7B;#D8JGURM!$hr#d5Qg#rYIDD8kU_^Lz<;gxdo_hS#Fro`#o}#m z#SqsFsy^JlEmEm$R5pO+n@h2c8EMXO1G`#;1#Z%mp&BWBL)<~NfLTcw71>(j%e#f@ z5RllZe-rLS0xMbVI6}-VhKg$=S(vrJq_7s4EYiu1s@y6)U?Z@&wR^utXyV)a{1Y%O z5EUsQD4>h8%p=r3A*MR=Dsu#lN>yY^?!k>TdyQJCfweUsO6c{8H_zBN0C{Y<{hO{_ zb;Q>kOQuS9`%1F>Uso%X?uDX?ORC=v0TP(We;&MQX(X3M5#F}3LK?`q=W!km8e)2z zRwe;?n-UO~X7QPt$_D*ly%tV9g|X!5iCz)3oXX8~X{d`FvroMt#%p6UCC=L10EIfO zk|fuW(%}OBbY14|sd@#e_6aPe#u)isvqrC%5YbYCMxXk?HF+O)vE0D0xIA{Qi^4bs zJ7!R+9{kOdskXEm2A4r}go1*plaXdHJaD=dUll!v*mzu-@(IpyE#)@3yG$6taD@|pV?I}Y$ z(sIq&4!9rVcS)PNt@4_$mUwZ%$KOi`1|!eKt7eUu)3r9cwth^OF01_fKiS&hh;~k0 z#>->vt47+FyhQ~Dc$Z`qT$P-mi#Z^_;;`(ux4taA({B)-&klEIvFbtzt8Iy+3z3QOkl|#Bq6GtcsBL z0*uki5bOh#+H38WA7(KT*D2y)gpR!SLHe4M8~Roa_Ip%G*m>Gn#WA567S#iHnAGLv z){jT%?6k`j(fp!J+-zH1HZ1-ACWiE>%5oM1qj#KxI}}fp3j2}@bE(SS1=V*Tp0WnA zaR??GtSc2F%(81}WY~%;nThyVptM{j10jDhl7~w)ye#e{JU4BJNSpv=skXHo$Z?-}J?q?Dr`E!YNK-VX6rk z&n8JnQLNTDQ7a3A`k(-m^SDCBGcWb(rh?PN8!}nRGMnxht;}EE6rnnxGj-6+E)J)U zXShR9Jn?E`den?vQ6nw&oF>=YWv41pz|&lc?A;DLkAk>&?&-tf6|;V`pMH~+m8$U( z<;?ze^?WD<^e*ASA@M7knN#5rQu*TVo9lP(r|X9j63@b903T67^%(;njb28?NyZTO zgfcrs$%^^(#gx?>$8+n=z4q=z-G(yv+k!n7DAO14dm_G;Ezln=Fyb#VKUrkeT4eWF N [ + ...accountTourSteps.goToAccountMenu('Let’s automate your bills, bank transactions and accounting processes.'), + // The tour will stop here if there is at least 1 vendor bill in the database. + // While not ideal, it is ok, since that means the user obviously knows how to create a vendor bill... + { + trigger: 'a[name="action_create_vendor_bill"]', + content: markup(_t('Create your first vendor bill.

    Tip: If you don’t have one on hand, use our sample bill.')), + tooltipPosition: 'bottom', + run: "click", + }, { + trigger: 'button.btn-primary[name="action_post"]', + content: _t('After the data extraction, check and validate the bill. If no vendor has been found, add one before validating.'), + tooltipPosition: 'bottom', + run: "click", + }, { + trigger: '.dropdown-item[data-menu-xmlid="account.menu_board_journal_1"]', + content: _t('Let’s go back to the dashboard.'), + tooltipPosition: 'bottom', + run: "click", + }, { + trigger: 'a[name="open_action"] span:contains(bank)', + content: _t('Connect your bank and get your latest transactions.'), + tooltipPosition: 'bottom', + run: "click", + }, { + trigger: 'button.o-kanban-button-new', + content: _t('Create a new transaction.'), + run: "click", + }, { + trigger: "div[name=amount] div input[id=amount_0]", + content: _t("Set an amount."), + tooltipPosition: "bottom", + run: "edit -19250.00", + }, { + trigger: "div[name=payment_ref] input[id=payment_ref_0]", + content: _t("Set the payment reference."), + tooltipPosition: "bottom", + run: "edit Payment Deco Adict", + }, { + trigger: "button.o_kanban_edit", + content: _t("Confirm the transaction."), + tooltipPosition: "bottom", + run: "click", + }, { + trigger: '.o_kanban_renderer:not(:has(.o_bank_rec_quick_create)) .o_bank_rec_st_line:not(.o_bank_rec_selected_st_line)', + content: _t('Click on a fetched bank transaction to start the reconciliation process.'), + run: "click", + }, { + isActive: ['auto'], + trigger: '.dropdown-item[data-menu-xmlid="account.menu_board_journal_1"]', + content: _t('Let’s go back to the dashboard.'), + run: "click", + }, + ] + }); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/tests/move_line.test.js b/dev_odex30_accounting/odex30_account_accountant/static/tests/move_line.test.js new file mode 100644 index 0000000..643bbf6 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/tests/move_line.test.js @@ -0,0 +1,340 @@ +import { beforeEach, test } from "@odoo/hoot"; +import { defineAccountModels } from "@account/../tests/account_test_helpers"; +import { + assertSteps, + click, + contains, + onRpcBefore, + openListView, + patchUiSize, + SIZES, + start, + startServer, + step, +} from "@mail/../tests/mail_test_helpers"; +import { onRpc, serverState } from "@web/../tests/web_test_helpers"; +import { getOrigin } from "@web/core/utils/urls"; + +const ROUTES_TO_IGNORE = [ + "/bus/im_status", + "/web/dataset/call_kw/account.move.line/get_views", + "/web/webclient/load_menus", + "/web/dataset/call_kw/res.users/load_views", + "/hr_attendance/attendance_user_data", + "/web/dataset/call_kw/res.users/has_group", +]; +const openPreparedView = async (size) => { + patchUiSize({ size: size }); + onRpcBefore((route, args) => { + if ( + ROUTES_TO_IGNORE.includes(route) || + route.includes("/web/static/lib/pdfjs/web/viewer.html") + ) { + return; + } + step(`${route} - ${JSON.stringify(args)}`); + }); + onRpc(({ method, model, args, kwargs }) => { + const route = `/web/dataset/call_kw/${model}/${method}`; + if (ROUTES_TO_IGNORE.includes(route)) { + return; + } + step(`${route} - {"kwargs":${JSON.stringify(kwargs)}}`); + }); + await start(); + await assertSteps([ + `/mail/data - ${JSON.stringify({ + init_messaging: {}, + failures: true, + systray_get_activities: true, + context: { lang: "en", tz: "taht", uid: serverState.userId, allowed_company_ids: [1] }, + })}`, + ]); + await openListView("account.move.line", { + context: { group_by: ["move_id"] }, + arch: ` + + + + + `, + }); +}; + +defineAccountModels(); + +beforeEach(async () => { + const pyEnv = await startServer(); + const accountMoveLineIds = pyEnv["account.move.line"].create([ + { name: "line0" }, + { name: "line1" }, + { name: "line2" }, + { name: "line3" }, + { name: "line4" }, + { name: "line5" }, + ]); + const accountMove = pyEnv["account.move"].create([ + { name: "move0", invoice_line_ids: [accountMoveLineIds[0], accountMoveLineIds[1]] }, + { name: "move1", invoice_line_ids: [accountMoveLineIds[2], accountMoveLineIds[3]] }, + { name: "move2", invoice_line_ids: [accountMoveLineIds[4], accountMoveLineIds[5]] }, + ]); + const attachmentIds = pyEnv["ir.attachment"].create([ + { res_id: accountMove[1], res_model: "account.move", mimetype: "application/pdf" }, + { res_id: accountMove[2], res_model: "account.move", mimetype: "application/pdf" }, + ]); + pyEnv["account.move"].write([accountMove[1]], { attachment_ids: [attachmentIds[0]] }); + pyEnv["account.move.line"].write([accountMoveLineIds[0]], { move_id: accountMove[0] }); + pyEnv["account.move.line"].write([accountMoveLineIds[1]], { move_id: accountMove[0] }); + pyEnv["account.move.line"].write([accountMoveLineIds[2]], { + move_id: accountMove[1], + move_attachment_ids: [attachmentIds[0]], + }); + pyEnv["account.move.line"].write([accountMoveLineIds[3]], { + move_id: accountMove[1], + move_attachment_ids: [attachmentIds[0]], + }); + pyEnv["account.move.line"].write([accountMoveLineIds[4]], { + move_id: accountMove[2], + move_attachment_ids: [attachmentIds[1]], + }); + pyEnv["account.move.line"].write([accountMoveLineIds[5]], { + move_id: accountMove[2], + move_attachment_ids: [attachmentIds[1]], + }); +}); + +test("No preview on small devices", async () => { + await openPreparedView(SIZES.XL); + await contains(".o_move_line_list_view"); + await assertSteps([ + `/web/dataset/call_kw/account.move.line/web_read_group - ${JSON.stringify({ + kwargs: { + orderby: "", + lazy: true, + offset: 0, + limit: 80, + context: { + lang: "en", + tz: "taht", + uid: serverState.userId, + allowed_company_ids: [1], + group_by: ["move_id"], + }, + groupby: ["move_id"], + domain: [], + fields: ["id:sum"], + }, + })}`, + ]); + // weak test, no guarantee to wait long enough for the potential attachment preview to show + await contains(".o_attachment_preview", { count: 0 }); // The preview component shouldn't be mounted for small screens + await click(":nth-child(1 of .o_group_header)"); + await contains(".o_data_row", { count: 2 }); + await assertSteps([ + `/web/dataset/call_kw/account.move.line/web_search_read - ${JSON.stringify({ + kwargs: { + specification: { + id: {}, + name: {}, + move_id: { fields: { display_name: {} } }, + move_attachment_ids: { fields: { mimetype: {} } }, + }, + offset: 0, + order: "", + limit: 80, + context: { + lang: "en", + tz: "taht", + uid: serverState.userId, + allowed_company_ids: [1], + bin_size: true, + group_by: ["move_id"], + default_move_id: 1, + }, + count_limit: 10001, + domain: [["move_id", "=", 1]], + }, + })}`, + ]); + await click(":nth-child(1 of .o_data_row) :nth-child(2 of .o_data_cell)"); + await contains(":nth-child(1 of .o_data_row) :nth-child(2 of .o_data_cell) input"); + // weak test, no guarantee to wait long enough for the potential attachment preview to show + await contains(".o_attachment_preview", { count: 0 }); // The preview component shouldn't be mounted for small screens even when clicking on a line without attachment + await click(":nth-child(2 of .o_group_header)"); + await contains(".o_data_row", { count: 4 }); + await assertSteps([ + `/web/dataset/call_kw/account.move.line/web_search_read - ${JSON.stringify({ + kwargs: { + specification: { + id: {}, + name: {}, + move_id: { fields: { display_name: {} } }, + move_attachment_ids: { fields: { mimetype: {} } }, + }, + offset: 0, + order: "", + limit: 80, + context: { + lang: "en", + tz: "taht", + uid: serverState.userId, + allowed_company_ids: [1], + bin_size: true, + group_by: ["move_id"], + default_move_id: 2, + }, + count_limit: 10001, + domain: [["move_id", "=", 2]], + }, + })}`, + ]); + await click(":nth-child(4 of .o_data_row) :nth-child(2 of .o_data_cell)"); + await contains(":nth-child(4 of .o_data_row) :nth-child(2 of .o_data_cell) input"); + // weak test, no guarantee to wait long enough for the potential attachment preview to show + await contains(".o_attachment_preview", { count: 0 }); // The preview component shouldn't be mounted for small screens even when clicking on a line with attachment + await assertSteps([], { message: "no extra rpc should be done" }); +}); + +test("Fetch and preview of attachments on big devices", async () => { + await openPreparedView(SIZES.XXL); + await contains(".o_move_line_list_view"); + await assertSteps([ + `/web/dataset/call_kw/account.move.line/web_read_group - ${JSON.stringify({ + kwargs: { + orderby: "", + lazy: true, + offset: 0, + limit: 80, + context: { + lang: "en", + tz: "taht", + uid: serverState.userId, + allowed_company_ids: [1], + group_by: ["move_id"], + }, + groupby: ["move_id"], + domain: [], + fields: ["id:sum"], + }, + })}`, + ]); + await contains(".o_attachment_preview"); + await contains(".o_attachment_preview p", { + text: "Choose a line to preview its attachments.", + }); + await contains(".o_attachment_preview iframe", { count: 0 }); + await click(":nth-child(1 of .o_group_header)"); + await contains(".o_data_row", { count: 2 }); + await assertSteps([ + `/web/dataset/call_kw/account.move.line/web_search_read - ${JSON.stringify({ + kwargs: { + specification: { + id: {}, + name: {}, + move_id: { fields: { display_name: {} } }, + move_attachment_ids: { fields: { mimetype: {} } }, + }, + offset: 0, + order: "", + limit: 80, + context: { + lang: "en", + tz: "taht", + uid: serverState.userId, + allowed_company_ids: [1], + bin_size: true, + group_by: ["move_id"], + default_move_id: 1, + }, + count_limit: 10001, + domain: [["move_id", "=", 1]], + }, + })}`, + ]); + await click(":nth-child(1 of .o_data_row) :nth-child(2 of .o_data_cell)"); + await contains(".o_attachment_preview iframe", { count: 0 }); + await contains(".o_attachment_preview p", { text: "No attachments linked." }); + await click(":nth-child(2 of .o_group_header)"); + await contains(".o_data_row", { count: 4 }); + await contains(".o_attachment_preview p", { text: "No attachments linked." }); + await assertSteps([ + `/web/dataset/call_kw/account.move.line/web_search_read - ${JSON.stringify({ + kwargs: { + specification: { + id: {}, + name: {}, + move_id: { fields: { display_name: {} } }, + move_attachment_ids: { fields: { mimetype: {} } }, + }, + offset: 0, + order: "", + limit: 80, + context: { + lang: "en", + tz: "taht", + uid: serverState.userId, + allowed_company_ids: [1], + bin_size: true, + group_by: ["move_id"], + default_move_id: 2, + }, + count_limit: 10001, + domain: [["move_id", "=", 2]], + }, + })}`, + ]); + await click(":nth-child(4 of .o_data_row) :nth-child(2 of .o_data_cell)"); + await contains(".o_attachment_preview p", { count: 0 }); + await contains( + `.o_attachment_preview iframe[data-src='/web/static/lib/pdfjs/web/viewer.html?file=${encodeURIComponent( + getOrigin() + "/web/content/1" + )}#pagemode=none']` + ); + await assertSteps([], { message: "no extra rpc should be done" }); + await click(":nth-child(3 of .o_group_header)"); + await contains(".o_data_row", { count: 6 }); + // weak test, no guarantee to wait long enough for the potential attachment to change + await contains( + `.o_attachment_preview iframe[data-src='/web/static/lib/pdfjs/web/viewer.html?file=${encodeURIComponent( + getOrigin() + "/web/content/1" + )}#pagemode=none']` + ); // The previewer content shouldn't change without clicking on another line from another account.move + await assertSteps([ + `/web/dataset/call_kw/account.move.line/web_search_read - ${JSON.stringify({ + kwargs: { + specification: { + id: {}, + name: {}, + move_id: { fields: { display_name: {} } }, + move_attachment_ids: { fields: { mimetype: {} } }, + }, + offset: 0, + order: "", + limit: 80, + context: { + lang: "en", + tz: "taht", + uid: serverState.userId, + allowed_company_ids: [1], + bin_size: true, + group_by: ["move_id"], + default_move_id: 3, + }, + count_limit: 10001, + domain: [["move_id", "=", 3]], + }, + })}`, + ]); + await click(":nth-child(5 of .o_data_row) :nth-child(2 of .o_data_cell)"); + await contains(":nth-child(5 of .o_data_row) :nth-child(2 of .o_data_cell) input"); + await contains( + `.o_attachment_preview iframe[data-src='/web/static/lib/pdfjs/web/viewer.html?file=${encodeURIComponent( + getOrigin() + "/web/content/2" + )}#pagemode=none']` + ); + await assertSteps([]); + await click(":nth-child(1 of .o_data_row) :nth-child(2 of .o_data_cell)"); + await contains(".o_attachment_preview iframe", { count: 0 }); + await contains(".o_attachment_preview p"); + await assertSteps([]); +}); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_rainbowman_reset.js b/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_rainbowman_reset.js new file mode 100644 index 0000000..ed47772 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_rainbowman_reset.js @@ -0,0 +1,91 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { stepUtils } from "@web_tour/tour_service/tour_utils"; +import { accountTourSteps } from "@account/js/tours/account"; + +registry.category("web_tour.tours").add("account_accountant_bank_rec_widget_rainbowman_reset", { + url: "/odoo", + steps: () => [ + stepUtils.showAppsMenuItem(), + ...accountTourSteps.goToAccountMenu("Open the accounting module"), + + // Open the widget. The first line should be selected by default. + { + trigger: ".o_breadcrumb", + }, + { + content: "Open the bank reconciliation widget", + trigger: "button.btn-secondary[name='action_open_reconcile']", + run: "click", + }, + { + trigger: "div[name='line_ids'] td[field='name']:contains('line1')", + }, + { + content: "'line1' should be selected and form mounted", + trigger: ".o_bank_rec_selected_st_line:contains('line1')", + }, + // Rainbowman gets reset + { + content: "Mount invoice 2 for line 1", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table td[name='move_id']:contains('INV/2019/00002')", + run: "click", + }, + { + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr.o_rec_widget_list_selected_item td[name='move_id']:contains('INV/2019/00002')", + }, + { + content: "Validate line1", + trigger: "button:contains('Validate')", + run: "click", + }, + { + trigger: ".o_bank_rec_selected_st_line:contains('line2')", + }, + { + content: "No records brings rainbows", + trigger: "div.o_kanban_view .o_searchview_input", + run: "fill thisShouldNotReturnAnyRecords", + }, + { + content: "Select the Journal Entry search option from the dropdown", + trigger: ".o_searchview_autocomplete li:contains(Journal Entry)", + run: "click", + }, + { + trigger: ".o_reward_rainbow_man:contains('You reconciled 1 transaction in')", + }, + { + content: "Remove the filter while rainbow man is on screen", + trigger: ".o_kanban_view .o_searchview_facet:nth-child(3) .o_facet_remove", + run: "click", + }, + { + trigger: ".o_bank_rec_st_line:contains('line2')", + }, + { + content: "Search for no results again", + trigger: "div.o_kanban_view .o_searchview_input", + run: "fill thisShouldNotReturnAnyRecords", + }, + { + content: "Select the Journal Entry search option from the dropdown", + trigger: ".o_searchview_autocomplete li:contains(Journal Entry)", + run: "click", + }, + { + content: "No content helper is displayed instead of rainbowman", + trigger: ".o_view_nocontent_smiling_face", + }, + // End + ...stepUtils.toggleHomeMenu(), + ...accountTourSteps.goToAccountMenu("Reset back to accounting module"), + { + content: "check that we're back on the dashboard", + trigger: 'a:contains("Customer Invoices")', + }, + ], +}); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_save_analytic_distribution.js b/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_save_analytic_distribution.js new file mode 100644 index 0000000..7113a15 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_save_analytic_distribution.js @@ -0,0 +1,69 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { stepUtils } from "@web_tour/tour_service/tour_utils"; +import { accountTourSteps } from "@account/js/tours/account"; + + +registry.category("web_tour.tours").add('account_accountant_bank_rec_widget_save_analytic_distribution', { + url: '/odoo', + steps: () => [ + stepUtils.showAppsMenuItem(), + ...accountTourSteps.goToAccountMenu("Open the accounting module"), + { + trigger: ".o_breadcrumb", + }, + { + content: "Open the bank reconciliation widget", + trigger: "button.btn-secondary[name='action_open_reconcile']", + run: "click", + }, + { + trigger: "div[name='line_ids']", + }, + { + content: "The 'line1' should be selected by default", + trigger: "div[name='line_ids'] td[field='name']:contains('line1')", + run: function() {}, + }, + { + content: "Click on first line", + trigger: "div[name='line_ids'] td[field='debit']:first", + run: "click", + }, + { + content: "The 'manual_operations_tab' should be active now and the auto_balance line mounted in edit", + trigger: "a.active[name='manual_operations_tab']", + run: function() {}, + }, + { + content: "Enter an analytic distribution", + trigger: "div[name='analytic_distribution'] .o_input_dropdown", + run: "click", + }, + { + content: "Select analytic distribution", + trigger: "tr[name='line_0'] input", + run: "edit analytic_account", + }, + { + trigger: ".ui-autocomplete", + }, + { + content: "Select analytic distribution", + trigger: ".ui-autocomplete:visible li:contains('analytic_account')", + run: "click", + }, + { + content: "Close the analytic distribution", + trigger: ".o_button", + run: "click", + }, + ...stepUtils.toggleHomeMenu(), + ...accountTourSteps.goToAccountMenu("Reset back to accounting module"), + { + content: "check that we're back on the dashboard", + trigger: 'a:contains("Customer Invoices")', + }, + ] +}); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_statements.js b/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_statements.js new file mode 100644 index 0000000..31d37e8 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_statements.js @@ -0,0 +1,95 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { stepUtils } from "@web_tour/tour_service/tour_utils"; +import { accountTourSteps } from "@account/js/tours/account"; + +registry.category("web_tour.tours").add('account_accountant_bank_rec_widget_statements', + { + url: '/odoo', + steps: () => [ + stepUtils.showAppsMenuItem(), + ...accountTourSteps.goToAccountMenu("Open the accounting module"), + { + trigger: ".o_breadcrumb", + }, + { + content: "Open the bank reconciliation widget", + trigger: "button.btn-secondary[name='action_open_reconcile']", + run: "click", + }, + { + content: "Statement button", + trigger: + ".o_bank_rec_st_line:eq(2) a.oe_kanban_action:contains('Statement'):not(:visible)", + run: "click", + }, + { + trigger: ".modal-dialog:contains('Create Statement')", + }, + { + content: "Save the statement with proposed values", + trigger: ".o_form_button_save", + run: "click", + }, + { + content: "Click the Valid Statement with $ 1,000.00 that is visible in Kanban", + trigger: "span[name='kanban-subline-clickable-amount']:contains('$ 1,000.00')", + run: "click", + }, + { + content: "Modify the end balance", + trigger: "input[id='balance_end_real_0']", + run: "edit 100 && click body", + }, + { + trigger: ".alert-warning:contains('The running balance')", + }, + { + content: "Dialog displays warning, save anyway", + trigger: ".breadcrumb-item.o_back_button:nth-of-type(2)", + run: "click", + }, + { + trigger: ".btn-link:contains('$ 2,100.00')", + }, + { + content: "Click the red statement, after checking the balance", + trigger: "span[name='kanban-subline-clickable-amount']:contains('$ 100.00')", + run: "click", + }, + { + content: "Back in the form view", + trigger: ".alert-warning:contains('The running balance')", + }, + { + content: "Click on Action", + trigger: ".o_cp_action_menus button", + run: "click", + }, + { + content: "Click on Delete", + trigger: ".o-dropdown--menu span:contains('Delete')", + run: "click", + }, + { + content: "Confirm Deletion", + trigger: ".btn-primary:contains('Delete')", + run: "click", + }, + { + trigger: ".o_kanban_renderer:not(:has(.kanban-statement))", + }, + { + content: "balance displays $3000.00 and no statement", + trigger: ".btn-link:contains('$ 3,000')", + }, + // End + ...stepUtils.toggleHomeMenu(), + ...accountTourSteps.goToAccountMenu("Reset back to accounting module"), + { + content: "check that we're back on the dashboard", + trigger: 'a:contains("Customer Invoices")', + } + ] +}); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_ui.js b/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_ui.js new file mode 100644 index 0000000..00b9173 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_ui.js @@ -0,0 +1,960 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { stepUtils } from "@web_tour/tour_service/tour_utils"; +import { patch } from "@web/core/utils/patch"; +import { accountTourSteps } from "@account/js/tours/account"; + +patch(accountTourSteps, { + bankRecUiReportSteps() { + return [ + { + trigger: ".o_bank_rec_selected_st_line:contains('line1')", + }, + { + content: "balance is 2100", + trigger: ".btn-link:contains('$ 2,100.00')", + }, + ]; + }, +}); + +registry.category("web_tour.tours").add("account_accountant_bank_rec_widget_ui", { + url: "/odoo", + steps: () => [ + stepUtils.showAppsMenuItem(), + ...accountTourSteps.goToAccountMenu("Open the accounting module"), + + // Open the widget. The first line should be selected by default. + { + trigger: ".o_breadcrumb", + }, + { + content: "Open the bank reconciliation widget", + trigger: "button.btn-secondary[name='action_open_reconcile']", + run: "click", + }, + { + trigger: "div[name='line_ids'] td[field='name']:contains('line1')", + }, + { + content: "'line1' should be selected and form mounted", + trigger: ".o_bank_rec_selected_st_line:contains('line1')", + }, + // Select line2. It should remain selected when returning using the breadcrumbs. + { + trigger: ".o_bank_rec_st_line:contains('line3')", + }, + { + content: "select 'line2'", + trigger: ".o_bank_rec_st_line:contains('line2')", + run: "click", + }, + { + content: "'line2' should be selected", + trigger: ".o_bank_rec_selected_st_line:contains('line2')", + }, + { + content: "View an invoice", + trigger: "button.btn-secondary[name='action_open_business_doc']:eq(1)", + run: "click", + }, + { + trigger: ".o_breadcrumb .active:contains('INV/2019/00001')", + }, + { + content: "Breadcrumb back to Bank Reconciliation from INV/2019/00001", + trigger: ".breadcrumb-item:contains('Bank Reconciliation')", + run: "click", + }, + { + trigger: ".o_bank_rec_st_line:contains('line1')", + }, + { + content: "'line2' should be selected after returning", + trigger: ".o_bank_rec_selected_st_line:contains('line2')", + run: "click", + }, + { + trigger: "div[name='line_ids'] td[field='name']:contains('line2')", + }, + { + content: "'line2' form mounted", + trigger: ".o_bank_rec_selected_st_line:contains('line2')", + run: "click", + }, + // Keep AML search, and prepared entry (line_ids) when changing tabs, using breadcrumbs, and view switcher + { + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr:nth-child(2) td[name='move_id']:contains('INV/2019/00001')", + }, + { + content: "AMLs list has both invoices", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr:nth-child(1) td[name='move_id']:contains('INV/2019/00002')", + }, + { + trigger: "a.active[name='amls_tab']", + }, + { + content: "Search for INV/2019/00001", + trigger: "div.bank_rec_widget_form_amls_list_anchor .o_searchview_input", + run: "edit INV/2019/00001", + }, + { + content: "Select the Journal Entry search option from the dropdown", + trigger: ".o_searchview_autocomplete li:contains(Journal Entry)", + run: "click", + }, + { + content: "AMLs list only displays one invoice", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr:nth-child(1) td[name='move_id']:contains('INV/2019/00001')", + }, + { + content: "Liquidity line displays debit '$ 1,000.00'", + trigger: + "div[name='line_ids'] table.o_list_table tr.o_bank_rec_liquidity_line td[field='debit']:contains('$ 1,000.00')", + }, + { + content: "Select the liquidity line", + trigger: "tr.o_bank_rec_liquidity_line td[field='debit']", + run: "click", + }, + { + content: "Modify the liquidity line amount", + trigger: "div[name='amount_currency'] input", + run: "edit 100.00 && click body", + }, + { + content: "Liquidity line displays debit '$ 100.00'", + trigger: + "div[name='line_ids'] table.o_list_table tr.o_bank_rec_liquidity_line td[field='debit']:contains('$ 100.00')", + }, + { + trigger: "div[name='partner_id'] input", + }, + { + content: "Select 'amls_tab'", + trigger: "a[name='amls_tab']", + run: "click", + }, + { + trigger: + "div.bank_rec_widget_form_amls_list_anchor .o_searchview_facet:nth-child(1) .o_facet_value:contains('INV/2019/00001')", + }, + { + content: "AMLs list contains the search facet, and one invoice - select it", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr:nth-child(1) td[name='move_id']:contains('INV/2019/00001')", + run: "click", + }, + { + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr.o_rec_widget_list_selected_item td[name='move_id']:contains('INV/2019/00001')", + }, + { + content: "Check INV/2019/00001 is well marked as selected", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr.o_rec_widget_list_selected_item td[name='move_id']:contains('INV/2019/00001')", + }, + { + content: "View an invoice", + trigger: "button.btn-secondary[name='action_open_business_doc']:nth-child(1)", + run: "click", + }, + { + trigger: ".o_breadcrumb .active:contains('INV/2019/00001')", + }, + { + content: "Breadcrumb back to Bank Reconciliation from INV/2019/00001", + trigger: ".breadcrumb-item:contains('Bank Reconciliation')", + run: "click", + }, + { + trigger: + "div.bank_rec_widget_form_amls_list_anchor .o_searchview_facet:nth-child(1) .o_facet_value:contains('INV/2019/00001')", + }, + { + content: "Check INV/2019/00001 is selected and still contains the search facet", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr.o_rec_widget_list_selected_item td[name='move_id']:contains('INV/2019/00001')", + }, + // Search should remove some lines, select the first unmatched record, and persist when returning with breadcrumbs + { + trigger: "a.active[name='amls_tab']", + }, + { + content: "Search for line2", + trigger: "div.o_kanban_view .o_searchview_input", + run: "fill line2", + }, + { + content: "Select the Transaction search option from the dropdown", + trigger: ".o_searchview_autocomplete li:contains(Transaction)", + run: "click", + }, + { + trigger: "div[name='line_ids'] td[field='name']:contains('line2')", + }, + { + content: "'line2' should be selected", + trigger: ".o_bank_rec_st_line:last():contains('line2')", + }, + { + trigger: + "div.bank_rec_widget_form_amls_list_anchor .o_searchview_facet:nth-child(1) .o_facet_value:contains('INV/2019/00001')", + }, + { + content: + "Nothing has changed: INV/2019/00001 is selected and still contains the search facet", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr.o_rec_widget_list_selected_item td[name='move_id']:contains('INV/2019/00001')", + }, + { + trigger: ".o_switch_view.o_kanban.active", + }, + { + content: "Switch to list view", + trigger: ".o_switch_view.o_list", + run: "click", + }, + { + trigger: ".o_switch_view.o_list.active", + }, + { + content: "Switch back to kanban", + trigger: ".o_switch_view.o_kanban", + run: "click", + }, + { + content: "Remove the kanban filter for line2", + trigger: ".o_kanban_view .o_searchview_facet:nth-child(3) .o_facet_remove", + run: "click", + }, + { + trigger: + "div.bank_rec_widget_form_amls_list_anchor .o_searchview_facet:nth-child(1) .o_facet_value:contains('INV/2019/00001')", + }, + { + content: + "Nothing has changed: INV/2019/00001 is still selected and contains the search facet", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr.o_rec_widget_list_selected_item td[name='move_id']:contains('INV/2019/00001')", + }, + // AML Search Facet is removed, and line_ids reset when changing line + { + trigger: ".o_bank_rec_st_line:contains('line3')", + }, + { + content: "selecting 'line1' should reset the AML search filter ", + trigger: ".o_bank_rec_st_line:contains('line1')", + run: "click", + }, + { + trigger: "div[name='line_ids'] td[field='name']:contains('line1')", + }, + { + content: "select 'line2' again", + trigger: ".o_bank_rec_st_line:contains('line2')", + run: "click", + }, + { + trigger: "div[name='line_ids'] td[field='name']:contains('line2')", + }, + { + content: "Bank Suspense Account is back", + trigger: "div[name='line_ids'] .o_bank_rec_auto_balance_line", + }, + { + content: "AML Search Filter has been reset", + trigger: ".o_list_view .o_searchview_input_container:not(:has(.o_searchview_facet))", + }, + // Test statement line selection when using the pager + { + content: "Click Pager", + trigger: ".o_pager_value:first()", + run: "click", + }, + { + content: "Change pager to display lines 1-2", + trigger: "input.o_pager_value", + run: "edit 1-2 && click body", + }, + { + trigger: ".o_pager_value:contains('1-2')", + }, + { + content: "Last St Line is line2", + trigger: ".o_bank_rec_st_line:last():contains('line2')", + }, + { + content: "Page Next", + trigger: ".o_pager_next:first():not(:disabled)", + run: "click", + }, + { + trigger: ".o_pager_value:contains('3-3')", + }, + { + content: "Statement line3 is selected", + trigger: ".o_bank_rec_selected_st_line:contains('line3')", + }, + { + content: "Page to beginning", + trigger: ".o_pager_next:first()", + run: "click", + }, + { + trigger: "div[name='line_ids'] td[field='name']:contains('line1')", + }, + { + content: "Statement line1 is selected", + trigger: ".o_bank_rec_selected_st_line:contains('line1')", + }, + // HTML buttons + { + content: "Mount an invoice", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table td[name='move_id']:contains('INV/2019/00003')", + run: "click", + }, + { + trigger: + "div[name='line_ids']:has(.text-decoration-line-through:contains('$ 2,000.00'))", + }, + { + content: "Select the mounted invoice line and check the strikethrough value", + trigger: + "div[name='line_ids'] tr.o_data_row:last() td[field='name']:contains('INV/2019/00003')", + run: "click", + }, + { + trigger: "a.active[name='manual_operations_tab']", + }, + { + content: "Fully Paid button", + trigger: "button[name='action_apply_line_suggestion']:contains('fully paid')", + run: "click", + }, + { + content: "Check the remainder", + trigger: + "div[name='line_ids'] tr.o_data_row:contains('Suspense') td[field='debit']:contains('$ 1,000.00')", + }, + { + content: "Partial Payment", + trigger: "button[name='action_apply_line_suggestion']:contains('partial payment')", + run: "click", + }, + { + trigger: "button[name='action_apply_line_suggestion']:contains('fully paid')", + }, + { + content: "View Invoice 0003", + trigger: "button[name='action_redirect_to_move']", + run: "click", + }, + { + trigger: ".o_breadcrumb .active:contains('INV/2019/00003')", + }, + { + content: "Breadcrumb back to Bank Reconciliation from INV/2019/00003", + trigger: ".breadcrumb-item:contains('Bank Reconciliation')", + run: "click", + }, + { + content: "Select the mounted invoice line INV/2019/00003", + trigger: + "div[name='line_ids'] tr.o_data_row:last() td[field='name']:contains('INV/2019/00003')", + run: "click", + }, + // Match Existing entries tab is activated when line is removed + { + trigger: "a.active[name='manual_operations_tab']", + }, + { + content: "Remove the invoice", + trigger: ".o_list_record_remove .fa-trash-o", + run: "click", + }, + { + content: "amls_tab is activated", + trigger: "a.active[name='amls_tab']", + }, + { + content: "Activate Manual Operations to add manual entries", + trigger: "a[name='manual_operations_tab']", + run: "click", + }, + { + content: "add manual entry 1", + trigger: "div[name='amount_currency'] input", + run: "edit -600.0 && click body", + }, + { + content: "mount the remaining opening balance line", + trigger: + "div[name='line_ids'] tr.o_data_row:contains('Suspense') td[field='credit']:contains('$ 400.00')", + run: "click", + }, + { + trigger: "div[name='amount_currency'] input:value('-400.00'):focus-within", + }, + { + content: "Remove the manual entry", + trigger: ".o_list_record_remove .fa-trash-o", + run: "click", + }, + { + trigger: + "div[name='line_ids'] tr.o_data_row:contains('Suspense') td[field='credit']:contains('$ 1,000.00')", + }, + { + content: "amls_tab is activated and auto balancing line is 1000", + trigger: "a.active[name='amls_tab']", + }, + { + content: "Mount another invoice", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table td[name='move_id']:contains('INV/2019/00001')", + run: "click", + }, + // After validating, line1 should disappear & line2 should be selected (due to filters) + { + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr.o_rec_widget_list_selected_item td[name='move_id']:contains('INV/2019/00001')", + }, + { + content: "Validate line1", + trigger: "button:contains('Validate')", + run: "click", + }, + { + trigger: "div[name='line_ids'] td[field='name']:contains('line2')", + }, + { + content: "The 'line2' is the first kanban record and is selected", + trigger: ".o_bank_rec_st_line:first():contains('line2')", + }, + // Test Reset, "Matched" badge and double-click + { + content: "Remove the kanban filter for 'Not Matched'", + trigger: ".o_kanban_view .o_searchview_facet:nth-child(2) .o_facet_remove", + run: "click", + }, + { + trigger: "div[name='line_ids'] td[field='name']:contains('line2')", + }, + { + content: "The 'line1' is the first kanban record with line2 selected", + trigger: ".o_bank_rec_st_line:first():contains('line1')", + }, + { + content: "Mount invoice 2 for line 2", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table td[name='move_id']:contains('INV/2019/00002')", + run: "click", + }, + { + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr.o_rec_widget_list_selected_item td[name='move_id']:contains('INV/2019/00002')", + }, + { + content: "Validate line2 with double click", + trigger: "button:contains('Validate')", + run: "dblclick", + }, + { + trigger: ".o_bank_rec_st_line:contains('line2') .badge.text-bg-success", + }, + { + content: "Click Pager again after line2 is matched", + trigger: ".o_pager_value:first()", + run: "click", + }, + { + content: "Change pager to display lines 1-3", + trigger: "input.o_pager_value", + run: "edit 1-3 && click body", + }, + { + trigger: ".o_bank_rec_selected_st_line:contains('line3')", + }, + { + content: "manually select line2 again by clicking it's matched icon", + trigger: ".badge.text-bg-success:last()", + run: "click", + }, + { + trigger: + "div[name='line_ids']:not(:has(.fa-trash-o)) td[field='name']:contains('line2')", + }, + { + content: "Reset line2", + trigger: "button:contains('Reset')", + run: "click", + }, + { + trigger: ".o_bank_rec_selected_st_line:contains('line2'):not(:has(div.badge))", + }, + { + content: "amls_tab is activated while still on line2 which doesn't contain a badge", + trigger: ".o_notebook a.active[name='amls_tab']", + }, + // Test view_switcher + { + trigger: ".o_switch_view.o_kanban.active", + }, + { + content: "Switch to list view", + trigger: ".o_switch_view.o_list", + run: "click", + }, + { + trigger: ".btn-secondary:contains('View')", + }, + { + content: "Select the first Match Button (line2)", + trigger: ".btn-secondary:contains('Match')", + run: "click", + }, + { + trigger: ".o_bank_rec_st_line:last():contains('line2')", + }, + { + content: "Last St Line is line2", + trigger: ".o_bank_rec_selected_st_line:contains('line2')", + run: "click", + }, + { + content: "Button To Check will reconcile since partner is saved on line2", + trigger: ".btn-secondary:contains('To Check')", + run: "click", + }, + { + trigger: + ".o_bank_rec_selected_st_line:contains('line2'):has(div.badge[title='Matched'] i):has(span.badge:contains('To check'))", + }, + { + content: "both badges are visible, trash icon is not, manual operation tab is active", + trigger: + "div[name='line_ids']:not(:has(.fa-trash-o))+.o_notebook a.active[name='manual_operations_tab']", + }, + { + trigger: ".o_switch_view.o_kanban.active", + }, + { + content: "Switch to list view", + trigger: ".o_switch_view.o_list", + run: "click", + }, + { + trigger: ".o_switch_view.o_list.active", + }, + { + content: "Remove the line filter", + trigger: ".o_searchview_facet:contains('0002') .o_facet_remove", + run: "click", + }, + { + trigger: ".o_data_row:contains('line2'):has(.btn-secondary:contains('View'))", + }, + { + content: "Select the first Match Button (line3)", + trigger: ".btn-secondary:contains('Match')", + run: "click", + }, + { + trigger: ".o_bank_rec_stats_buttons", + }, + { + content: "Open search bar menu", + trigger: ".o_searchview_dropdown_toggler:eq(0)", + run: "click", + }, + // Test Reco Model + { + trigger: ".o-dropdown--menu.o_search_bar_menu", + }, + { + content: "Choose a filter", + trigger: ".o_search_bar_menu .dropdown-item:first()", + run: "click", + }, + { + trigger: ".o-dropdown--menu", + }, + { + content: "Not Matched Filter", + trigger: ".dropdown-item:contains('Not Matched')", + run: "click", + }, + { + trigger: ".o_switch_view.o_kanban.active", + }, + { + content: "reco model dropdown", + trigger: ".bank_rec_reco_model_dropdown i", + run: "click", + }, + { + trigger: ".o-dropdown--menu", + }, + { + content: "create model", + trigger: ".dropdown-item:contains('Create model')", + run: "click", + }, + { + content: "model name", + trigger: "input#name_0", + run: "edit Bank Fees", + }, + { + content: "add an account", + trigger: "a:contains('Add a line')", + run: "click", + }, + { + content: "search for bank fees account", + trigger: "[name='account_id'] input", + run: "edit Bank Fees", + }, + { + trigger: ".o-autocomplete--dropdown-menu", + }, + { + content: "select the bank fees account", + trigger: ".o-autocomplete--dropdown-item:contains('Bank Fees')", + run: "click", + }, + { + trigger: ".o_breadcrumb .active > span:contains('New')", + }, + { + content: "Breadcrumb back to Bank Reconciliation from the model", + trigger: ".breadcrumb-item:contains('Bank Reconciliation')", + run: "click", + }, + { + content: "Choose Bank Fees Model", + trigger: ".recon_model_button:contains('Bank Fees')", + run: "click", + }, + { + content: "Validate line3", + trigger: "button:contains('Validate').btn-primary", + run: "dblclick", + }, + { + trigger: ".o_reward_rainbow_man", + }, + { + content: + "Remove the kanbans 'not matched' filter to reset all lines - use the rainbow man button", + trigger: "p.btn-primary:contains('All Transactions')", + run: "click", + }, + { + trigger: + ".o_kanban_view .o_searchview:first() .o_searchview_facet:last():contains('Bank')", + }, + { + content: "Wait for search model change and line3 to appear", + trigger: ".o_bank_rec_st_line:last():contains('line3')", + }, + { + trigger: ".o_bank_rec_selected_st_line:contains('line2')", + }, + { + content: "'line2' should be selected, reset it", + trigger: "button:contains('Reset')", + run: "click", + }, + { + trigger: ".o_bank_rec_st_line:contains('line2'):not(:has(div.badge))", + }, + { + content: "select matched 'line3'", + trigger: ".o_bank_rec_st_line:contains('line3')", + run: "click", + }, + { + trigger: ".o_bank_rec_selected_st_line:contains('line3')", + }, + { + content: "'line3' should be selected, reset it", + trigger: "button:contains('Reset')", + run: "click", + }, + { + trigger: ".o_bank_rec_st_line:contains('line3'):not(:has(div.badge))", + }, + { + content: "select matched 'line1'", + trigger: ".o_bank_rec_st_line:contains('line1')", + run: "click", + }, + { + trigger: ".o_bank_rec_selected_st_line:contains('line1')", + }, + { + content: "'line1' should be selected, reset it", + trigger: "button:contains('Reset')", + run: "click", + }, + { + trigger: ".o_bank_rec_stats_buttons", + }, + { + content: "Open search bar menu", + trigger: ".o_searchview_dropdown_toggler:eq(0)", + run: "click", + }, + { + trigger: "button:contains('Validate')", + }, + { + content: "Filter Menu", + trigger: ".o_search_bar_menu .dropdown-item:first()", + run: "click", + }, + { + trigger: ".o-dropdown--menu", + }, + { + content: "Activate the Not Matched filter", + trigger: ".dropdown-item:contains('Not Matched')", + run: "click", + }, + { + trigger: ".o_searchview_facet:contains('Not Matched')", + }, + { + content: "Close the Filter Menu", + trigger: ".o_searchview_dropdown_toggler:eq(0)", + run: "click", + }, + { + trigger: ".o_searchview_facet:contains('Not Matched')", + }, + { + content: "select 'line2'", + trigger: ".o_bank_rec_st_line:contains('line2')", + run: "click", + }, + { + trigger: ".o_bank_rec_selected_st_line:contains('line2')", + }, + { + content: "Validate 'line2' again", + trigger: "button:contains('Validate')", + run: "click", + }, + { + trigger: ".o_bank_rec_selected_st_line:contains('line3')", + }, + { + content: "'line3' should be selected now", + trigger: ".o_bank_rec_selected_st_line:contains('line3')", + }, + // Test the Balance when changing journal and liquidity line + ...stepUtils.toggleHomeMenu(), + ...accountTourSteps.goToAccountMenu("Reset back to accounting module"), + { + trigger: ".o_breadcrumb", + }, + { + content: "Open the bank reconciliation widget for Bank2", + trigger: "button.btn-secondary[name='action_open_reconcile']:last()", + run: "click", + }, + { + content: "Remove the kanbans 'not matched' filter", + trigger: ".o_kanban_view .o_searchview_facet:nth-child(2) .o_facet_remove", + run: "click", + }, + { + content: "Remove the kanban 'journal' filter", + trigger: ".o_kanban_view .o_searchview_facet:nth-child(1) .o_facet_remove", + run: "click", + }, + { + content: "select 'line1' from another journal", + trigger: ".o_bank_rec_st_line:contains('line1')", + run: "click", + }, + ...accountTourSteps.bankRecUiReportSteps(), + { + content: "select 'line4' from this journal", + trigger: ".o_bank_rec_st_line:contains('line4')", + run: "click", + }, + { + trigger: ".o_bank_rec_selected_st_line:contains('line4')", + }, + { + content: "balance is $222.22", + trigger: ".btn-link:contains('$ 222.22')", + }, + { + content: "Select the liquidity line", + trigger: "tr.o_bank_rec_liquidity_line td[field='debit']", + run: "click", + }, + { + trigger: "div[name='amount_currency'] input:focus-within", + }, + { + content: "Modify the liquidity line amount", + trigger: "div[name='amount_currency'] input", + run: "edit -333.33 && click body", + }, + { + trigger: ".btn-link:contains('$ -333.33')", + }, + { + content: "balance displays $-333.33", + trigger: ".btn-link:contains('$ -333.33')", + }, + { + content: "Modify the label", + trigger: "div[name='name'] input", + run: "edit Spontaneous Combustion && click body", + }, + { + content: "statement line displays combustion and $-333.33", + trigger: ".o_bank_rec_selected_st_line:contains('Combustion'):contains('$ -333.33')", + }, + // Test that changing the balance in the list view updates the right side of the kanban view + // (including reapplying matching rules) + { + content: "select matched 'line2'", + trigger: ".o_bank_rec_st_line:contains('line2')", + run: "click", + }, + { + trigger: ".o_bank_rec_selected_st_line:contains('line2')", + }, + { + content: "'line2' should be selected, reset it", + trigger: "button:contains('Reset')", + run: "click", + }, + { + trigger: ".o_bank_rec_selected_st_line:contains('line2'):not(:has(div.badge))", + }, + { + content: "Liquidity line displays debit '$ 100.00'", + trigger: + "div[name='line_ids'] table.o_list_table tr.o_bank_rec_liquidity_line td[field='debit']:contains('$ 100.00')", + }, + { + trigger: ".o_switch_view.o_kanban.active", + }, + { + content: "Switch to list view", + trigger: ".o_switch_view.o_list", + run: "click", + }, + { + content: "Click amount field of 'line2'; Selects the row", + trigger: "table.o_list_table tr.o_data_row:contains('line2') td[name='amount']", + run: "click", + }, + { + content: "Set balance of 'line2' (selected row) to 500.00", + trigger: "table.o_list_table tr.o_data_row.o_selected_row td[name='amount'] input", + run: "edit 500.00 && click body", + }, + { + trigger: ".o_switch_view.o_list.active", + }, + { + content: "Switch back to kanban", + trigger: ".o_switch_view.o_kanban", + run: "click", + }, + { + content: "'line2' is still selected", + trigger: ".o_bank_rec_st_line:contains('line2')", + }, + { + content: "Liquidity line displays debit '$ 500.00'", + trigger: + "div[name='line_ids'] table.o_list_table tr.o_bank_rec_liquidity_line td[field='debit']:contains('$ 500.00')", + }, + { + content: + "'INV/2019/00001' has been selected as matching existing entry by matching rules", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr.o_rec_widget_list_selected_item td[name='name']:contains('INV/2019/00001')", + }, + // End + ...stepUtils.toggleHomeMenu(), + ...accountTourSteps.goToAccountMenu("Reset back to accounting module"), + { + content: "check that we're back on the dashboard", + trigger: 'a:contains("Customer Invoices")', + }, + ], +}); + +registry.category("web_tour.tours").add('account_accountant_bank_rec_widget_reconciliation_button', + { + url: '/odoo', + steps: () => [ + stepUtils.showAppsMenuItem(), + ...accountTourSteps.goToAccountMenu("Open the accounting module"), + { + content: "Open the bank reconciliation widget", + trigger: "button.btn-secondary[name='action_open_reconcile']", + run: "click", + }, + { + content: "Remove suggested line, if present", + trigger: ".o_list_record_remove", + run() { + const button = document.querySelector('.fa-trash-o'); + if(button) { + button.click(); + } + } + }, + { + content: "Wait for deletion", + trigger: ".o_data_row:contains('Open balance')", + }, + { + content: "Select reconciliation model creating a new move", + trigger: ".recon_model_button:contains('test reconcile')", + run: "click", + }, + { + content: "Confirm move created through reconciliation model writeoff button", + trigger: "button[name=action_post]", + run: "click", + }, + { + trigger: ".o_breadcrumb", + }, + { + content: "Breadcrumb back to Bank Reconciliation from created move", + trigger: ".breadcrumb-item:contains('Bank Reconciliation')", + run: "click", + }, + { + content: "Validate created move added as a line in reco widget", + trigger: "button:contains('Validate')", + run: "click", + }, + // End + ...stepUtils.toggleHomeMenu(), + ...accountTourSteps.goToAccountMenu("Reset back to accounting module"), + { + content: "check that we're back on the dashboard", + trigger: 'a:contains("Customer Invoices")', + }, + ], +}); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_widget.js b/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_widget.js new file mode 100644 index 0000000..38296b8 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_bank_rec_widget.js @@ -0,0 +1,236 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { stepUtils } from "@web_tour/tour_service/tour_utils"; +import { accountTourSteps } from "@account/js/tours/account"; + +registry.category("web_tour.tours").add("account_accountant_bank_rec_widget", { + url: "/odoo", + steps: () => [ + stepUtils.showAppsMenuItem(), + ...accountTourSteps.goToAccountMenu("Open the accounting module"), + + // Open the widget. The first line should be selected by default. + { + trigger: ".o_breadcrumb", + }, + { + content: "Open the bank reconciliation widget", + trigger: "button.btn-secondary[name='action_open_reconcile']", + run: "click", + }, + { + trigger: "div[name='line_ids']", + }, + { + content: "The 'line1' should be selected by default", + trigger: "div[name='line_ids'] td[field='name']:contains('line1')", + }, + + // Test 1: Check the loading of lazy notebook tabs. + // Check 'amls_tab' (active by default). + { + trigger: "div.bank_rec_widget_form_amls_list_anchor table.o_list_table", + }, + { + content: "The 'amls_tab' should be active and the inner list view loaded", + trigger: "a.active[name='amls_tab']", + }, + // Check 'discuss_tab'. + { + trigger: "a.active[name='amls_tab']", + }, + { + content: "Click on the 'discuss_tab'", + trigger: "a[name='discuss_tab']", + run: "click", + }, + { + trigger: "a.active[name='discuss_tab']", + }, + { + content: "The 'discuss_tab' should be active and the chatter loaded", + trigger: "div.bank_rec_widget_form_discuss_anchor div.o-mail-Chatter", + }, + // Check 'manual_operations_tab'. + { + trigger: "tr.o_bank_rec_auto_balance_line", + }, + { + content: "Click on the 'auto_balance' to make the 'manual_operations_tab' visible", + trigger: "tr.o_bank_rec_auto_balance_line td[field='name']", + run: "click", + }, + { + content: "The 'manual_operations_tab' should be active", + trigger: "a.active[name='manual_operations_tab']", + }, + { + content: "The 'name' field should be focus automatically", + trigger: "div.o_notebook div[name='name'] input:focus", + }, + { + trigger: "tr.o_bank_rec_auto_balance_line", + }, + { + content: "Click on the 'credit' field to change the focus from 'name' to 'amount_currency'", + trigger: "tr.o_bank_rec_auto_balance_line td[field='credit']", + run: "click", + }, + { + content: "Wait to avoid non-deterministic errors on the next step", + trigger: "tr.o_bank_rec_auto_balance_line td[field='credit']", + }, + { + content: "The 'balance' field should be focus now", + trigger: "div.o_notebook div[name='amount_currency'] input:focus", + }, + + // Test 2: Test validation + auto select the next line. + { + trigger: "a.active[name='manual_operations_tab']", + }, + { + content: "Click on the 'amls_tab'", + trigger: "a[name='amls_tab']", + run: "click", + }, + { + trigger: "a.active[name='amls_tab']", + }, + { + content: "Mount INV/2019/00002", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table td[name='move_id']:contains('INV/2019/00002')", + run: "click", + }, + { + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr.o_rec_widget_list_selected_item td[name='move_id']:contains('INV/2019/00002')", + }, + { + content: "Check INV/2019/00002 is well marked as selected", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr.o_rec_widget_list_selected_item td[name='move_id']:contains('INV/2019/00002')", + }, + { + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr.o_rec_widget_list_selected_item td[name='move_id']:contains('INV/2019/00002')", + }, + { + content: "Remove INV/2019/00002", + trigger: "tr td.o_list_record_remove button", + run: "click", + }, + { + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr:not(.o_rec_widget_list_selected_item) td[name='move_id']:contains('INV/2019/00002')", + }, + { + content: "Mount INV/2019/00001", + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table td[name='move_id']:contains('INV/2019/00001')", + run: "click", + }, + { + trigger: + "div.bank_rec_widget_form_amls_list_anchor table.o_list_table tr.o_rec_widget_list_selected_item td[name='move_id']:contains('INV/2019/00001')", + }, + { + content: "Validate", + trigger: "button:contains('Validate')", + run: "click", + }, + { + trigger: "div[name='line_ids'] td[field='name']:contains('line2')", + }, + { + content: "The 'line2' is the next not already reconciled line", + trigger: "div[name='line_ids'] td[field='name']:contains('line2')", + }, + + // Test 3: Test manual operations tab. + { + content: "Click on 'credit'", + trigger: "div[name='line_ids'] td[field='credit']:last", + run: "click", + }, + { + content: + "The 'manual_operations_tab' should be active now and the auto_balance line mounted in edit", + trigger: "a.active[name='manual_operations_tab']", + }, + { + content: "The last line should be selected", + trigger: "div[name='line_ids'] tr.o_bank_rec_selected_line", + }, + { + content: "Search for 'partner_a'", + trigger: "div[name='partner_id'] input", + run: "edit partner_a", + }, + { + trigger: ".ui-autocomplete .o_m2o_dropdown_option a:contains('Create')", + }, + { + content: "Select 'partner_a'", + trigger: ".ui-autocomplete:visible li:contains('partner_a')", + run: "click", + }, + { + trigger: + "tr:not(.o_bank_rec_auto_balance_line) td[field='partner_id']:contains('partner_a')", + }, + { + content: "Select the payable account", + trigger: "button:contains('Payable')", + run: "click", + }, + { + trigger: + "tr:not(.o_bank_rec_auto_balance_line) td[field='account_id']:contains('Payable')", + }, + { + content: "Enter a tax", + trigger: "div[name='tax_ids'] input", + run: "edit 15", + }, + { + trigger: ".ui-autocomplete", + }, + { + content: "Select 'Tax 15% (Sales)'", + trigger: ".ui-autocomplete:visible li:contains('Sales')", + run: "click", + }, + { + content: "Tax column appears in list of lines", + trigger: "div[name='line_ids'] td[field='tax_ids']", + }, + { + content: "Wait to avoid non-deterministic errors on the next step", + trigger: "div[name='line_ids'] td:contains('Tax Received')", + }, + { + trigger: "button.btn-primary:contains('Validate')", + }, + { + content: "Validate", + trigger: "button:contains('Validate')", + run: "click", + }, + { + trigger: "div[name='line_ids'] td[field='name']:contains('line3')", + }, + { + content: "The 'line3' is the next not already reconciled line", + trigger: "div[name='line_ids'] td[field='name']:contains('line3')", + }, + ...stepUtils.toggleHomeMenu(), + ...accountTourSteps.goToAccountMenu("Reset back to accounting module"), + { + content: "check that we're back on the dashboard", + trigger: 'a:contains("Customer Invoices")', + }, + ], +}); diff --git a/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_journal_items_export.js b/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_journal_items_export.js new file mode 100644 index 0000000..c656afc --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/static/tests/tours/test_tour_journal_items_export.js @@ -0,0 +1,51 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { stepUtils } from "@web_tour/tour_service/tour_utils"; +import { accountTourSteps } from "@account/js/tours/account"; + +registry.category("web_tour.tours").add("account_accountant_journal_items_export", { + url: "/web", + steps: () => [ + stepUtils.showAppsMenuItem(), + ...accountTourSteps.goToAccountMenu("Open the accounting module"), + + { + content: "Open journal items list view", + trigger: 'button[data-menu-xmlid="account.menu_finance_entries"]', + run: "click", + }, + { + content: "Open journal items list view", + trigger: 'a[data-menu-xmlid="account.menu_action_account_moves_all"]', + run: "click", + }, + { + content: "Select all items", + trigger: 'thead tr th.o_list_record_selector', + run: "click", + }, + { + content: "Open export dialog", + trigger: 'i.fa-cog', + run: "click", + }, + { + content: "Open export dialog", + trigger: 'i.fa-upload', + run: "click", + }, + { + content: "Click on the cancel button", + trigger: 'button.o_form_button_cancel', + run: "click", + }, + // End + ...stepUtils.toggleHomeMenu(), + ...accountTourSteps.goToAccountMenu("Reset back to accounting module"), + { + content: "check that we're back on the dashboard", + trigger: 'a:contains("Customer Invoices")', + }, + ], +}); diff --git a/dev_odex30_accounting/odex30_account_accountant/tests/__init__.py b/dev_odex30_accounting/odex30_account_accountant/tests/__init__.py new file mode 100644 index 0000000..771a109 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/tests/__init__.py @@ -0,0 +1,12 @@ +from . import test_account_fiscal_year +from . import test_account_payment +from . import test_bank_rec_widget +from . import test_bank_rec_widget_tour +from . import test_prediction +from . import test_reconciliation_matching_rules +from . import test_account_auto_reconcile_wizard +from . import test_account_reconcile_wizard +from . import test_deferred_management +from . import test_ui +from . import test_signature +from . import test_change_lock_date_wizard diff --git a/dev_odex30_accounting/odex30_account_accountant/tests/test_account_auto_reconcile_wizard.py b/dev_odex30_accounting/odex30_account_accountant/tests/test_account_auto_reconcile_wizard.py new file mode 100644 index 0000000..bca7fe7 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/tests/test_account_auto_reconcile_wizard.py @@ -0,0 +1,244 @@ +from odoo import fields +from odoo.addons.account.tests.common import AccountTestInvoicingCommon +from odoo.exceptions import UserError +from odoo.tests import tagged + + +@tagged('post_install', '-at_install') +class TestAccountAutoReconcileWizard(AccountTestInvoicingCommon): + """ Tests the account automatic reconciliation and its wizard. """ + + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.comp_curr = cls.company_data['currency'] + cls.foreign_curr = cls.setup_other_currency('EUR') + + cls.misc_journal = cls.company_data['default_journal_misc'] + cls.partners = cls.partner_a + cls.partner_b + cls.receivable_account = cls.company_data['default_account_receivable'] + cls.payable_account = cls.company_data['default_account_payable'] + cls.revenue_account = cls.company_data['default_account_revenue'] + cls.test_date = fields.Date.from_string('2016-01-01') + + def _create_many_lines(self): + self.line_1_group_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.comp_curr, '2016-01-01', partner=self.partner_a) + self.line_2_group_1 = self.create_line_for_reconciliation(-1000.0, -1000.0, self.comp_curr, '2016-01-02', partner=self.partner_a) + self.line_3_group_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.comp_curr, '2016-01-03', partner=self.partner_a) + self.line_4_group_1 = self.create_line_for_reconciliation(-1000.0, -1000.0, self.comp_curr, '2016-01-04', partner=self.partner_a) + self.line_5_group_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.comp_curr, '2016-01-05', partner=self.partner_a) + self.group_1 = self.line_1_group_1 + self.line_2_group_1 + self.line_3_group_1 + self.line_4_group_1 + self.line_5_group_1 + + self.line_1_group_2 = self.create_line_for_reconciliation(500.0, 500.0, self.comp_curr, '2016-01-01', partner=self.partner_b) + self.line_2_group_2 = self.create_line_for_reconciliation(-500.0, -500.0, self.comp_curr, '2016-01-01', partner=self.partner_b) + self.line_3_group_2 = self.create_line_for_reconciliation(500.0, 500.0, self.comp_curr, '2017-01-02', partner=self.partner_b) + self.line_4_group_2 = self.create_line_for_reconciliation(-500.0, -500.0, self.comp_curr, '2017-01-02', partner=self.partner_b) + self.group_2 = self.line_1_group_2 + self.line_2_group_2 + self.line_3_group_2 + self.line_4_group_2 + + self.line_1_group_3 = self.create_line_for_reconciliation(1500.0, 3000.0, self.foreign_curr, '2016-01-01', partner=self.partner_b) + self.line_2_group_3 = self.create_line_for_reconciliation(-1000.0, -3000.0, self.foreign_curr, '2017-01-01', partner=self.partner_b) + self.line_3_group_3 = self.create_line_for_reconciliation(3000.0, 3000.0, self.comp_curr, '2016-01-01', partner=self.partner_b) + self.line_4_group_3 = self.create_line_for_reconciliation(-3000.0, -3000.0, self.comp_curr, '2016-01-01', partner=self.partner_b) + self.group_3 = self.line_1_group_3 + self.line_2_group_3 + self.line_3_group_3 + self.line_4_group_3 + + self.line_1_group_4 = self.create_line_for_reconciliation(1000.0, 1000.0, self.comp_curr, '2016-01-01', account_1=self.payable_account, partner=self.partner_a) + self.line_2_group_4 = self.create_line_for_reconciliation(-1000.0, -1000.0, self.comp_curr, '2016-01-02', account_1=self.payable_account, partner=self.partner_a) + self.group_4 = self.line_1_group_4 + self.line_2_group_4 + + def test_auto_reconcile_one_to_one(self): + self._create_many_lines() + should_be_reconciled = self.line_1_group_1 + self.line_2_group_1 + self.line_3_group_1 + self.line_4_group_1 \ + + self.line_1_group_2 + self.line_2_group_2 \ + + self.line_1_group_3 + self.line_2_group_3 + self.line_3_group_3 + self.line_4_group_3 + wizard = self.env['account.auto.reconcile.wizard'].new({ + 'from_date': '2016-01-01', + 'to_date': '2017-01-01', + 'account_ids': self.receivable_account.ids, + 'partner_ids': self.partners.ids, + 'search_mode': 'one_to_one', + }) + wizard.auto_reconcile() + + self.assertTrue(should_be_reconciled.full_reconcile_id) + self.assertEqual(self.line_1_group_1.full_reconcile_id, self.line_2_group_1.full_reconcile_id, + "Entries should be reconciled together since they are in the same group and have closer dates.") + self.assertEqual(self.line_3_group_1.full_reconcile_id, self.line_4_group_1.full_reconcile_id, + "Entries should be reconciled together since they are in the same group and have closer dates.") + self.assertEqual(self.line_1_group_2.full_reconcile_id, self.line_1_group_2.full_reconcile_id, + "Entries should be reconciled together since they are in the same group and have closer dates.") + self.assertEqual(self.line_1_group_3.full_reconcile_id, self.line_2_group_3.full_reconcile_id, + "Entries should be reconciled together since they are in the same group and have closer dates.") + self.assertEqual(self.line_3_group_3.full_reconcile_id, self.line_4_group_3.full_reconcile_id, + "Entries should be reconciled together since they are in the same group and have closer dates.") + self.assertNotEqual(self.line_2_group_3.full_reconcile_id, self.line_3_group_3.full_reconcile_id, + "Entries should NOT be reconciled together as they are of different currencies.") + self.assertFalse(self.line_5_group_1.reconciled, + "This entry shouldn't be reconciled since group 1 has an odd number of lines, they can't all be reconciled, and it's the most recent one.") + self.assertFalse((self.line_3_group_2 + self.line_4_group_2).full_reconcile_id, + "Entries shouldn't be reconciled since it's outside of accepted date range of the wizard.") + self.assertFalse((self.line_1_group_4 + self.line_2_group_4).full_reconcile_id, + "Entries shouldn't be reconciled since their account is out of the wizard's scope.") + + def test_auto_reconcile_zero_balance(self): + self._create_many_lines() + should_be_reconciled = self.line_1_group_2 + self.line_2_group_2 + self.group_3 + wizard = self.env['account.auto.reconcile.wizard'].new({ + 'from_date': '2016-01-01', + 'to_date': '2017-01-01', + 'account_ids': self.receivable_account.ids, + 'partner_ids': self.partners.ids, + 'search_mode': 'zero_balance', + }) + wizard.auto_reconcile() + + self.assertTrue(should_be_reconciled.full_reconcile_id) + self.assertFalse(self.group_1.full_reconcile_id, + "Entries shouldn't be reconciled since their total balance is not zero.") + self.assertEqual((self.line_1_group_2 + self.line_2_group_2).mapped('matching_number'), [self.line_1_group_2.matching_number] * 2, + "Entries should be reconciled together as their total balance is zero.") + self.assertEqual((self.line_1_group_3 + self.line_2_group_3).mapped('matching_number'), [self.line_1_group_3.matching_number] * 2, + "Entries should be reconciled together as their total balance is zero with the same currency.") + self.assertEqual((self.line_3_group_3 + self.line_4_group_3).mapped('matching_number'), [self.line_3_group_3.matching_number] * 2, + "Lines 3 and 4 are reconciled but not with two first lines since their currency is different.") + self.assertFalse(self.group_4.full_reconcile_id, + "Entries shouldn't be reonciled since their account is out of the wizard's scope.") + + def test_nothing_to_auto_reconcile(self): + wizard = self.env['account.auto.reconcile.wizard'].new({ + 'from_date': '2016-01-01', + 'to_date': '2017-01-01', + 'account_ids': self.receivable_account.ids, + 'partner_ids': self.partners.ids, + 'search_mode': 'zero_balance', + }) + with self.assertRaises(UserError): + wizard.auto_reconcile() + + def test_auto_reconcile_no_account_nor_partner_one_to_one(self): + self.create_line_for_reconciliation(1000.0, 1000.0, self.comp_curr, '2016-01-01', partner=self.partner_a) + self.create_line_for_reconciliation(-1000.0, -1000.0, self.comp_curr, '2016-01-02', partner=self.partner_a) + wizard = self.env['account.auto.reconcile.wizard'].new({ + 'from_date': '2016-01-01', + 'to_date': '2017-01-01', + }) + reconciled_amls = wizard._auto_reconcile_one_to_one() + self.assertTrue(reconciled_amls.full_reconcile_id) + + def test_auto_reconcile_no_account_nor_partner_zero_balance(self): + self.create_line_for_reconciliation(1000.0, 1000.0, self.comp_curr, '2016-01-01', partner=self.partner_a) + self.create_line_for_reconciliation(-1000.0, -1000.0, self.comp_curr, '2016-01-02', partner=self.partner_a) + wizard = self.env['account.auto.reconcile.wizard'].new({ + 'from_date': '2016-01-01', + 'to_date': '2017-01-01', + }) + reconciled_amls = wizard._auto_reconcile_zero_balance() + self.assertTrue(reconciled_amls.full_reconcile_id) + + def test_auto_reconcile_no_account_one_to_one(self): + self.create_line_for_reconciliation(1000.0, 1000.0, self.comp_curr, '2016-01-01', partner=self.partner_a) + self.create_line_for_reconciliation(-1000.0, -1000.0, self.comp_curr, '2016-01-02', partner=self.partner_a) + wizard = self.env['account.auto.reconcile.wizard'].new({ + 'from_date': '2016-01-01', + 'to_date': '2017-01-01', + 'partner_ids': self.partners.ids, + }) + reconciled_amls = wizard._auto_reconcile_one_to_one() + self.assertTrue(reconciled_amls.full_reconcile_id) + + def test_auto_reconcile_no_account_zero_balance(self): + self.create_line_for_reconciliation(1000.0, 1000.0, self.comp_curr, '2016-01-01', partner=self.partner_a) + self.create_line_for_reconciliation(-1000.0, -1000.0, self.comp_curr, '2016-01-02', partner=self.partner_a) + wizard = self.env['account.auto.reconcile.wizard'].new({ + 'from_date': '2016-01-01', + 'to_date': '2017-01-01', + 'partner_ids': self.partners.ids, + }) + reconciled_amls = wizard._auto_reconcile_zero_balance() + self.assertTrue(reconciled_amls.full_reconcile_id) + + def test_auto_reconcile_no_partner_one_to_one(self): + self.create_line_for_reconciliation(1000.0, 1000.0, self.comp_curr, '2016-01-01', partner=self.partner_a) + self.create_line_for_reconciliation(-1000.0, -1000.0, self.comp_curr, '2016-01-02', partner=self.partner_a) + wizard = self.env['account.auto.reconcile.wizard'].new({ + 'from_date': '2016-01-01', + 'to_date': '2017-01-01', + 'account_ids': self.receivable_account.ids, + }) + reconciled_amls = wizard._auto_reconcile_one_to_one() + self.assertTrue(reconciled_amls.full_reconcile_id) + + def test_auto_reconcile_no_partner_zero_balance(self): + self.create_line_for_reconciliation(1000.0, 1000.0, self.comp_curr, '2016-01-01', partner=self.partner_a) + self.create_line_for_reconciliation(-1000.0, -1000.0, self.comp_curr, '2016-01-02', partner=self.partner_a) + wizard = self.env['account.auto.reconcile.wizard'].new({ + 'from_date': '2016-01-01', + 'to_date': '2017-01-01', + 'account_ids': self.receivable_account.ids, + }) + reconciled_amls = wizard._auto_reconcile_zero_balance() + self.assertTrue(reconciled_amls.full_reconcile_id) + + def test_auto_reconcile_rounding_one_to_one(self): + """ Checks that two lines with different values, currency rounding aside, are reconciled in one-to-one mode. """ + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.comp_curr, '2016-01-01', partner=self.partner_a) + line_2 = self.create_line_for_reconciliation(-1000.0, -1000.0, self.comp_curr, '2016-01-02', partner=self.partner_a) + # Need to manually update the values to bypass ORM + self.env.cr.execute( + """ + UPDATE account_move_line SET amount_residual_currency = 1000.0000001 WHERE id = %(line_1_id)s; + UPDATE account_move_line SET amount_residual_currency = -999.999999 WHERE id = %(line_2_id)s; + """, + {'line_1_id': line_1.id, 'line_2_id': line_2.id} + ) + wizard = self.env['account.auto.reconcile.wizard'].new({ + 'from_date': '2016-01-01', + 'to_date': '2017-01-01', + 'account_ids': self.receivable_account.ids, + }) + reconciled_amls = wizard._auto_reconcile_one_to_one() + self.assertTrue(reconciled_amls.full_reconcile_id) + + def test_auto_reconcile_rounding_zero_balance(self): + """ Checks that two lines with different values, currency rounding aside, are reconciled in zero balance mode. """ + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.comp_curr, '2016-01-01', partner=self.partner_a) + line_2 = self.create_line_for_reconciliation(-1000.0, -1000.0, self.comp_curr, '2016-01-02', partner=self.partner_a) + # Need to manually update the values to bypass ORM + self.env.cr.execute( + """ + UPDATE account_move_line SET amount_residual_currency = 1000.0000001 WHERE id = %(line_1_id)s; + UPDATE account_move_line SET amount_residual_currency = -999.999999 WHERE id = %(line_2_id)s; + """, + {'line_1_id': line_1.id, 'line_2_id': line_2.id} + ) + wizard = self.env['account.auto.reconcile.wizard'].new({ + 'from_date': '2016-01-01', + 'to_date': '2017-01-01', + 'account_ids': self.receivable_account.ids, + }) + reconciled_amls = wizard._auto_reconcile_zero_balance() + self.assertTrue(reconciled_amls.full_reconcile_id) + + def test_preset_wizard(self): + """ Tests that giving lines_ids to wizard presets correctly values. """ + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.comp_curr, '2016-01-30', partner=self.partner_a) + line_2 = self.create_line_for_reconciliation(-1000.0, -1000.0, self.comp_curr, '2016-01-31', partner=self.partner_a) + wizard = self.env['account.auto.reconcile.wizard'].with_context(domain=[('id', 'in', (line_1 + line_2).ids)]).create({}) + self.assertRecordValues(wizard, [{ + 'account_ids': self.receivable_account.ids, + 'partner_ids': self.partner_a.ids, + 'from_date': fields.Date.from_string('2016-01-30'), + 'to_date': fields.Date.from_string('2016-01-31'), + 'search_mode': 'zero_balance', + }]) + + line_3 = self.create_line_for_reconciliation(1000.0, 1000.0, self.comp_curr, '2016-01-31', partner=self.partner_a) + line_4 = self.create_line_for_reconciliation(-500.0, -500.0, self.comp_curr, '2016-02-28', partner=None) + wizard = self.env['account.auto.reconcile.wizard'].with_context(domain=[('id', 'in', (line_3 + line_4).ids)]).create({}) + self.assertRecordValues(wizard, [{ + 'account_ids': self.receivable_account.ids, + 'partner_ids': [], + 'from_date': fields.Date.from_string('2016-01-31'), + 'to_date': fields.Date.from_string('2016-02-28'), + 'search_mode': 'one_to_one', + }]) diff --git a/dev_odex30_accounting/odex30_account_accountant/tests/test_account_fiscal_year.py b/dev_odex30_accounting/odex30_account_accountant/tests/test_account_fiscal_year.py new file mode 100644 index 0000000..1fad047 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/tests/test_account_fiscal_year.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- +from odoo.addons.account.tests.common import AccountTestInvoicingCommon +from odoo.tests import tagged +from odoo import fields + + +@tagged('post_install', '-at_install') +class TestFiscalPosition(AccountTestInvoicingCommon): + + def check_compute_fiscal_year(self, company, date, expected_date_from, expected_date_to): + '''Compute the fiscal year at a certain date for the company passed as parameter. + Then, check if the result matches the 'expected_date_from'/'expected_date_to' dates. + + :param company: The company. + :param date: The date belonging to the fiscal year. + :param expected_date_from: The expected date_from after computation. + :param expected_date_to: The expected date_to after computation. + ''' + current_date = fields.Date.from_string(date) + res = company.compute_fiscalyear_dates(current_date) + self.assertEqual(res['date_from'], fields.Date.from_string(expected_date_from)) + self.assertEqual(res['date_to'], fields.Date.from_string(expected_date_to)) + + def test_default_fiscal_year(self): + '''Basic case with a fiscal year xxxx-01-01 - xxxx-12-31.''' + company = self.env.company + company.fiscalyear_last_day = 31 + company.fiscalyear_last_month = '12' + + self.check_compute_fiscal_year( + company, + '2017-12-31', + '2017-01-01', + '2017-12-31', + ) + + self.check_compute_fiscal_year( + company, + '2017-01-01', + '2017-01-01', + '2017-12-31', + ) + + def test_leap_fiscal_year_1(self): + '''Case with a leap year ending the 29 February.''' + company = self.env.company + company.fiscalyear_last_day = 29 + company.fiscalyear_last_month = '2' + + self.check_compute_fiscal_year( + company, + '2016-02-29', + '2015-03-01', + '2016-02-29', + ) + + self.check_compute_fiscal_year( + company, + '2015-03-01', + '2015-03-01', + '2016-02-29', + ) + + def test_leap_fiscal_year_2(self): + '''Case with a leap year ending the 28 February.''' + company = self.env.company + company.fiscalyear_last_day = 28 + company.fiscalyear_last_month = '2' + + self.check_compute_fiscal_year( + company, + '2016-02-29', + '2015-03-01', + '2016-02-29', + ) + + self.check_compute_fiscal_year( + company, + '2016-03-01', + '2016-03-01', + '2017-02-28', + ) + + def test_custom_fiscal_year(self): + '''Case with custom fiscal years.''' + company = self.env.company + company.fiscalyear_last_day = 31 + company.fiscalyear_last_month = '12' + + # Create custom fiscal year covering the 6 first months of 2017. + self.env['account.fiscal.year'].create({ + 'name': '6 month 2017', + 'date_from': '2017-01-01', + 'date_to': '2017-05-31', + 'company_id': company.id, + }) + + # Check before the custom fiscal year). + self.check_compute_fiscal_year( + company, + '2017-02-01', + '2017-01-01', + '2017-05-31', + ) + + # Check after the custom fiscal year. + self.check_compute_fiscal_year( + company, + '2017-11-01', + '2017-06-01', + '2017-12-31', + ) + + # Create custom fiscal year covering the 3 last months of 2017. + self.env['account.fiscal.year'].create({ + 'name': 'last 3 month 2017', + 'date_from': '2017-10-01', + 'date_to': '2017-12-31', + 'company_id': company.id, + }) + + # Check inside the custom fiscal years. + self.check_compute_fiscal_year( + company, + '2017-07-01', + '2017-06-01', + '2017-09-30', + ) diff --git a/dev_odex30_accounting/odex30_account_accountant/tests/test_account_payment.py b/dev_odex30_accounting/odex30_account_accountant/tests/test_account_payment.py new file mode 100644 index 0000000..f3838e1 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/tests/test_account_payment.py @@ -0,0 +1,34 @@ +from odoo.addons.account.tests.common import AccountTestInvoicingCommon +from odoo.tests import tagged + + +@tagged('post_install', '-at_install') +class TestAccountBillPayment(AccountTestInvoicingCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.bank_journal_1 = cls.company_data['default_journal_bank'] + + def test_bill_state_change_on_payment_state(self): + """Test that bill payment state changes correctly when payment state transitions occur. + • Draft payment case: Bill state reverts to 'not_paid' when payment is drafted + • Payment unlink case: Bill state reverts to 'not_paid' when payment is deleted + """ + bill = self.init_invoice('in_invoice', post=True, partner=self.partner_a, products=self.product_a) + + # We have to test it without any Outstanding Payment account set in Journal + self.bank_journal_1.outbound_payment_method_line_ids.payment_account_id = False + + payment = self.env['account.payment.register']\ + .with_context(active_model='account.move', active_ids=bill.ids)\ + .create({})\ + ._create_payments() + self.assertEqual(bill.payment_state, self.env['account.move']._get_invoice_in_payment_state()) + + payment.action_draft() + self.assertEqual(payment.state, 'draft') + self.assertEqual(payment.invoice_ids.payment_state, 'not_paid') + + payment.unlink() + self.assertEqual(bill.payment_state, 'not_paid') diff --git a/dev_odex30_accounting/odex30_account_accountant/tests/test_account_reconcile_wizard.py b/dev_odex30_accounting/odex30_account_accountant/tests/test_account_reconcile_wizard.py new file mode 100644 index 0000000..d59de5a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/tests/test_account_reconcile_wizard.py @@ -0,0 +1,856 @@ +import re + +from odoo import Command, fields +from odoo.exceptions import UserError +from odoo.tests import tagged + +from odoo.addons.account.tests.common import AccountTestInvoicingCommon + + +@tagged('post_install', '-at_install') +class TestAccountReconcileWizard(AccountTestInvoicingCommon): + """ Tests the account reconciliation and its wizard. """ + + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.receivable_account = cls.company_data['default_account_receivable'] + cls.payable_account = cls.company_data['default_account_payable'] + cls.revenue_account = cls.company_data['default_account_revenue'] + cls.payable_account_2 = cls.env['account.account'].create({ + 'name': 'Payable Account 2', + 'account_type': 'liability_current', + 'code': 'PAY2.TEST', + 'reconcile': True + }) + cls.write_off_account = cls.env['account.account'].create({ + 'name': 'Write-Off Account', + 'account_type': 'liability_current', + 'code': 'WO.TEST', + 'reconcile': False + }) + + cls.misc_journal = cls.company_data['default_journal_misc'] + cls.test_date = fields.Date.from_string('2016-01-01') + cls.company_currency = cls.company_data['currency'] + cls.foreign_currency = cls.setup_other_currency('EUR') + cls.foreign_currency_2 = cls.setup_other_currency('XAF', rates=[('2016-01-01', 6.0), ('2017-01-01', 4.0)]) + + # ------------------------------------------------------------------------- + # HELPERS + # ------------------------------------------------------------------------- + def assertWizardReconcileValues(self, selected_lines, input_values, wo_expected_values, expected_transfer_values=None): + wizard = self.env['account.reconcile.wizard'].with_context( + active_model='account.move.line', + active_ids=selected_lines.ids, + ).new(input_values) + if expected_transfer_values: + transfer_move = wizard.create_transfer() + # transfer move values + self.assertRecordValues(transfer_move.line_ids.sorted('balance'), expected_transfer_values) + # transfer warning message + self.assertTrue(wizard.transfer_warning_message) + regex_match = re.findall(r'([+-]*\d*,*\d+\.*\d+)', wizard.transfer_warning_message) + # match transferred amount + self.assertEqual( + float(regex_match[0].replace(',', '')), + transfer_move.amount_total_in_currency_signed or transfer_move.amount_total_signed + ) + transfer_from_account = transfer_move.line_ids.filtered(lambda aml: 'Transfer from' in aml.name).account_id + transfer_to_account = transfer_move.line_ids.account_id - transfer_from_account + transfer_from_amls = transfer_move.line_ids.filtered(lambda aml: aml.account_id == transfer_from_account) + transfer_amount = sum(aml.balance for aml in transfer_from_amls) + # match account codes + if transfer_amount > 0: + self.assertEqual(regex_match[1:], [transfer_from_account.code, transfer_to_account.code]) + else: + self.assertEqual(regex_match[1:], [transfer_to_account.code, transfer_from_account.code]) + write_off_move = wizard.create_write_off() + self.assertRecordValues(write_off_move.line_ids.sorted('balance'), wo_expected_values) + wizard.reconcile() + if wizard.allow_partials or ( + wizard.edit_mode + and wizard.reco_currency_id.compare_amounts(wizard.edit_mode_amount_currency, wizard.amount_currency) + ): + # partial reconcile + self.assertTrue(len(selected_lines.matched_debit_ids) > 0 or len(selected_lines.matched_credit_ids) > 0) + else: + # full reconcile + self.assertTrue(selected_lines.full_reconcile_id) + self.assertRecordValues( + selected_lines, + [{'amount_residual': 0.0, 'amount_residual_currency': 0.0, 'reconciled': True}] * len(selected_lines), + ) + + # ------------------------------------------------------------------------- + # TESTS + # ------------------------------------------------------------------------- + def test_wizard_should_not_open(self): + """ Test that when we reconcile two lines that belong to the same account and have a 0 balance should + reconcile silently and not open the write-off wizard. + """ + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(-1000.0, -1000.0, self.company_currency, '2016-01-01') + (line_1 + line_2).action_reconcile() + self.assertRecordValues( + line_1 + line_2, + [{'amount_residual': 0.0, 'amount_residual_currency': 0.0, 'reconciled': True}] * 2 + ) + + def test_wizard_should_open(self): + """ Test that when a write-off is required (because of transfer or non-zero balance) the wizard opens. """ + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(-500.0, -500.0, self.company_currency, '2016-01-01') + line_3 = self.create_line_for_reconciliation(-500.0, -1500.0, self.foreign_currency, '2016-01-01') + line_4 = self.create_line_for_reconciliation(-900.0, -900.0, self.company_currency, '2016-01-01', account_1=self.payable_account) + for batch, sub_test_name in ( + (line_1 + line_2, 'Batch with non-zero balance in company currency'), + (line_1 + line_3, 'Batch with non-zero balance in foreign currency'), + (line_1 + line_4, 'Batch with different accounts'), + ): + with self.subTest(sub_test_name=sub_test_name): + returned_action = batch.action_reconcile() + self.assertEqual(returned_action.get('res_model'), 'account.reconcile.wizard') + + def test_reconcile_silently_same_account(self): + """ When balance is 0 we can silently reconcile items. """ + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(-1000.0, -1000.0, self.company_currency, '2016-01-01') + lines = (line_1 + line_2) + lines.action_reconcile() + self.assertTrue(lines.full_reconcile_id) + self.assertRecordValues( + lines, + [{'amount_residual': 0.0, 'amount_residual_currency': 0.0, 'reconciled': True}] * len(lines), + ) + + def test_reconcile_silently_transfer(self): + """ When balance is 0, and we need a transfer, we do the transfer+reconcile silently. """ + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(-1000.0, -1000.0, self.company_currency, '2016-01-01', account_1=self.payable_account) + lines = (line_1 + line_2) + lines.action_reconcile() + self.assertTrue(lines.full_reconcile_id) + self.assertRecordValues( + lines, + [{'amount_residual': 0.0, 'amount_residual_currency': 0.0, 'reconciled': True}] * len(lines), + ) + + def test_write_off_same_currency(self): + """ Reconciliation of two lines with no transfer/foreign currencies/taxes/reco models.""" + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(-500.0, -500.0, self.company_currency, '2016-01-01') + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + } + write_off_expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', 'balance': -500.0}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', 'balance': 500.0}, + ] + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, write_off_expected_values) + + def test_write_off_one_foreign_currency(self): + """ Reconciliation of two lines with one of the two using foreign currency should reconcile in foreign currency.""" + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(-500.0, -1500.0, self.foreign_currency, '2016-01-01') + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + } + expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', + 'balance': -500.0, 'amount_currency': -1500.0, 'currency_id': self.foreign_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 500.0, 'amount_currency': 1500.0, 'currency_id': self.foreign_currency.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, expected_values) + + def test_write_off_one_foreign_currency_rounding(self): + """ Reconciliation of two lines with one of the two using foreign currency should reconcile in foreign currency.""" + foreign_currency = self.setup_other_currency('CAD', rounding=0.01, rates=[('2016-01-01', 0.052972554919), ('2017-01-01', 4.0)]) + + # Check that the reconciliation works independently of + # - whether the foreign amount is debit or credit + # - the account type (payable / receivable) + self.assertFalse(self.payable_account_2.account_type in ('asset_receivable', 'liability_payable')) + self.assertTrue(self.receivable_account.account_type in ('asset_receivable', 'liability_payable')) + for foreign_amount_sign, account in [ + (-1, self.payable_account_2), + (1, self.payable_account_2), + (-1, self.receivable_account), + (1, self.receivable_account), + ]: + with self.subTest(sub_test_name=f'sign: {foreign_amount_sign}, account: {account.name}'): + line_1 = self.create_line_for_reconciliation( + -foreign_amount_sign * 372239.38, -foreign_amount_sign * 372239.38, self.company_currency, + '2016-01-01', account_1=account, + ) + line_2 = self.create_line_for_reconciliation( + foreign_amount_sign * 377554.0, foreign_amount_sign * 20000.0, foreign_currency, + '2016-01-01', account_1=account, + ) + lines = line_1 + line_2 + + # Test the opening of the wizard without input values + wizard = self.env['account.reconcile.wizard'].with_context( + active_model='account.move.line', + active_ids=lines.ids, + ).new() + self.assertRecordValues(wizard, [{ + 'is_write_off_required': True, + 'amount': foreign_amount_sign * 5314.62, + 'amount_currency': foreign_amount_sign * 281.53, + 'reco_currency_id': foreign_currency.id, + }]) + + # Check the created write-off move and that there is no residual + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + } + # We sort the expected values the same way as `assertWizardReconcileValues` sorts the lines + expected_values = sorted([ + {'account_id': account.id, 'name': 'Write-Off Test Label', + 'balance': -foreign_amount_sign * 5314.62, + 'amount_currency': -foreign_amount_sign * 281.53, 'currency_id': foreign_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': foreign_amount_sign * 5314.62, + 'amount_currency': foreign_amount_sign * 281.53, 'currency_id': foreign_currency.id}, + ], key=lambda vals: vals['balance']) + self.assertWizardReconcileValues(lines, wizard_input_values, expected_values) + + full_reconcile = lines.full_reconcile_id + self.assertTrue(full_reconcile) + self.assertFalse(full_reconcile.exchange_move_id) + + def test_write_off_mixed_foreign_currencies(self): + """ Write off with multiple currencies should reconcile in company currency.""" + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(-500.0, -1500.0, self.foreign_currency, '2016-01-01') + line_3 = self.create_line_for_reconciliation(-400.0, -2400.0, self.foreign_currency_2, '2016-01-01') + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + } + expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', + 'balance': -100.0, 'amount_currency': -100.0, 'currency_id': self.company_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 100.0, 'amount_currency': 100.0, 'currency_id': self.company_currency.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2 + line_3, wizard_input_values, expected_values) + + def test_write_off_one_foreign_currency_change_rate(self): + """ Tests that write-off use the correct rate from/at wizard's date. """ + foreign_currency = self.setup_other_currency('CAD', rounding=0.001, rates=[('2016-01-01', 0.5), ('2017-01-01', 1 / 3)]) + new_date = fields.Date.from_string('2017-02-01') + line_1 = self.create_line_for_reconciliation(-2000.0, -2000.0, self.company_currency, '2017-01-01') # conversion in 2017 => -666.67🍫 + line_2 = self.create_line_for_reconciliation(2000.0, 1000.0, foreign_currency, '2016-01-01') + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': new_date, + } + expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', + 'balance': -1000.0, 'amount_currency': -333.333, 'currency_id': foreign_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 1000.0, 'amount_currency': 333.333, 'currency_id': foreign_currency.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, expected_values) + + def test_write_off_mixed_foreign_currencies_change_rate(self): + """ Tests that write-off use the correct rate from/at wizard's date. """ + new_date = fields.Date.from_string('2017-02-01') + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(-500.0, -1500.0, self.foreign_currency, '2016-01-01') + line_3 = self.create_line_for_reconciliation(-400.0, -2400.0, self.foreign_currency_2, '2016-01-01') + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': new_date, + } + expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', + 'balance': -100.0, 'amount_currency': -100.0, 'currency_id': self.company_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 100.0, 'amount_currency': 100.0, 'currency_id': self.company_currency.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2 + line_3, wizard_input_values, expected_values) + + def test_write_off_both_same_foreign_currency_ensure_no_exchange_diff(self): + """ Test that if both AMLs have the same foreign currency and rate, the amount in company currency + is computed on the write-off in such a way that no exchange diff is created. + """ + foreign_currency = self.setup_other_currency('CAD', rounding=0.01, rates=[('2016-01-01', 1 / 0.225)]) + new_date = fields.Date.from_string('2017-02-01') + line_1 = self.create_line_for_reconciliation(21.38, 95.0, foreign_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(1.13, 5.0, foreign_currency, '2016-01-01') + line_3 = self.create_line_for_reconciliation(1.13, 5.0, foreign_currency, '2016-01-01') + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': new_date, + } + expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', + 'balance': -23.64, 'amount_currency': -105.0, 'currency_id': foreign_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 23.64, 'amount_currency': 105.0, 'currency_id': foreign_currency.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2 + line_3, wizard_input_values, expected_values) + + def test_write_off_with_transfer_account_same_currency(self): + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(100.0, 100.0, self.company_currency, '2016-01-01', account_1=self.payable_account) + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + } + expected_transfer_values = [ + {'account_id': self.payable_account.id, 'name': f'Transfer to {self.receivable_account.display_name}', + 'balance': -100.0, 'amount_currency': -100.0, 'currency_id': self.company_currency.id}, + {'account_id': self.receivable_account.id, 'name': f'Transfer from {self.payable_account.display_name}', + 'balance': 100.0, 'amount_currency': 100.0, 'currency_id': self.company_currency.id}, + ] + expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', + 'balance': -1100.0, 'amount_currency': -1100.0, 'currency_id': self.company_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 1100.0, 'amount_currency': 1100.0, 'currency_id': self.company_currency.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, expected_values, expected_transfer_values=expected_transfer_values) + + def test_write_off_with_transfer_account_one_foreign_currency(self): + line_1 = self.create_line_for_reconciliation(1100.0, 1100.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(100.0, 300.0, self.foreign_currency, '2016-01-01', account_1=self.payable_account) + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + } + expected_transfer_values = [ + {'account_id': self.payable_account.id, 'name': f'Transfer to {self.receivable_account.display_name}', + 'balance': -100.0, 'amount_currency': -300.0, 'currency_id': self.foreign_currency.id}, + {'account_id': self.receivable_account.id, 'name': f'Transfer from {self.payable_account.display_name}', + 'balance': 100.0, 'amount_currency': 300.0, 'currency_id': self.foreign_currency.id}, + ] + expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', + 'balance': -1200.0, 'amount_currency': -3600.0, 'currency_id': self.foreign_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 1200.0, 'amount_currency': 3600.0, 'currency_id': self.foreign_currency.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, expected_values, expected_transfer_values=expected_transfer_values) + + def test_write_off_with_complex_transfer(self): + partner_1 = self.env['res.partner'].create({'name': 'Test Partner 1'}) + partner_2 = self.env['res.partner'].create({'name': 'Test Partner 2'}) + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01', partner=partner_2) + line_2 = self.create_line_for_reconciliation(-100.0, -300.0, self.foreign_currency, '2016-01-01', account_1=self.payable_account, partner=partner_1) + line_3 = self.create_line_for_reconciliation(-200.0, -200.0, self.company_currency, '2016-01-01', account_1=self.payable_account, partner=partner_2) + line_4 = self.create_line_for_reconciliation(-200.0, -600.0, self.foreign_currency, '2016-01-01', account_1=self.payable_account, partner=partner_2) + line_5 = self.create_line_for_reconciliation(-200.0, -600.0, self.foreign_currency, '2016-01-01', account_1=self.payable_account, partner=partner_2) + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + } + expected_transfer_values = [ + {'account_id': self.receivable_account.id, 'name': f'Transfer from {self.payable_account.display_name}', + 'balance': -400.0, 'amount_currency': -1200.0, 'currency_id': self.foreign_currency.id, 'partner_id': partner_2.id}, + {'account_id': self.receivable_account.id, 'name': f'Transfer from {self.payable_account.display_name}', + 'balance': -200.0, 'amount_currency': -200.0, 'currency_id': self.company_currency.id, 'partner_id': partner_2.id}, + {'account_id': self.receivable_account.id, 'name': f'Transfer from {self.payable_account.display_name}', + 'balance': -100.0, 'amount_currency': -300.0, 'currency_id': self.foreign_currency.id, 'partner_id': partner_1.id}, + {'account_id': self.payable_account.id, 'name': f'Transfer to {self.receivable_account.display_name}', + 'balance': 100.0, 'amount_currency': 300.0, 'currency_id': self.foreign_currency.id, 'partner_id': partner_1.id}, + {'account_id': self.payable_account.id, 'name': f'Transfer to {self.receivable_account.display_name}', + 'balance': 200.0, 'amount_currency': 200.0, 'currency_id': self.company_currency.id, 'partner_id': partner_2.id}, + {'account_id': self.payable_account.id, 'name': f'Transfer to {self.receivable_account.display_name}', + 'balance': 400.0, 'amount_currency': 1200.0, 'currency_id': self.foreign_currency.id, 'partner_id': partner_2.id}, + ] + expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', + 'balance': -300.0, 'amount_currency': -900.0, 'currency_id': self.foreign_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 300.0, 'amount_currency': 900.0, 'currency_id': self.foreign_currency.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2 + line_3 + line_4 + line_5, wizard_input_values, expected_values, expected_transfer_values=expected_transfer_values) + + def test_write_off_with_tax(self): + """ Tests write-off with a tax set on the wizard. """ + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(-500.0, -500.0, self.company_currency, '2016-01-01') + tax_recover_account_id = self.env['account.account'].create({ + 'name': 'Tax Account Test', + 'account_type': 'liability_current', + 'code': 'TAX.TEST', + 'reconcile': False + }) + base_tag = self.env['account.account.tag'].create({ + 'applicability': 'taxes', + 'name': 'base_tax_tag', + 'country_id': self.company_data['company'].country_id.id, + }) + tax_tag = self.env['account.account.tag'].create({ + 'applicability': 'taxes', + 'name': 'tax_tax_tag', + 'country_id': self.company_data['company'].country_id.id, + }) + tax_id = self.env['account.tax'].create({ + 'name': 'tax_test', + 'amount_type': 'percent', + 'amount': 25.0, + 'type_tax_use': 'sale', + 'company_id': self.company_data['company'].id, + 'invoice_repartition_line_ids': [ + Command.create({'factor_percent': 100, 'repartition_type': 'base', 'tag_ids': [Command.set(base_tag.ids)]}), + Command.create({'factor_percent': 100, 'account_id': tax_recover_account_id.id, 'tag_ids': [Command.set(tax_tag.ids)]}), + ], + 'refund_repartition_line_ids': [ + Command.create({'factor_percent': 100, 'repartition_type': 'base', 'tag_ids': [Command.set(base_tag.ids)]}), + Command.create({'factor_percent': 100, 'account_id': tax_recover_account_id.id, 'tag_ids': [Command.set(tax_tag.ids)]}), + ], + }) + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'tax_id': tax_id.id, + 'allow_partials': False, + 'date': self.test_date, + } + write_off_expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', 'balance': -500.0}, + {'account_id': tax_recover_account_id.id, 'name': f'{tax_id.name}', 'balance': 100.0}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', 'balance': 400.0}, + ] + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, write_off_expected_values) + + def test_reconcile_partials_allowed(self): + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(-500.0, -500.0, self.company_currency, '2016-01-01') + lines = line_1 + line_2 + wizard_input_values = { + 'allow_partials': True, + } + wizard = self.env['account.reconcile.wizard'].with_context( + active_model='account.move.line', + active_ids=lines.ids, + ).new(wizard_input_values) + wizard.reconcile() + self.assertTrue(len(lines.matched_debit_ids) > 0 or len(lines.matched_credit_ids) > 0) + + def test_raise_lock_date_violation(self): + """ If a write-off violates the lock date we display a banner and change the date afterwards. """ + company_id = self.company_data['company'] + company_id.fiscalyear_lock_date = fields.Date.from_string('2016-12-01') + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-06-01') + line_2 = self.create_line_for_reconciliation(-500.0, -500.0, self.company_currency, '2016-06-01') + wizard = self.env['account.reconcile.wizard'].with_context( + active_model='account.move.line', + active_ids=(line_1 + line_2).ids, + ).new({'date': self.test_date}) + self.assertTrue(bool(wizard.lock_date_violated_warning_message)) + + def test_raise_reconcile_too_many_accounts(self): + """ If you try to reconcile lines from more than 2 accounts, it should raise an error. """ + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(-500.0, -500.0, self.company_currency, '2016-01-01', account_1=self.payable_account) + line_3 = self.create_line_for_reconciliation(-500.0, -500.0, self.company_currency, '2016-01-01', account_1=self.payable_account_2) + with self.assertRaises(UserError): + (line_1 + line_2 + line_3).action_reconcile() + + def test_reconcile_no_receivable_no_payable_account(self): + """ If you try to reconcile lines in an account that is neither from payable nor receivable + it should reconcile in company currency. + """ + account = self.company_data['default_account_expense'] + account.reconcile = True + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01', account_1=account) + line_2 = self.create_line_for_reconciliation(-500.0, -1500.0, self.foreign_currency, '2016-01-01', account_1=account) + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + } + expected_values = [ + {'account_id': account.id, 'name': 'Write-Off Test Label', + 'balance': -500.0, 'amount_currency': -500.0, 'currency_id': self.company_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 500.0, 'amount_currency': 500.0, 'currency_id': self.company_currency.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, expected_values) + + def test_reconcile_exchange_diff_foreign_currency(self): + """ When reconciling exchange_diff with amount_residual_currency = 0 we need to reconcile in company_currency. + """ + exchange_gain_account = self.company_data['company'].income_currency_exchange_account_id + exchange_gain_account.reconcile = True + line_1 = self.create_line_for_reconciliation(150.0, 0.0, self.foreign_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(-100.0, 0.0, self.foreign_currency, '2016-01-01', account_1=exchange_gain_account) + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + } + # Note the transfer will always be in the currency of the line transferred + expected_transfer_values = [ + {'account_id': self.receivable_account.id, 'name': f'Transfer from {exchange_gain_account.display_name}', + 'balance': -100.0, 'amount_currency': 0.0, 'currency_id': self.foreign_currency.id}, + {'account_id': exchange_gain_account.id, 'name': f'Transfer to {self.receivable_account.display_name}', + 'balance': 100.0, 'amount_currency': 0.0, 'currency_id': self.foreign_currency.id}, + ] + expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', + 'balance': -50.0, 'amount_currency': -50.0, 'currency_id': self.company_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 50.0, 'amount_currency': 50.0, 'currency_id': self.company_currency.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, expected_values, expected_transfer_values=expected_transfer_values) + + def test_write_off_on_same_account(self): + """ When creating a write-off in the same account than the one used by the lines to reconcile, + the lines and the write-off should be fully reconciled. + """ + line_1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(2000.0, 2000.0, self.company_currency, '2016-01-01') + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.receivable_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + } + write_off_expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', 'balance': -3000.0}, + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', 'balance': 3000.0}, + ] + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, write_off_expected_values) + + def test_reconcile_exchange_diff_foreign_currency_full(self): + """ When reconciling exchange_diff with amount_residual_currency = 0 we need to reconcile in company_currency. + """ + exchange_gain_account = self.company_data['company'].income_currency_exchange_account_id + exchange_gain_account.reconcile = True + line_1 = self.create_line_for_reconciliation(100.0, 0.0, self.foreign_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(-100.0, 0.0, self.foreign_currency, '2016-01-01', account_1=exchange_gain_account) + lines = line_1 + line_2 + lines.action_reconcile() + self.assertTrue(lines.full_reconcile_id) + self.assertRecordValues( + lines, + [{'amount_residual': 0.0, 'amount_residual_currency': 0.0, 'reconciled': True}] * len(lines), + ) + + def test_write_off_kpmg_case(self): + """ Test that write-off does a full reconcile with 2 foreign currencies using a custom exchange rate. """ + new_date = fields.Date.from_string('2017-02-01') + line_1 = self.create_line_for_reconciliation(1000.0, 1500.0, self.foreign_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(-900.0, -5400.0, self.foreign_currency_2, '2016-01-01') + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': new_date, + } + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, [ + { + 'account_id': self.receivable_account.id, + 'balance': -100.0, + 'amount_currency': -150.0, + 'currency_id': self.foreign_currency.id, + }, + { + 'account_id': self.write_off_account.id, + 'balance': 100.0, + 'amount_currency': 150.0, + 'currency_id': self.foreign_currency.id, + }, + ]) + + def test_write_off_multi_curr_multi_residuals_force_partials(self): + """ Test that we raise an error when trying to reconcile lines with multiple residuals. + Here debit1 will be reconciled with credit1 first as they have the same currency. + Then residual of debit1 will try to reconcile with debit2 which is impossible + => 2 residuals both in foreign currency, we don't know in which currency we should make the write-off + => We should only allow partial reconciliation. """ + debit_1 = self.create_line_for_reconciliation(2000.0, 12000.0, self.foreign_currency_2, '2016-01-01') + credit_1 = self.create_line_for_reconciliation(-1000.0, -6000.0, self.foreign_currency_2, '2016-01-01') + debit_2 = self.create_line_for_reconciliation(2000.0, 3000.0, self.foreign_currency, '2016-01-01') + wizard = self.env['account.reconcile.wizard'].with_context( + active_model='account.move.line', + active_ids=(debit_1 + debit_2 + credit_1).ids, + ).new() + self.assertRecordValues(wizard, [{'force_partials': True, 'allow_partials': True}]) + + def test_write_off_multi_curr_multi_residuals_exch_diff_force_partials(self): + debit_1 = self.create_line_for_reconciliation(2000.0, 0.0, self.foreign_currency_2, '2016-01-01') + credit_1 = self.create_line_for_reconciliation(-1000.0, 0.0, self.foreign_currency_2, '2016-01-01') + debit_2 = self.create_line_for_reconciliation(2000.0, 0.0, self.foreign_currency, '2016-01-01') + wizard = self.env['account.reconcile.wizard'].with_context( + active_model='account.move.line', + active_ids=(debit_1 + debit_2 + credit_1).ids, + ).new() + self.assertRecordValues(wizard, [{'force_partials': True, 'allow_partials': True}]) + + def test_reconcile_with_partner_change(self): + partner_1 = self.env['res.partner'].create({'name': 'Test Partner 1'}) + partner_2 = self.env['res.partner'].create({'name': 'Test Partner 2'}) + line_1 = self.create_line_for_reconciliation(-1000.0, -1000.0, self.company_currency, '2016-01-01', partner=partner_1) + line_2 = self.create_line_for_reconciliation(2000.0, 2000.0, self.company_currency, '2016-01-01') + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.receivable_account.id, + 'to_partner_id': partner_2.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + 'tax_id': self.tax_sale_a.id, + } + write_off_expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', 'balance': -1000.0, 'partner_id': partner_1.id}, + {'account_id': self.company_data['default_account_tax_sale'].id, 'name': '15%', 'balance': 130.43, 'partner_id': partner_2.id}, + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', 'balance': 869.57, 'partner_id': partner_2.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, write_off_expected_values) + + def test_reconcile_with_partner_change_and_transfer(self): + partner_1 = self.env['res.partner'].create({'name': 'Test Partner 1'}) + partner_2 = self.env['res.partner'].create({'name': 'Test Partner 2'}) + line_1 = self.create_line_for_reconciliation(-1000.0, -1000.0, self.company_currency, '2016-01-01', account_1=self.payable_account) + line_2 = self.create_line_for_reconciliation(2000.0, 2000.0, self.company_currency, '2016-01-01', partner=partner_1) + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.receivable_account.id, + 'to_partner_id': partner_2.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + } + expected_transfer_values = [ + {'account_id': self.receivable_account.id, 'name': f'Transfer from {self.payable_account.display_name}', + 'balance': -1000.0, 'amount_currency': -1000.0, 'currency_id': self.company_currency.id}, + {'account_id': self.payable_account.id, 'name': f'Transfer to {self.receivable_account.display_name}', + 'balance': 1000.0, 'amount_currency': 1000.0, 'currency_id': self.company_currency.id}, + ] + write_off_expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', 'balance': -1000.0, 'partner_id': partner_1.id}, + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', 'balance': 1000.0, 'partner_id': partner_2.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, write_off_expected_values, expected_transfer_values) + + def test_reconcile_edit_mode_partial_foreign_curr(self): + line_1 = self.create_line_for_reconciliation(100.0, 300.0, self.foreign_currency, '2016-01-01') + wizard_input_values = { + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'date': self.test_date, + 'edit_mode_amount_currency': 30.0, + } + expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', + 'balance': -10.0, 'amount_currency': -30.0, 'currency_id': self.foreign_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 10.0, 'amount_currency': 30.0, 'currency_id': self.foreign_currency.id}, + ] + self.assertWizardReconcileValues(line_1, wizard_input_values, expected_values) + + def test_reconcile_edit_mode_partial_company_curr(self): + line_1 = self.create_line_for_reconciliation(300.0, 300.0, self.company_currency, '2016-01-01') + wizard_input_values = { + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'date': self.test_date, + 'edit_mode_amount_currency': 100.0, + } + expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', + 'balance': -100.0, 'amount_currency': -100.0, 'currency_id': self.company_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 100.0, 'amount_currency': 100.0, 'currency_id': self.company_currency.id}, + ] + self.assertWizardReconcileValues(line_1, wizard_input_values, expected_values) + + def test_reconcile_edit_mode_partial_wrong_amount_raises(self): + line_1 = self.create_line_for_reconciliation(300.0, 300.0, self.company_currency, '2016-01-01') + wizard_input_values = { + 'account_id': self.write_off_account.id, + } + wizard = self.env['account.reconcile.wizard'].with_context( + active_model='account.move.line', + active_ids=line_1.ids, + ).create(wizard_input_values) + with self.assertRaisesRegex(UserError, 'The amount of the write-off'): + wizard.edit_mode_amount_currency = -100.0 + + def test_reconcile_edit_mode_full_reconcile(self): + line_1 = self.create_line_for_reconciliation(300.0, 300.0, self.company_currency, '2016-01-01') + wizard_input_values = { + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'edit_mode_amount_currency': 300.0, + } + expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', + 'balance': -300.0, 'amount_currency': -300.0, 'currency_id': self.company_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 300.0, 'amount_currency': 300.0, 'currency_id': self.company_currency.id}, + ] + self.assertWizardReconcileValues(line_1, wizard_input_values, expected_values) + + def test_reconcile_same_currency_same_side_not_recpay(self): + """ + Test the reconciliation with two lines on the same side (debit/credit), same currency and not on a receivable/payable account + """ + current_assets_account = self.company_data['default_account_assets'].copy({'name': 'Current Assets', 'account_type': 'asset_current', 'reconcile': True}) + line_1 = self.create_line_for_reconciliation(200, 200, self.company_currency, '2016-01-01', current_assets_account) + line_2 = self.create_line_for_reconciliation(200, 200, self.company_currency, '2016-01-01', current_assets_account) + + # Test the opening of the wizard without input values + wizard = self.env['account.reconcile.wizard'].with_context( + active_model='account.move.line', + active_ids=(line_1 + line_2).ids, + ).new() + + self.assertRecordValues(wizard, [{'is_write_off_required': True, 'amount': 400, 'amount_currency': 400}]) + + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + } + expected_values = [ + {'account_id': current_assets_account.id, 'name': 'Write-Off Test Label', + 'balance': -400.0, 'amount_currency': -400.0, 'currency_id': self.company_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 400.0, 'amount_currency': 400.0, 'currency_id': self.company_currency.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, expected_values) + + def test_reconcile_foreign_currency_same_side_not_recpay(self): + """ + Test the reconciliation with two lines on the same side (debit/credit), one foreign currency and not on a receivable/payable account + """ + current_assets_account = self.company_data['default_account_assets'].copy({'name': 'Current Assets', 'account_type': 'asset_current', 'reconcile': True}) + line_1 = self.create_line_for_reconciliation(200, 300, self.foreign_currency, '2016-01-01', current_assets_account) + line_2 = self.create_line_for_reconciliation(200, 200, self.company_currency, '2016-01-01', current_assets_account) + + # Test the opening of the wizard without input values + wizard = self.env['account.reconcile.wizard'].with_context( + active_model='account.move.line', + active_ids=(line_1 + line_2).ids, + ).new() + + self.assertRecordValues(wizard, [{'is_write_off_required': True, 'amount': 400, 'amount_currency': 400}]) + + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + } + expected_values = [ + {'account_id': current_assets_account.id, 'name': 'Write-Off Test Label', + 'balance': -400.0, 'amount_currency': -400.0, 'currency_id': self.company_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 400.0, 'amount_currency': 400.0, 'currency_id': self.company_currency.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, expected_values) + + def test_reconcile_same_side_exch_diff(self): + """ + Test the reconciliation with two lines on the same side (debit/credit), one exchange diff in foreign currency, + one regular aml in company currency + """ + exchange_gain_account = self.company_data['company'].income_currency_exchange_account_id + exchange_gain_account.reconcile = True + line_1 = self.create_line_for_reconciliation(150.0, 150.0, self.company_currency, '2016-01-01') + line_2 = self.create_line_for_reconciliation(100.0, 0.0, self.foreign_currency, '2016-01-01', account_1=exchange_gain_account) + wizard_input_values = { + 'journal_id': self.misc_journal.id, + 'account_id': self.write_off_account.id, + 'label': 'Write-Off Test Label', + 'allow_partials': False, + 'date': self.test_date, + } + # Note the transfer will always be in the currency of the line transferred + expected_transfer_values = [ + {'account_id': exchange_gain_account.id, 'name': f'Transfer to {self.receivable_account.display_name}', + 'balance': -100.0, 'amount_currency': 0.0, 'currency_id': self.foreign_currency.id}, + {'account_id': self.receivable_account.id, 'name': f'Transfer from {exchange_gain_account.display_name}', + 'balance': 100.0, 'amount_currency': 0.0, 'currency_id': self.foreign_currency.id}, + ] + expected_values = [ + {'account_id': self.receivable_account.id, 'name': 'Write-Off Test Label', + 'balance': -250.0, 'amount_currency': -250.0, 'currency_id': self.company_currency.id}, + {'account_id': self.write_off_account.id, 'name': 'Write-Off Test Label', + 'balance': 250.0, 'amount_currency': 250.0, 'currency_id': self.company_currency.id}, + ] + self.assertWizardReconcileValues(line_1 + line_2, wizard_input_values, expected_values, expected_transfer_values=expected_transfer_values) + + def test_reconcile_transfer_with_different_partners(self): + """ When balance is 0, and we need a transfer, we do the transfer+reconcile silently. """ + partner_a = self.env['res.partner'].create({'name': 'Test Partner A'}) + partner_b = self.env['res.partner'].create({'name': 'Test Partner B'}) + partner_c = self.env['res.partner'].create({'name': 'Test Partner C'}) + # when reconciling journal items on 2 different accounts from 2 different partners that balance themselves, + # all journal items should be fully reconciled together + line_a1 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01', account_1=self.receivable_account, partner=partner_a) + line_b1 = self.create_line_for_reconciliation(-1000.0, -1000.0, self.company_currency, '2016-01-01', account_1=self.payable_account, partner=partner_b) + lines = line_a1 + line_b1 + lines.action_reconcile() + transfer_lines = lines.full_reconcile_id.reconciled_line_ids.filtered(lambda line: line.id not in lines.ids) + self.assertRecordValues(transfer_lines, [ + {'balance': -1000.0, 'account_id': self.receivable_account.id, 'partner_id': partner_a.id}, + {'balance': 1000.0, 'account_id': self.payable_account.id, 'partner_id': partner_b.id}, + ]) + # even if the journal items on one of the accounts are for several different partners, + # the journal items should be fully reconciled together + line_a2 = self.create_line_for_reconciliation(1000.0, 1000.0, self.company_currency, '2016-01-01', account_1=self.receivable_account, partner=partner_a) + line_b2 = self.create_line_for_reconciliation(-600.0, -600.0, self.company_currency, '2016-01-01', account_1=self.payable_account, partner=partner_b) + line_c2 = self.create_line_for_reconciliation(-400.0, -400.0, self.company_currency, '2016-01-01', account_1=self.payable_account, partner=partner_c) + lines = line_a2 + line_b2 + line_c2 + lines.action_reconcile() + transfer_lines = lines.full_reconcile_id.reconciled_line_ids.filtered(lambda line: line.id not in lines.ids) + self.assertRecordValues(transfer_lines, [ + {'balance': -1000.0, 'account_id': self.receivable_account.id, 'partner_id': partner_a.id}, + {'balance': 600.0, 'account_id': self.payable_account.id, 'partner_id': partner_b.id}, + {'balance': 400.0, 'account_id': self.payable_account.id, 'partner_id': partner_c.id}, + ]) diff --git a/dev_odex30_accounting/odex30_account_accountant/tests/test_bank_rec_widget.py b/dev_odex30_accounting/odex30_account_accountant/tests/test_bank_rec_widget.py new file mode 100644 index 0000000..5bec5d6 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/tests/test_bank_rec_widget.py @@ -0,0 +1,3726 @@ +# -*- coding: utf-8 -*- +from odoo.addons.odex30_account_accountant.tests.test_bank_rec_widget_common import TestBankRecWidgetCommon +from odoo.tests import tagged +from odoo.tools import html2plaintext +from odoo import fields, Command + +from freezegun import freeze_time +from unittest.mock import patch +import re + + +@tagged('post_install', '-at_install') +class TestBankRecWidget(TestBankRecWidgetCommon): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.company_data_2 = cls.setup_other_company() + + cls.early_payment_term = cls.env['account.payment.term'].create({ + 'name': "early_payment_term", + 'company_id': cls.company_data['company'].id, + 'discount_percentage': 10, + 'discount_days': 10, + 'early_discount': True, + 'line_ids': [ + Command.create({ + 'value': 'percent', + 'value_amount': 100, + 'nb_days': 20, + }), + ], + }) + + cls.account_revenue1 = cls.company_data['default_account_revenue'] + cls.account_revenue2 = cls.copy_account(cls.account_revenue1) + + cls.reco_model_bill = cls.env['account.reconcile.model'].create({ + 'name': "test create bill", + 'rule_type': 'writeoff_button', + 'counterpart_type': 'purchase', + 'line_ids': [ + Command.create({'amount_string': '50'}), + Command.create({'amount_string': '50'}), + ], + }) + + def assert_form_extra_text_value(self, wizard, regex): + line = wizard.line_ids.filtered(lambda x: x.index == wizard.form_index) + value = line.suggestion_html + if regex: + cleaned_value = html2plaintext(value).replace('\n', '') + if not re.match(regex, cleaned_value): + self.fail(f"The following 'form_extra_text':\n\n'{cleaned_value}'\n\n...doesn't match the provided regex:\n\n'{regex}'") + else: + self.assertFalse(value) + + def test_retrieve_partner_from_account_number(self): + st_line = self._create_st_line(1000.0, partner_id=None, account_number="014 474 8555") + bank_account = self.env['res.partner.bank'].create({ + 'acc_number': '0144748555', + 'partner_id': self.partner_a.id, + }) + self.assertEqual(st_line._retrieve_partner(), bank_account.partner_id) + + # Can't retrieve the partner since the bank account is used by multiple partners. + self.env['res.partner.bank'].create({ + 'acc_number': '0144748555', + 'partner_id': self.partner_b.id, + }) + self.assertEqual(st_line._retrieve_partner(), self.env['res.partner']) + + # Archive partner_a and see if partner_b is then chosen + self.partner_a.active = False + self.assertEqual(st_line._retrieve_partner(), self.partner_b) + + def test_retrieve_partner_from_account_number_in_other_company(self): + st_line = self._create_st_line(1000.0, partner_id=None, account_number="014 474 8555") + self.env['res.partner.bank'].create({ + 'acc_number': '0144748555', + 'partner_id': self.partner_a.id, + }) + + # Bank account is owned by another company. + new_company = self.env['res.company'].create({'name': "test_retrieve_partner_from_account_number_in_other_company"}) + self.partner_a.company_id = new_company + self.assertEqual(st_line._retrieve_partner(), self.env['res.partner']) + + def test_retrieve_partner_from_partner_name(self): + """ Ensure the partner having a name fitting exactly the 'partner_name' is retrieved first. + This test create two partners that will be ordered in the lexicographic order when performing + a search. So: + row1: "Turlututu tsoin tsoin" + row2: "turlututu" + + Since "turlututu" matches exactly (case insensitive) the partner_name of the statement line, + it should be suggested first. + + However if we have two partners called turlututu, we should not suggest any or we risk selecting + the wrong one. + """ + _partner_a, partner_b = self.env['res.partner'].create([ + {'name': "Turlututu tsoin tsoin"}, + {'name': "turlututu"}, + ]) + + st_line = self._create_st_line(1000.0, partner_id=None, partner_name="Turlututu") + self.assertEqual(st_line._retrieve_partner(), partner_b) + + self.env['res.partner'].create({'name': "turlututu"}) + self.assertFalse(st_line._retrieve_partner()) + + def test_retrieve_partner_suggested_account_from_rank(self): + """ Ensure a retrieved partner is proposing his receivable/payable according his customer/supplier rank. """ + partner = self.env['res.partner'].create({'name': "turlututu"}) + rec_account_id = partner.property_account_receivable_id.id + pay_account_id = partner.property_account_payable_id.id + + st_line = self._create_st_line(1000.0, partner_id=None, partner_name="turlututu") + liq_account_id = st_line.journal_id.default_account_id.id + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'account_id': liq_account_id, 'balance': 1000.0}, + {'flag': 'auto_balance', 'account_id': rec_account_id, 'balance': -1000.0}, + ]) + + partner._increase_rank('supplier_rank', 1) + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'account_id': liq_account_id, 'balance': 1000.0}, + {'flag': 'auto_balance', 'account_id': pay_account_id, 'balance': -1000.0}, + ]) + + def test_res_partner_bank_find_create_when_archived(self): + """ Test we don't get the "The combination Account Number/Partner must be unique." error with archived + bank account. + """ + partner = self.env['res.partner'].create({ + 'name': "Zitycard", + 'bank_ids': [Command.create({ + 'acc_number': "123456789", + 'active': False, + })], + }) + + st_line = self._create_st_line( + 100.0, + partner_name="Zeumat Zitycard", + account_number="123456789", + ) + inv_line = self._create_invoice_line( + 'out_invoice', + partner_id=partner.id, + invoice_line_ids=[{'price_unit': 100.0, 'tax_ids': []}], + ) + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + wizard._action_validate() + + # Should not trigger the error. + self.env['res.partner.bank'].flush_model() + + def test_res_partner_bank_find_create_multi_company(self): + """ Test we don't get the "The combination Account Number/Partner must be unique." error when the bank account + already exists on another company. + """ + partner = self.env['res.partner'].create({ + 'name': "Zitycard", + 'bank_ids': [Command.create({'acc_number': "123456789"})], + }) + partner.bank_ids.company_id = self.company_data_2['company'] + self.env.user.company_ids = self.env.company + + st_line = self._create_st_line( + 100.0, + partner_name="Zeumat Zitycard", + account_number="123456789", + ) + inv_line = self._create_invoice_line( + 'out_invoice', + partner_id=partner.id, + invoice_line_ids=[{'price_unit': 100.0, 'tax_ids': []}], + ) + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + wizard._action_validate() + + # Should not trigger the error. + self.env['res.partner.bank'].flush_model() + + def test_validation_base_case(self): + st_line = self._create_st_line( + 1000.0, + date='2017-01-01', + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + line = wizard.line_ids.filtered(lambda x: x.flag == 'auto_balance') + wizard._js_action_mount_line_in_edit(line.index) + line.account_id = self.account_revenue1 + wizard._line_value_changed_account_id(line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1000.0, 'currency_id': self.company_data['currency'].id, 'balance': 1000.0}, + {'flag': 'manual', 'amount_currency': -1000.0, 'currency_id': self.company_data['currency'].id, 'balance': -1000.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + # The amount is the same, no message under the 'amount' field. + self.assert_form_extra_text_value(wizard, False) + + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1000.0, 'currency_id': self.company_data['currency'].id, 'balance': 1000.0, 'reconciled': False}, + {'account_id': self.account_revenue1.id, 'amount_currency': -1000.0, 'currency_id': self.company_data['currency'].id, 'balance': -1000.0, 'reconciled': False}, + ]) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1000.0, 'currency_id': self.company_data['currency'].id, 'balance': 1000.0}, + {'flag': 'aml', 'account_id': self.account_revenue1.id, 'amount_currency': -1000.0, 'currency_id': self.company_data['currency'].id, 'balance': -1000.0}, + ]) + + def test_validation_exchange_difference(self): + # 240.0 curr2 == 120.0 comp_curr + st_line = self._create_st_line( + 120.0, + date='2017-01-01', + foreign_currency_id=self.other_currency.id, + amount_currency=240.0, + ) + # 240.0 curr2 == 80.0 comp_curr + inv_line = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 240.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 120.0, 'currency_id': self.company_data['currency'].id, 'balance': 120.0}, + {'flag': 'new_aml', 'amount_currency': -240.0, 'currency_id': self.other_currency.id, 'balance': -80.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': -40.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + wizard._action_validate() + + # Check the statement line. + self.assertRecordValues(st_line.line_ids.sorted(), [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 120.0, 'currency_id': self.company_data['currency'].id, 'balance': 120.0, 'reconciled': False}, + {'account_id': inv_line.account_id.id, 'amount_currency': -240.0, 'currency_id': self.other_currency.id, 'balance': -120.0, 'reconciled': True}, + ]) + + # Check the partials. + partials = st_line.line_ids.matched_debit_ids + exchange_move = partials.exchange_move_id + _liquidity_line, _suspense_line, other_line = st_line._seek_for_lines() + self.assertRecordValues(partials.sorted(), [ + # pylint: disable=C0326 + { + 'amount': 40.0, + 'debit_amount_currency': 0.0, + 'credit_amount_currency': 0.0, + 'debit_move_id': exchange_move.line_ids.sorted()[0].id, + 'credit_move_id': other_line.id, + 'exchange_move_id': False, + }, + { + 'amount': 80.0, + 'debit_amount_currency': 240.0, + 'credit_amount_currency': 240.0, + 'debit_move_id': inv_line.id, + 'credit_move_id': other_line.id, + 'exchange_move_id': exchange_move.id, + }, + ]) + + # Check the exchange diff journal entry. + self.assertRecordValues(exchange_move.line_ids.sorted(), [ + # pylint: disable=C0326 + {'account_id': inv_line.account_id.id, 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': 40.0, 'reconciled': True}, + {'account_id': self.env.company.income_currency_exchange_account_id.id, 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': -40.0, 'reconciled': False}, + ]) + + def test_validation_new_aml_same_foreign_currency(self): + income_exchange_account = self.env.company.income_currency_exchange_account_id + + # 6000.0 curr2 == 1200.0 comp_curr (bank rate 5:1 instead of the odoo rate 4:1) + st_line = self._create_st_line( + 1200.0, + date='2017-01-01', + foreign_currency_id=self.other_currency_2.id, + amount_currency=6000.0, + ) + # 6000.0 curr2 == 1000.0 comp_curr (rate 6:1) + inv_line = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency_2.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 6000.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency': -6000.0, 'currency_id': self.other_currency_2.id, 'balance': -1000.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -200.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + # The amount is the same, no message under the 'amount' field. + self.assert_form_extra_text_value(wizard, False) + + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0, 'reconciled': False}, + {'account_id': inv_line.account_id.id, 'amount_currency': -6000.0, 'currency_id': self.other_currency_2.id, 'balance': -1200.0, 'reconciled': True}, + ]) + self.assertRecordValues(st_line, [{'is_reconciled': True}]) + self.assertRecordValues(inv_line.move_id, [{'payment_state': 'paid'}]) + self.assertRecordValues(inv_line.matched_credit_ids.exchange_move_id.line_ids, [ + # pylint: disable=C0326 + {'account_id': inv_line.account_id.id, 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': 200.0, 'reconciled': True, 'date': fields.Date.from_string('2017-01-31')}, + {'account_id': income_exchange_account.id, 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -200.0, 'reconciled': False, 'date': fields.Date.from_string('2017-01-31')}, + ]) + + # Reset the wizard. + wizard._js_action_reset() + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'auto_balance', 'amount_currency': -6000.0, 'currency_id': self.other_currency_2.id, 'balance': -1200.0}, + ]) + + # Create the same invoice with a higher amount to check the partial flow. + # 9000.0 curr2 == 1500.0 comp_curr (rate 6:1) + inv_line = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency_2.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 9000.0}], + ) + wizard._action_add_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0, 'name': "turlututu"}, + {'flag': 'new_aml', 'amount_currency': -6000.0, 'currency_id': self.other_currency_2.id, 'balance': -1000.0, 'name': "INV/2016/00002"}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -200.0, 'name': "Exchange Difference: INV/2016/00002"}, + ]) + + # Check the message under the 'amount' field. + line = wizard.line_ids.filtered(lambda x: x.flag == 'new_aml') + wizard._js_action_mount_line_in_edit(line.index) + self.assert_form_extra_text_value( + wizard, + r".+open amount of 9,000.000.+ reduced by 6,000.000.+ set the invoice as fully paid .", + ) + self.assertRecordValues(line, [{ + 'suggestion_amount_currency': -9000.0, + 'suggestion_balance': -1500.0, + }]) + + # Switch to a full reconciliation. + wizard._js_action_apply_line_suggestion(line.index) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0, 'name': "turlututu"}, + {'flag': 'new_aml', 'amount_currency': -9000.0, 'currency_id': self.other_currency_2.id, 'balance': -1500.0, 'name': "INV/2016/00002"}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -300.0, 'name': "Exchange Difference: INV/2016/00002"}, + {'flag': 'auto_balance', 'amount_currency': 3000.0, 'currency_id': self.other_currency_2.id, 'balance': 600.0, 'name': "Open balance of 6,000.000 $"}, + ]) + + # Check the message under the 'amount' field. + line = wizard.line_ids.filtered(lambda x: x.flag == 'new_aml') + wizard._js_action_mount_line_in_edit(line.index) + self.assert_form_extra_text_value( + wizard, + r".+open amount of 9,000.000.+ paid .+ record a partial payment .", + ) + self.assertRecordValues(line, [{ + 'suggestion_amount_currency': -6000.0, + 'suggestion_balance': -1000.0, + }]) + + # Switch back to a partial reconciliation. + wizard._js_action_apply_line_suggestion(line.index) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + # Reconcile + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0, 'reconciled': False}, + {'account_id': inv_line.account_id.id, 'amount_currency': -6000.0, 'currency_id': self.other_currency_2.id, 'balance': -1200.0, 'reconciled': True}, + ]) + self.assertRecordValues(st_line, [{'is_reconciled': True}]) + self.assertRecordValues(inv_line.move_id, [{ + 'payment_state': 'partial', + 'amount_residual': 3000.0, + }]) + self.assertRecordValues(inv_line.matched_credit_ids.exchange_move_id.line_ids, [ + # pylint: disable=C0326 + {'account_id': inv_line.account_id.id, 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': 200.0, 'reconciled': True, 'date': fields.Date.from_string('2017-01-31')}, + {'account_id': income_exchange_account.id, 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -200.0, 'reconciled': False, 'date': fields.Date.from_string('2017-01-31')}, + ]) + + def test_validation_expense_exchange_difference(self): + expense_exchange_account = self.env.company.expense_currency_exchange_account_id + + # 1200.0 comp_curr = 3600.0 foreign_curr in 2016 (rate 1:3) + st_line = self._create_st_line( + 1200.0, + date='2016-01-01', + ) + # 1800.0 comp_curr = 3600.0 foreign_curr in 2017 (rate 1:2) + inv_line = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency.id, + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 3600.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency': -3600.0, 'currency_id': self.other_currency.id, 'balance': -1800.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': 600.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0, 'reconciled': False}, + {'account_id': inv_line.account_id.id, 'amount_currency': -3600.0, 'currency_id': self.other_currency.id, 'balance': -1200.0, 'reconciled': True}, + ]) + self.assertRecordValues(st_line, [{'is_reconciled': True}]) + self.assertRecordValues(inv_line.move_id, [{'payment_state': 'paid'}]) + self.assertRecordValues(inv_line.matched_credit_ids.exchange_move_id.line_ids, [ + # pylint: disable=C0326 + {'account_id': inv_line.account_id.id, 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': -600.0, 'reconciled': True, 'date': fields.Date.from_string('2017-01-31')}, + {'account_id': expense_exchange_account.id, 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': 600.0, 'reconciled': False, 'date': fields.Date.from_string('2017-01-31')}, + ]) + # Checks that the wizard still display the 3 initial lines + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'aml', 'amount_currency': -3600.0, 'currency_id': self.other_currency.id, 'balance': -1800.0}, + {'flag': 'aml', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': 600.0}, + ]) + + def test_validation_income_exchange_difference(self): + income_exchange_account = self.env.company.income_currency_exchange_account_id + + # 1800.0 comp_curr = 3600.0 foreign_curr in 2017 (rate 1:2) + st_line = self._create_st_line( + 1800.0, + date='2017-01-01', + ) + # 1200.0 comp_curr = 3600.0 foreign_curr in 2016 (rate 1:3) + inv_line = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 3600.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1800.0, 'currency_id': self.company_data['currency'].id, 'balance': 1800.0}, + {'flag': 'new_aml', 'amount_currency': -3600.0, 'currency_id': self.other_currency.id, 'balance': -1200.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': -600.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1800.0, 'currency_id': self.company_data['currency'].id, 'balance': 1800.0, 'reconciled': False}, + {'account_id': inv_line.account_id.id, 'amount_currency': -3600.0, 'currency_id': self.other_currency.id, 'balance': -1800.0, 'reconciled': True}, + ]) + self.assertRecordValues(st_line, [{'is_reconciled': True}]) + self.assertRecordValues(inv_line.move_id, [{'payment_state': 'paid'}]) + self.assertRecordValues(inv_line.matched_credit_ids.exchange_move_id.line_ids, [ + # pylint: disable=C0326 + {'account_id': inv_line.account_id.id, 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': 600.0, 'reconciled': True, 'date': fields.Date.from_string('2017-01-31')}, + {'account_id': income_exchange_account.id, 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': -600.0, 'reconciled': False, 'date': fields.Date.from_string('2017-01-31')}, + ]) + # Checks that the wizard still display the 3 initial lines + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1800.0, 'currency_id': self.company_data['currency'].id, 'balance': 1800.0}, + {'flag': 'aml', 'amount_currency': -3600.0, 'currency_id': self.other_currency.id, 'balance': -1200.0}, + {'flag': 'aml', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': -600.0}, + ]) + + def test_validation_income_exchange_difference_with_rounding(self): + # 1000.0 comp_curr = 3000.0 foreign_curr in 2016 (rate 1:3) + # However divided in 3 invoices + rounding we have 333.33333 ≃ 333.33 comp_curr = 1000.0 foreign_curr + # this implies that the full amount has been used in foreign_curr but there is 0.01 in comp_curr + st_line = self._create_st_line( + 1000.0, + date='2016-01-01', + ) + + # 1500 comp_curr = 3000.0 foreign_curr in 2017 (rate 1:2) + inv_line_1 = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency.id, + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 1000.0}], + ) + + inv_line_2 = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency.id, + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 1000.0}], + ) + + inv_line_3 = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency.id, + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 1000.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line_1 + inv_line_2 + inv_line_3) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1000.0, 'currency_id': self.company_data['currency'].id, 'balance': 1000.0}, + {'flag': 'new_aml', 'amount_currency': -1000.0, 'currency_id': self.other_currency.id, 'balance': -500.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': 166.67}, + {'flag': 'new_aml', 'amount_currency': -1000.0, 'currency_id': self.other_currency.id, 'balance': -500.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': 166.67}, + {'flag': 'new_aml', 'amount_currency': -1000.0, 'currency_id': self.other_currency.id, 'balance': -500.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': 166.67}, + {'flag': 'auto_balance', 'amount_currency': -0.01, 'currency_id': self.company_data['currency'].id, 'balance': -0.01}, + ]) + + # Remove 0.01 cent in the balance of first exchange line + first_exchange_line = wizard.line_ids.filtered(lambda x: x.flag == 'exchange_diff')[:1] + wizard._js_action_mount_line_in_edit(first_exchange_line.index) + first_exchange_line.balance = 166.66 + wizard._line_value_changed_balance(first_exchange_line) + + # Every line balance so no 'auto_balance' is generated + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1000.0, 'currency_id': self.company_data['currency'].id, 'balance': 1000.0}, + {'flag': 'new_aml', 'amount_currency': -1000.0, 'currency_id': self.other_currency.id, 'balance': -500.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': 166.66}, + {'flag': 'new_aml', 'amount_currency': -1000.0, 'currency_id': self.other_currency.id, 'balance': -500.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': 166.67}, + {'flag': 'new_aml', 'amount_currency': -1000.0, 'currency_id': self.other_currency.id, 'balance': -500.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': 166.67}, + ]) + + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + wizard._action_validate() + + # Check that the first line with exchange has -0.01 compared to others + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1000.0, 'currency_id': self.company_data['currency'].id, 'balance': 1000.0, 'reconciled': False}, + {'account_id': inv_line_1.account_id.id, 'amount_currency': -1000.0, 'currency_id': self.other_currency.id, 'balance': -333.34, 'reconciled': True}, + {'account_id': inv_line_2.account_id.id, 'amount_currency': -1000.0, 'currency_id': self.other_currency.id, 'balance': -333.33, 'reconciled': True}, + {'account_id': inv_line_3.account_id.id, 'amount_currency': -1000.0, 'currency_id': self.other_currency.id, 'balance': -333.33, 'reconciled': True}, + ]) + + self.assertRecordValues(st_line, [{'is_reconciled': True}]) + self.assertRecordValues(inv_line_1.move_id, [{'payment_state': 'paid'}]) + self.assertRecordValues(inv_line_2.move_id, [{'payment_state': 'paid'}]) + self.assertRecordValues(inv_line_3.move_id, [{'payment_state': 'paid'}]) + + def test_validation_exchange_diff_multiple(self): + income_exchange_account = self.env.company.income_currency_exchange_account_id + foreign_currency = self.setup_other_currency('AED', rates=[('2016-01-01', 6.0), ('2017-01-01', 5.0)]) + + # 6000.0 curr2 == 1200.0 comp_curr (bank rate 5:1 instead of the odoo rate 6:1) + st_line = self._create_st_line( + 1200.0, + date='2016-01-01', + foreign_currency_id=foreign_currency.id, + amount_currency=6000.0, + ) + # 1000.0 foreign_curr == 166.67 comp_curr (rate 6:1) + inv_line_1 = self._create_invoice_line( + 'out_invoice', + currency_id=foreign_currency.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 1000.0}], + ) + # 2000.00 foreign_curr == 400.0 comp_curr (rate 5:1) + inv_line_2 = self._create_invoice_line( + 'out_invoice', + currency_id=foreign_currency.id, + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 2000.0}], + ) + # 3000.0 foreign_curr == 500.0 comp_curr (rate 6:1) + inv_line_3 = self._create_invoice_line( + 'out_invoice', + currency_id=foreign_currency.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 3000.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line_1 + inv_line_2 + inv_line_3) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency': -1000.0, 'currency_id': foreign_currency.id, 'balance': -166.67}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': foreign_currency.id, 'balance': -33.33}, + {'flag': 'new_aml', 'amount_currency': -2000.0, 'currency_id': foreign_currency.id, 'balance': -400.0}, + {'flag': 'new_aml', 'amount_currency': -3000.0, 'currency_id': foreign_currency.id, 'balance': -500.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': foreign_currency.id, 'balance': -100.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + # The amount is the same, no message under the 'amount' field. + self.assert_form_extra_text_value(wizard, False) + + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0, 'reconciled': False}, + {'account_id': inv_line_1.account_id.id, 'amount_currency': -1000.0, 'currency_id': foreign_currency.id, 'balance': -200.0, 'reconciled': True}, + {'account_id': inv_line_2.account_id.id, 'amount_currency': -2000.0, 'currency_id': foreign_currency.id, 'balance': -400.0, 'reconciled': True}, + {'account_id': inv_line_3.account_id.id, 'amount_currency': -3000.0, 'currency_id': foreign_currency.id, 'balance': -600.0, 'reconciled': True}, + ]) + self.assertRecordValues(st_line, [{'is_reconciled': True}]) + self.assertRecordValues(inv_line_1.move_id, [{'payment_state': 'paid'}]) + self.assertRecordValues(inv_line_2.move_id, [{'payment_state': 'paid'}]) + self.assertRecordValues(inv_line_3.move_id, [{'payment_state': 'paid'}]) + self.assertRecordValues((inv_line_1 + inv_line_2 + inv_line_3).matched_credit_ids.exchange_move_id.line_ids, [ + # pylint: disable=C0326 + {'account_id': inv_line_1.account_id.id, 'amount_currency': 0.0, 'currency_id': foreign_currency.id, 'balance': 33.33, 'reconciled': True}, + {'account_id': income_exchange_account.id, 'amount_currency': 0.0, 'currency_id': foreign_currency.id, 'balance': -33.33, 'reconciled': False}, + {'account_id': inv_line_3.account_id.id, 'amount_currency': 0.0, 'currency_id': foreign_currency.id, 'balance': 100.0, 'reconciled': True}, + {'account_id': income_exchange_account.id, 'amount_currency': 0.0, 'currency_id': foreign_currency.id, 'balance': -100.0, 'reconciled': False}, + ]) + + def test_validation_foreign_curr_st_line_comp_curr_payment_partial_exchange_difference(self): + comp_curr = self.env.company.currency_id + foreign_curr = self.other_currency + + st_line = self._create_st_line( + 650.0, + date='2017-01-01', + foreign_currency_id=foreign_curr.id, + amount_currency=800, + ) + + payment = self.env['account.payment'].create({ + 'partner_id': self.partner_a.id, + 'payment_type': 'inbound', + 'partner_type': 'customer', + 'date': '2017-01-01', + 'amount': 725.0, + }) + payment.action_post() + pay_line, _counterpart_lines, _writeoff_lines = payment._seek_for_lines() + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(pay_line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 650.0, 'currency_id': comp_curr.id, 'balance': 650.0}, + {'flag': 'new_aml', 'amount_currency': -650.0, 'currency_id': comp_curr.id, 'balance': -650.0}, + ]) + + # Switch to a full reconciliation. + line = wizard.line_ids.filtered(lambda x: x.flag == 'new_aml') + wizard._js_action_mount_line_in_edit(line.index) + wizard._js_action_apply_line_suggestion(line.index) + + # 725 * 800 / 650 = 892.308 + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 650.0, 'currency_id': comp_curr.id, 'balance': 650.0}, + {'flag': 'new_aml', 'amount_currency': -725.0, 'currency_id': comp_curr.id, 'balance': -725.0}, + {'flag': 'auto_balance', 'amount_currency': 92.308, 'currency_id': foreign_curr.id, 'balance': 75.0}, + ]) + + # Switch to a partial reconciliation. + wizard._js_action_apply_line_suggestion(line.index) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 650.0, 'currency_id': comp_curr.id, 'balance': 650.0}, + {'flag': 'new_aml', 'amount_currency': -650.0, 'currency_id': comp_curr.id, 'balance': -650.0}, + ]) + + wizard._action_validate() + self.assertRecordValues(pay_line, [{'amount_residual': 75.0}]) + + def test_validation_remove_exchange_difference(self): + """ Test the case when the foreign currency is missing on the statement line. + In that case, the user can remove the exchange difference in order to fully reconcile both items without additional + write-off/exchange difference. + """ + # 1200.0 comp_curr = 2400.0 foreign_curr in 2017 (rate 1:2) + st_line = self._create_st_line( + 1200.0, + date='2017-01-01', + ) + # 1200.0 comp_curr = 3600.0 foreign_curr in 2016 (rate 1:3) + inv_line = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 3600.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency': -2400.0, 'currency_id': self.other_currency.id, 'balance': -800.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': -400.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + # Remove the partial. + line_index = wizard.line_ids.filtered(lambda x: x.flag == 'new_aml').index + wizard._js_action_mount_line_in_edit(line_index) + wizard._js_action_apply_line_suggestion(line_index) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency': -3600.0, 'currency_id': self.other_currency.id, 'balance': -1200.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': -600.0}, + {'flag': 'auto_balance', 'amount_currency': 600.0, 'currency_id': self.company_data['currency'].id, 'balance': 600.0}, + ]) + + exchange_diff_index = wizard.line_ids.filtered(lambda x: x.flag == 'exchange_diff').index + wizard._js_action_remove_line(exchange_diff_index) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency': -3600.0, 'currency_id': self.other_currency.id, 'balance': -1200.0}, + ]) + + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0, 'reconciled': False}, + {'account_id': inv_line.account_id.id, 'amount_currency': -3600.0, 'currency_id': self.other_currency.id, 'balance': -1200.0, 'reconciled': True}, + ]) + self.assertRecordValues(st_line, [{'is_reconciled': True}]) + self.assertRecordValues(inv_line.move_id, [{'payment_state': 'paid'}]) + + def test_validation_new_aml_one_foreign_currency_on_st_line(self): + income_exchange_account = self.env.company.income_currency_exchange_account_id + + # 4800.0 curr2 == 1200.0 comp_curr (rate 4:1) + st_line = self._create_st_line( + 1200.0, + date='2017-01-01', + ) + # 4800.0 curr2 in 2016 (rate 6:1) + inv_line = self._create_invoice_line( + 'out_invoice', + invoice_date='2016-01-01', + currency_id=self.other_currency_2.id, + invoice_line_ids=[{'price_unit': 4800.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency': -4800.0, 'currency_id': self.other_currency_2.id, 'balance': -800.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -400.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + # The amount is the same, no message under the 'amount' field. + self.assert_form_extra_text_value(wizard, False) + + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0, 'reconciled': False}, + {'account_id': inv_line.account_id.id, 'amount_currency': -4800.0, 'currency_id': self.other_currency_2.id, 'balance': -1200.0, 'reconciled': True}, + ]) + self.assertRecordValues(st_line, [{'is_reconciled': True}]) + self.assertRecordValues(inv_line.move_id, [{'payment_state': 'paid'}]) + self.assertRecordValues(inv_line.matched_credit_ids.exchange_move_id.line_ids, [ + # pylint: disable=C0326 + {'account_id': inv_line.account_id.id, 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': 400.0, 'reconciled': True, 'date': fields.Date.from_string('2017-01-31')}, + {'account_id': income_exchange_account.id, 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -400.0, 'reconciled': False, 'date': fields.Date.from_string('2017-01-31')}, + ]) + + # Checks that the wizard still display the 3 initial lines + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'aml', 'amount_currency': -4800.0, 'currency_id': self.other_currency_2.id, 'balance': -800.0}, + {'flag': 'aml', 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -400.0}, # represents the exchange diff + ]) + + # Reset the wizard. + wizard._js_action_reset() + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'auto_balance', 'amount_currency': -1200.0, 'currency_id': self.company_data['currency'].id, 'balance': -1200.0}, + ]) + + # Create the same invoice with a higher amount to check the partial flow. + # 4800.0 curr2 in 2016 (rate 6:1) + inv_line = self._create_invoice_line( + 'out_invoice', + invoice_date='2016-01-01', + currency_id=self.other_currency_2.id, + invoice_line_ids=[{'price_unit': 9600.0}], + ) + wizard._action_add_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency': -4800.0, 'currency_id': self.other_currency_2.id, 'balance': -800.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -400.0}, + ]) + + # Check the message under the 'amount' field. + line = wizard.line_ids.filtered(lambda x: x.flag == 'new_aml') + wizard._js_action_mount_line_in_edit(line.index) + self.assert_form_extra_text_value( + wizard, + r".+open amount of 9,600.000.+ reduced by 4,800.000.+ set the invoice as fully paid .", + ) + self.assertRecordValues(line, [{ + 'suggestion_amount_currency': -9600.0, + 'suggestion_balance': -1600.0, + }]) + + # Switch to a full reconciliation. + wizard._js_action_apply_line_suggestion(line.index) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency': -9600.0, 'currency_id': self.other_currency_2.id, 'balance': -1600.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -800.0}, + {'flag': 'auto_balance', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + ]) + + # Check the message under the 'amount' field. + line = wizard.line_ids.filtered(lambda x: x.flag == 'new_aml') + wizard._js_action_mount_line_in_edit(line.index) + self.assert_form_extra_text_value( + wizard, + r".+open amount of 9,600.000.+ paid .+ record a partial payment .", + ) + self.assertRecordValues(line, [{ + 'suggestion_amount_currency': -4800.0, + 'suggestion_balance': -800.0, + }]) + + # Switch back to a partial reconciliation. + wizard._js_action_apply_line_suggestion(line.index) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + # Reconcile + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0, 'reconciled': False}, + {'account_id': inv_line.account_id.id, 'amount_currency': -4800.0, 'currency_id': self.other_currency_2.id, 'balance': -1200.0, 'reconciled': True}, + ]) + self.assertRecordValues(st_line, [{'is_reconciled': True}]) + self.assertRecordValues(inv_line.move_id, [{ + 'payment_state': 'partial', + 'amount_residual': 4800.0, + }]) + self.assertRecordValues(inv_line, [{ + 'amount_residual_currency': 4800.0, + 'amount_residual': 800.0, + 'reconciled': False, + }]) + self.assertRecordValues(inv_line.matched_credit_ids.exchange_move_id.line_ids, [ + # pylint: disable=C0326 + {'account_id': inv_line.account_id.id, 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': 400.0, 'reconciled': True, 'date': fields.Date.from_string('2017-01-31')}, + {'account_id': income_exchange_account.id, 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -400.0, 'reconciled': False, 'date': fields.Date.from_string('2017-01-31')}, + ]) + + def test_validation_new_aml_one_foreign_currency_on_inv_line(self): + income_exchange_account = self.env.company.income_currency_exchange_account_id + + # 1200.0 comp_curr is equals to 4800.0 curr2 in 2017 (rate 4:1) + st_line = self._create_st_line( + 1200.0, + date='2017-01-01', + ) + # 4800.0 curr2 == 800.0 comp_curr (rate 6:1) + inv_line = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency_2.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 4800.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency': -4800.0, 'currency_id': self.other_currency_2.id, 'balance': -800.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -400.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + # The amount is the same, no message under the 'amount' field. + self.assert_form_extra_text_value(wizard, False) + + # Remove the line to see if the exchange difference is well removed. + wizard._action_remove_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'auto_balance', 'amount_currency': -1200.0, 'currency_id': self.company_data['currency'].id, 'balance': -1200.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'invalid'}]) + + # Mount the line again and validate. + wizard._action_add_new_amls(inv_line) + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0, 'reconciled': False}, + {'account_id': inv_line.account_id.id, 'amount_currency': -4800.0, 'currency_id': self.other_currency_2.id, 'balance': -1200.0, 'reconciled': True}, + ]) + self.assertRecordValues(st_line, [{'is_reconciled': True}]) + self.assertRecordValues(inv_line.move_id, [{'payment_state': 'paid'}]) + self.assertRecordValues(inv_line.matched_credit_ids.exchange_move_id.line_ids, [ + # pylint: disable=C0326 + {'account_id': inv_line.account_id.id, 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': 400.0, 'reconciled': True, 'date': fields.Date.from_string('2017-01-31')}, + {'account_id': income_exchange_account.id, 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -400.0, 'reconciled': False, 'date': fields.Date.from_string('2017-01-31')}, + ]) + + # Reset the wizard. + wizard._js_action_reset() + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'auto_balance', 'amount_currency': -1200.0, 'currency_id': self.company_data['currency'].id, 'balance': -1200.0}, + ]) + + # Create the same invoice with a higher amount to check the partial flow. + # 7200.0 curr2 == 1200.0 comp_curr (rate 6:1) + inv_line = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency_2.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 7200.0}], + ) + wizard._action_add_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency': -4800.0, 'currency_id': self.other_currency_2.id, 'balance': -800.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -400.0}, + ]) + + # Check the message under the 'amount' field. + line = wizard.line_ids.filtered(lambda x: x.flag == 'new_aml') + wizard._js_action_mount_line_in_edit(line.index) + self.assert_form_extra_text_value( + wizard, + r".+open amount of 7,200.000.+ reduced by 4,800.000.+ set the invoice as fully paid .", + ) + self.assertRecordValues(line, [{ + 'suggestion_amount_currency': -7200.0, + 'suggestion_balance': -1200.0, + }]) + + # Switch to a full reconciliation. + wizard._js_action_apply_line_suggestion(line.index) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency': -7200.0, 'currency_id': self.other_currency_2.id, 'balance': -1200.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -600.0}, + {'flag': 'auto_balance', 'amount_currency': 600.0, 'currency_id': self.company_data['currency'].id, 'balance': 600.0}, + ]) + + # Check the message under the 'amount' field. + line = wizard.line_ids.filtered(lambda x: x.flag == 'new_aml') + wizard._js_action_mount_line_in_edit(line.index) + self.assert_form_extra_text_value( + wizard, + r".+open amount of 7,200.000.+ paid .+ record a partial payment .", + ) + self.assertRecordValues(line, [{ + 'suggestion_amount_currency': -4800.0, + 'suggestion_balance': -800.0, + }]) + + # Switch back to a partial reconciliation. + wizard._js_action_apply_line_suggestion(line.index) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + # Reconcile + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0, 'reconciled': False}, + {'account_id': inv_line.account_id.id, 'amount_currency': -4800.0, 'currency_id': self.other_currency_2.id, 'balance': -1200.0, 'reconciled': True}, + ]) + self.assertRecordValues(st_line, [{'is_reconciled': True}]) + self.assertRecordValues(inv_line.move_id, [{ + 'payment_state': 'partial', + 'amount_residual': 2400.0, + }]) + self.assertRecordValues(inv_line.matched_credit_ids.exchange_move_id.line_ids, [ + # pylint: disable=C0326 + {'account_id': inv_line.account_id.id, 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': 400.0, 'reconciled': True, 'date': fields.Date.from_string('2017-01-31')}, + {'account_id': income_exchange_account.id, 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -400.0, 'reconciled': False, 'date': fields.Date.from_string('2017-01-31')}, + ]) + + def test_validation_new_aml_multi_currencies(self): + # 6300.0 curr2 == 1800.0 comp_curr (bank rate 3.5:1 instead of the odoo rate 4:1) + st_line = self._create_st_line( + 1800.0, + date='2017-01-01', + foreign_currency_id=self.other_currency_2.id, + amount_currency=6300.0, + ) + # 21600.0 curr3 == 1800.0 comp_curr (rate 12:1) + inv_line = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency_3.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 21600.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1800.0, 'currency_id': self.company_data['currency'].id, 'balance': 1800.0}, + {'flag': 'new_aml', 'amount_currency': -21600.0, 'currency_id': self.other_currency_3.id, 'balance': -1800.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + # The amount is the same, no message under the 'amount' field. + self.assert_form_extra_text_value(wizard, False) + + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1800.0, 'currency_id': self.company_data['currency'].id, 'balance': 1800.0, 'reconciled': False}, + {'account_id': inv_line.account_id.id, 'amount_currency': -21600.0, 'currency_id': self.other_currency_3.id, 'balance': -1800.0, 'reconciled': True}, + ]) + self.assertRecordValues(st_line, [{'is_reconciled': True}]) + self.assertRecordValues(inv_line.move_id, [{'payment_state': 'paid'}]) + + # Reset the wizard. + wizard._js_action_reset() + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1800.0, 'currency_id': self.company_data['currency'].id, 'balance': 1800.0}, + {'flag': 'auto_balance', 'amount_currency': -6300.0, 'currency_id': self.other_currency_2.id, 'balance': -1800.0}, + ]) + + # Create the same invoice with a higher amount to check the partial flow. + # 32400.0 curr3 == 2700.0 comp_curr (rate 12:1) + inv_line = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency_3.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 32400.0}], + ) + wizard._action_add_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1800.0, 'currency_id': self.company_data['currency'].id, 'balance': 1800.0}, + {'flag': 'new_aml', 'amount_currency': -21600.0, 'currency_id': self.other_currency_3.id, 'balance': -1800.0}, + ]) + + # Check the message under the 'amount' field. + line = wizard.line_ids.filtered(lambda x: x.flag == 'new_aml') + wizard._js_action_mount_line_in_edit(line.index) + self.assert_form_extra_text_value( + wizard, + r".+open amount of 32,400.000.+ reduced by 21,600.000.+ set the invoice as fully paid .", + ) + self.assertRecordValues(line, [{ + 'suggestion_amount_currency': -32400.0, + 'suggestion_balance': -2700.0, + }]) + + # Switch to a full reconciliation. + wizard._js_action_apply_line_suggestion(line.index) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1800.0, 'currency_id': self.company_data['currency'].id, 'balance': 1800.0}, + {'flag': 'new_aml', 'amount_currency': -32400.0, 'currency_id': self.other_currency_3.id, 'balance': -2700.0}, + {'flag': 'auto_balance', 'amount_currency': 3150.0, 'currency_id': self.other_currency_2.id, 'balance': 900.0}, + ]) + + # Check the message under the 'amount' field. + line = wizard.line_ids.filtered(lambda x: x.flag == 'new_aml') + wizard._js_action_mount_line_in_edit(line.index) + self.assert_form_extra_text_value( + wizard, + r".+open amount of 32,400.000.+ paid .+ record a partial payment .", + ) + self.assertRecordValues(line, [{ + 'suggestion_amount_currency': -21600.0, + 'suggestion_balance': -1800.0, + }]) + + # Switch back to a partial reconciliation. + wizard._js_action_apply_line_suggestion(line.index) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + # Reconcile + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'account_id': st_line.journal_id.default_account_id.id, 'amount_currency': 1800.0, 'currency_id': self.company_data['currency'].id, 'balance': 1800.0, 'reconciled': False}, + {'account_id': inv_line.account_id.id, 'amount_currency': -21600.0, 'currency_id': self.other_currency_3.id, 'balance': -1800.0, 'reconciled': True}, + ]) + self.assertRecordValues(st_line, [{'is_reconciled': True}]) + self.assertRecordValues(inv_line.move_id, [{ + 'payment_state': 'partial', + 'amount_residual': 10800.0, + }]) + + def test_validation_new_aml_multi_currencies_exchange_diff_custom_rates(self): + self.company_data['default_journal_bank'].currency_id = self.other_currency + + self.env['res.currency.rate'].create([ + { + 'name': '2017-02-01', + 'rate': 1.0683, + 'currency_id': self.other_currency.id, + 'company_id': self.env.company.id, + }, + { + 'name': '2017-03-01', + 'rate': 1.0812, + 'currency_id': self.other_currency.id, + 'company_id': self.env.company.id, + }, + ]) + + # 960.14 curr1 = 888.03 comp_curr + st_line = self._create_st_line( + -960.14, + date='2017-03-01', + ) + # 112.7 curr1 == 105.49 comp_curr + inv_line1 = self._create_invoice_line( + 'in_invoice', + currency_id=self.other_currency.id, + invoice_date='2017-02-01', + invoice_line_ids=[{'price_unit': 112.7}], + ) + # 847.44 curr1 == 793.26 comp_curr + inv_line2 = self._create_invoice_line( + 'in_invoice', + currency_id=self.other_currency.id, + invoice_date='2017-02-01', + invoice_line_ids=[{'price_unit': 847.44}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line1) + wizard._action_add_new_amls(inv_line2) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': -960.14, 'balance': -888.03}, + {'flag': 'new_aml', 'amount_currency': 112.7, 'balance': 105.49}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -1.25}, + {'flag': 'new_aml', 'amount_currency': 847.44, 'balance': 793.26}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -9.47}, + ]) + wizard._action_remove_new_amls(inv_line1 + inv_line2) + wizard._action_add_new_amls(inv_line2) + wizard._action_add_new_amls(inv_line1) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': -960.14, 'balance': -888.03}, + {'flag': 'new_aml', 'amount_currency': 847.44, 'balance': 793.26}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -9.47}, + {'flag': 'new_aml', 'amount_currency': 112.7, 'balance': 105.49}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -1.25}, + ]) + + def test_validation_new_aml_from_partially_reconciled_invoice(self): + """ In this scenario, the invoice we are reconciling with is already partially reconciled. + We need to make sure the new aml's balance is computed using a rate computed from the + invoice's balance / amount_currency rather than the invoice's amount_residual / amount_residual_currency. + """ + self.env['res.currency.rate'].create([ + { + 'name': '2017-02-01', + 'rate': 1 / 19.839, + 'currency_id': self.other_currency.id, + 'company_id': self.env.company.id, + }, + { + 'name': '2017-03-01', + 'rate': 1 / 19.9338, + 'currency_id': self.other_currency.id, + 'company_id': self.env.company.id, + }, + ]) + + # 600000 comp_curr + st_line = self._create_st_line( + 600000, + date='2017-03-01', + ) + liquidity_line, suspense_line, _other_lines = st_line._seek_for_lines() + outstanding_account = suspense_line.account_id + + # 23664 curr1 = 469470.10 comp_curr + inv_line = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency.id, + invoice_date='2017-02-01', + invoice_line_ids=[{'price_unit': 23664}], + ) + + # Register a partial payment on the invoice at the same date as the invoice. + payment = self.env['account.payment.register'].with_context(active_model='account.move', active_ids=inv_line.move_id.ids).create({ + 'amount': 9.0, + 'payment_difference_handling': 'open', + 'currency_id': self.other_currency.id, + 'payment_method_line_id': self.inbound_payment_method_line.id, + })._create_payments() + + # Sanity check that the residuals on the invoice are as expected + self.assertRecordValues(inv_line, [{ + 'balance': 469470.1, + 'amount_currency': 23664.0, + 'amount_residual': 469291.55, + 'amount_residual_currency': 23655.0, + }]) + + # Create the wizard + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 600000, 'balance': 600000.0}, + {'flag': 'new_aml', 'amount_currency': -23655.0, 'balance': -469291.55}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -2242.49}, + {'flag': 'auto_balance', 'amount_currency': -128465.96, 'balance': -128465.96}, + ]) + + # Custom amount_currency. + line = wizard.line_ids.filtered(lambda x: x.flag == 'new_aml') + wizard._js_action_mount_line_in_edit(line.index) + line.amount_currency = -6954.76 + wizard._line_value_changed_amount_currency(line) + + # Check that the new aml is adjusted according to the invoice rate rather than the invoice residuals' rate. + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 600000, 'balance': 600000.0}, + {'flag': 'new_aml', 'amount_currency': -6954.76, 'balance': -137975.48}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -659.31}, + {'flag': 'auto_balance', 'amount_currency': -461365.21, 'balance': -461365.21}, + ]) + + # Check that after reconciling, the new aml has 0 residual. + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + { + 'account_id': st_line.journal_id.default_account_id.id, + 'amount_currency': 600000.0, + 'balance': 600000.0, + 'currency_id': self.company_data['currency'].id, + 'reconciled': False, + }, + { + 'account_id': inv_line.account_id.id, + 'amount_currency': -6954.76, + 'balance': -138634.79, + 'currency_id': self.other_currency.id, + 'reconciled': True, + }, + { + 'account_id': outstanding_account.id, + 'amount_currency': -461365.21, + 'currency_id': self.company_data['currency'].id, + 'balance': -461365.21, + 'reconciled': False, + }, + ]) + self.assertRecordValues(inv_line.move_id, [{ + 'payment_state': 'partial', + 'amount_residual': 16700.24, + }]) + + def test_validation_with_partner(self): + partner = self.partner_a.copy() + + st_line = self._create_st_line(1000.0, partner_id=self.partner_a.id) + + # The wizard can be validated directly thanks to the receivable account set on the partner. + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + # Validate and check the statement line. + wizard._action_validate() + self.assertRecordValues(st_line, [{'partner_id': self.partner_a.id}]) + liquidity_line, _suspense_line, other_line = st_line._seek_for_lines() + account = self.partner_a.property_account_receivable_id + self.assertRecordValues(liquidity_line + other_line, [ + # pylint: disable=C0326 + {'account_id': liquidity_line.account_id.id, 'balance': 1000.0}, + {'account_id': account.id, 'balance': -1000.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'reconciled'}]) + + # Match an invoice with a different partner. + wizard._js_action_reset() + inv_line = self._create_invoice_line( + 'out_invoice', + partner_id=partner.id, + invoice_line_ids=[{'price_unit': 1000.0}], + ) + wizard._action_add_new_amls(inv_line) + wizard._action_validate() + liquidity_line, suspense_line, other_line = st_line._seek_for_lines() + self.assertRecordValues(st_line, [{'partner_id': partner.id}]) + self.assertRecordValues(st_line.move_id, [{'partner_id': partner.id}]) + self.assertRecordValues(liquidity_line + other_line, [ + # pylint: disable=C0326 + {'account_id': liquidity_line.account_id.id, 'partner_id': partner.id, 'balance': 1000.0}, + {'account_id': inv_line.account_id.id, 'partner_id': partner.id, 'balance': -1000.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'reconciled'}]) + + # Reset the wizard and match invoices with different partners. + wizard._js_action_reset() + partner1 = self.partner_a.copy() + inv_line1 = self._create_invoice_line( + 'out_invoice', + partner_id=partner1.id, + invoice_line_ids=[{'price_unit': 300.0}], + ) + partner2 = self.partner_a.copy() + inv_line2 = self._create_invoice_line( + 'out_invoice', + partner_id=partner2.id, + invoice_line_ids=[{'price_unit': 300.0}], + ) + wizard._action_add_new_amls(inv_line1 + inv_line2) + wizard._action_validate() + liquidity_line, _suspense_line, other_line = st_line._seek_for_lines() + self.assertRecordValues(st_line, [{'partner_id': False}]) + self.assertRecordValues(st_line.move_id, [{'partner_id': False}]) + self.assertRecordValues(liquidity_line + other_line, [ + # pylint: disable=C0326 + {'account_id': liquidity_line.account_id.id, 'partner_id': False, 'balance': 1000.0}, + {'account_id': inv_line1.account_id.id, 'partner_id': partner1.id, 'balance': -300.0}, + {'account_id': inv_line2.account_id.id, 'partner_id': partner2.id, 'balance': -300.0}, + {'account_id': account.id, 'partner_id': False, 'balance': -400.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'reconciled'}]) + + # Clear the accounts set on the partner and reset the widget. + # The wizard should be invalid since we are not able to set an open balance. + partner.property_account_receivable_id = None + wizard._js_action_reset() + liquidity_line, suspense_line, other_line = st_line._seek_for_lines() + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'account_id': liquidity_line.account_id.id}, + {'flag': 'auto_balance', 'account_id': suspense_line.account_id.id}, + ]) + self.assertRecordValues(wizard, [{'state': 'invalid'}]) + + def test_partner_receivable_payable_account(self): + self.partner_a.write({'customer_rank': 1, 'supplier_rank': 0}) # always receivable + self.partner_b.write({'customer_rank': 0, 'supplier_rank': 1}) # always payable + partner_c = self.partner_b.copy({'customer_rank': 3, 'supplier_rank': 2}) # no preference + + positive_st_line = self._create_st_line(1000) + journal_account = positive_st_line.journal_id.default_account_id + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=positive_st_line.id).new({}) + suspense_line = wizard.line_ids.filtered(lambda l: l.flag != "liquidity") + wizard._js_action_mount_line_in_edit(suspense_line.index) + + suspense_line.partner_id = self.partner_a + wizard._line_value_changed_partner_id(suspense_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'partner_id': False, 'account_id': journal_account.id}, + {'partner_id': self.partner_a.id, 'account_id': self.partner_a.property_account_receivable_id.id}, + ]) + + suspense_line.partner_id = self.partner_b + wizard._line_value_changed_partner_id(suspense_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'partner_id': False, 'account_id': journal_account.id}, + {'partner_id': self.partner_b.id, 'account_id': self.partner_b.property_account_payable_id.id}, + ]) + + suspense_line.partner_id = partner_c + wizard._line_value_changed_partner_id(suspense_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'partner_id': False, 'account_id': journal_account.id}, + {'partner_id': partner_c.id, 'account_id': partner_c.property_account_receivable_id.id}, + ]) + + negative_st_line = self._create_st_line(-1000) + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=negative_st_line.id).new({}) + suspense_line = wizard.line_ids.filtered(lambda l: l.flag != "liquidity") + wizard._js_action_mount_line_in_edit(suspense_line.index) + + suspense_line.partner_id = self.partner_a + wizard._line_value_changed_partner_id(suspense_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'partner_id': False, 'account_id': journal_account.id}, + {'partner_id': self.partner_a.id, 'account_id': self.partner_a.property_account_receivable_id.id}, + ]) + + suspense_line.partner_id = self.partner_b + wizard._line_value_changed_partner_id(suspense_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'partner_id': False, 'account_id': journal_account.id}, + {'partner_id': self.partner_b.id, 'account_id': self.partner_b.property_account_payable_id.id}, + ]) + + suspense_line.partner_id = partner_c + wizard._line_value_changed_partner_id(suspense_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'partner_id': False, 'account_id': journal_account.id}, + {'partner_id': partner_c.id, 'account_id': partner_c.property_account_payable_id.id}, + ]) + + def test_validation_using_custom_account(self): + st_line = self._create_st_line(1000.0) + + # By default, the wizard can't be validated directly due to the suspense account. + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + self.assertRecordValues(wizard, [{'state': 'invalid'}]) + + # Mount the auto-balance line in edit mode. + line = wizard.line_ids.filtered(lambda x: x.flag == 'auto_balance') + wizard._js_action_mount_line_in_edit(line.index) + liquidity_line, suspense_line, _other_lines = st_line._seek_for_lines() + self.assertRecordValues(line, [{ + 'account_id': suspense_line.account_id.id, + 'balance': -1000.0, + }]) + + # Switch to a custom account. + account = self.env['account.account'].create({ + 'name': "test_validation_using_custom_account", + 'code': "424242", + 'account_type': "asset_current", + }) + line.account_id = account + wizard._line_value_changed_account_id(line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'account_id': liquidity_line.account_id.id, 'balance': 1000.0}, + {'flag': 'manual', 'account_id': account.id, 'balance': -1000.0}, + ]) + + # The wizard can be validated. + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + # Validate and check the statement line. + wizard._action_validate() + liquidity_line, _suspense_line, other_line = st_line._seek_for_lines() + self.assertRecordValues(liquidity_line + other_line, [ + # pylint: disable=C0326 + {'account_id': liquidity_line.account_id.id, 'balance': 1000.0}, + {'account_id': account.id, 'balance': -1000.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'reconciled'}]) + + def test_validation_with_taxes(self): + st_line = self._create_st_line(1000.0) + + tax_tags = self.env['account.account.tag'].create({ + 'name': f'tax_tag_{i}', + 'applicability': 'taxes', + 'country_id': self.env.company.account_fiscal_country_id.id, + } for i in range(4)) + + tax_21 = self.env['account.tax'].create({ + 'name': "tax_21", + 'amount': 21, + 'invoice_repartition_line_ids': [ + Command.create({ + 'factor_percent': 100, + 'repartition_type': 'base', + 'tag_ids': [Command.set(tax_tags[0].ids)], + }), + Command.create({ + 'factor_percent': 100, + 'repartition_type': 'tax', + 'tag_ids': [Command.set(tax_tags[1].ids)], + }), + ], + 'refund_repartition_line_ids': [ + Command.create({ + 'factor_percent': 100, + 'repartition_type': 'base', + 'tag_ids': [Command.set(tax_tags[2].ids)], + }), + Command.create({ + 'factor_percent': 100, + 'repartition_type': 'tax', + 'tag_ids': [Command.set(tax_tags[3].ids)], + }), + ], + }) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + line = wizard.line_ids.filtered(lambda x: x.flag == 'auto_balance') + wizard._js_action_mount_line_in_edit(line.index) + line.tax_ids = [Command.link(tax_21.id)] + wizard._line_value_changed_tax_ids(line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1000.0, 'tax_tag_ids': []}, + {'flag': 'manual', 'balance': -826.45, 'tax_tag_ids': tax_tags[0].ids}, + {'flag': 'tax_line', 'balance': -173.55, 'tax_tag_ids': tax_tags[1].ids}, + ]) + + # Remove the tax directly. + line.tax_ids = [Command.clear()] + wizard._line_value_changed_tax_ids(line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1000.0, 'tax_tag_ids': []}, + {'flag': 'manual', 'balance': -1000.0, 'tax_tag_ids': []}, + ]) + + # Edit the base line. The tax tags should be the refund ones. + line = wizard.line_ids.filtered(lambda x: x.flag == 'manual') + wizard._js_action_mount_line_in_edit(line.index) + line.tax_ids = [Command.link(tax_21.id)] + wizard._line_value_changed_tax_ids(line) + line.balance = 500.0 + wizard._line_value_changed_balance(line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1000.0, 'tax_tag_ids': []}, + {'flag': 'manual', 'balance': 500.0, 'tax_tag_ids': tax_tags[2].ids}, + {'flag': 'tax_line', 'balance': 105.0, 'tax_tag_ids': tax_tags[3].ids}, + {'flag': 'auto_balance', 'balance': -1605.0, 'tax_tag_ids': []}, + ]) + + # Edit the base line. + line = wizard.line_ids.filtered(lambda x: x.flag == 'manual') + wizard._js_action_mount_line_in_edit(line.index) + line.balance = -500.0 + wizard._line_value_changed_balance(line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1000.0, 'tax_tag_ids': []}, + {'flag': 'manual', 'balance': -500.0, 'tax_tag_ids': tax_tags[0].ids}, + {'flag': 'tax_line', 'balance': -105.0, 'tax_tag_ids': tax_tags[1].ids}, + {'flag': 'auto_balance', 'balance': -395.0, 'tax_tag_ids': []}, + ]) + + # Edit the tax line. + line = wizard.line_ids.filtered(lambda x: x.flag == 'tax_line') + wizard._js_action_mount_line_in_edit(line.index) + line.balance = -100.0 + wizard._line_value_changed_balance(line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1000.0, 'tax_tag_ids': []}, + {'flag': 'manual', 'balance': -500.0, 'tax_tag_ids': tax_tags[0].ids}, + {'flag': 'tax_line', 'balance': -100.0, 'tax_tag_ids': tax_tags[1].ids}, + {'flag': 'auto_balance', 'balance': -400.0, 'tax_tag_ids': []}, + ]) + + # Add a new tax. + tax_10 = self.env['account.tax'].create({ + 'name': "tax_10", + 'amount': 10, + }) + + line = wizard.line_ids.filtered(lambda x: x.flag == 'manual') + wizard._js_action_mount_line_in_edit(line.index) + line.tax_ids = [Command.link(tax_10.id)] + wizard._line_value_changed_tax_ids(line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1000.0}, + {'flag': 'manual', 'balance': -500.0}, + {'flag': 'tax_line', 'balance': -105.0}, + {'flag': 'tax_line', 'balance': -50.0}, + {'flag': 'auto_balance', 'balance': -345.0}, + ]) + + # Remove the taxes. + line = wizard.line_ids.filtered(lambda x: x.flag == 'manual') + wizard._js_action_mount_line_in_edit(line.index) + line.tax_ids = [Command.clear()] + wizard._line_value_changed_tax_ids(line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1000.0}, + {'flag': 'manual', 'balance': -500.0}, + {'flag': 'auto_balance', 'balance': -500.0}, + ]) + + # Reset the amount. + line = wizard.line_ids.filtered(lambda x: x.flag == 'manual') + wizard._js_action_mount_line_in_edit(line.index) + line.balance = -1000.0 + wizard._line_value_changed_balance(line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1000.0}, + {'flag': 'manual', 'balance': -1000.0}, + ]) + + # Add taxes. We should be back into the "price included taxes" mode. + line = wizard.line_ids.filtered(lambda x: x.flag == 'manual') + wizard._js_action_mount_line_in_edit(line.index) + line.tax_ids = [Command.link(tax_21.id)] + wizard._line_value_changed_tax_ids(line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1000.0}, + {'flag': 'manual', 'balance': -826.45}, + {'flag': 'tax_line', 'balance': -173.55}, + ]) + + line = wizard.line_ids.filtered(lambda x: x.flag == 'manual') + wizard._js_action_mount_line_in_edit(line.index) + line.tax_ids = [Command.link(tax_10.id)] + wizard._line_value_changed_tax_ids(line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1000.0}, + {'flag': 'manual', 'balance': -763.35}, + {'flag': 'tax_line', 'balance': -160.31}, + {'flag': 'tax_line', 'balance': -76.34}, + ]) + + # Changing the account should recompute the taxes but preserve the "price included taxes" mode. + line = wizard.line_ids.filtered(lambda x: x.flag == 'manual') + wizard._js_action_mount_line_in_edit(line.index) + line.account_id = self.account_revenue1 + wizard._line_value_changed_account_id(line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1000.0}, + {'flag': 'manual', 'balance': -763.35}, + {'flag': 'tax_line', 'balance': -160.31}, + {'flag': 'tax_line', 'balance': -76.34}, + ]) + + # The wizard can be validated. + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + # Validate and check the statement line. + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'balance': 1000.0}, + {'balance': -763.35}, + {'balance': -160.31}, + {'balance': -76.34}, + ]) + self.assertRecordValues(wizard, [{'state': 'reconciled'}]) + + def test_validation_caba_tax_account(self): + """ Cash basis taxes usually put their tax lines on a transition account, and the cash basis entries then move those amounts + to the regular tax accounts. When using a cash basis tax in the bank reconciliation widget, their won't be any cash basis + entry and the lines will directly be exigible, so we want to use the final tax account directly. + """ + tax_account = self.company_data['default_account_tax_sale'] + + caba_tax = self.env['account.tax'].create({ + 'name': "CABA", + 'amount_type': 'percent', + 'amount': 20.0, + 'tax_exigibility': 'on_payment', + 'cash_basis_transition_account_id': self.safe_copy(tax_account).id, + 'invoice_repartition_line_ids': [ + (0, 0, { + 'repartition_type': 'base', + }), + (0, 0, { + 'repartition_type': 'tax', + 'account_id': tax_account.id, + }), + ], + 'refund_repartition_line_ids': [ + (0, 0, { + 'repartition_type': 'base', + }), + (0, 0, { + 'repartition_type': 'tax', + 'account_id': tax_account.id, + }), + ], + }) + + st_line = self._create_st_line(120.0) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + line = wizard.line_ids.filtered(lambda x: x.flag == 'auto_balance') + wizard._js_action_mount_line_in_edit(line.index) + line.account_id = self.account_revenue1 + line.tax_ids = [Command.link(caba_tax.id)] + wizard._line_value_changed_tax_ids(line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 120.0, 'account_id': st_line.journal_id.default_account_id.id}, + {'flag': 'manual', 'balance': -100.0, 'account_id': self.account_revenue1.id}, + {'flag': 'tax_line', 'balance': -20.0, 'account_id': tax_account.id}, + ]) + + self.assertRecordValues(wizard, [{'state': 'valid'}]) + + wizard._action_validate() + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'balance': 120.0, 'tax_ids': [], 'tax_line_id': False, 'account_id': st_line.journal_id.default_account_id.id}, + {'balance': -100.0, 'tax_ids': caba_tax.ids, 'tax_line_id': False, 'account_id': self.account_revenue1.id}, + {'balance': -20.0, 'tax_ids': [], 'tax_line_id': caba_tax.id, 'account_id': tax_account.id}, + ]) + self.assertRecordValues(wizard, [{'state': 'reconciled'}]) + + def test_validation_changed_default_account(self): + st_line = self._create_st_line(100.0, partner_id=self.partner_a.id) + original_journal_account_id = st_line.journal_id.default_account_id + # Change the default account of the journal (exceptional case) + st_line.journal_id.default_account_id = self.company_data['default_journal_cash'].default_account_id + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + self.assertRecordValues(wizard, [{'state': 'valid'}]) + # Validate and check the statement line. + wizard._action_validate() + liquidity_line, _suspense_line, _other_line = st_line._seek_for_lines() + self.assertRecordValues(liquidity_line, [ + {'account_id': original_journal_account_id.id, 'balance': 100.0}, + ]) + self.assertRecordValues(wizard, [{'state': 'reconciled'}]) + + def test_apply_taxes_with_reco_model(self): + st_line = self._create_st_line(1000.0) + + tax_21 = self.env['account.tax'].create({ + 'name': "tax_21", + 'amount': 21, + }) + + reco_model = self.env['account.reconcile.model'].create({ + 'name': "test_apply_taxes_with_reco_model", + 'rule_type': 'writeoff_button', + 'line_ids': [Command.create({ + 'account_id': self.account_revenue1.id, + 'tax_ids': [Command.set(tax_21.ids)], + })], + }) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_select_reconcile_model(reco_model) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1000.0}, + {'flag': 'manual', 'balance': -826.45}, + {'flag': 'tax_line', 'balance': -173.55}, + ]) + + def test_percentage_st_line_with_reco_model(self): + journal_curr = self.other_currency + foreign_curr = self.other_currency_2 + self.company_data['default_journal_bank'].currency_id = journal_curr + + # Setup triple currency. + st_line = self._create_st_line( + 1000.0, + date='2018-01-01', + foreign_currency_id=foreign_curr.id, + amount_currency=4000.0, + ) + + reco_model = self.env['account.reconcile.model'].create({ + 'name': "test_percentage_st_line_with_reco_model", + 'rule_type': 'writeoff_button', + 'line_ids': [ + Command.create({ + 'amount_type': 'percentage_st_line', + 'amount_string': str(percentage), + 'label': str(i), + 'account_id': self.account_revenue1.id, + }) + for i, percentage in enumerate((74.0, 24.0, 12.0, -10.0)) + ], + }) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_select_reconcile_model(reco_model) + + self.assertRecordValues(wizard.line_ids, [ + {'flag': 'liquidity', 'currency_id': journal_curr.id, 'amount_currency': 1000.0, 'balance': 500.0}, + {'flag': 'manual', 'currency_id': journal_curr.id, 'amount_currency': -740.0, 'balance': -370.0}, + {'flag': 'manual', 'currency_id': journal_curr.id, 'amount_currency': -240.0, 'balance': -120.0}, + {'flag': 'manual', 'currency_id': journal_curr.id, 'amount_currency': -120.0, 'balance': -60.0}, + {'flag': 'manual', 'currency_id': journal_curr.id, 'amount_currency': 100.0, 'balance': 50.0}, + ]) + + def test_manual_edits_not_replaced(self): + """ 2 partial payments should keep the edited balance """ + st_line = self._create_st_line( + 1200.0, + date='2017-02-01', + ) + inv_line_1 = self._create_invoice_line( + 'out_invoice', + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 3000.0}], + ) + inv_line_2 = self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 4000.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line_1) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1200.0}, + {'flag': 'new_aml', 'balance':-1200.0}, + ]) + + line = wizard.line_ids.filtered(lambda x: x.flag == 'new_aml') + wizard._js_action_mount_line_in_edit(line.index) + line.balance = -600.0 + wizard._line_value_changed_balance(line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1200.0}, + {'flag': 'new_aml', 'balance': -600.0}, + {'flag': 'auto_balance', 'balance': -600.0}, + ]) + + wizard._action_add_new_amls(inv_line_2) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 1200.0}, + {'flag': 'new_aml', 'balance': -600.0}, + {'flag': 'new_aml', 'balance': -600.0}, + ]) + + def test_manual_edits_not_replaced_multicurrency(self): + """ 2 partial payments should keep the edited amount_currency """ + st_line = self._create_st_line( + 1200.0, + date='2018-01-01', + foreign_currency_id=self.other_currency_2.id, + amount_currency=6000.0, # rate 5:1 + ) + + inv_line_1 = self._create_invoice_line( + 'out_invoice', + invoice_date='2016-01-01', + currency_id=self.other_currency_2.id, + invoice_line_ids=[{'price_unit': 6000.0}], # 1000 company curr (rate 6:1) + ) + inv_line_2 = self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-01', + currency_id=self.other_currency_2.id, + invoice_line_ids=[{'price_unit': 4000.0}], # 1000 company curr (rate 4:1) + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line_1) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency':-6000.0, 'balance':-1000.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -200.0}, + ]) + + line = wizard.line_ids.filtered(lambda x: x.flag == 'new_aml') + wizard._js_action_mount_line_in_edit(line.index) + line.amount_currency = -3000.0 + wizard._line_value_changed_amount_currency(line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency':-3000.0, 'balance': -500.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -100.0}, + {'flag': 'auto_balance', 'amount_currency':-3000.0, 'balance': -600.0}, + ]) + + wizard._action_add_new_amls(inv_line_2) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'balance': 1200.0}, + {'flag': 'new_aml', 'amount_currency':-3000.0, 'balance': -500.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -100.0}, + {'flag': 'new_aml', 'amount_currency':-3000.0, 'balance': -750.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': 150.0}, + ]) + + def test_creating_manual_line_multi_currencies(self): + # 6300.0 curr2 == 1800.0 comp_curr (bank rate 3.5:1 instead of the odoo rate 4:1) + st_line = self._create_st_line( + 1800.0, + date='2017-01-01', + foreign_currency_id=self.other_currency_2.id, + amount_currency=6300.0, + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1800.0, 'currency_id': self.company_data['currency'].id, 'balance': 1800.0}, + {'flag': 'auto_balance', 'amount_currency': -6300.0, 'currency_id': self.other_currency_2.id, 'balance': -1800.0}, + ]) + + # Custom balance. + line = wizard.line_ids.filtered(lambda x: x.flag == 'auto_balance') + wizard._js_action_mount_line_in_edit(line.index) + line.balance = -1500.0 + wizard._line_value_changed_balance(line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1800.0, 'currency_id': self.company_data['currency'].id, 'balance': 1800.0}, + {'flag': 'manual', 'amount_currency': -6300.0, 'currency_id': self.other_currency_2.id, 'balance': -1500.0}, + {'flag': 'auto_balance', 'amount_currency': 0.0, 'currency_id': self.other_currency_2.id, 'balance': -300.0}, + ]) + + # Custom amount_currency. + line = wizard.line_ids.filtered(lambda x: x.flag == 'manual') + wizard._js_action_mount_line_in_edit(line.index) + line.amount_currency = -4200.0 + wizard._line_value_changed_amount_currency(line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1800.0, 'currency_id': self.company_data['currency'].id, 'balance': 1800.0}, + {'flag': 'manual', 'amount_currency': -4200.0, 'currency_id': self.other_currency_2.id, 'balance': -1200.0}, + {'flag': 'auto_balance', 'amount_currency': -2100.0, 'currency_id': self.other_currency_2.id, 'balance': -600.0}, + ]) + + # Custom currency_id. + line = wizard.line_ids.filtered(lambda x: x.flag == 'manual') + wizard._js_action_mount_line_in_edit(line.index) + line.currency_id = self.other_currency + wizard._line_value_changed_currency_id(line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1800.0, 'currency_id': self.company_data['currency'].id, 'balance': 1800.0}, + {'flag': 'manual', 'amount_currency': -4200.0, 'currency_id': self.other_currency.id, 'balance': -2100.0}, + {'flag': 'auto_balance', 'amount_currency': 1050.0, 'currency_id': self.other_currency_2.id, 'balance': 300.0}, + ]) + + # Custom balance. + line = wizard.line_ids.filtered(lambda x: x.flag == 'manual') + wizard._js_action_mount_line_in_edit(line.index) + line.balance = -1800.0 + wizard._line_value_changed_balance(line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1800.0, 'currency_id': self.company_data['currency'].id, 'balance': 1800.0}, + {'flag': 'manual', 'amount_currency': -4200.0, 'currency_id': self.other_currency.id, 'balance': -1800.0}, + ]) + + def test_auto_reconcile_cron(self): + self.env['account.reconcile.model'].search([('company_id', '=', self.company_data['company'].id)]).unlink() + cron = self.env.ref('account_accountant.auto_reconcile_bank_statement_line') + self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)]).unlink() + + st_line = self._create_st_line(1234.0, partner_id=self.partner_a.id, date='2017-01-01') + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 1) + + self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 1234.0}], + ) + + rule = self.env['account.reconcile.model'].create({ + 'name': "test_auto_reconcile_cron", + 'rule_type': 'writeoff_suggestion', + 'auto_reconcile': False, + 'line_ids': [Command.create({'account_id': self.account_revenue1.id})], + }) + + # The CRON is not doing anything since the model is not auto reconcile. + with freeze_time('2017-01-01'): + self.env['account.bank.statement.line']._cron_try_auto_reconcile_statement_lines() + self.assertRecordValues(st_line, [{'is_reconciled': False, 'cron_last_check': False}]) + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 1) + + rule.auto_reconcile = True + + # The CRON don't consider old statement lines. + with freeze_time('2017-06-01'): + self.env['account.bank.statement.line']._cron_try_auto_reconcile_statement_lines() + self.assertRecordValues(st_line, [{'is_reconciled': False, 'cron_last_check': False}]) + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 1) + + # The CRON will auto-reconcile the line. + with freeze_time('2017-01-02'): + self.env['account.bank.statement.line']._cron_try_auto_reconcile_statement_lines() + self.assertRecordValues(st_line, [{'is_reconciled': True, 'cron_last_check': fields.Datetime.from_string('2017-01-02 00:00:00')}]) + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 1) + + st_line1 = self._create_st_line(1234.0, partner_id=self.partner_a.id, date='2018-01-01') + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 2) + self._create_invoice_line( + 'out_invoice', + invoice_date='2018-01-01', + invoice_line_ids=[{'price_unit': 1234.0}], + ) + st_line2 = self._create_st_line(1234.0, partner_id=self.partner_a.id, date='2018-01-01') + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 3) + self._create_invoice_line( + 'out_invoice', + invoice_date='2018-01-01', + invoice_line_ids=[{'price_unit': 1234.0}], + ) + + # Simulate the cron already tried to process 'st_line1' before. + with freeze_time('2017-12-31'): + st_line1.cron_last_check = fields.Datetime.now() + + # The statement line with no 'cron_last_check' must be processed before others. + with freeze_time('2018-01-02'): + self.env['account.bank.statement.line']._cron_try_auto_reconcile_statement_lines(batch_size=1) + + self.assertRecordValues(st_line1 + st_line2, [ + {'is_reconciled': False, 'cron_last_check': fields.Datetime.from_string('2017-12-31 00:00:00')}, + {'is_reconciled': True, 'cron_last_check': fields.Datetime.from_string('2018-01-02 00:00:00')}, + ]) + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 4) + + with freeze_time('2018-01-03'): + self.env['account.bank.statement.line']._cron_try_auto_reconcile_statement_lines(batch_size=1) + + self.assertRecordValues(st_line1, [{'is_reconciled': True, 'cron_last_check': fields.Datetime.from_string('2018-01-03 00:00:00')}]) + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 4) + + st_line3 = self._create_st_line(1234.0, date='2018-01-01') + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 5) + self._create_invoice_line( + 'out_invoice', + invoice_date='2018-01-01', + invoice_line_ids=[{'price_unit': 1234.0}], + ) + st_line4 = self._create_st_line(1234.0, date='2018-01-01') + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 6) + self._create_invoice_line( + 'out_invoice', + invoice_date='2018-01-01', + invoice_line_ids=[{'price_unit': 1234.0}], + ) + + # Make sure the CRON is no longer applicable. + rule.match_partner = True + rule.match_partner_ids = [Command.set(self.partner_a.ids)] + with freeze_time('2018-01-01'): + self.env['account.bank.statement.line']._cron_try_auto_reconcile_statement_lines(batch_size=1) + + self.assertRecordValues(st_line3 + st_line4, [ + {'is_reconciled': False, 'cron_last_check': fields.Datetime.from_string('2018-01-01 00:00:00')}, + {'is_reconciled': False, 'cron_last_check': False}, + ]) + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 7) + + # Make sure the statement lines are reconciled by the cron in the right order. + self.assertRecordValues(st_line3 + st_line4, [ + {'is_reconciled': False, 'cron_last_check': fields.Datetime.from_string('2018-01-01 00:00:00')}, + {'is_reconciled': False, 'cron_last_check': False}, + ]) + + # st_line4 is processed because cron_last_check is null. + with freeze_time('2018-01-02'): + self.env['account.bank.statement.line']._cron_try_auto_reconcile_statement_lines(batch_size=1) + + self.assertRecordValues(st_line3 + st_line4, [ + {'is_reconciled': False, 'cron_last_check': fields.Datetime.from_string('2018-01-01 00:00:00')}, + {'is_reconciled': False, 'cron_last_check': fields.Datetime.from_string('2018-01-02 00:00:00')}, + ]) + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 7) + + # st_line3 is processed because it has the oldest cron_last_check. + with freeze_time('2018-01-03'): + self.env['account.bank.statement.line']._cron_try_auto_reconcile_statement_lines(batch_size=1) + + self.assertRecordValues(st_line3 + st_line4, [ + {'is_reconciled': False, 'cron_last_check': fields.Datetime.from_string('2018-01-03 00:00:00')}, + {'is_reconciled': False, 'cron_last_check': fields.Datetime.from_string('2018-01-02 00:00:00')}, + ]) + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 7) + + def test_duplicate_amls_constraint(self): + st_line = self._create_st_line(1000.0) + inv_line = self._create_invoice_line( + 'out_invoice', + invoice_line_ids=[{'price_unit': 1000.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + self.assertTrue(len(wizard.line_ids), 2) + + wizard._action_add_new_amls(inv_line) + self.assertTrue(len(wizard.line_ids), 2) + + @freeze_time('2017-01-01') + def test_reconcile_model_with_payment_tolerance(self): + self.env['account.reconcile.model'].search([('company_id', '=', self.company_data['company'].id)]).unlink() + + invoice_line = self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 1000.0}], + ) + st_line = self._create_st_line(998.0, partner_id=self.partner_a.id, date='2017-01-01', payment_ref=invoice_line.move_id.name) + + rule = self.env['account.reconcile.model'].create({ + 'name': "test_reconcile_model_with_payment_tolerance", + 'rule_type': 'invoice_matching', + 'allow_payment_tolerance': True, + 'payment_tolerance_type': 'percentage', + 'payment_tolerance_param': 2.0, + 'line_ids': [Command.create({'account_id': self.account_revenue1.id})], + }) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_trigger_matching_rules() + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 998.0, 'reconcile_model_id': False}, + {'flag': 'new_aml', 'balance': -1000.0, 'reconcile_model_id': rule.id}, + {'flag': 'manual', 'balance': 2.0, 'reconcile_model_id': rule.id}, + ]) + + @freeze_time('2017-01-01') + def test_auto_reconcile_model_with_archived_partner(self): + self.env['account.reconcile.model'].search([('company_id', '=', self.company_data['company'].id)]).unlink() + self.env['res.partner.bank'].search([('company_id', '=', self.company_data['company'].id)]).unlink() + + # Needed as partner_a does not have a company and we need a company in order to find matching partner from account_number + self.partner_a.company_id = self.company_data['company'].id + self.env['res.partner.bank'].create({ + 'partner_id': self.partner_a.id, + 'acc_number': '12345', + }) + invoice_line = self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 1000.0}], + ) + st_line = self._create_st_line(1000.0, account_number='12345', date='2017-01-01', payment_ref=invoice_line.move_id.name) + + self.env['account.reconcile.model'].create({ + 'name': "test_reconcile_model_with_archived_partner", + 'rule_type': 'invoice_matching', + 'auto_reconcile': True, + 'match_partner': True, + }) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_trigger_matching_rules() + self.assertEqual(wizard.partner_id, self.partner_a) + self.assertTrue(wizard.matching_rules_allow_auto_reconcile) + + # archive partner and trigger again, partner should still be set (match based on account_number), because it's the only match + self.partner_a.active = False + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_trigger_matching_rules() + self.assertEqual(wizard.partner_id, self.partner_a) # Partner should still be set + self.assertTrue(wizard.matching_rules_allow_auto_reconcile) # no special process because the partner is unactive + + def test_early_payment_included_multi_currency(self): + self.env['account.reconcile.model'].search([('company_id', '=', self.company_data['company'].id)]).unlink() + self.early_payment_term.early_pay_discount_computation = 'included' + income_exchange_account = self.env.company.income_currency_exchange_account_id + expense_exchange_account = self.env.company.expense_currency_exchange_account_id + + inv_line1_with_epd = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency_2.id, + partner_id=self.partner_a.id, + invoice_payment_term_id=self.early_payment_term.id, + invoice_date='2016-12-01', + invoice_line_ids=[ + { + 'price_unit': 4800.0, + 'account_id': self.account_revenue1.id, + 'tax_ids': [Command.set(self.company_data['default_tax_sale'].ids)], + }, + { + 'price_unit': 9600.0, + 'account_id': self.account_revenue2.id, + 'tax_ids': [Command.set(self.company_data['default_tax_sale'].ids)], + }, + ], + ) + inv_line1_with_epd_rec_lines = inv_line1_with_epd.move_id.line_ids\ + .filtered(lambda x: x.account_type == 'asset_receivable')\ + .sorted(lambda x: x.discount_date or x.date_maturity) + self.assertRecordValues( + inv_line1_with_epd_rec_lines, + [ + { + 'amount_currency': 16560.0, + 'balance': 2760.0, + 'discount_amount_currency': 14904.0, + 'discount_balance': 2484.0, + 'discount_date': fields.Date.from_string('2016-12-11'), + 'date_maturity': fields.Date.from_string('2016-12-21'), + }, + ], + ) + + inv_line2_with_epd = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency_2.id, + partner_id=self.partner_a.id, + invoice_payment_term_id=self.early_payment_term.id, + invoice_date='2017-01-20', + invoice_line_ids=[ + { + 'price_unit': 480.0, + 'account_id': self.account_revenue1.id, + 'tax_ids': [Command.set(self.company_data['default_tax_sale'].ids)], + }, + { + 'price_unit': 960.0, + 'account_id': self.account_revenue2.id, + 'tax_ids': [Command.set(self.company_data['default_tax_sale'].ids)], + }, + ], + ) + inv_line2_with_epd_rec_lines = inv_line2_with_epd.move_id.line_ids\ + .filtered(lambda x: x.account_type == 'asset_receivable')\ + .sorted(lambda x: x.discount_date or x.date_maturity) + self.assertRecordValues( + inv_line2_with_epd_rec_lines, + [ + { + 'amount_currency': 1656.0, + 'balance': 414.0, + 'discount_amount_currency': 1490.4, + 'discount_balance': 372.6, + 'discount_date': fields.Date.from_string('2017-01-30'), + 'date_maturity': fields.Date.from_string('2017-02-09'), + }, + ], + ) + + # inv1: 16560.0 (no epd) + # inv2: 1490.4 (epd) + st_line = self._create_st_line( + 4512.0, # instead of 4512.6 (rate 1:4) + date='2017-01-04', + foreign_currency_id=self.other_currency_2.id, + amount_currency=18050.4, + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + + # Add all lines from the first invoice plus the first one from the second one. + wizard._action_add_new_amls(inv_line1_with_epd_rec_lines + inv_line2_with_epd_rec_lines) + liquidity_acc = st_line.journal_id.default_account_id + receivable_acc = self.company_data['default_account_receivable'] + early_pay_acc = self.env.company.account_journal_early_pay_discount_loss_account_id + tax_acc = self.company_data['default_tax_sale'].invoice_repartition_line_ids.account_id + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 4512.0, 'balance': 4512.0, 'account_id': liquidity_acc.id}, + {'flag': 'new_aml', 'amount_currency': -16560.0, 'balance': -2760.0, 'account_id': receivable_acc.id}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -1379.45, 'account_id': income_exchange_account.id}, + {'flag': 'new_aml', 'amount_currency': -1656.0, 'balance': -414.0, 'account_id': receivable_acc.id}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': 0.06, 'account_id': expense_exchange_account.id}, + {'flag': 'early_payment', 'amount_currency': 144.0, 'balance': 36.0, 'account_id': early_pay_acc.id}, + {'flag': 'early_payment', 'amount_currency': 21.6, 'balance': 5.4, 'account_id': tax_acc.id}, + {'flag': 'early_payment', 'amount_currency': 0.0, 'balance': -0.01, 'account_id': income_exchange_account.id}, + ]) + + def test_early_payment_excluded_multi_currency(self): + self.env['account.reconcile.model'].search([('company_id', '=', self.company_data['company'].id)]).unlink() + self.early_payment_term.early_pay_discount_computation = 'excluded' + income_exchange_account = self.env.company.income_currency_exchange_account_id + expense_exchange_account = self.env.company.expense_currency_exchange_account_id + + inv_line1_with_epd = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency_2.id, + partner_id=self.partner_a.id, + invoice_payment_term_id=self.early_payment_term.id, + invoice_date='2016-12-01', + invoice_line_ids=[ + { + 'price_unit': 4800.0, + 'account_id': self.account_revenue1.id, + 'tax_ids': [Command.set(self.company_data['default_tax_sale'].ids)], + }, + { + 'price_unit': 9600.0, + 'account_id': self.account_revenue2.id, + 'tax_ids': [Command.set(self.company_data['default_tax_sale'].ids)], + }, + ], + ) + inv_line1_with_epd_rec_lines = inv_line1_with_epd.move_id.line_ids\ + .filtered(lambda x: x.account_type == 'asset_receivable')\ + .sorted(lambda x: x.discount_date or x.date_maturity) + self.assertRecordValues( + inv_line1_with_epd_rec_lines, + [ + { + 'amount_currency': 16560.0, + 'balance': 2760.0, + 'discount_amount_currency': 15120.0, + 'discount_balance': 2520.0, + 'discount_date': fields.Date.from_string('2016-12-11'), + 'date_maturity': fields.Date.from_string('2016-12-21'), + }, + ], + ) + + inv_line2_with_epd = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency_2.id, + partner_id=self.partner_a.id, + invoice_payment_term_id=self.early_payment_term.id, + invoice_date='2017-01-20', + invoice_line_ids=[ + { + 'price_unit': 480.0, + 'account_id': self.account_revenue1.id, + 'tax_ids': [Command.set(self.company_data['default_tax_sale'].ids)], + }, + { + 'price_unit': 960.0, + 'account_id': self.account_revenue2.id, + 'tax_ids': [Command.set(self.company_data['default_tax_sale'].ids)], + }, + ], + ) + inv_line2_with_epd_rec_lines = inv_line2_with_epd.move_id.line_ids\ + .filtered(lambda x: x.account_type == 'asset_receivable')\ + .sorted(lambda x: x.discount_date or x.date_maturity) + self.assertRecordValues( + inv_line2_with_epd_rec_lines, + [ + { + 'amount_currency': 1656.0, + 'balance': 414.0, + 'discount_amount_currency': 1512.0, + 'discount_balance': 378.0, + 'discount_date': fields.Date.from_string('2017-01-30'), + 'date_maturity': fields.Date.from_string('2017-02-09'), + }, + ], + ) + + # inv1: 16560.0 (no epd) + # inv2: 1512.0 (epd) + st_line = self._create_st_line( + 4515.0, # instead of 4518.0 (rate 1:4) + date='2017-01-04', + foreign_currency_id=self.other_currency_2.id, + amount_currency=18072.0, + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + + # Add all lines from the first invoice plus the first one from the second one. + wizard._action_add_new_amls(inv_line1_with_epd_rec_lines + inv_line2_with_epd_rec_lines[:2]) + liquidity_acc = st_line.journal_id.default_account_id + receivable_acc = self.company_data['default_account_receivable'] + early_pay_acc = self.env.company.account_journal_early_pay_discount_loss_account_id + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 4515.0, 'balance': 4515.0, 'account_id': liquidity_acc.id}, + {'flag': 'new_aml', 'amount_currency': -16560.0, 'balance': -2760.0, 'account_id': receivable_acc.id}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -1377.25, 'account_id': income_exchange_account.id}, + {'flag': 'new_aml', 'amount_currency': -1656.0, 'balance': -414.0, 'account_id': receivable_acc.id}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': 0.27, 'account_id': expense_exchange_account.id}, + {'flag': 'early_payment', 'amount_currency': 144.0, 'balance': 36.0, 'account_id': early_pay_acc.id}, + {'flag': 'early_payment', 'amount_currency': 0.0, 'balance': -0.02, 'account_id': income_exchange_account.id}, + ]) + + def test_early_payment_mixed_multi_currency(self): + self.env['account.reconcile.model'].search([('company_id', '=', self.company_data['company'].id)]).unlink() + self.early_payment_term.early_pay_discount_computation = 'mixed' + income_exchange_account = self.env.company.income_currency_exchange_account_id + expense_exchange_account = self.env.company.expense_currency_exchange_account_id + + inv_line1_with_epd = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency_2.id, + partner_id=self.partner_a.id, + invoice_payment_term_id=self.early_payment_term.id, + invoice_date='2016-12-01', + invoice_line_ids=[ + { + 'price_unit': 4800.0, + 'account_id': self.account_revenue1.id, + 'tax_ids': [Command.set(self.company_data['default_tax_sale'].ids)], + }, + { + 'price_unit': 9600.0, + 'account_id': self.account_revenue2.id, + 'tax_ids': [Command.set(self.company_data['default_tax_sale'].ids)], + }, + ], + ) + inv_line1_with_epd_rec_lines = inv_line1_with_epd.move_id.line_ids\ + .filtered(lambda x: x.account_type == 'asset_receivable')\ + .sorted(lambda x: x.discount_date or x.date_maturity) + self.assertRecordValues( + inv_line1_with_epd_rec_lines, + [ + { + 'amount_currency': 16344.0, + 'balance': 2724.0, + 'discount_amount_currency': 14904.0, + 'discount_balance': 2484.0, + 'discount_date': fields.Date.from_string('2016-12-11'), + 'date_maturity': fields.Date.from_string('2016-12-21'), + }, + ], + ) + + inv_line2_with_epd = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency_2.id, + partner_id=self.partner_a.id, + invoice_payment_term_id=self.early_payment_term.id, + invoice_date='2017-01-20', + invoice_line_ids=[ + { + 'price_unit': 480.0, + 'account_id': self.account_revenue1.id, + 'tax_ids': [Command.set(self.company_data['default_tax_sale'].ids)], + }, + { + 'price_unit': 960.0, + 'account_id': self.account_revenue2.id, + 'tax_ids': [Command.set(self.company_data['default_tax_sale'].ids)], + }, + ], + ) + inv_line2_with_epd_rec_lines = inv_line2_with_epd.move_id.line_ids\ + .filtered(lambda x: x.account_type == 'asset_receivable')\ + .sorted(lambda x: x.discount_date or x.date_maturity) + self.assertRecordValues( + inv_line2_with_epd_rec_lines, + [ + { + 'amount_currency': 1634.4, + 'balance': 408.6, + 'discount_amount_currency': 1490.4, + 'discount_balance': 372.6, + 'discount_date': fields.Date.from_string('2017-01-30'), + 'date_maturity': fields.Date.from_string('2017-02-09'), + }, + ], + ) + + # inv1: 16344.0 (no epd) + # inv2: 1490.4 (epd) + st_line = self._create_st_line( + 4458.0, # instead of 4458.6 (rate 1:4) + date='2017-01-04', + foreign_currency_id=self.other_currency_2.id, + amount_currency=17834.4, + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + + # Add all lines from the first invoice plus the first one from the second one. + wizard._action_add_new_amls(inv_line1_with_epd_rec_lines + inv_line2_with_epd_rec_lines[:2]) + liquidity_acc = st_line.journal_id.default_account_id + receivable_acc = self.company_data['default_account_receivable'] + early_pay_acc = self.env.company.account_journal_early_pay_discount_loss_account_id + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 4458.0, 'balance': 4458.0, 'account_id': liquidity_acc.id}, + {'flag': 'new_aml', 'amount_currency': -16344.0, 'balance': -2724.0, 'account_id': receivable_acc.id}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -1361.45, 'account_id': income_exchange_account.id}, + {'flag': 'new_aml', 'amount_currency': -1634.4, 'balance': -408.6, 'account_id': receivable_acc.id}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': 0.05, 'account_id': expense_exchange_account.id}, + {'flag': 'early_payment', 'amount_currency': 144.0, 'balance': 36.0, 'account_id': early_pay_acc.id}, + ]) + + def test_early_payment_included_intracomm_bill(self): + tax_tags = self.env['account.account.tag'].create({ + 'name': f'tax_tag_{i}', + 'applicability': 'taxes', + 'country_id': self.env.company.account_fiscal_country_id.id, + } for i in range(6)) + + intracomm_tax = self.env['account.tax'].create({ + 'name': 'tax20', + 'amount_type': 'percent', + 'amount': 20, + 'type_tax_use': 'purchase', + 'invoice_repartition_line_ids': [ + # pylint: disable=bad-whitespace + Command.create({'repartition_type': 'base', 'factor_percent': 100.0, 'tag_ids': [Command.set(tax_tags[0].ids)]}), + Command.create({'repartition_type': 'tax', 'factor_percent': 100.0, 'tag_ids': [Command.set(tax_tags[1].ids)]}), + Command.create({'repartition_type': 'tax', 'factor_percent': -100.0, 'tag_ids': [Command.set(tax_tags[2].ids)]}), + ], + 'refund_repartition_line_ids': [ + # pylint: disable=bad-whitespace + Command.create({'repartition_type': 'base', 'factor_percent': 100.0, 'tag_ids': [Command.set(tax_tags[3].ids)]}), + Command.create({'repartition_type': 'tax', 'factor_percent': 100.0, 'tag_ids': [Command.set(tax_tags[4].ids)]}), + Command.create({'repartition_type': 'tax', 'factor_percent': -100.0, 'tag_ids': [Command.set(tax_tags[5].ids)]}), + ], + }) + + early_payment_term = self.env['account.payment.term'].create({ + 'name': "early_payment_term", + 'company_id': self.company_data['company'].id, + 'early_pay_discount_computation': 'included', + 'early_discount': True, + 'discount_percentage': 2, + 'discount_days': 7, + 'line_ids': [ + Command.create({ + 'value': 'percent', + 'value_amount': 100.0, + 'nb_days': 30, + }), + ], + }) + + bill = self.env['account.move'].create({ + 'move_type': 'in_invoice', + 'partner_id': self.partner_a.id, + 'invoice_payment_term_id': early_payment_term.id, + 'invoice_date': '2019-01-01', + 'date': '2019-01-01', + 'invoice_line_ids': [ + Command.create({ + 'name': 'line', + 'price_unit': 1000.0, + 'tax_ids': [Command.set(intracomm_tax.ids)], + }), + ], + }) + bill.action_post() + + st_line = self._create_st_line( + -980.0, + date='2017-01-01', + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(bill.line_ids.filtered(lambda x: x.account_type == 'liability_payable')) + wizard._action_validate() + + self.assertRecordValues(st_line.line_ids.sorted('balance'), [ + # pylint: disable=bad-whitespace + {'amount_currency': -980.0, 'tax_ids': [], 'tax_tag_ids': [], 'tax_tag_invert': False}, + {'amount_currency': -20.0, 'tax_ids': intracomm_tax.ids, 'tax_tag_ids': tax_tags[3].ids, 'tax_tag_invert': True}, + {'amount_currency': -4.0, 'tax_ids': [], 'tax_tag_ids': tax_tags[4].ids, 'tax_tag_invert': True}, + {'amount_currency': 4.0, 'tax_ids': [], 'tax_tag_ids': tax_tags[5].ids, 'tax_tag_invert': True}, + {'amount_currency': 1000.0, 'tax_ids': [], 'tax_tag_ids': [], 'tax_tag_invert': False}, + ]) + + def test_early_payment_eligibility_date(self): + inv_line = self._create_invoice_line( + 'out_invoice', + partner_id=self.partner_a.id, + invoice_payment_term_id=self.early_payment_term.id, + invoice_date='2017-01-01', + invoice_line_ids=[ + { + 'price_unit': 1000.0, + 'account_id': self.account_revenue1.id, + }, + ] + ) + st_line = self._create_st_line(900.0, partner_id=self.partner_a.id, date='2017-01-10') + + self.early_payment_term.discount_days = 5 + + liquidity_acc = st_line.journal_id.default_account_id + receivable_acc = self.company_data['default_account_receivable'] + early_pay_acc = self.env.company.account_journal_early_pay_discount_loss_account_id + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=bad-whitespace + {'flag': 'liquidity', 'amount_currency': 900.0, 'balance': 900.0, 'account_id': liquidity_acc.id}, + {'flag': 'new_aml', 'amount_currency': -1000.0, 'balance': -1000.0, 'account_id': receivable_acc.id}, + {'flag': 'early_payment', 'amount_currency': 100.0, 'balance': 100.0, 'account_id': early_pay_acc.id}, + ]) + + def test_multi_currencies_with_custom_rate(self): + self.company_data['default_journal_bank'].currency_id = self.other_currency + st_line = self._create_st_line(1200.0) # rate 1:2 + self.assertRecordValues(st_line.move_id.line_ids, [ + # pylint: disable=C0326 + {'amount_currency': 1200.0, 'balance': 600.0}, + {'amount_currency': -1200.0, 'balance': -600.0}, + ]) + + # invoice with other_currency and rate 1:2 + invoice_line1 = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency.id, + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 300.0}], # = 150 USD + ) + + # Remove all rates. + self.other_currency.rate_ids.unlink() + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'balance': 600.0}, + {'flag': 'auto_balance', 'amount_currency': -1200.0, 'balance': -600.0}, + ]) + + # invoice with other_currency_2 and rate 1:6 + invoice_line2 = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency_2.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 600.0}], # = 100 USD + ) + # invoice with other_currency_2 and rate 1:4 + invoice_line3 = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency_2.id, + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 400.0}], # = 100 USD + ) + + # Remove all rates. + self.other_currency_2.rate_ids.unlink() + + # Ensure no conversion rate has been made. + wizard._action_add_new_amls(invoice_line1 + invoice_line2 + invoice_line3) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'balance': 600.0}, + {'flag': 'new_aml', 'amount_currency': -300.0, 'balance': -150.0}, + {'flag': 'new_aml', 'amount_currency': -600.0, 'balance': -100.0}, + {'flag': 'new_aml', 'amount_currency': -400.0, 'balance': -100.0}, + {'flag': 'auto_balance', 'amount_currency': -500.0, 'balance': -250.0}, + ]) + + def test_partial_reconciliation_suggestion_with_mixed_invoice_and_refund(self): + """ Test the partial reconciliation suggestion is well recomputed when adding another + line. For example, when adding 2 invoices having an higher amount then a refund. In that + case, the partial on the second invoice should be removed since the difference is filled + by the newly added refund. + """ + st_line = self._create_st_line( + 1800.0, + date='2017-01-01', + foreign_currency_id=self.other_currency.id, + amount_currency=3600.0, + ) + + inv1 = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 2400.0}], + ) + inv2 = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 2400.0}], + ) + refund = self._create_invoice_line( + 'out_refund', + currency_id=self.other_currency.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 1200.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv1 + inv2) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1800.0, 'balance': 1800.0}, + {'flag': 'new_aml', 'amount_currency': -2400.0, 'balance': -800.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -400.0}, + {'flag': 'new_aml', 'amount_currency': -1200.0, 'balance': -400.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -200.0}, + ]) + wizard._action_add_new_amls(refund) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1800.0, 'balance': 1800.0}, + {'flag': 'new_aml', 'amount_currency': -2400.0, 'balance': -800.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -400.0}, + {'flag': 'new_aml', 'amount_currency': -2400.0, 'balance': -800.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': -400.0}, + {'flag': 'new_aml', 'amount_currency': 1200.0, 'balance': 400.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'balance': 200.0}, + ]) + + def test_auto_reconcile_cron_with_time_limit(self): + self.env['account.reconcile.model'].search([('company_id', '=', self.company_data['company'].id)]).unlink() + cron = self.env.ref('account_accountant.auto_reconcile_bank_statement_line') + self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)]).unlink() + + st_line1 = self._create_st_line(1234.0, partner_id=self.partner_a.id, date='2017-01-01') + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 1) + st_line2 = self._create_st_line(5678.0, partner_id=self.partner_a.id, date='2017-01-02') + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 2) + + self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 1234.0}], + ) + self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 5678.0}], + ) + self.env['account.reconcile.model'].create({ + 'name': "test_auto_reconcile_cron_with_time_limit", + 'rule_type': 'writeoff_suggestion', + 'auto_reconcile': True, + 'line_ids': [Command.create({'account_id': self.account_revenue1.id})], + }) + + with freeze_time('2017-01-01 00:00:00') as frozen_time: + def datetime_now_override(): + frozen_time.tick() + return frozen_time() + with patch('odoo.fields.Datetime.now', side_effect=datetime_now_override): + # we simulate that the time limit is reached after first loop + self.env['account.bank.statement.line']._cron_try_auto_reconcile_statement_lines(limit_time=1) + # after first loop, only one statement should be reconciled + self.assertRecordValues(st_line1, [{'is_reconciled': True, 'cron_last_check': fields.Datetime.from_string('2017-01-01 00:00:01')}]) + # the other one should be in queue for regular cron tigger + self.assertRecordValues(st_line2, [{'is_reconciled': False, 'cron_last_check': False}]) + self.assertEqual(len(self.env['ir.cron.trigger'].search([('cron_id', '=', cron.id)])), 3) + + def test_auto_reconcile_cron_with_provided_statements_lines(self): + self.env['account.reconcile.model'].search([('company_id', '=', self.company_data['company'].id)]).unlink() + + st_line1 = self._create_st_line(1234.0, partner_id=self.partner_a.id, date='2017-01-01') + st_line2 = self._create_st_line(5678.0, partner_id=self.partner_a.id, date='2017-01-02') + self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 1234.0}], + ) + self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 5678.0}], + ) + self.env['account.reconcile.model'].create({ + 'name': "test_auto_reconcile_cron_with_time_limit", + 'rule_type': 'writeoff_suggestion', + 'auto_reconcile': True, + 'line_ids': [Command.create({'account_id': self.account_revenue1.id})], + }) + with freeze_time('2017-01-01 00:00:00'): + # we call auto reconcile on st_lines1 **only** + st_line1._cron_try_auto_reconcile_statement_lines() + self.assertRecordValues(st_line1, [{'is_reconciled': True, 'cron_last_check': fields.Datetime.from_string('2017-01-01 00:00:00')}]) + self.assertRecordValues(st_line2, [{'is_reconciled': False, 'cron_last_check': False}]) + + @freeze_time('2019-01-01') + def test_button_apply_reco_model(self): + inv_line = self._create_invoice_line( + 'in_invoice', + invoice_date='2019-01-01', + invoice_line_ids=[{'price_unit': 980.0}], + ) + st_line = self._create_st_line(-1000.0, partner_id=self.partner_a.id, date=inv_line.date, payment_ref=inv_line.move_name) + + reco_model = self.env['account.reconcile.model'].create({ + 'name': "test_apply_taxes_with_reco_model", + 'rule_type': 'writeoff_button', + 'line_ids': [Command.create({ + 'account_id': self.account_revenue1.copy().id, + 'label': 'Bank Fees' + })], + }) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_trigger_matching_rules() + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'account_id': st_line.journal_id.default_account_id.id, 'balance': -1000.0}, + {'flag': 'new_aml', 'account_id': inv_line.account_id.id, 'balance': 980.0}, + {'flag': 'auto_balance', 'account_id': self.company_data['default_account_payable'].id, 'balance': 20.0}, + ]) + + wizard._action_select_reconcile_model(reco_model) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'account_id': st_line.journal_id.default_account_id.id, 'balance': -1000.0}, + {'flag': 'new_aml', 'account_id': inv_line.account_id.id, 'balance': 980.0}, + {'flag': 'manual', 'account_id': reco_model.line_ids[0].account_id.id, 'balance': 20.0}, + ]) + + def test_exchange_diff_on_partial_aml_multi_currency(self): + self.company_data['default_journal_bank'].currency_id = self.other_currency + st_line = self._create_st_line(-36000.0) # rate 1:2 + inv_line = self._create_invoice_line( + 'in_invoice', + invoice_date='2016-01-01', # rate 1:3 + currency_id=self.other_currency.id, + invoice_line_ids=[{'price_unit': 38000.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': -36000.0, 'currency_id': self.other_currency.id, 'balance': -18000.0}, + {'flag': 'new_aml', 'amount_currency': 36000.0, 'currency_id': self.other_currency.id, 'balance': 12000.0}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': 6000.0}, + ]) + + def test_exchange_diff_on_partial_aml_multi_currency_close_amount(self): + self.other_currency.rate_ids.rate = 0.9839 + self.company_data['default_journal_bank'].currency_id = self.other_currency + + st_line = self._create_st_line(-37436.50) + self.assertRecordValues(st_line.line_ids, [ + # pylint: disable=C0326 + {'amount_currency': -37436.50, 'balance': -38049.09}, + {'amount_currency': 37436.50, 'balance': 38049.09}, + ]) + + inv_line = self._create_invoice_line( + 'in_invoice', + invoice_date=st_line.date, + currency_id=self.other_currency.id, + invoice_line_ids=[{'price_unit': 37436.52}], + ) + self.assertRecordValues(inv_line, [{ + 'amount_currency': -37436.52, + 'balance': -38049.11, + }]) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': -37436.50, 'currency_id': self.other_currency.id, 'balance': -38049.09}, + {'flag': 'new_aml', 'amount_currency': 37436.50, 'currency_id': self.other_currency.id, 'balance': 38049.09}, + ]) + + def test_matching_zero_amount_misc_entry(self): + """ Check for division by zero with foreign currencies and some 0 making a broken rate. """ + self.company_data['default_journal_bank'].currency_id = self.other_currency + st_line = self._create_st_line(0.0, amount_currency=10.0, foreign_currency_id=self.company_data['currency'].id) + + entry = self.env['account.move'].create({ + 'date': '2019-01-01', + 'line_ids': [ + Command.create({ + 'account_id': self.company_data['default_account_receivable'].id, + 'currency_id': self.other_currency.id, + 'debit': 1.0, + 'credit': 0.0, + }), + Command.create({ + 'account_id': self.company_data['default_account_revenue'].id, + 'currency_id': self.other_currency.id, + 'debit': 0.0, + 'credit': 1.0, + }), + ] + }) + entry.action_post() + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + aml = entry.line_ids.filtered('debit') + wizard._action_add_new_amls(aml) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'balance': 10.0}, + {'flag': 'new_aml', 'balance': -1.0}, + {'flag': 'exchange_diff', 'balance': 1.0}, + {'flag': 'auto_balance', 'balance': -10.0}, + ]) + + def test_amls_order_with_matching_amount(self): + """ AML's with a matching amount_residual should be displayed first when the order is not specified. """ + + foreign_st_line = self._create_st_line( + 500.0, + date='2016-01-01', + foreign_currency_id=self.other_currency.id, + amount_currency=1500.0, + ) + st_line = self._create_st_line( + 66.66, + date='2016-01-01', + ) + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=foreign_st_line.id).new({}) + + aml1_id = self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-30', + invoice_line_ids=[{'price_unit': 1000.0}], + ).id + aml2_id = self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-29', + currency_id=self.other_currency.id, + invoice_line_ids=[{'price_unit': 1500.0}], # = 100 USD + ).id + aml3_id = self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-28', + invoice_line_ids=[{'price_unit': 500.0}], + ).id + aml4_id = self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-27', + invoice_line_ids=[{'price_unit': 55.55}], # = 55.550000000000004 + ).id + aml5_id = self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-26', + invoice_line_ids=[{'price_unit': 66.66}], + ).id + + # Check the lines without the context key. + wizard._js_action_mount_st_line(foreign_st_line.id) + domain = wizard.return_todo_command['amls']['domain'] + amls_list = self.env['account.move.line'].search_fetch(domain=domain, field_names=['id']) + self.assertEqual( + [x['id'] for x in amls_list], + [aml1_id, aml2_id, aml3_id, aml4_id, aml5_id], + ) + + # Check the lines with the context key. + suspense_line = wizard.line_ids.filtered(lambda l: l.flag == 'auto_balance') + amls_list = self.env['account.move.line']\ + .with_context(preferred_aml_value=suspense_line.amount_currency * -1, preferred_aml_currency_id=suspense_line.currency_id.id)\ + .search_fetch(domain=domain, field_names=['id']) + self.assertEqual( + [x['id'] for x in amls_list], + [aml2_id, aml1_id, aml3_id, aml4_id, aml5_id], + ) + + # Check the order with limits and offsets + amls_list = self.env['account.move.line']\ + .with_context(preferred_aml_value=suspense_line.amount_currency * -1, preferred_aml_currency_id=suspense_line.currency_id.id)\ + .search_fetch(domain=domain, field_names=['id'], limit=2) + self.assertEqual( + [x['id'] for x in amls_list], + [aml2_id, aml1_id], + ) + amls_list = self.env['account.move.line']\ + .with_context(preferred_aml_value=suspense_line.amount_currency * -1, preferred_aml_currency_id=suspense_line.currency_id.id)\ + .search_fetch(domain=domain, field_names=['id'], offset=2, limit=3) + self.assertEqual( + [x['id'] for x in amls_list], + [aml3_id, aml4_id, aml5_id], + ) + + # Check rounding and new suspense line + wizard._js_action_mount_st_line(st_line.id) + suspense_line = wizard.line_ids.filtered(lambda l: l.flag == 'auto_balance') + amls_list = self.env['account.move.line']\ + .with_context(preferred_aml_value=suspense_line.amount_currency * -1, preferred_aml_currency_id=suspense_line.currency_id.id)\ + .search_fetch(domain=domain, field_names=['id']) + self.assertEqual( + [x['id'] for x in amls_list], + [aml5_id, aml1_id, aml2_id, aml3_id, aml4_id], + ) + wizard._js_action_mount_line_in_edit(suspense_line.index) + suspense_line.balance = -11.11 + wizard._line_value_changed_balance(suspense_line) + suspense_line = wizard.line_ids.filtered(lambda l: l.flag == 'auto_balance') + self.assertEqual(suspense_line.balance, -55.55) + self.env.cr.execute(f""" + UPDATE account_move_line SET amount_residual_currency = 55.550000001 WHERE id = {aml4_id}; + """) + amls_list = self.env['account.move.line']\ + .with_context(preferred_aml_value=55.550003, preferred_aml_currency_id=suspense_line.currency_id.id)\ + .search_fetch(domain=domain, field_names=['id']) + self.assertEqual( + [x['id'] for x in amls_list], + [aml4_id, aml1_id, aml2_id, aml3_id, aml5_id], + ) + + # Check that context keys are not propagated + action = amls_list[0].action_open_business_doc() + self.assertFalse(action['context'].get('preferred_aml_value')) + + @freeze_time('2023-12-25') + def test_analtyic_distribution_model_exchange_diff_line(self): + """Test that the analytic distribution model is present on the exchange diff line.""" + expense_exchange_account = self.env.company.expense_currency_exchange_account_id + analytic_plan = self.env['account.analytic.plan'].create({ + 'name': 'Plan 1', + 'default_applicability': 'unavailable', + }) + analytic_account_1 = self.env['account.analytic.account'].create({'name': 'Account 1', 'plan_id': analytic_plan.id}) + analytic_account_2 = self.env['account.analytic.account'].create({'name': 'Account 1', 'plan_id': analytic_plan.id}) + distribution_model = self.env['account.analytic.distribution.model'].create({ + 'account_prefix': expense_exchange_account.code, + 'partner_id': self.partner_a.id, + 'analytic_distribution': {analytic_account_1.id: 100}, + }) + + # 1200.0 comp_curr = 3600.0 foreign_curr in 2016 (rate 1:3) + st_line = self._create_st_line( + 1200.0, + date='2016-01-01', + ) + # 1800.0 comp_curr = 3600.0 foreign_curr in 2017 (rate 1:2) + inv_line = self._create_invoice_line( + 'out_invoice', + currency_id=self.other_currency.id, + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 3600.0}], + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'amount_currency': 1200.0, 'currency_id': self.company_data['currency'].id, 'balance': 1200.0, 'analytic_distribution': False}, + {'flag': 'new_aml', 'amount_currency': -3600.0, 'currency_id': self.other_currency.id, 'balance': -1800.0, 'analytic_distribution': False}, + {'flag': 'exchange_diff', 'amount_currency': 0.0, 'currency_id': self.other_currency.id, 'balance': 600.0, 'analytic_distribution': distribution_model.analytic_distribution}, + ]) + + # Test that the analytic distribution is kept on the creation of the exchange diff move + new_distribution = {**distribution_model.analytic_distribution, str(analytic_account_2.id): 100} + + line = wizard.line_ids.filtered(lambda x: x.flag == 'exchange_diff') + line.analytic_distribution = new_distribution + wizard._action_validate() + + self.assertRecordValues(inv_line.matched_credit_ids.exchange_move_id.line_ids, [ + {'analytic_distribution': False}, + {'analytic_distribution': new_distribution}, + ]) + + def test_access_child_bank_with_user_set_on_child(self): + """ + Demo user with a Child Company as default company/allowed companies + should be able to access the Bank set on this same Child Company + """ + child_company = self.env['res.company'].create({ + 'name': 'Childest Company', + 'parent_id': self.env.company.id, + }) + child_bank_journal = self.env['account.journal'].create({ + 'name': 'Child Bank', + 'type': 'bank', + 'company_id': child_company.id, + }) + self.user.write({ + 'company_ids': [Command.set(child_company.ids)], + 'company_id': child_company.id, + 'groups_id': [ + Command.set(self.env.ref('account.group_account_user').ids), + ] + }) + res = self.env['bank.rec.widget'].with_user(self.user).collect_global_info_data(child_bank_journal.id) + self.assertTrue(res, "Journal should be accessible") + + def test_collect_global_info_data_other_company_bank_journal_with_user_on_main_company(self): + """ The aim of this test is checking that a user who having + access to 2 companies will have values even when he's + calling collect_global_info_data function if + it's current company it's not the one on the journal + but is still available. + To do that, we add 2 companies to the user, and try to + call collect_global_info_data on the journal of the second + company, even if the main company it's the first one. + """ + self.user.write({ + 'company_ids': [Command.set((self.company_data['company'] + self.company_data_2['company']).ids)], + 'company_id': self.company_data['company'].id, + }) + + result = self.env['bank.rec.widget'].with_user(self.user).collect_global_info_data(self.company_data_2['default_journal_bank'].id) + self.assertTrue(result['balance_amount'], "Balance amount shouldn't be False value") + + def test_collect_global_info_data_non_existing_bank_journal(self): + """ The aim of this test is checking that we receive an empty + string when we call collect_global_info_data function + with a non-existing journal. This use case could happen + when we try to open the bank rec widget on a journal that + is not actually existing. As this function is callable by + rpc, this usecase could happen. + """ + result = self.env['bank.rec.widget'].with_user(self.user).collect_global_info_data(99999999) + self.assertEqual(result['balance_amount'], "", "If no value, the function should return an empty string") + + def test_res_partner_bank_find_create_multi_account(self): + """ Make sure that we can save multiple bank accounts for a partner. """ + partner = self.env['res.partner'].create({'name': "Zitycard"}) + + for acc_number in ("123456789", "123456780"): + st_line = self._create_st_line(100.0, account_number=acc_number) + inv_line = self._create_invoice_line( + 'out_invoice', + partner_id=partner.id, + invoice_line_ids=[{'price_unit': 100.0, 'tax_ids': []}], + ) + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + wizard._action_validate() + + bank_accounts = self.env['res.partner.bank'].sudo().with_context(active_test=False).search([ + ('partner_id', '=', partner.id), + ]) + self.assertEqual(len(bank_accounts), 2, "Second bank account was not registered!") + + #################################################### + # RECO MODEL MOVE CREATION + #################################################### + + def create_test_reco_invoice(self, st_line, reco_model): + """ Helper method to create a move given a statement line and reconciliation model """ + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_select_reconcile_model(reco_model) + move = self.env['account.move'].browse(wizard.return_todo_command['res_id']) + return move + + def assert_reco_invoice_values(self, move, st_line, expected_move_type, expected_amount_total=None): + """ Helper method to assert that values in a move match the information in the given statement line """ + if expected_amount_total is None: + expected_amount_total = abs(st_line.amount) + self.assertRecordValues(move, [{ + 'amount_total': expected_amount_total, + 'move_type': expected_move_type, + 'partner_id': st_line.partner_id.id, + 'invoice_date': st_line.date, + }]) + + def test_invoice_creation_from_reco_model(self): + """ Test the created invoice from a sale/purchase reconciliation model. """ + reco_model_invoice = self.env['account.reconcile.model'].create({ + 'name': "test reconcile create invoice", + 'rule_type': 'writeoff_button', + 'counterpart_type': 'sale', + 'line_ids': [ + Command.create({'amount_string': '50'}), + Command.create({'amount_string': '50'}), + ], + }) + + for st_line_amount, move_type, reco_model in ( + (1000.0, 'out_invoice', reco_model_invoice), + (-1000.0, 'out_refund', reco_model_invoice), + (1000.0, 'in_refund', self.reco_model_bill), + (-1000.0, 'in_invoice', self.reco_model_bill), + ): + st_line = self._create_st_line(st_line_amount, partner_id=self.partner_a.id) + with self.subTest(): + move = self.create_test_reco_invoice(st_line, reco_model) + self.assert_reco_invoice_values(move, st_line, move_type) + + def test_invoice_reco_model_round_odd(self): + """ Test if correct move is created when rounding is needed for multiple reco model lines""" + # Odd amount and a reconciliation model with two lines (50% each line) requires rounding to ensure values match. + st_line = self._create_st_line(amount=-111.11, partner_id=self.partner_a.id) + move = self.create_test_reco_invoice(st_line, self.reco_model_bill) + self.assert_reco_invoice_values(move, st_line, 'in_invoice') + + def test_invoice_reco_model_round_single_line(self): + """ Test if correct move is created with single-line reco model when rounding is needed """ + # A st_line of $150 with 15% tax (default) requires rounding, as without it the invoice would total $149.99 + reco_model_single_line = self.env['account.reconcile.model'].create({ + 'name': "single line reco model", + 'rule_type': 'writeoff_button', + 'counterpart_type': 'purchase', + 'line_ids': [Command.create({})], + }) + st_line = self._create_st_line(amount=150, partner_id=self.partner_a.id) + move = self.create_test_reco_invoice(st_line, reco_model_single_line) + self.assert_reco_invoice_values(move, st_line, 'in_refund') + + def test_invoice_reco_model_round_large_percentage(self): + """ Test if total move amount is correctly rounded when reco model lines go above 100% of st_line amount """ + # Reco model with two 100% st_line amount lines + reco_model_two_lines = self.env['account.reconcile.model'].create({ + 'name': "two lines reco model", + 'rule_type': 'writeoff_button', + 'counterpart_type': 'purchase', + 'line_ids': [Command.create({}), Command.create({})], + }) + # Reco model with one 200% st_line amount line + reco_model_single_line = self.env['account.reconcile.model'].create({ + 'name': "single line reco model", + 'rule_type': 'writeoff_button', + 'counterpart_type': 'purchase', + 'line_ids': [Command.create({'amount_string': '200'})], + }) + st_line = self._create_st_line(-150, partner_id=self.partner_a.id) + for reco_model in (reco_model_two_lines, reco_model_single_line): + with self.subTest(): + move = self.create_test_reco_invoice(st_line, reco_model) + # Total move amount should equal 2 * st_line amount = 300 in both cases + self.assert_reco_invoice_values(move, st_line, 'in_invoice', 300.0) + + def test_invoice_reco_model_round_combined(self): + """ Test if total move amount is correctly rounded when reco model lines are a combination of + percentage_st_line and fixed amount types """ + # Reco model with 100% amount + fixed amount, total move amount should equal st_line amount + fixed amount + reco_model_percentage_fixed = self.env['account.reconcile.model'].create({ + 'name': "combined percentage + fixed reco model", + 'rule_type': 'writeoff_button', + 'counterpart_type': 'sale', + 'line_ids': [ + Command.create({}), + Command.create({ + 'amount_type': 'fixed', + 'amount_string': '50', + }), + ], + }) + st_line = self._create_st_line(amount=100, partner_id=self.partner_a.id) + move = self.create_test_reco_invoice(st_line, reco_model_percentage_fixed) + self.assert_reco_invoice_values(move, st_line, 'out_invoice', 150.0) + + def test_invoice_reco_model_multiple_taxes(self): + """ + Test if correct move is created through reco model writeoff button when the + reconciliation model has more than one tax per line. + Note: this only works if taxes are all price_include or all not price_include + """ + tax_21 = self.env['account.tax'].create({ + 'name': "tax_21", + 'amount': 21, + }) + reco_model_bill_mult_taxes = self.env['account.reconcile.model'].create({ + 'name': "test reconcile bill multiple taxes", + 'rule_type': 'writeoff_button', + 'counterpart_type': 'purchase', + 'line_ids': [ + Command.create({ + 'tax_ids': [Command.set((tax_21 + self.company_data['default_tax_purchase']).ids)], + }), + ], + }) + st_line = self._create_st_line(amount=-100, partner_id=self.partner_a.id) + move = self.create_test_reco_invoice(st_line, reco_model_bill_mult_taxes) + self.assert_reco_invoice_values(move, st_line, 'in_invoice') + + def test_invoice_creation_reco_model_percentage(self): + """ Test if correct move is created when rounding is needed """ + # Odd amount and a reconciliation model with two lines (50% each line) requires rounding to ensure values match. + st_line = self._create_st_line(amount=150, partner_id=self.partner_a.id) + reco_model_bill_balance = self.env['account.reconcile.model'].create({ + 'name': "test balance", + 'rule_type': 'writeoff_button', + 'counterpart_type': 'purchase', + 'line_ids': [ + Command.create({ + 'amount_type': 'percentage', + 'amount_string': '50', + }), + Command.create({ + 'amount_type': 'percentage', + 'amount_string': '50', + }), + ], + }) + move = self.create_test_reco_invoice(st_line, reco_model_bill_balance) + self.assert_reco_invoice_values(move, st_line, 'in_refund', 112.5) + + def test_invoice_creation_reco_model_fixed(self): + """ Test if correct move is created when rounding is needed """ + # Odd amount and a reconciliation model with two lines (50% each line) requires rounding to ensure values match. + st_line = self._create_st_line(amount=-150, partner_id=self.partner_a.id) + reco_model_invoice_fixed = self.env['account.reconcile.model'].create({ + 'name': "test fixed", + 'rule_type': 'writeoff_button', + 'counterpart_type': 'sale', + 'line_ids': [ + Command.create({ + 'amount_type': 'fixed', + 'amount_string': '100', + }), + ], + }) + move = self.create_test_reco_invoice(st_line, reco_model_invoice_fixed) + self.assert_reco_invoice_values(move, st_line, 'out_refund', 100.0) + + def test_invoice_creation_reco_model_regex(self): + """ Test if correct move is created when rounding is needed """ + # Odd amount and a reconciliation model with two lines (50% each line) requires rounding to ensure values match. + st_line = self._create_st_line(amount=150, partner_id=self.partner_a.id, payment_ref="150 invoice", statement_name='150 invoice') + reco_model_invoice_regex = self.env['account.reconcile.model'].create({ + 'name': "test label/regex", + 'rule_type': 'writeoff_button', + 'counterpart_type': 'sale', + 'line_ids': [ + Command.create({ + 'amount_type': 'regex', + 'amount_string': r'([\d,.]+)', + }), + ], + }) + move = self.create_test_reco_invoice(st_line, reco_model_invoice_regex) + self.assert_reco_invoice_values(move, st_line, 'out_invoice', 150.0) + + def test_unreconciled_with_other_lines(self): + """Test that other lines are shown in the widget if they exist.""" + st_line = self._create_st_line( + 1000.0, + date='2017-01-01', + ) + + # Edit the associated move to partially reconcile some of the suspense amount; i.e. we add another line + liquidity_line, suspense_line, other_line = st_line._seek_for_lines() + other_account = st_line.journal_id.company_id.default_cash_difference_income_account_id + self.assertFalse(other_line) + move = st_line.move_id + move.button_draft() + move.write({'line_ids': [ + Command.create({'account_id': other_account.id, 'credit': 100.0}), + Command.update(suspense_line.id, {'credit': 900.0}), + ]}) + move.action_post() + liquidity_line, suspense_line, other_line = st_line._seek_for_lines() + self.assertTrue(other_line) + + # Check that the wizard displays the new line + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + self.assertRecordValues(wizard.line_ids, [ + # pylint: disable=C0326 + {'flag': 'liquidity', 'account_id': liquidity_line.account_id.id, 'amount_currency': 1000.0}, + {'flag': 'aml', 'account_id': other_line.account_id.id, 'amount_currency': -100.0}, + {'flag': 'auto_balance', 'account_id': suspense_line.account_id.id, 'amount_currency': -900.0}, + ]) + + def test_caba_reconcile_account_multi_currency(self): + self.env.company.tax_exigibility = True + cash_basis_transfer_account = self.env['account.account'].create({ + 'code': 'cash.basis.transfer.account', + 'name': 'cash_basis_transfer_account', + 'account_type': 'income', + 'reconcile': True, + }) + tax_account = self.env['account.account'].create({ + 'code': 'cash.basis.tax.account', + 'name': 'cash_basis_tax_account', + 'account_type': 'income', + }) + caba_tax = self.env['account.tax'].create({ + 'name': 'tax_caba', + 'amount': 15.0, + 'cash_basis_transition_account_id': cash_basis_transfer_account.id, + 'tax_exigibility': 'on_payment', + 'invoice_repartition_line_ids': [ + Command.create({'repartition_type': 'base'}), + Command.create({ + 'repartition_type': 'tax', + 'account_id': tax_account.id, + }), + ], + 'refund_repartition_line_ids': [ + Command.create({'repartition_type': 'base'}), + Command.create({ + 'repartition_type': 'tax', + 'account_id': tax_account.id, + }), + ], + }) + + currency = self.other_currency + inv_line = self._create_invoice_line( + 'out_invoice', + currency_id=currency.id, + invoice_date='2016-01-01', + invoice_line_ids=[{'price_unit': 1200.0, 'tax_ids': [Command.set(caba_tax.ids)]}], + ) + inv = inv_line.move_id + st_line = self._create_st_line( + 690.0, + date='2017-01-01', + foreign_currency_id=currency.id, + amount_currency=1380.0, + ) + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + + self.assertRecordValues(wizard.line_ids, [ + {'flag': 'liquidity', 'balance': 690.0, 'amount_currency': 690.0, 'currency_id': self.env.company.currency_id.id}, + {'flag': 'new_aml', 'balance': -460.0, 'amount_currency': -1380.0, 'currency_id': currency.id}, + {'flag': 'exchange_diff', 'balance': -230.0, 'amount_currency': 0.0, 'currency_id': currency.id}, + ]) + + line = wizard.line_ids.filtered(lambda x: x.flag == 'exchange_diff') + wizard._js_action_mount_line_in_edit(line.index) + line.balance = -240.0 + wizard._line_value_changed_balance(line) + + self.assertRecordValues(wizard.line_ids, [ + {'flag': 'liquidity', 'balance': 690.0, 'amount_currency': 690.0, 'currency_id': self.env.company.currency_id.id}, + {'flag': 'new_aml', 'balance': -460.0, 'amount_currency': -1380.0, 'currency_id': currency.id}, + {'flag': 'exchange_diff', 'balance': -240.0, 'amount_currency': 0.0, 'currency_id': currency.id}, + {'flag': 'auto_balance', 'balance': 10.0, 'amount_currency': 0.0, 'currency_id': currency.id}, + ]) + + wizard._action_validate() + + self.assertRecordValues(st_line.line_ids, [ + {'balance': 690.0, 'amount_currency': 690.0, 'currency_id': self.env.company.currency_id.id}, + {'balance': -700.0, 'amount_currency': -1380.0, 'currency_id': currency.id}, + {'balance': 10.0, 'amount_currency': 0.0, 'currency_id': currency.id}, + ]) + + caba_move = inv.tax_cash_basis_created_move_ids + product_account = self.company_data['default_account_revenue'] + self.assertRecordValues(caba_move.line_ids, [ + {'balance': 608.7, 'amount_currency': 1200.0, 'currency_id': currency.id, 'account_id': product_account.id}, + {'balance': -608.7, 'amount_currency': -1200.0, 'currency_id': currency.id, 'account_id': product_account.id}, + {'balance': 91.3, 'amount_currency': 180.0, 'currency_id': currency.id, 'account_id': cash_basis_transfer_account.id}, + {'balance': -91.3, 'amount_currency': -180.0, 'currency_id': currency.id, 'account_id': tax_account.id}, + ]) + + tax_line = inv.line_ids.filtered('tax_repartition_line_id') + _liquidity_line, _suspense_line, other_line = st_line._seek_for_lines() + self.assertRecordValues(caba_move.line_ids + inv_line + tax_line + other_line, [ + {'amount_residual': 0.0, 'amount_residual_currency': 0.0}, + ] * 7) + + exchange_diff_moves = self.env['account.move'].search([('journal_id', '=', self.env.company.currency_exchange_journal_id.id)]) + self.assertRecordValues(exchange_diff_moves.line_ids, [ + # Exchange diff CABA entry with invoice for the tax line ((180 / 2) - (180 / 3) = 90 - 60 = 30): + {'balance': -31.3, 'amount_currency': 0.0, 'currency_id': currency.id}, + {'balance': 31.3, 'amount_currency': 0.0, 'currency_id': currency.id}, + # Exchange diff st_line with invoice ((1380 / 2) - (1380 / 3) = 690 - 430 = 230): + {'balance': 240.0, 'amount_currency': 0.0, 'currency_id': currency.id}, + {'balance': -240.0, 'amount_currency': 0.0, 'currency_id': currency.id}, + ]) + + def test_reconciliation_with_branch(self): + """ + Test the reconciliation flow with different configurations of company with a branch + """ + company = self.company_data['company'] + branch = self.env['res.company'].create({ + 'name': "Branch A", + 'parent_id': company.id, + }) + # Load CoA + self.cr.precommit.run() + + partner_branch = self.env['res.partner'].create({ + 'name': 'Partner Branch', + 'company_id': branch.id, + }) + + aml_branch = self._create_invoice_line( + 'out_invoice', + company_id=branch.id, + partner_id=partner_branch.id, + invoice_date='2019-01-01', + invoice_line_ids=[{'name': 'Test reco', 'quantity': 1, 'price_unit': 1000}], + ) + st_line_main = self._create_st_line( + 1000.0, + company_id=company.id, + date='2019-01-01', + payment_ref='Test reco', + ) + st_line_branch = self._create_st_line( + 1000.0, + company_id=branch.id, + date='2019-01-01', + payment_ref='Test reco2', + partner_id=partner_branch.id, + ) + + # Case 1: reconciliation with st_line on the main company + aml on the branch + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line_main.id).new({}) + wizard._action_add_new_amls(aml_branch) + wizard._action_validate() + + # Assert that the partner is not set to avoid "Incompatible companies on records" error + self.assertFalse(st_line_main.partner_id) + + st_line_main.action_undo_reconciliation() + + # Case 2: reconciliation with both st_line and aml on the branch + wizard_branch = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line_branch.id).new({}) + wizard_branch._action_add_new_amls(aml_branch) + wizard_branch._action_validate() + + # Assert that the partner remains set on the transaction + self.assertEqual(st_line_branch.partner_id, partner_branch, "The partner should remain set on the transaction for the branch company.") + + st_line_branch.action_undo_reconciliation() + + # Case 3: reconciliation with both st_line and aml on the branch, no partner on the st_line + st_line_branch.partner_id = False + wizard_branch = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line_branch.id).new({}) + wizard_branch._action_add_new_amls(aml_branch) + wizard_branch._action_validate() + + # Assert that the partner is set from the aml on the transaction + self.assertEqual(st_line_branch.partner_id, partner_branch, "The partner should be automatically set on the transaction for the branch company if it's set on the aml.") + + def test_analytic_distribution_for_early_payment_statement(self): + """ + Test that the analytic is applied for statement with early discount + """ + early_payment_term = self.env['account.payment.term'].create({ + 'name': "early_payment_term", + 'company_id': self.company_data['company'].id, + 'early_pay_discount_computation': 'included', + 'early_discount': True, + 'discount_percentage': 2, + 'discount_days': 7, + 'line_ids': [ + Command.create({ + 'value': 'percent', + 'value_amount': 100.0, + 'nb_days': 30, + }), + ], + }) + + analytic_plan = self.env['account.analytic.plan'].create({ + 'name': 'existential plan', + }) + analytic_account = self.env['account.analytic.account'].create({ + 'name': 'positive_account', + 'plan_id': analytic_plan.id, + }) + + cash_discount_account = self.company_data['company'].account_journal_early_pay_discount_loss_account_id + self.env['account.analytic.distribution.model'].create({ + 'account_prefix': cash_discount_account.code, + 'analytic_distribution': {analytic_account.id: 100.0}, + }) + + invoice = self.env['account.move'].create([{ + 'move_type': 'out_invoice', + 'partner_id': self.partner_a.id, + 'date': '2017-01-01', + 'invoice_date': '2017-01-01', + 'invoice_payment_term_id': early_payment_term.id, + 'invoice_line_ids': [Command.create({ + 'name': 'line', + 'price_unit': 100.0, + })] + }]) + invoice.action_post() + + statement = self.env['account.bank.statement.line'].create({ + 'date': '2017-01-01', + 'payment_ref': invoice.payment_reference, + 'partner_id': self.partner_b.id, + 'amount': 98.0, + 'journal_id': self.company_data['default_journal_bank'].id, + }) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=statement.id).new({}) + receivable_line = invoice.line_ids.filtered(lambda l: l.account_id.account_type == 'asset_receivable') + wizard._action_add_new_amls(receivable_line) + wizard._action_validate() + + early_payment_line = statement.line_ids.filtered(lambda p: p.balance == 2.0) + self.assertTrue(early_payment_line.analytic_distribution) + + def test_reconcile_no_caba_move_on_bank_journal_entry(self): + """ Test that no cash basis move is created for a bank reconciliation journal entry. """ + self.env.company.tax_exigibility = True + cash_basis_transfer_account = self.env['account.account'].create({ + 'code': 'cash.basis.transfer.account', + 'name': 'cash_basis_transfer_account', + 'account_type': 'income', + 'reconcile': True, + }) + tax_account = self.env['account.account'].create({ + 'code': 'cash.basis.tax.account', + 'name': 'cash_basis_tax_account', + 'account_type': 'income', + }) + caba_tax = self.env['account.tax'].create({ + 'name': 'tax_caba', + 'amount': 15.0, + 'cash_basis_transition_account_id': cash_basis_transfer_account.id, + 'tax_exigibility': 'on_payment', + 'invoice_repartition_line_ids': [ + Command.create({'repartition_type': 'base'}), + Command.create({ + 'repartition_type': 'tax', + 'account_id': tax_account.id, + }), + ], + 'refund_repartition_line_ids': [ + Command.create({'repartition_type': 'base'}), + Command.create({ + 'repartition_type': 'tax', + 'account_id': tax_account.id, + }), + ], + }) + + inv_line = self._create_invoice_line( + 'out_invoice', + invoice_date='2017-01-01', + invoice_line_ids=[{'price_unit': 200.0, 'tax_ids': caba_tax}], + ) + inv = inv_line.move_id + st_line = self._create_st_line(200.0, date='2017-01-01') + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + wizard._action_add_new_amls(inv_line) + + self.assertRecordValues(wizard.line_ids, [ + {'flag': 'liquidity', 'balance': 200.0}, + {'flag': 'new_aml', 'balance': -200.0}, + ]) + + # Switch to a full reconciliation. + new_line = wizard.line_ids.filtered(lambda x: x.flag == 'new_aml') + wizard._js_action_mount_line_in_edit(new_line.index) + wizard._js_action_apply_line_suggestion(new_line.index) + + self.assertRecordValues(wizard.line_ids, [ + {'flag': 'liquidity', 'balance': 200.0}, + {'flag': 'new_aml', 'balance': -230.0}, + {'flag': 'auto_balance', 'balance': 30.0}, + ]) + + # Add the CABA tax to the auto-balance line + auto_balance_line = wizard.line_ids.filtered(lambda x: x.flag == 'auto_balance') + wizard._js_action_mount_line_in_edit(auto_balance_line.index) + auto_balance_line.account_id = self.company_data['default_account_expense'] + wizard._line_value_changed_account_id(auto_balance_line) + auto_balance_line.tax_ids = [Command.link(caba_tax.id)] + wizard._line_value_changed_tax_ids(auto_balance_line) + + self.assertRecordValues(wizard.line_ids, [ + {'flag': 'liquidity', 'balance': 200.0}, + {'flag': 'new_aml', 'balance': -230.0}, + {'flag': 'manual', 'balance': 26.09}, + {'flag': 'tax_line', 'balance': 3.91}, + ]) + + wizard._action_validate() + # Cash basis move should be created for the invoice + caba_move = inv.tax_cash_basis_created_move_ids + product_account = self.company_data['default_account_revenue'] + + self.assertRecordValues(caba_move.line_ids, [ + {'balance': 200.0, 'account_id': product_account.id}, + {'balance': -200.0, 'account_id': product_account.id}, + {'balance': 30.0, 'account_id': cash_basis_transfer_account.id}, + {'balance': -30.0, 'account_id': tax_account.id}, + ]) + + # No cash basis move should be created for the bank journal entry + self.assertFalse(st_line.move_id.tax_cash_basis_created_move_ids) diff --git a/dev_odex30_accounting/odex30_account_accountant/tests/test_bank_rec_widget_common.py b/dev_odex30_accounting/odex30_account_accountant/tests/test_bank_rec_widget_common.py new file mode 100644 index 0000000..b961a5c --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/tests/test_bank_rec_widget_common.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +from odoo import Command +from odoo.addons.account.tests.common import AccountTestInvoicingCommon + + +class TestBankRecWidgetCommon(AccountTestInvoicingCommon): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.other_currency = cls.setup_other_currency('EUR') + cls.other_currency_2 = cls.setup_other_currency('CAD', rounding=0.001, rates=[('2016-01-01', 6.0), ('2017-01-01', 4.0)]) + cls.other_currency_3 = cls.setup_other_currency('XAF', rounding=0.001, rates=[('2016-01-01', 12.0), ('2017-01-01', 8.0)]) + + @classmethod + def _create_invoice_line(cls, move_type, **kwargs): + ''' Create an invoice on the fly.''' + kwargs.setdefault('partner_id', cls.partner_a.id) + kwargs.setdefault('invoice_date', '2017-01-01') + kwargs.setdefault('invoice_line_ids', []) + for one2many_values in kwargs['invoice_line_ids']: + one2many_values.setdefault('name', 'xxxx') + one2many_values.setdefault('quantity', 1) + one2many_values.setdefault('tax_ids', []) + + invoice = cls.env['account.move'].create({ + 'move_type': move_type, + **kwargs, + 'invoice_line_ids': [Command.create(x) for x in kwargs['invoice_line_ids']], + }) + invoice.action_post() + return invoice.line_ids\ + .filtered(lambda l: l.account_id.account_type in ('asset_receivable', 'liability_payable')) + + @classmethod + def _create_st_line(cls, amount, date='2019-01-01', payment_ref='turlututu', **kwargs): + st_line = cls.env['account.bank.statement.line'].create({ + 'amount': amount, + 'date': date, + 'payment_ref': payment_ref, + 'journal_id': kwargs.get('journal_id', cls.company_data['default_journal_bank'].id), + **kwargs, + }) + # The automatic reconcile cron checks the create_date when considering st_lines to run on. + # create_date is a protected field so this is the only way to set it correctly + cls.env.cr.execute("UPDATE account_bank_statement_line SET create_date = %s WHERE id=%s", + (st_line.date, st_line.id)) + return st_line + + @classmethod + def _create_reconcile_model(cls, **kwargs): + return cls.env['account.reconcile.model'].create({ + 'name': "test", + 'rule_type': 'invoice_matching', + 'allow_payment_tolerance': True, + 'payment_tolerance_type': 'percentage', + 'payment_tolerance_param': 0.0, + **kwargs, + 'line_ids': [ + Command.create({ + 'account_id': cls.company_data['default_account_revenue'].id, + 'amount_type': 'percentage', + 'label': f"test {i}", + **line_vals, + }) + for i, line_vals in enumerate(kwargs.get('line_ids', [])) + ], + }) diff --git a/dev_odex30_accounting/odex30_account_accountant/tests/test_bank_rec_widget_tour.py b/dev_odex30_accounting/odex30_account_accountant/tests/test_bank_rec_widget_tour.py new file mode 100644 index 0000000..e8e6217 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/tests/test_bank_rec_widget_tour.py @@ -0,0 +1,221 @@ +# -*- coding: utf-8 -*- +from odoo.addons.odex30_account_accountant.tests.test_bank_rec_widget_common import TestBankRecWidgetCommon +from odoo.tests import tagged, HttpCase +from odoo import Command + + +@tagged('post_install', '-at_install') +class TestBankRecWidget(TestBankRecWidgetCommon, HttpCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.st_line1 = cls._create_st_line(1000.0, payment_ref="line1", sequence=1) + cls.st_line2 = cls._create_st_line(1000.0, payment_ref="line2", sequence=2) + cls._create_st_line(1000.0, payment_ref="line3", sequence=3) + cls._create_st_line(1000.0, payment_ref="line_credit", sequence=4, journal_id=cls.company_data['default_journal_credit'].id) + + # INV/2019/00001: + cls._create_invoice_line( + 'out_invoice', + partner_id=cls.partner_a.id, + invoice_date='2019-01-01', + invoice_line_ids=[{'price_unit': 1000.0}], + ) + + # INV/2019/00002: + cls._create_invoice_line( + 'out_invoice', + partner_id=cls.partner_a.id, + invoice_date='2019-01-01', + invoice_line_ids=[{'price_unit': 1000.0}], + ) + + cls.env['account.reconcile.model']\ + .search([('company_id', '=', cls.company_data['company'].id)])\ + .write({'past_months_limit': None}) + + cls.reco_model_invoice = cls.env['account.reconcile.model'].create({ + 'name': "test reconcile create invoice", + 'rule_type': 'writeoff_button', + 'counterpart_type': 'sale', + 'line_ids': [ + Command.create({'amount_string': '50'}), + Command.create({'amount_string': '50'}), + ], + }) + + def test_tour_bank_rec_widget(self): + self.start_tour('/odoo', 'account_accountant_bank_rec_widget', login=self.env.user.login) + + self.assertRecordValues(self.st_line1.line_ids, [ + # pylint: disable=C0326 + {'account_id': self.st_line1.journal_id.default_account_id.id, 'balance': 1000.0, 'reconciled': False}, + {'account_id': self.company_data['default_account_receivable'].id, 'balance': -1000.0, 'reconciled': True}, + ]) + + tax_account = self.company_data['default_tax_sale'].invoice_repartition_line_ids.account_id + self.assertRecordValues(self.st_line2.line_ids, [ + # pylint: disable=C0326 + {'account_id': self.st_line2.journal_id.default_account_id.id, 'balance': 1000.0, 'tax_ids': []}, + {'account_id': self.company_data['default_account_payable'].id, 'balance': -869.57, 'tax_ids': self.company_data['default_tax_sale'].ids}, + {'account_id': tax_account.id, 'balance': -130.43, 'tax_ids': []}, + ]) + + def test_tour_bank_rec_widget_ui(self): + bank2 = self.env['account.journal'].create({ + 'name': 'Bank2', + 'type': 'bank', + 'code': 'BNK2', + }) + self._create_st_line(222.22, payment_ref="line4", sequence=4, journal_id=bank2.id) + # INV/2019/00003: + self._create_invoice_line( + 'out_invoice', + partner_id=self.partner_a.id, + invoice_date='2019-01-01', + invoice_line_ids=[{'price_unit': 2000.0}], + ) + self.st_line2.payment_ref = self.st_line2.payment_ref + ' - ' + 'INV/2019/00001' + self.start_tour('/odoo?debug=assets', 'account_accountant_bank_rec_widget_ui', timeout=120, login=self.env.user.login) + + def test_tour_bank_rec_widget_rainbowman_reset(self): + self.start_tour('/odoo?debug=assets', 'account_accountant_bank_rec_widget_rainbowman_reset', login=self.env.user.login) + + def test_tour_bank_rec_journal_items_export(self): + self.start_tour('/web?debug=assets', 'account_accountant_journal_items_export', login=self.env.user.login) + + def test_tour_bank_rec_widget_statements(self): + self.start_tour('/odoo?debug=assets', 'account_accountant_bank_rec_widget_statements', login=self.env.user.login) + + def test_tour_invoice_creation_from_reco_model(self): + """ Test if move is created and added as a new_aml line in bank reconciliation widget """ + st_line = self._create_st_line(amount=1000, partner_id=self.partner_a.id) + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + # The tour creates a move through reco model button, posts it, returns to widget and validates the move + self.start_tour( + '/odoo', + 'account_accountant_bank_rec_widget_reconciliation_button', + login=self.env.user.login, + ) + # Mount the validated statement line to confirm that information matches. + wizard._js_action_mount_st_line(st_line.id) + self.assertRecordValues(wizard.line_ids, [ + {'flag': 'liquidity', 'account_id': st_line.journal_id.default_account_id.id, 'balance': 1000}, + {'flag': 'aml', 'account_id': self.company_data['default_account_receivable'].id, 'balance': -1000}, + ]) + # Check that the aml comes from a move, and not from the auto-balance line + self.assertTrue(wizard.line_ids[1].source_aml_move_id) + + def test_tour_invoice_creation_reco_model_currency(self): + """ Test move creation through reconcile button when a foreign currency is used for the statement line """ + st_line = self._create_st_line( + 1800.0, + date='2019-02-01', + foreign_currency_id=self.other_currency.id, # rate 2:1 + amount_currency=3600.0, + partner_id=self.partner_a.id, + ) + + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + + self.start_tour( + '/odoo', + 'account_accountant_bank_rec_widget_reconciliation_button', + login=self.env.user.login, + ) + # Mount the validated statement line to confirm that information matches. + wizard._js_action_mount_st_line(st_line.id) + + # Move is created in the foreign currency, but in bank widget the balance appears in main currency. + # If aml was created from the reco model button, display name matches payment_ref. + self.assertRecordValues(wizard.line_ids, [ + {'flag': 'liquidity', 'balance': 1800, 'amount_currency': 1800}, + {'flag': 'aml', 'balance': -1800, 'amount_currency': -3600}, + ]) + # Confirm that the aml comes from a move, and not from the auto-balance line + self.assertTrue(wizard.line_ids[1].source_aml_move_id) + + def test_tour_invoice_creation_combined_reco_model(self): + """ Test creation of a move from a reconciliation model with different amount types """ + self.reco_model_invoice.name = "old test" # rename previous reco model to be able to reuse the existing tour + self.env['account.reconcile.model'].create({ + 'name': "test reconcile combined", + 'rule_type': 'writeoff_button', + 'counterpart_type': 'purchase', + 'line_ids': [ + Command.create({ + 'amount_type': 'percentage_st_line', + 'amount_string': '50', + }), + Command.create({ + 'amount_type': 'percentage', + 'amount_string': '50', + 'tax_ids': self.tax_purchase_b.ids, + }), + Command.create({ + 'amount_type': 'fixed', + 'amount_string': '100', + 'account_id': self.env.company.expense_currency_exchange_account_id.id, + 'tax_ids': [Command.clear()] # remove default tax added + }), + # Regex line will not be added to move, as the label of st line does not include digits + Command.create({ + 'amount_type': 'regex', + 'amount_string': r'BRT: ([\d,.]+)', + }), + ], + }) + + st_line = self._create_st_line(amount=-1000, partner_id=self.partner_a.id, payment_ref="combined test") + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=st_line.id).new({}) + # The tour creates a move through reco model button, posts it, returns to widget and validates the move + self.start_tour( + '/odoo', + 'account_accountant_bank_rec_widget_reconciliation_button', + login=self.env.user.login, + ) + # Mount the validated statement line to confirm that widget line matches created move and balance line is added. + wizard._js_action_mount_st_line(st_line.id) + self.assertRecordValues(wizard.line_ids, [ + {'flag': 'liquidity', 'account_id': st_line.journal_id.default_account_id.id, 'balance': -1000}, + {'flag': 'aml', 'account_id': self.company_data['default_account_payable'].id, 'balance': 850}, + {'flag': 'aml', 'account_id': self.company_data['default_account_payable'].id, 'balance': 150}, + ]) + # Check that the aml comes from an existing move + move = wizard.line_ids[1].source_aml_move_id + self.assertTrue(move) + + # The total price of these lines should match the percentage or fixed amount of reco model lines + self.assertRecordValues(move.line_ids, [ + # 50% of statement line (of 1000.0) + {'price_total': 500, 'debit': 434.78, 'credit': 0, 'name': 'combined test', 'account_id': self.company_data['default_account_expense'].id}, + # 50% of balance (of residual value = 500.0) + {'price_total': 250, 'debit': 217.39, 'credit': 0, 'name': 'combined test', 'account_id': self.company_data['default_account_expense'].id}, + # fixed amount of 100.0, no tax in reco model line + {'price_total': 100, 'debit': 100, 'credit': 0, 'name': 'combined test', 'account_id': self.env.company.expense_currency_exchange_account_id.id}, + # Tax for line 1 (65.22 + 434.78 = 500) + {'price_total': 0, 'debit': 65.22, 'credit': 0, 'name': '15%', 'account_id': self.company_data['default_account_tax_purchase'].id}, + # Tax for line 1 (32.61 + 217.39 = 250) + {'price_total': 0, 'debit': 32.61, 'credit': 0, 'name': '15% (Copy)', 'account_id': self.company_data['default_account_tax_purchase'].id}, + {'price_total': 0, 'debit': 0, 'credit': 850, 'name': 'combined test', 'account_id': self.company_data['default_account_payable'].id}, + ]) + + def test_analytic_distribution_saved(self): + """ + Test that the analytic distribution is saved when it is changed on the account.move.line in the banc rec + """ + analytic_plan = self.env['account.analytic.plan'].create({ + 'name': 'Default', + 'sequence': 1, # Used to simplify analytic distribution selector during the tour + }) + analytic_account = self.env['account.analytic.account'].create({ + 'name': 'analytic_account', + 'plan_id': analytic_plan.id, + 'company_id': False, + }) + self.env.user.write({'groups_id': [Command.link(self.env.ref('analytic.group_analytic_accounting').id)]}) + self.start_tour('/web', 'account_accountant_bank_rec_widget_save_analytic_distribution', login=self.env.user.login) + line1 = self.env['account.move.line'].search([('name', '=', 'line1')], limit=1) + self.assertEqual(line1.analytic_distribution, {str(analytic_account.id): 100}) diff --git a/dev_odex30_accounting/odex30_account_accountant/tests/test_change_lock_date_wizard.py b/dev_odex30_accounting/odex30_account_accountant/tests/test_change_lock_date_wizard.py new file mode 100644 index 0000000..7063330 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/tests/test_change_lock_date_wizard.py @@ -0,0 +1,201 @@ +from datetime import timedelta + +from odoo import fields +from odoo.addons.account.tests.common import AccountTestInvoicingCommon +from odoo.addons.odex30_account_accountant.wizard.account_change_lock_date import SOFT_LOCK_DATE_FIELDS +from odoo.exceptions import UserError +from odoo.tests import tagged +from odoo.tools import frozendict + + +@tagged('post_install', '-at_install') +class TestChangeLockDateWizard(AccountTestInvoicingCommon): + + def test_exception_generation(self): + """ + Test the exception generation from the wizard. + Note that exceptions for 'everyone' and 'forever' are not tested here. + They do not create an exception (no 'account.lock_exception' object), but just change the lock date. + (See `test_everyone_forever_exception`.) + """ + self.env['account.lock_exception'].search([]).sudo().unlink() + + for lock_date_field in SOFT_LOCK_DATE_FIELDS: + with self.subTest(lock_date_field=lock_date_field), self.cr.savepoint() as sp: + # We can set the lock date if there is none. + self.env['account.change.lock.date'].create({lock_date_field: '2010-01-01'}).change_lock_date() + self.assertEqual(self.env.company[lock_date_field], fields.Date.from_string('2010-01-01')) + + # We can increase the lock date if there is one. + self.env['account.change.lock.date'].create({lock_date_field: '2011-01-01'}).change_lock_date() + self.assertEqual(self.env.company[lock_date_field], fields.Date.from_string('2011-01-01')) + + # We cannot remove the lock date; but we can create an exception + wizard = self.env['account.change.lock.date'].create({ + lock_date_field: False, + 'exception_applies_to': 'everyone', + 'exception_duration': '1h', + 'exception_reason': ':TestChangeLockDateWizard.test_exception_generation; remove', + }) + wizard.change_lock_date() + self.assertEqual(self.env['account.lock_exception'].search_count([]), 1) + exception = self.env['account.lock_exception'].search([]) + self.assertEqual(len(exception), 1) + self.assertRecordValues(exception, [{ + lock_date_field: False, + 'company_id': self.env.company.id, + 'user_id': False, + 'create_uid': self.env.user.id, + 'end_datetime': self.env.cr.now() + timedelta(hours=1), + 'reason': ':TestChangeLockDateWizard.test_exception_generation; remove', + }]) + exception.sudo().unlink() + + # Ensure we have not created any exceptions yet + self.assertEqual(self.env['account.lock_exception'].search_count([]), 0) + + # We cannot decrease the lock date; but we can create an exception + self.env['account.change.lock.date'].create({lock_date_field: '2009-01-01'}).change_lock_date() + self.assertEqual(self.env.company[lock_date_field], fields.Date.from_string('2011-01-01')) + exception = self.env['account.lock_exception'].search([]) + self.assertEqual(len(exception), 1) + # Check lock date and default values on exception + self.assertRecordValues(exception, [{ + lock_date_field: fields.Date.from_string('2009-01-01'), + 'company_id': self.env.company.id, + 'user_id': self.env.user.id, + 'create_uid': self.env.user.id, + 'end_datetime': self.env.cr.now() + timedelta(minutes=5), + 'reason': False, + }]) + + sp.close() # Rollback to ensure all subtests start in the same situation + + def test_exception_generation_multiple(self): + """ + Test the exception generation from the wizard. + Here we test the case that we create multiple exceptions at once. + This should create an exception object for every changed lock date. + """ + self.env['account.lock_exception'].search([]).sudo().unlink() + + wizard = self.env['account.change.lock.date'].create({ + 'fiscalyear_lock_date': '2010-01-01', + 'tax_lock_date': '2010-01-01', + 'sale_lock_date': '2010-01-01', + 'purchase_lock_date': '2010-01-01', + }) + wizard.change_lock_date() + + self.assertRecordValues(self.env.company, [{ + 'fiscalyear_lock_date': fields.Date.from_string('2010-01-01'), + 'tax_lock_date': fields.Date.from_string('2010-01-01'), + 'sale_lock_date': fields.Date.from_string('2010-01-01'), + 'purchase_lock_date': fields.Date.from_string('2010-01-01'), + }]) + + wizard = self.env['account.change.lock.date'].create({ + 'fiscalyear_lock_date': '2009-01-01', + 'tax_lock_date': '2009-01-01', + 'sale_lock_date': '2009-01-01', + 'purchase_lock_date': '2009-01-01', + 'exception_applies_to': 'everyone', + 'exception_duration': '1h', + 'exception_reason': ':TestChangeLockDateWizard.test_exception_generation; remove', + }) + wizard.change_lock_date() + + exceptions = self.env['account.lock_exception'].search([]) + self.assertEqual(len(exceptions), 4) + expected_exceptions = { + frozendict({ + 'lock_date_field': 'fiscalyear_lock_date', + 'lock_date': fields.Date.from_string('2009-01-01'), + }), + frozendict({ + 'lock_date_field': 'tax_lock_date', + 'lock_date': fields.Date.from_string('2009-01-01'), + }), + frozendict({ + 'lock_date_field': 'sale_lock_date', + 'lock_date': fields.Date.from_string('2009-01-01'), + }), + frozendict({ + 'lock_date_field': 'purchase_lock_date', + 'lock_date': fields.Date.from_string('2009-01-01'), + }), + } + created_exceptions = { + frozendict({ + 'lock_date_field': exception.lock_date_field, + 'lock_date': exception.lock_date, + }) + for exception in exceptions + } + self.assertSetEqual(created_exceptions, expected_exceptions) + + def test_hard_lock_date(self): + self.env['account.lock_exception'].search([]).sudo().unlink() + + # We can set the hard lock date if there is none. + self.env['account.change.lock.date'].create({'hard_lock_date': '2010-01-01'}).change_lock_date() + self.assertEqual(self.env.company.hard_lock_date, fields.Date.from_string('2010-01-01')) + + # We can increase the hard lock date if there is one. + self.env['account.change.lock.date'].create({'hard_lock_date': '2011-01-01'}).change_lock_date() + self.assertEqual(self.env.company.hard_lock_date, fields.Date.from_string('2011-01-01')) + + # We cannot decrease the hard lock date; not even with an exception. + wizard = self.env['account.change.lock.date'].create({ + 'hard_lock_date': '2009-01-01', + 'exception_applies_to': 'everyone', + 'exception_duration': '1h', + 'exception_reason': ':TestChangeLockDateWizard.test_hard_lock_date', + }) + with self.assertRaises(UserError), self.env.cr.savepoint(): + wizard.change_lock_date() + self.assertEqual(self.env.company.hard_lock_date, fields.Date.from_string('2011-01-01')) + + # We cannot remove the hard lock date; not even with an exception. + wizard = self.env['account.change.lock.date'].create({ + 'hard_lock_date': False, + 'exception_applies_to': 'everyone', + 'exception_duration': '1h', + 'exception_reason': ':TestChangeLockDateWizard.test_hard_lock_date', + }) + with self.assertRaises(UserError), self.env.cr.savepoint(): + wizard.change_lock_date() + self.assertEqual(self.env.company.hard_lock_date, fields.Date.from_string('2011-01-01')) + + self.assertEqual(self.env['account.lock_exception'].search_count([]), 0) + + def test_everyone_forever_exception(self): + self.env['account.lock_exception'].search([]).sudo().unlink() + + for lock_date_field in SOFT_LOCK_DATE_FIELDS: + with self.subTest(lock_date_field=lock_date_field), self.cr.savepoint() as sp: + self.env['account.change.lock.date'].create({lock_date_field: '2010-01-01'}).change_lock_date() + self.assertEqual(self.env.company[lock_date_field], fields.Date.from_string('2010-01-01')) + + # We can decrease the lock date with a 'forever' / 'everyone' exception. + self.env['account.change.lock.date'].create({ + lock_date_field: '2009-01-01', + 'exception_applies_to': 'everyone', + 'exception_duration': 'forever', + 'exception_reason': ':TestChangeLockDateWizard.test_everyone_forever_exception; remove', + }).change_lock_date() + self.assertEqual(self.env.company[lock_date_field], fields.Date.from_string('2009-01-01')) + + # We can remove the lock date with a 'forever' / 'everyone' exception. + self.env['account.change.lock.date'].create({ + lock_date_field: False, + 'exception_applies_to': 'everyone', + 'exception_duration': 'forever', + 'exception_reason': ':TestChangeLockDateWizard.test_everyone_forever_exception; remove', + }).change_lock_date() + self.assertEqual(self.env.company[lock_date_field], False) + + # Ensure we have not created any exceptions + self.assertEqual(self.env['account.lock_exception'].search_count([]), 0) + + sp.close() # Rollback to ensure all subtests start in the same situation diff --git a/dev_odex30_accounting/odex30_account_accountant/tests/test_deferred_management.py b/dev_odex30_accounting/odex30_account_accountant/tests/test_deferred_management.py new file mode 100644 index 0000000..44afaaa --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/tests/test_deferred_management.py @@ -0,0 +1,778 @@ +# -*- coding: utf-8 -*- +# pylint: disable=C0326 +import datetime + +from odoo import Command, fields +from odoo.tests import tagged +from odoo.addons.account.tests.common import AccountTestInvoicingCommon + +from freezegun import freeze_time + + +@tagged('post_install', '-at_install') +class TestDeferredManagement(AccountTestInvoicingCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.expense_accounts = [cls.env['account.account'].create({ + 'name': f'Expense {i}', + 'code': f'EXP{i}', + 'account_type': 'expense', + }) for i in range(3)] + cls.revenue_accounts = [cls.env['account.account'].create({ + 'name': f'Revenue {i}', + 'code': f'REV{i}', + 'account_type': 'income', + }) for i in range(3)] + + cls.company.deferred_expense_journal_id = cls.company_data['default_journal_misc'].id + cls.company.deferred_revenue_journal_id = cls.company_data['default_journal_misc'].id + cls.company.deferred_expense_account_id = cls.company_data['default_account_deferred_expense'].id + cls.company.deferred_revenue_account_id = cls.company_data['default_account_deferred_revenue'].id + + cls.expense_lines = [ + [cls.expense_accounts[0], 1000, '2023-01-01', '2023-04-30'], # 4 full months (=250/month) + [cls.expense_accounts[0], 1050, '2023-01-16', '2023-04-30'], # 3 full months + 15 days (=300/month) + [cls.expense_accounts[1], 1225, '2023-01-01', '2023-04-15'], # 3 full months + 15 days (=350/month) + [cls.expense_accounts[2], 1680, '2023-01-21', '2023-04-14'], # 2 full months + 10 days + 14 days (=600/month) + [cls.expense_accounts[2], 225, '2023-04-01', '2023-04-15'], # 15 days (=450/month) + ] + cls.revenue_lines = [ + [cls.revenue_accounts[0], 1000, '2023-01-01', '2023-04-30'], # 4 full months (=250/month) + [cls.revenue_accounts[0], 1050, '2023-01-16', '2023-04-30'], # 3 full months + 15 days (=300/month) + [cls.revenue_accounts[1], 1225, '2023-01-01', '2023-04-15'], # 3 full months + 15 days (=350/month) + [cls.revenue_accounts[2], 1680, '2023-01-21', '2023-04-14'], # 2 full months + 10 days + 14 days (=600/month) + [cls.revenue_accounts[2], 225, '2023-04-01', '2023-04-15'], # 15 days (=450/month) + ] + + def create_invoice(self, move_type, invoice_lines, date=None, post=True): + journal = self.company_data['default_journal_purchase'] if move_type in self.env['account.move'].get_purchase_types() else self.company_data['default_journal_sale'] + move = self.env['account.move'].create({ + 'move_type': move_type, + 'partner_id': self.partner_a.id, + 'date': date or '2023-01-01', + 'invoice_date': date or '2023-01-01', + 'journal_id': journal.id, + 'invoice_line_ids': [ + Command.create({ + 'product_id': self.product_a.id, + 'quantity': 1, + 'account_id': account.id, + 'price_unit': price_unit, + 'deferred_start_date': start_date, + 'deferred_end_date': end_date, + }) for account, price_unit, start_date, end_date in invoice_lines + ] + }) + if post: + move.action_post() + return move + + def test_deferred_management_get_diff_dates(self): + def assert_get_diff_dates(start, end, expected): + diff = self.env['account.move']._get_deferred_diff_dates(fields.Date.to_date(start), fields.Date.to_date(end)) + self.assertAlmostEqual(diff, expected, 3) + + assert_get_diff_dates('2023-01-01', '2023-01-01', 0) + assert_get_diff_dates('2023-01-01', '2023-01-02', 1/30) + assert_get_diff_dates('2023-01-01', '2023-01-20', 19/30) + assert_get_diff_dates('2023-01-01', '2023-01-31', 29/30) + assert_get_diff_dates('2023-01-01', '2023-01-30', 29/30) + assert_get_diff_dates('2023-01-01', '2023-02-01', 1) + assert_get_diff_dates('2023-01-01', '2023-02-28', 1 + 29/30) + assert_get_diff_dates('2023-02-01', '2023-02-28', 29/30) + assert_get_diff_dates('2023-02-10', '2023-02-28', 20/30) + assert_get_diff_dates('2023-01-01', '2023-02-15', 1 + 14/30) + assert_get_diff_dates('2023-01-01', '2023-03-31', 2 + 29/30) + assert_get_diff_dates('2023-01-01', '2023-04-01', 3) + assert_get_diff_dates('2023-01-01', '2023-04-30', 3 + 29/30) + assert_get_diff_dates('2023-01-10', '2023-04-30', 3 + 20/30) + assert_get_diff_dates('2023-01-10', '2023-04-09', 2 + 29/30) + assert_get_diff_dates('2023-01-10', '2023-04-10', 3) + assert_get_diff_dates('2023-01-10', '2023-04-11', 3 + 1/30) + assert_get_diff_dates('2023-02-20', '2023-04-10', 1 + 20/30) + assert_get_diff_dates('2023-01-31', '2023-04-30', 3) + assert_get_diff_dates('2023-02-28', '2023-04-10', 1 + 10/30) + assert_get_diff_dates('2023-03-01', '2023-04-10', 1 + 9/30) + assert_get_diff_dates('2023-04-10', '2023-03-01', 1 + 9/30) + assert_get_diff_dates('2023-01-01', '2023-12-31', 11 + 29/30) + assert_get_diff_dates('2023-01-01', '2024-01-01', 12) + assert_get_diff_dates('2023-01-01', '2024-07-01', 18) + assert_get_diff_dates('2023-01-01', '2024-07-10', 18 + 9/30) + + def test_get_ends_of_month(self): + def assertEndsOfMonths(start_date, end_date, expected): + self.assertEqual( + self.env['account.move.line']._get_deferred_ends_of_month( + fields.Date.to_date(start_date), + fields.Date.to_date(end_date) + ), + [fields.Date.to_date(date) for date in expected] + ) + + assertEndsOfMonths('2023-01-01', '2023-01-01', ['2023-01-31']) + assertEndsOfMonths('2023-01-01', '2023-01-02', ['2023-01-31']) + assertEndsOfMonths('2023-01-01', '2023-01-20', ['2023-01-31']) + assertEndsOfMonths('2023-01-01', '2023-01-30', ['2023-01-31']) + assertEndsOfMonths('2023-01-01', '2023-01-31', ['2023-01-31']) + assertEndsOfMonths('2023-01-01', '2023-02-01', ['2023-01-31', '2023-02-28']) + assertEndsOfMonths('2023-01-01', '2023-02-28', ['2023-01-31', '2023-02-28']) + assertEndsOfMonths('2023-02-01', '2023-02-28', ['2023-02-28']) + assertEndsOfMonths('2023-02-10', '2023-02-28', ['2023-02-28']) + assertEndsOfMonths('2023-01-01', '2023-02-15', ['2023-01-31', '2023-02-28']) + assertEndsOfMonths('2023-01-01', '2023-03-31', ['2023-01-31', '2023-02-28', '2023-03-31']) + assertEndsOfMonths('2023-01-01', '2023-04-01', ['2023-01-31', '2023-02-28', '2023-03-31', '2023-04-30']) + assertEndsOfMonths('2023-01-01', '2023-04-30', ['2023-01-31', '2023-02-28', '2023-03-31', '2023-04-30']) + assertEndsOfMonths('2023-01-10', '2023-04-30', ['2023-01-31', '2023-02-28', '2023-03-31', '2023-04-30']) + assertEndsOfMonths('2023-01-10', '2023-04-09', ['2023-01-31', '2023-02-28', '2023-03-31', '2023-04-30']) + + def test_deferred_abnormal_dates(self): + """ + Test that we correctly detect abnormal dates. + In the deferred computations, we always assume that both the start and end date are inclusive + E.g: 1st January -> 31st December is *exactly* 1 year = 12 months + However, the user may instead put 1st January -> 1st January of next year which is then + 12 months + 1/30 month = 12.03 months which may result in odd amounts when deferrals are created. + This is what we call abnormal dates. + Other cases were the number of months is not round should not be handled and are not considered abnormal. + """ + move = self.create_invoice('in_invoice', [ + [self.expense_accounts[0], 0, '2023-01-01', '2023-12-30'], + [self.expense_accounts[0], 1, '2023-01-01', '2023-12-31'], + [self.expense_accounts[0], 2, '2023-01-01', '2024-01-01'], + [self.expense_accounts[0], 3, '2023-01-01', '2024-01-02'], + [self.expense_accounts[0], 4, '2023-01-01', '2024-01-31'], + [self.expense_accounts[0], 5, '2023-01-01', '2024-02-01'], + [self.expense_accounts[0], 6, '2023-01-02', '2024-02-01'], + [self.expense_accounts[0], 7, '2023-01-02', '2024-02-02'], + [self.expense_accounts[0], 8, '2023-01-31', '2024-01-30'], + [self.expense_accounts[0], 9, '2023-01-31', '2024-02-28'], # 29 days in Feb 2024 + # Following one is abnormal because we have a full months in February (= 30 accounting days) + 1 day in January + [self.expense_accounts[0], 10, '2023-01-31', '2024-02-29'], + [self.expense_accounts[0], 11, '2023-02-01', '2024-02-29'], + ], post=True) + lines = move.invoice_line_ids.sorted('price_unit') + self.assertFalse(lines[0].has_abnormal_deferred_dates) + self.assertFalse(lines[1].has_abnormal_deferred_dates) + self.assertTrue(lines[2].has_abnormal_deferred_dates) + self.assertFalse(lines[3].has_abnormal_deferred_dates) + self.assertFalse(lines[4].has_abnormal_deferred_dates) + self.assertTrue(lines[5].has_abnormal_deferred_dates) + self.assertFalse(lines[6].has_abnormal_deferred_dates) + self.assertTrue(lines[7].has_abnormal_deferred_dates) + self.assertFalse(lines[8].has_abnormal_deferred_dates) + self.assertFalse(lines[9].has_abnormal_deferred_dates) + self.assertTrue(lines[10].has_abnormal_deferred_dates) + self.assertFalse(lines[11].has_abnormal_deferred_dates) + + def test_deferred_expense_generate_entries_method(self): + # The deferred entries are NOT generated when the invoice is validated if the method is set to 'manual'. + self.company.generate_deferred_expense_entries_method = 'manual' + move = self.create_invoice('in_invoice', [self.expense_lines[0]], post=True) + self.assertEqual(len(move.deferred_move_ids), 0) + + move = self.create_invoice('in_refund', [self.expense_lines[0]], post=True) + self.assertEqual(len(move.deferred_move_ids), 0) + + # Test that the deferred entries are generated when the invoice is validated. + self.company.generate_deferred_expense_entries_method = 'on_validation' + move = self.create_invoice('in_invoice', [self.expense_lines[0]], post=True) + self.assertEqual(len(move.deferred_move_ids), 5) # 1 for the invoice deferred + 4 for the deferred entries + + move = self.create_invoice('in_refund', [self.expense_lines[0]], post=True) + self.assertEqual(len(move.deferred_move_ids), 5) + # See test_deferred_expense_credit_note for the values + + def test_deferred_expense_reset_to_draft(self): + """ + Test that the deferred entries are deleted/reverted when the invoice is reset to draft. + """ + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 1680, '2023-01-21', '2023-04-14')], date='2023-03-15') + self.assertEqual(len(move.deferred_move_ids), 5) + move.button_draft() + self.assertFalse(move.deferred_move_ids) + + # With a lock date, we should reverse the moves that cannot be deleted + move.action_post() # Post the move to create the deferred entries with 'on_validation' method + self.assertEqual(len(move.deferred_move_ids), 5) + move.company_id.fiscalyear_lock_date = fields.Date.to_date('2023-02-15') + move.button_draft() + # January deferred entry is in lock period, so it is reversed, not deleted, thus we have one deferred entry and its revert + self.assertEqual(len(move.deferred_move_ids), 2) + self.assertEqual(move.deferred_move_ids[0].date, fields.Date.to_date('2023-01-31')) + self.assertEqual(move.deferred_move_ids[1].date, fields.Date.to_date('2023-02-28')) + + # If we repost the move, it should be allowed + move.action_post() + self.assertEqual(len(move.deferred_move_ids), 2 + 5) + + @freeze_time('2023-03-15') + def test_deferred_invoice_reset_to_draft_with_audit_trail(self): + """ + Test that the deferred entries in draft are deleted when the invoice is reset to draft + and the posted deferred entries are cancelled. + """ + invoice = self.create_invoice('out_invoice', [(self.revenue_accounts[0], 1680, '2023-02-01', '2023-04-30')], date='2023-03-15') + posted_deferred_entries = invoice.deferred_move_ids.filtered(lambda move: move.state == 'posted') + draft_deferred_move_ids = invoice.deferred_move_ids.filtered(lambda move: move.state =="draft") + self.assertEqual(len(posted_deferred_entries), 2) + self.assertEqual(len(draft_deferred_move_ids), 2) + + # Set the company's audit trail to True + self.env.company.check_account_audit_trail = True + + invoice.button_draft() + + # Assert that the draft moves no longer exist + remaining_draft_moves = self.env['account.move'].search([('id', 'in', draft_deferred_move_ids.ids)]) + self.assertFalse(remaining_draft_moves) + # The posted deferred entries should be cancelled + self.assertEqual(len(posted_deferred_entries.filtered(lambda move: move.state == 'cancel')), 2) + + def assert_invoice_lines(self, move, expected_values, source_account, deferred_account): + deferred_moves = move.deferred_move_ids.sorted('date') + for deferred_move, expected_value in zip(deferred_moves, expected_values): + expected_date, expense_line_debit, expense_line_credit, deferred_line_debit, deferred_line_credit = expected_value + self.assertRecordValues(deferred_move, [{ + 'state': 'posted', + 'move_type': 'entry', + 'partner_id': self.partner_a.id, + 'date': fields.Date.to_date(expected_date), + }]) + expense_line = deferred_move.line_ids.filtered(lambda line: line.account_id == source_account) + self.assertRecordValues(expense_line, [ + {'debit': expense_line_debit, 'credit': expense_line_credit, 'partner_id': self.partner_a.id}, + ]) + deferred_line = deferred_move.line_ids.filtered(lambda line: line.account_id == deferred_account) + self.assertEqual(deferred_line.debit, deferred_line_debit) + self.assertEqual(deferred_line.credit, deferred_line_credit) + + def test_default_tax_on_account_not_on_deferred_entries(self): + """ + Test that the default taxes on an account are not calculated on deferral entries, since this would impact the + tax report. + """ + revenue_account_with_taxes = self.env['account.account'].create({ + 'name': 'Revenue with Taxes', + 'code': 'REVWTAXES', + 'account_type': 'income', + 'tax_ids': [Command.set(self.tax_sale_a.ids)] + }) + + move = self.create_invoice( + 'out_invoice', + [[revenue_account_with_taxes, 1000, '2023-01-01', '2023-04-30']], + date='2022-12-10' + ) + + expected_line_values = [ + # Date [Line expense] [Line deferred] + ('2022-12-10', 1000, 0, 0, 1000), + ('2023-01-31', 0, 250, 250, 0), + ('2023-02-28', 0, 250, 250, 0), + ('2023-03-31', 0, 250, 250, 0), + ] + + self.assert_invoice_lines( + move, + expected_line_values, + revenue_account_with_taxes, + self.company_data['default_account_deferred_revenue'] + ) + + for deferred_move in move.deferred_move_ids: + # There are no extra lines besides the two lines we checked before + self.assertEqual(len(deferred_move.line_ids), 2) + + + def test_deferred_values(self): + """ + Test that the debit/credit values are correctly computed, even after a credit note is issued. + """ + + expected_line_values1 = [ + # Date [Line expense] [Line deferred] + ('2022-12-10', 0, 1000, 1000, 0), + ('2023-01-31', 250, 0, 0, 250), + ('2023-02-28', 250, 0, 0, 250), + ('2023-03-31', 250, 0, 0, 250), + ] + expected_line_values2 = [ + # Date [Line expense] [Line deferred] + ('2022-12-10', 1000, 0, 0, 1000), + ('2023-01-31', 0, 250, 250, 0), + ('2023-02-28', 0, 250, 250, 0), + ('2023-03-31', 0, 250, 250, 0), + ] + + # Vendor bill and credit note + move = self.create_invoice('in_invoice', [self.expense_lines[0]], post=True, date='2022-12-10') + self.assert_invoice_lines(move, expected_line_values1, self.expense_accounts[0], self.company_data['default_account_deferred_expense']) + reverse_move = move._reverse_moves() + self.assert_invoice_lines(reverse_move, expected_line_values2, self.expense_accounts[0], self.company_data['default_account_deferred_expense']) + + # Customer invoice and credit note + move2 = self.create_invoice('out_invoice', [self.revenue_lines[0]], post=True, date='2022-12-10') + self.assert_invoice_lines(move2, expected_line_values2, self.revenue_accounts[0], self.company_data['default_account_deferred_revenue']) + reverse_move2 = move2._reverse_moves() + self.assert_invoice_lines(reverse_move2, expected_line_values1, self.revenue_accounts[0], self.company_data['default_account_deferred_revenue']) + + def test_deferred_values_rounding(self): + """ + Test that the debit/credit values are correctly computed when values are rounded + """ + + # Vendor Bill + expense_line = [self.expense_accounts[0], 500, '2020-08-07', '2020-12-07'] + expected_line_values = [ + # Date [Line expense] [Line deferred] + ('2020-08-07', 0, 500, 500, 0), + ('2020-08-31', 99.17, 0, 0, 99.17), + ('2020-09-30', 123.97, 0, 0, 123.97), + ('2020-10-31', 123.97, 0, 0, 123.97), + ('2020-11-30', 123.97, 0, 0, 123.97), + ('2020-12-07', 28.92, 0, 0, 28.92), + ] + self.assertEqual(self.company.currency_id.round(sum(x[1] for x in expected_line_values)), 500) + move = self.create_invoice('in_invoice', [expense_line], date='2020-08-07') + self.assert_invoice_lines(move, expected_line_values, self.expense_accounts[0], self.company_data['default_account_deferred_expense']) + + # Customer invoice + revenue_line = [self.revenue_accounts[0], 500, '2020-08-07', '2020-12-07'] + expected_line_values = [ + # Date [Line expense] [Line deferred] + ('2020-08-07', 500, 0, 0, 500), + ('2020-08-31', 0, 99.17, 99.17, 0), + ('2020-09-30', 0, 123.97, 123.97, 0), + ('2020-10-31', 0, 123.97, 123.97, 0), + ('2020-11-30', 0, 123.97, 123.97, 0), + ('2020-12-07', 0, 28.92, 28.92, 0), + ] + self.assertEqual(self.company.currency_id.round(sum(x[2] for x in expected_line_values)), 500) + move = self.create_invoice('out_invoice', [revenue_line], post=True, date='2020-08-07') + self.assert_invoice_lines(move, expected_line_values, self.revenue_accounts[0], self.company_data['default_account_deferred_revenue']) + + def test_deferred_expense_avoid_useless_deferred_entries(self): + """ + If we have an invoice with a start date in the beginning of the month, and an end date in the end of the month, + we should not create the deferred entries because the original invoice will be totally deferred + on the last day of the month, but the full amount will be accounted for on the same day too, thus + cancelling each other. Therefore we should not create the deferred entries. This is only the case + if the invoice date is also inside the deferred period. + """ + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 1680, '2023-01-01', '2023-01-31')], date='2023-01-01') + self.assertEqual(len(move.deferred_move_ids), 0) + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 1680, '2023-01-01', '2023-01-31')], date='2022-01-01') + self.assertEqual(len(move.deferred_move_ids), 2) + + def test_deferred_expense_single_period_entries(self): + """ + If we have an invoice covering only one period, we should only avoid creating deferral entries when the + accounting date is the same as the period for the deferral. Otherwise we should still generate a deferral entry. + """ + self.company.deferred_expense_amount_computation_method = 'month' + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 1680, '2023-02-01', '2023-02-28')]) + self.assertRecordValues(move.deferred_move_ids, [ + {'date': fields.Date.to_date('2023-01-01')}, + {'date': fields.Date.to_date('2023-02-28')}, + ]) + + def test_taxes_deferred_after_date_added(self): + """ + Test that applicable taxes get deferred also when the dates of the base line are filled in after a first save. + """ + + expected_line_values = [ + # Date [Line expense] [Line deferred] + ('2022-12-10', 0, 100, 100, 0), + ('2022-12-10', 0, 1000, 1000, 0), + ('2023-01-31', 25, 0, 0, 25), + ('2023-01-31', 250, 0, 0, 250), + ('2023-02-28', 25, 0, 0, 25), + ('2023-02-28', 250, 0, 0, 250), + ('2023-03-31', 25, 0, 0, 25), + ('2023-03-31', 250, 0, 0, 250), + ] + + partially_deductible_tax = self.env['account.tax'].create({ + 'name': 'Partially deductible Tax', + 'amount': 20, + 'amount_type': 'percent', + 'type_tax_use': 'purchase', + 'invoice_repartition_line_ids': [ + Command.create({'repartition_type': 'base'}), + Command.create({ + 'factor_percent': 50, + 'repartition_type': 'tax', + 'use_in_tax_closing': False + }), + Command.create({ + 'factor_percent': 50, + 'repartition_type': 'tax', + 'account_id': self.company_data['default_account_tax_purchase'].id, + 'use_in_tax_closing': True + }), + ], + 'refund_repartition_line_ids': [ + Command.create({'repartition_type': 'base'}), + Command.create({ + 'factor_percent': 50, + 'repartition_type': 'tax', + 'use_in_tax_closing': False + }), + Command.create({ + 'factor_percent': 50, + 'repartition_type': 'tax', + 'account_id': self.company_data['default_account_tax_purchase'].id, + 'use_in_tax_closing': True + }), + ], + }) + + move = self.env['account.move'].create({ + 'move_type': 'in_invoice', + 'partner_id': self.partner_a.id, + 'date': '2022-12-10', + 'invoice_date': '2022-12-10', + 'journal_id': self.company_data['default_journal_purchase'].id, + 'invoice_line_ids': [ + Command.create({ + 'quantity': 1, + 'account_id': self.expense_lines[0][0].id, + 'price_unit': self.expense_lines[0][1], + 'tax_ids': [Command.set(partially_deductible_tax.ids)], + }) + ] + }) + + move.invoice_line_ids.write({ + 'deferred_start_date': self.expense_lines[0][2], + 'deferred_end_date': self.expense_lines[0][3], + }) + + move.action_post() + + self.assert_invoice_lines(move, expected_line_values, self.expense_accounts[0], self.company_data['default_account_deferred_expense']) + + def test_deferred_tax_key(self): + """ + Test that the deferred tax key is correctly computed. + and is the same between _compute_tax_key and _compute_all_tax + """ + lines = [ + [self.expense_accounts[0], 1000, '2023-01-01', '2023-04-30'], + [self.expense_accounts[0], 1000, False, False], + ] + move = self.create_invoice('in_invoice', lines, post=True) + original_amount_total = move.amount_total + self.assertEqual(len(move.line_ids.filtered(lambda l: l.display_type == 'tax')), 1) + move.button_draft() + move.action_post() + # The number of tax lines shouldn't change, nor the total amount + self.assertEqual(len(move.line_ids.filtered(lambda l: l.display_type == 'tax')), 1) + self.assertEqual(move.amount_total, original_amount_total) + + def test_compute_empty_start_date(self): + """ + Test that the deferred start date is computed when empty and posting the move. + """ + lines = [[self.expense_accounts[0], 1000, False, '2023-04-30']] + move = self.create_invoice('in_invoice', lines, post=False) + + # We don't have a deferred date in the beginning + self.assertFalse(move.line_ids[0].deferred_start_date) + + move.action_post() + # Deferred start date is set after post + self.assertEqual(move.line_ids[0].deferred_start_date, datetime.date(2023, 1, 1)) + + move.button_draft() + move.line_ids[0].deferred_start_date = False + move.invoice_date = '2023-02-01' + # Start date is set when changing invoice date + self.assertEqual(move.line_ids[0].deferred_start_date, datetime.date(2023, 2, 1)) + + move.line_ids[0].deferred_start_date = False + move.line_ids[0].deferred_end_date = '2023-05-31' + # Start date is set when changing deferred end date + self.assertEqual(move.line_ids[0].deferred_start_date, datetime.date(2023, 2, 1)) + + def test_deferred_on_accounting_date(self): + """ + When we are in `on_validation` mode, the deferral of the total amount should happen on the + accounting date of the move. + """ + move = self.create_invoice( + 'in_invoice', + [(self.expense_accounts[0], 1680, '2023-01-01', '2023-02-28')], + date='2023-01-10', + post=False + ) + move.date = '2023-01-15' + move.action_post() + self.assertRecordValues(move.deferred_move_ids, [ + {'date': fields.Date.to_date('2023-01-15')}, + {'date': fields.Date.to_date('2023-01-31')}, + {'date': fields.Date.to_date('2023-02-28')}, + ]) + + def test_deferred_entries_not_created_on_future_invoice(self): + """Test that we don't create deferred entries on a future posted invoice""" + tomorrow = fields.Date.to_date(fields.Date.today()) + datetime.timedelta(days=1) + move = self.create_invoice( + 'out_invoice', + [(self.expense_accounts[0], 1680, tomorrow, tomorrow + datetime.timedelta(days=100))], + date=tomorrow, + post=False + ) + move.auto_post = "at_date" + move._post() + self.assertFalse(move.deferred_move_ids) + + with freeze_time(tomorrow): + self.env.ref('account.ir_cron_auto_post_draft_entry').method_direct_trigger() + self.assertEqual(move.state, 'posted') + self.assertTrue(move.deferred_move_ids) + + def test_deferred_entries_created_on_auto_post_invoice(self): + """Test that deferred entries are created on an invoice with auto_post set to 'at_date'""" + yesterday = fields.Date.to_date(fields.Date.today()) - datetime.timedelta(days=1) + move = self.create_invoice( + 'out_invoice', + [(self.expense_accounts[0], 1680, yesterday, yesterday + datetime.timedelta(days=45))], + date=yesterday, + post=False + ) + move.auto_post = "at_date" + move._post() + self.assertEqual(move.state, 'posted') + self.assertTrue(move.deferred_move_ids) + + def test_deferred_compute_method_full_months(self): + """ + Test that the deferred amount is correctly computed when the new full_months method computation is used + """ + self.company.deferred_expense_amount_computation_method = 'full_months' + + dates = (('2024-06-05', '2025-06-04'), ('2024-06-30', '2025-06-29')) + for (date_from, date_to) in dates: + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 12000, date_from, date_to)], date='2024-06-05') + self.assertRecordValues(move.deferred_move_ids.sorted('date'), [ + {'date': fields.Date.to_date('2024-06-05'), 'amount_total': 12000}, + {'date': fields.Date.to_date('2024-06-30'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2024-07-31'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2024-08-31'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2024-09-30'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2024-10-31'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2024-11-30'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2024-12-31'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2025-01-31'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2025-02-28'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2025-03-31'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2025-04-30'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2025-05-31'), 'amount_total': 1000}, + # 0 for June 2025, so no move created + ]) + + # Start of month <=> Equal per month method + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 12000, '2024-07-01', '2025-06-30')], date='2024-07-01') + self.assertRecordValues(move.deferred_move_ids.sorted(lambda m: (m.date, m.amount_total)), [ + {'date': fields.Date.to_date('2024-07-01'), 'amount_total': 12000}, + {'date': fields.Date.to_date('2024-07-31'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2024-08-31'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2024-09-30'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2024-10-31'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2024-11-30'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2024-12-31'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2025-01-31'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2025-02-28'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2025-03-31'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2025-04-30'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2025-05-31'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2025-06-30'), 'amount_total': 1000}, + ]) + + # Nothing to defer, everything is in the same month + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 12000, '2024-01-01', '2024-01-16')], date='2024-01-01') + self.assertFalse(move.deferred_move_ids) + + # Round period of 2 months -> Divide by 2 + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 12000, '2024-01-01', '2024-02-29')], date='2024-01-01') + self.assertRecordValues(move.deferred_move_ids.sorted(lambda m: (m.date, m.amount_total)), [ + {'date': fields.Date.to_date('2024-01-01'), 'amount_total': 12000}, + {'date': fields.Date.to_date('2024-01-31'), 'amount_total': 6000}, + {'date': fields.Date.to_date('2024-02-29'), 'amount_total': 6000}, + ]) + + # Round period of 2 months -> Divide by 2 + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 12000, '2024-01-15', '2024-03-14')], date='2024-01-01') + self.assertRecordValues(move.deferred_move_ids.sorted(lambda m: (m.date, m.amount_total)), [ + {'date': fields.Date.to_date('2024-01-01'), 'amount_total': 12000}, + {'date': fields.Date.to_date('2024-01-31'), 'amount_total': 6000}, + {'date': fields.Date.to_date('2024-02-29'), 'amount_total': 6000}, + ]) + + # Period of exactly one month: full amount should be in Jan. So we revert 1st Jan, and account for 31st Jan <=> don't generate anything + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 12000, '2024-01-15', '2024-02-14')], date='2024-01-01') + self.assertFalse(move.deferred_move_ids) + + # Not-round period of 1.5 month with only one end of month in January (same explanation as above) + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 12000, '2024-01-01', '2024-02-15')], date='2024-01-01') + self.assertFalse(move.deferred_move_ids) + + # Not-round period of 1.5+ month with only one end of month in January (same explanation as above) + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 12000, '2024-01-05', '2024-02-15')], date='2024-01-01') + self.assertFalse(move.deferred_move_ids) + + # Period of exactly one month: full amount should be in Feb. So we revert 1st Jan, and account for all on 29th Feb. + # Deferrals are in different months for this case, so we should the deferrals should be generated. + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 12000, '2024-02-15', '2024-03-14')], date='2024-01-01') + self.assertRecordValues(move.deferred_move_ids.sorted(lambda m: (m.date, m.amount_total)), [ + {'date': fields.Date.to_date('2024-01-01'), 'amount_total': 12000}, + {'date': fields.Date.to_date('2024-02-29'), 'amount_total': 12000}, + ]) + + # Not-round period of 1.5+ month: full amount should be in Feb. So we revert 1st Jan, and account for all on 29th Feb. + # Deferrals are in different months for this case, so we should the deferrals should be generated. + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 12000, '2024-02-05', '2024-03-15')], date='2024-01-01') + self.assertRecordValues(move.deferred_move_ids.sorted(lambda m: (m.date, m.amount_total)), [ + {'date': fields.Date.to_date('2024-01-01'), 'amount_total': 12000}, + {'date': fields.Date.to_date('2024-02-29'), 'amount_total': 12000}, + ]) + + # Not-round period of 1.5 month with 2 ends of months, so divide balance by 2 + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 12000, '2024-01-16', '2024-02-29')], date='2024-01-01') + self.assertRecordValues(move.deferred_move_ids.sorted(lambda m: (m.date, m.amount_total)), [ + {'date': fields.Date.to_date('2024-01-01'), 'amount_total': 12000}, + {'date': fields.Date.to_date('2024-01-31'), 'amount_total': 6000}, + {'date': fields.Date.to_date('2024-02-29'), 'amount_total': 6000}, + ]) + + # Not-round period of 2.5 month, with 3 ends of months, so divide balance by 3 + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], 12000, '2024-01-16', '2024-03-31')], date='2024-01-01') + self.assertRecordValues(move.deferred_move_ids.sorted(lambda m: (m.date, m.amount_total)), [ + {'date': fields.Date.to_date('2024-01-01'), 'amount_total': 12000}, + {'date': fields.Date.to_date('2024-01-31'), 'amount_total': 4000}, + {'date': fields.Date.to_date('2024-02-29'), 'amount_total': 4000}, + {'date': fields.Date.to_date('2024-03-31'), 'amount_total': 4000}, + ]) + + def test_deferral_moves_not_removed(self): + """ + Test that when there are multiple amls with the same price on the original invoice the deferral_moves are not removed + """ + move = self.create_invoice('in_invoice', [ + (self.expense_accounts[0], 1000, '2025-05-10', '2025-05-25'), + (self.expense_accounts[0], 1000, '2025-05-10', '2025-05-25') + ], date='2025-04-11') + self.assertEqual(len(move.deferred_move_ids), 4) + + def test_case_1_deferred_entries_computations_period_across_months(self): + """ + Tests deferred expense recognition when the invoice is dated in a month + after the service period has already begun. + Corresponds to Case from Row 6 of the user's image. + + - Service Period: June 25, 2024 -> July 7, 2024 (13 days) + - Invoice Date: July 1, 2024 + - Expected: The system should correctly create a back-dated expense entry for + the 6 days in June (dated June 30) and an entry for the 7 days in July + (dated July 7). + """ + invoice_date = '2024-07-01' + invoice_line_data = [self.expense_accounts[0], 1300, '2024-06-25', '2024-07-07'] + + expected_line_values = [ + ('2024-06-30', 600, 0, 0, 600), + (invoice_date, 0, 1300, 1300, 0), + ('2024-07-07', 700, 0, 0, 700), + ] + + move = self.create_invoice( + 'in_invoice', [invoice_line_data], date=invoice_date + ) + + self.assert_invoice_lines( + move, + expected_line_values, + self.expense_accounts[0], + self.company_data['default_account_deferred_expense'] + ) + + def test_case_2_deferred_entries_computations_period_across_months(self): + """ + Tests deferred expense recognition when the invoice is dated within the + service period, which spans across two months. + Corresponds to Case from Row 7 of the user's image. + + - Service Period: June 25, 2024 -> July 7, 2024 (13 days) + - Invoice Date: June 29, 2024 + - Expected: The system should correctly prorate the expense with 6 days + in June and 7 days in July. + """ + invoice_date = '2024-06-29' + invoice_line_data = [self.expense_accounts[0], 1300, '2024-06-25', '2024-07-07'] + + expected_line_values = [ + (invoice_date, 0, 1300, 1300, 0), + ('2024-06-30', 600, 0, 0, 600), + ('2024-07-07', 700, 0, 0, 700), + ] + + move = self.create_invoice( + 'in_invoice', [invoice_line_data], date=invoice_date + ) + + self.assert_invoice_lines( + move, + expected_line_values, + self.expense_accounts[0], + self.company_data['default_account_deferred_expense'] + ) + + def test_case_3_deferred_entries_computations_period_across_months(self): + """ + Tests deferred expense recognition for a longer service period that spans + across two months, with the invoice dated within the first month. + Corresponds to Case from Row 8 in the user's image. + + - Service Period: June 25, 2024 -> July 23, 2024 (29 days) + - Invoice Date: June 29, 2024 + - Expected: The system should correctly split the expense between June + (6/29 of total) and July (23/29 of total). + """ + invoice_date = '2024-06-29' + # Using 2900 for the amount to keep the numbers clean + invoice_line_data = [self.expense_accounts[0], 2900, '2024-06-25', '2024-07-23'] + + expected_line_values = [ + (invoice_date, 0, 2900, 2900, 0), + ('2024-06-30', 600, 0, 0, 600), + ('2024-07-23', 2300, 0, 0, 2300), + ] + + move = self.create_invoice( + 'in_invoice', [invoice_line_data], date=invoice_date + ) + + self.assert_invoice_lines( + move, + expected_line_values, + self.expense_accounts[0], + self.company_data['default_account_deferred_expense'] + ) + + def test_deferred_moves_from_same_move_different_lines(self): + """ + Test that fully deferred move and deferral move from different lines are not cancelling each other + when having the same amount. + """ + move = self.create_invoice('in_invoice', [(self.expense_accounts[0], amount, '2025-10-01', '2025-11-30') for amount in (1000, 500)], date='2025-11-30') + self.assertRecordValues(move.deferred_move_ids.sorted('date'), [ + {'date': fields.Date.to_date('2025-10-31'), 'amount_total': 500}, + {'date': fields.Date.to_date('2025-10-31'), 'amount_total': 250}, + {'date': fields.Date.to_date('2025-11-30'), 'amount_total': 1000}, + {'date': fields.Date.to_date('2025-11-30'), 'amount_total': 500}, + {'date': fields.Date.to_date('2025-11-30'), 'amount_total': 500}, + {'date': fields.Date.to_date('2025-11-30'), 'amount_total': 250}, + ]) diff --git a/dev_odex30_accounting/odex30_account_accountant/tests/test_prediction.py b/dev_odex30_accounting/odex30_account_accountant/tests/test_prediction.py new file mode 100644 index 0000000..84cdf5b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/tests/test_prediction.py @@ -0,0 +1,203 @@ +# -*- encoding: utf-8 -*- + +from odoo.addons.account.tests.common import AccountTestInvoicingCommon +from odoo import fields, Command +from odoo.tests import Form, tagged + + +@tagged('post_install', '-at_install') +class TestBillsPrediction(AccountTestInvoicingCommon): + + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.company.predict_bill_product = True + + cls.test_partners = cls.env['res.partner'].create([{'name': 'test partner %s' % i} for i in range(7)]) + + accounts_data = [{ + 'code': 'test%s' % i, + 'name': name, + 'account_type': 'expense', + } for i, name in enumerate(( + "Test Maintenance and Repair", + "Test Purchase of services, studies and preparatory work", + "Test Various Contributions", + "Test Rental Charges", + "Test Purchase of commodity", + ))] + + cls.test_accounts = cls.env['account.account'].create(accounts_data) + + cls.frozen_today = fields.Date.today() + + def _create_bill(self, vendor, line_name, expected_account, account_to_set=None, post=True): + ''' Create a new vendor bill to test the prediction. + :param vendor: The vendor to set on the invoice. + :param line_name: The name of the invoice line that will be used to predict. + :param expected_account: The expected predicted account. + :param account_to_set: The optional account to set as a correction of the predicted account. + :return: The newly created vendor bill. + ''' + invoice_form = Form(self.env['account.move'].with_context(default_move_type='in_invoice')) + invoice_form.partner_id = vendor + invoice_form.invoice_date = self.frozen_today + with invoice_form.invoice_line_ids.new() as invoice_line_form: + # Set the default account to avoid "account_id is a required field" in case of bad configuration. + invoice_line_form.account_id = self.company_data['default_journal_purchase'].default_account_id + + invoice_line_form.quantity = 1.0 + invoice_line_form.price_unit = 42.0 + invoice_line_form.name = line_name + invoice = invoice_form.save() + invoice_line = invoice.invoice_line_ids + + self.assertEqual( + invoice_line.account_id, + expected_account, + "Account '%s' should have been predicted instead of '%s'" % ( + expected_account.display_name, + invoice_line.account_id.display_name, + ), + ) + + if account_to_set: + invoice_line.account_id = account_to_set + + if post: + invoice.action_post() + return invoice + + def test_account_prediction_flow(self): + default_account = self.company_data['default_journal_purchase'].default_account_id + self._create_bill(self.test_partners[0], "Maintenance and repair", self.test_accounts[0]) + self._create_bill(self.test_partners[5], "Subsidies obtained", default_account, account_to_set=self.test_accounts[1]) + self._create_bill(self.test_partners[6], "Prepare subsidies file", default_account, account_to_set=self.test_accounts[1]) + self._create_bill(self.test_partners[6], "Prepare subsidies file", self.test_accounts[1]) + self._create_bill(self.test_partners[1], "Contributions January", self.test_accounts[2]) + self._create_bill(self.test_partners[2], "Coca-cola", default_account, account_to_set=self.test_accounts[4]) + self._create_bill(self.test_partners[1], "Contribution February", self.test_accounts[2]) + self._create_bill(self.test_partners[3], "Electricity Bruxelles", default_account, account_to_set=self.test_accounts[3]) + self._create_bill(self.test_partners[3], "Electricity Grand-Rosière", self.test_accounts[3]) + self._create_bill(self.test_partners[2], "Purchase of coca-cola", self.test_accounts[4]) + self._create_bill(self.test_partners[4], "Crate of coca-cola", default_account, account_to_set=self.test_accounts[4]) + self._create_bill(self.test_partners[4], "Crate of coca-cola", self.test_accounts[4]) + self._create_bill(self.test_partners[1], "March", self.test_accounts[2]) + + def test_account_prediction_from_label_expected_behavior(self): + """Prevent the prediction from being annoying.""" + default_account = self.company_data['default_journal_purchase'].default_account_id + payable_account = self.company_data['default_account_payable'].copy() + payable_account.write({'name': f'Account payable - {self.test_accounts[0].name}'}) + + # There is no prior result, we take the default account, but we don't post + self._create_bill(self.test_partners[0], self.test_partners[0].name, default_account, post=False) + + # There is no prior result, we take the default account + self._create_bill(self.test_partners[0], "Drinks", default_account, account_to_set=self.test_accounts[0]) + + # There is only one prior account for the partner, we take that one + self._create_bill(self.test_partners[0], "Desert", self.test_accounts[0], account_to_set=self.test_accounts[1]) + + # We find something close enough, take that one + self._create_bill(self.test_partners[0], "Drinks too", self.test_accounts[0]) + + # There is no clear preference for any account (both previous accounts have the same rank) + # don't make any prediction and let the default behavior fill the account + invoice = self._create_bill(self.test_partners[0], "Main course", default_account) + invoice.button_draft() + + with Form(invoice) as move_form: + with move_form.invoice_line_ids.edit(0) as line_form: + # There isn't any account clearly better than the manually set one, we keep the current one + line_form.account_id = self.test_accounts[2] + line_form.name = "Apple" + self.assertEqual(line_form.account_id, self.test_accounts[2]) + + # There is an account that looks clearly better, use it + line_form.name = "Second desert" + self.assertEqual(line_form.account_id, self.test_accounts[1]) + + def test_account_prediction_with_product(self): + product = self.env['product.product'].create({ + 'name': 'product_a', + 'lst_price': 1000.0, + 'standard_price': 800.0, + 'property_account_income_id': self.company_data['default_account_revenue'].id, + 'property_account_expense_id': self.company_data['default_account_expense'].id, + }) + + invoice_form = Form(self.env['account.move'].with_context(default_move_type='in_invoice')) + invoice_form.partner_id = self.test_partners[0] + invoice_form.invoice_date = self.frozen_today + with invoice_form.invoice_line_ids.new() as invoice_line_form: + invoice_line_form.product_id = product + invoice_line_form.name = "Maintenance and repair" + invoice = invoice_form.save() + + self.assertRecordValues(invoice.invoice_line_ids, [{ + 'name': "Maintenance and repair", + 'product_id': product.id, + 'account_id': self.company_data['default_account_expense'].id, + }]) + + def test_product_prediction_price_subtotal_computation(self): + invoice_form = Form(self.env['account.move'].with_context(default_move_type='in_invoice')) + invoice_form.partner_id = self.test_partners[0] + invoice_form.invoice_date = self.frozen_today + with invoice_form.invoice_line_ids.new() as invoice_line_form: + invoice_line_form.product_id = self.product_a + invoice = invoice_form.save() + invoice.action_post() + + self.product_a.supplier_taxes_id = [Command.set(self.tax_purchase_b.ids)] + + invoice_form = Form(self.env['account.move'].with_context(default_move_type='in_invoice')) + invoice_form.partner_id = self.test_partners[0] + invoice_form.invoice_date = self.frozen_today + with invoice_form.invoice_line_ids.new() as invoice_line_form: + invoice_line_form.name = 'product_a' + invoice = invoice_form.save() + + self.assertRecordValues(invoice.invoice_line_ids, [{ + 'quantity': 1.0, + 'price_unit': 800.0, + 'price_subtotal': 800.0, + 'balance': 800.0, + 'tax_ids': self.tax_purchase_b.ids, + }]) + + # In case a unit price is already set we do not update the unit price + invoice_form = Form(self.env['account.move'].with_context(default_move_type='in_invoice')) + invoice_form.partner_id = self.test_partners[0] + invoice_form.invoice_date = self.frozen_today + with invoice_form.invoice_line_ids.new() as invoice_line_form: + invoice_line_form.price_unit = 42.0 + invoice_line_form.name = 'product_a' + invoice = invoice_form.save() + + self.assertRecordValues(invoice.invoice_line_ids, [{ + 'quantity': 1.0, + 'price_unit': 42.0, + 'price_subtotal': 42.0, + 'balance': 42.0, + 'tax_ids': self.tax_purchase_b.ids, + }]) + + # In case a tax is already set we do not update the taxes + invoice_form = Form(self.env['account.move'].with_context(default_move_type='in_invoice')) + invoice_form.partner_id = self.test_partners[0] + invoice_form.invoice_date = self.frozen_today + with invoice_form.invoice_line_ids.new() as invoice_line_form: + invoice_line_form.tax_ids = self.tax_purchase_a + invoice_line_form.name = 'product_a' + invoice = invoice_form.save() + + self.assertRecordValues(invoice.invoice_line_ids, [{ + 'quantity': 1.0, + 'price_unit': 800.0, + 'price_subtotal': 800.0, + 'balance': 800.0, + 'tax_ids': self.tax_purchase_a.ids, + }]) diff --git a/dev_odex30_accounting/odex30_account_accountant/tests/test_reconciliation_matching_rules.py b/dev_odex30_accounting/odex30_account_accountant/tests/test_reconciliation_matching_rules.py new file mode 100644 index 0000000..4fb5a0b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/tests/test_reconciliation_matching_rules.py @@ -0,0 +1,1351 @@ +# -*- coding: utf-8 -*- +from freezegun import freeze_time +from contextlib import closing + +from odoo.addons.account.tests.common import AccountTestInvoicingCommon +from odoo.tests import Form, tagged +from odoo import Command + + +@tagged('post_install', '-at_install') +class TestReconciliationMatchingRules(AccountTestInvoicingCommon): + + @classmethod + def setUpClass(cls): + super().setUpClass() + + ################# + # Company setup # + ################# + cls.other_currency = cls.setup_other_currency('EUR') + cls.other_currency_2 = cls.setup_other_currency('CAD', rates=[('2016-01-01', 10.0), ('2017-01-01', 20.0)]) + + cls.account_pay = cls.company_data['default_account_payable'] + cls.current_assets_account = cls.env['account.account'].search([ + ('account_type', '=', 'asset_current'), + ('company_ids', '=', cls.company.id)], limit=1) + + cls.bank_journal = cls.env['account.journal'].search([('type', '=', 'bank'), ('company_id', '=', cls.company.id)], limit=1) + cls.cash_journal = cls.env['account.journal'].search([('type', '=', 'cash'), ('company_id', '=', cls.company.id)], limit=1) + + cls.tax21 = cls.env['account.tax'].create({ + 'name': '21%', + 'type_tax_use': 'purchase', + 'amount': 21, + }) + + cls.tax12 = cls.env['account.tax'].create({ + 'name': '12%', + 'type_tax_use': 'purchase', + 'amount': 12, + }) + + cls.partner_1 = cls.env['res.partner'].create({'name': 'partner_1', 'company_id': cls.company.id}) + cls.partner_2 = cls.env['res.partner'].create({'name': 'partner_2', 'company_id': cls.company.id}) + cls.partner_3 = cls.env['res.partner'].create({'name': 'partner_3', 'company_id': cls.company.id}) + + ############### + # Rules setup # + ############### + cls.rule_1 = cls.env['account.reconcile.model'].create({ + 'name': 'Invoices Matching Rule', + 'sequence': '1', + 'rule_type': 'invoice_matching', + 'auto_reconcile': False, + 'match_nature': 'both', + 'match_same_currency': True, + 'allow_payment_tolerance': True, + 'payment_tolerance_type': 'percentage', + 'payment_tolerance_param': 0.0, + 'match_partner': True, + 'match_partner_ids': [(6, 0, (cls.partner_1 + cls.partner_2 + cls.partner_3).ids)], + 'company_id': cls.company.id, + 'line_ids': [(0, 0, {'account_id': cls.current_assets_account.id})], + }) + cls.rule_2 = cls.env['account.reconcile.model'].create({ + 'name': 'write-off model', + 'rule_type': 'writeoff_suggestion', + 'match_partner': True, + 'match_partner_ids': [], + 'line_ids': [(0, 0, {'account_id': cls.current_assets_account.id})], + }) + + ################## + # Invoices setup # + ################## + cls.invoice_line_1 = cls._create_invoice_line(100, cls.partner_1, 'out_invoice') + cls.invoice_line_2 = cls._create_invoice_line(200, cls.partner_1, 'out_invoice') + cls.invoice_line_3 = cls._create_invoice_line(300, cls.partner_1, 'in_refund', name="RBILL/2019/09/0013") + cls.invoice_line_4 = cls._create_invoice_line(1000, cls.partner_2, 'in_invoice') + cls.invoice_line_5 = cls._create_invoice_line(600, cls.partner_3, 'out_invoice') + cls.invoice_line_6 = cls._create_invoice_line(600, cls.partner_3, 'out_invoice', ref="RF12 3456") + cls.invoice_line_7 = cls._create_invoice_line(200, cls.partner_3, 'out_invoice') + + #################### + # Statements setup # + #################### + # TODO : account_number, partner_name, transaction_type, narration + invoice_number = cls.invoice_line_1.move_id.name + cls.bank_line_1, cls.bank_line_2,\ + cls.bank_line_3, cls.bank_line_4,\ + cls.bank_line_5, cls.cash_line_1 = cls.env['account.bank.statement.line'].create([ + { + 'journal_id': cls.bank_journal.id, + 'date': '2020-01-01', + 'payment_ref': 'invoice %s-%s' % tuple(invoice_number.split('/')[1:]), + 'partner_id': cls.partner_1.id, + 'amount': 100, + 'sequence': 1, + }, + { + 'journal_id': cls.bank_journal.id, + 'date': '2020-01-01', + 'payment_ref': 'xxxxx', + 'partner_id': cls.partner_1.id, + 'amount': 600, + 'sequence': 2, + }, + { + 'journal_id': cls.bank_journal.id, + 'date': '2020-01-01', + 'payment_ref': 'nawak', + 'narration': 'Communication: RF12 3456', + 'partner_id': cls.partner_3.id, + 'amount': 600, + 'sequence': 1, + }, + { + 'journal_id': cls.bank_journal.id, + 'date': '2020-01-01', + 'payment_ref': 'RF12 3456', + 'partner_id': cls.partner_3.id, + 'amount': 600, + 'sequence': 2, + }, + { + 'journal_id': cls.bank_journal.id, + 'date': '2020-01-01', + 'payment_ref': 'baaaaah', + 'ref': 'RF12 3456', + 'partner_id': cls.partner_3.id, + 'amount': 600, + 'sequence': 2, + }, + { + 'journal_id': cls.cash_journal.id, + 'date': '2020-01-01', + 'payment_ref': 'yyyyy', + 'partner_id': cls.partner_2.id, + 'amount': -1000, + 'sequence': 1, + }, + ]) + + @classmethod + def _create_invoice_line(cls, amount, partner, move_type, currency=None, ref=None, name=None, inv_date='2019-09-01'): + ''' Create an invoice on the fly.''' + invoice_form = Form(cls.env['account.move'].with_context(default_move_type=move_type, default_invoice_date=inv_date, default_date=inv_date)) + invoice_form.partner_id = partner + if currency: + invoice_form.currency_id = currency + if ref: + invoice_form.ref = ref + if name: + invoice_form.name = name + with invoice_form.invoice_line_ids.new() as invoice_line_form: + invoice_line_form.name = 'xxxx' + invoice_line_form.quantity = 1 + invoice_line_form.price_unit = amount + invoice_line_form.tax_ids.clear() + invoice = invoice_form.save() + invoice.action_post() + lines = invoice.line_ids + return lines.filtered(lambda l: l.account_id.account_type in ('asset_receivable', 'liability_payable')) + + @classmethod + def _create_st_line(cls, amount=1000.0, date='2019-01-01', payment_ref='turlututu', **kwargs): + st_line = cls.env['account.bank.statement.line'].create({ + 'journal_id': kwargs.get('journal_id', cls.bank_journal.id), + 'amount': amount, + 'date': date, + 'payment_ref': payment_ref, + 'partner_id': cls.partner_a.id, + **kwargs, + }) + return st_line + + @classmethod + def _create_reconcile_model(cls, **kwargs): + return cls.env['account.reconcile.model'].create({ + 'name': "test", + 'rule_type': 'invoice_matching', + 'allow_payment_tolerance': True, + 'payment_tolerance_type': 'percentage', + 'payment_tolerance_param': 0.0, + **kwargs, + 'line_ids': [ + Command.create({ + 'account_id': cls.company_data['default_account_revenue'].id, + 'amount_type': 'percentage', + 'label': f"test {i}", + **line_vals, + }) + for i, line_vals in enumerate(kwargs.get('line_ids', [])) + ], + 'partner_mapping_line_ids': [ + Command.create(line_vals) + for i, line_vals in enumerate(kwargs.get('partner_mapping_line_ids', [])) + ], + }) + + @freeze_time('2020-01-01') + def _check_statement_matching(self, rules, expected_values_list): + for statement_line, expected_values in expected_values_list.items(): + res = rules._apply_rules(statement_line, statement_line._retrieve_partner()) + self.assertDictEqual(res, expected_values) + + def test_matching_fields(self): + # Check without restriction. + self.rule_1.match_text_location_label = False + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {'amls': self.invoice_line_1, 'model': self.rule_1}, + self.bank_line_2: {'amls': self.invoice_line_1 + self.invoice_line_2 + self.invoice_line_3, 'model': self.rule_1}, + self.cash_line_1: {'amls': self.invoice_line_4, 'model': self.rule_1}, + }) + + @freeze_time('2020-01-01') + def test_matching_fields_match_text_location(self): + st_line = self._create_st_line(payment_ref="1111", ref="2222 3333", narration="4444 5555 6666") + + inv1 = self._create_invoice_line(1000, self.partner_a, 'out_invoice', ref="bernard 1111 gagnant") + inv2 = self._create_invoice_line(1000, self.partner_a, 'out_invoice', ref="2222 turlututu 3333") + inv3 = self._create_invoice_line(1000, self.partner_a, 'out_invoice', ref="4444 tsoin 5555 tsoin 6666") + + rule = self._create_reconcile_model( + allow_payment_tolerance=False, + match_text_location_label=True, + match_text_location_reference=False, + match_text_location_note=False, + ) + self.assertDictEqual( + rule._apply_rules(st_line, st_line._retrieve_partner()), + {'amls': inv1, 'model': rule}, + ) + + rule.match_text_location_reference = True + self.assertDictEqual( + rule._apply_rules(st_line, st_line._retrieve_partner()), + {'amls': inv2, 'model': rule}, + ) + + rule.match_text_location_note = True + self.assertDictEqual( + rule._apply_rules(st_line, st_line._retrieve_partner()), + {'amls': inv3, 'model': rule}, + ) + + def test_matching_fields_match_text_location_no_partner(self): + self.bank_line_2.unlink() # One line is enough for this test + self.bank_line_1.partner_id = None + + self.partner_1.name = "Bernard Gagnant" + + self.rule_1.write({ + 'match_partner': False, + 'match_partner_ids': [(5, 0, 0)], + 'line_ids': [(5, 0, 0)], + }) + + st_line_initial_vals = {'ref': None, 'payment_ref': 'nothing', 'narration': None} + recmod_initial_vals = {'match_text_location_label': False, 'match_text_location_note': False, 'match_text_location_reference': False} + + rec_mod_options_to_fields = { + 'match_text_location_label': 'payment_ref', + 'match_text_location_note': 'narration', + 'match_text_location_reference': 'ref', + } + + for rec_mod_field, st_line_field in rec_mod_options_to_fields.items(): + self.rule_1.write({**recmod_initial_vals, rec_mod_field: True}) + # Fully reinitialize the statement line + self.bank_line_1.write(st_line_initial_vals) + + # Test matching with the invoice ref + self.bank_line_1.write({st_line_field: self.invoice_line_1.move_id.payment_reference}) + + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {'amls': self.invoice_line_1, 'model': self.rule_1}, + }) + + def test_matching_fields_match_journal_ids(self): + self.rule_1.match_text_location_label = False + self.rule_1.match_journal_ids |= self.cash_line_1.journal_id + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {}, + self.bank_line_2: {}, + self.cash_line_1: {'amls': self.invoice_line_4, 'model': self.rule_1}, + }) + + def test_matching_fields_match_nature(self): + self.rule_1.match_text_location_label = False + self.rule_1.match_nature = 'amount_received' + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {'amls': self.invoice_line_1, 'model': self.rule_1}, + self.bank_line_2: { + 'amls': self.invoice_line_2 + self.invoice_line_3 + self.invoice_line_1, + 'model': self.rule_1, + }, + self.cash_line_1: {}, + }) + self.rule_1.match_nature = 'amount_paid' + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {}, + self.bank_line_2: {}, + self.cash_line_1: {'amls': self.invoice_line_4, 'model': self.rule_1}, + }) + + def test_matching_fields_match_amount(self): + self.rule_1.match_text_location_label = False + self.rule_1.match_amount = 'lower' + self.rule_1.match_amount_max = 150 + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {'amls': self.invoice_line_1, 'model': self.rule_1}, + self.bank_line_2: {}, + self.cash_line_1: {}, + }) + self.rule_1.match_amount = 'greater' + self.rule_1.match_amount_min = 200 + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {}, + self.bank_line_2: {'amls': self.invoice_line_1 + self.invoice_line_2 + self.invoice_line_3, 'model': self.rule_1}, + self.cash_line_1: {'amls': self.invoice_line_4, 'model': self.rule_1}, + }) + self.rule_1.match_amount = 'between' + self.rule_1.match_amount_min = 200 + self.rule_1.match_amount_max = 800 + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {}, + self.bank_line_2: {'amls': self.invoice_line_1 + self.invoice_line_2 + self.invoice_line_3, 'model': self.rule_1}, + self.cash_line_1: {}, + }) + + def test_matching_fields_match_label(self): + self.rule_1.match_text_location_label = False + self.rule_1.match_label = 'contains' + self.rule_1.match_label_param = 'yyyyy' + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {}, + self.bank_line_2: {}, + self.cash_line_1: {'amls': self.invoice_line_4, 'model': self.rule_1}, + }) + self.rule_1.match_label = 'not_contains' + self.rule_1.match_label_param = 'xxxxx' + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {'amls': self.invoice_line_1, 'model': self.rule_1}, + self.bank_line_2: {}, + self.cash_line_1: {'amls': self.invoice_line_4, 'model': self.rule_1}, + }) + self.rule_1.match_label = 'match_regex' + self.rule_1.match_label_param = 'xxxxx|yyyyy' + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {}, + self.bank_line_2: {'amls': self.invoice_line_1 + self.invoice_line_2 + self.invoice_line_3, 'model': self.rule_1}, + self.cash_line_1: {'amls': self.invoice_line_4, 'model': self.rule_1}, + }) + + @freeze_time('2019-01-01') + def test_zero_payment_tolerance(self): + rule = self._create_reconcile_model(line_ids=[{}]) + + for inv_type, bsl_sign in (('out_invoice', 1), ('in_invoice', -1)): + + invl = self._create_invoice_line(1000.0, self.partner_a, inv_type, inv_date='2019-01-01') + + # Exact matching. + st_line = self._create_st_line(amount=bsl_sign * 1000.0, payment_ref=invl.name) + self._check_statement_matching( + rule, + {st_line: {'amls': invl, 'model': rule}}, + ) + + # No matching because there is no tolerance. + st_line = self._create_st_line(amount=bsl_sign * 990.0, payment_ref=invl.name) + self._check_statement_matching( + rule, + {st_line: {}}, + ) + + # The payment amount is higher than the invoice one. + st_line = self._create_st_line(amount=bsl_sign * 1010.0, payment_ref=invl.name) + self._check_statement_matching( + rule, + {st_line: {'amls': invl, 'model': rule}}, + ) + + @freeze_time('2019-01-01') + def test_zero_payment_tolerance_auto_reconcile(self): + rule = self._create_reconcile_model( + auto_reconcile=True, + match_text_location_label = False, + line_ids=[{}], + ) + + for inv_type, bsl_sign in (('out_invoice', 1), ('in_invoice', -1)): + + invl = self._create_invoice_line(1000.0, self.partner_a, inv_type, inv_date='2019-01-01') + + # No matching because there is no tolerance. + st_line = self._create_st_line(amount=bsl_sign * 990.0, payment_ref='123456') + self._check_statement_matching( + rule, + {st_line: {}}, + ) + + # The payment amount is higher than the invoice one. + st_line = self._create_st_line(amount=bsl_sign * 1010.0, payment_ref='123456') + self._check_statement_matching( + rule, + {st_line: {'amls': invl, 'model': rule}}, + ) + + @freeze_time('2019-01-01') + def test_not_enough_payment_tolerance(self): + rule = self._create_reconcile_model( + payment_tolerance_param=0.5, + line_ids=[{}], + ) + + for inv_type, bsl_sign in (('out_invoice', 1), ('in_invoice', -1)): + with self.subTest(inv_type=inv_type, bsl_sign=bsl_sign): + + invl = self._create_invoice_line(1000.0, self.partner_a, inv_type, inv_date='2019-01-01') + + # No matching because there is no enough tolerance. + st_line = self._create_st_line(amount=bsl_sign * 990.0, payment_ref=invl.name) + self._check_statement_matching( + rule, + {st_line: {}}, + ) + + # The payment amount is higher than the invoice one. + # However, since the invoice amount is lower than the payment amount, + # the tolerance is not checked and the invoice line is matched. + st_line = self._create_st_line(amount=bsl_sign * 1010.0, payment_ref=invl.name) + self._check_statement_matching( + rule, + {st_line: {'amls': invl, 'model': rule}}, + ) + + @freeze_time('2019-01-01') + def test_enough_payment_tolerance(self): + rule = self._create_reconcile_model( + payment_tolerance_param=2.0, + line_ids=[{}], + ) + + for inv_type, bsl_sign in (('out_invoice', 1), ('in_invoice', -1)): + + invl = self._create_invoice_line(1210.0, self.partner_a, inv_type, inv_date='2019-01-01') + + # Enough tolerance to match the invoice line. + st_line = self._create_st_line(amount=bsl_sign * 1185.80, payment_ref=invl.name) + self._check_statement_matching( + rule, + {st_line: {'amls': invl, 'model': rule, 'status': 'write_off'}}, + ) + + # The payment amount is higher than the invoice one. + # However, since the invoice amount is lower than the payment amount, + # the tolerance is not checked and the invoice line is matched. + st_line = self._create_st_line(amount=bsl_sign * 1234.20, payment_ref=invl.name) + self._check_statement_matching( + rule, + {st_line: {'amls': invl, 'model': rule}}, + ) + + @freeze_time('2019-01-01') + def test_enough_payment_tolerance_auto_reconcile_not_full(self): + rule = self._create_reconcile_model( + payment_tolerance_param=1.0, + auto_reconcile=True, + match_text_location_label = False, + line_ids=[{'amount_type': 'percentage_st_line', 'amount_string': '200.0'}], + ) + + for inv_type, bsl_sign in (('out_invoice', 1), ('in_invoice', -1)): + + invl = self._create_invoice_line(1000.0, self.partner_a, inv_type, inv_date='2019-01-01') + + # Enough tolerance to match the invoice line. + st_line = self._create_st_line(amount=bsl_sign * 990.0, payment_ref='123456') + self._check_statement_matching( + rule, + {st_line: {'amls': invl, 'model': rule, 'status': 'write_off'}}, + ) + + @freeze_time('2019-01-01') + def test_allow_payment_tolerance_lower_amount(self): + rule = self._create_reconcile_model(line_ids=[{'amount_type': 'percentage_st_line'}]) + + for inv_type, bsl_sign in (('out_invoice', 1), ('in_invoice', -1)): + + invl = self._create_invoice_line(990.0, self.partner_a, inv_type, inv_date='2019-01-01') + st_line = self._create_st_line(amount=bsl_sign * 1000, payment_ref=invl.name) + + # Partial reconciliation. + self._check_statement_matching( + rule, + {st_line: {'amls': invl, 'model': rule}}, + ) + + @freeze_time('2019-01-01') + def test_enough_payment_tolerance_auto_reconcile(self): + rule = self._create_reconcile_model( + payment_tolerance_param=1.0, + auto_reconcile=True, + match_text_location_label = False, + line_ids=[{}], + ) + + for inv_type, bsl_sign in (('out_invoice', 1), ('in_invoice', -1)): + + invl = self._create_invoice_line(1000.0, self.partner_a, inv_type, inv_date='2019-01-01') + + # Enough tolerance to match the invoice line. + st_line = self._create_st_line(amount=bsl_sign * 990.0, payment_ref='123456') + self._check_statement_matching( + rule, + {st_line: { + 'amls': invl, + 'model': rule, + 'status': 'write_off', + }}, + ) + + @freeze_time('2019-01-01') + def test_percentage_st_line_auto_reconcile(self): + rule = self._create_reconcile_model( + payment_tolerance_param=1.0, + rule_type='writeoff_suggestion', + auto_reconcile=True, + line_ids=[ + {'amount_type': 'percentage_st_line', 'amount_string': '100.0', 'label': 'A'}, + {'amount_type': 'percentage_st_line', 'amount_string': '-100.0', 'label': 'B'}, + {'amount_type': 'percentage_st_line', 'amount_string': '100.0', 'label': 'C'}, + ], + ) + + for bsl_sign in (1, -1): + st_line = self._create_st_line(amount=bsl_sign * 1000.0) + self._check_statement_matching( + rule, + {st_line: { + 'model': rule, + 'status': 'write_off', + 'auto_reconcile': True, + }}, + ) + + def test_matching_fields_match_partner_category_ids(self): + self.rule_1.match_text_location_label = False + test_category = self.env['res.partner.category'].create({'name': 'Consulting Services'}) + test_category2 = self.env['res.partner.category'].create({'name': 'Consulting Services2'}) + + self.partner_2.category_id = test_category + test_category2 + self.rule_1.match_partner_category_ids |= test_category + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {}, + self.bank_line_2: {}, + self.cash_line_1: {'amls': self.invoice_line_4, 'model': self.rule_1}, + }) + self.rule_1.match_partner_category_ids = False + + def test_mixin_rules(self): + ''' Test usage of rules together.''' + self.rule_1.match_text_location_label = False + # rule_1 is used before rule_2. + self.rule_1.sequence = 1 + self.rule_2.sequence = 2 + + self._check_statement_matching(self.rule_1 + self.rule_2, { + self.bank_line_1: { + 'amls': self.invoice_line_1, + 'model': self.rule_1, + }, + self.bank_line_2: { + 'amls': self.invoice_line_2 + self.invoice_line_3 + self.invoice_line_1, + 'model': self.rule_1, + }, + self.cash_line_1: {'amls': self.invoice_line_4, 'model': self.rule_1}, + }) + + # rule_2 is used before rule_1. + self.rule_1.sequence = 2 + self.rule_2.sequence = 1 + + self._check_statement_matching(self.rule_1 + self.rule_2, { + self.bank_line_1: {'model': self.rule_2, 'auto_reconcile': False, 'status': 'write_off'}, + self.bank_line_2: {'model': self.rule_2, 'auto_reconcile': False, 'status': 'write_off'}, + self.cash_line_1: {'model': self.rule_2, 'auto_reconcile': False, 'status': 'write_off'}, + }) + + # rule_2 is used before rule_1 but only on partner_1. + self.rule_2.match_partner_ids |= self.partner_1 + + self._check_statement_matching(self.rule_1 + self.rule_2, { + self.bank_line_1: {'model': self.rule_2, 'auto_reconcile': False, 'status': 'write_off'}, + self.bank_line_2: {'model': self.rule_2, 'auto_reconcile': False, 'status': 'write_off'}, + self.cash_line_1: {'amls': self.invoice_line_4, 'model': self.rule_1}, + }) + + def test_auto_reconcile(self): + ''' Test auto reconciliation.''' + self.bank_line_1.amount += 5 + + self.rule_1.sequence = 2 + self.rule_1.auto_reconcile = True + self.rule_1.payment_tolerance_param = 10.0 + self.rule_1.match_text_location_label = False + self.rule_2.sequence = 1 + self.rule_2.match_partner_ids |= self.partner_2 + self.rule_2.auto_reconcile = True + + self._check_statement_matching(self.rule_1 + self.rule_2, { + self.bank_line_1: { + 'amls': self.invoice_line_1, + 'model': self.rule_1, + 'auto_reconcile': True, + }, + self.bank_line_2: { + 'amls': self.invoice_line_1 + self.invoice_line_2 + self.invoice_line_3, + 'model': self.rule_1, + }, + self.cash_line_1: { + 'model': self.rule_2, + 'status': 'write_off', + 'auto_reconcile': True, + }, + }) + + def test_auto_reconcile_ref_with_spaces(self): + space_in_ref_invoice_line = self._create_invoice_line(600, self.partner_3, 'out_invoice', ref="This ref has spaces") + space_in_ref_bank_line = self._create_st_line( + amount=600.0, + date='2020-01-01', + payment_ref="This ref has spaces", + partner_id= self.partner_3.id, + ) + self.rule_1.auto_reconcile = True + + self._check_statement_matching(self.rule_1, { + space_in_ref_bank_line: { + 'model': self.rule_1, + 'auto_reconcile': True, + 'amls': space_in_ref_invoice_line + } + }) + + def test_larger_invoice_auto_reconcile(self): + ''' Test auto reconciliation with an invoice with larger amount than the + statement line's, for rules without write-offs.''' + self.bank_line_1.amount = 40 + self.invoice_line_1.move_id.payment_reference = self.bank_line_1.payment_ref + + self.rule_1.sequence = 2 + self.rule_1.allow_payment_tolerance = False + self.rule_1.auto_reconcile = True + self.rule_1.line_ids = [(5, 0, 0)] + self.rule_1.match_text_location_label = False + + self._check_statement_matching(self.rule_1, { + self.bank_line_1: { + 'amls': self.invoice_line_1, + 'model': self.rule_1, + 'auto_reconcile': True, + }, + self.bank_line_2: { + 'amls': self.invoice_line_1 + self.invoice_line_2 + self.invoice_line_3, + 'model': self.rule_1, + }, + }) + + def test_auto_reconcile_with_tax(self): + ''' Test auto reconciliation with a tax amount included in the bank statement line''' + self.rule_1.write({ + 'auto_reconcile': True, + 'rule_type': 'writeoff_suggestion', + 'line_ids': [(1, self.rule_1.line_ids.id, { + 'amount': 50, + 'force_tax_included': True, + 'tax_ids': [(6, 0, self.tax21.ids)], + }), (0, 0, { + 'amount': 100, + 'force_tax_included': False, + 'tax_ids': [(6, 0, self.tax12.ids)], + 'account_id': self.current_assets_account.id, + })] + }) + + self.bank_line_1.amount = -121 + + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {'model': self.rule_1, 'status': 'write_off', 'auto_reconcile': True}, + self.bank_line_2: {'model': self.rule_1, 'status': 'write_off', 'auto_reconcile': True}, + }) + + def test_auto_reconcile_with_tax_fpos(self): + """ Test the fiscal positions are applied by reconcile models when using taxes. + """ + self.rule_1.write({ + 'auto_reconcile': True, + 'rule_type': 'writeoff_suggestion', + 'line_ids': [(1, self.rule_1.line_ids.id, { + 'amount': 100, + 'force_tax_included': True, + 'tax_ids': [(6, 0, self.tax21.ids)], + })] + }) + + self.partner_1.country_id = self.env.ref('base.lu') + belgium = self.env.ref('base.be') + self.partner_2.country_id = belgium + + self.bank_line_2.partner_id = self.partner_2 + + self.bank_line_1.amount = -121 + self.bank_line_2.amount = -112 + + self.env['account.fiscal.position'].create({ + 'name': "Test", + 'country_id': belgium.id, + 'auto_apply': True, + 'tax_ids': [ + Command.create({ + 'tax_src_id': self.tax21.id, + 'tax_dest_id': self.tax12.id, + }), + ] + }) + + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {'model': self.rule_1, 'status': 'write_off', 'auto_reconcile': True}, + self.bank_line_2: {'model': self.rule_1, 'status': 'write_off', 'auto_reconcile': True}, + }) + + def test_reverted_move_matching(self): + partner = self.partner_1 + AccountMove = self.env['account.move'] + move = AccountMove.create({ + 'journal_id': self.bank_journal.id, + 'line_ids': [ + (0, 0, { + 'account_id': self.account_pay.id, + 'partner_id': partner.id, + 'name': 'One of these days', + 'debit': 10, + }), + (0, 0, { + 'account_id': self.inbound_payment_method_line.payment_account_id.id, + 'partner_id': partner.id, + 'name': 'I\'m gonna cut you into little pieces', + 'credit': 10, + }) + ], + }) + + payment_bnk_line = move.line_ids.filtered(lambda l: l.account_id == self.inbound_payment_method_line.payment_account_id) + + move.action_post() + move_reversed = move._reverse_moves() + self.assertTrue(move_reversed.exists()) + + self.rule_1.match_text_location_label = False + self.bank_line_1.write({ + 'payment_ref': '8', + 'partner_id': partner.id, + 'amount': -10, + }) + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {'amls': payment_bnk_line, 'model': self.rule_1}, + self.bank_line_2: { + 'amls': self.invoice_line_1 + self.invoice_line_2 + self.invoice_line_3, + 'model': self.rule_1, + }, + }) + + def test_match_different_currencies(self): + partner = self.env['res.partner'].create({'name': 'Bernard Gagnant'}) + self.rule_1.write({'match_partner_ids': [(6, 0, partner.ids)], 'match_same_currency': False}) + + currency_inv = self.env.ref('base.EUR') + currency_inv.active = True + currency_statement = self.env.ref('base.JPY') + + currency_statement.active = True + + invoice_line = self._create_invoice_line(100, partner, 'out_invoice', currency=currency_inv) + + self.bank_line_1.write({'partner_id': partner.id, 'foreign_currency_id': currency_statement.id, 'amount_currency': 100, 'payment_ref': invoice_line.name}) + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {'amls': invoice_line, 'model': self.rule_1}, + self.bank_line_2: {}, + }) + + def test_invoice_matching_rule_no_partner(self): + """ Tests that a statement line without any partner can be matched to the + right invoice if they have the same payment reference. + """ + self.invoice_line_1.move_id.write({'payment_reference': 'Tournicoti66'}) + self.rule_1.allow_payment_tolerance = False + + self.bank_line_1.write({ + 'payment_ref': 'Tournicoti66', + 'partner_id': None, + 'amount': 95, + }) + + self.rule_1.write({ + 'line_ids': [(5, 0, 0)], + 'match_partner': False, + 'match_label': 'contains', + 'match_label_param': 'Tournicoti', # So that we only match what we want to test + }) + + # TODO: 'invoice_line_1' has no reason to match 'bank_line_1' here... to check + # self._check_statement_matching(self.rule_1, { + # self.bank_line_1: {'amls': self.invoice_line_1, 'model': self.rule_1}, + # self.bank_line_2: {'amls': []}, + # }, self.bank_st) + + def test_inv_matching_rule_auto_rec_no_partner_with_writeoff(self): + self.invoice_line_1.move_id.ref = "doudlidou3555" + + self.bank_line_1.write({ + 'payment_ref': 'doudlidou3555', + 'partner_id': None, + 'amount': 95, + }) + + self.rule_1.write({ + 'match_partner': False, + 'match_label': 'contains', + 'match_label_param': 'doudlidou', # So that we only match what we want to test + 'payment_tolerance_param': 10.0, + 'auto_reconcile': True, + }) + + # Check bank reconciliation + + self._check_statement_matching(self.rule_1, { + self.bank_line_1: { + 'amls': self.invoice_line_1, + 'model': self.rule_1, + 'status': 'write_off', + 'auto_reconcile': True, + }, + self.bank_line_2: {}, + }) + + def test_partner_mapping_rule(self): + st_line = self._create_st_line(partner_id=None, payment_ref=None) + + rule = self._create_reconcile_model( + partner_mapping_line_ids=[{ + 'partner_id': self.partner_1.id, + 'payment_ref_regex': 'toto.*', + }], + ) + + # No match because the reference is not matching the regex. + self.assertEqual(st_line._retrieve_partner(), self.env['res.partner']) + + st_line.payment_ref = "toto42" + + # Matching using the regex on payment_ref. + self.assertEqual(st_line._retrieve_partner(), self.partner_1) + + rule.partner_mapping_line_ids.narration_regex = ".*coincoin" + + # No match because the narration is not matching the regex. + self.assertEqual(st_line._retrieve_partner(), self.env['res.partner']) + + st_line.narration = "42coincoin" + + # Matching is back thanks to "coincoin". + self.assertEqual(st_line._retrieve_partner(), self.partner_1) + + # More complex matching to match something from bank sync data. + # Note: the indentation is done with multiple \n to mimic the bank sync behavior. Keep them for this test! + rule.partner_mapping_line_ids.narration_regex = ".*coincoin.*" + st_line.narration = """ + { + "informations": "coincoin turlututu tsoin tsoin", + } + """ + + # Same check with json data into the narration field. + self.assertEqual(st_line._retrieve_partner(), self.partner_1) + + def test_move_name_caba_tax_account(self): + self.env.company.tax_exigibility = True + tax_account = self.company_data['default_account_tax_sale'] + tax_account.reconcile = True + self.rule_1.write({ + 'match_partner': False, + 'payment_tolerance_param': 20.0, + 'auto_reconcile': True, + }) + + caba_tax = self.env['account.tax'].create({ + 'name': "CABA", + 'amount_type': 'percent', + 'amount': 20.0, + 'tax_exigibility': 'on_payment', + 'cash_basis_transition_account_id': self.safe_copy(tax_account).id, + 'invoice_repartition_line_ids': [ + Command.create({ + 'repartition_type': 'base', + }), + Command.create({ + 'repartition_type': 'tax', + 'account_id': tax_account.id, + }), + ], + }) + + invoice = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': self.partner_a.id, + 'invoice_date': '2021-07-01', + 'invoice_line_ids': [ + Command.create({ + 'name': "test", + 'price_unit': 100, + 'tax_ids': [Command.set(caba_tax.ids)], + }), + ] + }) + invoice.action_post() + self.env['account.bank.statement.line'].create({ + 'amount': 100.0, + 'date': '2019-01-01', + 'payment_ref': invoice.name, + 'journal_id': self.company_data['default_journal_bank'].id, + }) + with freeze_time('2019-01-01'): + self.env['account.bank.statement.line']._cron_try_auto_reconcile_statement_lines() + caba_move = invoice.tax_cash_basis_created_move_ids + self.assertEqual(caba_move.line_ids[0].move_name, caba_move.name) + + def test_match_multi_currencies(self): + ''' Ensure the matching of candidates is made using the right statement line currency. + + In this test, the value of the statement line is 100 USD = 300 GOL = 900 DAR and we want to match two journal + items of: + - 100 USD = 200 GOL (= 600 DAR from the statement line point of view) + - 14 USD = 280 DAR + + Both journal items should be suggested to the user because they represents 98% of the statement line amount + (DAR). + ''' + partner = self.env['res.partner'].create({'name': 'Bernard Perdant'}) + + journal = self.env['account.journal'].create({ + 'name': 'test_match_multi_currencies', + 'code': 'xxxx', + 'type': 'bank', + 'currency_id': self.other_currency.id, + }) + + matching_rule = self.env['account.reconcile.model'].create({ + 'name': 'test_match_multi_currencies', + 'rule_type': 'invoice_matching', + 'match_partner': True, + 'match_partner_ids': [(6, 0, partner.ids)], + 'allow_payment_tolerance': True, + 'payment_tolerance_type': 'percentage', + 'payment_tolerance_param': 5.0, + 'match_same_currency': False, + 'company_id': self.company_data['company'].id, + 'past_months_limit': False, + 'match_text_location_label': False, + }) + + statement_line = self.env['account.bank.statement.line'].create({ + 'journal_id': journal.id, + 'date': '2016-01-01', + 'payment_ref': 'line', + 'partner_id': partner.id, + 'foreign_currency_id': self.other_currency_2.id, + 'amount': 300.0, # Rate is 3 GOL = 1 USD in 2016. + 'amount_currency': 900.0, # Rate is 10 DAR = 1 USD in 2016 but the rate used by the bank is 9:1. + }) + + move = self.env['account.move'].create({ + 'move_type': 'entry', + 'date': '2017-01-01', + 'journal_id': self.company_data['default_journal_misc'].id, + 'line_ids': [ + # Rate is 2 GOL = 1 USD in 2017. + # The statement line will consider this line equivalent to 600 DAR. + (0, 0, { + 'account_id': self.company_data['default_account_receivable'].id, + 'partner_id': partner.id, + 'currency_id': self.other_currency.id, + 'debit': 100.0, + 'credit': 0.0, + 'amount_currency': 200.0, + }), + # Rate is 20 GOL = 1 USD in 2017. + (0, 0, { + 'account_id': self.company_data['default_account_receivable'].id, + 'partner_id': partner.id, + 'currency_id': self.other_currency_2.id, + 'debit': 14.0, + 'credit': 0.0, + 'amount_currency': 280.0, + }), + # Line to balance the journal entry: + (0, 0, { + 'account_id': self.company_data['default_account_revenue'].id, + 'debit': 0.0, + 'credit': 114.0, + }), + ], + }) + move.action_post() + + move_line_1 = move.line_ids.filtered(lambda line: line.debit == 100.0) + move_line_2 = move.line_ids.filtered(lambda line: line.debit == 14.0) + + self._check_statement_matching(matching_rule, { + statement_line: {'amls': move_line_1 + move_line_2, 'model': matching_rule} + }) + + @freeze_time('2020-01-01') + def test_matching_with_write_off_foreign_currency(self): + journal_foreign_curr = self.company_data['default_journal_bank'].copy() + journal_foreign_curr.currency_id = self.other_currency + + reco_model = self._create_reconcile_model( + auto_reconcile=True, + rule_type='writeoff_suggestion', + line_ids=[{ + 'amount_type': 'percentage', + 'amount': 100.0, + 'account_id': self.company_data['default_account_revenue'].id, + }], + ) + + st_line = self._create_st_line(amount=100.0, payment_ref='123456', journal_id=journal_foreign_curr.id) + self._check_statement_matching(reco_model, { + st_line: { + 'model': reco_model, + 'status': 'write_off', + 'auto_reconcile': True, + }, + }) + + def test_payment_similar_communications(self): + def create_payment_line(amount, memo, partner): + payment = self.env['account.payment'].create({ + 'amount': amount, + 'payment_type': 'inbound', + 'partner_type': 'customer', + 'partner_id': partner.id, + 'memo': memo, + 'destination_account_id': self.company_data['default_account_receivable'].id, + }) + payment.action_post() + + return payment.move_id.line_ids.filtered(lambda x: x.account_id.account_type not in {'asset_receivable', 'liability_payable'}) + + payment_partner = self.env['res.partner'].create({ + 'name': "Bernard Gagnant", + }) + + self.rule_1.match_partner_ids = [(6, 0, payment_partner.ids)] + + pmt_line_1 = create_payment_line(500, 'a1b2c3', payment_partner) + pmt_line_2 = create_payment_line(500, 'a1b2c3', payment_partner) + create_payment_line(500, 'd1e2f3', payment_partner) + + self.bank_line_1.write({ + 'amount': 1000, + 'payment_ref': 'a1b2c3', + 'partner_id': payment_partner.id, + }) + self.bank_line_2.unlink() + self.rule_1.allow_payment_tolerance = False + + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {'amls': pmt_line_1 + pmt_line_2, 'model': self.rule_1, 'status': 'write_off'}, + }) + + def test_no_amount_check_keep_first(self): + """ In case the reconciliation model doesn't check the total amount of the candidates, + we still don't want to suggest more than are necessary to match the statement. + For example, if a statement line amounts to 250 and is to be matched with three invoices + of 100, 200 and 300 (retrieved in this order), only 100 and 200 should be proposed. + """ + self.rule_1.allow_payment_tolerance = False + self.rule_1.match_text_location_label = False + self.bank_line_2.amount = 250 + self.bank_line_1.partner_id = None + + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {}, + self.bank_line_2: { + 'amls': self.invoice_line_1 + self.invoice_line_2, + 'model': self.rule_1, + 'status': 'write_off', + }, + }) + + def test_no_amount_check_exact_match(self): + """ If a reconciliation model finds enough candidates for a full reconciliation, + it should still check the following candidates, in case one of them exactly + matches the amount of the statement line. If such a candidate exist, all the + other ones are disregarded. + """ + self.rule_1.allow_payment_tolerance = False + self.rule_1.match_text_location_label = False + self.bank_line_2.amount = 300 + self.bank_line_1.partner_id = None + + self._check_statement_matching(self.rule_1, { + self.bank_line_1: {}, + self.bank_line_2: { + 'amls': self.invoice_line_3, + 'model': self.rule_1, + 'status': 'write_off', + }, + }) + + @freeze_time('2019-01-01') + def test_invoice_matching_using_match_text_location(self): + rule = self._create_reconcile_model( + match_partner=False, + allow_payment_tolerance=False, + match_text_location_label=False, + match_text_location_reference=False, + match_text_location_note=False, + ) + st_line = self._create_st_line(amount=1000, partner_id=False) + invoice = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': self.partner_a.id, + 'invoice_date': '2019-01-01', + 'invoice_line_ids': [Command.create({ + 'product_id': self.product_a.id, + 'price_unit': 100, + })], + }) + invoice.action_post() + term_line = invoice.line_ids.filtered(lambda x: x.display_type == 'payment_term') + + # No match at all. + self.assertDictEqual( + rule._apply_rules(st_line, None), + {}, + ) + + with closing(self.cr.savepoint()): + term_line.name = "1234" + st_line.payment_ref = "1234" + + # Matching if no checkbox checked. + self.assertDictEqual( + rule._apply_rules(st_line, None), + {'amls': term_line, 'model': rule}, + ) + + # No matching if other checkbox is checked. + rule.match_text_location_note = True + self.assertDictEqual( + rule._apply_rules(st_line, None), + {}, + ) + + with closing(self.cr.savepoint()): + # Test Matching on exact_token. + term_line.name = "PAY-123" + st_line.payment_ref = "PAY-123" + + # Matching if no checkbox checked. + self.assertDictEqual( + rule._apply_rules(st_line, None), + {'amls': term_line, 'model': rule}, + ) + + with self.subTest(rule_field='match_text_location_label', st_line_field='payment_ref'): + with closing(self.cr.savepoint()): + term_line.name = '' + st_line.payment_ref = '/?' + + # No exact matching when the term line name is an empty string + self.assertDictEqual( + rule._apply_rules(st_line, None), + {}, + ) + + for rule_field, st_line_field in ( + ('match_text_location_label', 'payment_ref'), + ('match_text_location_reference', 'ref'), + ('match_text_location_note', 'narration'), + ): + with self.subTest(rule_field=rule_field, st_line_field=st_line_field): + + with closing(self.cr.savepoint()): + rule[rule_field] = True + st_line[st_line_field] = "123456" + term_line.name = "123456" + + # Matching if the corresponding flag is enabled. + self.assertDictEqual( + rule._apply_rules(st_line, None), + {'amls': term_line, 'model': rule}, + ) + + # It works also if the statement line contains the word. + st_line[st_line_field] = "payment for 123456 urgent!" + self.assertDictEqual( + rule._apply_rules(st_line, None), + {'amls': term_line, 'model': rule}, + ) + + # Not if the invoice has nothing in common even if numerical. + term_line.name = "78910" + self.assertDictEqual( + rule._apply_rules(st_line, None), + {}, + ) + + # Exact matching on a single word. + st_line[st_line_field] = "TURLUTUTU21" + term_line.name = "TURLUTUTU21" + self.assertDictEqual( + rule._apply_rules(st_line, None), + {'amls': term_line, 'model': rule}, + ) + + # No matching if not enough numerical values. + st_line[st_line_field] = "12" + term_line.name = "selling 3 apples, 2 tomatoes and 12kg of potatoes" + self.assertDictEqual( + rule._apply_rules(st_line, None), + {}, + ) + + invoice2 = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': self.partner_a.id, + 'invoice_date': '2019-01-01', + 'invoice_line_ids': [Command.create({ + 'product_id': self.product_a.id, + 'price_unit': 100, + })], + }) + invoice2.action_post() + term_lines = (invoice + invoice2).line_ids.filtered(lambda x: x.display_type == 'payment_term') + + # Matching multiple invoices. + rule.match_text_location_label = True + st_line.payment_ref = "paying invoices 1234 & 5678" + term_lines[0].name = "INV/1234" + term_lines[1].name = "INV/5678" + self.assertDictEqual( + rule._apply_rules(st_line, None), + {'amls': term_lines, 'model': rule}, + ) + + # Matching multiple invoices sharing the same reference. + term_lines[1].name = "INV/1234" + self.assertDictEqual( + rule._apply_rules(st_line, None), + {'amls': term_lines, 'model': rule}, + ) + + def test_amount_check_amount_last(self): + """ In case the reconciliation model can't match via text or partner matching + we do a last check to find amls with the exact amount + """ + self.rule_1.write({ + 'match_text_location_label': False, + 'match_partner': False, + 'match_partner_ids': [Command.clear()], + }) + self.bank_line_1.partner_id = None + self.bank_line_1.payment_ref = False + + self._check_statement_matching(self.rule_1, { + self.bank_line_1: { + 'amls': self.invoice_line_1, + 'model': self.rule_1, + }, + }) + + # Create bank statement in foreign currency + partner = self.env['res.partner'].create({'name': 'Bernard Gagnant'}) + invoice_line = self._create_invoice_line(300, partner, 'out_invoice', currency=self.other_currency_2) + bank_line_2 = self.env['account.bank.statement.line'].create({ + 'journal_id': self.bank_journal.id, + 'partner_id': False, + 'payment_ref': False, + 'foreign_currency_id': self.other_currency_2.id, + 'amount': 15.0, + 'amount_currency': 300.0, + }) + self._check_statement_matching(self.rule_1, { + bank_line_2: { + 'amls': invoice_line, + 'model': self.rule_1, + }, + }) + + @freeze_time('2019-01-01') + def test_matching_exact_amount_no_partner(self): + """ In case the reconciliation model can't match via text or partner matching + we do a last check to find amls with the exact amount. + """ + self.rule_1.write({ + 'match_text_location_label': False, + 'match_partner': False, + 'match_partner_ids': [Command.clear()], + }) + self.bank_line_1.partner_id = None + self.bank_line_1.payment_ref = False + + with self.subTest(test='single_currency'): + st_line = self._create_st_line(amount=100, payment_ref=None, partner_id=None) + invl = self._create_invoice_line(100, self.partner_1, 'out_invoice') + self._check_statement_matching(self.rule_1, { + st_line: { + 'amls': invl, + 'model': self.rule_1, + }, + }) + + with self.subTest(test='rounding'): + st_line = self._create_st_line(amount=-208.73, payment_ref=None, partner_id=None) + invl = self._create_invoice_line(208.73, self.partner_1, 'in_invoice') + self._check_statement_matching(self.rule_1, { + st_line: { + 'amls': invl, + 'model': self.rule_1, + }, + }) + + with self.subTest(test='multi_currencies'): + foreign_curr = self.other_currency_2 + invl = self._create_invoice_line(300, self.partner_1, 'out_invoice', currency=foreign_curr) + st_line = self._create_st_line( + amount=15.0, foreign_currency_id=foreign_curr.id, amount_currency=300.0, + payment_ref=None, partner_id=None, + ) + self._check_statement_matching(self.rule_1, { + st_line: { + 'amls': invl, + 'model': self.rule_1, + }, + }) diff --git a/dev_odex30_accounting/odex30_account_accountant/tests/test_signature.py b/dev_odex30_accounting/odex30_account_accountant/tests/test_signature.py new file mode 100644 index 0000000..2099d9c --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/tests/test_signature.py @@ -0,0 +1,88 @@ +import base64 + +from odoo import Command +from odoo.tests import tagged +from odoo.addons.account.tests.common import AccountTestInvoicingCommon + + +@tagged('post_install', '-at_install') +class TestInvoiceSignature(AccountTestInvoicingCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + if cls.env.ref('base.module_sign').state != 'installed': + cls.skipTest(cls, "`sign` module not installed") + + cls.env.company.sign_invoice = True + + cls.signature_fake_1 = base64.b64encode(b"fake_signature_1") + cls.signature_fake_2 = base64.b64encode(b"fake_signature_2") + + cls.user.sign_signature = cls.signature_fake_1 + cls.another_user = cls.env['res.users'].create({ + 'name': 'another accountant', + 'login': 'another_accountant', + 'password': 'another_accountant', + 'groups_id': [ + Command.set(cls.env.ref('account.group_account_user').ids), + ], + 'sign_signature': cls.signature_fake_2, + }) + + cls.invoice = cls.env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': cls.partner_a.id, + 'journal_id': cls.company_data['default_journal_sale'].id, + 'invoice_line_ids': [ + Command.create({ + 'product_id': cls.product_a.id, + 'quantity': 1, + 'price_unit': 1, + }) + ] + }) + + def test_draft_invoice_shouldnt_have_signature(self): + self.assertEqual(self.invoice.state, 'draft') + self.assertFalse(self.invoice.show_signature_area, "the signature area shouldn't appear on a draft invoice") + + def test_posted_invoice_should_have_signature(self): + self.invoice.action_post() + self.assertTrue(self.invoice.show_signature_area, + "the signature area should appear on posted invoice when the `sign_invoice` settings is True") + + def test_invoice_from_company_without_signature_settings_shouldnt_have_signature(self): + self.env.company.sign_invoice = False + self.invoice.action_post() + self.assertFalse(self.invoice.show_signature_area, + "the signature area shouldn't appear when the `sign_invoice` settings is False") + + def test_invoice_signing_user_should_be_the_user_that_posted_it(self): + self.assertFalse(self.invoice.signing_user, + "invoice that weren't created by automated action shouldn't have a signing user") + self.assertEqual(self.invoice.signature, False, "There shouldn't be any signature if there isn't a signing user") + self.invoice.action_post() + self.assertEqual(self.invoice.signing_user, self.user, "The signing user should be the user that posted the invoice") + self.assertEqual(self.invoice.signature, self.signature_fake_1, "The signature should be from `self.user`") + + self.invoice.button_draft() + self.invoice.with_user(self.another_user).action_post() + self.assertEqual(self.invoice.signing_user, self.another_user, + "The signing user should be the user that posted the invoice") + self.assertEqual(self.invoice.signature, self.signature_fake_2, "The signature should be from `self.another_user`") + + def test_invoice_signing_user_should_be_reprensative_user_if_there_is_one(self): + self.env.company.signing_user = self.user # set the representative user of the company + invoice = self.invoice.with_user(self.another_user) + invoice.action_post() + self.assertEqual(invoice.signing_user, self.user, "The signing user should be the representative person set in the settings") + self.assertEqual(invoice.signature, self.signature_fake_1, "The signature should be from `self.another_user`, the representative user") + + def test_setting_representative_user_shouldnt_change_signer_of_already_posted_invoice(self): + # Note: Changing this behavior might not be a good idea as having all account.move updated at once + # would be very costly + self.invoice.action_post() + self.env.company.signing_user = self.another_user # set the representative user of the company + self.assertEqual(self.invoice.signing_user, self.user, + "The signing user should be the one that posted the invoice even if a representative has been added later on") + self.assertEqual(self.invoice.signature, self.signature_fake_1, "The signature should be from `self.user`") diff --git a/dev_odex30_accounting/odex30_account_accountant/tests/test_ui.py b/dev_odex30_accounting/odex30_account_accountant/tests/test_ui.py new file mode 100644 index 0000000..93e7c36 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/tests/test_ui.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import logging + +from odoo import Command, fields +from odoo.addons.account.tests.common import AccountTestMockOnlineSyncCommon +import odoo.tests + +_logger = logging.getLogger(__name__) + + +@odoo.tests.tagged('-at_install', 'post_install') +class TestUi(AccountTestMockOnlineSyncCommon): + def test_accountant_tour(self): + # Reset country and fiscal country, so that fields added by localizations are + # hidden and non-required, and don't make the tour crash. + # Also remove default taxes from the company and its accounts, to avoid inconsistencies + # with empty fiscal country. + self.env.company.write({ + 'country_id': None, # Also resets account_fiscal_country_id + 'account_sale_tax_id': None, + 'account_purchase_tax_id': None, + }) + + # An unconfigured bank journal is required for the connect bank step + self.env['account.journal'].create({ + 'type': 'bank', + 'name': 'Empty Bank', + 'code': 'EBJ', + }) + + account_with_taxes = self.env['account.account'].search([('tax_ids', '!=', False), ('company_ids', '=', self.env.company.id)]) + account_with_taxes.write({ + 'tax_ids': [Command.clear()], + }) + # This tour doesn't work with demo data on runbot + all_moves = self.env['account.move'].search([('company_id', '=', self.env.company.id), ('move_type', '!=', 'entry')]) + all_moves.filtered(lambda m: not m.inalterable_hash and not m.deferred_move_ids and m.state != 'draft').button_draft() + all_moves.with_context(force_delete=True).unlink() + # We need at least two bank statement lines to reconcile for the tour. + bnk = self.env['account.account'].create({ + 'code': 'X1014', + 'name': 'Bank Current Account - (test)', + 'account_type': 'asset_cash', + }) + journal = self.env['account.journal'].create({ + 'name': 'Bank - Test', + 'code': 'TBNK', + 'type': 'bank', + 'default_account_id': bnk.id, + }) + self.env['account.bank.statement.line'].create([{ + 'journal_id': journal.id, + 'amount': 100, + 'date': fields.Date.today(), + 'payment_ref': 'stl_0001', + }, { + 'journal_id': journal.id, + 'amount': 200, + 'date': fields.Date.today(), + 'payment_ref': 'stl_0002', + }]) + self.start_tour("/odoo", 'odex30_account_accountant_tour', login="admin") diff --git a/dev_odex30_accounting/odex30_account_accountant/views/account_fiscal_year_view.xml b/dev_odex30_accounting/odex30_account_accountant/views/account_fiscal_year_view.xml new file mode 100644 index 0000000..d41d4bf --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/views/account_fiscal_year_view.xml @@ -0,0 +1,53 @@ + + + + Fiscal Years + account.fiscal.year + list,form + +

    + Click here to create a new fiscal year. +

    + + + + + account.fiscal.year.form + account.fiscal.year + +
    + + + + + + + + +
    +
    +
    + + + account.fiscal.year.search + account.fiscal.year + + + + + + + + + account.fiscal.year.list + account.fiscal.year + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_accountant/views/account_journal_dashboard_views.xml b/dev_odex30_accounting/odex30_account_accountant/views/account_journal_dashboard_views.xml new file mode 100644 index 0000000..0af6058 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/views/account_journal_dashboard_views.xml @@ -0,0 +1,44 @@ + + + account.journal.dashboard.kanban + account.journal + + + + + + + + + + + + Last Statement + + + + + +
    + +
    + +
    +
    +
    +
    + + + +
    +
    +
    diff --git a/dev_odex30_accounting/odex30_account_accountant/views/account_move_views.xml b/dev_odex30_accounting/odex30_account_accountant/views/account_move_views.xml new file mode 100644 index 0000000..a7b3508 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/views/account_move_views.xml @@ -0,0 +1,145 @@ + + + + account.move.line.list + account.move.line + + extension + + + account_move_line_list + + +
    +
    + + +
    + + + + + + matching_link_widget + +
    +
    + + + account.move.line.payment.list + account.move.line + + extension + + + + + + + + + + + + + + + + account.move.line.deferral.entries.list + account.move.line + + primary + + + date + + + hide + + + hide + + + hide + + + hide + + + hide + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + +
    diff --git a/dev_odex30_accounting/odex30_account_accountant/views/account_payment_views.xml b/dev_odex30_accounting/odex30_account_accountant/views/account_payment_views.xml new file mode 100644 index 0000000..d1e2415 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/views/account_payment_views.xml @@ -0,0 +1,21 @@ + + + + account.payment.form.inherit.odex30_account_accountant + account.payment + + + + account.group_account_user + + + + + +
    + + + + + diff --git a/dev_odex30_accounting/odex30_account_accountant/views/bank_rec_widget_views.xml b/dev_odex30_accounting/odex30_account_accountant/views/bank_rec_widget_views.xml new file mode 100644 index 0000000..51afa7a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/views/bank_rec_widget_views.xml @@ -0,0 +1,469 @@ + + + + + account.bank.statement.form.bank_rec_widget + account.bank.statement + 10 + +
    + + +
    + +
    + + + + + + + + + + + +
    +
    + + + + + + + + Create Statement + account.bank.statement + form + + new + {'dialog_size': 'medium', 'show_running_balance_latest': True} + + + + + account.bank.statement.line.search.bank_rec_widget + account.bank.statement.line + 999 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + account.bank.statement.line.kanban.bank_rec_widget + account.bank.statement.line + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    +
    + + +
    + +
    + To check +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + account.bank.statement.line.list.bank_rec_widget + account.bank.statement.line + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + account.bank.statement.line.form.bank_rec_widget + account.bank.statement.line + +
    + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + account.bank.statement.line.form.bank_rec_widget + account.bank.statement.line + +
    + + + + + + + + + + +
    + + + New Transaction + account.bank.statement.line + form + + new + + + + + Bank Reconciliation + account.bank.statement.line + list,kanban + + + reconciliation_list + [('state', '!=', 'cancel')] + {'default_journal_id': active_id, 'search_default_journal_id': active_id} + +

    Nothing to do here!

    +

    No transactions matching your filters were found.

    +
    +
    + + + Bank Reconciliation + account.bank.statement.line + kanban,list + + + reconciliation + [('state', '!=', 'cancel')] + {'default_journal_id': active_id, 'search_default_journal_id': active_id} + +

    Nothing to do here!

    +

    No transactions matching your filters were found.

    +
    +
    + + + account.move.form.bank_rec_widget + account.move + 999 + +
    + + +
    +
    + + + + account.move.line.search.bank_rec_widget + account.move.line + 999 + + + + + + + + + + + + + + + + + + + + + + + account.move.line.list.bank_rec_widget + account.move.line + 999 + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + +
    diff --git a/dev_odex30_accounting/odex30_account_accountant/views/odex30_account_accountant_menuitems.xml b/dev_odex30_accounting/odex30_account_accountant/views/odex30_account_accountant_menuitems.xml new file mode 100644 index 0000000..9826c54 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/views/odex30_account_accountant_menuitems.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_accountant/views/odex30_account_reconcile_views.xml b/dev_odex30_accounting/odex30_account_accountant/views/odex30_account_reconcile_views.xml new file mode 100644 index 0000000..dd6f4f6 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/views/odex30_account_reconcile_views.xml @@ -0,0 +1,122 @@ + + + + account.move.line.reconcile.search + account.move.line + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + account.move.line.list.reconcile + account.move.line + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + + + Reconcile automatically + account.auto.reconcile.wizard + form + new + + + + + Journal Items to reconcile + account.move.line + reconcile + list + + + [('display_type', 'not in', ('line_section', 'line_note')), ('account_id.reconcile', '=', True), ('parent_state', '=', 'posted'), ('full_reconcile_id', '=', False)] + {'journal_type': 'general', 'search_default_unreconciled': True, 'search_default_group_by_account': True, 'search_default_group_by_partner': True} + +
    diff --git a/dev_odex30_accounting/odex30_account_accountant/views/product_views.xml b/dev_odex30_accounting/odex30_account_accountant/views/product_views.xml new file mode 100644 index 0000000..5343473 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/views/product_views.xml @@ -0,0 +1,26 @@ + + + + res.partner.form + res.partner + + + + account.group_account_user + + + + + + + product.template.form.inherit + product.template + 5 + + + + account.group_account_readonly + + + + diff --git a/dev_odex30_accounting/odex30_account_accountant/views/report_invoice.xml b/dev_odex30_accounting/odex30_account_accountant/views/report_invoice.xml new file mode 100644 index 0000000..8949cdc --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/views/report_invoice.xml @@ -0,0 +1,18 @@ + + + + diff --git a/dev_odex30_accounting/odex30_account_accountant/views/res_config_settings_views.xml b/dev_odex30_accounting/odex30_account_accountant/views/res_config_settings_views.xml new file mode 100644 index 0000000..505d82b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/views/res_config_settings_views.xml @@ -0,0 +1,98 @@ + + + + res.config.settings.view.form.inherit.account.accountant + res.config.settings + + + + +
    +
    +
    +
    +
    + + + + + +
    +
    +
    +
    + + 0 + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    diff --git a/dev_odex30_accounting/odex30_account_accountant/wizard/__init__.py b/dev_odex30_accounting/odex30_account_accountant/wizard/__init__.py new file mode 100644 index 0000000..31b7ccd --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/wizard/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import account_change_lock_date +from . import account_auto_reconcile_wizard +from . import account_reconcile_wizard diff --git a/dev_odex30_accounting/odex30_account_accountant/wizard/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/wizard/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..521c77df7c6cf1805e7e0cf2e93becc27736bd43 GIT binary patch literal 436 zcmZ9Iy-ve05P(5}1y8;^i^n{HGc zx-hX->eh)%(^e^`)7|I$@tytIY8?=i@ApSNNB>hEwi0Y$d5Z8sB#|^DIZY@nIY17Q zV9gT)m4M&#HYHfHv9#w4X++=1p#8k*Ql({%!de!#gyK ckW#v65_&Qr$90{Ov&p_r_X~E#u8H^j0Vu43ZU6uP literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_accountant/wizard/__pycache__/account_auto_reconcile_wizard.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/wizard/__pycache__/account_auto_reconcile_wizard.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..779c5e9b11ea1758ac7087fbbc1b4848d38548a4 GIT binary patch literal 11487 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 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_accountant/wizard/__pycache__/account_reconcile_wizard.cpython-311.pyc b/dev_odex30_accounting/odex30_account_accountant/wizard/__pycache__/account_reconcile_wizard.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e65aab346be54efcd2acf72ddf79c5714d600c2e GIT binary patch literal 47001 zcmc(|2~b>FmL=#bIN;z8?(Cbhi5;;CNoYe7Ahe+kErFy!4&Q~4z@7N++6c%{R!3E! z7)>{w9ciJ;R#{Qqk`S<7rPXa4v3V|e>iSgEWhZMw|LW{8f+ zp6IZ)t~vMp-5o-anUPkG^Zft!@7wNs@4ox)yZ8Qom7AMw!DoHt{LEkdbBpEQ(~bIZ zDi@zG~0; zGUNJ8XqJm6Gv*=yh$gKQ1b;pn;)i%X!Z+KJnbUma_Wb1ir2X8P6L^??J;KigV<&>) z=_#dn_LHOBe7@kaSl$CtLY8qWXBoF~)^R&$8+UN_aVO^(&j@AS1cdxqwp_Pz&UalO z($jM8|&CTU< zc~3nlP#y;5)$;Ok`G6`&fyz(G%g6b-!ly+kPz5P@6>}w<$* z634ic+-TbT?*LTh&Fvc2PnpL&clupR3YF?iNpU76#o4qJT`4KfrKA{3OVOQ@BDIY3 zX(@VAQ*al!i{}33E~TaFO-c1eO3lX8QtU`caXBT$m9!LnDJia|qDN<{7JuSuF*QA(EOR+B{#SLyI z1zR`M((F%3liKgM(o!5?DF(E8GMm!&xwI4qS&Bniid1Zc(^4GfBJWzp2f2BKL)=>k zhq-%P^j+)t5iW+i5$-m^qud>Y$GE!)k1t#9S;tR+3A&#wIyf~IxgCz34NXPDQ!}%n zi!%#Bo?F--7`rhO4cujS0bJdVhPXg165v(9Kr}QPnu;MdC}+_z7r7Jan4JlSIs#vn zsF50chn&|!rBb4n(@Zcn6A3FtjZJAQHE=*oB{6QFXCVB(^*!f@mYBA(T2g4ts^N)> zKZ|A2YR35zc&tV19V>5Jw4JjoT5f9P-PBmbRgG)X^Ra+cHRr_HZ?P27>R%}rhdGyM zMNFgb7E4T{yeQ9UhBV*(j@4KyXD`*Nx|*q78ZL~`dP_Nnp3a>A`_6|>o%dX_$9#Hb zi*_?CmvM_>j6b|(TQWJekEFuh{b(@Z2VzZZKu!Ejf_h&~tkFMaNUOIjz+atJI(0^r+Xs zw#HAJQ%qYIF=qDykVb5C?r1WXX4(YJw22w)N8G`w*bE}rw&bgPb>?Z)F`2CZ0C-^= zo7Yppa3B(%y&sqi$uk=h@Mh#T9}dn2W@4ea=-(2876#vl+zx24+EfmN!ZCg(MC2iM zBXE13=tAsnB*4vFzaHZ8P$db`{y;-?!PXW?y1AL?{A}?4L^wDXnljE*;^k;;ecp-S z`_>OFGnkcE3zjfTIm<(|Tpyt~0U>{8tpCjR$OmlLsBw&f0Tnz|`bSp23_s2Gq^+Y9 zJGi-7p0bb9Tnz*seD%+^--yhGwg+c#-3Tu5H)pn=zCU#%$j_bTBR4_MqT8{#yVui+ zpGc&=YgdPS#bUcVCzQfw!qeNi(47ex))=eSM)?hfW7}oIw_Sarp>aZf&@q4itL(kB z{hW%-&F^36JGd!H?ojrr6Vsts$KKhF)J=g0Jncfha_yZB&P{T`{R_RnQoEH@wa6n%+b^{GdF+#SgtHUEwV-r% zQaU>qKQQ;e!UymW+k9X2Mv#l#4RI3~5fgWUv$sRh=KQ2HdV4;^YeE1*ZqgnK-$`a- zJ&c9!;SNzektm+%S2AOgkKDzUpT=0yJ{t-r9XBI0VF(3+^YbAt>AF5M8^a{vk}VTc zH$qdlsJ!Sz=-$lq%;e1MOzi#ygaQ-lAdnY7o=A4m9;L!DNt-j14y>-%lR2`)0aHDS zCwwTHbSa}K%5S48QST(PCMKq4gVE^3M3nLg&}TqKFW-cSh1%C+mS|7(Jm_^RC3~NbeR4_Kck<<|wC}Q5az!e+vYean1teeVvg^~F zyybfj_dVM8xGSDhA>>rBOcUM<39tXdtnXz#Zu-ORKiIz3A(riy%65z1e#zVanbTgG z_k{()XBNB9gDam0lO)%(;j&cM39fQI(}VGxN+G9m!)BTxY(~8*Z(1+!ikEi@-E-Pk zEDuZN;SDFik#`-HQkN&VtC4e7(Yk9O?ivuz-w<2_qH9KS%?PfUPXmn~<*c2Q+V+Wo z{Ze4RP<>$8zI;k_RU|wG%h_z$F65xgJBTU-!}pWE3A(x+3$b6sfZ{bfl5WJ3Jc?1) zq>B%|b$f<}AFeRqLE~vCvvhnR4Tj>ASUdtW8KWkCuG!A_<9RY83fdl?=Jyb=M;UG% z%I`w{S&jcw234|Ds}~Jwg{Vz%K}gW#EcyM&ir+{1l^vWTZZj|w4k*nEOx@ zhFr6xmo>rwzEFEuDT2@iHaLL!o5H*ra1i2VVr(VGyr-r%+xUZ8^SwiO8ldh9$WN1H zI(%xu$yyDuI*^=9L(y=vQ^u}V1}IuA!iRX`7m|TZaxfKx+A&;E=Ohc#p_{D?)yYcj zQ50ii7DG_M32W*?-oe?~$lbtvkdMt^SxOdb;6ZvYp+0DK=wpFDN@!u#tk%F)F2S5E z=@>*GC3AH!+~agI;AeJCfP+giJQKl9|eMSU8Nrxez^}aivya7-$JK zw*{ISm6wT5?_=?dA zLNuD1%sj1J6lqCf5!MZON-fSvEr3RV-oB*sL~t@R`&HIO9_(QIsq5D02ofe4Yc|-tTXH<`K#htfTebSrL!z^x2{{pXo4Y|ijIfG(1YoW|LQ*aQq(u9ng^K<7D49H+L4ShP-P*N@6L z%Q*{AY$1A*u}9hZGVmiC-%EogL*~4rj1dhmMwH);2MaAq52@Hu#33D8GxfZ_2l(g? z1P?5)ipn-D)~v%;Ib0r21hz?m-e+f|z)mS}Xn9z2R|@XR4Z9A*)^}Dv6AtL`f#HC| zg@S{&C96^B0eon!)rA*`rF87G07likh2*TaSQ=nT6KyW)3t0HTxr&B#7~1CLBNJb{QU`FIV7o8|Q(WpxCBhE1MfleaDpf7;T%c3tW?Bz24m zXD&)-ZiyYY#Fkm9WmcGfE8g-J;kQw6Hxho;R1Ck#JkXJ;khc7oP)+D!sP4msg6cx^ zaEoLZkqzY0cwwJMMGSe?QEW4dHea;(2q2Sr=9MfRWhVi((DAxqXU^pb(wK+d6^5)U zKvtr@MXEn2)L(vaT^hbjsHqX$HG~=!hM~rU3K|m(75@V+6jYpF!v5|aX5R$j;Ipp^rn(CX0fiIf&Ipq#DcHIs1|=T#}N4WuKOU#qu_!urJ#9oJBjI z#i4Y)K2}TE`sm=J3!DRj0O!J+fr}wosG)QSqo53PDrXX4Yx`v69xXy3xmbcA+MJ9) ziZKPA8N3`Q%5?3;ZJQKbXnY|O@Is(K0w}J-C*eD1kk2`s`WGd@+(v!lRVNMaX z;b#ye^KJyA6D(&&2$LSVmkVVPJV}M3H2>NDO{PhsxZP47pv|Yv$KM}Oet(Dn;(!cG zaruTND+^=_0S3vbF~L1XgQFS0YopI662+BLaqEU9GZ!!jR_xf~eXwWM7x&c*zWO!0 z)U@aMRJ`e+&~z}-(7ZCbGMXqX`QY+uPrPuOP`GWaPHNfr!X9rqEVLX>Y-?FLmGISU zSZw)as}c5-=-st4Ecv?<{?e79FTdRIskM=3YPQaeB{RTLq%ID$v1LQ_zv4m}qW8^& zk+Z%FX|GNkQ>AoflDK3uN<=xEE@fKPhAoQHJ~Z@hYQ*!Vc1k>xDqprkqN$xvYRPf2 zXp3pmK9Wo8(p7WK%;yjo@L6guj~0mPG&@F3vzLfc5B@)|M{wL?W$3w@V@`3AsYu@L6*r_J$9JDFCcAmcG5lBNUCvkXaCS&VzFSZ$;fpvrnFU zr*XGX|4o|yCxDFp9s*_YvNKvsAr`OlD!G-<`lOyCxD=~KB!uN7Qu)a82`2Pdt&&PQ z*GqciCB4sPUkpow=cU0*!j3n@l5weIeEDditZuz*SG;W3^NPQWy&V48N%6?IbYxsC zyDXJ~#6LQ|e0(EQFO*@DpGJL5<3yW6Pw_;VLZ>lG3^F|P{835Nl({yB_-I?IE z#Zh~V3k-8@I+=(0zp!$)e`@9IPaSCkp8A1(9-UzW-Z{#j!9CVm2kn}Y)_u^lk+*dG zEIqI$owGA@GcizHHbOF@p&&nXBUz}3;8d$yOkSka0ZrD3Xc zy(6n+!-9Z#!1|9|LUX?q*s~ru6b~GN^k~qUm&h;tphPHZmGaxx^AE-I554G<4v&fX z=cWAf5Xb`JmA46kBwT=O7Zq=0T51kkAyldW+zC$3hLZWSGeJd`i5)0KVM|68prZ&`7|;5t zAbp#fj`2%Kx6u8%X_lVT|Acf=YMaI}#uyV6BPOV+Lu%SBH4O{LqC!)YaMmEW8;A>1 zfn=i%k$ZcMRiX1K8Gw zd3VZvKO@t(kQGKW)lud&vX$*U7DvXdCv(l4db@$hxfIx_a`2%LwadtCq5XB(Hf8(g zND`%V3Zk7^Z5tK@K(nV%@-$(*=e8xvYozk+QhEQ1>(idTXZQZ~zCYdf;$XaINaz__ zy|;SrW$#LcH80j1$qbo+;_src&3k1HPn2F6HTTNq%c!Ec#I4hk^EsPUO8V=DJxj{G~^PT~PZ6pqq0lcu| zbt7Wa%zlQX(RlLiXDt`rcOLn$B%u{o>TCnxgxL|hY)t_-$ z;NTsp~Txx7_Pm(-YYF>}$$FpP1ht1^?q^P=rx z?xNF-`S%MR7DR0;)x_w zv6jmfylZ*tGh=rtYcWgT2}U!C0=)0RzxVz8@FP5{Qge7%pse}FV+YhYu*6w61L~bI zrv)4`n{o8M$5`{5HEJp@gJ4tg)F_ZS4}x6Ee&|`uCb8iAUUr3yP}e@wT=MI~W3^T- z$@q)@GU74!rZy|lih32&tWSy-D41FHF6U$X*ttU1t9oH-Li~RH_<27sc3cN$bgJmv z86g-G8umtEBhfA_JNP=!ZH-f706# zkdNBv^h#!fqx#b{R)-e5&$~gqzHfgo+pH8BW6Xj)L{bJH_WF?6RzUOxl`@^Bxo5j) z5P#u`MidvI)HY?Gvh787k1AuDAd2?&4|9yWe|%_(Go|nq$p@Y z%FS@kS1dZ0GK?%8=h%#~F=J{eGaN9Mmy(0?o8+*VsWOXv>tcp6H(4u-|GE-jH33pKYY{hs+S`=+K$83y~M-x;Bd z@!O3~FNR&aEh(=M@LuLPt!$lIG zDq3w!Y?>@o4~8eM<2+ZTU-HSAqK8H6mjwt7ln?C&(Y+k zZ{s56%UaCe{&t$pfAkO5=r5?`A5suN0Ku+XWhEvelQ$QR9Sk$&jRznlSTFRo`93?Fhl9(jjM#yBg0mhyzQ426lY>3~I9yV2#+$cf^ zP0_(<&f|%>OggX6MuIU}Osbv~f-{=oZU<+fraT$tI|0VeQ7}M3I|As0-k#%W`^*H} zOa+yv9b$7{GF#KCh$ejs%P;|DR<(^h@#jgO)&#v}5b2UmDk9W}MiM4-O-#cpnXdw9 z3SWkX%4O`D+v#g(WOgbN#fo{U;%@wpXg{g{o$vq!wbS+><0kM!4cgc=}J|Pq_5P&)$~yTo!j; zk#=5*d#(tcD~WwWFM^+3e%U0P8~a(S;O!T@4MJl-zOOca@~XP-50`$hB(z`CzG8Jy zstyY7ibQ=Abh)3!q@Ab4`cpXNXSHb(JN_`%fg!z z@xv1WzLnil(*gg;=n~={Br!jWdYyv4yk;PfN$^)9#2{aZ5vt6CTQX! z_<{n#UB8iMX+LC5)b%CW1~)PteyGRGL2jPBS{T@73o(p7{C|E7+p1JffSnv8Uj8iF z7-MLU8JNs8`xt}l|D5G(AypRAwg^_`VW!TC8!dbwQ?srTQAzux?x3&sGbtR{(M8yW z>pWM~g?p!d&o?YO7M;ZIle~_vGS$(c%R=SWn%O&DxdX=d8RsmI_CUs$f*(k_Y+$`I z4XhW_M&|!JG$C1{5Dt|bY9xi!TL%CkQ$-?(^7)>V*{C$T_F_oezp$(G~ala|W zGG%55CZoSVso?4o)pb(!PMY~O4N^^)&^svB3<~ZlHt!om&o;@kZLKEmX%#%Jm_mZL z@zZ?2P}nHuH%a+TYX{@`?LvNgqPSV`HscuPqkBTxk5K z1m`>X%`6c8?JFaXBZ=Z|LgOx}csFKEVe|6|;pDWm?*_X`l(ao_i6y&)5*z|;hw#6& znWpy%Y1bv;@-1=KEwOi2>YWuL^YPw!p?CgOUDN80)g50VorF|-j*BJ7h2m?%>1%@b z8k>s4jE@=PNrq}-;hB(7geZNq+C&dPbwV!W5VpGFu6Uyij zu?UKVl#iNCe|ocVt<5{m^281sDL-bN6-_7YA~xChPjCg*NSb);I-R-w_E6D7s5p$0 z2osrApt)M$wiK3Z^uK6P-O$=Lyi}q5=#o1a=LWk}=dQ_-1(MkA|<$ zOp{h0Y{_72v(TXMVI9zfqSI(q;SW|fFzpIYhbG7}jaefli^36eG#RW-g)m6|E$V5) zI?Z*4^$}cr-=^TbicwUk!V&IQ@g)5NnY{g>5DBSy*#Zq+8hBX->M!GQ}>rNB8N$S*tf41lOzE#s? z%BF$-Cys|e_#KO)$CRV%F=-R~&k0fg3j*`R{w`t`4*v!dTit@5AS`qsw=b0qS;0M_ z;NEkOaN{n1SN5%*5_~~QoBc~ z-KUYi((Vn5rEu6Lhc71Zd&fGY+^&pCh3(I($+pk{wAFPwW>Atmq%U@Kv3+ZJ5 z0Zdzxz!kj)S`iiw{RX|P2vN>cV`<_u8A{0mZ69jC6}rzK!UNNo)kwr3(tY3lq2&gI zMpvKcBtq}XhfYO0_$WprUHO1yYmBFvtum=2I8=D!Z%RHI18UCap?v{Q%yG9EEPo^= zhu?Nh9GldH`q1(xKUlPW&-UmK(8)i?EmRxk@WYc{oh*PEz*W)-=SpFY384U?(M6sn z0PMEN5CXzLU<)cCJrRr1qY|@IHBhV?Iz+F_y0yzLd}F$;OGxg2BVd( zZqQ0K_#1x{Xk|65aX&b>Lbt_Zx5c(QQrn$)$sM8O&aat_Ew~%mmeRXcWP)${6r{1qs4$In194)O z7=MC|hmp_HHxQgfzgB2;87aX)z4U)ZMx&UrL-;k(tQkc7mS`3kOhk_%e~o52nrX+^ zocGFKm+;ks%V^F^c&k@4$V9`t>v@^v9o(?1KnyY^_!?CGV-)m#hqhoH(5AobPcnfp z#~lk_@zAc5f<+r*e8eT_aXR{ps0sW6&&zP39DI{+KE)g)+xXe5gEk6tVVq5%C*M8+CELPaXDq z$W7}oS0zmy*y@5)Y^Hfb-R7a#3`J*oiHeRV`{bCF~g$Ni zLgzBWcD|KrTA?wao795;GXk+g4=tG?Tg=M?>K{>IW(tjsGZ9_rUn>gPDCJIwkHUnH zjUuLw%v7=YXOudQpt(@iSNtC-;x7;+v#9N|wYv+YGShjU6g`ubU(4Dj9SmvSRQ5UP zor^%v8%@Ijv}|{g$JU8hWEKXY;QQe|LKa%`!MjXI$>s(B@2E;i3jTKrBnpVNl&$U= z;i7}EYnTk`XF&bP`^f`%ywLfpG9*-5^b4%^Uuqw0ol0u6Fc-cy7_oY?f)HJ95!NyT zkcc&_ zs&Z*Cwvn-!iGB4Zru1%0UE_M~V7zwl1^42D5R3`6gJSJ%srI($ zu3kR6au0+dw@`9dkbuPPm)zR~_cnIHjKi|E-K5)6QNNLk+s|lU`2_{bqrWV$w0Ax8 z|7nTPe@f~)z20>`-gRE=x+ryBT<;3TyMi0U`W>@jOVfRvwloNF-F||u5en|+gsd{`Bhlj^X%@Vd2PxxZ|3%1DcPPzC*+mrueA0!gV$|DCsF!(rN1 z={vJmjXTyG_rx3bh>iQC#(h9&fP51K$TvX%648oZW?Q^I(`M!P<@Mu}@#B-?aZWnU z;gMKyPeSOqCwcB|STb@;6D>Qb*A&qbnxX9kjMu`Y8|#-M@kncJ9*h?czPKukU6RITg)lFLm(b_|+i7a=fbBdrxa0!eAjHW+ALRb{ z286nv4Y$f3>Wrd(^{Q>}dfTCR+aa-SP=esv3E$bG-GgT;;R%lwLQ6Y9! zMptEd%f~hfER{7L>3cE66iZ<*om61zi7gl0Cf6P=i~Q_-ofCK|dk(X(6XIZBhFQ}A}a>giK2H?jcA z;2FyJ|AdT8+fv%zF}(d1E)=}oNWt4BBi8Avcdp8 zAZCLhDd|n^5tCt9j$)ZiCj)HtPq7H2QTX~bJ++AcmiqdiBdOBY8Ce~mrCA+%UpsR< z5>@q5Rrg9x;>;E43?~%NeLwnmk5u0Gyj32dRIJsS8TZ_wcHb0K)5YOY{zUW-G0^5u3m2Bs&)CA zsdpMRSB6k+$`C3r4k2BRfo`I~$3BnBS-0u;b<}MzEE)#p^iHTcG6e_^R^etqEjWX>d8LV>gl#Yloj8+LsZ?MDRMcf)H3K zK0IXaVzt`+mOed96w8y67613ZVhYuoLe%R;qpvUcBN{-o@G1kym30{#4hk`ws_NIP z_Q$LCi&X)doSvpkH4A4S~^OrWV zRAZXovEVH=l60$KxdtU`a@+%B-9RJru|qC)CU3`LFl^IwwaM241HTc3w;q~>O%$an zlQ%OL47w6Dacul;obFM!{3Em_=}F03mNL*I07DG`+DNj`AeLq!gY4{P!sLuF8iXCI zYyLK@goE(r$03P{fKlK2@c%g(b9`tav*)YqAj&A6`=_=?IqXD_D7h@TmaXZNR^CXe z;ogxv_{l=%Q?H}gYyo5bc+x!S==z{~hM&;1q?081jP)qyWM-8buDv=qZ?6#{a!%$M5@DrQ&xTds1|h&N z?D-8w;xig`{~ozu)MYc_k|%4H$)9FH$zOSQB=RdCM@j6uL#oH#d3OTxbsX(uzX|xl z(ho+2%09`zbKQS9?mzruSo9y4{KuDvHf;LfT^oElB5yYT54C=YfL^c+ zU1RHAm*ZWRg)2A3u3J*qEn0;-uySow>+NAvMLBU-hp35I(DY}EQj@YM>B|uRzEO!> zUz8Rty3Z;T1Y-)3pG8;w0<5+~Z4PU+#LzcueDUVcI)pJDHg8xWbyK4)((22ZMK?s+ z0#;k@kgs;l+0Mb0Hpr%Z;SiZeLkR*dQ)S0*jGVWV2@Loem`sy|7p%Fr>6nDs7cY zd!^ET+#gE}j!1(Sq(SD!c5qS}yeX8$9@k4{ZBp3|schf#pj0*>;5#1!`0+$ltyI-1 zRqd9l262BX^?v!(@+mU2AHqzaFrA~K4rPP)v@&>MBJ?j(HhRBr+{dUp7f1=TJwB`v zwGK}Aly2r=;JJKLPddn#R$a@y$MjqqaO!iCRq%}|HKK$#W!thwDIUwyYGjM1=E&;u zH94m6QK>mT`j>1g0@o!ZZCcn(`w{u5L3L@U4|cFh!GJ7#kQYR_+$L59yN}L}g;U=& zsqVKb5WNw(JEoa=50(9SJvCKqaoiGki%u>zHMb^B|XogabLgS>;JT@?uQ43Z9%bq zQmUU6%ci8VDZxJ_`}~svd!I+)>_rI7lLNMKY51lvHyXIjN?`sZUr>6>u)sn-@A%;*#^SG3#0pM!I9 z8Bd_|3(ejI&qdW&XkZBb;qNaLLRXJG&qu;h`h}`(7#_Hj4zds6^HCcAE`sKaq=THo z^ZyNQl390VLU$Rru3XZB3%)-Tm7PnHb1)uzXmb1>3P*3_+!`AP#V&%n6aOk9_rVf^ zO2Zp5nZK{t5k56{=#1<6g7(eCduEF@V6#P ztJ$|FQB;nTC2uyy4GXelN6sd0K_j@Yko7n34y>`%HuhQ7xCAwZegUC%naLi{q6=fq zWC|%X@@n36(gMK4C5n+lFxp=lU70Z-PN>_DwffQWidCK@ea_Lp{d;_5SMallhhzkf z$L>e5X4fMDW0#X9OfI6iG1Y_-QTfRDJ)|=%+_daKxq-+@GFyi=Zn^mXiicavYPXWY z{2gi(rCO$Uc>+x9#CqYrc;UY1+$S?X_rt&WE%E5MbaY&}a!tB&ODvp~3TKzI6FG$> zSlgZORX(2lVE<~3ax^M(CphRuZj2of?5WV~t(vMh)1EEkH;^L}w_C z9l~T98q()80H@^w0h(bruxAeB%075I2FX#B4@78=bou*|(>OSIxA9JwV-VBGYzyp) zavOQea473|4%ryU@ewDBXC*FWF50$`O~9-e~ z@@ceO1>V-6NJ`Q;389g4NZ8mP=<4k3=rsEvFhXdj5diJp1eA6rtZpP24g%=1xinTH z0m=Li<~E6x?IrJK@P&Mn8!K(OdL-3-TO};sb^vmozl<6BwbRypxs);-L8qTusZPcH=-Y zFBXXfXD4RDQ?s|x<2VBRkbu}ZQZXROH~S1+|K1MI#FDPJZsR>Hc=d*CeVGO36Pr%b zB_$P~q&qqvnu6bY#$k+Meacs|otO$v1{qe8e%9l1FJY6ZXmSy?O?vhIBNI!Glg}WD z=S}7)XeBJO!tug}Y>Jb+64sg8wbo^PFV#PfJ<*VE;vi^g=)wQz+Yo4Khl(AHK0OtM zz+6%Y#B#X<*^Zi|lun#i@b^v2=68|f!jUccYT3bv!EHKf3D%6ptwA=aD)j|`pJ*d; zR21fG&k42Xp2PTOtwO5n!*$A+Erh^Oj$wK!m``E-lU@cwI8w&2j4*u~H5bShvusa7 zeZhZ8!4D{4$HQ;qD(NO!GP1ZgLBh8tO&Lz>ZT7MjxsfEky&YpOE0c8q%P5B`>T#9> z7lI#qnAKw2q9u>Y>`mna(~dL58&f1ZSRRVBQE_1!H0NW2FVN~qHD_&x?>zE0!ZGc- z=6snq%2a#+CbN|e9fKcLh6{!UHuznX1(T?6r(u_+RXv%lT}I_`3?>}!$&Dtn^>!rl z7?3_A_E9FeYPHC8F3Rsg9N&*1N=!dd6w`<4%NgDCqJ@L2G{GIif@+cKT?@r zB7g*@%u-bL!KKG@Qehidw6ZFxY?n}W`uU)=_w=#{PC2FgZ9@JI7^k)_XTY9r<-qC% z(bp<^+9XfgvLms*2UhpK!Ij<*_Tc?9g0J<3W7(A`tXwUM7d8ro2iH!)J967W!GG_? zJ>lHd_>rr^k-Ng=TSDw^eDdycR>EJk?mrUuA4#~qiQ+1_eU(bu6aJD9j>EJLo|Ksm zUZSWPHA$2U>s)_vTE9u9K4Mq~JQq;t$4M2Vb;+VT}lH-4+3@#VTE3i@sB99N_ehm{NreG# z&p`lnGGa)bvV061fxo{QU1goWNRJqq$%S5g~s}>@_i?7(Mcb z&%~X^UWc(iV(d5N#Xfu?Hr5)8t;W)C>QN%O|77gBCO%{AxwaF739dzFvDq{2C=VWJ ze0tsncG#l(V!`2}z6hkfwh(y}4%p|W#<)V9re9lh7k!3UM-DvRTt3>_(4=982o*J;|u z*!f$?)1||KZJxw-C1X`{IjCZeez$D5HYRRreFe`oS$e)uk9r-pGmXv-k=nrW7}>HyyUsbWwc!o{?WLz0;l^HlGjL+G z7`GxXDl8!_0Q^qvK_6Wa=K&evW?2xgqo;26%Zv8+sS1xNpjDbD3pA#`B}3{9IZ3vX z84y!~qvwkVigtob!JhwJx*DQ@)@h#jC7!IbST)cfCX5_H1oQc!u9R#!Bz8t$C&}Hh ze3n2S_vuaWQM@G{t0us1&oN^$bv=`pGQ9nW)yTjmu{C<@1BA`t@rGzi^v_X42qQd2 zBr51gU=h3Vcu6X1Up|s(-7d8r5(-a|)g9KL#+R8`9)^zo#bv=azS6ty+Y$Hecy?3t z9h7_r1$-}zW6ApZmG2jB-=k6TNuDi~^!_lomh(s9kHYLsp&RPtH<=N7FYM40 z^*zvEO;prA-U*pk1;{!AoU{>HNAOFpCD*THh8&(ma88k^YI-uKXHZ`KWY3cWiPj#W z`uyYASyUo|4WF+v8^XDb7K_`zVad+&Cn_6+ZGBQDlqIur5rtqSE8(qK_cq17O+P7q zT7|QiCVwnS~K(6$#VRHC-+qjo6zN_D%Wx;=?HTEFnyhy_tz(3-%!R`!VGnxy^C-t4T z+KCNJXqm)@bYZlmN*4|yR$GLOv8#r>)iP4OHJX2b;7z9xko@leWDL^p{OGNjdF&DHL};5Ey&s-R7MY?L(W3Zf zk1S}VwMgD2x6{=E1&m0tQb}Ga3tRnE45?SiwD|v`2WN1b#2deuI2|WRkxk~o=Z;UZ z5~YCz$kRTdxC!J?emBGOiy(?($&ges1cFyaLjJPsx%PbU(-) zD9DD>Qg#4}Ze`%%5&VA{mYn?ex2;r(*#Rj#0KfiO#q@f};&oST+*K>O>Lpjb;Hpn} zDg{?%I=#>s*Z%_f=zE|T4=t-eLi#6lYi2i;TBcsTP)-2{(#Y>)H=Jqm}$6n z8Lo4{nrDMG&q`&@r>)GVj}_A3>|3n+@j|5>tO4#N_hR;94wy$U&G0VmT6ABx(^=P} zKQQ6e&gG@!cEx)26k&D??0R00s~q?wHsRO%jnd?7+76}mi)3f}zv->f*=^1svxa0` zYp(&KK)+tfGrplaR;^4M{48dh$B5}!if?aoe=fSoLU+ltWzH!+e@!{3cnIG#XOfkB zS#M?-dvh^&(X&vDl5-dH7QO5$5B)C3q5qY*9C-BBHfVZ#vBfdAKDC9QDEhh`b)&4j z^zj4-o*KUQS-w#@DOfh+JnGfPt&@#fgHzbWOd7%Pdwzx-nPQaw<165>mT3OF^;+mX zZ5kKZn?e}JMb2VciL4aoQa&4(m=RbEZSbl8U$*S$l(w1ho0j{cVcZ()YR1T>bkO+fmJeMm?7U} z_41ikCXGiok3rK4rwN<3T)j4}z25fC@u5H8dewV0kD8FonSJ#260w><#~8axEOOe% z%)88IAhllwf`SB2B$o;hSE$Bug?in#IOi@f_xX}<(YIQprZ@hY%f<<{54(_};31G2 zbt9ts8DP%U^}|ePR%%a}^dS(%DOePq1jvp>5qGdx&fr$ns3JG1w?d(Lwp~$SW<%UG z-g&F|gwRVkbYJz6-XqE z{)P%?M}trXQY)yJHUiHsu*7MD$M^u$<5chJ%zl7Uu{{RTE7k{-Au`a>6t^jJ=zKu8 znmoM2Pdzz_C8uEI{VS%HrYo>Fg*v98T&g-|KvpPH*=*6d=4tu$%7II=j%qM~*I~^n z56I>q@J6#<^`o@?L%pVOXxzr^9F#*)4GBsI=}LRBS5mNncT*xer7!e6Pf_&U8Oo4a zpVC*%|2&lc?(z{-9S7L*J1%j?#T(AMP2vbzylD6<-nYz3Cl3vd+r+&h4PuA;v}RVu?xGtes`y$!f=YHcw~ADHH*@8{qlk3#n@j=2$!x%mu|<0 zZa=W3Z<2nqR?vQ*C#-yn)u*h~>OYTt@{Vx!f^_zJ{J?d!`Y2QTkUWTWLM<-LZvE-) zmS(C!hq|LvT3TFa$y?HrZ~ayPy(dW`#Q%hXpHmQ^fXrWb)`7=<-40Ce(zgjGr1|o| z@|TzYk24pI7E6%7AwvG(T7$f9(>we_JZ35r zKe8sRvj){kxyOHPd_SN%gEK;%1ui6U^8z20_;)r)kMy8ztIGEv0i!;eM#JmhVanWC zg78#OOX?7$D>H0mq_2pTHX%H!`oedq84bu(QC}z-6H3OO)j#%2rR}&%`Lg+vMpA#R zMtwr9nb+u$tQXCH7qMHq9C&?eekY|hHP?lj>n{dZ>!sQQxJvo5)-2?WsmnB0qlPF? zCIYf1XCqyaq9hbc*tySLT&K0(he*YO?zQ8Qzs0gd@a+x6$JA!31P0=p6VjVEh1of2 z_P%g+;lUP*$FJUBe1z)#ZTHsir}S3od7A+RWm-SW}_J57G@V||={2-+* zwbMfF^oz08Ua4*XS1DiC7JW=Dc(pOen6`!}44|3pS`(J*g7M~JgQ&X`{SH-QX!0=! z{5%QNWam?KoWVrehT}qVsxQ0o`dvzAhw*@{C-j6K=mqL>@@9H)1qj2bC6k4dd|o~* zH2c=iVLY6or&FT5R|w`08f(n-r;-J-j#G4E@;-B5OFk&PsZg@4-K8?@$x_BT8eRFT zX=PO>nwGG3#XFgjd1}du?pd+ol%@n!z|jc$>+}HL2()e1$mfWTsZ@6+7b`oC60$^-X`&_fa3t@ZcqT$L5KG1+goQZV#hco3oS{(Y6CqrPHPoB%= z`#<#-e~|ZSMWs;H@ysE04oaP8#EP?0#n}Y>8`U0=Y7Zr9n?Gtv)U|%JC(*Q1Xxs^V zmB)8+juF5yCITGX=HnO>!G=Anl%1;PEst#YEoFh#nje%sE?end>0ZlU9)!!J3LI~A z!;b$T-cf9!5dQU7FRtBq?hqRGitc@ad*3hJmIK4q7q^6S3;2rr-XS(?ZoWT3=e7Qo{^O ze#zq!xQ+5O32lRdhrWrL-On3e?0PvS^q-Mx&I;$QNHtgC-Kpi!i=8h=a5gR+9+z5R z2s$UVgvoPyL(@-uYZrc0{hkqV^-{#6}+vls=E@6hk&kqz%&B*eOfJEYkD>))a(+y zyKx4TUoF)3;)N2Z4qR)s4vXGl)BrBjgt9i#+qRMcPnAO5e$l&s#gizmUN3Hp7dQUI zzBVd0?U9=Hh{b!QVkl&}@{d`e6II`xXr%^QISrLf42;ax~#9U-#9;eRV%Pyq57t$3HqQ`Z{rp#+*02s%}U$_94RqRR060 zf9>k7wXxOxlDGTWPSLyPKO?)AL$I9kWnF{P8ik^}fkySJBT?ACHjOiTztAxx6%N0+ zFBP64cM*Nh?!IuntQU5UN>y-M6O^hZmruPaY+Q3at6$5L3UOkelY4_y;1I5m1=iy; z-`lgYC*dz$88Y>a(0}6PCE?=bmv2h_SA?qwVLCY@_1_fxZb^N&#D-a^0p91MVncMZ zK6_J`m=Nx$r4!_@EQ)tXV6vWsXJgFVqj=#2?&t@1+mFxnCKmoZ_&32Goa8rB+xh*mJl8biQbTW zi@}jF_CS~9-SKROoS%6IB!q((MDGRpR`d>}feL*`1n&sG62cSHqIX)p6}=<)zS?RW z*mAE~seJpv`s5hqbY!0lF zwE6w~7#6l)<%Ac~N3b69$EXv6c*>7`*hwyxz&`VNc!m=x`4h>+9oA9#t#}s-&S)1iDGf~F?0g%rp-H=qtu&`4`y;(|M)gG4Bv}`;NCr=)b&FZkHrOd; zhvBn^eu01Oyw~KzMU$Qz%S=6oB+DfzKU%|7h5<)Zdq{~g7DfYS6;UR$ynt(8h+7$F z1}83LWFIsLWW(Hc2n?Av2Q$SdIC{xv7+zGP(I9`nBWMIt8Jl@y1aFp|TKwjy&*sGiJs~80G&@3jT_MUsCV~6htX_k19tSGPYME zdtTY)F+5<=6WU58JqAxR`6(VmE>lK~xicYbjTdL@WHhy5|U+0&8uS6)jsC~u!OH%$Nc*oAIdR5aQ)qEX9 z^{eVOsd|T!$EZ-Ie8v1zQvNB*qw-a5l~B_o=Ju?+_s8A)MfZT@9uV9EiEaCYfivQ^ zGr|}rZsP=Z-K(5pG7{)cRMxClcE>Bb#mZi(vUhnj(XvZwIryT6+6B+S?mD6Ikm!bM z*SbVmm(VjRl%5hwPA?x_KKiP(Qz+@eugm?&CFDa*s$t!=Bkls%Bf1787i`KEc>JOMHtaWIuOWIeur@}2j;BYLXgD`DM(H^bo-csnG|4#Bm9;hnuJ zwfSVyH8DXp{u2{09wIY4a^p3TbWgw!QgBvzk~uNKMWzt#WUzP&;l~s|12^fBaMGuE zg&-@eVE8_Bjm2l6H1j`?5z0I^_Wjo9*CysV$j^x2t)B_ocERz4-@Kc?XCDIiZayoWk9lM9heSCrpP@h2!aNx>)urzto` z!6gbVQ!q)v0SZPa7^dJD1;;6vq9BAI=~6w`@TF8vHi$9&gal{8QNDsoZ=irlx|r%c zQwC*(n$d9@aQtIRm^(p!tD@1V5S+D7K$&$Ha%UrMK&FabDv|1xN8Kr|aD}Hf)7XA4DX^;4`}=!=paxuoTp+6n#*=Hur)P z&c7i{-4pWfi~0AZ{QD1%CH(a(!;-%~QP`C5G{K~5Bhy}33{}j+VyI#k7C$(NO?UCO zmFpiw5{26mp4x=B6(Gg!04Z(^9 zs^xLtll?;X8KL~FSbkP2KPxy&klD(G58f17_XtC83fFH6w-vIpbo^ zxRf*gU@(y%pnhllR)S@cddJ%!x08(Le8n5Stb$Tl1r(IRDxjeB!7&K2D{EdGP;^0LAB3 zU^KxWd)4xtN8d?!N(m(Q0>-5G66#1HItJl`5p)btHvD8X;ptC!J2#xR%5L;cWjFe! zvRiPJYMqntbkZ<#+A1)N5C8y<XP*oZAb{u&$TFx?ocX?Y2be$0(la>R51AhJSCJq^Ea07}C^2u#3q&62) zn+q#|uWUOAmH~`e5Kx|tT8vlCvqUIw6P>_e zJJoa!*-}Wr9eSKrQw^^Xo3jOu+Yu6|i~<%n=~Q#pV4Y3~^bqKf6r;9E$k)oxbap@- z?d;G?rKJU+2Ax1ICyQVW|?#-&dAS s;hTLEmIlH6P0wF0E@9awn7 Accounting tab > Actions > Auto-reconcile menuitem. + """ + _name = 'account.auto.reconcile.wizard' + _description = 'Account automatic reconciliation wizard' + _check_company_auto = True + + company_id = fields.Many2one( + comodel_name='res.company', + required=True, + readonly=True, + default=lambda self: self.env.company, + ) + line_ids = fields.Many2many(comodel_name='account.move.line') # Amls from which we derive a preset for the wizard + from_date = fields.Date(string='From') + to_date = fields.Date(string='To', default=fields.Date.context_today, required=True) + account_ids = fields.Many2many( + comodel_name='account.account', + string='Accounts', + check_company=True, + domain="[('reconcile', '=', True), ('deprecated', '=', False), ('account_type', '!=', 'off_balance')]", + ) + partner_ids = fields.Many2many( + comodel_name='res.partner', + string='Partners', + check_company=True, + domain="[('company_id', 'in', (False, company_id)), '|', ('parent_id', '=', False), ('is_company', '=', True)]", + ) + search_mode = fields.Selection( + selection=[ + ('one_to_one', "Perfect Match"), + ('zero_balance', "Clear Account"), + ], + string='Reconcile', + required=True, + default='one_to_one', + help="Reconcile journal items with opposite balance or clear accounts with a zero balance", + ) + + @api.model + def default_get(self, fields_list): + res = super().default_get(fields_list) + domain = self.env.context.get('domain') + if 'line_ids' in fields_list and 'line_ids' not in res and domain: + amls = self.env['account.move.line'].search(domain) + if amls: + # pre-configure the wizard + res.update(self._get_default_wizard_values(amls)) + res['line_ids'] = [Command.set(amls.ids)] + return res + + @api.model + def _get_default_wizard_values(self, amls): + """ Derive a preset configuration based on amls. + For example if all amls have the same account_id we will set it in the wizard. + :param amls: account move lines from which we will derive a preset + :return: a dict with preset values + """ + return { + 'account_ids': [Command.set(amls[0].account_id.ids)] if all(aml.account_id == amls[0].account_id for aml in amls) else [], + 'partner_ids': [Command.set(amls[0].partner_id.ids)] if all(aml.partner_id == amls[0].partner_id for aml in amls) else [], + 'search_mode': 'zero_balance' if amls.company_currency_id.is_zero(sum(amls.mapped('balance'))) else 'one_to_one', + 'from_date': min(amls.mapped('date')), + 'to_date': max(amls.mapped('date')), + } + + def _get_wizard_values(self): + """ Get the current configuration of the wizard as a dict of values. + :return: a dict with the current configuration of the wizard. + """ + self.ensure_one() + return { + 'account_ids': [Command.set(self.account_ids.ids)] if self.account_ids else [], + 'partner_ids': [Command.set(self.partner_ids.ids)] if self.partner_ids else [], + 'search_mode': self.search_mode, + 'from_date': self.from_date, + 'to_date': self.to_date, + } + + # ==== Business methods ==== + def _get_amls_domain(self): + """ Get the domain of amls to be auto-reconciled. """ + self.ensure_one() + if self.line_ids and self._get_wizard_values() == self._get_default_wizard_values(self.line_ids): + domain = [('id', 'in', self.line_ids.ids)] + else: + domain = [ + ('company_id', '=', self.company_id.id), + ('parent_state', '=', 'posted'), + ('display_type', 'not in', ('line_section', 'line_note')), + ('date', '>=', self.from_date or date.min), + ('date', '<=', self.to_date), + ('reconciled', '=', False), + ('account_id.reconcile', '=', True), + ('amount_residual_currency', '!=', 0.0), + ('amount_residual', '!=', 0.0), # excludes exchange difference lines + ] + if self.account_ids: + domain.append(('account_id', 'in', self.account_ids.ids)) + if self.partner_ids: + domain.append(('partner_id', 'in', self.partner_ids.ids)) + return domain + + def _auto_reconcile_one_to_one(self): + """ Auto-reconcile with one-to-one strategy: + We will reconcile 2 amls together if their combined balance is zero. + :return: a recordset of reconciled amls + """ + grouped_amls_data = self.env['account.move.line']._read_group( + self._get_amls_domain(), + ['account_id', 'partner_id', 'currency_id', 'amount_residual_currency:abs_rounded'], + ['id:recordset'], + ) + all_reconciled_amls = self.env['account.move.line'] + amls_grouped_by_2 = [] # we need to group amls with right format for _reconcile_plan + for *__, grouped_aml_ids in grouped_amls_data: + positive_amls = grouped_aml_ids.filtered(lambda aml: aml.amount_residual_currency >= 0).sorted('date') + negative_amls = (grouped_aml_ids - positive_amls).sorted('date') + min_len = min(len(positive_amls), len(negative_amls)) + positive_amls = positive_amls[:min_len] + negative_amls = negative_amls[:min_len] + all_reconciled_amls += positive_amls + negative_amls + amls_grouped_by_2 += [pos_aml + neg_aml for (pos_aml, neg_aml) in zip(positive_amls, negative_amls)] + self.env['account.move.line']._reconcile_plan(amls_grouped_by_2) + return all_reconciled_amls + + def _auto_reconcile_zero_balance(self): + """ Auto-reconcile with zero balance strategy: + We will reconcile all amls grouped by currency/account/partner that have a total balance of zero. + :return: a recordset of reconciled amls + """ + grouped_amls_data = self.env['account.move.line']._read_group( + self._get_amls_domain(), + groupby=['account_id', 'partner_id', 'currency_id'], + aggregates=['id:recordset'], + having=[('amount_residual_currency:sum_rounded', '=', 0)], + ) + all_reconciled_amls = self.env['account.move.line'] + amls_grouped_together = [] # we need to group amls with right format for _reconcile_plan + for aml_data in grouped_amls_data: + all_reconciled_amls += aml_data[-1] + amls_grouped_together += [aml_data[-1]] + self.env['account.move.line']._reconcile_plan(amls_grouped_together) + return all_reconciled_amls + + def auto_reconcile(self): + """ Automatically reconcile amls given wizard's parameters. + :return: an action that opens all reconciled items and related amls (exchange diff, etc) + """ + self.ensure_one() + if self.search_mode == 'zero_balance': + reconciled_amls = self._auto_reconcile_zero_balance() + else: + # search_mode == 'one_to_one' + reconciled_amls = self._auto_reconcile_one_to_one() + reconciled_amls_and_related = self.env['account.move.line'].search([ + ('full_reconcile_id', 'in', reconciled_amls.full_reconcile_id.ids) + ]) + if reconciled_amls_and_related: + return { + 'name': _("Automatically Reconciled Entries"), + 'type': 'ir.actions.act_window', + 'res_model': 'account.move.line', + 'context': "{'search_default_group_by_matching': True}", + 'view_mode': 'list', + 'domain': [('id', 'in', reconciled_amls_and_related.ids)], + } + else: + raise UserError("Nothing to reconcile.") diff --git a/dev_odex30_accounting/odex30_account_accountant/wizard/account_auto_reconcile_wizard.xml b/dev_odex30_accounting/odex30_account_accountant/wizard/account_auto_reconcile_wizard.xml new file mode 100644 index 0000000..ff0e1c1 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/wizard/account_auto_reconcile_wizard.xml @@ -0,0 +1,24 @@ + + + + account.auto.reconcile.wizard.form + account.auto.reconcile.wizard + +
    + + + + + + + + + +
    +
    + +
    +
    +
    diff --git a/dev_odex30_accounting/odex30_account_accountant/wizard/account_change_lock_date.py b/dev_odex30_accounting/odex30_account_accountant/wizard/account_change_lock_date.py new file mode 100644 index 0000000..760100a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/wizard/account_change_lock_date.py @@ -0,0 +1,416 @@ +from odoo import api, models, fields, _ +from odoo.exceptions import UserError +from odoo.osv import expression +from odoo.tools import date_utils + +from odoo.addons.account.models.company import SOFT_LOCK_DATE_FIELDS, LOCK_DATE_FIELDS + +from datetime import date, timedelta + + +class AccountChangeLockDate(models.TransientModel): + """ + This wizard is used to change the lock date + """ + _name = 'account.change.lock.date' + _description = 'Change Lock Date' + + company_id = fields.Many2one( + comodel_name='res.company', + required=True, + readonly=True, + default=lambda self: self.env.company, + ) + + fiscalyear_lock_date = fields.Date( + string='Lock Everything', + default=lambda self: self.env.company.fiscalyear_lock_date, + help="Any entry up to and including that date will be postponed to a later time, in accordance with its journal's sequence.", + ) + fiscalyear_lock_date_for_me = fields.Date( + string='Lock Everything For Me', + compute='_compute_lock_date_exceptions', + ) + fiscalyear_lock_date_for_everyone = fields.Date( + string='Lock Everything For Everyone', + compute='_compute_lock_date_exceptions', + ) + min_fiscalyear_lock_date_exception_for_me_id = fields.Many2one( + comodel_name='account.lock_exception', + compute='_compute_lock_date_exceptions', + ) + min_fiscalyear_lock_date_exception_for_everyone_id = fields.Many2one( + comodel_name='account.lock_exception', + compute='_compute_lock_date_exceptions', + ) + + tax_lock_date = fields.Date( + string="Lock Tax Return", + default=lambda self: self.env.company.tax_lock_date, + help="Any entry with taxes up to and including that date will be postponed to a later time, in accordance with its journal's sequence. " + "The tax lock date is automatically set when the tax closing entry is posted.", + ) + tax_lock_date_for_me = fields.Date( + string='Lock Tax Return For Me', + compute='_compute_lock_date_exceptions', + ) + tax_lock_date_for_everyone = fields.Date( + string='Lock Tax Return For Everyone', + compute='_compute_lock_date_exceptions', + ) + min_tax_lock_date_exception_for_me_id = fields.Many2one( + comodel_name='account.lock_exception', + compute='_compute_lock_date_exceptions', + ) + min_tax_lock_date_exception_for_everyone_id = fields.Many2one( + comodel_name='account.lock_exception', + compute='_compute_lock_date_exceptions', + ) + + sale_lock_date = fields.Date( + string='Lock Sales', + default=lambda self: self.env.company.sale_lock_date, + help="Any sales entry prior to and including this date will be postponed to a later date, in accordance with its journal's sequence.", + ) + sale_lock_date_for_me = fields.Date( + string='Lock Sales For Me', + compute='_compute_lock_date_exceptions', + ) + sale_lock_date_for_everyone = fields.Date( + string='Lock Sales For Everyone', + compute='_compute_lock_date_exceptions', + ) + min_sale_lock_date_exception_for_me_id = fields.Many2one( + comodel_name='account.lock_exception', + compute='_compute_lock_date_exceptions', + ) + min_sale_lock_date_exception_for_everyone_id = fields.Many2one( + comodel_name='account.lock_exception', + compute='_compute_lock_date_exceptions', + ) + + purchase_lock_date = fields.Date( + string='Lock Purchases', + default=lambda self: self.env.company.purchase_lock_date, + help="Any purchase entry prior to and including this date will be postponed to a later date, in accordance with its journal's sequence.", + ) + purchase_lock_date_for_me = fields.Date( + string='Lock Purchases For Me', + compute='_compute_lock_date_exceptions', + ) + purchase_lock_date_for_everyone = fields.Date( + string='Lock Purchases For Everyone', + compute='_compute_lock_date_exceptions', + ) + min_purchase_lock_date_exception_for_me_id = fields.Many2one( + comodel_name='account.lock_exception', + compute='_compute_lock_date_exceptions', + ) + min_purchase_lock_date_exception_for_everyone_id = fields.Many2one( + comodel_name='account.lock_exception', + compute='_compute_lock_date_exceptions', + ) + + hard_lock_date = fields.Date( + string='Hard Lock', + default=lambda self: self.env.company.hard_lock_date, + help="Any entry up to and including that date will be postponed to a later time, in accordance with its journal sequence. " + "This lock date is irreversible and does not allow any exception.", + ) + current_hard_lock_date = fields.Date( + string='Current Hard Lock', + related='company_id.hard_lock_date', + readonly=True, + ) + + exception_needed = fields.Boolean( # TODO: remove in master (18.1) + string='Exception needed', + compute='_compute_exception_needed', + ) + exception_needed_fields = fields.Char( + # String of comma separated values of the field(s) the exception applies to + compute='_compute_exception_needed_fields', + ) + exception_applies_to = fields.Selection( + string='Exception applies', + selection=[ + ('me', "for me"), + ('everyone', "for everyone"), + ], + default='me', + required=True, + ) + exception_duration = fields.Selection( + string='Exception Duration', + selection=[ + ('5min', "for 5 minutes"), + ('15min', "for 15 minutes"), + ('1h', "for 1 hour"), + ('24h', "for 24 hours"), + ('forever', "forever"), + ], + default='5min', + required=True, + ) + exception_reason = fields.Char( + string='Exception Reason', + ) + + show_draft_entries_warning = fields.Boolean( + string="Show Draft Entries Warning", + compute='_compute_show_draft_entries_warning', + ) + + @api.depends('company_id') + @api.depends_context('user', 'company') + def _compute_lock_date_exceptions(self): + for wizard in self: + exceptions = self.env['account.lock_exception'].search( + self.env['account.lock_exception']._get_active_exceptions_domain(wizard.company_id, SOFT_LOCK_DATE_FIELDS) + ) + for field in SOFT_LOCK_DATE_FIELDS: + field_exceptions = exceptions.filtered(lambda e: e.lock_date_field == field) + field_exceptions_for_me = field_exceptions.filtered(lambda e: e.user_id.id == self.env.user.id) + field_exceptions_for_everyone = field_exceptions.filtered(lambda e: not e.user_id.id) + min_exception_for_me = min(field_exceptions_for_me, key=lambda e: e[field] or date.min) if field_exceptions_for_me else False + min_exception_for_everyone = min(field_exceptions_for_everyone, key=lambda e: e[field] or date.min) if field_exceptions_for_everyone else False + wizard[f"min_{field}_exception_for_me_id"] = min_exception_for_me + wizard[f"min_{field}_exception_for_everyone_id"] = min_exception_for_everyone + wizard[f"{field}_for_me"] = min_exception_for_me.lock_date if min_exception_for_me else False + wizard[f"{field}_for_everyone"] = min_exception_for_everyone.lock_date if min_exception_for_everyone else False + + def _get_draft_moves_in_locked_period_domain(self): + self.ensure_one() + lock_date_domains = [] + if self.hard_lock_date: + lock_date_domains.append([('date', '<=', self.hard_lock_date)]) + if self.fiscalyear_lock_date: + lock_date_domains.append([('date', '<=', self.fiscalyear_lock_date)]) + if self.sale_lock_date: + lock_date_domains.append([ + ('date', '<=', self.sale_lock_date), + ('journal_id.type', '=', 'sale')]) + if self.purchase_lock_date: + lock_date_domains.append([ + ('date', '<=', self.purchase_lock_date), + ('journal_id.type', '=', 'purchase')]) + return [ + ('company_id', 'child_of', self.env.company.id), + ('state', '=', 'draft'), + *expression.OR(lock_date_domains), + ] + + @api.depends('fiscalyear_lock_date', 'tax_lock_date', 'sale_lock_date', 'purchase_lock_date', 'hard_lock_date') + def _compute_show_draft_entries_warning(self): + for wizard in self: + draft_entries = self.env['account.move'].search(self._get_draft_moves_in_locked_period_domain(), limit=1) + wizard.show_draft_entries_warning = bool(draft_entries) + + def _get_changes_needing_exception(self): + self.ensure_one() + return { + field: self[field] + for field in SOFT_LOCK_DATE_FIELDS + if self.env.company[field] and (not self[field] or self[field] < self.env.company[field]) + } + + @api.depends(*SOFT_LOCK_DATE_FIELDS) + def _compute_exception_needed(self): + # TODO: remove in master (18.1) + for wizard in self: + wizard.exception_needed = bool(wizard._get_changes_needing_exception()) + + @api.depends(*SOFT_LOCK_DATE_FIELDS) + def _compute_exception_needed_fields(self): + for wizard in self: + changes_needing_exception = wizard._get_changes_needing_exception() + wizard.exception_needed_fields = ','.join(changes_needing_exception) + + def _prepare_lock_date_values(self, exception_vals_list=None): + """ + Return a dictionary (lock date field -> field value) + It only contains lock dates which are changed and for which no exception is added + """ + self.ensure_one() + if self.env.company.hard_lock_date and (not self.hard_lock_date or self.hard_lock_date < self.env.company.hard_lock_date): + raise UserError(_('It is not possible to decrease or remove the Hard Lock Date.')) + + lock_date_values = { + field: self[field] + for field in LOCK_DATE_FIELDS + if self[field] != self.env.company[field] + } + + for field, lock_date in lock_date_values.items(): + if lock_date and lock_date > fields.Date.context_today(self): + raise UserError(_('You cannot set a Lock Date in the future.')) + + # We do not change fields for which we add an exception + if exception_vals_list: + for exception_vals in exception_vals_list: + for field in LOCK_DATE_FIELDS: + if field in exception_vals: + lock_date_values.pop(field, None) + + return lock_date_values + + def _prepare_exception_values(self): + self.ensure_one() + changes_needing_exception = self._get_changes_needing_exception() + + if not changes_needing_exception: + return False + + # Exceptions for everyone and forever are just "normal" changes to the lock date. + if self.exception_applies_to == 'everyone' and self.exception_duration == 'forever': + return False + + exception_errors = [] + if not self.exception_applies_to: + exception_errors.append(_('You need to select who the exception applies to.')) + if not self.exception_duration: + exception_errors.append(_('You need to select a duration for the exception.')) + if exception_errors: + raise UserError('\n'.join(exception_errors)) + + exception_base_values = { + 'company_id': self.env.company.id, + } + + exception_base_values['user_id'] = { + 'me': self.env.user.id, + 'everyone': False, + }[self.exception_applies_to] + + exception_timedelta = { + '5min': timedelta(minutes=5), + '15min': timedelta(minutes=15), + '1h': timedelta(hours=1), + '24h': timedelta(hours=24), + 'forever': False, + }[self.exception_duration] + if exception_timedelta: + exception_base_values['end_datetime'] = self.env.cr.now() + exception_timedelta + + if self.exception_reason: + exception_base_values['reason'] = self.exception_reason + + exception_vals_list = [ + { + **exception_base_values, + field: value, + } + for field, value in changes_needing_exception.items() + ] + + return exception_vals_list + + def _get_current_period_dates(self, lock_date_field): + """ Gets the date_from - either the previous lock date or the start of the fiscal year. + """ + self.ensure_one() + company_lock_date = self.env.company[lock_date_field] + if company_lock_date: + date_from = company_lock_date + timedelta(days=1) + else: + date_from = date_utils.get_fiscal_year(self[lock_date_field])[0] + return date_from, self[lock_date_field] + + def _create_default_report_external_values(self, lock_date_field): + # to be overriden + pass + + def _change_lock_date(self, lock_date_values=None): + self.ensure_one() + if lock_date_values is None: + lock_date_values = self._prepare_lock_date_values() + + # Possibly create default report external values for tax + tax_lock_date = lock_date_values.get('tax_lock_date', None) + if tax_lock_date and tax_lock_date != self.env.company['tax_lock_date']: + self._create_default_report_external_values('tax_lock_date') + + # Possibly create default report external values for fiscal year + fiscalyear_lock_date = lock_date_values.get('fiscalyear_lock_date', None) + hard_lock_date = lock_date_values.get('hard_lock_date', None) + if fiscalyear_lock_date or hard_lock_date: + fiscal_lock_date, field = max([ + (fiscalyear_lock_date, 'fiscalyear_lock_date'), + (hard_lock_date, 'hard_lock_date'), + ], key=lambda t: t[0] or date.min) + company_fiscal_lock_date = max( + self.env.company.fiscalyear_lock_date or date.min, + self.env.company.hard_lock_date or date.min, + ) + if fiscal_lock_date != company_fiscal_lock_date: + self._create_default_report_external_values(field) + + self.env.company.sudo().write(lock_date_values) + + def change_lock_date(self): + self.ensure_one() + if self.env.user.has_group('account.group_account_manager'): + exception_vals_list = self._prepare_exception_values() + changed_lock_date_values = self._prepare_lock_date_values(exception_vals_list=exception_vals_list) + + if exception_vals_list: + self.env['account.lock_exception'].create(exception_vals_list) + + self._change_lock_date(changed_lock_date_values) + else: + raise UserError(_('Only Billing Administrators are allowed to change lock dates!')) + return {'type': 'ir.actions.act_window_close'} + + def action_show_draft_moves_in_locked_period(self): + self.ensure_one() + return { + 'view_mode': 'list', + 'name': _('Draft Entries'), + 'res_model': 'account.move', + 'type': 'ir.actions.act_window', + 'domain': self._get_draft_moves_in_locked_period_domain(), + 'search_view_id': [self.env.ref('account.view_account_move_filter').id, 'search'], + 'views': [[self.env.ref('account.view_move_tree_multi_edit').id, 'list'], [self.env.ref('account.view_move_form').id, 'form']], + } + + def action_reopen_wizard(self): + # This action can be used to keep the wizard open after doing something else + return { + 'type': 'ir.actions.act_window', + 'res_model': self._name, + 'res_id': self.id, + 'view_mode': 'form', + 'target': 'new', + } + + def _action_revoke_min_exception(self, exception_field): + self.ensure_one() + exception = self[exception_field] + if exception: + exception.action_revoke() + self._compute_lock_date_exceptions() + return self.action_reopen_wizard() + + def action_revoke_min_sale_lock_date_exception_for_me(self): + return self._action_revoke_min_exception('min_sale_lock_date_exception_for_me_id') + + def action_revoke_min_purchase_lock_date_exception_for_me(self): + return self._action_revoke_min_exception('min_purchase_lock_date_exception_for_me_id') + + def action_revoke_min_tax_lock_date_exception_for_me(self): + return self._action_revoke_min_exception('min_tax_lock_date_exception_for_me_id') + + def action_revoke_min_fiscalyear_lock_date_exception_for_me(self): + return self._action_revoke_min_exception('min_fiscalyear_lock_date_exception_for_me_id') + + def action_revoke_min_sale_lock_date_exception_for_everyone(self): + return self._action_revoke_min_exception('min_sale_lock_date_exception_for_everyone_id') + + def action_revoke_min_purchase_lock_date_exception_for_everyone(self): + return self._action_revoke_min_exception('min_purchase_lock_date_exception_for_everyone_id') + + def action_revoke_min_tax_lock_date_exception_for_everyone(self): + return self._action_revoke_min_exception('min_tax_lock_date_exception_for_everyone_id') + + def action_revoke_min_fiscalyear_lock_date_exception_for_everyone(self): + return self._action_revoke_min_exception('min_fiscalyear_lock_date_exception_for_everyone_id') diff --git a/dev_odex30_accounting/odex30_account_accountant/wizard/account_change_lock_date.xml b/dev_odex30_accounting/odex30_account_accountant/wizard/account_change_lock_date.xml new file mode 100644 index 0000000..80fd256 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/wizard/account_change_lock_date.xml @@ -0,0 +1,236 @@ + + + + + + account.change.lock.date.form + account.change.lock.date + +
    + + + + +
    + Lock transactions up to specific dates, inclusive +
    + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    + + + Lock Journal Entries + account.change.lock.date + form + + new + + + +
    +
    diff --git a/dev_odex30_accounting/odex30_account_accountant/wizard/account_reconcile_wizard.py b/dev_odex30_accounting/odex30_account_accountant/wizard/account_reconcile_wizard.py new file mode 100644 index 0000000..9605d77 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/wizard/account_reconcile_wizard.py @@ -0,0 +1,772 @@ +from collections import defaultdict +from datetime import timedelta + +from odoo import api, Command, fields, models, _ +from odoo.exceptions import UserError +from odoo.tools import groupby, SQL +from odoo.tools.misc import formatLang + + +class AccountReconcileWizard(models.TransientModel): + """ This wizard is used to reconcile selected account.move.line. """ + _name = 'account.reconcile.wizard' + _description = 'Account reconciliation wizard' + _check_company_auto = True + + @api.model + def default_get(self, fields_list): + res = super().default_get(fields_list) + if 'move_line_ids' not in fields_list: + return res + if self.env.context.get('active_model') != 'account.move.line' or not self.env.context.get('active_ids'): + raise UserError(_('This can only be used on journal items')) + move_line_ids = self.env['account.move.line'].browse(self.env.context['active_ids']) + accounts = move_line_ids.account_id + if len(accounts) > 2: + raise UserError(_( + 'You can only reconcile entries with up to two different accounts: %s', + ', '.join(accounts.mapped('display_name')), + )) + shadowed_aml_values = None + if len(accounts) == 2: + shadowed_aml_values = { + aml: {'account_id': move_line_ids[0].account_id} + for aml in move_line_ids.filtered(lambda line: line.account_id != move_line_ids[0].account_id) + } + move_line_ids._check_amls_exigibility_for_reconciliation(shadowed_aml_values=shadowed_aml_values) + res['move_line_ids'] = [Command.set(move_line_ids.ids)] + return res + + company_id = fields.Many2one(comodel_name='res.company', required=True, readonly=True, compute='_compute_company_id') + move_line_ids = fields.Many2many( + comodel_name='account.move.line', + string='Move lines to reconcile', + required=True) + reco_account_id = fields.Many2one( + comodel_name='account.account', + string='Reconcile Account', + compute='_compute_reco_wizard_data') + amount = fields.Monetary( + string='Amount in company currency', + currency_field='company_currency_id', + compute='_compute_reco_wizard_data') + company_currency_id = fields.Many2one(comodel_name='res.currency', string='Company currency', related='company_id.currency_id') + amount_currency = fields.Monetary( + string='Amount', + currency_field='reco_currency_id', + compute='_compute_reco_wizard_data') + reco_currency_id = fields.Many2one( + comodel_name='res.currency', + string='Currency to use for reconciliation', + compute='_compute_reco_wizard_data') + edit_mode_amount = fields.Monetary( + currency_field='company_currency_id', + compute='_compute_edit_mode_amount', + ) + edit_mode_amount_currency = fields.Monetary( + string='Edit mode amount', + currency_field='edit_mode_reco_currency_id', + compute='_compute_edit_mode_amount_currency', + store=True, + readonly=False, + ) + edit_mode_reco_currency_id = fields.Many2one( + comodel_name='res.currency', + compute='_compute_edit_mode_reco_currency', + ) + edit_mode = fields.Boolean( + compute='_compute_edit_mode', + ) + single_currency_mode = fields.Boolean(compute='_compute_single_currency_mode') + allow_partials = fields.Boolean(string="Allow partials", compute='_compute_allow_partials', store=True, readonly=False) + force_partials = fields.Boolean(compute='_compute_reco_wizard_data') + display_allow_partials = fields.Boolean(compute='_compute_display_allow_partials') + date = fields.Date(string='Date', compute='_compute_date', store=True, readonly=False) + journal_id = fields.Many2one( + comodel_name='account.journal', + string='Journal', + check_company=True, + domain="[('type', '=', 'general')]", + compute='_compute_journal_id', + store=True, + readonly=False, + required=True, + precompute=True) + account_id = fields.Many2one( + comodel_name='account.account', + string='Account', + check_company=True, + domain="[('deprecated', '=', False), ('account_type', '!=', 'off_balance')]") + is_rec_pay_account = fields.Boolean(compute='_compute_is_rec_pay_account') + to_partner_id = fields.Many2one( + comodel_name='res.partner', + string='Partner', + check_company=True, + compute='_compute_to_partner_id', + store=True, + readonly=False, + ) + label = fields.Char(string='Label', default='Write-Off') + tax_id = fields.Many2one( + comodel_name='account.tax', + string='Tax', + default=False, + check_company=True) + to_check = fields.Boolean( + string='To Check', + default=False, + help='Check if you are not certain of all the information of the counterpart.') + is_write_off_required = fields.Boolean( + string='Is a write-off move required to reconcile', + compute='_compute_is_write_off_required') + is_transfer_required = fields.Boolean( + string='Is an account transfer required', + compute='_compute_reco_wizard_data') + transfer_warning_message = fields.Char( + string='Is an account transfer required to reconcile', + compute='_compute_reco_wizard_data') + transfer_from_account_id = fields.Many2one( + comodel_name='account.account', + string='Account Transfer From', + compute='_compute_reco_wizard_data') + lock_date_violated_warning_message = fields.Char( + string='Is the date violating the lock date of moves', + compute='_compute_lock_date_violated_warning_message') + reco_model_id = fields.Many2one( + comodel_name='account.reconcile.model', + string='Reconciliation model', + store=False, + check_company=True) + reco_model_autocomplete_ids = fields.Many2many( + comodel_name='account.reconcile.model', + string='All reconciliation models', + compute='_compute_reco_model_autocomplete_ids') + + # ==== Compute methods ==== + @api.depends('move_line_ids.company_id') + def _compute_company_id(self): + for wizard in self: + wizard.company_id = wizard.move_line_ids[0].company_id + + @api.depends('move_line_ids') + def _compute_single_currency_mode(self): + for wizard in self: + wizard.single_currency_mode = len(wizard.move_line_ids.currency_id - wizard.company_currency_id) <= 1 + + @api.depends('force_partials') + def _compute_allow_partials(self): + for wizard in self: + wizard.allow_partials = wizard.display_allow_partials and wizard.force_partials + + @api.depends('move_line_ids') + def _compute_display_allow_partials(self): + """ We only display the allow partial checkbox if there is both credit and debit lines involved. """ + for wizard in self: + wizard.display_allow_partials = has_debit_line = has_credit_line = False + for aml in wizard.move_line_ids: + if aml.balance > 0.0 or aml.amount_currency > 0.0: + has_debit_line = True + elif aml.balance < 0.0 or aml.amount_currency < 0.0: + has_credit_line = True + if has_debit_line and has_credit_line: + wizard.display_allow_partials = True + break + + @api.depends('move_line_ids', 'journal_id', 'tax_id') + def _compute_date(self): + for wizard in self: + highest_date = max(aml.date for aml in wizard.move_line_ids) + temp_move = self.env['account.move'].new({'journal_id': wizard.journal_id.id}) + wizard.date = temp_move._get_accounting_date(highest_date, bool(wizard.tax_id)) + + @api.depends('company_id') + def _compute_journal_id(self): + for wizard in self: + wizard.journal_id = self.env['account.journal'].search([ + *self.env['account.journal']._check_company_domain(wizard.company_id), + ('type', '=', 'general') + ], limit=1) + + @api.depends('account_id') + def _compute_is_rec_pay_account(self): + for wizard in self: + wizard.is_rec_pay_account = wizard.account_id.account_type in ('asset_receivable', 'liability_payable') + + @api.depends('is_rec_pay_account') + def _compute_to_partner_id(self): + for wizard in self: + if wizard.is_rec_pay_account: + partners = wizard.move_line_ids.partner_id + wizard.to_partner_id = partners if len(partners) == 1 else None + else: + wizard.to_partner_id = None + + @api.depends('amount', 'amount_currency') + def _compute_is_write_off_required(self): + """ We need a write-off if the balance is not 0 and if we don't allow partial reconciliation.""" + for wizard in self: + wizard.is_write_off_required = not wizard.company_currency_id.is_zero(wizard.amount) \ + or (wizard.reco_currency_id and not wizard.reco_currency_id.is_zero(wizard.amount_currency)) + + @api.depends('move_line_ids') + def _compute_reco_wizard_data(self): + """ Compute various data needed for the reco wizard. + 1. The currency to use for the reconciliation: + - if only one foreign currency is present in move lines we use it, unless the reco_account is not + payable nor receivable, + - if no foreign currency or more than 1 are used we use the company's default currency. + 2. The account the reconciliation will happen on. + 3. Transfer data. + 4. Write-off amounts. + """ + + def get_transfer_data(move_lines): + amounts_per_account = defaultdict(float) + for line in move_lines: + amounts_per_account[line.account_id] += line.amount_residual + if abs(amounts_per_account[accounts[0]]) < abs(amounts_per_account[accounts[1]]): + transfer_from_account, transfer_to_account = accounts[0], accounts[1] + else: + transfer_from_account, transfer_to_account = accounts[1], accounts[0] + + amls_to_transfer = amls.filtered(lambda aml: aml.account_id == transfer_from_account) + transfer_foreign_curr = amls.currency_id - amls.company_currency_id + if len(transfer_foreign_curr) == 1: + transfer_currency = transfer_foreign_curr + transfer_amount_currency = sum(aml.amount_currency for aml in amls_to_transfer) + else: + transfer_currency = amls.company_currency_id + transfer_amount_currency = sum(aml.balance for aml in amls_to_transfer) + + if transfer_amount_currency == 0.0 and transfer_currency != amls.company_currency_id: + # handle the transfer of exchange diff + transfer_currency = amls.company_currency_id + transfer_amount_currency = sum(aml.balance for aml in amls_to_transfer) + + amount_formatted = formatLang(self.env, abs(transfer_amount_currency), currency_obj=transfer_currency) + transfer_warning_message = _( + 'An entry will transfer %(amount)s from %(from_account)s to %(to_account)s.', + amount=amount_formatted, + from_account=transfer_from_account.display_name if transfer_amount_currency < 0 else transfer_to_account.display_name, + to_account=transfer_to_account.display_name if transfer_amount_currency < 0 else transfer_from_account.display_name, + ) + return { + 'transfer_from_account_id': transfer_from_account, + 'reco_account_id': transfer_to_account, + 'transfer_warning_message': transfer_warning_message, + } + + def get_reco_currency(amls, aml_values_map): + company_currency = amls.company_currency_id + foreign_currencies = amls.currency_id - company_currency + if len(foreign_currencies) == 0: + return company_currency + elif len(foreign_currencies) == 1: + return foreign_currencies + else: + lines_with_residuals = self.env['account.move.line'] + for residual, residual_values in aml_values_map.items(): + if residual_values['amount_residual'] or residual_values['amount_residual_currency']: + lines_with_residuals += residual + if lines_with_residuals and len(lines_with_residuals.currency_id - company_currency) > 1: + # there is more than one residual and more than one currency in them + return False + return (lines_with_residuals.currency_id - company_currency) or company_currency + + for wizard in self: + amls = wizard.move_line_ids._origin + accounts = amls.account_id # there is only 1 or 2 possible accounts + + wizard.reco_currency_id = False + wizard.amount_currency = wizard.amount = 0.0 + wizard.force_partials = True + wizard.transfer_from_account_id = wizard.transfer_warning_message = False + wizard.is_transfer_required = len(accounts) == 2 + if wizard.is_transfer_required: + wizard.update(get_transfer_data(amls)) + else: + wizard.reco_account_id = accounts + + # Compute the residual amounts for each account. + shadowed_aml_values = { + aml: {'account_id': wizard.reco_account_id} + for aml in amls + } + + # Batch the amls all together to know what should be reconciled and when. + plan_list, all_amls = amls._optimize_reconciliation_plan([amls], shadowed_aml_values=shadowed_aml_values) + + # Prefetch data + all_amls.move_id + all_amls.matched_debit_ids + all_amls.matched_credit_ids + + # All residual amounts are collected and updated until the creation of partials in batch. + # This is done that way to minimize the orm time for fields invalidation/mark as recompute and + # re-computation. + aml_values_map = { + aml: { + 'aml': aml, + 'amount_residual': aml.amount_residual, + 'amount_residual_currency': aml.amount_residual_currency, + } + for aml in all_amls + } + + disable_partial_exchange_diff = bool(self.env['ir.config_parameter'].sudo().get_param('account.disable_partial_exchange_diff')) + plan = plan_list[0] + # residuals are subtracted from aml_values_map + amls\ + .with_context(no_exchange_difference=self._context.get('no_exchange_difference') or disable_partial_exchange_diff) \ + ._prepare_reconciliation_plan(plan, aml_values_map, shadowed_aml_values=shadowed_aml_values) + + reco_currency = get_reco_currency(amls, aml_values_map) + if not reco_currency: + continue # stop the computation, no possible write-off => force partials + + residual_amounts = { + aml: aml._prepare_move_line_residual_amounts(aml_values, reco_currency, shadowed_aml_values=shadowed_aml_values) + for aml, aml_values in aml_values_map.items() + } + + if all(reco_currency in residual_values for residual_values in residual_amounts.values() if residual_values): + wizard.reco_currency_id = reco_currency + elif all(amls.company_currency_id in residual_values for residual_values in residual_amounts.values() if residual_values): + wizard.reco_currency_id = amls.company_currency_id + reco_currency = wizard.reco_currency_id + else: + continue # stop the computation, no possible write-off => force partials + + # Compute write-off amounts + most_recent_line = max(amls, key=lambda aml: aml.date) + if not most_recent_line.amount_currency: + rate = rate_lower_bound = rate_upper_bound = 0.0 + elif most_recent_line.currency_id == reco_currency: + rate = abs(most_recent_line.balance / most_recent_line.amount_currency) + # By estimating the rate from the most recent line, we are exposing ourselves to an estimation error because + # balance is amount_currency * rate, rounded to the nearest precision of the company currency. We now compute + # the lower/upper bounds of the estimated rate in order to determine which other AMLs share the same rate. + # For AMLs that share the same rate, we will use the existing amount_residual instead of recomputing it + # based on the amount_residual_currency and the rate. + rate_tolerance = amls.company_currency_id.rounding / 2 / abs(most_recent_line.amount_currency) + rate_lower_bound = rate - rate_tolerance + rate_upper_bound = rate + rate_tolerance + else: + rate = self.env['res.currency']._get_conversion_rate(reco_currency, amls.company_currency_id, amls.company_id, most_recent_line.date) + rate_lower_bound = rate_upper_bound = rate + + # If an AML's rate is close enough to the reconciliation rate that it could be the same, + # use the `amount_residual` instead of computing `amount_residual_currency / rate` and rounding. + # We do this for the case where a single rate is used for all reconciled AMLs so we want to avoid + # creating an exchange diff because that would be weird. + amls_where_amounts_at_correct_rate = { + aml + for aml, residual_values in residual_amounts.items() + if ( + aml.currency_id == reco_currency + and abs(aml.balance) >= aml.company_currency_id.round(abs(aml.amount_currency) * rate_lower_bound) + and abs(aml.balance) <= aml.company_currency_id.round(abs(aml.amount_currency) * rate_upper_bound) + ) + } + + wizard.amount_currency = sum( + residual_values[wizard.reco_currency_id]['residual'] + for residual_values in residual_amounts.values() + if residual_values + ) + amount_raw = sum( + ( + residual_values[amls.company_currency_id]['residual'] + if aml in amls_where_amounts_at_correct_rate and amls.company_currency_id in residual_values else + residual_values[wizard.reco_currency_id]['residual'] * rate + ) + for aml, residual_values in residual_amounts.items() + if residual_values + ) + wizard.amount = amls.company_currency_id.round(amount_raw) + wizard.force_partials = False + + @api.depends('move_line_ids') + def _compute_edit_mode_amount_currency(self): + for wizard in self: + if wizard.edit_mode: + wizard.edit_mode_amount_currency = wizard.amount_currency + else: + wizard.edit_mode_amount_currency = 0.0 + + @api.depends('edit_mode_amount_currency') + def _compute_edit_mode_amount(self): + for wizard in self: + if wizard.edit_mode: + single_line = wizard.move_line_ids + rate = abs(single_line.amount_currency / single_line.balance) if single_line.balance else 0.0 + wizard.edit_mode_amount = single_line.company_currency_id.round(wizard.edit_mode_amount_currency / rate) if rate else 0.0 + else: + wizard.edit_mode_amount = 0.0 + + @api.depends('move_line_ids') + def _compute_edit_mode_reco_currency(self): + for wizard in self: + if wizard.edit_mode: + wizard.edit_mode_reco_currency_id = wizard.move_line_ids.currency_id + else: + wizard.edit_mode_reco_currency_id = False + + @api.depends('move_line_ids') + def _compute_edit_mode(self): + for wizard in self: + wizard.edit_mode = len(wizard.move_line_ids) == 1 + + @api.depends('move_line_ids.move_id', 'date') + def _compute_lock_date_violated_warning_message(self): + for wizard in self: + date_after_lock = wizard._get_date_after_lock_date() + lock_date_violated_warning_message = None + if date_after_lock: + lock_date_violated_warning_message = _( + 'The date you set violates the lock date of one of your entry. It will be overriden by the following date : %(replacement_date)s', + replacement_date=date_after_lock, + ) + wizard.lock_date_violated_warning_message = lock_date_violated_warning_message + + @api.depends('company_id') + def _compute_reco_model_autocomplete_ids(self): + """ Computes available reconcile models, we only take models that are of type 'writeoff_button' + and that have one (and only one) line. + """ + for wizard in self: + domain = [ + ('rule_type', '=', 'writeoff_button'), + ('company_id', '=', wizard.company_id.id), + ('counterpart_type', 'not in', ('sale', 'purchase')), + ] + query = self.env['account.reconcile.model']._where_calc(domain) + reco_model_ids = [r[0] for r in self.env.execute_query(SQL(""" + SELECT account_reconcile_model.id + FROM %s + JOIN account_reconcile_model_line line ON line.model_id = account_reconcile_model.id + WHERE %s + GROUP BY account_reconcile_model.id + HAVING COUNT(account_reconcile_model.id) = 1 + """, query.from_clause, query.where_clause or SQL("TRUE")))] + wizard.reco_model_autocomplete_ids = self.env['account.reconcile.model'].browse(reco_model_ids) + + # ==== Onchange methods ==== + @api.onchange('reco_model_id') + def _onchange_reco_model_id(self): + """ We prefill the write-off data with the reconcile model selected. """ + if self.reco_model_id: + self.to_check = self.reco_model_id.to_check + self.label = self.reco_model_id.line_ids.label + self.tax_id = self.reco_model_id.line_ids.tax_ids[0] if self.reco_model_id.line_ids[0].tax_ids else None + self.journal_id = self.reco_model_id.line_ids.journal_id # we limited models to those with one and only one line + self.account_id = self.reco_model_id.line_ids.account_id + + # ==== Python constrains ==== + @api.constrains('edit_mode_amount_currency') + def _check_min_max_edit_mode_amount_currency(self): + for wizard in self: + if wizard.edit_mode: + if wizard.edit_mode_amount_currency == 0.0: + raise UserError(_('The amount of the write-off of a single line cannot be 0.')) + is_debit_line = wizard.move_line_ids.balance > 0.0 or wizard.move_line_ids.amount_currency > 0.0 + if is_debit_line and wizard.edit_mode_amount_currency < 0.0: + raise UserError(_('The amount of the write-off of a single debit line should be strictly positive.')) + elif not is_debit_line and wizard.edit_mode_amount_currency > 0.0: + raise UserError(_('The amount of the write-off of a single credit line should be strictly negative.')) + + # ==== Actions methods ==== + def _action_open_wizard(self): + self.ensure_one() + return { + 'name': _('Write-Off Entry'), + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'account.reconcile.wizard', + 'target': 'new', + } + + # ==== Business methods ==== + + def _get_date_after_lock_date(self): + self.ensure_one() + lock_dates = self.company_id._get_violated_lock_dates(self.date, bool(self.tax_id), self.journal_id) + if lock_dates: + return lock_dates[-1][0] + timedelta(days=1) + + def _compute_write_off_taxes_data(self, partner): + """ Computes the data needed to fill the write-off lines related to taxes. + :return: a dict of the form { + 'base_amount': 100.0, + 'base_amount_currency': 200.0, + 'tax_lines_data': [{ + 'tax_amount': 21.0, + 'tax_amount_currency': 42.0, + 'tax_tag_ids': [tax_tags], + 'tax_account_id': id_of_account, + } * nr of repartition lines of the self.tax_id ], + } + """ + AccountTax = self.env['account.tax'] + amount_currency = self.edit_mode_amount_currency or self.amount_currency + amount = self.edit_mode_amount or self.amount + rate = abs(amount_currency / amount) + tax_type = self.tax_id.type_tax_use if self.tax_id else None + is_refund = (tax_type == 'sale' and amount_currency > 0.0) or (tax_type == 'purchase' and amount_currency < 0.0) + base_line = AccountTax._prepare_base_line_for_taxes_computation( + self, + partner_id=partner, + currency_id=self.reco_currency_id, + tax_ids=self.tax_id, + price_unit=amount_currency, + quantity=1.0, + account_id=self.account_id, + is_refund=is_refund, + rate=rate, + special_mode='total_included', + ) + base_lines = [base_line] + AccountTax._add_tax_details_in_base_lines(base_lines, self.company_id) + AccountTax._round_base_lines_tax_details(base_lines, self.company_id) + AccountTax._add_accounting_data_in_base_lines_tax_details(base_lines, self.company_id, include_caba_tags=True) + tax_results = AccountTax._prepare_tax_lines(base_lines, self.company_id) + _base_line, base_to_update = tax_results['base_lines_to_update'][0] # we can only have one baseline + tax_lines_data = [] + for tax_line_vals in tax_results['tax_lines_to_add']: + tax_lines_data.append({ + 'tax_amount': tax_line_vals['balance'], + 'tax_amount_currency': tax_line_vals['amount_currency'], + 'tax_tag_ids': tax_line_vals['tax_tag_ids'], + 'tax_account_id': tax_line_vals['account_id'], + }) + base_amount_currency = base_to_update['amount_currency'] + base_amount = amount - sum(entry['tax_amount'] for entry in tax_lines_data) + + return { + 'base_amount': base_amount, + 'base_amount_currency': base_amount_currency, + 'base_tax_tag_ids': base_to_update['tax_tag_ids'], + 'tax_lines_data': tax_lines_data, + } + + def _create_write_off_lines(self, partner=None): + if not partner: + partner = self.env['res.partner'] + to_partner = self.to_partner_id if self.is_rec_pay_account else partner + tax_data = self._compute_write_off_taxes_data(to_partner) if self.tax_id else None + amount_currency = self.edit_mode_amount_currency or self.amount_currency + amount = self.edit_mode_amount or self.amount + line_ids_commands = [ + Command.create({ + 'name': self.label or _('Write-Off'), + 'account_id': self.reco_account_id.id, + 'partner_id': partner.id, + 'currency_id': self.reco_currency_id.id, + 'amount_currency': -amount_currency, + 'balance': -amount, + }), + Command.create({ + 'name': self.label, + 'account_id': self.account_id.id, + 'partner_id': to_partner.id, + 'currency_id': self.reco_currency_id.id, + 'tax_ids': self.tax_id.ids, + 'tax_tag_ids': None if not tax_data else tax_data['base_tax_tag_ids'], + 'amount_currency': amount_currency if not tax_data else tax_data['base_amount_currency'], + 'balance': amount if not tax_data else tax_data['base_amount'], + }), + ] + # Add taxes lines to the write-off lines, one per repartition line + if tax_data: + for tax_datum in tax_data['tax_lines_data']: + line_ids_commands.append(Command.create({ + 'name': self.tax_id.name, + 'account_id': tax_datum['tax_account_id'], + 'partner_id': to_partner.id, + 'currency_id': self.reco_currency_id.id, + 'tax_tag_ids': tax_datum['tax_tag_ids'], + 'amount_currency': tax_datum['tax_amount_currency'], + 'balance': tax_datum['tax_amount'], + })) + return line_ids_commands + + def create_write_off(self): + """ Create write-off move lines with the data provided in the wizard. """ + self.ensure_one() + partners = self.move_line_ids.partner_id + partner = partners if len(partners) == 1 else None + write_off_vals = { + 'journal_id': self.journal_id.id, + 'company_id': self.company_id.id, + 'date': self._get_date_after_lock_date() or self.date, + 'move_type': 'entry', + 'checked': not self.to_check, + 'line_ids': self._create_write_off_lines(partner=partner) + } + write_off_move = self.env['account.move'].with_context( + skip_invoice_sync=True, + skip_invoice_line_sync=True, + ).create(write_off_vals) + write_off_move.action_post() + return write_off_move + + def create_transfer(self): + """ Create transfer move. + We transfer lines squashed by partner and by currency to keep the partner ledger correct. + By default, the source line and the destination line of each transfer are linked to the same partner. + However, it can happen that the moves that are being reconciled together come from different partners + (e.g. reconciling an invoice of Partner X with a bill of Parnter Y). + In that case, one of the transfer lines should be set to the other partner. + Otherwise, the partner ledger will be wrong for both users. + """ + self.ensure_one() + line_ids = [] + lines_to_transfer = self.move_line_ids.filtered(lambda line: line.account_id == self.transfer_from_account_id) + # The lines that are not transferred will be used to determine the partners of the destination lines + other_lines = self.move_line_ids.filtered(lambda line: line.account_id == self.reco_account_id) + # Default dict for the destination lines. It contains the inverse of the source lines + # {(partner, currency, sign): {'balance': float, 'amount_currency': float}} + default_destination_data = dict() + # Dict generated from the lines linked to the reconcile model. + # It is splitted by partner and represents the possible partners and the amount max that can be used + # for the destination lines. + # {(currency, sign): {(partner): {'balance': float, 'amount_currency': float}}} + amounts_by_partner = defaultdict(lambda: defaultdict(lambda: defaultdict(float))) + # Final dict containing the data from which the destination lines will be created + # {(partner, currency, sign): {'balance': float, 'amount_currency': float}} + destination_data = defaultdict(lambda: defaultdict(float)) + + for (partner, currency), lines_to_transfer_partner in groupby(lines_to_transfer, lambda l: (l.partner_id, l.currency_id)): + amount = sum(line.amount_residual for line in lines_to_transfer_partner) + amount_currency = sum(line.amount_residual_currency for line in lines_to_transfer_partner) + line_ids += [ + Command.create({ + 'name': _('Transfer to %s', self.reco_account_id.display_name), + 'account_id': self.transfer_from_account_id.id, + 'partner_id': partner.id, + 'currency_id': currency.id, + 'amount_currency': -amount_currency, + 'balance': -amount, + }), + ] + sign = -1 if amount < 0 else 1 + # By default, the partner of the destination line will be the same than the one of the source line. + # As the transfer move should be balanced, the amounts defined here represent the total amount that + # will be in the destination lines. + # They may be split between several partners though. + default_destination_data[partner, currency, sign] = { + 'balance': amount, + 'amount_currency': amount_currency, + } + # Run through the lines linked to the reconcile account to determine the possible partners and amounts for the destination + # lines of the transfer + for (partner, currency), lines_to_transfer_partner in groupby(other_lines, lambda l: (l.partner_id, l.currency_id)): + amount = -sum(line.amount_residual for line in lines_to_transfer_partner) + amount_currency = -sum(line.amount_residual_currency for line in lines_to_transfer_partner) + sign = -1 if amount < 0 else 1 + # If the partner, currency and sign of the amounts match one of the default data, it is kept for the destination lines. + # The amounts will be adapted with the remaining amounts. + if (partner, currency, sign) in default_destination_data: + default_amount = default_destination_data[partner, currency, sign]['balance'] + default_amount_currency = default_destination_data[partner, currency, sign]['amount_currency'] + amount_to_transfer = min(abs(amount), abs(default_amount)) * sign + amount_currency_to_transfer = min(abs(amount_currency), abs(default_amount_currency)) * sign + destination_data[partner, currency, sign] = { + 'balance': amount_to_transfer, + 'amount_currency': amount_currency_to_transfer, + } + default_amount -= amount_to_transfer + default_amount_currency -= amount_currency_to_transfer + amount -= amount_to_transfer + amount_currency -= amount_currency_to_transfer + if not currency.is_zero(abs(default_amount)): + # Update the default amounts with the remaining amounts that have not been kept + default_destination_data[partner, currency, sign] = { + 'balance': default_amount, + 'amount_currency': default_amount_currency, + } + else: + # Delete the key if there is no remaining amount + del default_destination_data[partner, currency, sign] + if not currency.is_zero(abs(amount)): + amounts_by_partner[currency, sign][partner] = { + 'balance': amount, + 'amount_currency': amount_currency, + } + # Run through what's left of the default data and try to find a partner that matches the currency and sign. + # If none is found, the partner from the source line is used. + for (partner, currency, sign) in default_destination_data: + amount = default_destination_data[partner, currency, sign]['balance'] + amount_currency = default_destination_data[partner, currency, sign]['amount_currency'] + # Loop on all the partners with the same currency and sign + for p in amounts_by_partner[currency, sign]: + if amount == 0: + break + amount_to_transfer = min(abs(amount), abs(amounts_by_partner[currency, sign][p]['balance'])) * sign + amount_currency_to_transfer = min(abs(amount_currency), abs(amounts_by_partner[currency, sign][p]['amount_currency'])) * sign + amount -= amount_to_transfer + amount_currency -= amount_currency_to_transfer + + destination_data[p, currency, sign]['balance'] += amount_to_transfer + destination_data[p, currency, sign]['amount_currency'] += amount_currency_to_transfer + amounts_by_partner[currency, sign][p]['balance'] -= amount_to_transfer + amounts_by_partner[currency, sign][p]['amount_currency'] -= amount_currency_to_transfer + # Residual amount that couldn't be associated to another partner keeps the partner from the source line + if not currency.is_zero(abs(amount)): + destination_data[partner, currency, sign]['balance'] += amount + destination_data[partner, currency, sign]['amount_currency'] += amount_currency + # Create the destination lines + for (partner, currency, sign) in destination_data: + line_ids += [ + Command.create({ + 'name': _('Transfer from %s', self.transfer_from_account_id.display_name), + 'account_id': self.reco_account_id.id, + 'partner_id': partner.id, + 'currency_id': currency.id, + 'amount_currency': destination_data[partner, currency, sign]['amount_currency'], + 'balance': destination_data[partner, currency, sign]['balance'], + }), + ] + transfer_vals = { + 'journal_id': self.journal_id.id, + 'company_id': self.company_id.id, + 'date': self._get_date_after_lock_date() or self.date, + 'line_ids': line_ids, + } + transfer_move = self.env['account.move'].create(transfer_vals) + transfer_move.action_post() + return transfer_move + + def reconcile(self): + """ Reconcile selected moves, with a transfer and/or write-off move if necessary.""" + self.ensure_one() + move_lines_to_reconcile = self.move_line_ids._origin + do_transfer = self.is_transfer_required + do_write_off = self.edit_mode or (self.is_write_off_required and not self.allow_partials) + if do_transfer: + transfer_move = self.create_transfer() + lines_to_transfer = move_lines_to_reconcile \ + .filtered(lambda line: line.account_id == self.transfer_from_account_id) + transfer_line_from = transfer_move.line_ids \ + .filtered(lambda line: line.account_id == self.transfer_from_account_id) + transfer_line_to = transfer_move.line_ids \ + .filtered(lambda line: line.account_id == self.reco_account_id) + (lines_to_transfer + transfer_line_from).reconcile() + move_lines_to_reconcile = move_lines_to_reconcile - lines_to_transfer + transfer_line_to + + if do_write_off: + write_off_move = self.create_write_off() + write_off_line_to_reconcile = write_off_move.line_ids[0] + move_lines_to_reconcile += write_off_line_to_reconcile + amls_plan = [[move_lines_to_reconcile, write_off_line_to_reconcile]] + else: + amls_plan = [move_lines_to_reconcile] + + self.env['account.move.line']._reconcile_plan(amls_plan) + return move_lines_to_reconcile if not do_transfer else (move_lines_to_reconcile + transfer_move.line_ids) + + def reconcile_open(self): + """ Reconcile selected move lines and open them in dedicated view. """ + self.ensure_one() + return self.reconcile().open_reconcile_view() diff --git a/dev_odex30_accounting/odex30_account_accountant/wizard/account_reconcile_wizard.xml b/dev_odex30_accounting/odex30_account_accountant/wizard/account_reconcile_wizard.xml new file mode 100644 index 0000000..f9f751b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/wizard/account_reconcile_wizard.xml @@ -0,0 +1,120 @@ + + + + account.reconcile.wizard.form + account.reconcile.wizard + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    + + in + +
    +
    + ( + + + + ) +
    +
    +
    +
    + + in + +
    +
    + + +
    +
    + +
    +
    + +
    +
    +
    diff --git a/dev_odex30_accounting/odex30_account_accountant/wizard/reconcile_model_wizard.xml b/dev_odex30_accounting/odex30_account_accountant/wizard/reconcile_model_wizard.xml new file mode 100644 index 0000000..30858ca --- /dev/null +++ b/dev_odex30_accounting/odex30_account_accountant/wizard/reconcile_model_wizard.xml @@ -0,0 +1,45 @@ + + + + + account.reconcile.model.form + account.reconcile.model + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    diff --git a/dev_odex30_accounting/odex30_account_asset/__init__.py b/dev_odex30_accounting/odex30_account_asset/__init__.py new file mode 100644 index 0000000..35e7c96 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import models +from . import wizard diff --git a/dev_odex30_accounting/odex30_account_asset/__manifest__.py b/dev_odex30_accounting/odex30_account_asset/__manifest__.py new file mode 100644 index 0000000..f53d21c --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/__manifest__.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- + +{ + 'name': 'Assets Management', + 'description': """ +Assets management +================= +Manage assets owned by a company or a person. +Keeps track of depreciations, and creates corresponding journal entries. + + """, + 'category': 'Odex30-Accounting/Odex30-Accounting', + 'author': 'Expert Co. Ltd.', + 'website': 'http://www.exp-sa.com', 'sequence': 32, + 'depends': ['odex30_account_reports'], + 'data': [ + 'security/account_asset_security.xml', + 'security/ir.model.access.csv', + 'wizard/asset_modify_views.xml', + 'views/account_account_views.xml', + 'views/account_asset_views.xml', + 'views/account_asset_group_views.xml', + 'views/account_move_views.xml', + 'data/assets_report.xml', + 'data/account_report_actions.xml', + 'data/menuitems.xml', + ], + 'demo': [ + 'demo/odex30_account_asset_demo.xml', + ], + 'auto_install': True, + 'assets': { + 'odex30_account_reports.assets_financial_report': [ + 'odex30_odex30_account_asset/static/src/scss/account_asset.scss', + ], + 'web.assets_backend': [ + 'odex30_account_asset/static/src/scss/account_asset.scss', + 'odex30_account_asset/static/src/components/**/*', + 'odex30_account_asset/static/src/views/**/*', + 'odex30_account_asset/static/src/web/**/*', + ], + 'web.assets_web_dark': [ + 'odex30_account_asset/static/src/scss/*.dark.scss', + ], + } +} diff --git a/dev_odex30_accounting/odex30_account_asset/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_asset/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2a3e96f46e3f475e98d3a437af91d6a1c1cfa54 GIT binary patch literal 327 zcmZ3^%ge<81j4%`Go69-V-N=hn4pZ$azMs(h7^Vr#vF!R#wbQc5St0eW{P40vYCS! zG+ACU0u^a8-eSwmPf5)w2C>RBs}hS+{4|+wF%&TaWs6vV#7c(GK$78Coqk4sZmND_ zPIg9ORZ&)^en4e%Mq*KJKv8~HYH~@jKG2v7V*? + + + Depreciation Schedule + account_report + + + diff --git a/dev_odex30_accounting/odex30_account_asset/data/assets_report.xml b/dev_odex30_accounting/odex30_account_asset/data/assets_report.xml new file mode 100644 index 0000000..cc8f6b3 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/data/assets_report.xml @@ -0,0 +1,70 @@ + + + + Depreciation Schedule + optional + + + + + + + + Acquisition Date + acquisition_date + date + + + First Depreciation + first_depreciation + date + + + Method + method + string + + + Duration / Rate + duration_rate + string + + + date from + assets_date_from + + + + + assets_plus + + + - + assets_minus + + + date to + assets_date_to + + + date from + depre_date_from + + + + + depre_plus + + + - + depre_minus + + + date to + depre_date_to + + + book_value + balance + + + + diff --git a/dev_odex30_accounting/odex30_account_asset/data/menuitems.xml b/dev_odex30_accounting/odex30_account_asset/data/menuitems.xml new file mode 100644 index 0000000..88ffc1e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/data/menuitems.xml @@ -0,0 +1,8 @@ + + + + diff --git a/dev_odex30_accounting/odex30_account_asset/demo/account_asset_demo.xml b/dev_odex30_accounting/odex30_account_asset/demo/account_asset_demo.xml new file mode 100644 index 0000000..d18d5b8 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/demo/account_asset_demo.xml @@ -0,0 +1,30 @@ + + + + + + Odoo Office + + + + Asset - 5 Years + none + 1000 + + + + + open + + + + diff --git a/dev_odex30_accounting/odex30_account_asset/i18n/ar.po b/dev_odex30_accounting/odex30_account_asset/i18n/ar.po new file mode 100644 index 0000000..b41c9cc --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/i18n/ar.po @@ -0,0 +1,1960 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_asset +# +# Translators: +# Wil Odoo, 2024 +# Malaz Abuidris , 2025 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-06-20 18:52+0000\n" +"PO-Revision-Date: 2024-09-25 09:43+0000\n" +"Last-Translator: Malaz Abuidris , 2025\n" +"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__total_depreciation_entries_count +msgid "# Depreciation Entries" +msgstr "عدد قيود الإهلاك" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__gross_increase_count +msgid "# Gross Increases" +msgstr "عدد الزيادات الإجمالية" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__depreciation_entries_count +msgid "# Posted Depreciation Entries" +msgstr "عدد قيود الإهلاك المُرحلة" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "%(asset)s: Disposal" +msgstr "%(asset)s: التصرف " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "%(asset)s: Sale" +msgstr "%(asset)s: البيع " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_assets_report.py:0 +msgid "%(months)s m" +msgstr "%(months)s شهور " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_move.py:0 +msgid "%(move_line)s (%(current)s of %(total)s)" +msgstr "%(move_line)s (%(current)s من %(total)s) " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_assets_report.py:0 +msgid "%(years)s y" +msgstr "%(years)s سنوات " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "%s (copy)" +msgstr "%s (نسخة)" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "" +"%s Future entries will be recomputed to depreciate the asset following the " +"changes." +msgstr "%s سيتم احتساب القيود المستقبلية لإهلاك الأصل الذي يتبع التغييرات. " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_move.py:0 +msgid "%s: Depreciation" +msgstr "%s: الإهلاك" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_assets_report.py:0 +msgid "(No %s)" +msgstr "(لا %s) " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "(incl." +msgstr "(شاملة " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "" +"A depreciation entry will be posted on and including the date %(date)s. " +"
    %(extra_text)s Future entries will be recomputed to depreciate the " +"asset following the changes." +msgstr "" +"سيتم ترحيل إحدى قيود الإهلاك بتاريخ %(date)s.
    %(extra_text)s سيتم " +"احتساب القيود المستقبلية لإهلاك الأصل الذي يتبع التغييرات. " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "" +"A depreciation entry will be posted on and including the date %(date)s.
    " +" A disposal entry will be posted on the %(account_type)s account " +"%(account)s." +msgstr "" +"سيتم ترحيل قيد الإهلاك بتاريخ %(date)s.
    سيتم ترحيل قيد التصرف في " +"%(account_type)s الحساب %(account)s. " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "" +"A depreciation entry will be posted on and including the date %(date)s.
    " +" A second entry will neutralize the original income and post the outcome of" +" this sale on account %(account)s." +msgstr "" +"سيتم ترحيل قيد الإهلاك بتاريخ %(date)s.
    سيقوم القيد الثاني بتعطيل الدخل" +" الأصلي وترحيل ناتج عملية البيع هذه في الحساب %(account)s. " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "A depreciation entry will be posted on and including the date %s." +msgstr "سيتم ترحيل قيد الإهلاك في التاريخ المتضمن %s." + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "A document linked to %(move_line_name)s has been deleted: %(link)s" +msgstr "تم حذف مستند مرتبط بالحركة %(move_line_name)s: %(link)s " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "A document linked to this move has been deleted: %s" +msgstr "تم حذف مستند مرتبط بهذه الحركة: %s " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "A gross increase has been created: %(link)s" +msgstr "تم إنشاء زيادة إجمالية: %(link)s " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "" +"A non deductible tax value of %(tax_value)s was added to %(name)s's initial " +"value of %(purchase_value)s" +msgstr "" +"تمت إضافة قيمة ضريبة غير قابلة للخصم %(tax_value)s إلى قيمة %(name)s " +"المبدئية، وهي %(purchase_value)s " + +#. module: odex30_account_asset +#: model:ir.model,name:odex30_account_asset.model_account_account +msgid "Account" +msgstr "الحساب " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__account_type +msgid "" +"Account Type is used for information purpose, to generate country-specific " +"legal reports, and set the rules to close a fiscal year and generate opening" +" entries." +msgstr "" +"يُستخدم نوع الحساب في إنشاء التقارير القانونية المخصصة لكل دولة، وتضع " +"القواعد اللازمة لإقفال السنة المالية وإنشاء القيود الافتتاحية للسنة المالية " +"اللاحقة. " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__account_depreciation_id +msgid "Account used in the depreciation entries, to decrease the asset value." +msgstr "الحساب المُستخدَم لقيود الإهلاك، لتخفيض قيمة الأصل. " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__account_depreciation_expense_id +msgid "" +"Account used in the periodical entries, to record a part of the asset as " +"expense." +msgstr "الحساب المستخدم للقيود الدورية لتسجيل جزء من الأصل كنفقة. " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__account_asset_id +msgid "" +"Account used to record the purchase of the asset at its original price." +msgstr "الحساب المُستخدَم لتسجيل شراء الأصل بسعره الأصلي. " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_asset_modify__gain_account_id +msgid "Account used to write the journal item in case of gain" +msgstr "الحساب المُستخدَم لكتابة عنصر اليومية في حالة الربح " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_res_company__gain_account_id +msgid "" +"Account used to write the journal item in case of gain while selling an " +"asset" +msgstr "" +"الحساب المُستخدَم لكتابة عنصر اليومية في حال الربح عند بيع أحد الأصول " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_asset_modify__loss_account_id +msgid "Account used to write the journal item in case of loss" +msgstr "الحساب المُستخدَم لكتابة عنصر اليومية في حال الخسارة " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_res_company__loss_account_id +msgid "" +"Account used to write the journal item in case of loss while selling an " +"asset" +msgstr "" +"الحساب المُستخدَم لكتابة عنصر اليومية في حال الخسارة عند بيع أحد الأصول " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Accounting" +msgstr "المحاسبة " + +#. module: odex30_account_asset +#: model:ir.model,name:odex30_account_asset.model_account_report +msgid "Accounting Report" +msgstr "تقرير المحاسبة " + +#. module: odex30_account_asset +#: model:account.report.column,name:odex30_account_asset.assets_report_acquisition_date +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__acquisition_date +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_kanban +msgid "Acquisition Date" +msgstr "تاريخ الاستحواذ" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__modify_action +msgid "Action" +msgstr "إجراء" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__message_needaction +msgid "Action Needed" +msgstr "إجراء مطلوب" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__active +msgid "Active" +msgstr "نشط" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__activity_ids +msgid "Activities" +msgstr "الأنشطة" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "زخرفة استثناء النشاط" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__activity_state +msgid "Activity State" +msgstr "حالة النشاط" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__activity_type_icon +msgid "Activity Type Icon" +msgstr "أيقونة نوع النشاط" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.asset_modify_form +msgid "Add an internal note" +msgstr "إضافة ملاحظة داخلية " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +#: code:addons/odex30_account_asset/models/account_move.py:0 +msgid "All the lines should be from the same account" +msgstr "يجب أن تكون كافة البنود من نفس الحساب " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_move.py:0 +msgid "All the lines should be from the same company" +msgstr "يجب أن تكون كافة البنود من نفس الشركة " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +#: code:addons/odex30_account_asset/models/account_move.py:0 +msgid "All the lines should be posted" +msgstr "يجب أن تكون كافة البنود مُرحّلة " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__already_depreciated_amount_import +msgid "Already Depreciated Amount Import" +msgstr "استيراد المبلغ الذي تم إهلاكه بالفعل " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__parent_id +msgid "An asset has a parent when it is the result of gaining value" +msgstr "يكون للأصل أصل رئيسي عندما يكون نتيجة لزيادة القيمة " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "An asset has been created for this move:" +msgstr "تم إنشاء أصل لهذه الحركة: " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_account__asset_model_ids +msgid "" +"An asset wil be created for each asset model when this account is used on a " +"vendor bill or a refund" +msgstr "" +"سيتم إنشاء أصل لكل نموذج من الأصول عند استخدام هذا الحساب في فاتورة المورّد " +"أو عند استرداد الأموال " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "An asset will be created for the value increase of the asset.
    " +msgstr "سيتم إنشاء أصل لزيادة قيمة الأصل.
    " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__analytic_distribution +msgid "Analytic Distribution" +msgstr "التوزيع التحليلي" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__analytic_precision +msgid "Analytic Precision" +msgstr "الدقة التحليلية " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_model_search +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +msgid "Archived" +msgstr "مؤرشف" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +#: code:addons/odex30_account_asset/models/account_move.py:0 +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_bank_statement_line__asset_id +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_move__asset_id +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__asset_id +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +msgid "Asset" +msgstr "أصل " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +msgid "Asset Account" +msgstr "حساب الأصل" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "Asset Cancelled" +msgstr "تم إلغاء الأصل" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__account_asset_counterpart_id +msgid "Asset Counterpart Account" +msgstr "حساب القيد المناظر للأصل " + +#. module: odex30_account_asset +#: model:ir.model,name:odex30_account_asset.model_account_asset_group +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__asset_group_id +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.asset_group_form_view +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.asset_group_list_view +msgid "Asset Group" +msgstr "مجموعة الأصول " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_bank_statement_line__asset_id_display_name +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_move__asset_id_display_name +msgid "Asset Id Display Name" +msgstr "اسم عرض مُعرِّف الأصل " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__asset_lifetime_days +msgid "Asset Lifetime Days" +msgstr "أيام عمر الأصل" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_account__asset_model_ids +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_model_search +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_form_asset_inherit +msgid "Asset Model" +msgstr "نموذج الأصل " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Asset Model name" +msgstr "اسم نموذج الأصل " + +#. module: odex30_account_asset +#: model:ir.actions.act_window,name:odex30_account_asset.action_account_asset_model_form +#: model:ir.ui.menu,name:odex30_account_asset.menu_action_account_asset_model_form +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_model_tree +msgid "Asset Models" +msgstr "نماذج الأصل " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_bank_statement_line__asset_move_type +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_move__asset_move_type +msgid "Asset Move Type" +msgstr "نوع حركة الأصل " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__name +msgid "Asset Name" +msgstr "اسم الأصل" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__asset_paused_days +msgid "Asset Paused Days" +msgstr "أيام توقف الأصل مؤقتاً" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_bank_statement_line__asset_value_change +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_move__asset_value_change +msgid "Asset Value Change" +msgstr "تغير قيمة الأصل " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Asset Values" +msgstr "قيم الأصول " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "Asset created" +msgstr "تم إنشاء الأصل" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_move.py:0 +msgid "Asset created from invoice: %s" +msgstr "الأصل الذي تم إنشاؤه من الفاتورة: %s " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "Asset disposed. %s" +msgstr "تم التخلص من الأصل. %s " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "Asset paused. %s" +msgstr "تم إيقاف الأصل مؤقتاً. %s " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "Asset sold. %s" +msgstr "بيع الأصل. %s" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "Asset unpaused. %s" +msgstr "تم تعطيل الإيقاف المؤقت للأصل %s" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.asset_group_form_view +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_move_form_asset_inherit +msgid "Asset(s)" +msgstr "الأصل (الأصول) " + +#. module: odex30_account_asset +#: model:ir.model,name:odex30_account_asset.model_account_asset +msgid "Asset/Revenue Recognition" +msgstr "إثبات الأصل/الإيرادات " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_assets_report.py:0 +#: model:ir.actions.act_window,name:odex30_account_asset.action_account_asset_form +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_bank_statement_line__asset_ids +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_move__asset_ids +#: model:ir.ui.menu,name:odex30_account_asset.menu_action_account_asset_form +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_tree +msgid "Assets" +msgstr "أصول " + +#. module: odex30_account_asset +#: model:ir.model,name:odex30_account_asset.model_account_asset_report_handler +msgid "Assets Report Custom Handler" +msgstr "المعالج المخصص لتقارير الأصل " + +#. module: odex30_account_asset +#: model:ir.ui.menu,name:odex30_account_asset.menu_finance_config_assets +msgid "Assets and Revenues" +msgstr "الأصول والإيرادات" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +msgid "Assets in closed state" +msgstr "الأصول المُقفلة" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +msgid "Assets in draft and open states" +msgstr "الأصول المسودة والجارية" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "" +"Atleast one asset (%s) couldn't be set as running because it lacks any " +"required information" +msgstr "" +"هناك أصل واحد على الأقل (%s) لم نتمكن من تعيينه كجارٍ لعدم توافر أي من " +"المعلومات المطلوبة " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__message_attachment_count +msgid "Attachment Count" +msgstr "عدد المرفقات" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_form_asset_inherit +msgid "Automate Asset" +msgstr "أتمتة الأصل " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_form_asset_inherit +msgid "Automation" +msgstr "تشغيل تلقائي" + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_asset__prorata_computation_type__daily_computation +msgid "Based on days per period" +msgstr "بناءً على الأيام لكل فترة " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Bills" +msgstr "الفواتير" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_assets_report.py:0 +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__book_value +msgid "Book Value" +msgstr "القيمة الدفترية " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_account__can_create_asset +msgid "Can Create Asset" +msgstr "يمكن إنشاء الأصل " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.asset_modify_form +msgid "Cancel" +msgstr "إلغاء" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Cancel Asset" +msgstr "إلغاء الأصل " + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_asset__state__cancelled +msgid "Cancelled" +msgstr "تم الإلغاء " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_assets_report.py:0 +msgid "Characteristics" +msgstr "الصفات " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__children_ids +msgid "Children" +msgstr "الفروع" + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__method +msgid "" +"Choose the method to use to compute the amount of depreciation lines.\n" +" * Straight Line: Calculated on basis of: Gross Value / Duration\n" +" * Declining: Calculated on basis of: Residual Value * Declining Factor\n" +" * Declining then Straight Line: Like Declining but with a minimum depreciation value equal to the straight line value." +msgstr "" +"اختر الطريقة لاستخدامها لاحتساب عدد بنود الإهلاك.\n" +" * القيمة الثابتة: يتم احتسابها على أساس: القيمة الكلية / المدة\n" +" * المنخفضة: يتم احتسابها على أساس: القيمة المتبقية * عامل الانخفاض\n" +" * الانخفاض ثم قيمة ثابتة: مثل القيمة المنخفضة ولكن مع قيمة إهلاك دنيا تساوي القيمة الثابتة. " + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_asset__state__close +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +msgid "Closed" +msgstr "مغلق" + +#. module: odex30_account_asset +#: model:ir.model,name:odex30_account_asset.model_res_company +msgid "Companies" +msgstr "الشركات" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__company_id +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset_group__company_id +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__company_id +msgid "Company" +msgstr "الشركة " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__prorata_computation_type +msgid "Computation" +msgstr "احتساب" + +#. module: odex30_account_asset +#: model:ir.actions.server,name:odex30_account_asset.action_account_asset_compute_depreciations +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Compute Depreciation" +msgstr "احتساب الإهلاك " + +#. module: odex30_account_asset +#: model:ir.actions.server,name:odex30_account_asset.action_account_asset_run +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Confirm" +msgstr "تأكيد" + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_asset__prorata_computation_type__constant_periods +msgid "Constant Periods" +msgstr "فترات ثابتة" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_bank_statement_line__count_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_move__count_asset +msgid "Count Asset" +msgstr "احتساب الأصل " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__count_linked_asset +msgid "Count Linked Asset" +msgstr "عدد الأصول المرتبطة " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset_group__count_linked_assets +msgid "Count Linked Assets" +msgstr "عدّ الأصول المرتبطة " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__country_code +msgid "Country Code" +msgstr "رمز الدولة" + +#. module: odex30_account_asset +#: model:ir.actions.server,name:odex30_account_asset.action_account_aml_to_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_account__create_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_move_line_tree +msgid "Create Asset" +msgstr "إنشاء الأصل " + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_account__create_asset__validate +msgid "Create and validate" +msgstr "إنشاء وتصديق " + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_account__create_asset__draft +msgid "Create in draft" +msgstr "إنشاء في مسودة " + +#. module: odex30_account_asset +#: model_terms:ir.actions.act_window,help:odex30_account_asset.action_account_asset_form +msgid "Create new asset" +msgstr "إنشاء أصل جديد " + +#. module: odex30_account_asset +#: model_terms:ir.actions.act_window,help:odex30_account_asset.action_account_asset_model_form +msgid "Create new asset model" +msgstr "إنشاء نموذج أصل جديد " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__create_uid +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset_group__create_uid +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__create_uid +msgid "Created by" +msgstr "أنشئ بواسطة" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__create_date +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset_group__create_date +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__create_date +msgid "Created on" +msgstr "أنشئ في" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_bank_statement_line__asset_depreciated_value +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_move__asset_depreciated_value +msgid "Cumulative Depreciation" +msgstr "الإهلاك التراكمي " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__currency_id +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__currency_id +msgid "Currency" +msgstr "العملة" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +msgid "Current" +msgstr "الحالي " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Current Values" +msgstr "القيم الحالية " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__invoice_ids +msgid "Customer Invoice" +msgstr "فاتورة العميل" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__date +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +msgid "Date" +msgstr "التاريخ" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_bank_statement_line__asset_depreciation_beginning_date +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_move__asset_depreciation_beginning_date +msgid "Date of the beginning of the depreciation" +msgstr "تاريخ بداية الإهلاك " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_assets_report.py:0 +msgid "Dec. then Straight" +msgstr "انخفاض ثم ثبات " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_assets_report.py:0 +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_asset__method__degressive +msgid "Declining" +msgstr "منخفض " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__method_progress_factor +msgid "Declining Factor" +msgstr "عامل الانخفاض " + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_asset__method__degressive_then_linear +msgid "Declining then Straight Line" +msgstr "الانخفاض ثم الثبات في خط مستقيم " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__value_residual +msgid "Depreciable Amount" +msgstr "المبلغ القابل للإهلاك " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__value_residual +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_bank_statement_line__asset_remaining_value +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_move__asset_remaining_value +msgid "Depreciable Value" +msgstr "القيمة القابلة للإهلاك " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Depreciated Amount" +msgstr "المبلغ المُهلَك " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_assets_report.py:0 +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_bank_statement_line__depreciation_value +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_move__depreciation_value +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_move__asset_move_type__depreciation +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Depreciation" +msgstr "إهلاك" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__account_depreciation_id +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__account_depreciation_id +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_model_search +msgid "Depreciation Account" +msgstr "حساب الإهلاك" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Depreciation Board" +msgstr "اللائحة الاستهلاكية " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Depreciation Date" +msgstr "تاريخ الإهلاك" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__depreciation_move_ids +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Depreciation Lines" +msgstr "بنود الإهلاك" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Depreciation Method" +msgstr "طريقة الإهلاك" + +#. module: odex30_account_asset +#: model:account.report,name:odex30_account_asset.assets_report +#: model:ir.actions.client,name:odex30_account_asset.action_account_report_assets +#: model:ir.ui.menu,name:odex30_account_asset.menu_action_account_report_assets +msgid "Depreciation Schedule" +msgstr "جدول الإهلاك " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "Depreciation board modified %s" +msgstr "تم تعديل لوح الإهلاك %s " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_move.py:0 +msgid "Depreciation entry %(name)s posted (%(value)s)" +msgstr "قيد الإهلاك %(name)s تم ترحيله (%(value)s) " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_move.py:0 +msgid "Depreciation entry %(name)s reversed (%(value)s)" +msgstr "قيد الإهلاك %(name)s تم عكسه (%(value)s) " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__display_account_asset_id +msgid "Display Account Asset" +msgstr "أصل حساب العرض " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__display_name +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset_group__display_name +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__display_name +msgid "Display Name" +msgstr "اسم العرض " + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_move__asset_move_type__disposal +msgid "Disposal" +msgstr "التصرف " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__disposal_date +msgid "Disposal Date" +msgstr "تاريخ التصرف " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "Disposal Move" +msgstr "حركة التصرف " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "Disposal Moves" +msgstr "حركات التصرف " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.asset_modify_form +msgid "Dispose" +msgstr "تصرف " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__distribution_analytic_account_ids +msgid "Distribution Analytic Account" +msgstr "حساب التوزيع التحليلي " + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_asset__state__draft +msgid "Draft" +msgstr "مسودة" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_bank_statement_line__draft_asset_exists +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_move__draft_asset_exists +msgid "Draft Asset Exists" +msgstr "مسودة الأصل موجودة بالفعل " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__method_number +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__method_number +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_kanban +msgid "Duration" +msgstr "المدة" + +#. module: odex30_account_asset +#: model:account.report.column,name:odex30_account_asset.assets_report_duration_rate +msgid "Duration / Rate" +msgstr "المدة / المعدل " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__account_depreciation_expense_id +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__account_depreciation_expense_id +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_model_search +msgid "Expense Account" +msgstr "حساب النفقات " + +#. module: odex30_account_asset +#: model:account.report.column,name:odex30_account_asset.assets_report_first_depreciation +msgid "First Depreciation" +msgstr "الإهلاك الأول " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__account_asset_id +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_model_search +msgid "Fixed Asset Account" +msgstr "حساب الأصل الثابت " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__message_follower_ids +msgid "Followers" +msgstr "المتابعين" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__message_partner_ids +msgid "Followers (Partners)" +msgstr "المتابعين (الشركاء) " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "أيقونة من Font awesome مثال: fa-tasks " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_account__form_view_ref +msgid "Form View Ref" +msgstr "مرجع عرض الاستمارة " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +msgid "Future Activities" +msgstr "الأنشطة المستقبلية" + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__asset_modify__gain_or_loss__gain +msgid "Gain" +msgstr "الربح " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__gain_account_id +#: model:ir.model.fields,field_description:odex30_account_asset.field_res_company__gain_account_id +msgid "Gain Account" +msgstr "حساب الربح " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__gain_or_loss +msgid "Gain Or Loss" +msgstr "الربح أو الخسارة " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__gain_value +msgid "Gain Value" +msgstr "قيمة الربح " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Gross Increase" +msgstr "الزيادة الإجمالية " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__account_asset_id +msgid "Gross Increase Account" +msgstr "حساب الزيادة الإجمالية" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__gross_increase_value +msgid "Gross Increase Value" +msgstr "قيمة الزيادة الإجمالية " + +#. module: odex30_account_asset +#. odoo-javascript +#: code:addons/odex30_account_asset/static/src/components/depreciation_schedule/groupby.xml:0 +msgid "Group By Account" +msgstr "تجميع حسب حساب" + +#. module: odex30_account_asset +#. odoo-javascript +#: code:addons/odex30_account_asset/static/src/components/depreciation_schedule/groupby.xml:0 +msgid "Group By Asset Group" +msgstr "تجميع حسب مجموعة الأصول " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_model_search +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +msgid "Group By..." +msgstr "تجميع حسب.." + +#. module: odex30_account_asset +#. odoo-javascript +#: code:addons/odex30_account_asset/static/src/components/depreciation_schedule/groupby.xml:0 +msgid "Group by Account" +msgstr "تجميع حسب الحساب " + +#. module: odex30_account_asset +#. odoo-javascript +#: code:addons/odex30_account_asset/static/src/components/depreciation_schedule/groupby.xml:0 +msgid "Group by Asset Group" +msgstr "تجميع حسب مجموعة الأصول " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__has_message +msgid "Has Message" +msgstr "يحتوي على رسالة " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__id +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset_group__id +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__id +msgid "ID" +msgstr "المُعرف" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__activity_exception_icon +msgid "Icon" +msgstr "الأيقونة" + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "الأيقونة للإشارة إلى النشاط المستثنى. " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__message_needaction +msgid "If checked, new messages require your attention." +msgstr "إذا كان محددًا، فهناك رسائل جديدة عليك رؤيتها. " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__message_has_error +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "إذا كان محددًا، فقد حدث خطأ في تسليم بعض الرسائل." + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__already_depreciated_amount_import +msgid "" +"In case of an import from another software, you might need to use this field" +" to have the right depreciation table report. This is the value that was " +"already depreciated with entries not computed from this model" +msgstr "" +"في حال الاستيراد من برنامج آخر، قد تحتاج إلى استخدام هذا الحقل حتى يكون لديك" +" تقرير جدول الإهلاك المناسب. هذه هي القيمة التي تم استهلاكها بالفعل مع كون " +"القيود غير محسوبة لهذا النموذج " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__informational_text +msgid "Informational Text" +msgstr "نص معلوماتي " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__invoice_line_ids +msgid "Invoice Line" +msgstr "بند الفاتورة" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__message_is_follower +msgid "Is Follower" +msgstr "متابع" + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__salvage_value +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__salvage_value_pct +msgid "It is the amount you plan to have that you cannot depreciate." +msgstr "لا يمكنك إهلاك المبلغ الذي تخطط للحصول عليه. " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__journal_id +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_model_search +msgid "Journal" +msgstr "دفتر اليومية" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "Journal Entries" +msgstr "قيود اليومية " + +#. module: odex30_account_asset +#: model:ir.model,name:odex30_account_asset.model_account_move +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Journal Entry" +msgstr "قيد اليومية" + +#. module: odex30_account_asset +#: model:ir.model,name:odex30_account_asset.model_account_move_line +msgid "Journal Item" +msgstr "عنصر اليومية" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__original_move_line_ids +msgid "Journal Items" +msgstr "عناصر اليومية" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_move.py:0 +msgid "" +"Journal Items of %(account)s should have a label in order to generate an " +"asset" +msgstr "" +"يجب أن يكون لعناصر يومية %(account)s علامة تصنيف حتى تتمكن من إنشاء أصل " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__write_uid +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset_group__write_uid +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__write_uid +msgid "Last Updated by" +msgstr "آخر تحديث بواسطة" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__write_date +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset_group__write_date +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +msgid "Late Activities" +msgstr "الأنشطة المتأخرة" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_assets_report.py:0 +msgid "Linear" +msgstr "خطي " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__linked_assets_ids +msgid "Linked Assets" +msgstr "الأصول المرتبطة " + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__asset_modify__gain_or_loss__loss +msgid "Loss" +msgstr "خسارة" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__loss_account_id +#: model:ir.model.fields,field_description:odex30_account_asset.field_res_company__loss_account_id +msgid "Loss Account" +msgstr "حساب الخسائر " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_form_asset_inherit +msgid "Manage Items" +msgstr "إدارة العناصر " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__message_has_error +msgid "Message Delivery error" +msgstr "خطأ في تسليم الرسائل" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__message_ids +msgid "Messages" +msgstr "الرسائل" + +#. module: odex30_account_asset +#: model:account.report.column,name:odex30_account_asset.assets_report_first_method +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__method +msgid "Method" +msgstr "الطريقة " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__model_id +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_asset__state__model +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_kanban +msgid "Model" +msgstr "النموذج " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__asset_properties_definition +msgid "Model Properties" +msgstr "خصائص النموذج " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.asset_modify_form +msgid "Modify" +msgstr "تعديل" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +#: model:ir.model,name:odex30_account_asset.model_asset_modify +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.asset_modify_form +msgid "Modify Asset" +msgstr "تعديل الأصل" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Modify Depreciation" +msgstr "تعديل الإهلاكات" + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_asset__method_period__1 +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__asset_modify__method_period__1 +msgid "Months" +msgstr "شهور" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_account__multiple_assets_per_line +msgid "Multiple Assets per Line" +msgstr "أصول متعددة لكل بند " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_account__multiple_assets_per_line +msgid "" +"Multiple asset items will be generated depending on the bill line quantity " +"instead of 1 global asset." +msgstr "" +"سوف يتم إنشاء عدة عناصر أصول بناء على كمية بنود الفاتورة عوضاً عن أصل شامل " +"واحد. " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "الموعد النهائي لنشاطاتي " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset_group__name +msgid "Name" +msgstr "الاسم" + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_move__asset_move_type__negative_revaluation +msgid "Negative revaluation" +msgstr "التقييم السالب " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__net_gain_on_sale +msgid "Net gain on sale" +msgstr "صافي أرباح المبيعات " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__net_gain_on_sale +msgid "Net value of gain or loss on sale of an asset" +msgstr "صافي الأرباح أو الخسائر عند بيع الأصل " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_asset_modify__value_residual +msgid "New residual amount for the asset" +msgstr "مبلغ متبقي جديد للأصل " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_asset_modify__salvage_value +msgid "New salvage amount for the asset" +msgstr "مبلغ مسترد جديد للأصل " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__activity_calendar_event_id +msgid "Next Activity Calendar Event" +msgstr "الفعالية التالية في تقويم الأنشطة " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "الموعد النهائي للنشاط التالي" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__activity_summary +msgid "Next Activity Summary" +msgstr "ملخص النشاط التالي" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__activity_type_id +msgid "Next Activity Type" +msgstr "نوع النشاط التالي" + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_account__create_asset__no +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__asset_modify__gain_or_loss__no +msgid "No" +msgstr "لا" + +#. module: odex30_account_asset +#. odoo-javascript +#: code:addons/odex30_account_asset/static/src/components/depreciation_schedule/groupby.xml:0 +msgid "No Grouping" +msgstr "بلا تجميع " + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_asset__prorata_computation_type__none +msgid "No Prorata" +msgstr "بلاتناسب " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__non_deductible_tax_value +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_move_line__non_deductible_tax_value +msgid "Non Deductible Tax Value" +msgstr "قيمة الضريبة غير القابلة للخصم" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__salvage_value +msgid "Not Depreciable Amount" +msgstr "ليس مبلغاً قابلاً للإهلاك " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__salvage_value +msgid "Not Depreciable Value" +msgstr "ليست قيمة قابلة للإهلاك " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__salvage_value_pct +msgid "Not Depreciable Value Percent" +msgstr "ليست نسبة قيمة قابلة للإهلاك " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__name +msgid "Note" +msgstr "الملاحظات" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__message_needaction_counter +msgid "Number of Actions" +msgstr "عدد الإجراءات" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_model_tree +msgid "Number of Depreciations" +msgstr "عدد الإهلاكات" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__method_period +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__method_period +msgid "Number of Months in a Period" +msgstr "عدد الشهور في الفترة" + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__gross_increase_count +msgid "Number of assets made to increase the value of the asset" +msgstr "عدد الأصول التي تم إنشاؤها لزيادة قيمة الأصل " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_bank_statement_line__asset_number_days +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_move__asset_number_days +msgid "Number of days" +msgstr "عدد الأيام" + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__total_depreciation_entries_count +msgid "Number of depreciation entries (posted or not)" +msgstr "عدد قيود الإهلاك (مُرحّلة أو غير مُرحّلة) " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__message_has_error_counter +msgid "Number of errors" +msgstr "عدد الأخطاء " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "عدد الرسائل التي تتطلب اتخاذ إجراء" + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "عدد الرسائل الحادث بها خطأ في التسليم" + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_asset__state__paused +msgid "On Hold" +msgstr "قيد الانتظار " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_assets_report.py:0 +msgid "Open Asset" +msgstr "أصل مفتوح " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__original_value +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_kanban +msgid "Original Value" +msgstr "القيمة الأصلية " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__parent_id +msgid "Parent" +msgstr "الأصل" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Parent Asset" +msgstr "الأصل الرئيسي " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.asset_modify_form +msgid "Pause" +msgstr "إيقاف مؤقت " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__paused_prorata_date +msgid "Paused Prorata Date" +msgstr "إيقاف التاريخ النسبي مؤقتاً " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_model_tree +msgid "Period length" +msgstr "طول المدة " + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_move__asset_move_type__positive_revaluation +msgid "Positive revaluation" +msgstr "التقييم الموجب " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Posted Entries" +msgstr "القيود المُرحّلة " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__asset_properties +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +msgid "Properties" +msgstr "الخصائص " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__prorata_date +msgid "Prorata Date" +msgstr "التاريخ النسبي " + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_move__asset_move_type__purchase +msgid "Purchase" +msgstr "الشراء" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__rating_ids +msgid "Ratings" +msgstr "التقييمات " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "Re-evaluate" +msgstr "إعادة التقييم" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset_group__linked_asset_ids +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_move_line__asset_ids +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_move_line_form_asset_inherit +msgid "Related Assets" +msgstr "الأصول ذات الصلة " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__related_purchase_value +msgid "Related Purchase Value" +msgstr "قيمة الشراء ذات الصلة" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "Reset to running" +msgstr "إعادة التعيين كجارٍ " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__activity_user_id +msgid "Responsible User" +msgstr "المستخدم المسؤول" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.asset_modify_form +msgid "Resume" +msgstr "المتابعة " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Resume Depreciation" +msgstr "متابعة الإهلاك " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "" +"Reverse the depreciation entries posted in the future in order to modify the" +" depreciation" +msgstr "" +"قم بعكس قيود الإهلاك المُرحّلة إلى المستقبل حتى تتمكن من تعديل الإهلاك " + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_asset__state__open +msgid "Running" +msgstr "جاري" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__message_has_sms_error +msgid "SMS Delivery error" +msgstr "خطأ في تسليم الرسائل النصية القصيرة " + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_move__asset_move_type__sale +msgid "Sale" +msgstr "بيع " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Save as Model" +msgstr "حفظ كنموذج" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "Save model" +msgstr "حفظ النموذج " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_asset_modify__select_invoice_line_id +msgid "Select Invoice Line" +msgstr "تحديد بند الفاتورة " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.asset_modify_form +msgid "Sell" +msgstr "بيع " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Set to Draft" +msgstr "تعيين كمسودة" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Set to Running" +msgstr "التعيين كجارٍ " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +msgid "Show all records which has next action date is before today" +msgstr "" +"عرض كافة السجلات التي يسبق تاريخ الإجراء التالي فيها تاريخ اليوم الجاري " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_move.py:0 +msgid "Some fields are missing %s" +msgstr "بعض الحقول مفقودة %s " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "Some required values are missing" +msgstr "بعض القيم المطلوبة مفقودة " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__prorata_date +msgid "" +"Starting date of the period used in the prorata calculation of the first " +"depreciation" +msgstr "تاريخ بداية الفترة المستخدمة في الحساب التناسبي للإهلاك الأول " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__state +msgid "Status" +msgstr "الحالة" + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"الأنشطة المعتمدة على الحالة\n" +"المتأخرة: تاريخ الاستحقاق مر\n" +"اليوم: تاريخ النشاط هو اليوم\n" +"المخطط: الأنشطة المستقبلية." + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_asset__method__linear +msgid "Straight Line" +msgstr "خط مستقيم " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__book_value +msgid "" +"Sum of the depreciable value, the salvage value and the book value of all " +"value increase items" +msgstr "" +"إجمالي قيمة الإهلاك، القيمة المستردة والقيمة الدفترية لكافة عناصر زيادة " +"القيمة " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__country_code +msgid "" +"The ISO country code in two chars. \n" +"You can use this field for quick search." +msgstr "" +"كود الدولة حسب المعيار الدولي أيزو المكون من حرفين.\n" +"يمكنك استخدام هذا الحقل لإجراء بحث سريع." + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "" +"The account %(exp_acc)s has been credited by %(exp_delta)s, while the " +"account %(dep_acc)s has been debited by %(dep_delta)s. This corresponds to " +"%(move_count)s cancelled %(word)s:" +msgstr "" +"الحساب %(exp_acc)s تم الإيداع فيه من قِبَل %(exp_delta)s، بينما الحساب " +"%(dep_acc)s تم الخصم منه من قِبَل %(dep_delta)s. يتوافق ذلك مع " +"%(move_count)s الملغية %(word)s: " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__method_period +#: model:ir.model.fields,help:odex30_account_asset.field_asset_modify__method_period +msgid "The amount of time between two depreciations" +msgstr "المدة الزمنية بين عمليتي إهلاك " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "" +"The amount you have entered (%(entered_amount)s) does not match the Related " +"Purchase's value (%(purchase_value)s). Please make sure this is what you " +"want." +msgstr "" +"لا يطابق المبلغ الذي أدخلته (%(entered_amount)s) قيمة الشراء ذات الصلة " +"(%(purchase_value)s). يرجى التأكد من أن ذلك هو ما تريده. " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_asset_modify__asset_id +msgid "The asset to be modified by this wizard" +msgstr "الأصل بانتظار التعديل من قِبَل مُعالج الربط " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__children_ids +msgid "The children are the gains in value of this asset" +msgstr "الفروع هي الأرباح بالقيمة لهذا الأصل " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_asset_modify__invoice_ids +msgid "" +"The disposal invoice is needed in order to generate the closing journal " +"entry." +msgstr "فاتورة التصرف ضرورية حتى يتم إنشاء قيد إقفال اليومية " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__method_number +msgid "The number of depreciations needed to depreciate your asset" +msgstr "عدد الإهلاكات المطلوبة لإهلاك الأصل " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "The remaining value on the last depreciation line must be 0" +msgstr "يجب أن تكون القيمة المتبقية في آخر بند إهلاك تساوي 0 " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_asset_modify__invoice_line_ids +msgid "There are multiple lines that could be the related to this asset" +msgstr "توجد العديد من البنود التي يمكن أن تكون ذات صلة بهذا الأصل " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "" +"There are unposted depreciations prior to the selected operation date, " +"please deal with them first." +msgstr "" +"توجد عمليات إهلاك غير مُرحّلة قبل تاريخ التشغيل المحدد. يرجى التعامل معها " +"أولاً. " + +#. module: odex30_account_asset +#. odoo-javascript +#: code:addons/odex30_account_asset/static/src/components/move_reversed/move_reversed.xml:0 +msgid "This move has been reversed" +msgstr "لقد تم عكس هذه الحركة " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_search +msgid "Today Activities" +msgstr "أنشطة اليوم " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_assets_report.py:0 +msgid "Total" +msgstr "الإجمالي" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__total_depreciable_value +msgid "Total Depreciable Value" +msgstr "إجمالي القيمة القابلة للاستهلاك" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_move.py:0 +msgid "Turn as an asset" +msgstr "التحويل كأصل " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__account_type +msgid "Type of the account" +msgstr "نوع الحساب " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "نوع النشاط المستثنى في السجل. " + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "Value at Import" +msgstr "القيمة عند الاستيراد" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "Value decrease for: %(asset)s" +msgstr "نقصان القيمة لـ : %(asset)s" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "Value increase for: %(asset)s" +msgstr "زيادة القيمة لـ : %(asset)s" + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__warning_count_assets +msgid "Warning Count Assets" +msgstr "تحذير عدد الأصول " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "Warning for the Original Value of %s" +msgstr "تحذير للقيمة الأصلية %s " + +#. module: odex30_account_asset +#: model:ir.model.fields,field_description:odex30_account_asset.field_account_asset__website_message_ids +msgid "Website Messages" +msgstr "رسائل الموقع الإلكتروني " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__website_message_ids +msgid "Website communication history" +msgstr "سجل تواصل الموقع الإلكتروني " + +#. module: odex30_account_asset +#: model:ir.model.fields,help:odex30_account_asset.field_account_asset__state +msgid "" +"When an asset is created, the status is 'Draft'.\n" +"If the asset is confirmed, the status goes in 'Running' and the depreciation lines can be posted in the accounting.\n" +"The 'On Hold' status can be set manually when you want to pause the depreciation of an asset for some time.\n" +"You can manually close an asset when the depreciation is over.\n" +"By cancelling an asset, all depreciation entries will be reversed" +msgstr "" +"عندما يتم إنشاء أصل، يكون في وضع 'المسودة'.\n" +"إذا تم تأكيد الأصل، تتغير الحالة إلى 'جاري' ويمكن ترحيل بنود الإهلاك في المحاسبة.\n" +"يمكن تعيين الحالة 'قيد الانتظار' يدوياً عندما ترغب في إيقاف إهلاك أصل من الأصول بشكل مؤقت لفترة من الزمن.\n" +"يمكنك إقفال الأصل يدوياً عند انتهاء الإهلاك.\n" +"عند إلغائك للأصل، سيتم عكس كافة قيود الإهلاك " + +#. module: odex30_account_asset +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__account_asset__method_period__12 +#: model:ir.model.fields.selection,name:odex30_account_asset.selection__asset_modify__method_period__12 +msgid "Years" +msgstr "سنوات" + +#. module: odex30_account_asset +#. odoo-javascript +#: code:addons/odex30_account_asset/static/src/views/fields/properties/properties_field.js:0 +msgid "You can add Property fields only on Assets with an Asset Model set." +msgstr "" +"لا يمكنك إضافة حقول الخصائص إلا في الأصول التي تحتوي على مجموعة لنموذج " +"الأصول. " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_move.py:0 +msgid "" +"You can't post an entry related to a draft asset. Please post the asset " +"before." +msgstr "" +"لا يمكنك ترحيل قيد متعلق بأصل في حالة المسودة. يرحى ترحيل الأصل أولاً. " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "You can't re-evaluate the asset before the lock date." +msgstr "لا يمكنك إعادة تقييم الأصل قبل تاريخ الإقفال. " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "" +"You cannot add or remove bills when the asset is already running or closed." +msgstr "" +"لا يمكنك إضافة أو إزالة الفواتير عندما يكون الأصل جارياً أو مغلقاً بالفعل. " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "You cannot archive a record that is not closed" +msgstr "لا يمكنك أرشفة سجل غير مقفل " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "" +"You cannot automate the journal entry for an asset that has a running gross " +"increase. Please use 'Dispose' on the increase(s)." +msgstr "" +"لا يمكنك أتمتة قيد اليومية لأصل ذي زيادة إجمالية جارية. الرجاء استخدام " +"'التصرف' في الزيادة (الزيادات). " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "" +"You cannot create an asset from lines containing credit and debit on the " +"account or with a null amount" +msgstr "" +"لا يمكنك إنشاء أصل من البنود التي تحتوي على رصيد وخصم في الحساب أو بقيمة " +"فارغة " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "You cannot delete a document that is in %s state." +msgstr "لا يمكنك حذف ملف في حالة %s." + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "" +"You cannot delete an asset linked to posted entries.\n" +"You should either confirm the asset, then, sell or dispose of it, or cancel the linked journal entries." +msgstr "" +"لا يمكنك حذف أصل مرتبط بقيود مُرحّلة. \n" +"عليك إما تأكيد الأصل ثم بيعه أو التخلص منه أو إلغاء قيود اليومية المرتبطة. " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "You cannot dispose of an asset before the lock date." +msgstr "لا يمكنك التخلص من أصل قبل تاريخ الإقفال. " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_move.py:0 +msgid "You cannot reset to draft an entry related to a posted asset" +msgstr "لا يمكنك إعادة تعيين قيد مرتبط بأصل مُرحّل إلى حالة المسودة " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "You cannot resume at a date equal to or before the pause date" +msgstr "لا يمكنك الاستئناف في تاريخ يساوي أو قبل تاريخ الإيقاف المؤقت" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "You cannot select the same account as the Depreciation Account" +msgstr "لا يمكنك تحديد نفس الحساب كحساب الإهلاك " + +#. module: odex30_account_asset +#: model:account.report.column,name:odex30_account_asset.assets_report_balance +msgid "book_value" +msgstr "book_value" + +#. module: odex30_account_asset +#: model:account.report.column,name:odex30_account_asset.assets_report_date_from +#: model:account.report.column,name:odex30_account_asset.assets_report_depre_date_from +msgid "date from" +msgstr "التاريخ من" + +#. module: odex30_account_asset +#: model:account.report.column,name:odex30_account_asset.assets_report_assets_date_to +#: model:account.report.column,name:odex30_account_asset.assets_report_depre_date_to +msgid "date to" +msgstr "التاريخ إلى" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "depreciable)" +msgstr "قابل للإهلاك)" + +#. module: odex30_account_asset +#: model_terms:ir.ui.view,arch_db:odex30_account_asset.view_account_asset_form +msgid "e.g. Laptop iBook" +msgstr "مثال: كمبيوتر محمول" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "entries" +msgstr "القيود" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/models/account_asset.py:0 +msgid "entry" +msgstr "دخول" + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "gain" +msgstr "الأرباح " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "gain/loss" +msgstr "الأرباح/الخسائر " + +#. module: odex30_account_asset +#. odoo-python +#: code:addons/odex30_account_asset/wizard/asset_modify.py:0 +msgid "loss" +msgstr "الخسائر " diff --git a/dev_odex30_accounting/odex30_account_asset/models/__init__.py b/dev_odex30_accounting/odex30_account_asset/models/__init__.py new file mode 100644 index 0000000..39358d2 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/models/__init__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- + +from . import account +from . import account_asset +from . import account_asset_group +from . import account_assets_report +from . import account_move +from . import res_company diff --git a/dev_odex30_accounting/odex30_account_asset/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_asset/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..252000f38bf917617dd187538300ee1d5aae8e7e GIT binary patch literal 561 zcmZvYy-ve06h^P}TTwDqMFJ+o)PbhJ!hm>$suB}ftSGVClq8Pqwj%621CM}s26pC* zQCB9mO5HkfowiafVSW01d}75;K0NOTaCE+&l5d=U)M7u39ju24?+`;wQpiX^h++fT z2#khJWHT@uwvesBYS>1$1G`}d*$EtE_Yr!nUxF{~k)<0(5ufKXL~n;Ql#(gY(F7d} zJ}*#rH7%)N1s7`n@%}-^7Yx^J!6c1%R)l#u?72%2CLSs*RkkWem8+_S^$BZi*u41@ zo-sd6pC{p~m?r+Hj3%MTMuJaSG?PA$*~{$!C(f^~@A_M6?9G7g?vUhTKV}QM-Fs+t zv;9~2@Em7W?-tN$X}c={h>SD*R- literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_asset/models/__pycache__/account.cpython-311.pyc b/dev_odex30_accounting/odex30_account_asset/models/__pycache__/account.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca2023ecf7a6f38aa5f872fbf5ba32a82d002b4f GIT binary patch literal 2437 zcmai0&2JM&6rbI-*G{nGgg7{@C=3ZTF#?;U(54?$N{P~zl0ZvU372-Yc*gOD{V=m@ zLoAAN$bka~ACTywhpLBE2>yUd{Rev7R6baHLh7kEN8wO$>YG{HX-ZwMvW8RzJ zd(Z2ilgVKOSBU$#Mqse zxO<9<52KJb0gVjxGwc_N)UBD-J^kY zK8T9cG)fCL*0~VhHcWhj;u52vL2%h&nChiUS1Ppe?FzNAS20}NJs88X=7PEd$KX1( z37Fk5OcTSbV@At0n|uk5RpMB>VF!^4HLF3~V|wYPVXx+toE*ru6UZwLtfGYJWv`LC zAcDY#jRgZF@w#pr1R`sUcZIr5aF5A2-ryz9=&hQ;C<$VOmi3zHu@R62uW2R6s@6QJ zm2_JRuc(P@=cFLkl{F@p!N91R6fbZ@TwJ9LUovdE)S!J)2$tbd%jJ*>%vPyQnLv%u zDqsK?8TeLBw>`sKhg-QG)d8|Hp2e%Cb3->nkn_+!s_QW@XK4sq#LklZ z0*Nl(nzvr1rGDLlh&LjCcHaZ?2;D`C=$p)U(p_l{_TeB>9o?0*z7>&SC-rf_A?1))}oAjnK%~4SIV&OM~jMatfOSC&B0- z=0TE+HDLx7@>mWcE;Y-6%4o@9#O0x3{9?0EaV%QU&6^dy!PbnzmGx3ZXVw+wtkII^ z7Q$d)a-7q%^Z7GkCAf3_5CO{qp>=J4;GDak6IMeZ{Jkpl+NQeBCLox`%)-7#%fGUm z_=Vl~foz~>hhFa>dFTr%r1zKF*;B3TyZ(9I&+7M=T8ZiQ^yhrWegb!*dz!mo4jKPv zmA*XVXF;!<@$_KEZ;Je~n8Nf!p$6<--m6Uqc#tqr6yXbsUOMjsgr){WP9$NrrH`U z{KfGKRoE1mt>ngoxTe{NY#fEh87864@KDWN&i9JCOh8@a}g-%>?n@ ztyva?kC6yefXL$9gcJTEbTg2ijsB;d!W*AFJCtpfTZgjkc&0si!cWb#ldL^9(HV+n z)ExxmIVT&JI|-CN-h8_?KJ6c`h2Qq+*;`F(o8<#pNn#?xq5AXT; zPyNir?aaki=As`-x6?gLzYBim8jisFu}M0wG3x}zZV*dA{fsRu#zdNaQr1@PI`QA%j(S*vDF02GUp>6O!}-r&A`~I~4cBR(YXATM literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_asset/models/__pycache__/account_asset.cpython-311.pyc b/dev_odex30_accounting/odex30_account_asset/models/__pycache__/account_asset.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3a747aa5ed1284a7ac30ec090d1e87aa3387aac GIT binary patch literal 82428 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 SIRve{_YJ@I*# zzxOde`Fw5!?ak6n{ho}_pKMZXFz0RS6X=!^Mp#Ipv=9^0VoXd+F-bro8bw%KKv>em zq|H)CXjMY!6?|5U$=G%Sh2+24G$c{`q^_l~LG9@*)=~zQ)M-7wqszP6xqrcQ8EGgc zU=$Ov5R$s|O?7&X!T0m>=cdT=BJx@)~ zgT2_d=6^@a%e8zpt){i+RRPX}&uTG0Xf!38t8*Nvm*bWNv0KxM&UHHIu;-HfE06>ISlm=1~%Qt0ilCV4e^SiB!@uv(&M( z-%Eko3@tTjFtygOUur2e zr{N%Xkr5I|J8VSvD-5%loCZBOSV`%b2O75Q1!r+YK}wtV3Sd8@&Q*5Uio5Dp7(g}( z3w7?oVi)kOR;;T_{kRH`|R77t?t0p*O=U5=HGR`|C1fGi^&u6Eyd4@`Y5up@V)a$fvi zT=d^SFCiwWsAH%nVt9yp_IQHI9A<-=84LzV3-sIW^H`7Pm>-7o7aHT?KRg7nl8vh= zV>rCK1hNgFI89gK7Wfg5C~L$Tt5 zl}4ORtBl2?cw&ya)kK152?#2KFvo@L#Lw1w6r!oviaaVos8A`P<;X!MYi*1&BP5Xk zleJs2X^ren7t#x|I=l!Aru>Qj1r#&P_yGujVyoVIqkrJXsTWU5{U5*SAA8+Dw$Xm1 zn0xWn+HJG#OhpnqTPk+cJz#bYlzWb>oU3@y(W}BHvLE%oWuzj*KAQ~Tw~Uz11C=(^ z6RaS?byu+H)3I{+;+yd3>+tArp5OiE?K|t?SScKPI#%)yn%=>Rw5!X}uZuhOgz%*L z8V0QX6`^lz^@UqtiC0T8EMSqP7MAxWSF)BQJk9LSWe9plH1A63M(+4zmZW(U&qm!^#+V_R zlFev*4cQNTGQbFrS6--jHqb8XNF_V1W$Mb2ksoaI`FoWQz~08EKnker^nTa$ZPU85 ztK{r5on0GkozE_pyZXvq$I5Mk<<6cJTpTI&eOT)I$m|$4_kCRP*qb45EaGx=*F;0D z)Tt=!O;Z%=R@g0PQf%y1ly7F#)Q&{vD!{~=5hwaIgOA#kEWsKf40vk02#=42obwvI zey0Ew>fU*}ptMrwct$&w1_?)rIxc5&S^`!dXK=A%#fm`-omAFYp`&&>}xH2w&B_L^vvS9rP<;g(-T?uL`t4WVWb=gF711E zuz29-IrB<_{R30$fvHkps&J*;(Z4kN>`C#7dG>Sj3)SqHSnrr9bxfGHwsQBemHy{p z^JLWQ9$)VsFLjTbwvG+Cxo~6Qt{FJIF87t>zKZCTS&}fiDIxojU0#n<2Iw1!bvJgc zXvj`&?5*Z-5_Ulg75N&3V9L6BJsj}hTJ9PqEF@U88Fzp{0t!MI^_lPgSM0q47}Q8s Q?9aWMjQ{pugxuPH017+E)Bpeg literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_asset/models/__pycache__/account_assets_report.cpython-311.pyc b/dev_odex30_accounting/odex30_account_asset/models/__pycache__/account_assets_report.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f16422ff3f814b6097667d2004d67ed50e51cc22 GIT binary patch literal 27722 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 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_asset/models/__pycache__/account_move.cpython-311.pyc b/dev_odex30_accounting/odex30_account_asset/models/__pycache__/account_move.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd1d3afba54d2a05c71b7992b955d11f5cfd70db GIT binary patch literal 27796 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 D_iilW literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_asset/models/account.py b/dev_odex30_accounting/odex30_account_asset/models/account.py new file mode 100644 index 0000000..213d29a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/models/account.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +from odoo import api, fields, models, _ + + +class AccountAccount(models.Model): + _inherit = 'account.account' + + asset_model_ids = fields.Many2many( + 'account.asset', + domain=[('state', '=', 'model')], + help="An asset wil be created for each asset model when this account is used on a vendor bill or a refund", + tracking=True, + ) + create_asset = fields.Selection([('no', 'No'), ('draft', 'Create in draft'), ('validate', 'Create and validate')], + required=True, default='no', tracking=True) + # specify if the account can generate asset depending on it's type. It is used in the account form view + can_create_asset = fields.Boolean(compute="_compute_can_create_asset") + form_view_ref = fields.Char(compute='_compute_can_create_asset') + # decimal quantities are not supported, quantities are rounded to the lower int + multiple_assets_per_line = fields.Boolean(string='Multiple Assets per Line', default=False, tracking=True, + help="Multiple asset items will be generated depending on the bill line quantity instead of 1 global asset.") + + @api.depends('account_type') + def _compute_can_create_asset(self): + for record in self: + record.can_create_asset = record.account_type in ('asset_fixed', 'asset_non_current') + record.form_view_ref = 'odex30_account_asset.view_account_asset_form' + + @api.onchange('create_asset') + def _onchange_multiple_assets_per_line(self): + for record in self: + if record.create_asset == 'no': + record.multiple_assets_per_line = False diff --git a/dev_odex30_accounting/odex30_account_asset/models/account_asset.py b/dev_odex30_accounting/odex30_account_asset/models/account_asset.py new file mode 100644 index 0000000..8eeff98 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/models/account_asset.py @@ -0,0 +1,1242 @@ +# -*- coding: utf-8 -*- + +import psycopg2 +import datetime +from dateutil.relativedelta import relativedelta +from markupsafe import Markup +from math import copysign + +from odoo import api, Command, fields, models, _ +from odoo.exceptions import UserError, ValidationError +from odoo.tools import float_compare, float_is_zero, formatLang +from odoo.tools.date_utils import end_of + +DAYS_PER_MONTH = 30 +DAYS_PER_YEAR = DAYS_PER_MONTH * 12 + +class AccountAsset(models.Model): + _name = 'account.asset' + _description = 'Asset/Revenue Recognition' + _inherit = ['mail.thread', 'mail.activity.mixin', 'analytic.mixin'] + + depreciation_entries_count = fields.Integer(compute='_compute_counts', string='# Posted Depreciation Entries') + gross_increase_count = fields.Integer(compute='_compute_counts', string='# Gross Increases', help="Number of assets made to increase the value of the asset") + total_depreciation_entries_count = fields.Integer(compute='_compute_counts', string='# Depreciation Entries', help="Number of depreciation entries (posted or not)") + + name = fields.Char(string='Asset Name', compute='_compute_name', store=True, required=True, readonly=False, tracking=True) + company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env.company) + country_code = fields.Char(related='company_id.account_fiscal_country_id.code') + currency_id = fields.Many2one('res.currency', related='company_id.currency_id', store=True) + state = fields.Selection( + selection=[('model', 'Model'), + ('draft', 'Draft'), + ('open', 'Running'), + ('paused', 'On Hold'), + ('close', 'Closed'), + ('cancelled', 'Cancelled')], + string='Status', + copy=False, + default='draft', + readonly=True, + help="When an asset is created, the status is 'Draft'.\n" + "If the asset is confirmed, the status goes in 'Running' and the depreciation lines can be posted in the accounting.\n" + "The 'On Hold' status can be set manually when you want to pause the depreciation of an asset for some time.\n" + "You can manually close an asset when the depreciation is over.\n" + "By cancelling an asset, all depreciation entries will be reversed") + active = fields.Boolean(default=True) + + # Depreciation params + method = fields.Selection( + selection=[ + ('linear', 'Straight Line'), + ('degressive', 'Declining'), + ('degressive_then_linear', 'Declining then Straight Line') + ], + string='Method', + default='linear', + help="Choose the method to use to compute the amount of depreciation lines.\n" + " * Straight Line: Calculated on basis of: Gross Value / Duration\n" + " * Declining: Calculated on basis of: Residual Value * Declining Factor\n" + " * Declining then Straight Line: Like Declining but with a minimum depreciation value equal to the straight line value." + ) + method_number = fields.Integer(string='Duration', default=5, help="The number of depreciations needed to depreciate your asset") + method_period = fields.Selection([('1', 'Months'), ('12', 'Years')], string='Number of Months in a Period', default='12', + help="The amount of time between two depreciations") + method_progress_factor = fields.Float(string='Declining Factor', default=0.3) + prorata_computation_type = fields.Selection( + selection=[ + ('none', 'No Prorata'), + ('constant_periods', 'Constant Periods'), + ('daily_computation', 'Based on days per period'), + ], + string="Computation", + required=True, default='constant_periods', + ) + prorata_date = fields.Date( + string='Prorata Date', + compute='_compute_prorata_date', store=True, readonly=False, + help='Starting date of the period used in the prorata calculation of the first depreciation', + required=True, precompute=True, + copy=True, + ) + paused_prorata_date = fields.Date(compute='_compute_paused_prorata_date') # number of days to shift the computation of future deprecations + account_asset_id = fields.Many2one( + 'account.account', + string='Fixed Asset Account', + compute='_compute_account_asset_id', + help="Account used to record the purchase of the asset at its original price.", + store=True, readonly=False, + check_company=True, + domain="[('account_type', '!=', 'off_balance')]", + ) + asset_group_id = fields.Many2one('account.asset.group', string='Asset Group', tracking=True, index=True) + account_depreciation_id = fields.Many2one( + comodel_name='account.account', + string='Depreciation Account', + check_company=True, + domain="[('account_type', 'not in', ('asset_receivable', 'liability_payable', 'asset_cash', 'liability_credit_card', 'off_balance')), ('deprecated', '=', False)]", + help="Account used in the depreciation entries, to decrease the asset value." + ) + account_depreciation_expense_id = fields.Many2one( + comodel_name='account.account', + string='Expense Account', + check_company=True, + domain="[('account_type', 'not in', ('asset_receivable', 'liability_payable', 'asset_cash', 'liability_credit_card', 'off_balance')), ('deprecated', '=', False)]", + help="Account used in the periodical entries, to record a part of the asset as expense.", + ) + asset_type = fields.Selection( + [('sale', 'Sale: Revenue Recognition'), ('purchase', 'Purchase: Asset'), ('expense', 'Deferred Expense')], + compute='_compute_asset_type', store=True, index=True) + + @api.depends('original_move_line_ids') + @api.depends_context('asset_type') + def _compute_asset_type(self): + for record in self: + if not record.asset_type and 'asset_type' in self.env.context: + record.asset_type = self.env.context['asset_type'] + if not record.asset_type and record.original_move_line_ids: + account = record.original_move_line_ids.account_id + record.asset_type = account.asset_type + + journal_id = fields.Many2one( + 'account.journal', + string='Journal', + check_company=True, + domain="[('type', '=', 'general')]", + compute='_compute_journal_id', store=True, readonly=False, + ) + + # Values + original_value = fields.Monetary(string="Original Value", compute='_compute_value', store=True, readonly=False) + book_value = fields.Monetary(string='Book Value', readonly=True, compute='_compute_book_value', recursive=True, store=True, help="Sum of the depreciable value, the salvage value and the book value of all value increase items") + value_residual = fields.Monetary(string='Depreciable Value', compute='_compute_value_residual') + salvage_value = fields.Monetary(string='Not Depreciable Value', + help="It is the amount you plan to have that you cannot depreciate.", + compute="_compute_salvage_value", + store=True, readonly=False) + salvage_value_pct = fields.Float(string='Not Depreciable Value Percent', + help="It is the amount you plan to have that you cannot depreciate.") + total_depreciable_value = fields.Monetary(compute='_compute_total_depreciable_value') + gross_increase_value = fields.Monetary(string="Gross Increase Value", compute="_compute_gross_increase_value", compute_sudo=True) + non_deductible_tax_value = fields.Monetary(string="Non Deductible Tax Value", compute="_compute_non_deductible_tax_value", store=True, readonly=True) + related_purchase_value = fields.Monetary(compute='_compute_related_purchase_value') + + # Links with entries + depreciation_move_ids = fields.One2many('account.move', 'asset_id', string='Depreciation Lines') + original_move_line_ids = fields.Many2many('account.move.line', 'asset_move_line_rel', 'asset_id', 'line_id', string='Journal Items', copy=False) + + asset_properties_definition = fields.PropertiesDefinition('Model Properties') + asset_properties = fields.Properties('Properties', definition='model_id.asset_properties_definition', copy=True) + + # Dates + acquisition_date = fields.Date( + compute='_compute_acquisition_date', store=True, precompute=True, + readonly=False, + copy=True, + ) + disposal_date = fields.Date(readonly=False, compute="_compute_disposal_date", store=True) + + # model-related fields + model_id = fields.Many2one('account.asset', string='Model', change_default=True, domain="[('company_id', '=', company_id)]") + account_type = fields.Selection(string="Type of the account", related='account_asset_id.account_type') + display_account_asset_id = fields.Boolean(compute="_compute_display_account_asset_id") + + # Capital gain + parent_id = fields.Many2one('account.asset', help="An asset has a parent when it is the result of gaining value") + children_ids = fields.One2many('account.asset', 'parent_id', help="The children are the gains in value of this asset") + + # Adapt for import fields + already_depreciated_amount_import = fields.Monetary( + help="In case of an import from another software, you might need to use this field to have the right " + "depreciation table report. This is the value that was already depreciated with entries not computed from this model", + ) + + asset_lifetime_days = fields.Float(compute="_compute_lifetime_days", recursive=True) # total number of days to consider for the computation of an asset depreciation board + asset_paused_days = fields.Float(copy=False) + + net_gain_on_sale = fields.Monetary(string="Net gain on sale", help="Net value of gain or loss on sale of an asset", copy=False) + + linked_assets_ids = fields.One2many( + comodel_name='account.asset', + string="Linked Assets", + compute='_compute_linked_assets', + ) + count_linked_asset = fields.Integer(compute="_compute_linked_assets") + warning_count_assets = fields.Boolean(compute="_compute_linked_assets") + + # ------------------------------------------------------------------------- + # COMPUTE METHODS + # ------------------------------------------------------------------------- + @api.depends('company_id') + def _compute_journal_id(self): + for asset in self: + if asset.journal_id and asset.journal_id.company_id == asset.company_id: + asset.journal_id = asset.journal_id + else: + asset.journal_id = self.env['account.journal'].search([ + *self.env['account.journal']._check_company_domain(asset.company_id), + ('type', '=', 'general'), + ], limit=1) + + @api.depends('salvage_value', 'original_value') + def _compute_total_depreciable_value(self): + for asset in self: + asset.total_depreciable_value = asset.original_value - asset.salvage_value + + @api.depends('original_value', 'model_id') + def _compute_salvage_value(self): + for asset in self: + if asset.model_id.salvage_value_pct != 0.0: + asset.salvage_value = asset.original_value * asset.model_id.salvage_value_pct + + @api.depends('depreciation_move_ids.date', 'state') + def _compute_disposal_date(self): + for asset in self: + if asset.state == 'close': + dates = asset.depreciation_move_ids.filtered(lambda m: m.date).mapped('date') + asset.disposal_date = dates and max(dates) + else: + asset.disposal_date = False + + @api.depends('original_move_line_ids', 'original_move_line_ids.account_id', 'non_deductible_tax_value') + def _compute_value(self): + for record in self: + if not record.original_move_line_ids: + record.original_value = record.original_value or False + continue + if any(line.move_id.state == 'draft' for line in record.original_move_line_ids): + raise UserError(_("All the lines should be posted")) + record.original_value = record.related_purchase_value + if record.non_deductible_tax_value: + record.original_value += record.non_deductible_tax_value + + @api.depends('original_move_line_ids') + @api.depends_context('form_view_ref') + def _compute_display_account_asset_id(self): + for record in self: + # Hide the field when creating an asset model from the CoA. (form_view_ref is set from there) + model_from_coa = self.env.context.get('form_view_ref') and record.state == 'model' + record.display_account_asset_id = not record.original_move_line_ids and not model_from_coa + + @api.depends('account_depreciation_id', 'account_depreciation_expense_id', 'original_move_line_ids') + def _compute_account_asset_id(self): + for record in self: + if record.original_move_line_ids: + if len(record.original_move_line_ids.account_id) > 1: + raise UserError(_("All the lines should be from the same account")) + record.account_asset_id = record.original_move_line_ids.account_id + if not record.account_asset_id: + # Only set a default value, do not erase user inputs + record._onchange_account_depreciation_id() + + @api.depends('original_move_line_ids') + def _compute_analytic_distribution(self): + for asset in self: + distribution_asset = {} + amount_total = sum(asset.original_move_line_ids.mapped("balance")) + if not float_is_zero(amount_total, precision_rounding=asset.currency_id.rounding): + for line in asset.original_move_line_ids._origin: + if line.analytic_distribution: + for account, distribution in line.analytic_distribution.items(): + distribution_asset[account] = distribution_asset.get(account, 0) + distribution * line.balance + for account, distribution_amount in distribution_asset.items(): + distribution_asset[account] = distribution_amount / amount_total + asset.analytic_distribution = distribution_asset if distribution_asset else asset.analytic_distribution + + @api.depends('method_number', 'method_period', 'prorata_computation_type') + def _compute_lifetime_days(self): + for asset in self: + if not asset.parent_id: + if asset.prorata_computation_type == 'daily_computation': + asset.asset_lifetime_days = (asset.prorata_date + relativedelta(months=int(asset.method_period) * asset.method_number) - asset.prorata_date).days + else: + asset.asset_lifetime_days = int(asset.method_period) * asset.method_number * DAYS_PER_MONTH + else: + # if it has a parent, we want the asset to only depreciate on the remaining days left of the parent + if asset.prorata_computation_type == 'daily_computation': + parent_end_date = asset.parent_id.paused_prorata_date + relativedelta(days=int(asset.parent_id.asset_lifetime_days - 1)) + else: + parent_end_date = asset.parent_id.paused_prorata_date + relativedelta( + months=int(asset.parent_id.asset_lifetime_days / DAYS_PER_MONTH), + days=int(asset.parent_id.asset_lifetime_days % DAYS_PER_MONTH) - 1 + ) + asset.asset_lifetime_days = asset._get_delta_days(asset.prorata_date, parent_end_date) + + @api.depends('acquisition_date', 'company_id', 'prorata_computation_type') + def _compute_prorata_date(self): + for asset in self: + if asset.prorata_computation_type == 'none' and asset.acquisition_date: + fiscalyear_date = asset.company_id.compute_fiscalyear_dates(asset.acquisition_date).get('date_from') + asset.prorata_date = fiscalyear_date + else: + asset.prorata_date = asset.acquisition_date + + @api.depends('prorata_date', 'prorata_computation_type', 'asset_paused_days') + def _compute_paused_prorata_date(self): + for asset in self: + if asset.prorata_computation_type == 'daily_computation': + asset.paused_prorata_date = asset.prorata_date + relativedelta(days=asset.asset_paused_days) + else: + asset.paused_prorata_date = asset.prorata_date + relativedelta( + months=int(asset.asset_paused_days / DAYS_PER_MONTH), + days=asset.asset_paused_days % DAYS_PER_MONTH + ) + + @api.depends('original_move_line_ids') + def _compute_related_purchase_value(self): + for asset in self: + related_purchase_value = sum(asset.original_move_line_ids.mapped('balance')) + if asset.account_asset_id.multiple_assets_per_line and len(asset.original_move_line_ids) == 1: + related_purchase_value /= max(1, int(asset.original_move_line_ids.quantity)) + asset.related_purchase_value = related_purchase_value + + @api.depends('original_move_line_ids') + def _compute_acquisition_date(self): + for asset in self: + asset.acquisition_date = asset.acquisition_date or min( + [(aml.invoice_date or aml.date) for aml in asset.original_move_line_ids] + [fields.Date.today()] + ) + + @api.depends('original_move_line_ids') + def _compute_name(self): + for record in self: + record.name = record.name or (record.original_move_line_ids and record.original_move_line_ids[0].name or '') + + @api.depends( + 'original_value', 'salvage_value', 'already_depreciated_amount_import', + 'depreciation_move_ids.state', + 'depreciation_move_ids.depreciation_value', + 'depreciation_move_ids.reversal_move_ids' + ) + def _compute_value_residual(self): + for record in self: + posted_depreciation_moves = record.depreciation_move_ids.filtered(lambda mv: mv.state == 'posted') + record.value_residual = ( + record.original_value + - record.salvage_value + - record.already_depreciated_amount_import + - sum(posted_depreciation_moves.mapped('depreciation_value')) + ) + + @api.depends('value_residual', 'salvage_value', 'children_ids.book_value') + def _compute_book_value(self): + for record in self: + record.book_value = record.value_residual + record.salvage_value + sum(record.children_ids.mapped('book_value')) + if record.state == 'close' and all(move.state == 'posted' for move in record.depreciation_move_ids): + record.book_value -= record.salvage_value + + @api.depends('children_ids.original_value') + def _compute_gross_increase_value(self): + for record in self: + record.gross_increase_value = sum(record.children_ids.mapped('original_value')) + + @api.depends('original_move_line_ids') + def _compute_non_deductible_tax_value(self): + for record in self: + record.non_deductible_tax_value = 0.0 + for line in record.original_move_line_ids: + if line.non_deductible_tax_value: + account = line.account_id + auto_create_multi = account.create_asset != 'no' and account.multiple_assets_per_line + quantity = line.quantity if auto_create_multi else 1 + converted_non_deductible_tax_value = line.currency_id._convert(line.non_deductible_tax_value / quantity, record.currency_id, record.company_id, line.date) + record.non_deductible_tax_value += record.currency_id.round(converted_non_deductible_tax_value) + + @api.depends('depreciation_move_ids.state', 'parent_id') + def _compute_counts(self): + depreciation_per_asset = { + group.id: count + for group, count in self.env['account.move']._read_group( + domain=[ + ('asset_id', 'in', self.ids), + ('state', '=', 'posted'), + ], + groupby=['asset_id'], + aggregates=['__count'], + ) + } + for asset in self: + asset.depreciation_entries_count = depreciation_per_asset.get(asset.id, 0) + asset.total_depreciation_entries_count = len(asset.depreciation_move_ids) + asset.gross_increase_count = len(asset.children_ids) + + @api.depends('original_move_line_ids.asset_ids') + def _compute_linked_assets(self): + for asset in self: + asset.linked_assets_ids = asset.original_move_line_ids.asset_ids - self + asset.count_linked_asset = len(asset.linked_assets_ids) + confirmed_assets = asset.linked_assets_ids.filtered(lambda x: x.state == "open") + # The warning_count_assets is useful to put the smart button in red, in case at least one asset has been confirmed + asset.warning_count_assets = len(confirmed_assets) > 0 + + # ------------------------------------------------------------------------- + # ONCHANGE METHODS + # ------------------------------------------------------------------------- + @api.onchange('account_depreciation_id') + def _onchange_account_depreciation_id(self): + if not self.original_move_line_ids: + if not self.account_asset_id and self.state != 'model': + # Only set a default value since it is visible in the form + self.account_asset_id = self.account_depreciation_id + + @api.onchange('original_value', 'original_move_line_ids') + def _display_original_value_warning(self): + if self.original_move_line_ids: + computed_original_value = self.related_purchase_value + self.non_deductible_tax_value + if self.original_value != computed_original_value: + warning = { + 'title': _("Warning for the Original Value of %s", self.name), + 'message': _("The amount you have entered (%(entered_amount)s) does not match the Related Purchase's value (%(purchase_value)s). " + "Please make sure this is what you want.", + entered_amount=formatLang(self.env, self.original_value, currency_obj=self.currency_id), + purchase_value=formatLang(self.env, computed_original_value, currency_obj=self.currency_id)) + } + return {'warning': warning} + + @api.onchange('original_move_line_ids') + def _onchange_original_move_line_ids(self): + # Force the recompute + self.acquisition_date = False + self._compute_acquisition_date() + + @api.onchange('account_asset_id') + def _onchange_account_asset_id(self): + self.account_depreciation_id = self.account_depreciation_id or self.account_asset_id + + @api.onchange('model_id') + def _onchange_model_id(self): + model = self.model_id + if model: + self.method = model.method + self.method_number = model.method_number + self.method_period = model.method_period + self.method_progress_factor = model.method_progress_factor + self.prorata_computation_type = model.prorata_computation_type + self.analytic_distribution = model.analytic_distribution or self.analytic_distribution + self.account_asset_id = model.account_asset_id + self.account_depreciation_id = model.account_depreciation_id + self.account_depreciation_expense_id = model.account_depreciation_expense_id + self.journal_id = model.journal_id + + @api.onchange('original_value', 'salvage_value', 'acquisition_date', 'method', 'method_progress_factor', 'method_period', + 'method_number', 'prorata_computation_type', 'already_depreciated_amount_import', 'prorata_date',) + def onchange_consistent_board(self): + """ When changing the fields that should change the values of the entries, we unlink the entries, so the + depreciation board is not inconsistent with the values of the asset""" + self.write( + {'depreciation_move_ids': [Command.set([])]} + ) + + # ------------------------------------------------------------------------- + # CONSTRAINT METHODS + # ------------------------------------------------------------------------- + @api.constrains('active', 'state') + def _check_active(self): + for record in self: + if not record.active and record.state not in ('close', 'model'): + raise UserError(_('You cannot archive a record that is not closed')) + + @api.constrains('depreciation_move_ids') + def _check_depreciations(self): + for asset in self: + if ( + asset.state == 'open' + and asset.depreciation_move_ids + and not asset.currency_id.is_zero( + asset.depreciation_move_ids.sorted(lambda x: (x.date, x.id))[-1].asset_remaining_value + ) + ): + raise UserError(_("The remaining value on the last depreciation line must be 0")) + + @api.constrains('original_move_line_ids') + def _check_related_purchase(self): + for asset in self: + if asset.original_move_line_ids and asset.related_purchase_value == 0: + raise UserError(_("You cannot create an asset from lines containing credit and debit on the account or with a null amount")) + if asset.state not in ('model', 'draft'): + raise UserError(_("You cannot add or remove bills when the asset is already running or closed.")) + + # ------------------------------------------------------------------------- + # LOW-LEVEL METHODS + # ------------------------------------------------------------------------- + @api.ondelete(at_uninstall=True) + def _unlink_if_model_or_draft(self): + for asset in self: + if asset.state in ['open', 'paused', 'close']: + raise UserError(_( + 'You cannot delete a document that is in %s state.', + dict(self._fields['state']._description_selection(self.env)).get(asset.state) + )) + + posted_amount = len(asset.depreciation_move_ids.filtered(lambda x: x.state == 'posted')) + if posted_amount > 0: + raise UserError(_('You cannot delete an asset linked to posted entries.' + '\nYou should either confirm the asset, then, sell or dispose of it,' + ' or cancel the linked journal entries.')) + + def unlink(self): + for asset in self: + for line in asset.original_move_line_ids: + if line.name: + body = _('A document linked to %(move_line_name)s has been deleted: %(link)s', + move_line_name=line.name, + link=asset._get_html_link(), + ) + else: + body = _('A document linked to this move has been deleted: %s', + asset._get_html_link()) + line.move_id.message_post(body=body) + if len(line.move_id.asset_ids) == 1: + line.move_id.asset_move_type = False + return super(AccountAsset, self).unlink() + + def copy_data(self, default=None): + vals_list = super().copy_data(default) + for asset, vals in zip(self, vals_list): + if asset.state == 'model': + vals['state'] = 'model' + vals['name'] = _('%s (copy)', asset.name) + vals['account_asset_id'] = asset.account_asset_id.id + return vals_list + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if 'state' in vals and vals['state'] != 'draft' and not (set(vals) - set({'account_depreciation_id', 'account_depreciation_expense_id', 'journal_id'})): + raise UserError(_("Some required values are missing")) + if self._context.get('default_state') != 'model' and vals.get('state') != 'model': + vals['state'] = 'draft' + new_recs = super(AccountAsset, self.with_context(mail_create_nolog=True)).create(vals_list) + # if original_value is passed in vals, make sure the right value is set (as a different original_value may have been computed by _compute_value()) + for i, vals in enumerate(vals_list): + if 'original_value' in vals: + new_recs[i].original_value = vals['original_value'] + if self.env.context.get('original_asset'): + # When original_asset is set, only one asset is created since its from the form view + original_asset = self.env['account.asset'].browse(self.env.context.get('original_asset')) + original_asset.model_id = new_recs + return new_recs + + def write(self, vals): + result = super().write(vals) + for asset in self: + for move in asset.depreciation_move_ids: + if move.state == 'draft' and 'analytic_distribution' in vals: + # Only draft entries to avoid recreating all the analytic items + move.line_ids.analytic_distribution = vals['analytic_distribution'] + lock_date = move.company_id._get_user_fiscal_lock_date(asset.journal_id) + if move.date > lock_date: + if 'account_depreciation_id' in vals: + # ::2 (0, 2, 4, ...) because we want all first lines of the depreciation entries, which corresponds to the + # lines with account_depreciation_id as account + move.line_ids[::2].account_id = vals['account_depreciation_id'] + if 'account_depreciation_expense_id' in vals: + # 1::2 (1, 3, 5, ...) because we want all second lines of the depreciation entries, which corresponds to the + # lines with account_depreciation_expense_id as account + move.line_ids[1::2].account_id = vals['account_depreciation_expense_id'] + if 'journal_id' in vals: + move.journal_id = vals['journal_id'] + return result + + # ------------------------------------------------------------------------- + # BOARD COMPUTATION + # ------------------------------------------------------------------------- + def _get_linear_amount(self, days_before_period, days_until_period_end, total_depreciable_value): + + amount_expected_previous_period = total_depreciable_value * days_before_period / self.asset_lifetime_days + amount_after_expected = total_depreciable_value * days_until_period_end / self.asset_lifetime_days + number_days_for_period = days_until_period_end - days_before_period + # In case of a decrease, we need to lower the amount of the depreciation with the amount of the decrease + # spread over the remaining lifetime + amount_of_decrease_spread_over_period = [ + number_days_for_period * mv.depreciation_value / (self.asset_lifetime_days - self._get_delta_days(self.paused_prorata_date, mv.asset_depreciation_beginning_date)) + for mv in self.depreciation_move_ids.filtered(lambda mv: mv.asset_value_change) + ] + computed_linear_amount = self.currency_id.round(amount_after_expected - self.currency_id.round(amount_expected_previous_period) - sum(amount_of_decrease_spread_over_period)) + return computed_linear_amount + + def _compute_board_amount(self, residual_amount, period_start_date, period_end_date, days_already_depreciated, + days_left_to_depreciated, residual_declining, start_yearly_period=None, total_lifetime_left=None, + residual_at_compute=None, start_recompute_date=None): + + def _get_max_between_linear_and_degressive(linear_amount, effective_start_date=start_yearly_period): + """ + Compute the degressive amount that could be depreciated and returns the biggest between it and linear_amount + The degressive amount corresponds to the difference between what should have been depreciated at the end of + the period and the residual_amount (to deal with rounding issues at the end of each month) + """ + fiscalyear_dates = self.company_id.compute_fiscalyear_dates(period_end_date) + days_in_fiscalyear = self._get_delta_days(fiscalyear_dates['date_from'], fiscalyear_dates['date_to']) + + degressive_total_value = residual_declining * (1 - self.method_progress_factor * self._get_delta_days(effective_start_date, period_end_date) / days_in_fiscalyear) + degressive_amount = residual_amount - degressive_total_value + return self._degressive_linear_amount(residual_amount, degressive_amount, linear_amount) + + if float_is_zero(self.asset_lifetime_days, 2) or float_is_zero(residual_amount, 2): + return 0, 0 + + days_until_period_end = self._get_delta_days(self.paused_prorata_date, period_end_date) + days_before_period = self._get_delta_days(self.paused_prorata_date, period_start_date + relativedelta(days=-1)) + days_before_period = max(days_before_period, 0) # if disposed before the beginning of the asset for example + number_days = days_until_period_end - days_before_period + + # The amount to depreciate are computed by computing how much the asset should be depreciated at the end of the + # period minus how much difference it is actually depreciated. It is done that way to avoid having the last move to take + # every single small difference that could appear over the time with the classic computation method. + if self.method == 'linear': + if total_lifetime_left and float_compare(total_lifetime_left, 0, 2) > 0: + computed_linear_amount = residual_amount - residual_at_compute * (1 - self._get_delta_days(start_recompute_date, period_end_date) / total_lifetime_left) + else: + computed_linear_amount = self._get_linear_amount(days_before_period, days_until_period_end, self.total_depreciable_value) + amount = min(computed_linear_amount, residual_amount, key=abs) + elif self.method == 'degressive': + # Linear amount + # We first calculate the total linear amount for the period left from the beginning of the year + # to get the linear amount for the period in order to avoid big delta at the end of the period + effective_start_date = max(start_yearly_period, self.paused_prorata_date) if start_yearly_period else self.paused_prorata_date + days_left_from_beginning_of_year = self._get_delta_days(effective_start_date, period_start_date - relativedelta(days=1)) + days_left_to_depreciated + expected_remaining_value_with_linear = residual_declining - residual_declining * self._get_delta_days(effective_start_date, period_end_date) / days_left_from_beginning_of_year + linear_amount = residual_amount - expected_remaining_value_with_linear + + amount = _get_max_between_linear_and_degressive(linear_amount, effective_start_date) + elif self.method == 'degressive_then_linear': + if not self.parent_id: + linear_amount = self._get_linear_amount(days_before_period, days_until_period_end, self.total_depreciable_value) + else: + # we want to know the amount before the reeval for the parent so the child can follow the same curve, + # so it transitions from degressive to linear at the same moment + parent_moves = self.parent_id.depreciation_move_ids.filtered(lambda mv: mv.date <= self.prorata_date).sorted(key=lambda mv: (mv.date, mv.id)) + parent_cumulative_depreciation = parent_moves[-1].asset_depreciated_value if parent_moves else self.parent_id.already_depreciated_amount_import + parent_depreciable_value = parent_moves[-1].asset_remaining_value if parent_moves else self.parent_id.total_depreciable_value + if self.currency_id.is_zero(parent_depreciable_value): + linear_amount = self._get_linear_amount(days_before_period, days_until_period_end, self.total_depreciable_value) + else: + # To have the same curve as the parent, we need to have the equivalent amount before the reeval. + # The child's depreciable value corresponds to the amount that is left to depreciate for the parent. + # So, we use the proportion between them to compute the equivalent child's total to depreciate. + # We use it then with the duration of the parent to compute the depreciation amount + depreciable_value = self.total_depreciable_value * (1 + parent_cumulative_depreciation/parent_depreciable_value) + linear_amount = self._get_linear_amount(days_before_period, days_until_period_end, depreciable_value) * self.asset_lifetime_days / self.parent_id.asset_lifetime_days + + amount = _get_max_between_linear_and_degressive(linear_amount) + + amount = max(amount, 0) if self.currency_id.compare_amounts(residual_amount, 0) > 0 else min(amount, 0) + amount = self._get_depreciation_amount_end_of_lifetime(residual_amount, amount, days_until_period_end) + + return number_days, self.currency_id.round(amount) + + def compute_depreciation_board(self, date=False): + # Need to unlink draft moves before adding new ones because if we create new moves before, it will cause an error + self.depreciation_move_ids.filtered(lambda mv: mv.state == 'draft' and (mv.date >= date if date else True)).unlink() + + new_depreciation_moves_data = [] + for asset in self: + new_depreciation_moves_data.extend(asset._recompute_board(date)) + + new_depreciation_moves = self.env['account.move'].create(new_depreciation_moves_data) + new_depreciation_moves_to_post = new_depreciation_moves.filtered(lambda move: move.asset_id.state == 'open') + # In case of the asset is in running mode, we post in the past and set to auto post move in the future + new_depreciation_moves_to_post._post() + + def _recompute_board(self, start_depreciation_date=False): + self.ensure_one() + # All depreciation moves that are posted + posted_depreciation_move_ids = self.depreciation_move_ids.filtered( + lambda mv: mv.state == 'posted' and not mv.asset_value_change + ).sorted(key=lambda mv: (mv.date, mv.id)) + + imported_amount = self.already_depreciated_amount_import + residual_amount = self.value_residual - sum(self.depreciation_move_ids.filtered(lambda mv: mv.state == 'draft').mapped('depreciation_value')) + if not posted_depreciation_move_ids: + residual_amount += imported_amount + residual_declining = residual_at_compute = residual_amount + # start_yearly_period is needed in the 'degressive' and 'degressive_then_linear' methods to compute the amount when the period is monthly + start_recompute_date = start_depreciation_date = start_yearly_period = start_depreciation_date or self.paused_prorata_date + + last_day_asset = self._get_last_day_asset() + final_depreciation_date = self._get_end_period_date(last_day_asset) + total_lifetime_left = self._get_delta_days(start_depreciation_date, last_day_asset) + + depreciation_move_values = [] + if not float_is_zero(self.value_residual, precision_rounding=self.currency_id.rounding): + while not self.currency_id.is_zero(residual_amount) and start_depreciation_date < final_depreciation_date: + period_end_depreciation_date = self._get_end_period_date(start_depreciation_date) + period_end_fiscalyear_date = self.company_id.compute_fiscalyear_dates(period_end_depreciation_date).get('date_to') + lifetime_left = self._get_delta_days(start_depreciation_date, last_day_asset) + + days, amount = self._compute_board_amount(residual_amount, start_depreciation_date, period_end_depreciation_date, False, lifetime_left, residual_declining, start_yearly_period, total_lifetime_left, residual_at_compute, start_recompute_date) + residual_amount -= amount + + if not posted_depreciation_move_ids: + # self.already_depreciated_amount_import management. + # Subtracts the imported amount from the first depreciation moves until we reach it + # (might skip several depreciation entries) + if abs(imported_amount) <= abs(amount): + amount -= imported_amount + imported_amount = 0 + else: + imported_amount -= amount + amount = 0 + + if self.method == 'degressive_then_linear' and final_depreciation_date < period_end_depreciation_date: + period_end_depreciation_date = final_depreciation_date + + if not float_is_zero(amount, precision_rounding=self.currency_id.rounding): + # For deferred revenues, we should invert the amounts. + depreciation_move_values.append(self.env['account.move']._prepare_move_for_asset_depreciation({ + 'amount': amount, + 'asset_id': self, + 'depreciation_beginning_date': start_depreciation_date, + 'date': period_end_depreciation_date, + 'asset_number_days': days, + })) + + if period_end_depreciation_date == period_end_fiscalyear_date: + start_yearly_period = self.company_id.compute_fiscalyear_dates(period_end_depreciation_date).get('date_from') + relativedelta(years=1) + residual_declining = residual_amount + + start_depreciation_date = period_end_depreciation_date + relativedelta(days=1) + + return depreciation_move_values + + def _get_end_period_date(self, start_depreciation_date): + """Get the end of the period in which the depreciation is posted. + + Can be the end of the month if the asset is depreciated monthly, or the end of the fiscal year is it is depreciated yearly. + """ + self.ensure_one() + fiscalyear_date = self.company_id.compute_fiscalyear_dates(start_depreciation_date).get('date_to') + period_end_depreciation_date = fiscalyear_date if start_depreciation_date <= fiscalyear_date else fiscalyear_date + relativedelta(years=1) + + if self.method_period == '1': # If method period is set to monthly computation + max_day_in_month = end_of(datetime.date(start_depreciation_date.year, start_depreciation_date.month, 1), 'month').day + period_end_depreciation_date = min(start_depreciation_date.replace(day=max_day_in_month), period_end_depreciation_date) + return period_end_depreciation_date + + def _get_delta_days(self, start_date, end_date): + """Compute how many days there are between 2 dates. + + The computation is different if the asset is in daily_computation or not. + """ + self.ensure_one() + if self.prorata_computation_type == 'daily_computation': + # Compute how many days there are between 2 dates using a daily_computation method + return (end_date - start_date).days + 1 + else: + # Compute how many days there are between 2 dates counting 30 days per month + # Get how many days there are in the start date month + start_date_days_month = end_of(start_date, 'month').day + # Get how many days there are in the start date month (e.g: June 20th: (30 * (30 - 20 + 1)) / 30 = 11) + start_prorata = (start_date_days_month - start_date.day + 1) / start_date_days_month + # Get how many days there are in the end date month (e.g: You're the August 14th: (14 * 30) / 31 = 13.548387096774194) + end_prorata = end_date.day / end_of(end_date, 'month').day + # Compute how many days there are between these 2 dates + # e.g: 13.548387096774194 + 11 + 360 * (2020 - 2020) + 30 * (8 - 6 - 1) = 24.548387096774194 + 360 * 0 + 30 * 1 = 54.548387096774194 day + return sum(( + start_prorata * DAYS_PER_MONTH, + end_prorata * DAYS_PER_MONTH, + (end_date.year - start_date.year) * DAYS_PER_YEAR, + (end_date.month - start_date.month - 1) * DAYS_PER_MONTH + )) + + def _get_last_day_asset(self): + this = self.parent_id if self.parent_id else self + return this.paused_prorata_date + relativedelta(months=int(this.method_period) * this.method_number, days=-1) + + # ------------------------------------------------------------------------- + # PUBLIC ACTIONS + # ------------------------------------------------------------------------- + + def action_open_linked_assets(self): + action = self.linked_assets_ids.open_asset(['list', 'form']) + action.get('context', {}).update({ + 'from_linked_assets': 0, + }) + return action + + def action_asset_modify(self): + """ Returns an action opening the asset modification wizard. + """ + self.ensure_one() + new_wizard = self.env['asset.modify'].create({ + 'asset_id': self.id, + 'modify_action': 'resume' if self.env.context.get('resume_after_pause') else 'dispose', + }) + return { + 'name': _('Modify Asset'), + 'view_mode': 'form', + 'res_model': 'asset.modify', + 'type': 'ir.actions.act_window', + 'target': 'new', + 'res_id': new_wizard.id, + 'context': self.env.context, + } + + def action_save_model(self): + return { + 'name': _('Save model'), + 'views': [[self.env.ref('odex30_account_asset.view_account_asset_form').id, "form"]], + 'res_model': 'account.asset', + 'type': 'ir.actions.act_window', + 'context': { + 'default_state': 'model', + 'default_account_asset_id': self.account_asset_id.id, + 'default_account_depreciation_id': self.account_depreciation_id.id, + 'default_account_depreciation_expense_id': self.account_depreciation_expense_id.id, + 'default_journal_id': self.journal_id.id, + 'default_method': self.method, + 'default_method_number': self.method_number, + 'default_method_period': self.method_period, + 'default_method_progress_factor': self.method_progress_factor, + 'default_prorata_date': self.prorata_date, + 'default_prorata_computation_type': self.prorata_computation_type, + 'default_analytic_distribution': self.analytic_distribution, + 'original_asset': self.id, + } + } + + def open_entries(self): + return { + 'name': _('Journal Entries'), + 'view_mode': 'list,form', + 'res_model': 'account.move', + 'search_view_id': [self.env.ref('account.view_account_move_filter').id, 'search'], + 'views': [(self.env.ref('account.view_move_tree').id, 'list'), (False, 'form')], + 'type': 'ir.actions.act_window', + 'domain': [('id', 'in', self.depreciation_move_ids.ids)], + 'context': dict(self._context, create=False), + } + + def open_related_entries(self): + return { + 'name': _('Journal Items'), + 'view_mode': 'list,form', + 'res_model': 'account.move.line', + 'view_id': False, + 'type': 'ir.actions.act_window', + 'domain': [('id', 'in', self.original_move_line_ids.ids)], + } + + def open_increase(self): + result = { + 'name': _('Gross Increase'), + 'view_mode': 'list,form', + 'res_model': 'account.asset', + 'context': {**self.env.context, 'create': False}, + 'view_id': False, + 'type': 'ir.actions.act_window', + 'domain': [('id', 'in', self.children_ids.ids)], + 'views': [(False, 'list'), (False, 'form')], + } + if len(self.children_ids) == 1: + result['views'] = [(False, 'form')] + result['res_id'] = self.children_ids.id + return result + + def open_parent_id(self): + result = { + 'name': _('Parent Asset'), + 'view_mode': 'form', + 'res_model': 'account.asset', + 'type': 'ir.actions.act_window', + 'res_id': self.parent_id.id, + 'views': [(False, 'form')], + } + return result + + def validate(self): + fields = [ + 'method', + 'method_number', + 'method_period', + 'method_progress_factor', + 'salvage_value', + 'original_move_line_ids', + ] + ref_tracked_fields = self.env['account.asset'].fields_get(fields) + self.write({'state': 'open'}) + for asset in self: + tracked_fields = ref_tracked_fields.copy() + if asset.method == 'linear': + del tracked_fields['method_progress_factor'] + dummy, tracking_value_ids = asset._mail_track(tracked_fields, dict.fromkeys(fields)) + asset_name = (_('Asset created'), _('An asset has been created for this move:')) + msg = asset_name[1] + ' ' + asset._get_html_link() + asset.message_post(body=asset_name[0], tracking_value_ids=tracking_value_ids) + for move_id in asset.original_move_line_ids.mapped('move_id'): + move_id.message_post(body=msg) + try: + if not asset.depreciation_move_ids: + asset.compute_depreciation_board() + asset._check_depreciations() + asset.depreciation_move_ids.filtered(lambda move: move.state != 'posted')._post() + except psycopg2.errors.CheckViolation: + raise ValidationError(_("Atleast one asset (%s) couldn't be set as running because it lacks any required information", asset.name)) + + if asset.account_asset_id.create_asset == 'no': + asset._post_non_deductible_tax_value() + + def set_to_close(self, invoice_line_ids, date=None, message=None): + self.ensure_one() + disposal_date = date or fields.Date.today() + if disposal_date <= self.company_id._get_user_fiscal_lock_date(self.journal_id): + raise UserError(_("You cannot dispose of an asset before the lock date.")) + if invoice_line_ids and self.children_ids.filtered(lambda a: a.state in ('draft', 'open') or a.value_residual > 0): + raise UserError(_("You cannot automate the journal entry for an asset that has a running gross increase. Please use 'Dispose' on the increase(s).")) + full_asset = self + self.children_ids + full_asset.state = 'close' + move_ids = full_asset._get_disposal_moves([invoice_line_ids] * len(full_asset), disposal_date) + for asset in full_asset: + asset.message_post(body= + _('Asset sold. %s', message if message else "") + if invoice_line_ids else + _('Asset disposed. %s', message if message else "") + ) + + selling_price = abs(sum(invoice_line.balance for invoice_line in invoice_line_ids)) + self.net_gain_on_sale = self.currency_id.round(selling_price - self.book_value) + + if move_ids: + name = _('Disposal Move') + view_mode = 'form' + if len(move_ids) > 1: + name = _('Disposal Moves') + view_mode = 'list,form' + return { + 'name': name, + 'view_mode': view_mode, + 'res_model': 'account.move', + 'type': 'ir.actions.act_window', + 'target': 'current', + 'res_id': move_ids[0], + 'domain': [('id', 'in', move_ids)] + } + + def set_to_cancelled(self): + for asset in self: + posted_moves = asset.depreciation_move_ids.filtered(lambda m: ( + not m.reversal_move_ids + and not m.reversed_entry_id + and m.state == 'posted' + )) + if posted_moves: + depreciation_change = sum(posted_moves.line_ids.mapped( + lambda l: l.debit if l.account_id == asset.account_depreciation_expense_id else 0.0 + )) + acc_depreciation_change = sum(posted_moves.line_ids.mapped( + lambda l: l.credit if l.account_id == asset.account_depreciation_id else 0.0 + )) + entries = Markup('
    ').join(posted_moves.sorted('date').mapped(lambda m: + f'{m.ref} - {m.date} - ' + f'{formatLang(self.env, m.depreciation_value, currency_obj=m.currency_id)} - ' + f'{m.name}' + )) + asset._cancel_future_moves(datetime.date.min) + msg = _('Asset Cancelled') + Markup('
    ') + \ + _('The account %(exp_acc)s has been credited by %(exp_delta)s, ' + 'while the account %(dep_acc)s has been debited by %(dep_delta)s. ' + 'This corresponds to %(move_count)s cancelled %(word)s:', + exp_acc=asset.account_depreciation_expense_id.display_name, + exp_delta=formatLang(self.env, depreciation_change, currency_obj=asset.currency_id), + dep_acc=asset.account_depreciation_id.display_name, + dep_delta=formatLang(self.env, acc_depreciation_change, currency_obj=asset.currency_id), + move_count=len(posted_moves), + word=_('entries') if len(posted_moves) > 1 else _('entry'), + ) + Markup('
    ') + entries + asset._message_log(body=msg) + else: + asset._message_log(body=_('Asset Cancelled')) + asset.depreciation_move_ids.filtered(lambda m: m.state == 'draft').with_context(force_delete=True).unlink() + asset.asset_paused_days = 0 + asset.write({'state': 'cancelled'}) + + def set_to_draft(self): + self.write({'state': 'draft'}) + + def set_to_running(self): + if self.depreciation_move_ids and not max(self.depreciation_move_ids, key=lambda m: (m.date, m.id)).asset_remaining_value == 0: + self.env['asset.modify'].create({'asset_id': self.id, 'name': _('Reset to running')}).modify() + self.write({ + 'state': 'open', + 'net_gain_on_sale': 0 + }) + + def resume_after_pause(self): + """ Sets an asset in 'paused' state back to 'open'. + A Depreciation line is created automatically to remove from the + depreciation amount the proportion of time spent + in pause in the current period. + """ + self.ensure_one() + return self.with_context(resume_after_pause=True).action_asset_modify() + + def pause(self, pause_date, message=None): + """ Sets an 'open' asset in 'paused' state, generating first a depreciation + line corresponding to the ratio of time spent within the current depreciation + period before putting the asset in pause. This line and all the previous + unposted ones are then posted. + """ + self.ensure_one() + self._create_move_before_date(pause_date) + self.write({'state': 'paused'}) + self.message_post(body=_("Asset paused. %s", message if message else "")) + + def open_asset(self, view_mode): + if len(self) == 1: + view_mode = ['form'] + views = [v for v in [(False, 'list'), (False, 'form')] if v[1] in view_mode] + ctx = dict(self._context) + ctx.pop('default_move_type', None) + action = { + 'name': _('Asset'), + 'view_mode': ','.join(view_mode), + 'type': 'ir.actions.act_window', + 'res_id': self.id if 'list' not in view_mode else False, + 'res_model': 'account.asset', + 'views': views, + 'domain': [('id', 'in', self.ids)], + 'context': ctx + } + return action + + # ------------------------------------------------------------------------- + # HELPER METHODS + # ------------------------------------------------------------------------- + def _insert_depreciation_line(self, amount, beginning_depreciation_date, depreciation_date, days_depreciated): + """ Inserts a new line in the depreciation board, shifting the sequence of + all the following lines from one unit. + :param amount: The depreciation amount of the new line. + :param label: The name to give to the new line. + :param date: The date to give to the new line. + """ + self.ensure_one() + AccountMove = self.env['account.move'] + + return AccountMove.create(AccountMove._prepare_move_for_asset_depreciation({ + 'amount': amount, + 'asset_id': self, + 'depreciation_beginning_date': beginning_depreciation_date, + 'date': depreciation_date, + 'asset_number_days': days_depreciated, + })) + + def _post_non_deductible_tax_value(self): + # If the asset has a non-deductible tax, the value is posted in the chatter to explain why + # the original value does not match the related purchase(s). + if self.non_deductible_tax_value: + currency = self.env.company.currency_id + msg = _('A non deductible tax value of %(tax_value)s was added to %(name)s\'s initial value of %(purchase_value)s', + tax_value=formatLang(self.env, self.non_deductible_tax_value, currency_obj=currency), + name=self.name, + purchase_value=formatLang(self.env, self.related_purchase_value, currency_obj=currency)) + self.message_post(body=msg) + + def _create_move_before_date(self, date): + """Cancel all the moves after the given date and replace them by a new one. + + The new depreciation/move is depreciating the residual value. + """ + all_move_dates_before_date = (self.depreciation_move_ids.filtered( + lambda x: + x.date <= date + and not x.reversal_move_ids + and not x.reversed_entry_id + and x.state == 'posted' + ).sorted('date')).mapped('date') + + beginning_fiscal_year = self.company_id.compute_fiscalyear_dates(date).get('date_from') if self.method != 'linear' else False + first_fiscalyear_move = self.env['account.move'] + if all_move_dates_before_date: + last_move_date_not_reversed = max(all_move_dates_before_date) + # We don't know when begins the period that the move is supposed to cover + # So, we use the earliest beginning of a move that comes after the last move not cancelled + future_moves_beginning_date = self.depreciation_move_ids.filtered( + lambda m: m.date > last_move_date_not_reversed and ( + not m.reversal_move_ids and not m.reversed_entry_id and m.state == 'posted' + or m.state == 'draft' + ) + ).mapped('asset_depreciation_beginning_date') + beginning_depreciation_date = min(future_moves_beginning_date) if future_moves_beginning_date else self.paused_prorata_date + + if self.method != 'linear': + # In degressive and degressive_then_linear, we need to find the first move of the fiscal year that comes after the last move not cancelled + # in order to correctly compute the moves just before and after the pause date + first_moves = self.depreciation_move_ids.filtered( + lambda m: m.asset_depreciation_beginning_date >= beginning_fiscal_year and ( + not m.reversal_move_ids and not m.reversed_entry_id and m.state == 'posted' + or m.state == 'draft' + ) + ).sorted(lambda m: (m.asset_depreciation_beginning_date, m.id)) + first_fiscalyear_move = next(iter(first_moves), first_fiscalyear_move) + else: + beginning_depreciation_date = self.paused_prorata_date + + residual_declining = first_fiscalyear_move.asset_remaining_value + first_fiscalyear_move.depreciation_value + self._cancel_future_moves(date) + + imported_amount = self.already_depreciated_amount_import if not all_move_dates_before_date else 0 + value_residual = self.value_residual + self.already_depreciated_amount_import if not all_move_dates_before_date else self.value_residual + residual_declining = residual_declining or value_residual + + last_day_asset = self._get_last_day_asset() + lifetime_left = self._get_delta_days(beginning_depreciation_date, last_day_asset) + days_depreciated, amount = self._compute_board_amount(self.value_residual, beginning_depreciation_date, date, False, lifetime_left, residual_declining, beginning_fiscal_year, lifetime_left, value_residual, beginning_depreciation_date) + + if abs(imported_amount) <= abs(amount): + amount -= imported_amount + if not float_is_zero(amount, precision_rounding=self.currency_id.rounding): + new_line = self._insert_depreciation_line(amount, beginning_depreciation_date, date, days_depreciated) + new_line._post() + + def _cancel_future_moves(self, date): + """Cancel all the depreciation entries after the date given as parameter. + + When possible, it will reset those to draft before unlinking them, reverse them otherwise. + + :param date: date after which the moves are deleted/reversed + """ + for asset in self: + obsolete_moves = asset.depreciation_move_ids.filtered(lambda m: m.state == 'draft' or ( + not m.reversal_move_ids + and not m.reversed_entry_id + and m.state == 'posted' + and m.date > date + )) + obsolete_moves._unlink_or_reverse() + + def _get_disposal_moves(self, invoice_lines_list, disposal_date): + """Create the move for the disposal of an asset. + + :param invoice_lines_list: list of recordset of `account.move.line` + Each element of the list corresponds to one record of `self` + These lines are used to generate the disposal move + :param disposal_date: the date of the disposal + """ + def get_line(name, asset, amount, account): + return (0, 0, { + 'name': name, + 'account_id': account.id, + 'balance': -amount, + 'analytic_distribution': analytic_distribution, + 'currency_id': asset.currency_id.id, + 'amount_currency': -asset.company_id.currency_id._convert( + from_amount=amount, + to_currency=asset.currency_id, + company=asset.company_id, + date=disposal_date, + ) + }) + + move_ids = [] + assert len(self) == len(invoice_lines_list) + for asset, invoice_line_ids in zip(self, invoice_lines_list): + asset._create_move_before_date(disposal_date) + + analytic_distribution = asset.analytic_distribution + + dict_invoice = {} + invoice_amount = 0 + + initial_amount = asset.original_value + initial_account = asset.original_move_line_ids.account_id if len(asset.original_move_line_ids.account_id) == 1 else asset.account_asset_id + + all_lines_before_disposal = asset.depreciation_move_ids.filtered(lambda x: x.date <= disposal_date) + depreciated_amount = asset.currency_id.round(copysign( + sum(all_lines_before_disposal.mapped('depreciation_value')) + asset.already_depreciated_amount_import, + -initial_amount, + )) + depreciation_account = asset.account_depreciation_id + for invoice_line in invoice_line_ids: + dict_invoice[invoice_line.account_id] = copysign(invoice_line.balance, -initial_amount) + dict_invoice.get(invoice_line.account_id, 0) + invoice_amount += copysign(invoice_line.balance, -initial_amount) + list_accounts = [(amount, account) for account, amount in dict_invoice.items()] + difference = -initial_amount - depreciated_amount - invoice_amount + difference_account = asset.company_id.gain_account_id if difference > 0 else asset.company_id.loss_account_id + line_datas = [(initial_amount, initial_account), (depreciated_amount, depreciation_account)] + list_accounts + [(difference, difference_account)] + name = _("%(asset)s: Disposal", asset=asset.name) if not invoice_line_ids else _("%(asset)s: Sale", asset=asset.name) + vals = { + 'asset_id': asset.id, + 'ref': name, + 'asset_depreciation_beginning_date': disposal_date, + 'date': disposal_date, + 'journal_id': asset.journal_id.id, + 'move_type': 'entry', + 'asset_move_type': 'disposal' if not invoice_line_ids else 'sale', + 'line_ids': [get_line(name, asset, amount, account) for amount, account in line_datas if account], + } + asset.write({'depreciation_move_ids': [(0, 0, vals)]}) + move_ids += self.env['account.move'].search([('asset_id', '=', asset.id), ('state', '=', 'draft')]).ids + + return move_ids + + def _degressive_linear_amount(self, residual_amount, degressive_amount, linear_amount): + if self.currency_id.compare_amounts(residual_amount, 0) > 0: + return max(degressive_amount, linear_amount) + else: + return min(degressive_amount, linear_amount) + + def _get_depreciation_amount_end_of_lifetime(self, residual_amount, amount, days_until_period_end): + if abs(residual_amount) < abs(amount) or days_until_period_end >= self.asset_lifetime_days: + # If the residual amount is less than the computed amount, we keep the residual amount + # If total_days is greater or equals to asset lifetime days, it should mean that + # the asset will finish in this period and the value for this period is equal to the residual amount. + amount = residual_amount + return amount + + def _get_own_book_value(self, date=None): + self.ensure_one() + return (self._get_residual_value_at_date(date) if date else self.value_residual) + self.salvage_value + + def _get_residual_value_at_date(self, date): + """ Computes the theoretical value of the asset at a specific date. + + :param date: the date at which we want the asset's value + :return: the value at date of the asset without taking reverse entries into account (as it should be in a "normal" flow of the asset) + """ + current_and_previous_depreciation = self.depreciation_move_ids.filtered( + lambda mv: + mv.asset_depreciation_beginning_date < date + and not mv.reversed_entry_id + ).sorted('asset_depreciation_beginning_date', reverse=True) + if not current_and_previous_depreciation: + return 0 + + if len(current_and_previous_depreciation) > 1: + previous_value_residual = current_and_previous_depreciation[1].asset_remaining_value + else: + # If there is only one depreciation, we take the original depreciation value + previous_value_residual = self.original_value - self.salvage_value - self.already_depreciated_amount_import + + # We compare the amount_residuals of the depreciations before and during the given date. + # It applies the ratio of the period (to-given-date / total-days-of-the-period) to the amount of the depreciation. + cur_depr_end_date = self._get_end_period_date(date) + current_depreciation = current_and_previous_depreciation[0] + cur_depr_beg_date = current_depreciation.asset_depreciation_beginning_date + + rate = self._get_delta_days(cur_depr_beg_date, date) / self._get_delta_days(cur_depr_beg_date, cur_depr_end_date) + lost_value_at_date = (previous_value_residual - current_depreciation.asset_remaining_value) * rate + residual_value_at_date = self.currency_id.round(previous_value_residual - lost_value_at_date) + if self.currency_id.compare_amounts(self.original_value, 0) > 0: + return max(residual_value_at_date, 0) + else: + return min(residual_value_at_date, 0) diff --git a/dev_odex30_accounting/odex30_account_asset/models/account_asset_group.py b/dev_odex30_accounting/odex30_account_asset/models/account_asset_group.py new file mode 100644 index 0000000..71dc28b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/models/account_asset_group.py @@ -0,0 +1,37 @@ +from odoo import fields, models, api + + +class AccountAssetGroup(models.Model): + _name = 'account.asset.group' + _description = 'Asset Group' + _order = 'name' + + name = fields.Char("Name", index="trigram") + company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.company) + linked_asset_ids = fields.One2many('account.asset', 'asset_group_id', string='Related Assets') + count_linked_assets = fields.Integer(compute='_compute_count_linked_asset') + + @api.depends('linked_asset_ids') + def _compute_count_linked_asset(self): + count_per_asset_group = { + asset_group.id: count + for asset_group, count in self.env['account.asset']._read_group( + domain=[ + ('asset_group_id', 'in', self.ids), + ], + groupby=['asset_group_id'], + aggregates=['__count'], + ) + } + for asset_group in self: + asset_group.count_linked_assets = count_per_asset_group.get(asset_group.id, 0) + + def action_open_linked_assets(self): + self.ensure_one() + return { + 'name': self.name, + 'view_mode': 'list,form', + 'res_model': 'account.asset', + 'type': 'ir.actions.act_window', + 'domain': [('id', 'in', self.linked_asset_ids.ids)], + } diff --git a/dev_odex30_accounting/odex30_account_asset/models/account_assets_report.py b/dev_odex30_accounting/odex30_account_asset/models/account_assets_report.py new file mode 100644 index 0000000..1316b14 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/models/account_assets_report.py @@ -0,0 +1,468 @@ +# -*- coding: utf-8 -*- + +from odoo import fields, models, _ +from odoo.tools import format_date, SQL, Query +from collections import defaultdict + +MAX_NAME_LENGTH = 50 + + +class AssetsReportCustomHandler(models.AbstractModel): + _name = 'account.asset.report.handler' + _inherit = 'account.report.custom.handler' + _description = 'Assets Report Custom Handler' + + def _get_custom_display_config(self): + return { + 'client_css_custom_class': 'depreciation_schedule', + 'templates': { + 'AccountReportFilters': 'odex30_account_asset.DepreciationScheduleFilters', + } + } + + def _dynamic_lines_generator(self, report, options, all_column_groups_expression_totals, warnings=None): + lines, totals_by_column_group = self._generate_report_lines_without_grouping(report, options) + # add the groups by grouping_field + if options['assets_grouping_field'] != 'none': + lines = self._group_by_field(report, lines, options) + else: + lines = report._regroup_lines_by_name_prefix(options, lines, '_report_expand_unfoldable_line_assets_report_prefix_group', 0) + + # add the total line + total_columns = [] + for column_data in options['columns']: + col_value = totals_by_column_group[column_data['column_group_key']].get(column_data['expression_label']) + col_value = col_value if column_data.get('figure_type') == 'monetary' else '' + + total_columns.append(report._build_column_dict(col_value, column_data, options=options)) + + if lines: + lines.append({ + 'id': report._get_generic_line_id(None, None, markup='total'), + 'level': 1, + 'name': _('Total'), + 'columns': total_columns, + 'unfoldable': False, + 'unfolded': False, + }) + + return [(0, line) for line in lines] + + def _generate_report_lines_without_grouping(self, report, options, prefix_to_match=None, parent_id=None, forced_account_id=None): + # construct a dictionary: + # {(account_id, asset_id, asset_group_id): {col_group_key: {expression_label_1: value, expression_label_2: value, ...}}} + all_asset_ids = set() + all_lines_data = {} + for column_group_key, column_group_options in report._split_options_per_column_group(options).items(): + # the lines returned are already sorted by account_id! + lines_query_results = self._query_lines(column_group_options, prefix_to_match=prefix_to_match, forced_account_id=forced_account_id) + for account_id, asset_id, asset_group_id, cols_by_expr_label in lines_query_results: + line_id = (account_id, asset_id, asset_group_id) + all_asset_ids.add(asset_id) + if line_id not in all_lines_data: + all_lines_data[line_id] = {column_group_key: []} + all_lines_data[line_id][column_group_key] = cols_by_expr_label + + column_names = [ + 'assets_date_from', 'assets_plus', 'assets_minus', 'assets_date_to', 'depre_date_from', + 'depre_plus', 'depre_minus', 'depre_date_to', 'balance' + ] + totals_by_column_group = defaultdict(lambda: dict.fromkeys(column_names, 0.0)) + + # Browse all the necessary assets in one go, to minimize the number of queries + assets_cache = {asset.id: asset for asset in self.env['account.asset'].browse(all_asset_ids)} + + # construct the lines, 1 at a time + lines = [] + company_currency = self.env.company.currency_id + column_expression = self.env['account.report.expression'] + for (account_id, asset_id, asset_group_id), col_group_totals in all_lines_data.items(): + all_columns = [] + for column_data in options['columns']: + col_group_key = column_data['column_group_key'] + expr_label = column_data['expression_label'] + if col_group_key not in col_group_totals or expr_label not in col_group_totals[col_group_key]: + all_columns.append(report._build_column_dict(None, None)) + continue + + col_value = col_group_totals[col_group_key][expr_label] + col_data = None if col_value is None else column_data + + all_columns.append(report._build_column_dict(col_value, col_data, options=options, column_expression=column_expression, currency=company_currency)) + + # add to the total line + if column_data['figure_type'] == 'monetary': + totals_by_column_group[column_data['column_group_key']][column_data['expression_label']] += col_value + + name = assets_cache[asset_id].name + line = { + 'id': report._get_generic_line_id('account.asset', asset_id, parent_line_id=parent_id), + 'level': 2, + 'name': name, + 'columns': all_columns, + 'unfoldable': False, + 'unfolded': False, + 'caret_options': 'account_asset_line', + 'assets_account_id': account_id, + 'assets_asset_group_id': asset_group_id, + } + if parent_id: + line['parent_id'] = parent_id + if len(name) >= MAX_NAME_LENGTH: + line['title_hover'] = name + lines.append(line) + + return lines, totals_by_column_group + + def _caret_options_initializer(self): + # Use 'caret_option_open_record_form' defined in account_reports rather than a custom function + return { + 'account_asset_line': [ + {'name': _("Open Asset"), 'action': 'caret_option_open_record_form'}, + ] + } + + def _custom_options_initializer(self, report, options, previous_options): + super()._custom_options_initializer(report, options, previous_options=previous_options) + column_group_options_map = report._split_options_per_column_group(options) + + for col in options['columns']: + column_group_options = column_group_options_map[col['column_group_key']] + # Dynamic naming of columns containing dates + if col['expression_label'] == 'balance': + col['name'] = '' # The column label will be displayed in the subheader + if col['expression_label'] in ['assets_date_from', 'depre_date_from']: + col['name'] = format_date(self.env, column_group_options['date']['date_from']) + elif col['expression_label'] in ['assets_date_to', 'depre_date_to']: + col['name'] = format_date(self.env, column_group_options['date']['date_to']) + + options['custom_columns_subheaders'] = [ + {"name": _("Characteristics"), "colspan": 4}, + {"name": _("Assets"), "colspan": 4}, + {"name": _("Depreciation"), "colspan": 4}, + {"name": _("Book Value"), "colspan": 1} + ] + + # Group by account by default + options['assets_grouping_field'] = previous_options.get('assets_grouping_field') or 'account_id' + # If group by account is activated, activate the hierarchy (which will group by account group as well) if + # the company has at least one account group, otherwise only group by account + has_account_group = self.env['account.group'].search_count([('company_id', '=', self.env.company.id)], limit=1) + hierarchy_activated = previous_options.get('hierarchy', True) + options['hierarchy'] = has_account_group and hierarchy_activated or False + + def _query_lines(self, options, prefix_to_match=None, forced_account_id=None): + """ + Returns a list of tuples: [(asset_id, account_id, asset_group_id, [{expression_label: value}])] + """ + lines = [] + asset_lines = self._query_values(options, prefix_to_match=prefix_to_match, forced_account_id=forced_account_id) + + # Assign the gross increases sub assets to their main asset (parent) + parent_lines = [] + children_lines = defaultdict(list) + for al in asset_lines: + if al['parent_id']: + children_lines[al['parent_id']] += [al] + else: + parent_lines += [al] + + for al in parent_lines: + + asset_children_lines = children_lines[al['asset_id']] + asset_parent_values = self._get_parent_asset_values(options, al, asset_children_lines) + + # Format the data + columns_by_expr_label = { + "acquisition_date": al["asset_acquisition_date"] and format_date(self.env, al["asset_acquisition_date"]) or "", # Characteristics + "first_depreciation": al["asset_date"] and format_date(self.env, al["asset_date"]) or "", + "method": (al["asset_method"] == "linear" and _("Linear")) or (al["asset_method"] == "degressive" and _("Declining")) or _("Dec. then Straight"), + **asset_parent_values + } + + lines.append((al['account_id'], al['asset_id'], al['asset_group_id'], columns_by_expr_label)) + return lines + + def _get_parent_asset_values(self, options, asset_line, asset_children_lines): + """ Compute the values needed for the depreciation schedule for each parent asset + Overridden in l10n_ro_saft.account_general_ledger""" + + # Compute the depreciation rate string + if asset_line['asset_method'] == 'linear' and asset_line['asset_method_number']: # some assets might have 0 depreciation because they don't lose value + total_months = int(asset_line['asset_method_number']) * int(asset_line['asset_method_period']) + months = total_months % 12 + years = total_months // 12 + asset_depreciation_rate = " ".join(part for part in [ + years and _("%(years)s y", years=years), + months and _("%(months)s m", months=months), + ] if part) + elif asset_line['asset_method'] == 'linear': + asset_depreciation_rate = '0.00 %' + else: + asset_depreciation_rate = ('{:.2f} %').format(float(asset_line['asset_method_progress_factor']) * 100) + + # Manage the opening of the asset + opening = (asset_line['asset_acquisition_date'] or asset_line['asset_date']) < fields.Date.to_date(options['date']['date_from']) + + # Get the main values of the board for the asset + depreciation_opening = asset_line['depreciated_before'] + depreciation_add = asset_line['depreciated_during'] + depreciation_minus = 0.0 + + asset_disposal_value = ( + asset_line['asset_disposal_value'] + if ( + asset_line['asset_disposal_date'] + and asset_line['asset_disposal_date'] <= fields.Date.to_date(options['date']['date_to']) + ) + else 0.0 + ) + + asset_opening = asset_line['asset_original_value'] if opening else 0.0 + asset_add = 0.0 if opening else asset_line['asset_original_value'] + asset_minus = 0.0 + asset_salvage_value = asset_line.get('asset_salvage_value', 0.0) + + # Add the main values of the board for all the sub assets (gross increases) + for child in asset_children_lines: + depreciation_opening += child['depreciated_before'] + depreciation_add += child['depreciated_during'] + + opening = (child['asset_acquisition_date'] or child['asset_date']) < fields.Date.to_date(options['date']['date_from']) + asset_opening += child['asset_original_value'] if opening else 0.0 + asset_add += 0.0 if opening else child['asset_original_value'] + + # Compute the closing values + asset_closing = asset_opening + asset_add - asset_minus + depreciation_closing = depreciation_opening + depreciation_add - depreciation_minus + asset_currency = self.env['res.currency'].browse(asset_line['asset_currency_id']) + + # Manage the closing of the asset + if ( + asset_line['asset_state'] == 'close' + and asset_line['asset_disposal_date'] + and asset_line['asset_disposal_date'] <= fields.Date.to_date(options['date']['date_to']) + and asset_currency.compare_amounts(depreciation_closing, asset_closing - asset_salvage_value) == 0 + ): + depreciation_add -= asset_disposal_value + depreciation_minus += depreciation_closing - asset_disposal_value + depreciation_closing = 0.0 + asset_minus += asset_closing + asset_closing = 0.0 + + # Manage negative assets (credit notes) + if asset_currency.compare_amounts(asset_line['asset_original_value'], 0) < 0: + asset_add, asset_minus = -asset_minus, -asset_add + depreciation_add, depreciation_minus = -depreciation_minus, -depreciation_add + + return { + 'duration_rate': asset_depreciation_rate, + 'asset_disposal_value': asset_disposal_value, + 'assets_date_from': asset_opening, + 'assets_plus': asset_add, + 'assets_minus': asset_minus, + 'assets_date_to': asset_closing, + 'depre_date_from': depreciation_opening, + 'depre_plus': depreciation_add, + 'depre_minus': depreciation_minus, + 'depre_date_to': depreciation_closing, + 'balance': asset_closing - depreciation_closing, + } + + def _group_by_field(self, report, lines, options): + """ + This function adds the grouping lines on top of each group of account.asset + It iterates over the lines, change the line_id of each line to include the account.account.id and the + account.asset.id. + """ + if not lines: + return lines + + line_vals_per_grouping_field_id = {} + parent_model = 'account.account' if options['assets_grouping_field'] == 'account_id' else 'account.asset.group' + for line in lines: + parent_id = line.get('assets_account_id') if options['assets_grouping_field'] == 'account_id' else line.get('assets_asset_group_id') + + model, res_id = report._get_model_info_from_id(line['id']) + + # replace the line['id'] to add the parent id + line['id'] = report._build_line_id([ + (None, parent_model, parent_id), + (None, 'account.asset', res_id) + ]) + + is_parent_in_unfolded_lines = any( + report._get_model_info_from_id(unfolded_line_id) == (parent_model, parent_id) + for unfolded_line_id in options.get('unfolded_lines') + ) + line_vals_per_grouping_field_id.setdefault(parent_id, { + # We don't assign a name to the line yet, so that we can batch the browsing of the parent objects + 'id': report._build_line_id([(None, parent_model, parent_id)]), + 'columns': [], # Filled later + 'unfoldable': True, + 'unfolded': is_parent_in_unfolded_lines or options.get('unfold_all'), + 'level': 1, + + # This value is stored here for convenience; it will be removed from the result + 'group_lines': [], + })['group_lines'].append(line) + + # Generate the result + rslt_lines = [] + idx_monetary_columns = [idx_col for idx_col, col in enumerate(options['columns']) if col['figure_type'] == 'monetary'] + parent_recordset = self.env[parent_model].browse(line_vals_per_grouping_field_id.keys()) + + for parent_field in parent_recordset: + parent_line_vals = line_vals_per_grouping_field_id[parent_field.id] + if options['assets_grouping_field'] == 'account_id': + parent_line_vals['name'] = f"{parent_field.code} {parent_field.name}" + else: + parent_line_vals['name'] = parent_field.name or _('(No %s)', parent_field._description) + + rslt_lines.append(parent_line_vals) + + group_totals = {column_index: 0 for column_index in idx_monetary_columns} + group_lines = report._regroup_lines_by_name_prefix( + options, + parent_line_vals.pop('group_lines'), + '_report_expand_unfoldable_line_assets_report_prefix_group', + parent_line_vals['level'], + parent_line_dict_id=parent_line_vals['id'], + ) + + for parent_subline in group_lines: + # Add this line to the group totals + for column_index in idx_monetary_columns: + group_totals[column_index] += parent_subline['columns'][column_index].get('no_format', 0) + + # Setup the parent and add the line to the result + parent_subline['parent_id'] = parent_line_vals['id'] + rslt_lines.append(parent_subline) + + # Add totals (columns) to the parent line + for column_index in range(len(options['columns'])): + parent_line_vals['columns'].append(report._build_column_dict( + group_totals.get(column_index, ''), + options['columns'][column_index], + options=options, + )) + + return rslt_lines + + def _query_values(self, options, prefix_to_match=None, forced_account_id=None): + "Get the data from the database" + + self.env['account.move.line'].check_access('read') + self.env['account.asset'].check_access('read') + + query = Query(self.env, alias='asset', table=SQL.identifier('account_asset')) + account_alias = query.join(lhs_alias='asset', lhs_column='account_asset_id', rhs_table='account_account', rhs_column='id', link='account_asset_id') + query.add_join('LEFT JOIN', alias='move', table='account_move', condition=SQL(f""" + move.asset_id = asset.id AND move.state {"!= 'cancel'" if options.get('all_entries') else "= 'posted'"} + """)) + + account_code = self.env['account.account']._field_to_sql(account_alias, 'code', query) + account_name = self.env['account.account']._field_to_sql(account_alias, 'name') + account_id = SQL.identifier(account_alias, 'id') + + if prefix_to_match: + query.add_where(SQL("asset.name ILIKE %s", f"{prefix_to_match}%")) + if forced_account_id: + query.add_where(SQL("%s = %s", account_id, forced_account_id)) + + analytic_account_ids = [] + if options.get('analytic_accounts') and not any(x in options.get('analytic_accounts_list', []) for x in options['analytic_accounts']): + analytic_account_ids += [[str(account_id) for account_id in options['analytic_accounts']]] + if options.get('analytic_accounts_list'): + analytic_account_ids += [[str(account_id) for account_id in options.get('analytic_accounts_list')]] + if analytic_account_ids: + query.add_where(SQL('%s && %s', analytic_account_ids, self.env['account.asset']._query_analytic_accounts('asset'))) + + selected_journals = tuple(journal['id'] for journal in options.get('journals', []) if journal['model'] == 'account.journal' and journal['selected']) + if selected_journals: + query.add_where(SQL("asset.journal_id in %s", selected_journals)) + + sql = SQL( + """ + SELECT asset.id AS asset_id, + asset.parent_id AS parent_id, + asset.name AS asset_name, + asset.asset_group_id AS asset_group_id, + asset.original_value AS asset_original_value, + asset.currency_id AS asset_currency_id, + COALESCE(asset.salvage_value, 0) as asset_salvage_value, + MIN(move.date) AS asset_date, + asset.disposal_date AS asset_disposal_date, + asset.acquisition_date AS asset_acquisition_date, + asset.method AS asset_method, + asset.method_number AS asset_method_number, + asset.method_period AS asset_method_period, + asset.method_progress_factor AS asset_method_progress_factor, + asset.state AS asset_state, + asset.company_id AS company_id, + %(account_code)s AS account_code, + %(account_name)s AS account_name, + %(account_id)s AS account_id, + COALESCE(SUM(move.depreciation_value) FILTER (WHERE move.date < %(date_from)s), 0) + COALESCE(asset.already_depreciated_amount_import, 0) AS depreciated_before, + COALESCE(SUM(move.depreciation_value) FILTER (WHERE move.date BETWEEN %(date_from)s AND %(date_to)s), 0) AS depreciated_during, + COALESCE(SUM(move.depreciation_value) FILTER (WHERE move.date BETWEEN %(date_from)s AND %(date_to)s AND move.asset_number_days IS NULL), 0) AS asset_disposal_value + FROM %(from_clause)s + WHERE %(where_clause)s + AND asset.company_id in %(company_ids)s + AND (asset.acquisition_date <= %(date_to)s OR move.date <= %(date_to)s) + AND (asset.disposal_date >= %(date_from)s OR asset.disposal_date IS NULL) + AND (asset.state not in ('model', 'draft', 'cancelled') OR (asset.state = 'draft' AND %(include_draft)s)) + AND asset.active = 't' + GROUP BY asset.id, account_id, account_code, account_name + ORDER BY account_code, asset.acquisition_date, asset.id; + """, + account_code=account_code, + account_name=account_name, + account_id=account_id, + date_from=options['date']['date_from'], + date_to=options['date']['date_to'], + from_clause=query.from_clause, + where_clause=query.where_clause or SQL('TRUE'), + company_ids=tuple(self.env['account.report'].get_report_company_ids(options)), + include_draft=options.get('all_entries', False), + ) + + self._cr.execute(sql) + results = self._cr.dictfetchall() + return results + + def _report_expand_unfoldable_line_assets_report_prefix_group(self, line_dict_id, groupby, options, progress, offset, unfold_all_batch_data=None): + matched_prefix = self.env['account.report']._get_prefix_groups_matched_prefix_from_line_id(line_dict_id) + report = self.env['account.report'].browse(options['report_id']) + + lines, _totals_by_column_group = self._generate_report_lines_without_grouping( + report, + options, + prefix_to_match=matched_prefix, + parent_id=line_dict_id, + forced_account_id=self.env['account.report']._get_res_id_from_line_id(line_dict_id, 'account.account'), + ) + + lines = report._regroup_lines_by_name_prefix( + options, + lines, + '_report_expand_unfoldable_line_assets_report_prefix_group', + len(matched_prefix), + matched_prefix=matched_prefix, + parent_line_dict_id=line_dict_id, + ) + + return { + 'lines': lines, + 'offset_increment': len(lines), + 'has_more': False, + } + + +class AssetsReport(models.Model): + _inherit = 'account.report' + + def _get_caret_option_view_map(self): + view_map = super()._get_caret_option_view_map() + view_map['account.asset.line'] = 'odex30_account_asset.view_account_asset_expense_form' + return view_map diff --git a/dev_odex30_accounting/odex30_account_asset/models/account_move.py b/dev_odex30_accounting/odex30_account_asset/models/account_move.py new file mode 100644 index 0000000..78f5f44 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/models/account_move.py @@ -0,0 +1,397 @@ +# -*- coding: utf-8 -*- + +from odoo import api, fields, models, Command +from odoo.exceptions import UserError, ValidationError +from odoo.tools import float_compare, _, SQL +from odoo.tools.misc import formatLang +from dateutil.relativedelta import relativedelta + + +class AccountMove(models.Model): + _inherit = 'account.move' + + asset_id = fields.Many2one('account.asset', string='Asset', index=True, ondelete='cascade', copy=False, domain="[('company_id', '=', company_id)]") + asset_remaining_value = fields.Monetary(string='Depreciable Value', compute='_compute_depreciation_cumulative_value' ,store=True) + asset_depreciated_value = fields.Monetary(string='Cumulative Depreciation', compute='_compute_depreciation_cumulative_value',store=True) + # true when this move is the result of the changing of value of an asset + asset_value_change = fields.Boolean() + # how many days of depreciation this entry corresponds to + asset_number_days = fields.Integer(string="Number of days", copy=False) # deprecated + asset_depreciation_beginning_date = fields.Date(string="Date of the beginning of the depreciation", copy=False) # technical field stating when the depreciation associated with this entry has begun + depreciation_value = fields.Monetary( + string="Depreciation", + compute="_compute_depreciation_value", inverse="_inverse_depreciation_value", store=True, + ) + + asset_ids = fields.One2many('account.asset', string='Assets', compute="_compute_asset_ids") + asset_id_display_name = fields.Char(compute="_compute_asset_ids") # just a button label. That's to avoid a plethora of different buttons defined in xml + count_asset = fields.Integer(compute="_compute_asset_ids") + draft_asset_exists = fields.Boolean(compute="_compute_asset_ids") + asset_move_type = fields.Selection( + selection=[ + ('depreciation', 'Depreciation'), + ('sale', 'Sale'), + ('purchase', 'Purchase'), + ('disposal', 'Disposal'), + ('negative_revaluation', 'Negative revaluation'), + ('positive_revaluation', 'Positive revaluation'), + ], + string='Asset Move Type', + compute='_compute_asset_move_type', store=True, + copy=False, + ) + + # ------------------------------------------------------------------------- + # COMPUTE METHODS + # ------------------------------------------------------------------------- + @api.depends('asset_id', 'depreciation_value', 'asset_id.total_depreciable_value', 'asset_id.already_depreciated_amount_import', 'state') + def _compute_depreciation_cumulative_value(self): + self.asset_depreciated_value = 0 + self.asset_remaining_value = 0 + + # make sure to protect all the records being assigned, because the + # assignments invoke method write() on non-protected records, which may + # cause an infinite recursion in case method write() needs to read one + # of these fields (like in case of a base automation) + fields = [self._fields['asset_remaining_value'], self._fields['asset_depreciated_value']] + with self.env.protecting(fields, self.asset_id.depreciation_move_ids): + for asset in self.asset_id: + depreciated = asset.already_depreciated_amount_import + remaining = asset.total_depreciable_value - asset.already_depreciated_amount_import + for move in asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv._origin.id)): + if move.state != 'cancel': + remaining -= move.depreciation_value + depreciated += move.depreciation_value + move.asset_remaining_value = remaining + move.asset_depreciated_value = depreciated + + @api.depends('line_ids.balance') + def _compute_depreciation_value(self): + for move in self: + asset = move.asset_id or move.reversed_entry_id.asset_id # reversed moves are created before being assigned to the asset + if asset: + depreciation_lines = move._get_asset_depreciation_line() + asset_depreciation = sum(depreciation_lines.mapped('balance')) + # Special case of closing entry - only disposed assets of type 'purchase' should match this condition + # The condition on len(move.line_ids) is to avoid the case where there is only one depreciation move, and it is not a disposal move + # The condition will be matched because a disposal move from a disposal move will always have more than 2 lines, unlike a normal depreciation move + if any( + line.account_id == asset.account_asset_id + and float_compare(-line.balance, asset.original_value, precision_rounding=asset.currency_id.rounding) == 0 + for line in move.line_ids + ) and len(move.line_ids) > 2: + asset_depreciation = ( + asset.original_value + - asset.salvage_value + - ( + move.line_ids[1].debit if asset.original_value > 0 else move.line_ids[1].credit + ) * (-1 if asset.original_value < 0 else 1) + ) + else: + asset_depreciation = 0 + move.depreciation_value = asset_depreciation + + @api.depends('asset_id', 'asset_ids') + def _compute_asset_move_type(self): + for move in self: + if move.asset_ids: + move.asset_move_type = 'positive_revaluation' if move.asset_ids.parent_id else 'purchase' + elif not move.asset_move_type or not move.asset_id: + move.asset_move_type = False + + # ------------------------------------------------------------------------- + # INVERSE METHODS + # ------------------------------------------------------------------------- + def _inverse_depreciation_value(self): + for move in self: + depreciation_lines = set(move._get_asset_depreciation_line()) + move.write({'line_ids': [ + Command.update(line.id, { + 'balance': move.depreciation_value * (1 if line in depreciation_lines else -1), + }) + for line in move.line_ids + ]}) + + # ------------------------------------------------------------------------- + # CONSTRAINT METHODS + # ------------------------------------------------------------------------- + @api.constrains('state', 'asset_id') + def _constrains_check_asset_state(self): + for move in self.filtered(lambda mv: mv.asset_id): + asset_id = move.asset_id + if asset_id.state == 'draft' and move.state == 'posted': + raise ValidationError(_("You can't post an entry related to a draft asset. Please post the asset before.")) + + def _post(self, soft=True): + # OVERRIDE + posted = super()._post(soft) + + # log the post of a depreciation + posted._log_depreciation_asset() + + # look for any asset to create, in case we just posted a bill on an account + # configured to automatically create assets + posted.sudo()._auto_create_asset() + + return posted + + def _reverse_moves(self, default_values_list=None, cancel=False): + if default_values_list is None: + default_values_list = [{} for _i in self] + for move, default_values in zip(self, default_values_list): + # Report the value of this move to the next draft move or create a new one + if move.asset_id: + # Recompute the status of the asset for all depreciations posted after the reversed entry + + first_draft = min(move.asset_id.depreciation_move_ids.filtered(lambda m: m.state == 'draft'), key=lambda m: m.date, default=None) + if first_draft: + # If there is a draft, simply move/add the depreciation amount here + first_draft.depreciation_value += move.depreciation_value + elif move.asset_id.state != 'close': + # If there was no draft move left, create one. + # Unless the asset is being closed, then the closing move + # takes care of balancing the asset. + last_date = max(move.asset_id.depreciation_move_ids.mapped('date')) + method_period = move.asset_id.method_period + + self.create(self._prepare_move_for_asset_depreciation({ + 'asset_id': move.asset_id, + 'amount': move.depreciation_value, + 'depreciation_beginning_date': last_date + (relativedelta(months=1) if method_period == "1" else relativedelta(years=1)), + 'date': last_date + (relativedelta(months=1) if method_period == "1" else relativedelta(years=1)), + 'asset_number_days': 0 + })) + + msg = _('Depreciation entry %(name)s reversed (%(value)s)', name=move.name, value=formatLang(self.env, move.depreciation_value, currency_obj=move.company_id.currency_id)) + move.asset_id.message_post(body=msg) + default_values['asset_id'] = move.asset_id.id + default_values['asset_number_days'] = -move.asset_number_days + default_values['asset_depreciation_beginning_date'] = default_values.get('date', move.date) + + return super(AccountMove, self)._reverse_moves(default_values_list, cancel) + + def button_cancel(self): + # OVERRIDE + res = super(AccountMove, self).button_cancel() + self.env['account.asset'].sudo().search([('original_move_line_ids.move_id', 'in', self.ids)]).write({'active': False}) + return res + + def button_draft(self): + for move in self: + if any(asset_id.state != 'draft' for asset_id in move.asset_ids): + raise UserError(_('You cannot reset to draft an entry related to a posted asset')) + # Remove any draft asset that could be linked to the account move being reset to draft + move.asset_ids.filtered(lambda x: x.state == 'draft').unlink() + return super(AccountMove, self).button_draft() + + def _log_depreciation_asset(self): + for move in self.filtered(lambda m: m.asset_id): + asset = move.asset_id + msg = _('Depreciation entry %(name)s posted (%(value)s)', name=move.name, value=formatLang(self.env, move.depreciation_value, currency_obj=move.company_id.currency_id)) + asset.message_post(body=msg) + + def _auto_create_asset(self): + create_list = [] + invoice_list = [] + auto_validate = [] + for move in self: + if not move.is_invoice(): + continue + + for move_line in move.line_ids: + if ( + move_line.account_id + and (move_line.account_id.can_create_asset) + and move_line.account_id.create_asset != "no" + and not (move_line.currency_id or move.currency_id).is_zero(move_line.price_total) + and not move_line.asset_ids + and not move_line.tax_line_id + and move_line.price_total > 0 + and not (move.move_type in ('out_invoice', 'out_refund') and move_line.account_id.internal_group == 'asset') + ): + if not move_line.name: + if move_line.product_id: + move_line.name = move_line.product_id.display_name + else: + raise UserError(_('Journal Items of %(account)s should have a label in order to generate an asset', account=move_line.account_id.display_name)) + if move_line.account_id.multiple_assets_per_line: + # decimal quantities are not supported, quantities are rounded to the lower int + units_quantity = max(1, int(move_line.quantity)) + else: + units_quantity = 1 + + model_ids = move_line.account_id.asset_model_ids.filtered(lambda model: model.company_id in move_line.company_id.parent_ids) + vals = { + 'name': move_line.name, + 'company_id': move_line.company_id.id, + 'currency_id': move_line.company_currency_id.id, + 'analytic_distribution': move_line.analytic_distribution, + 'original_move_line_ids': [(6, False, move_line.ids)], + 'state': 'draft', + 'acquisition_date': move.invoice_date if not move.reversed_entry_id else move.reversed_entry_id.invoice_date, + } + for model_id in model_ids or [None]: + if model_id: + vals['model_id'] = model_id.id + + auto_validate.extend([move_line.account_id.create_asset == 'validate'] * units_quantity) + invoice_list.extend([move] * units_quantity) + for i in range(1, units_quantity + 1): + if units_quantity > 1: + vals['name'] = _("%(move_line)s (%(current)s of %(total)s)", move_line=move_line.name, current=i, total=units_quantity) + create_list.extend([vals.copy()]) + + assets = self.env['account.asset'].with_context({}).create(create_list) + for asset, vals, invoice, validate in zip(assets, create_list, invoice_list, auto_validate): + if 'model_id' in vals: + asset._onchange_model_id() + if validate: + asset.validate() + if invoice: + asset.message_post(body=_('Asset created from invoice: %s', invoice._get_html_link())) + asset._post_non_deductible_tax_value() + return assets + + @api.model + def _prepare_move_for_asset_depreciation(self, vals): + missing_fields = {'asset_id', 'amount', 'depreciation_beginning_date', 'date', 'asset_number_days'} - set(vals) + if missing_fields: + raise UserError(_('Some fields are missing %s', ', '.join(missing_fields))) + asset = vals['asset_id'] + analytic_distribution = asset.analytic_distribution + depreciation_date = vals.get('date', fields.Date.context_today(self)) + company_currency = asset.company_id.currency_id + current_currency = asset.currency_id + prec = company_currency.decimal_places + amount_currency = vals['amount'] + amount = current_currency._convert(amount_currency, company_currency, asset.company_id, depreciation_date) + # Keep the partner on the original invoice if there is only one + partner = asset.original_move_line_ids.mapped('partner_id') + partner = partner[:1] if len(partner) <= 1 else self.env['res.partner'] + name = _("%s: Depreciation", asset.name) + move_line_1 = { + 'name': name, + 'partner_id': partner.id, + 'account_id': asset.account_depreciation_id.id, + 'debit': 0.0 if float_compare(amount, 0.0, precision_digits=prec) > 0 else -amount, + 'credit': amount if float_compare(amount, 0.0, precision_digits=prec) > 0 else 0.0, + 'currency_id': current_currency.id, + 'amount_currency': -amount_currency, + } + move_line_2 = { + 'name': name, + 'partner_id': partner.id, + 'account_id': asset.account_depreciation_expense_id.id, + 'credit': 0.0 if float_compare(amount, 0.0, precision_digits=prec) > 0 else -amount, + 'debit': amount if float_compare(amount, 0.0, precision_digits=prec) > 0 else 0.0, + 'currency_id': current_currency.id, + 'amount_currency': amount_currency, + } + # Only set the 'analytic_distribution' key if there is an analytic distribution on the asset. + # Otherwise, it prevents the computation of the analytic distribution. + if analytic_distribution: + move_line_1['analytic_distribution'] = analytic_distribution + move_line_2['analytic_distribution'] = analytic_distribution + move_vals = { + 'partner_id': partner.id, + 'date': depreciation_date, + 'journal_id': asset.journal_id.id, + 'line_ids': [(0, 0, move_line_1), (0, 0, move_line_2)], + 'asset_id': asset.id, + 'ref': name, + 'asset_depreciation_beginning_date': vals['depreciation_beginning_date'], + 'asset_number_days': vals['asset_number_days'], + 'asset_value_change': vals.get('asset_value_change', False), + 'move_type': 'entry', + 'currency_id': current_currency.id, + 'asset_move_type': vals.get('asset_move_type', 'depreciation'), + 'company_id': asset.company_id.id, + } + return move_vals + + def _get_asset_depreciation_line(self): + asset = self.asset_id + return self.line_ids.filtered(lambda line: line.account_id.internal_group == 'expense' or line.account_id == asset.account_depreciation_expense_id) + + @api.depends('line_ids.asset_ids') + def _compute_asset_ids(self): + for record in self: + record.asset_ids = record.line_ids.asset_ids + record.count_asset = len(record.asset_ids) + record.asset_id_display_name = _('Asset') + record.draft_asset_exists = bool(record.asset_ids.filtered(lambda x: x.state == "draft")) + + def open_asset_view(self): + return self.asset_id.open_asset(['form']) + + def action_open_asset_ids(self): + return self.asset_ids.open_asset(['list', 'form']) + + +class AccountMoveLine(models.Model): + _inherit = 'account.move.line' + + asset_ids = fields.Many2many('account.asset', 'asset_move_line_rel', 'line_id', 'asset_id', string='Related Assets', copy=False) + non_deductible_tax_value = fields.Monetary(compute='_compute_non_deductible_tax_value', currency_field='company_currency_id') + + def _get_computed_taxes(self): + if self.move_id.asset_id: + return self.tax_ids + return super()._get_computed_taxes() + + def turn_as_asset(self): + if len(self.company_id) != 1: + raise UserError(_("All the lines should be from the same company")) + if any(line.move_id.state == 'draft' for line in self): + raise UserError(_("All the lines should be posted")) + if any(account != self[0].account_id for account in self.mapped('account_id')): + raise UserError(_("All the lines should be from the same account")) + ctx = self.env.context.copy() + ctx.update({ + 'default_original_move_line_ids': [(6, False, self.env.context['active_ids'])], + 'default_company_id': self.company_id.id, + }) + return { + "name": _("Turn as an asset"), + "type": "ir.actions.act_window", + "res_model": "account.asset", + "views": [[False, "form"]], + "target": "current", + "context": ctx, + } + + @api.depends('tax_ids.invoice_repartition_line_ids') + def _compute_non_deductible_tax_value(self): + """ Handle the specific case of non deductible taxes, + such as "50% Non Déductible - Frais de voiture (Prix Excl.)" in Belgium. + """ + non_deductible_tax_ids = self.tax_ids.invoice_repartition_line_ids.filtered( + lambda line: line.repartition_type == 'tax' and not line.use_in_tax_closing + ).tax_id + + res = {} + if non_deductible_tax_ids: + domain = [('move_id', 'in', self.move_id.ids)] + tax_details_query = self._get_query_tax_details_from_domain(domain) + + self.flush_model() + self._cr.execute(SQL( + ''' + SELECT + tdq.base_line_id, + SUM(tdq.tax_amount_currency) + FROM (%(tax_details_query)s) AS tdq + JOIN account_move_line aml ON aml.id = tdq.tax_line_id + JOIN account_tax_repartition_line trl ON trl.id = tdq.tax_repartition_line_id + WHERE tdq.base_line_id IN %(base_line_ids)s + AND trl.use_in_tax_closing IS FALSE + GROUP BY tdq.base_line_id + ''', + tax_details_query=tax_details_query, + base_line_ids=tuple(self.ids), + )) + + res = {row['base_line_id']: row['sum'] for row in self._cr.dictfetchall()} + + for record in self: + record.non_deductible_tax_value = res.get(record._origin.id, 0.0) diff --git a/dev_odex30_accounting/odex30_account_asset/models/res_company.py b/dev_odex30_accounting/odex30_account_asset/models/res_company.py new file mode 100644 index 0000000..53c3bff --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/models/res_company.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +from odoo import api, fields, models, _ + +class ResCompany(models.Model): + _inherit = "res.company" + + gain_account_id = fields.Many2one( + 'account.account', + domain="[('deprecated', '=', False)]", + check_company=True, + help="Account used to write the journal item in case of gain while selling an asset", + ) + loss_account_id = fields.Many2one( + 'account.account', + domain="[('deprecated', '=', False)]", + check_company=True, + help="Account used to write the journal item in case of loss while selling an asset", + ) diff --git a/dev_odex30_accounting/odex30_account_asset/security/account_asset_security.xml b/dev_odex30_accounting/odex30_account_asset/security/account_asset_security.xml new file mode 100644 index 0000000..2e736fa --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/security/account_asset_security.xml @@ -0,0 +1,18 @@ + + + + + Account Asset multi-company + + + [('company_id', 'parent_of', company_ids)] + + + + Account Asset Group multi-company + + + [('company_id', 'parent_of', company_ids)] + + + diff --git a/dev_odex30_accounting/odex30_account_asset/security/ir.model.access.csv b/dev_odex30_accounting/odex30_account_asset/security/ir.model.access.csv new file mode 100644 index 0000000..0c6f796 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/security/ir.model.access.csv @@ -0,0 +1,7 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_asset,account.asset,model_account_asset,account.group_account_readonly,1,0,0,0 +access_account_asset_manager,account.asset,model_account_asset,account.group_account_user,1,1,1,1 +access_account_asset_invoicing_payment,account.asset,model_account_asset,account.group_account_invoice,1,0,1,0 +access_asset_modify,access.asset.modify,model_asset_modify,account.group_account_user,1,1,1,0 +access_account_asset_group,account.asset.group,model_account_asset_group,account.group_account_readonly,1,0,0,0 +access_account_asset_group_manager,account.asset.group,model_account_asset_group,account.group_account_manager,1,1,1,1 diff --git a/dev_odex30_accounting/odex30_account_asset/static/description/icon.png b/dev_odex30_accounting/odex30_account_asset/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..575fa15ced7c782954b8f2b1cf42404557f1c29b GIT binary patch literal 896 zcmeAS@N?(olHy`uVBq!ia0vp^DImMRj(m)lO{P48GAb&TVY%90Omhnlt5Z-3A6vRCNH z*&DJc0h7M4aaahXG}UFAPZVL~cPiUuyQH_Fdx=T{tK$qufi!^@NtQ%5IP>9=7bZ;~ zHYze3wEfIUWhK z6&ilhj}I)}>mabcAh_I^*|1_lUh_etqwRNQ%~5*b9Cm#}NTE{mR~tt8ilygzM4F0N z3TLjAoe(wK#8Ib5u)3LJ;c?DK2~!riZ*Bfm{4DO8#OE0cX1-B1_wTy7d*?0Ths)N5 zq~5S&+uwIV=3U*K%%y%j@5_yNg3j=XHZQpJxp>(Fwt2@m)7=DAs=99;d{oDOqc}Mx z`upZ3&u6wf&G4(1y3ZZY{%+=)Yg5FWmfjTu<_H9Ezrp_`lvm99aqcFNpr@;!%Q~lo FCII(5cX \ No newline at end of file diff --git a/dev_odex30_accounting/odex30_account_asset/static/src/components/depreciation_schedule/depreciation_schedule.scss b/dev_odex30_accounting/odex30_account_asset/static/src/components/depreciation_schedule/depreciation_schedule.scss new file mode 100644 index 0000000..a1c16d1 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/static/src/components/depreciation_schedule/depreciation_schedule.scss @@ -0,0 +1,37 @@ +.account_report.depreciation_schedule { + table.striped { + > thead > tr:not(:first-child) { + > th:nth-child(2n+3) { background: inherit } + > th[data-expression_label='assets_date_from'], + > th[data-expression_label='assets_plus'], + > th[data-expression_label='assets_minus'], + > th[data-expression_label='assets_date_to'], + > th[data-expression_label='balance'] { + background: $o-gray-100 + } + } + > tbody { + > tr:not(.line_level_0):not(.empty) { + > td:nth-child(2n+3) { background: inherit } + > td[data-expression_label='assets_date_from'], + > td[data-expression_label='assets_plus'], + > td[data-expression_label='assets_minus'], + > td[data-expression_label='assets_date_to'], + > td[data-expression_label='balance'] { + background: $o-gray-100 + } + } + > tr.line_level_0 + { + > td:nth-child(2n+3) { background: inherit } + > td[data-expression_label='assets_date_from'], + > td[data-expression_label='assets_plus'], + > td[data-expression_label='assets_minus'], + > td[data-expression_label='assets_date_to'], + > td[data-expression_label='balance'] { + background: $o-gray-300 + } + } + } + } +} diff --git a/dev_odex30_accounting/odex30_account_asset/static/src/components/depreciation_schedule/filters.xml b/dev_odex30_accounting/odex30_account_asset/static/src/components/depreciation_schedule/filters.xml new file mode 100644 index 0000000..9c3f76b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/static/src/components/depreciation_schedule/filters.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_asset/static/src/components/depreciation_schedule/groupby.xml b/dev_odex30_accounting/odex30_account_asset/static/src/components/depreciation_schedule/groupby.xml new file mode 100644 index 0000000..7460c98 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/static/src/components/depreciation_schedule/groupby.xml @@ -0,0 +1,42 @@ + + + + + + + + + Group By Account + + + + Group By Asset Group + + + + No Grouping + + + + + diff --git a/dev_odex30_accounting/odex30_account_asset/static/src/components/move_reversed/move_reversed.js b/dev_odex30_accounting/odex30_account_asset/static/src/components/move_reversed/move_reversed.js new file mode 100644 index 0000000..6fdd866 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/static/src/components/move_reversed/move_reversed.js @@ -0,0 +1,16 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { Component } from "@odoo/owl"; +import { standardFieldProps } from "@web/views/fields/standard_field_props"; + +export class MoveReversed extends Component { + static template = "odex30_account_asset.moveReversed"; + static props = {...standardFieldProps}; +} + +export const moveReversed = { + component: MoveReversed, +}; + +registry.category("fields").add("deprec_lines_reversed", moveReversed); diff --git a/dev_odex30_accounting/odex30_account_asset/static/src/components/move_reversed/move_reversed.xml b/dev_odex30_accounting/odex30_account_asset/static/src/components/move_reversed/move_reversed.xml new file mode 100644 index 0000000..3d5e1c9 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/static/src/components/move_reversed/move_reversed.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/dev_odex30_accounting/odex30_account_asset/static/src/scss/account_asset.dark.scss b/dev_odex30_accounting/odex30_account_asset/static/src/scss/account_asset.dark.scss new file mode 100644 index 0000000..4fc1b1b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/static/src/scss/account_asset.dark.scss @@ -0,0 +1,8 @@ +// = ACCOUNT ASSET +// ============================================================================ +// No CSS hacks, variables overrides only + +.o_account_reports_page.o_account_assets_report { + --DepreciationSchedule-background-color: #{$o-gray-300}; + --DepreciationSchedule-border-color: #{$o-gray-600}; +} diff --git a/dev_odex30_accounting/odex30_account_asset/static/src/scss/account_asset.scss b/dev_odex30_accounting/odex30_account_asset/static/src/scss/account_asset.scss new file mode 100644 index 0000000..bee20cd --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/static/src/scss/account_asset.scss @@ -0,0 +1,77 @@ +.o_account_reports_page.o_account_assets_report .o_account_reports_table { + + .o_account_reports_header_hierarchy { + + white-space: nowrap; + + .o_account_asset_report_top_header_row th:not(:first-child) { + border: 1px solid var(--DepreciationSchedule-border-color, #{$o-gray-200}); + padding-top: 8px; + padding-bottom: 8px; + } + + .o_account_report_column_header{ + padding-top: 8px; + padding-bottom: 8px; + } + + & > tr:first-child th{ + text-align: right !important; + } + } + + .o_account_reports_header_hierarchy tr:nth-child(3) th:nth-child(2n+6), + .o_account_asset_column_contrast{ + background-color: var(--DepreciationSchedule-background-color, #{$o-gray-100}); + background-clip: padding-box; + } + + .o_account_asset_contrast_inner{ + font-weight: normal; + } + + .o_asset_blank_if_zero_value{ + opacity: 0.3; + } +} + +.o_account_asset_kanban_title { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.o_account_reports_body_print .o_account_assets_report{ + + .o_account_asset_contrast_inner{ + font-weight: normal; + } + + td.o_foldable_total { + font-weight: bold; + } + + .o_account_reports_header_hierarchy { + white-space: nowrap; + .o_account_asset_report_top_header_row th:not(:first-child) { + border: 1px solid lightgrey; + padding-top: 8px; + padding-bottom: 8px; + + font-weight: bold; + font-size: 0.8rem; + } + + tr:nth-child(3) { + th:nth-child(2), th:nth-child(3), th:nth-child(4), th:nth-child(5) { + table > tbody > tr > td{ + text-align: center !important; + } + } + th > table > tbody > tr > td { + font-weight: normal; + font-size: 0.8rem; + } + } + } +} diff --git a/dev_odex30_accounting/odex30_account_asset/static/src/views/fields/properties/properties_field.js b/dev_odex30_accounting/odex30_account_asset/static/src/views/fields/properties/properties_field.js new file mode 100644 index 0000000..6fe1814 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/static/src/views/fields/properties/properties_field.js @@ -0,0 +1,21 @@ +/** @odoo-module **/ + +import { PropertiesField } from "@web/views/fields/properties/properties_field"; +import { patch } from "@web/core/utils/patch"; +import { _t } from "@web/core/l10n/translation"; + +patch(PropertiesField.prototype, { + async onPropertyCreate() { + if ( + this.props.record.resModel === 'account.asset' + && (!this.state.canChangeDefinition || !(await this.checkDefinitionWriteAccess())) + ) { + this.notification.add( + _t("You can add Property fields only on Assets with an Asset Model set."), + { type: "warning" } + ); + return; + } + super.onPropertyCreate(); + } +}); diff --git a/dev_odex30_accounting/odex30_account_asset/static/src/web/form_controller_patch.js b/dev_odex30_accounting/odex30_account_asset/static/src/web/form_controller_patch.js new file mode 100644 index 0000000..1ff60fd --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/static/src/web/form_controller_patch.js @@ -0,0 +1,15 @@ +/** @odoo-module */ + +import { FormController } from "@web/views/form/form_controller"; +import { patch } from "@web/core/utils/patch"; + +patch(FormController.prototype, { + getStaticActionMenuItems() { + const menuItems = super.getStaticActionMenuItems(); + if (this.props.resModel === 'account.asset' && this.model.root.data.state === 'model') { + menuItems.addPropertyFieldValue.isAvailable = () => false; + } + return menuItems; + }, +}); + diff --git a/dev_odex30_accounting/odex30_account_asset/tests/__init__.py b/dev_odex30_accounting/odex30_account_asset/tests/__init__.py new file mode 100644 index 0000000..c889a0c --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/tests/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import common +from . import test_account_asset +from . import test_board_compute +from . import test_reevaluation_asset diff --git a/dev_odex30_accounting/odex30_account_asset/tests/common.py b/dev_odex30_accounting/odex30_account_asset/tests/common.py new file mode 100644 index 0000000..d750f00 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/tests/common.py @@ -0,0 +1,36 @@ +from odoo import fields +from odoo.addons.account.tests.common import AccountTestInvoicingCommon + + +class TestAccountAssetCommon(AccountTestInvoicingCommon): + + @classmethod + def create_asset(cls, value, periodicity, periods, degressive_factor=None, import_depreciation=0, **kwargs): + if degressive_factor is not None: + kwargs["method_progress_factor"] = degressive_factor + return cls.env['account.asset'].create({ + 'name': 'nice asset', + 'account_asset_id': cls.company_data['default_account_assets'].id, + 'account_depreciation_id': cls.company_data['default_account_assets'].copy().id, + 'account_depreciation_expense_id': cls.company_data['default_account_expense'].id, + 'journal_id': cls.company_data['default_journal_misc'].id, + 'acquisition_date': "2020-02-01", + 'prorata_computation_type': 'none', + 'original_value': value, + 'salvage_value': 0, + 'method_number': periods, + 'method_period': '12' if periodicity == "yearly" else '1', + 'method': "linear", + 'already_depreciated_amount_import': import_depreciation, + **kwargs, + }) + + @classmethod + def _get_depreciation_move_values(cls, date, depreciation_value, remaining_value, depreciated_value, state): + return { + 'date': fields.Date.from_string(date), + 'depreciation_value': depreciation_value, + 'asset_remaining_value': remaining_value, + 'asset_depreciated_value': depreciated_value, + 'state': state, + } diff --git a/dev_odex30_accounting/odex30_account_asset/tests/test_account_asset.py b/dev_odex30_accounting/odex30_account_asset/tests/test_account_asset.py new file mode 100644 index 0000000..418bb2e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/tests/test_account_asset.py @@ -0,0 +1,3172 @@ +# -*- coding: utf-8 -*- + +import time + +from dateutil.relativedelta import relativedelta +from odoo import fields, Command +from odoo.exceptions import UserError, MissingError +from odoo.tests import Form, tagged, freeze_time +from odoo.addons.account_reports.tests.common import TestAccountReportsCommon + + +@freeze_time('2021-07-01') +@tagged('post_install', '-at_install') +class TestAccountAsset(TestAccountReportsCommon): + + @classmethod + def setUpClass(cls): + super(TestAccountAsset, cls).setUpClass() + today = fields.Date.today() + cls.truck = cls.env['account.asset'].create({ + 'account_asset_id': cls.company_data['default_account_assets'].id, + 'account_depreciation_id': cls.company_data['default_account_assets'].copy().id, + 'account_depreciation_expense_id': cls.company_data['default_account_expense'].id, + 'journal_id': cls.company_data['default_journal_misc'].id, + 'name': 'truck', + 'acquisition_date': today + relativedelta(years=-6, months=-6), + 'original_value': 10000, + 'salvage_value': 2500, + 'method_number': 10, + 'method_period': '12', + 'method': 'linear', + }) + cls.truck.validate() + cls.env['account.move']._autopost_draft_entries() + + cls.account_asset_model_fixedassets = cls.env['account.asset'].create({ + 'account_depreciation_id': cls.company_data['default_account_assets'].copy().id, + 'account_depreciation_expense_id': cls.company_data['default_account_expense'].id, + 'account_asset_id': cls.company_data['default_account_assets'].id, + 'journal_id': cls.company_data['default_journal_purchase'].id, + 'name': 'Hardware - 3 Years', + 'method_number': 3, + 'method_period': '12', + 'state': 'model', + }) + + + cls.closing_invoice = cls.env['account.move'].create({ + 'move_type': 'out_invoice', + 'invoice_line_ids': [(0, 0, {'price_unit': 100})] + }) + + cls.env.company.loss_account_id = cls.company_data['default_account_expense'].copy() + cls.env.company.gain_account_id = cls.company_data['default_account_revenue'].copy() + cls.assert_counterpart_account_id = cls.company_data['default_account_expense'].copy().id + + cls.env.user.groups_id += cls.env.ref('analytic.group_analytic_accounting') + analytic_plan = cls.env['account.analytic.plan'].create({ + 'name': "Default Plan", + }) + cls.analytic_account = cls.env['account.analytic.account'].create({ + 'name': "Test Account", + 'plan_id': analytic_plan.id, + }) + + def update_form_values(self, asset_form): + for i in range(len(asset_form.depreciation_move_ids)): + with asset_form.depreciation_move_ids.edit(i) as line_edit: + line_edit.asset_remaining_value + + def test_account_asset_no_tax(self): + self.account_asset_model_fixedassets.account_depreciation_expense_id.tax_ids = self.tax_purchase_a + CEO_car = self.env['account.asset'].create({ + 'salvage_value': 2000.0, + 'state': 'open', + 'method_period': '12', + 'method_number': 5, + 'name': "CEO's Car", + 'original_value': 12000.0, + 'model_id': self.account_asset_model_fixedassets.id, + }) + CEO_car._onchange_model_id() + CEO_car.prorata_computation_type = 'constant_periods' + CEO_car.method_number = 5 + + # In order to test the process of Account Asset, I perform a action to confirm Account Asset. + CEO_car.validate() + + self.assertFalse(any(CEO_car.depreciation_move_ids.line_ids.mapped('tax_line_id'))) + + def test_00_account_asset(self): + """Test the lifecycle of an asset""" + CEO_car = self.env['account.asset'].create({ + 'salvage_value': 2000.0, + 'state': 'open', + 'method_period': '12', + 'method_number': 5, + 'name': "CEO's Car", + 'original_value': 12000.0, + 'model_id': self.account_asset_model_fixedassets.id, + }) + CEO_car._onchange_model_id() + CEO_car.prorata_computation_type = 'constant_periods' + CEO_car.method_number = 5 + + # In order to test the process of Account Asset, I perform a action to confirm Account Asset. + CEO_car.validate() + + # TOFIX: the method validate() makes the field account.asset.asset_type + # dirty, but this field has to be flushed in CEO_car's environment. + # This is because the field 'asset_type' is stored, computed and + # context-dependent, which explains why its value must be retrieved + # from the right environment. + CEO_car.flush_recordset() + + # I check Asset is now in Open state. + self.assertEqual(CEO_car.state, 'open', + 'Asset should be in Open state') + + # I compute depreciation lines for asset of CEOs Car. + self.assertEqual(CEO_car.method_number + 1, len(CEO_car.depreciation_move_ids), + 'Depreciation lines not created correctly') + + # Check that auto_post is set on the entries, in the future, and we cannot post them. + self.assertTrue(all(CEO_car.depreciation_move_ids.mapped(lambda m: m.auto_post != 'no'))) + with self.assertRaises(UserError): + CEO_car.depreciation_move_ids.action_post() + + # I Check that After creating all the moves of depreciation lines the state "Running". + CEO_car.depreciation_move_ids.write({'auto_post': 'no'}) + CEO_car.depreciation_move_ids.action_post() + self.assertEqual(CEO_car.state, 'open', + 'State of asset should be runing') + self.assertRecordValues(CEO_car, [{ + 'original_value': 12000, + 'book_value': 2000, + 'value_residual': 0, + 'salvage_value': 2000, + }]) + + self.assertRecordValues(CEO_car.depreciation_move_ids.sorted(lambda l: l.date), [{ + 'amount_total': 1000, + 'asset_remaining_value': 9000, + }, { + 'amount_total': 2000, + 'asset_remaining_value': 7000, + }, { + 'amount_total': 2000, + 'asset_remaining_value': 5000, + }, { + 'amount_total': 2000, + 'asset_remaining_value': 3000, + }, { + 'amount_total': 2000, + 'asset_remaining_value': 1000, + }, { + 'amount_total': 1000, + 'asset_remaining_value': 0, + }]) + + # Revert posted entries in order to be able to close + CEO_car.depreciation_move_ids._reverse_moves(cancel=True) + self.assertRecordValues(CEO_car, [{ + 'original_value': 12000, + 'book_value': 12000, + 'value_residual': 10000, + 'salvage_value': 2000, + }]) + reversed_moves_values = [{ + 'amount_total': 1000, + 'asset_remaining_value': 11000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 13000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 15000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 17000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 19000, + 'state': 'posted', + }, { + 'amount_total': 1000, + 'asset_remaining_value': 20000, + 'state': 'posted', + }, { + 'amount_total': 1000, + 'asset_remaining_value': 19000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 17000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 15000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 13000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 11000, + 'state': 'posted', + }, { + 'amount_total': 1000, + 'asset_remaining_value': 10000, + 'state': 'posted', + }, { + 'amount_total': 10000, + 'asset_remaining_value': 0, + 'state': 'draft', + }] + + self.assertRecordValues(CEO_car.depreciation_move_ids.sorted(lambda l: l.date), reversed_moves_values) + self.assertRecordValues(CEO_car.depreciation_move_ids.filtered(lambda l: l.state == 'draft').line_ids, [{ + 'debit': 0, + 'credit': 10000, + 'account_id': CEO_car.account_depreciation_id.id, + }, { + 'debit': 10000, + 'credit': 0, + 'account_id': CEO_car.account_depreciation_expense_id.id, + }]) + + # Close + CEO_car.set_to_close(self.closing_invoice.invoice_line_ids, date=fields.Date.today() + relativedelta(days=-1)) + self.assertRecordValues(CEO_car, [{ + 'original_value': 12000, + 'book_value': 12000, + 'value_residual': 10000, + 'salvage_value': 2000, + }]) + self.assertRecordValues(CEO_car.depreciation_move_ids.sorted(lambda l: (l.date, l.id)), [{ + 'amount_total': 12000, + 'asset_remaining_value': 0, + 'state': 'draft', + }, { + 'amount_total': 1000, + 'asset_remaining_value': 1000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 3000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 5000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 7000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 9000, + 'state': 'posted', + }, { + 'amount_total': 1000, + 'asset_remaining_value': 10000, + 'state': 'posted', + }, { + 'amount_total': 1000, + 'asset_remaining_value': 9000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 7000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 5000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 3000, + 'state': 'posted', + }, { + 'amount_total': 2000, + 'asset_remaining_value': 1000, + 'state': 'posted', + }, { + 'amount_total': 1000, + 'asset_remaining_value': 0, + 'state': 'posted', + }]) + closing_move = CEO_car.depreciation_move_ids.filtered(lambda l: l.state == 'draft') + self.assertRecordValues(closing_move.line_ids, [{ + 'debit': 0, + 'credit': 12000, + 'account_id': CEO_car.account_asset_id.id, + }, { + 'debit': 0, + 'credit': 0, + 'account_id': CEO_car.account_depreciation_id.id, + }, { + 'debit': 100, + 'credit': 0, + 'account_id': self.closing_invoice.invoice_line_ids.account_id.id, + }, { + 'debit': 11900, + 'credit': 0, + 'account_id': self.env.company.loss_account_id.id, + }]) + closing_move.action_post() + self.assertRecordValues(CEO_car, [{ + 'original_value': 12000, + 'book_value': 0, + 'value_residual': 0, + 'salvage_value': 2000, + }]) + + def test_00_account_asset_new(self): + """Test the lifecycle of an asset""" + CEO_car = self.env['account.asset'].create({ + 'salvage_value': 2000.0, + 'state': 'open', + 'method_period': '12', + 'method_number': 5, + 'name': "CEO's Car", + 'original_value': 12000.0, + 'model_id': self.account_asset_model_fixedassets.id, + }) + CEO_car._onchange_model_id() + CEO_car.prorata_computation_type = 'constant_periods' + CEO_car.method_number = 5 + + # In order to test the process of Account Asset, I perform a action to confirm Account Asset. + CEO_car.validate() + + # I Check that After creating all the moves of depreciation lines the state of the asset is "Running". + CEO_car.depreciation_move_ids.write({'auto_post': 'no'}) + CEO_car.depreciation_move_ids.action_post() + self.assertEqual(CEO_car.state, 'open', + 'State of the asset should be running') + self.assertRecordValues(CEO_car, [{ + 'original_value': 12000, + 'book_value': 2000, + 'value_residual': 0, + 'salvage_value': 2000, + }]) + self.assertRecordValues(CEO_car.depreciation_move_ids.sorted(lambda l: l.date), [{ + 'amount_total': 1000, + 'asset_remaining_value': 9000, + }, { + 'amount_total': 2000, + 'asset_remaining_value': 7000, + }, { + 'amount_total': 2000, + 'asset_remaining_value': 5000, + }, { + 'amount_total': 2000, + 'asset_remaining_value': 3000, + }, { + 'amount_total': 2000, + 'asset_remaining_value': 1000, + }, { + 'amount_total': 1000, + 'asset_remaining_value': 0, + }]) + + # Close + CEO_car.set_to_close(self.closing_invoice.invoice_line_ids, date=fields.Date.today() + relativedelta(days=30)) + self.assertRecordValues(CEO_car, [{ + 'original_value': 12000, + 'book_value': 12000, + 'value_residual': 10000, + 'salvage_value': 2000, + }]) + self.assertRecordValues(CEO_car.depreciation_move_ids.sorted(lambda l: (l.date, l.id)), [{ + 'amount_total': 166.67, + 'asset_remaining_value': 9833.33, + 'state': 'draft', + }, { + 'amount_total': 12000, + 'asset_remaining_value': 0, + 'state': 'draft', + }]) + closing_move = max(CEO_car.depreciation_move_ids, key=lambda m: (m.date, m.id)) + self.assertRecordValues(closing_move, [{ + 'date': fields.Date.today() + relativedelta(days=30), + }]) + self.assertRecordValues(closing_move.line_ids, [{ + 'debit': 0, + 'credit': 12000, + 'account_id': CEO_car.account_asset_id.id, + }, { + 'debit': 166.67, + 'credit': 0, + 'account_id': CEO_car.account_depreciation_id.id, + }, { + 'debit': 100, + 'credit': 0, + 'account_id': self.closing_invoice.invoice_line_ids.account_id.id, + }, { + 'debit': 11733.33, + 'credit': 0, + 'account_id': self.env.company.loss_account_id.id, + }]) + CEO_car.depreciation_move_ids.auto_post = 'no' + CEO_car.depreciation_move_ids.action_post() + self.assertRecordValues(CEO_car, [{ + 'original_value': 12000, + 'book_value': 0, + 'value_residual': 0, + 'salvage_value': 2000, + 'state': 'close', + }]) + + def test_01_account_asset(self): + """ Test if an an asset is created when an invoice is validated with an + item on an account for generating entries. + """ + account_asset_model = self.env['account.asset'].create({ + 'account_depreciation_id': self.company_data['default_account_assets'].id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + 'name': 'Typical car - 3 Years', + 'method_number': 3, + 'method_period': '12', + 'prorata_computation_type': 'daily_computation', + 'state': 'model', + }) + + # The account needs a default model for the invoice to validate the revenue + self.company_data['default_account_assets'].create_asset = 'validate' + self.company_data['default_account_assets'].asset_model_ids = account_asset_model + + invoice = self.env['account.move'].create({ + 'move_type': 'in_invoice', + 'partner_id': self.env['res.partner'].create({'name': 'Res Partner 12'}).id, + 'invoice_date': '2020-12-31', + 'invoice_line_ids': [(0, 0, { + 'name': 'Very little red car', + 'account_id': self.company_data['default_account_assets'].id, + 'price_unit': 450, + 'quantity': 1, + })], + }) + invoice.action_post() + + asset = invoice.asset_ids + self.assertEqual(len(asset), 1, 'One and only one asset should have been created from invoice.') + + self.assertTrue(asset.state == 'open', + 'Asset should be in Open state') + first_invoice_line = invoice.invoice_line_ids[0] + self.assertEqual(asset.original_value, first_invoice_line.price_subtotal, + 'Asset value is not same as invoice line.') + + # I check data in move line and depreciation line. + first_depreciation_line = asset.depreciation_move_ids.sorted(lambda r: r.id)[0] + self.assertAlmostEqual(first_depreciation_line.asset_remaining_value, asset.original_value - first_depreciation_line.amount_total, + msg='Remaining value is incorrect.') + self.assertAlmostEqual(first_depreciation_line.asset_depreciated_value, first_depreciation_line.amount_total, + msg='Depreciated value is incorrect.') + + # I check next installment date. + last_depreciation_date = first_depreciation_line.date + installment_date = last_depreciation_date + relativedelta(months=+int(asset.method_period)) + self.assertEqual(asset.depreciation_move_ids.sorted(lambda r: r.id)[1].date, installment_date, + 'Installment date is incorrect.') + + def test_02_account_asset(self): + """Test the lifecycle of an asset""" + CEO_car = self.env['account.asset'].create({ + 'salvage_value': 2000.0, + 'state': 'open', + 'method_period': '12', + 'method_number': 5, + 'name': "CEO's Car", + 'original_value': 12000.0, + 'model_id': self.account_asset_model_fixedassets.id, + 'acquisition_date': '2010-01-31', + 'already_depreciated_amount_import': 10000.0, + }) + CEO_car._onchange_model_id() + + CEO_car.validate() + self.assertRecordValues(CEO_car, [{ + 'original_value': 12000, + 'book_value': 2000, + 'value_residual': 0, + 'salvage_value': 2000, + }]) + self.assertFalse(CEO_car.depreciation_move_ids) + CEO_car.set_to_close(self.closing_invoice.invoice_line_ids) + self.assertRecordValues(CEO_car, [{ + 'original_value': 12000, + 'book_value': 2000, + 'value_residual': 0, + 'salvage_value': 2000, + }]) + closing_move = CEO_car.depreciation_move_ids.filtered(lambda l: l.state == 'draft') + self.assertRecordValues(closing_move.line_ids, [{ + 'debit': 0, + 'credit': 12000, + 'account_id': CEO_car.account_asset_id.id, + }, { + 'debit': 10000, + 'credit': 0, + 'account_id': CEO_car.account_depreciation_id.id, + }, { + 'debit': 100, + 'credit': 0, + 'account_id': self.closing_invoice.invoice_line_ids.account_id.id, + }, { + 'debit': 1900, + 'credit': 0, + 'account_id': CEO_car.company_id.loss_account_id.id, + }]) + closing_move.action_post() + self.assertRecordValues(CEO_car, [{ + 'original_value': 12000, + 'book_value': 0, + 'value_residual': 0, + 'salvage_value': 2000, + }]) + + def test_03_account_asset(self): + """Test the salvage of an asset with gain""" + CEO_car = self.env['account.asset'].create({ + 'salvage_value': 0, + 'state': 'open', + 'method_period': '12', + 'method_number': 5, + 'name': "CEO's Car", + 'original_value': 12000.0, + 'model_id': self.account_asset_model_fixedassets.id, + 'acquisition_date': '2010-01-31', + 'already_depreciated_amount_import': 12000.0, + }) + CEO_car._onchange_model_id() + + CEO_car.validate() + self.assertRecordValues(CEO_car, [{ + 'original_value': 12000, + 'book_value': 0, + 'value_residual': 0, + 'salvage_value': 0, + }]) + self.assertFalse(CEO_car.depreciation_move_ids) + CEO_car.set_to_close(self.closing_invoice.invoice_line_ids) + self.assertRecordValues(CEO_car, [{ + 'original_value': 12000, + 'book_value': 0, + 'value_residual': 0, + 'salvage_value': 0, + }]) + closing_move = CEO_car.depreciation_move_ids.filtered(lambda l: l.state == 'draft') + self.assertRecordValues(closing_move.line_ids, [{ + 'debit': 0, + 'credit': 12000, + 'account_id': CEO_car.account_asset_id.id, + }, { + 'debit': 12000, + 'credit': 0, + 'account_id': CEO_car.account_depreciation_id.id, + }, { + 'debit': 100, + 'credit': 0, + 'account_id': self.closing_invoice.invoice_line_ids.account_id.id, + }, { + 'debit': 0, + 'credit': 100, + 'account_id': CEO_car.company_id.gain_account_id.id, + }]) + closing_move.action_post() + self.assertRecordValues(CEO_car, [{ + 'original_value': 12000, + 'book_value': 0, + 'value_residual': 0, + 'salvage_value': 0, + }]) + + def test_04_account_asset(self): + """Test the salvage of an asset with gain""" + CEO_car = self.env['account.asset'].create({ + 'salvage_value': 0, + 'state': 'open', + 'method_period': '12', + 'method_number': 5, + 'name': "CEO's Car", + 'original_value': 800.0, + 'model_id': self.account_asset_model_fixedassets.id, + 'acquisition_date': '2021-01-01', + 'already_depreciated_amount_import': 300.0, + }) + CEO_car._onchange_model_id() + CEO_car.method_number = 5 + + CEO_car.validate() + self.assertRecordValues(CEO_car, [{ + 'original_value': 800, + 'book_value': 500, + 'value_residual': 500, + 'salvage_value': 0, + }]) + self.assertEqual(len(CEO_car.depreciation_move_ids), 4) + CEO_car.set_to_close(self.closing_invoice.invoice_line_ids, date=fields.Date.today() + relativedelta(months=-6, days=-1)) + self.assertRecordValues(CEO_car, [{ + 'original_value': 800, + 'book_value': 500, + 'value_residual': 500, + 'salvage_value': 0, + }]) + closing_move = CEO_car.depreciation_move_ids.filtered(lambda l: l.state == 'draft') + self.assertRecordValues(closing_move.line_ids, [{ + 'debit': 0, + 'credit': 800, + 'account_id': CEO_car.account_asset_id.id, + }, { + 'debit': 300, + 'credit': 0, + 'account_id': CEO_car.account_depreciation_id.id, + }, { + 'debit': 100, + 'credit': 0, + 'account_id': self.closing_invoice.invoice_line_ids.account_id.id, + }, { + 'debit': 400, + 'credit': 0, + 'account_id': CEO_car.company_id.loss_account_id.id, + }]) + closing_move.action_post() + self.assertRecordValues(CEO_car, [{ + 'original_value': 800, + 'book_value': 0, + 'value_residual': 0, + 'salvage_value': 0, + }]) + + def test_05_account_asset(self): + """Test the salvage of an asset with gain""" + CEO_car = self.env['account.asset'].create({ + 'salvage_value': 0, + 'state': 'open', + 'method_period': '12', + 'method_number': 5, + 'name': "CEO's Car", + 'original_value': 1000.0, + 'model_id': self.account_asset_model_fixedassets.id, + 'acquisition_date': '2020-01-01', + }) + CEO_car._onchange_model_id() + CEO_car.method_number = 5 + CEO_car.account_depreciation_id = CEO_car.account_asset_id + + CEO_car.validate() + self.assertRecordValues(CEO_car, [{ + 'original_value': 1000, + 'book_value': 800, + 'value_residual': 800, + 'salvage_value': 0, + }]) + self.assertEqual(len(CEO_car.depreciation_move_ids), 5) + CEO_car.set_to_close(self.env['account.move.line'], date=fields.Date.today() + relativedelta(days=-1)) + self.assertRecordValues(CEO_car, [{ + 'original_value': 1000, + 'book_value': 700, + 'value_residual': 700, + 'salvage_value': 0, + }]) + closing_move = CEO_car.depreciation_move_ids.filtered(lambda l: l.state == 'draft') + self.assertRecordValues(closing_move.line_ids, [{ + 'debit': 0, + 'credit': 1000, + 'account_id': CEO_car.account_asset_id.id, + }, { + 'debit': 300, + 'credit': 0, + 'account_id': CEO_car.account_depreciation_id.id, + }, { + 'debit': 700, + 'credit': 0, + 'account_id': CEO_car.company_id.loss_account_id.id, + }]) + closing_move.action_post() + self.assertRecordValues(CEO_car, [{ + 'original_value': 1000, + 'book_value': 0, + 'value_residual': 0, + 'salvage_value': 0, + }]) + + def test_06_account_asset(self): + """Test the correct computation of asset amounts""" + asset_account = self.env['account.account'].create({ + "name": "test_06_account_asset", + "code": "test.06.account.asset", + "account_type": 'asset_non_current', + "create_asset": "no", + "multiple_assets_per_line": True, + }) + + CEO_car = self.env['account.asset'].create({ + 'salvage_value': 0, + 'state': 'draft', + 'method_period': '12', + 'method_number': 4, + 'name': "CEO's Car", + 'original_value': 1000.0, + 'acquisition_date': fields.Date.today() - relativedelta(years=3), + 'account_asset_id': asset_account.id, + 'account_depreciation_id': self.company_data['default_account_assets'].copy().id, + 'account_depreciation_expense_id': asset_account.id, + 'journal_id': self.company_data['default_journal_misc'].id, + 'prorata_computation_type': 'none', + }) + + CEO_car.validate() + posted_entries = len(CEO_car.depreciation_move_ids.filtered(lambda x: x.state == 'posted')) + self.assertEqual(posted_entries, 3) + + self.assertRecordValues(CEO_car, [{ + 'original_value': 1000, + 'book_value': 250, + 'value_residual': 250, + 'salvage_value': 0, + }]) + + def test_account_asset_cancel(self): + """Test the cancellation of an asset""" + today = fields.Date.today() + CEO_car = self.env['account.asset'].create({ + 'salvage_value': 2000.0, + 'state': 'open', + 'method_period': '12', + 'method_number': 5, + 'name': "CEO's Car", + 'original_value': 12000.0, + 'model_id': self.account_asset_model_fixedassets.id, + 'acquisition_date': today + relativedelta(years=-3, month=1, day=1), + }) + CEO_car._onchange_model_id() + CEO_car.method_number = 5 + CEO_car.validate() + + self.assertRecordValues(CEO_car, [{ + 'original_value': 12000, + 'book_value': 6000, + 'value_residual': 4000, + 'salvage_value': 2000, + }]) + CEO_car.set_to_cancelled() + + self.assertEqual(CEO_car.state, 'cancelled') + self.assertFalse(CEO_car.depreciation_move_ids) + + # Hashed journals should reverse entries instead of deleting + Hashed_car = CEO_car.copy() + Hashed_car.write({ + 'original_value': 12000.0, + 'method_number': 5, + 'name': "Hashed Car", + 'journal_id': CEO_car.journal_id.copy().id, + 'acquisition_date': today + relativedelta(years=-3, month=1, day=1), + }) + Hashed_car.journal_id.restrict_mode_hash_table = True + Hashed_car.validate() + self.assertTrue(False not in Hashed_car.depreciation_move_ids[:3].mapped('inalterable_hash')) + + for i in range(0, 4): + self.assertFalse(Hashed_car.depreciation_move_ids[i].reversal_move_ids) + + Hashed_car.set_to_cancelled() + + self.assertEqual(Hashed_car.state, 'cancelled') + for i in range(0, 2): + self.assertTrue(Hashed_car.depreciation_move_ids[i].reversal_move_ids.id > 0 or Hashed_car.depreciation_move_ids[i].reversed_entry_id.id > 0) + + # The depreciation schedule report should not contain cancelled assets + report = self.env.ref('odex30_account_asset.assets_report') + options = self._generate_options(report, today + relativedelta(years=-6, month=1, day=1), today + relativedelta(years=+4, month=12, day=31)) + lines = report._get_lines({**options, **{'unfold_all': False, 'all_entries': True}}) + assets_in_report = [x['name'] for x in lines[:-1]] + + self.assertNotIn(CEO_car.name, assets_in_report) + self.assertNotIn(Hashed_car.name, assets_in_report) + + # When a lock date is applied, only the moves before the date are reversed, others are deleted + Locked_car = CEO_car.copy() + Locked_car.write({ + 'original_value': 12000.0, + 'method_number': 10, + 'name': "Locked Car", + 'acquisition_date': today + relativedelta(years=-3, month=1, day=1), + }) + Locked_car.validate() + Locked_car.company_id.fiscalyear_lock_date = today + relativedelta(years=-1) + + self.assertEqual(len(Locked_car.depreciation_move_ids), 10) + Locked_car.set_to_cancelled() + self.assertRecordValues(Locked_car, [{ + 'state': 'cancelled', + 'book_value': 12000.0, + 'value_residual': 10000, + 'salvage_value': 2000, + }]) + self.assertEqual(len(Locked_car.depreciation_move_ids), 4) + for depreciation in Locked_car.depreciation_move_ids: + self.assertTrue(depreciation.reversal_move_ids or depreciation.reversed_entry_id) + + + def test_asset_form(self): + """Test the form view of assets""" + asset_form = Form(self.env['account.asset']) + asset_form.name = "Test Asset" + asset_form.original_value = 10000 + asset_form.account_depreciation_id = self.company_data['default_account_assets'] + asset_form.account_depreciation_expense_id = self.company_data['default_account_expense'] + asset_form.journal_id = self.company_data['default_journal_misc'] + asset_form.prorata_computation_type = 'none' + asset = asset_form.save() + asset.validate() + + # Test that the depreciations are created upon validation of the asset according to the default values + self.assertEqual(len(asset.depreciation_move_ids), 5) + for move in asset.depreciation_move_ids: + self.assertEqual(move.amount_total, 2000) + + # Test that we cannot validate an asset with non zero remaining value of the last depreciation line + asset_form = Form(asset) + with self.assertRaises(UserError): + with self.cr.savepoint(): + with asset_form.depreciation_move_ids.edit(4) as line_edit: + line_edit.depreciation_value = 1000.0 + asset_form.save() + + # ... but we can with a zero remaining value on the last line. + asset_form = Form(asset) + with asset_form.depreciation_move_ids.edit(4) as line_edit: + line_edit.depreciation_value = 1000.0 + with asset_form.depreciation_move_ids.edit(3) as line_edit: + line_edit.depreciation_value = 3000.0 + self.update_form_values(asset_form) + asset_form.save() + + def test_negative_asset_balance_inversion(self): + """ + Test that an asset with a negative original value generates depreciation moves + with inverted balances (i.e., credit instead of debit) compared to a positive asset. + Also check that manual adjustments to depreciation values correctly reflect in invoice lines. + """ + asset_account = self.company_data['default_account_assets'].id + expense_account = self.company_data['default_account_expense'].id + asset = self.env['account.asset'].create({ + 'name': "Test Asset", + 'original_value': -10000, + 'account_depreciation_id': asset_account, + 'account_depreciation_expense_id': expense_account, + 'journal_id': self.company_data['default_journal_misc'].id, + 'prorata_computation_type': 'none', + }) + asset.compute_depreciation_board() + + # Test that the depreciations are created upon validation of the asset according to the default values + self.assertEqual(len(asset.depreciation_move_ids), 5) + for move in asset.depreciation_move_ids: + self.assertEqual(move.depreciation_value, -2000) + + with Form(asset) as asset_form: + with asset_form.depreciation_move_ids.edit(4) as line_edit: + line_edit.depreciation_value = -1000.0 + with asset_form.depreciation_move_ids.edit(3) as line_edit: + line_edit.depreciation_value = -3000.0 + self.update_form_values(asset_form) + + self.assertRecordValues(asset.depreciation_move_ids[0].line_ids, [ + {'account_id': asset_account, 'balance': 1000.0}, + {'account_id': expense_account, 'balance': -1000.0}, + ]) + + self.assertRecordValues(asset.depreciation_move_ids[1].line_ids, [ + {'account_id': asset_account, 'balance': 3000.0}, + {'account_id': expense_account, 'balance': -3000.0}, + ]) + + def test_asset_change_depreciation_expense_account(self): + """Check computation of depreciation_value is correct even when expense account was changed""" + self.env['account.move'].search([('state', '=', 'draft')]).unlink() # allow setting the lock date below + asset = self.env['account.asset'].create({ + 'name': 'Test asset', + 'acquisition_date': '2011-07-01', + 'original_value': 1000.0, + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': self.company_data['default_account_assets'].id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + }) + asset.validate() + + sorted_depreciation_moves = asset.depreciation_move_ids.sorted(lambda l: l.date) + td = fields.Date.to_date + self.assertRecordValues(sorted_depreciation_moves, [ + {'date': td('2011-12-31'), 'depreciation_value': 100}, + {'date': td('2012-12-31'), 'depreciation_value': 200}, + {'date': td('2013-12-31'), 'depreciation_value': 200}, + {'date': td('2014-12-31'), 'depreciation_value': 200}, + {'date': td('2015-12-31'), 'depreciation_value': 200}, + {'date': td('2016-12-31'), 'depreciation_value': 100}, + ]) + + # Simulate life cycle of the asset by doing the following: + # - Auto posting of depreciation move at their planned date + # - Change the depreciation expense account after depreciation entry for 3rd period is posted + # - Set a lock date after each period so that changing the depreciation expense account + # does not modify the account from expense line on existing posted depreciation entries + new_depreciation_expense_account = asset.account_depreciation_expense_id.copy() + for period, depreciation_move in enumerate(sorted_depreciation_moves): + with self.subTest(period=period, depreciation_date=depreciation_move.date), freeze_time(depreciation_move.date): + + self.env["account.move"]._autopost_draft_entries() + + if period == 3: + asset.account_depreciation_expense_id = new_depreciation_expense_account + + # Ensure expense line of depreciation entry use the right account + expense_line = depreciation_move.line_ids.filtered(lambda line: line.account_id.internal_group == "expense") + if period > 2: + self.assertEqual(expense_line.account_id, new_depreciation_expense_account) + else: + self.assertEqual(expense_line.account_id, self.company_data['default_account_expense']) + + lock_wiz = self.env["account.change.lock.date"].create({"fiscalyear_lock_date": depreciation_move.date}) + with freeze_time('9999-12-31'): + lock_wiz.change_lock_date() + + # Force recomputation of depreciation_value (this would fail due to unbalanced entry in case + # we consider only the asset's expense account in the inverse function) + depreciation_field = self.env['account.move']._fields['depreciation_value'] + self.env.add_to_compute(depreciation_field, sorted_depreciation_moves) + + self.assertRecordValues(sorted_depreciation_moves, [ + {'date': td('2011-12-31'), 'depreciation_value': 100}, + {'date': td('2012-12-31'), 'depreciation_value': 200}, + {'date': td('2013-12-31'), 'depreciation_value': 200}, + {'date': td('2014-12-31'), 'depreciation_value': 200}, + {'date': td('2015-12-31'), 'depreciation_value': 200}, + {'date': td('2016-12-31'), 'depreciation_value': 100}, + ]) + + def test_asset_from_entry_line_form(self): + """Test that the asset is correcly created from a move line""" + + move_ids = self.env['account.move'].create([{ + 'ref': 'line1', + 'line_ids': [ + (0, 0, { + 'account_id': self.company_data['default_account_expense'].id, + 'debit': 300, + 'name': 'Furniture', + }), + (0, 0, { + 'account_id': self.company_data['default_account_assets'].id, + 'credit': 300, + }), + ] + }, { + 'ref': 'line2', + 'line_ids': [ + (0, 0, { + 'account_id': self.company_data['default_account_expense'].id, + 'debit': 600, + 'name': 'Furniture too', + }), + (0, 0, { + 'account_id': self.company_data['default_account_assets'].id, + 'credit': 600, + }), + ] + }, + ]) + move_ids.action_post() + move_line_ids = move_ids.mapped('line_ids').filtered(lambda x: x.debit) + + asset_form = Form(self.env['account.asset'].with_context(default_original_move_line_ids=move_line_ids.ids)) + asset_form.original_move_line_ids = move_line_ids + asset_form.account_depreciation_expense_id = self.company_data['default_account_expense'] + + asset = asset_form.save() + self.assertEqual(asset.value_residual, 900.0) + self.assertIn(asset.name, ['Furniture', 'Furniture too']) + self.assertEqual(asset.journal_id.type, 'general') + self.assertEqual(asset.account_asset_id, self.company_data['default_account_expense']) + self.assertEqual(asset.account_depreciation_id, self.company_data['default_account_expense']) + self.assertEqual(asset.account_depreciation_expense_id, self.company_data['default_account_expense']) + self.assertEqual(asset.acquisition_date, min(move_ids.mapped('date'))) + + def test_asset_from_bill_move_line_form(self): + """Test that the asset is correcly created from a move line""" + + move_ids = self.env['account.move'].create([{ + 'move_type': 'in_invoice', + 'partner_id': self.partner_a.id, + 'ref': 'line1', + 'date': '2020-06-01', + 'invoice_date': '2020-06-15', + 'invoice_line_ids': [ + Command.create({ + 'account_id': self.company_data['default_account_expense'].id, + 'price_unit': 300, + 'name': 'Furniture', + 'tax_ids': [], + }), + ] + }, { + 'move_type': 'in_invoice', + 'partner_id': self.partner_a.id, + 'ref': 'line2', + 'date': '2020-06-01', + 'invoice_date': '2020-06-14', + 'invoice_line_ids': [ + Command.create({ + 'account_id': self.company_data['default_account_expense'].id, + 'price_unit': 600, + 'name': 'Furniture too', + 'tax_ids': [], + }), + ] + }, + ]) + move_ids.action_post() + move_line_ids = move_ids.mapped('line_ids').filtered(lambda x: x.debit) + + asset_form = Form(self.env['account.asset'].with_context(default_original_move_line_ids=move_line_ids.ids)) + asset_form.original_move_line_ids = move_line_ids + asset_form.account_depreciation_expense_id = self.company_data['default_account_expense'] + + asset = asset_form.save() + self.assertEqual(asset.value_residual, 900.0) + self.assertRecordValues(asset, [{ + 'name': 'Furniture', + 'account_asset_id': self.company_data['default_account_expense'].id, + 'account_depreciation_id': self.company_data['default_account_expense'].id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'acquisition_date': min(move_ids.mapped('invoice_date')), + }]) + + def test_asset_from_bill_move_line_form_multicurrency(self): + """Test that the asset is correcly created from a move line using a foreign currency""" + + asset_account = self.company_data['default_account_assets'] + non_deductible_tax = self.env['account.tax'].create({ + 'name': 'Non-deductible Tax', + 'amount': 21, + 'amount_type': 'percent', + 'type_tax_use': 'purchase', + 'invoice_repartition_line_ids': [ + Command.create({'repartition_type': 'base'}), + Command.create({ + 'factor_percent': 50, + 'repartition_type': 'tax', + 'use_in_tax_closing': False + }), + Command.create({ + 'factor_percent': 50, + 'repartition_type': 'tax', + 'use_in_tax_closing': True + }), + ], + 'refund_repartition_line_ids': [ + Command.create({'repartition_type': 'base'}), + Command.create({ + 'factor_percent': 50, + 'repartition_type': 'tax', + 'use_in_tax_closing': False + }), + Command.create({ + 'factor_percent': 50, + 'repartition_type': 'tax', + 'use_in_tax_closing': True + }), + ], + }) + asset_account.tax_ids = non_deductible_tax + + asset_account.create_asset = 'no' + asset_account.multiple_assets_per_line = False + + vendor_bill = self.env['account.move'].create({ + 'move_type': 'in_invoice', + 'currency_id': self.other_currency.id, + 'invoice_date': '2020-01-01', + 'partner_id': self.partner_a.id, + 'invoice_line_ids': [ + Command.create({ + 'account_id': asset_account.id, + 'currency_id': self.other_currency.id, + 'name': 'Asus Laptop', + 'price_unit': 1000.0, + 'quantity': 1, + 'tax_ids': [Command.set(non_deductible_tax.ids)] + }), + Command.create({ + 'account_id': asset_account.id, + 'currency_id': self.other_currency.id, + 'name': 'Lenovo Laptop', + 'price_unit': 500.0, + 'quantity': 1, + 'tax_ids': [Command.set(non_deductible_tax.ids)] + }), + ], + }) + vendor_bill.action_post() + self.env.flush_all() + + move_line_ids = vendor_bill.mapped('line_ids').filtered(lambda x: x.name and 'Laptop' in x.name) + asset_form = Form(self.env['account.asset'].with_context( + default_original_move_line_ids=move_line_ids.ids, + asset_type='purchase' + )) + asset_form.original_move_line_ids = move_line_ids + asset_form.account_depreciation_expense_id = self.company_data['default_account_expense'] + + new_assets = asset_form.save() + self.assertEqual(len(new_assets), 1) + self.assertEqual(new_assets.original_value, 828.75) + self.assertEqual(new_assets.non_deductible_tax_value, 78.75) + + def test_asset_modify_value_00(self): + """Test the values of the asset and value increase 'assets' after a + modification of residual and/or salvage values. + Increase the residual value, increase the salvage value""" + self.assertEqual(self.truck.value_residual, 3000) + self.assertEqual(self.truck.salvage_value, 2500) + + self.env['asset.modify'].create({ + 'name': 'New beautiful sticker :D', + 'asset_id': self.truck.id, + 'value_residual': 4000, + 'salvage_value': 3000, + 'date': fields.Date.today() + relativedelta(months=-6, days=-1), + "account_asset_counterpart_id": self.assert_counterpart_account_id, + "account_depreciation_id": self.company_data['default_account_assets'].id, + }).modify() + self.assertEqual(self.truck.value_residual, 3000) + self.assertEqual(self.truck.salvage_value, 2500) + self.assertEqual(self.truck.children_ids.value_residual, 1000) + self.assertEqual(self.truck.children_ids.salvage_value, 500) + self.assertEqual(self.truck.account_depreciation_id.id, self.company_data['default_account_assets'].id) + + def test_asset_modify_value_01(self): + "Decrease the residual value, decrease the salvage value" + self.env['asset.modify'].create({ + 'name': "Accident :'(", + 'date': fields.Date.today() + relativedelta(months=-6, days=-1), + 'asset_id': self.truck.id, + 'value_residual': 1000, + 'salvage_value': 2000, + "account_asset_counterpart_id": self.assert_counterpart_account_id, + }).modify() + self.assertEqual(self.truck.value_residual, 1000) + self.assertEqual(self.truck.salvage_value, 2000) + self.assertEqual(self.truck.children_ids.value_residual, 0) + self.assertEqual(self.truck.children_ids.salvage_value, 0) + self.assertEqual(max(self.truck.depreciation_move_ids.filtered(lambda m: m.state == 'posted'), key=lambda m: (m.date, m.id)).amount_total, 2500) + + def test_asset_modify_value_02(self): + "Decrease the residual value, increase the salvage value; same book value" + self.env['asset.modify'].create({ + 'name': "Don't wanna depreciate all of it", + 'asset_id': self.truck.id, + 'date': fields.Date.today() + relativedelta(months=-6, days=-1), + 'value_residual': 1000, + 'salvage_value': 4500, + "account_asset_counterpart_id": self.assert_counterpart_account_id, + }).modify() + self.assertEqual(self.truck.value_residual, 1000) + self.assertEqual(self.truck.salvage_value, 4500) + self.assertEqual(self.truck.children_ids.value_residual, 0) + self.assertEqual(self.truck.children_ids.salvage_value, 0) + + def test_asset_modify_value_03(self): + "Decrease the residual value, increase the salvage value; increase of book value" + self.env['asset.modify'].create({ + 'name': "Some aliens did something to my truck", + 'asset_id': self.truck.id, + 'date': fields.Date.today() + relativedelta(months=-6, days=-1), + 'value_residual': 1000, + 'salvage_value': 6000, + "account_asset_counterpart_id": self.assert_counterpart_account_id, + }).modify() + self.assertEqual(self.truck.value_residual, 1000) + self.assertEqual(self.truck.salvage_value, 4500) + self.assertEqual(self.truck.children_ids.value_residual, 0) + self.assertEqual(self.truck.children_ids.salvage_value, 1500) + + def test_asset_modify_value_04(self): + "Increase the residual value, decrease the salvage value; increase of book value" + self.env['asset.modify'].create({ + 'name': 'GODZILA IS REAL!', + 'asset_id': self.truck.id, + 'date': fields.Date.today() + relativedelta(months=-6, days=-1), + 'value_residual': 4000, + 'salvage_value': 2000, + "account_asset_counterpart_id": self.assert_counterpart_account_id, + }).modify() + self.assertEqual(self.truck.value_residual, 3500) + self.assertEqual(self.truck.salvage_value, 2000) + self.assertEqual(self.truck.children_ids.value_residual, 500) + self.assertEqual(self.truck.children_ids.salvage_value, 0) + + def test_asset_modify_report(self): + """Test the asset value modification flows""" + # PY + - Final PY + - Final Bookvalue + # -6 0 10000 0 10000 0 750 0 750 9250 + # -5 10000 0 0 10000 750 750 0 1500 8500 + # -4 10000 0 0 10000 1500 750 0 2250 7750 + # -3 10000 0 0 10000 2250 750 0 3000 7000 + # -2 10000 0 0 10000 3000 750 0 3750 6250 + # -1 10000 0 0 10000 3750 750 0 4500 5500 + # 0 10000 0 0 10000 4500 750 0 5250 4750 <-- today + # 1 10000 0 0 10000 5250 750 0 6000 4000 + # 2 10000 0 0 10000 6000 750 0 6750 3250 + # 3 10000 0 0 10000 6750 750 0 7500 2500 + + today = fields.Date.today() + + report = self.env.ref('odex30_account_asset.assets_report') + # TEST REPORT + # look at all period, with unposted entries + options = self._generate_options(report, today + relativedelta(years=-6, month=1, day=1), today + relativedelta(years=+4, month=12, day=31)) + lines = report._get_lines({**options, **{'unfold_all': False, 'all_entries': True}}) + self.assertListEqual([ 0.0, 10000.0, 0.0, 10000.0, 0.0, 7500.0, 0.0, 7500.0, 2500.0], + [x['no_format'] for x in lines[0]['columns'][4:]]) + + # look at all period, without unposted entries + options = self._generate_options(report, today + relativedelta(years=-6, month=1, day=1), today + relativedelta(years=+4, month=12, day=31)) + lines = report._get_lines({**options, **{'unfold_all': False, 'all_entries': False}}) + self.assertListEqual([ 0.0, 10000.0, 0.0, 10000.0, 0.0, 4500.0, 0.0, 4500.0, 5500.0], + [x['no_format'] for x in lines[0]['columns'][4:]]) + + # look only at this period + options = self._generate_options(report, today + relativedelta(years=0, month=1, day=1), today + relativedelta(years=0, month=12, day=31)) + lines = report._get_lines({**options, **{'unfold_all': False, 'all_entries': True}}) + self.assertListEqual([10000.0, 0.0, 0.0, 10000.0, 4500.0, 750.0, 0.0, 5250.0, 4750.0], + [x['no_format'] for x in lines[0]['columns'][4:]]) + + # test value increase + # PY + - Final PY + - Final Bookvalue + # -6 0 10000 0 10000 750 0 750 9250 + # -5 10000 0 0 10000 750 750 0 1500 8500 + # -4 10000 0 0 10000 1500 750 0 2250 7750 + # -3 10000 0 0 10000 2250 750 0 3000 7000 + # -2 10000 0 0 10000 3000 750 0 3750 6250 + # -1 10000 1500 0 10000 3750 950 0 4700 6800 + # 0 10000 0 0 11500 4700 950 0 5650 5850 <-- today + # 1 11500 0 0 11500 5650 950 0 6600 4900 + # 2 11500 0 0 11500 6600 950 0 7550 3950 + # 3 11500 0 0 11500 7550 950 0 8500 3000 + self.assertEqual(self.truck.value_residual, 3000) + self.assertEqual(self.truck.salvage_value, 2500) + self.env['asset.modify'].create({ + 'name': 'New beautiful sticker :D', + 'asset_id': self.truck.id, + 'date': fields.Date.today() + relativedelta(years=-1, months=-6, days=-1), + 'value_residual': 4750, + 'salvage_value': 3000, + "account_asset_counterpart_id": self.assert_counterpart_account_id, + }).modify() + + self.assertEqual(self.truck.value_residual + sum(self.truck.children_ids.mapped('value_residual')), 3800) + self.assertEqual(self.truck.salvage_value + sum(self.truck.children_ids.mapped('salvage_value')), 3000) + + # look at all period, with unposted entries + options = self._generate_options(report, today + relativedelta(years=-6, months=-6), today + relativedelta(years=+4, month=12, day=31)) + lines = report._get_lines({**options, **{'unfold_all': False, 'all_entries': True}}) + self.assertListEqual([0.0, 11500.0, 0.0, 11500.0, 0.0, 8500.0, 0.0, 8500.0, 3000.0], + [x['no_format'] for x in lines[0]['columns'][4:]]) + self.assertEqual('10 y', lines[1]['columns'][3]['name'], 'Depreciation Rate = 10%') + + # look only at this period + options = self._generate_options(report, today + relativedelta(years=0, month=1, day=1), today + relativedelta(years=0, month=12, day=31)) + lines = report._get_lines({**options, **{'unfold_all': False, 'all_entries': True}}) + self.assertListEqual([11500.0, 0.0, 0.0, 11500.0, 4700.0, 950.0, 0.0, 5650.0, 5850.0], + [x['no_format'] for x in lines[0]['columns'][4:]]) + + # test value decrease + self.env['asset.modify'].create({ + 'name': "Huge scratch on beautiful sticker :'( It is ruined", + 'date': fields.Date.today() + relativedelta(months=-6, days=-1), + 'asset_id': self.truck.children_ids.id, + 'value_residual': 0, + 'salvage_value': 500, + "account_asset_counterpart_id": self.assert_counterpart_account_id, + }).modify() + self.env['asset.modify'].create({ + 'name': "Huge scratch on beautiful sticker :'( It went through...", + 'date': fields.Date.today() + relativedelta(months=-6, days=-1), + 'asset_id': self.truck.id, + 'value_residual': 1000, + 'salvage_value': 2500, + "account_asset_counterpart_id": self.assert_counterpart_account_id, + }).modify() + self.assertEqual(self.truck.value_residual + sum(self.truck.children_ids.mapped('value_residual')), 1000) + self.assertEqual(self.truck.salvage_value + sum(self.truck.children_ids.mapped('salvage_value')), 3000) + + # look at all period, with unposted entries + options = self._generate_options(report, today + relativedelta(years=-6, month=1, day=1), today + relativedelta(years=+4, month=12, day=31)) + lines = report._get_lines({**options, **{'unfold_all': False, 'all_entries': True}}) + self.assertListEqual([0.0, 11500.0, 0.0, 11500.0, 0.0, 8500.0, 0.0, 8500.0, 3000.0], + [x['no_format'] for x in lines[0]['columns'][4:]]) + + # look only at previous period + options = self._generate_options(report, today + relativedelta(years=-1, month=1, day=1), today + relativedelta(years=-1, month=12, day=31)) + lines = report._get_lines({**options, **{'unfold_all': False, 'all_entries': True}}) + self.assertListEqual([10000.0, 1500.0, 0.0, 11500.0, 3750.0, 3750.0, 0.0, 7500.0, 4000.0], + [x['no_format'] for x in lines[0]['columns'][4:]]) + + def test_asset_pause_resume(self): + """Test that depreciation remains the same after a pause and resume at a later date""" + today = fields.Date.today() + self.assertEqual(len(self.truck.depreciation_move_ids.filtered(lambda e: e.state == 'draft')), 4) + self.env['asset.modify'].create({ + 'date': fields.Date.today() + relativedelta(days=-1), + 'asset_id': self.truck.id, + }).pause() + self.assertEqual(len(self.truck.depreciation_move_ids.filtered(lambda e: e.state == 'draft')), 0) + with freeze_time(today) as frozen_time: + frozen_time.move_to(today + relativedelta(years=1)) + self.env['asset.modify'].with_context(resume_after_pause=True).create({ + 'asset_id': self.truck.id, + }).modify() + self.assertEqual(len(self.truck.depreciation_move_ids.filtered(lambda e: e.state == 'posted')), 7) + self.assertEqual( + self.truck.depreciation_move_ids.filtered(lambda e: e.state == 'draft').mapped('amount_total'), + [375.0, 750.0, 750.0, 750.0]) + + def test_asset_modify_sell_profit(self): + """Test that a credit is realised in the gain account when selling an asset for a sum greater than book value""" + closing_invoice = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'invoice_line_ids': [(0, 0, {'price_unit': self.truck.book_value + 100})] + }) + self.env['asset.modify'].create({ + 'asset_id': self.truck.id, + 'invoice_line_ids': closing_invoice.invoice_line_ids, + 'date': fields.Date.today() + relativedelta(months=-6, days=-1), + 'modify_action': 'sell', + }).sell_dispose() + + closing_move = self.truck.depreciation_move_ids.filtered(lambda l: l.state == 'draft') + self.assertRecordValues(closing_move.line_ids, [{ + 'ref': 'truck: Sale', + 'debit': 0, + 'credit': 10000, + 'account_id': self.truck.account_asset_id.id, + }, { + 'ref': 'truck: Sale', + 'debit': 4500, + 'credit': 0, + 'account_id': self.truck.account_depreciation_id.id, + }, { + 'ref': 'truck: Sale', + 'debit': 5600, + 'credit': 0, + 'account_id': closing_invoice.invoice_line_ids.account_id.id, + }, { + 'ref': 'truck: Sale', + 'debit': 0, + 'credit': 100, + 'account_id': self.env.company.gain_account_id.id, + }]) + + def test_asset_modify_sell_loss(self): + """Test that a debit is realised in the loss account when selling an asset for a sum less than book value""" + closing_invoice = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'invoice_line_ids': [(0, 0, {'price_unit': self.truck.book_value - 100})] + }) + self.env['asset.modify'].create({ + 'asset_id': self.truck.id, + 'invoice_line_ids': closing_invoice.invoice_line_ids, + 'date': fields.Date.today() + relativedelta(months=-6, days=-1), + 'modify_action': 'sell', + }).sell_dispose() + closing_move = self.truck.depreciation_move_ids.filtered(lambda l: l.state == 'draft') + + self.assertRecordValues(closing_move.line_ids, [{ + 'ref': 'truck: Sale', + 'debit': 0, + 'credit': 10000, + 'account_id': self.truck.account_asset_id.id, + }, { + 'ref': 'truck: Sale', + 'debit': 4500, + 'credit': 0, + 'account_id': self.truck.account_depreciation_id.id, + }, { + 'ref': 'truck: Sale', + 'debit': 5400, + 'credit': 0, + 'account_id': closing_invoice.invoice_line_ids.account_id.id, + }, { + 'ref': 'truck: Sale', + 'debit': 100, + 'credit': 0, + 'account_id': self.env.company.loss_account_id.id, + }]) + + def test_asset_sale_same_account_as_invoice(self): + """Test the sale of an asset with an invoice that has the same account as the Depreciation Account""" + closing_invoice = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'invoice_line_ids': [ + Command.create({ + 'account_id': self.truck.account_depreciation_id.id, + 'price_unit': self.truck.book_value - 100 + }) + ] + }) + self.env['asset.modify'].create({ + 'asset_id': self.truck.id, + 'invoice_line_ids': closing_invoice.invoice_line_ids, + 'date': fields.Date.today() + relativedelta(months=-6, days=-1), + 'modify_action': 'sell', + }).sell_dispose() + closing_move = self.truck.depreciation_move_ids.filtered(lambda l: l.state == 'draft') + self.assertRecordValues(closing_move.line_ids, [{ + 'ref': 'truck: Sale', + 'debit': 0, + 'credit': 10000, + 'account_id': self.truck.account_asset_id.id, + }, { + 'ref': 'truck: Sale', + 'debit': 4500, + 'credit': 0, + 'account_id': self.truck.account_depreciation_id.id, + }, { + 'ref': 'truck: Sale', + 'debit': 5400, + 'credit': 0, + 'account_id': closing_invoice.invoice_line_ids.account_id.id, + }, { + 'ref': 'truck: Sale', + 'debit': 100, + 'credit': 0, + 'account_id': self.env.company.loss_account_id.id, + }]) + + self.assertEqual(closing_move.depreciation_value, 3000, "Should be the remaining amount before the sale") + + def test_asset_modify_dispose(self): + """Test the loss of the remaining book_value when an asset is disposed using the wizard""" + self.env['asset.modify'].create({ + 'asset_id': self.truck.id, + 'date': fields.Date.today() + relativedelta(months=-6, days=-1), + 'modify_action': 'dispose', + }).sell_dispose() + closing_move = self.truck.depreciation_move_ids.filtered(lambda l: l.state == 'draft') + self.assertRecordValues(closing_move.line_ids, [{ + 'ref': 'truck: Disposal', + 'debit': 0, + 'credit': 10000, + 'account_id': self.truck.account_asset_id.id, + }, { + 'ref': 'truck: Disposal', + 'debit': 4500, + 'credit': 0, + 'account_id': self.truck.account_depreciation_id.id, + }, { + 'ref': 'truck: Disposal', + 'debit': 5500, + 'credit': 0, + 'account_id': self.env.company.loss_account_id.id, + }]) + + def test_asset_reverse_depreciation(self): + """Test the reversal of a depreciation move""" + + self.assertEqual(sum(self.truck.depreciation_move_ids.filtered(lambda m: m.state == 'posted').mapped('depreciation_value')), 4500) + self.assertEqual(sum(self.truck.depreciation_move_ids.filtered(lambda m: m.state == 'draft').mapped('depreciation_value')), 3000) + self.assertEqual(max(self.truck.depreciation_move_ids.filtered(lambda m: m.state == 'posted'), key=lambda m: m.date).asset_remaining_value, 3000) + + report = self.env.ref('odex30_account_asset.assets_report') + today = fields.Date.today() + + move_to_reverse = self.truck.depreciation_move_ids.filtered(lambda m: m.state == 'posted').sorted(lambda m: m.date)[-1] + reversed_move = move_to_reverse._reverse_moves() + + # Check that the depreciation has been reported on the next move + min_date_draft = min(self.truck.depreciation_move_ids.filtered(lambda m: m.state == 'draft' and m.date > reversed_move.date), key=lambda m: m.date) + self.assertEqual(move_to_reverse.asset_remaining_value - min_date_draft.depreciation_value - reversed_move.depreciation_value, min_date_draft.asset_remaining_value) + self.assertEqual(move_to_reverse.asset_depreciated_value + min_date_draft.depreciation_value + reversed_move.depreciation_value, min_date_draft.asset_depreciated_value) + + # The amount is still there, it only has been reversed. But it has been added on the next draft move to complete the depreciation table + self.assertEqual(sum(self.truck.depreciation_move_ids.filtered(lambda m: m.state == 'posted').mapped('depreciation_value')), 4500) + self.assertEqual(sum(self.truck.depreciation_move_ids.filtered(lambda m: m.state == 'draft').mapped('depreciation_value')), 3000) + + # Check that the table shows fully depreciated at the end + self.assertEqual(max(self.truck.depreciation_move_ids, key=lambda m: m.date).asset_remaining_value, 0) + self.assertEqual(max(self.truck.depreciation_move_ids, key=lambda m: m.date).asset_depreciated_value, 7500) + + reversed_move.action_post() + + options = self._generate_options(report, today + relativedelta(years=0, month=7, day=1), today + relativedelta(years=0, month=7, day=31)) + lines = report._get_lines({**options, 'unfold_all': False, 'all_entries': True}) + # We take the reversal entry into account + self.assertListEqual([10000.0, 0.0, 0.0, 10000.0, 4500.0, -750.0, 0.0, 3750.0, 6250.0], + [x['no_format'] for x in lines[0]['columns'][4:]]) + + options = self._generate_options(report, today + relativedelta(years=0, month=1, day=1), today + relativedelta(years=0, month=12, day=31)) + lines = report._get_lines({**options, 'unfold_all': False, 'all_entries': True}) + # With the report on the next entry, we get a normal depreciation amount for the year + self.assertListEqual([10000.0, 0.0, 0.0, 10000.0, 4500.0, 750.0, 0.0, 5250.0, 4750.0], + [x['no_format'] for x in lines[0]['columns'][4:]]) + + def test_ref_asset_depreciation(self): + """Test that the reference used in depreciation moves is correct""" + + for ref in self.truck.depreciation_move_ids.mapped('ref'): + self.assertEqual(ref, 'truck: Depreciation') + + def test_credit_note_out_refund(self): + """ + Test the behaviour of the asset creation when a credit note is created. + The asset created from the credit note should be the same as the one created from the invoice + with a negative value. + """ + depreciation_account = self.company_data['default_account_assets'].copy() + revenue_model = self.env['account.asset'].create({ + 'account_depreciation_id': depreciation_account.id, + 'account_depreciation_expense_id': self.company_data['default_account_revenue'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + 'name': 'Hardware - 5 Years', + 'method_number': 5, + 'method_period': '12', + 'state': 'model', + }) + + depreciation_account.write({'create_asset': 'draft', 'asset_model_ids': revenue_model}) + + invoice = self.env['account.move'].create({ + 'invoice_date': '2019-07-01', + 'move_type': 'in_invoice', + 'partner_id': self.partner_a.id, + 'invoice_line_ids': [(0, 0, { + 'name': 'Hardware', + 'account_id': depreciation_account.id, + 'price_unit': 5000, + 'quantity': 1, + 'tax_ids': False, + })], + }) + + invoice.action_post() + self.assertTrue(invoice.asset_ids) + + credit_note = invoice._reverse_moves([{'invoice_date': fields.Date.today()}]) + credit_note.action_post() + + invoice_asset = invoice.asset_ids + credit_note_asset = credit_note.asset_ids + + # check if invoice_asset still exists after validate the credit note + self.assertTrue(invoice_asset) + self.assertTrue(credit_note_asset) + + (invoice_asset + credit_note_asset).validate() + + self.assertRecordValues(credit_note_asset, [ + { + 'acquisition_date': invoice_asset.acquisition_date, + 'book_value': -invoice_asset.book_value, + 'value_residual': -invoice_asset.value_residual, + } + ]) + + for invoice_asset_move, credit_note_asset_move in zip(invoice_asset.depreciation_move_ids.sorted('date'), credit_note_asset.depreciation_move_ids.sorted('date')): + self.assertRecordValues(credit_note_asset_move, [ + { + 'date': invoice_asset_move.date, + 'state': invoice_asset_move.state, + 'depreciation_value': -invoice_asset_move.depreciation_value, + } + ]) + + def test_asset_multiple_assets_from_one_move_line_00(self): + """ Test the creation of a as many assets as the value of + the quantity property of a move line. """ + + account = self.env['account.account'].create({ + "name": "test account", + "code": "TEST", + "account_type": 'asset_non_current', + "create_asset": "draft", + "multiple_assets_per_line": True, + }) + move = self.env['account.move'].create({ + "partner_id": self.env['res.partner'].create({'name': 'Johny'}).id, + "ref": "line1", + "move_type": "in_invoice", + "invoice_date": "2020-12-31", + "invoice_line_ids": [ + (0, 0, { + "account_id": account.id, + "price_unit": 400.0, + "name": "stuff", + "quantity": 2, + "product_uom_id": self.env.ref('uom.product_uom_unit').id, + "tax_ids": [], + }), + ] + }) + move.action_post() + assets = move.asset_ids + assets = sorted(assets, key=lambda i: i['original_value'], reverse=True) + self.assertEqual(len(assets), 2, '3 assets should have been created') + self.assertEqual(assets[0].original_value, 400.0) + self.assertEqual(assets[1].original_value, 400.0) + + def test_asset_multiple_assets_from_one_move_line_01(self): + """ Test the creation of a as many assets as the value of + the quantity property of a move line. """ + + account = self.env['account.account'].create({ + "name": "test account", + "code": "TEST", + "account_type": 'asset_non_current', + "create_asset": "draft", + "multiple_assets_per_line": True, + }) + move = self.env['account.move'].create({ + "partner_id": self.env['res.partner'].create({'name': 'Johny'}).id, + "ref": "line1", + "move_type": "in_invoice", + "invoice_date": "2020-12-31", + "invoice_line_ids": [ + (0, 0, { + "account_id": account.id, + "name": "stuff", + "quantity": 3.0, + "price_unit": 1000.0, + "product_uom_id": self.env.ref('uom.product_uom_categ_unit').id, + }), + (0, 0, { + 'account_id': self.company_data['default_account_assets'].id, + "name": "stuff", + 'quantity': 1.0, + 'price_unit': -500.0, + }), + ] + }) + move.action_post() + self.assertEqual(sum(asset.original_value for asset in move.asset_ids), move.line_ids[0].debit) + + def test_asset_credit_note(self): + """Test the generated entries created from an in_refund invoice with asset""" + asset_model = self.env['account.asset'].create({ + 'account_depreciation_id': self.company_data['default_account_assets'].id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'account_asset_id': self.company_data['default_account_assets'].id, + 'journal_id': self.company_data['default_journal_purchase'].id, + 'name': 'Small car - 3 Years', + 'method_number': 3, + 'method_period': '12', + 'state': 'model', + }) + + self.company_data['default_account_assets'].create_asset = "validate" + self.company_data['default_account_assets'].asset_model_ids = asset_model + + invoice = self.env['account.move'].create({ + 'move_type': 'in_refund', + 'invoice_date': '2020-01-01', + 'date': '2020-01-01', + 'partner_id': self.partner_a.id, + 'invoice_line_ids': [(0, 0, { + 'name': 'Very little red car', + 'account_id': self.company_data['default_account_assets'].id, + 'price_unit': 450, + 'quantity': 1, + })], + }) + invoice.action_post() + depreciation_lines = self.env['account.move.line'].search([ + ('account_id', '=', asset_model.account_depreciation_id.id), + ('move_id.asset_id', '=', invoice.asset_ids.id), + ('debit', '=', 150), + ]) + self.assertEqual( + len(depreciation_lines), 3, + 'Three entries with a debit of 150 must be created on the Deferred Expense Account' + ) + + def test_asset_partial_credit_note(self): + """Test partial credit note on an in invoice that has generated draft assets. + + Test case: + - Create in invoice with the following lines: + + Product | Unit Price | Quantity | Multiple assets + --------------------------------------------------------- + Product B | 200 | 4 | TRUE + Product A | 100 | 7 | FALSE + Product A | 100 | 5 | TRUE + Product A | 150 | 6 | TRUE + Product A | 100 | 7 | FALSE + + - Add a credit note with the following lines: + + Product | Unit Price | Quantity + --------------------------------------- + Product A | 100 | 1 + Product A | 150 | 2 + Product A | 100 | 7 + """ + asset_model = self.env['account.asset'].create({ + 'account_depreciation_id': self.company_data['default_account_assets'].id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_sale'].id, + 'name': 'Maintenance Contract - 3 Years', + 'method_number': 3, + 'method_period': '12', + 'prorata_computation_type': 'none', + 'state': 'model', + }) + self.company_data['default_account_assets'].create_asset = 'draft' + self.company_data['default_account_assets'].asset_model_ids = asset_model + account_assets_multiple = self.company_data['default_account_assets'].copy() + account_assets_multiple.multiple_assets_per_line = True + + product_a = self.env['product.product'].create({ + 'name': 'Product A', + 'default_code': 'PA', + 'lst_price': 100.0, + 'standard_price': 100.0, + }) + product_b = self.env['product.product'].create({ + 'name': 'Product B', + 'default_code': 'PB', + 'lst_price': 200.0, + 'standard_price': 200.0, + }) + invoice = self.env['account.move'].create({ + 'move_type': 'in_invoice', + 'invoice_date': '2020-01-01', + 'partner_id': self.partner_a.id, + 'invoice_line_ids': [ + (0, 0, { + 'product_id': product_b.id, + 'name': 'Product B', + 'account_id': account_assets_multiple.id, + 'price_unit': 200.0, + 'quantity': 4, + }), + (0, 0, { + 'product_id': product_a.id, + 'name': 'Product A', + 'account_id': self.company_data['default_account_assets'].id, + 'price_unit': 100.0, + 'quantity': 7, + }), + (0, 0, { + 'product_id': product_a.id, + 'name': 'Product A', + 'account_id': account_assets_multiple.id, + 'price_unit': 100.0, + 'quantity': 5, + }), + (0, 0, { + 'product_id': product_a.id, + 'name': 'Product A', + 'account_id': account_assets_multiple.id, + 'price_unit': 150.0, + 'quantity': 6, + }), + (0, 0, { + 'product_id': product_a.id, + 'name': 'Product A', + 'account_id': self.company_data['default_account_assets'].id, + 'price_unit': 100.0, + 'quantity': 7, + }), + ], + }) + invoice.action_post() + product_a_100_lines = invoice.line_ids.filtered(lambda l: l.product_id == product_a and l.price_unit == 100.0) + product_a_150_lines = invoice.line_ids.filtered(lambda l: l.product_id == product_a and l.price_unit == 150.0) + product_b_lines = invoice.line_ids.filtered(lambda l: l.product_id == product_b) + self.assertEqual(len(invoice.line_ids.mapped(lambda l: l.asset_ids)), 17) + self.assertEqual(len(product_b_lines.asset_ids), 4) + self.assertEqual(len(product_a_100_lines.asset_ids), 7) + self.assertEqual(len(product_a_150_lines.asset_ids), 6) + credit_note = invoice._reverse_moves() + with Form(credit_note) as move_form: + move_form.invoice_date = move_form.date + move_form.invoice_line_ids.remove(0) + move_form.invoice_line_ids.remove(0) + with move_form.invoice_line_ids.edit(0) as line_form: + line_form.quantity = 1 + with move_form.invoice_line_ids.edit(1) as line_form: + line_form.quantity = 2 + credit_note.action_post() + self.assertEqual(len(invoice.line_ids.mapped(lambda l: l.asset_ids)), 17) + self.assertEqual(len(product_b_lines.asset_ids), 4) + self.assertEqual(len(product_a_100_lines.asset_ids), 7) + self.assertEqual(len(product_a_150_lines.asset_ids), 6) + + def test_asset_with_non_deductible_tax(self): + """Test that the assets' original_value and non_deductible_tax_value are correctly computed + from a move line with a non-deductible tax.""" + + asset_account = self.company_data['default_account_assets'] + non_deductible_tax = self.env['account.tax'].create({ + 'name': 'Non-deductible Tax', + 'amount': 21, + 'amount_type': 'percent', + 'type_tax_use': 'purchase', + 'invoice_repartition_line_ids': [ + Command.create({'repartition_type': 'base'}), + Command.create({ + 'factor_percent': 50, + 'repartition_type': 'tax', + 'use_in_tax_closing': False + }), + Command.create({ + 'factor_percent': 50, + 'repartition_type': 'tax', + 'use_in_tax_closing': True + }), + ], + 'refund_repartition_line_ids': [ + Command.create({'repartition_type': 'base'}), + Command.create({ + 'factor_percent': 50, + 'repartition_type': 'tax', + 'use_in_tax_closing': False + }), + Command.create({ + 'factor_percent': 50, + 'repartition_type': 'tax', + 'use_in_tax_closing': True + }), + ], + }) + asset_account.tax_ids = non_deductible_tax + + # 1. Automatic creation + asset_account.create_asset = 'draft' + asset_account.asset_model_ids = self.account_asset_model_fixedassets + asset_account.multiple_assets_per_line = True + + vendor_bill_auto = self.env['account.move'].create({ + 'move_type': 'in_invoice', + 'invoice_date': '2020-01-01', + 'partner_id': self.partner_a.id, + 'invoice_line_ids': [Command.create({ + 'account_id': asset_account.id, + 'name': 'Asus Laptop', + 'price_unit': 1000.0, + 'quantity': 2, + 'tax_ids': [Command.set(non_deductible_tax.ids)], + })], + }) + vendor_bill_auto.action_post() + + new_assets_auto = vendor_bill_auto.asset_ids + self.assertEqual(len(new_assets_auto), 2) + self.assertEqual(new_assets_auto.mapped('original_value'), [1105.0, 1105.0]) + self.assertEqual(new_assets_auto.mapped('non_deductible_tax_value'), [105.0, 105.0]) + + # 2. Manual creation + asset_account.create_asset = 'no' + asset_account.asset_model_ids = None + asset_account.multiple_assets_per_line = False + + vendor_bill_manu = self.env['account.move'].create({ + 'move_type': 'in_invoice', + 'invoice_date': '2020-01-01', + 'partner_id': self.partner_a.id, + 'invoice_line_ids': [ + Command.create({ + 'account_id': asset_account.id, + 'name': 'Asus Laptop', + 'price_unit': 1000.0, + 'quantity': 2, + 'tax_ids': [Command.set(non_deductible_tax.ids)] + }), + Command.create({ + 'account_id': asset_account.id, + 'name': 'Lenovo Laptop', + 'price_unit': 500.0, + 'quantity': 3, + 'tax_ids': [Command.set(non_deductible_tax.ids)] + }), + ], + }) + vendor_bill_manu.action_post() + + # TOFIX: somewhere above this the field account.asset.asset_type is made + # dirty, but this field has to be flushed in a specific environment. + # This is because the field 'asset_type' is stored, computed and + # context-dependent, which explains why its value must be retrieved + # from the right environment. + self.env.flush_all() + + move_line_ids = vendor_bill_manu.mapped('line_ids').filtered(lambda x: x.name and 'Laptop' in x.name) + asset_form = Form(self.env['account.asset'].with_context( + default_original_move_line_ids=move_line_ids.ids, + )) + asset_form.original_move_line_ids = move_line_ids + asset_form.account_depreciation_expense_id = self.company_data['default_account_expense'] + + new_assets_manu = asset_form.save() + self.assertEqual(len(new_assets_manu), 1) + self.assertEqual(new_assets_manu.original_value, 3867.5) + self.assertEqual(new_assets_manu.non_deductible_tax_value, 367.5) + + def test_asset_degressive_01(self): + """ Check the computation of an asset with degressive method, + start at middle of the year + """ + asset = self.env['account.asset'].create({ + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': self.company_data['default_account_assets'].id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + 'name': 'Degressive', + 'acquisition_date': '2021-07-01', + 'prorata_computation_type': 'constant_periods', + 'original_value': 10000, + 'method_number': 5, + 'method_period': '12', + 'method': 'degressive', + 'method_progress_factor': 0.5, + }) + + asset.validate() + + self.assertEqual(asset.method_number + 1, len(asset.depreciation_move_ids)) + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda l: (l.date, l.id)), [{ + 'amount_total': 2500, + 'asset_remaining_value': 7500, + }, { + 'amount_total': 3750, + 'asset_remaining_value': 3750, + }, { + 'amount_total': 1875, + 'asset_remaining_value': 1875, + }, { + 'amount_total': 937.5, + 'asset_remaining_value': 937.5, + }, { + 'amount_total': 625.00, + 'asset_remaining_value': 312.50, + }, { + 'amount_total': 312.50, + 'asset_remaining_value': 0, + }]) + + def test_asset_degressive_02(self): + """ Check the computation of an asset with degressive method, + start at beginning of the year. + """ + asset = self.env['account.asset'].create({ + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': self.company_data['default_account_assets'].id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + 'name': 'Degressive', + 'acquisition_date': '2021-01-01', + 'original_value': 10000, + 'method_number': 5, + 'method_period': '12', + 'method': 'degressive', + 'method_progress_factor': 0.5, + }) + + asset.validate() + + self.assertEqual(asset.method_number, len(asset.depreciation_move_ids)) + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda l: (l.date, l.id)), [{ + 'amount_total': 5000, + 'asset_remaining_value': 5000, + }, { + 'amount_total': 2500, + 'asset_remaining_value': 2500, + }, { + 'amount_total': 1250, + 'asset_remaining_value': 1250, + }, { + 'amount_total': 625, + 'asset_remaining_value': 625, + }, { + 'amount_total': 625, + 'asset_remaining_value': 0, + }]) + + def test_asset_negative_01(self): + """ Check the computation of an asset with negative value. """ + asset = self.env['account.asset'].create({ + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': self.company_data['default_account_assets'].id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + 'name': 'Degressive Linear', + 'acquisition_date': '2021-07-01', + 'original_value': -10000, + 'method_number': 5, + 'method_period': '12', + 'method': 'linear', + }) + asset.prorata_computation_type = 'constant_periods' + + asset.validate() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda l: (l.date, l.id)), [{ + 'amount_total': 1000, + 'asset_remaining_value': -9000, + }, { + 'amount_total': 2000, + 'asset_remaining_value': -7000, + }, { + 'amount_total': 2000, + 'asset_remaining_value': -5000, + }, { + 'amount_total': 2000, + 'asset_remaining_value': -3000, + }, { + 'amount_total': 2000, + 'asset_remaining_value': -1000, + }, { + 'amount_total': 1000, + 'asset_remaining_value': 0, + }]) + + def test_asset_daily_computation_01(self): + """ Check the computation of an asset with daily_computation. """ + asset = self.env['account.asset'].create({ + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': self.company_data['default_account_assets'].id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + 'name': 'Degressive Linear', + 'acquisition_date': '2021-07-01', + 'prorata_computation_type': 'daily_computation', + 'original_value': 10000, + 'method_number': 5, + 'method_period': '12', + 'method': 'linear', + }) + + asset.validate() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda l: (l.date, l.id)), [{ + 'amount_total': 1007.67, + 'asset_remaining_value': 8992.33, + }, { + 'amount_total': 1998.90, + 'asset_remaining_value': 6993.43, + }, { + 'amount_total': 1998.91, + 'asset_remaining_value': 4994.52, + }, { + 'amount_total': 2004.38, + 'asset_remaining_value': 2990.14, + }, { + 'amount_total': 1998.90, + 'asset_remaining_value': 991.24, + }, { + 'amount_total': 991.24, + 'asset_remaining_value': 0, + }]) + + def test_decrement_book_value_with_negative_asset(self): + """ + Test the computation of book value and remaining value + when posting a depreciation move related with a negative asset + """ + depreciation_account = self.company_data['default_account_assets'].copy() + asset_model = self.env['account.asset'].create({ + 'name': 'test', + 'state': 'model', + 'active': True, + 'method': 'linear', + 'method_number': 5, + 'method_period': '1', + 'prorata_computation_type': 'constant_periods', + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': depreciation_account.id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_purchase'].id, + }) + + depreciation_account.can_create_asset = True + depreciation_account.create_asset = 'draft' + depreciation_account.asset_model_ids = asset_model + + refund = self.env['account.move'].create({ + 'move_type': 'in_refund', + 'partner_id': self.partner_a.id, + 'invoice_date': '2021-06-01', + 'invoice_line_ids': [Command.create({'name': 'refund', 'account_id': depreciation_account.id, 'price_unit': 500, 'tax_ids': False})], + }) + refund.action_post() + + self.assertTrue(refund.asset_ids) + + asset = refund.asset_ids + + self.assertEqual(asset.book_value, -refund.amount_total) + self.assertEqual(asset.value_residual, -refund.amount_total) + + asset.validate() + + self.assertEqual(len(asset.depreciation_move_ids.filtered(lambda m: m.state == 'posted')), 1) + self.assertEqual(asset.book_value, -400.0) + self.assertEqual(asset.value_residual, -400.0) + + def test_depreciation_schedule_report_with_negative_asset(self): + """ + Test the computation of depreciation schedule with negative asset + """ + asset = self.env['account.asset'].create({ + 'name': 'test', + 'original_value': -500, + 'method': 'linear', + 'method_number': 5, + 'method_period': '1', + 'acquisition_date': fields.Date.today() + relativedelta(months=-1), + 'prorata_computation_type': 'none', + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': self.company_data['default_account_assets'].id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + }) + + asset.validate() + + report = self.env.ref('odex30_account_asset.assets_report') + + options = self._generate_options(report, fields.Date.today() + relativedelta(months=-7, day=1), fields.Date.today() + relativedelta(months=-6, day=31)) + + expected_values_open_asset = [ + ("test", 0, 0, 500.0, -500.0, 0, 0, 100.0, -100.0, -400.0), + ] + + self.assertLinesValues(report._get_lines(options)[2:3], [0, 5, 6, 7, 8, 9, 10, 11, 12, 13], expected_values_open_asset, options) + + expense_account_copy = self.company_data['default_account_expense'].copy() + + disposal_action_view = self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'modify_action': 'dispose', + 'loss_account_id': expense_account_copy.id, + 'date': fields.Date.today() + }).sell_dispose() + + self.env['account.move'].browse(disposal_action_view['res_id']).action_post() + + expected_values_closed_asset = [ + ("test", 0, 500.0, 500.0, 0, 0, 500.0, 500.0, 0, 0), + ] + options = self._generate_options(report, fields.Date.today() + relativedelta(months=-7, day=1), fields.Date.today()) + self.assertLinesValues(report._get_lines(options)[2:3], [0, 5, 6, 7, 8, 9, 10, 11, 12, 13], expected_values_closed_asset, options) + + def test_depreciation_schedule_hierarchy(self): + # Remove previously existing assets. + assets = self.env['account.asset'].search([ + ('company_id', '=', self.env.company.id), + ('state', '!=', 'model'), + ]) + assets.state = 'draft' + assets.mapped('depreciation_move_ids').state = 'draft' + assets.unlink() + + # Create the account groups. + self.env['account.group'].create([ + {'name': 'Group 1', 'code_prefix_start': '1', 'code_prefix_end': '1'}, + {'name': 'Group 11', 'code_prefix_start': '11', 'code_prefix_end': '11'}, + {'name': 'Group 12', 'code_prefix_start': '12', 'code_prefix_end': '12'}, + ]) + + # Create the accounts. + account_a, account_a1, account_b, account_c, account_d, account_e = self.env['account.account'].create([ + {'code': '1100', 'name': 'Account A', 'account_type': 'asset_non_current'}, + {'code': '1110', 'name': 'Account A1', 'account_type': 'asset_non_current'}, + {'code': '1200', 'name': 'Account B', 'account_type': 'asset_non_current'}, + {'code': '1300', 'name': 'Account C', 'account_type': 'asset_non_current'}, + {'code': '1400', 'name': 'Account D', 'account_type': 'asset_non_current'}, + {'code': '9999', 'name': 'Account E', 'account_type': 'asset_non_current'}, + ]) + + # Create and validate the assets, and post the depreciation entries. + self.env['account.asset'].create([ + { + 'account_asset_id': account_id, + 'account_depreciation_id': account_id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + 'name': name, + 'acquisition_date': fields.Date.to_date('2020-07-01'), + 'original_value': original_value, + 'method': 'linear', + 'prorata_computation_type': 'none', + } + for account_id, name, original_value in [ + (account_a.id, 'ZenBook', 1250), + (account_a.id, 'ThinkBook', 1500), + (account_a1.id, 'XPS', 1750), + (account_b.id, 'MacBook', 2000), + (account_c.id, 'Aspire', 1600), + (account_d.id, 'Playstation', 550), + (account_e.id, 'Xbox', 500), + ] + ]).validate() + + # Configure the depreciation schedule report. + report = self.env.ref('odex30_account_asset.assets_report') + options = self._generate_options(report, '2022-01-01', '2022-12-31') + options['hierarchy'] = True + self.env.company.totals_below_sections = True + + # Generate and compare actual VS expected values. + lines = [ + { + 'name': line['name'], + 'level': line['level'], + 'book_value': line['columns'][-1]['name'] + } + for line in (report._get_lines(options)) + ] + + expected_values = [ + # pylint: disable=C0326 + {'name': '1 Group 1', 'level': 1, 'book_value': '$\xa06,920.00'}, + {'name': '11 Group 11', 'level': 2, 'book_value': '$\xa03,600.00'}, + {'name': '1100 Account A', 'level': 3, 'book_value': '$\xa02,200.00'}, + {'name': 'ZenBook', 'level': 4, 'book_value': '$\xa01,000.00'}, + {'name': 'ThinkBook', 'level': 4, 'book_value': '$\xa01,200.00'}, + {'name': 'Total 1100 Account A', 'level': 3, 'book_value': '$\xa02,200.00'}, + {'name': '1110 Account A1', 'level': 3, 'book_value': '$\xa01,400.00'}, + {'name': 'XPS', 'level': 4, 'book_value': '$\xa01,400.00'}, + {'name': 'Total 1110 Account A1', 'level': 3, 'book_value': '$\xa01,400.00'}, + {'name': 'Total 11 Group 11', 'level': 2, 'book_value': '$\xa03,600.00'}, + {'name': '12 Group 12', 'level': 2, 'book_value': '$\xa01,600.00'}, + {'name': '1200 Account B', 'level': 3, 'book_value': '$\xa01,600.00'}, + {'name': 'MacBook', 'level': 4, 'book_value': '$\xa01,600.00'}, + {'name': 'Total 1200 Account B', 'level': 3, 'book_value': '$\xa01,600.00'}, + {'name': 'Total 12 Group 12', 'level': 2, 'book_value': '$\xa01,600.00'}, + {'name': '1300 Account C', 'level': 2, 'book_value': '$\xa01,280.00'}, + {'name': 'Aspire', 'level': 3, 'book_value': '$\xa01,280.00'}, + {'name': 'Total 1300 Account C', 'level': 2, 'book_value': '$\xa01,280.00'}, + {'name': '1400 Account D', 'level': 2, 'book_value': '$\xa0440.00'}, + {'name': 'Playstation', 'level': 3, 'book_value': '$\xa0440.00'}, + {'name': 'Total 1400 Account D', 'level': 2, 'book_value': '$\xa0440.00'}, + {'name': 'Total 1 Group 1', 'level': 1, 'book_value': '$\xa06,920.00'}, + {'name': '(No Group)', 'level': 1, 'book_value': '$\xa0400.00'}, + {'name': '9999 Account E', 'level': 2, 'book_value': '$\xa0400.00'}, + {'name': 'Xbox', 'level': 3, 'book_value': '$\xa0400.00'}, + {'name': 'Total 9999 Account E', 'level': 2, 'book_value': '$\xa0400.00'}, + {'name': 'Total (No Group)', 'level': 1, 'book_value': '$\xa0400.00'}, + {'name': 'Total', 'level': 1, 'book_value': '$\xa07,320.00'}, + ] + + self.assertEqual(len(lines), len(expected_values)) + self.assertEqual(lines, expected_values) + + def test_depreciation_schedule_disposal_move_unposted(self): + """ + Test the computation of values when disposing an asset, and the difference if the disposal move is posted + """ + asset = self.env['account.asset'].create({ + 'name': 'test asset', + 'method': 'linear', + 'original_value': 1000, + 'method_number': 5, + 'method_period': '12', + 'acquisition_date': fields.Date.today() + relativedelta(years=-2, month=1, day=1), + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': self.company_data['default_account_assets'].id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + }) + asset.validate() + + expense_account_copy = self.company_data['default_account_expense'].copy() + + disposal_action_view = self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'modify_action': 'dispose', + 'loss_account_id': expense_account_copy.id, + 'date': fields.Date.today() + relativedelta(days=-1) + }).sell_dispose() + + report = self.env.ref('odex30_account_asset.assets_report') + options = self._generate_options(report, '2021-01-01', '2021-12-31') + + # The disposal move is in draft and should not be considered (depreciation and book value) + # Values are: name, assets_before, assets+, assets-, assets_after, depreciation_before, depreciation+, depreciation-, depreciation_after, book_value + expected_values_asset_disposal_unposted = [ + ("test asset", 1000.0, 0.0, 0, 1000.0, 400.0, 100.0, 0.0, 500.0, 500.0), + ] + + self.assertLinesValues(report._get_lines(options)[2:3], [0, 5, 6, 7, 8, 9, 10, 11, 12, 13], expected_values_asset_disposal_unposted, options) + + self.env['account.move'].browse(disposal_action_view.get('res_id')).action_post() + + expected_values_asset_disposal_posted = [ + ("test asset", 1000.0, 0.0, 1000.0, 0.0, 400.0, 100.0, 500.0, 0.0, 0.0), + ] + + self.assertLinesValues(report._get_lines(options)[2:3], [0, 5, 6, 7, 8, 9, 10, 11, 12, 13], expected_values_asset_disposal_posted, options) + + def test_depreciation_schedule_disposal_move_unposted_with_non_depreciable_value(self): + """ + Test the computation of values when disposing an asset with non-depreciable value, and the difference if the disposal move is posted + """ + asset = self.env['account.asset'].create({ + 'name': 'test asset', + 'method': 'linear', + 'original_value': 10000, + 'salvage_value': 8000, + 'method_number': 24, + 'method_period': '1', + 'acquisition_date': fields.Date.today() + relativedelta(months=-1, day=1), + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': self.company_data['default_account_assets'].id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + }) + asset.validate() + + report = self.env.ref('odex30_account_asset.assets_report') + + options = self._generate_options(report, '2021-07-01', '2021-07-31') + + expected_values_asset_disposal_unposted = [ + ("test asset", 10000.0, 0.0, 0.0, 10000.0, 83.33, 0.0, 0.0, 83.33, 9916.67), + ] + + self.assertLinesValues(report._get_lines(options)[2:3], [0, 5, 6, 7, 8, 9, 10, 11, 12, 13], expected_values_asset_disposal_unposted, options) + + expense_account_copy = self.company_data['default_account_expense'].copy() + + disposal_action_view = self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'modify_action': 'dispose', + 'loss_account_id': expense_account_copy.id, + 'date': fields.Date.today() + }).sell_dispose() + + expected_values_asset_disposal_unposted = [ + ("test asset", 10000.0, 0.0, 0.0, 10000.0, 83.33, 2.69, 0.0, 86.02, 9913.98), + ] + + self.assertLinesValues(report._get_lines(options)[2:3], [0, 5, 6, 7, 8, 9, 10, 11, 12, 13], expected_values_asset_disposal_unposted, options) + + self.env['account.move'].browse(disposal_action_view['res_id']).action_post() + + expected_values_asset_disposal_posted = [ + ("test asset", 10000.0, 0.0, 10000.0, 0.0, 83.33, 2.69, 86.02, 0.0, 0.0), + ] + + self.assertLinesValues(report._get_lines(options)[2:3], [0, 5, 6, 7, 8, 9, 10, 11, 12, 13], expected_values_asset_disposal_posted, options) + + def test_asset_analytic_on_lines(self): + CEO_car = self.env['account.asset'].create({ + 'salvage_value': 2000.0, + 'state': 'open', + 'method_period': '12', + 'method_number': 5, + 'name': "CEO's Car", + 'original_value': 12000.0, + 'model_id': self.account_asset_model_fixedassets.id, + 'acquisition_date': '2020-01-01', + }) + CEO_car._onchange_model_id() + CEO_car.method_number = 5 + CEO_car.analytic_distribution = {self.analytic_account.id: 100} + + # In order to test the process of Account Asset, I perform a action to confirm Account Asset. + CEO_car.validate() + + for move in CEO_car.depreciation_move_ids: + self.assertRecordValues(move.line_ids, [ + { + 'analytic_distribution': {str(self.analytic_account.id): 100}, + }, + { + 'analytic_distribution': {str(self.analytic_account.id): 100}, + }, + ]) + + CEO_car.analytic_distribution = {str(self.analytic_account.id): 200} + + # Only draft moves should have a changed analytic distribution + for move in CEO_car.depreciation_move_ids.filtered(lambda m: m.state == 'posted'): + self.assertRecordValues(move.line_ids, [ + { + 'analytic_distribution': {str(self.analytic_account.id): 100}, + }, + { + 'analytic_distribution': {str(self.analytic_account.id): 100}, + }, + ]) + + for move in CEO_car.depreciation_move_ids.filtered(lambda m: m.state == 'draft'): + self.assertRecordValues(move.line_ids, [ + { + 'analytic_distribution': {str(self.analytic_account.id): 200}, + }, + { + 'analytic_distribution': {str(self.analytic_account.id): 200}, + }, + ]) + + + def test_asset_analytic_filter(self): + """ + Test that the analytic filter works correctly. + """ + truck_b = self.truck.copy() + truck_b.acquisition_date = self.truck.acquisition_date + truck_b.validate() + self.truck.analytic_distribution = {self.analytic_account.id: 100} + self.env['account.move']._autopost_draft_entries() + + self.env.company.totals_below_sections = False + report = self.env.ref('odex30_account_asset.assets_report') + + # No prefix group, no group by account + options = self._generate_options(report, '2021-01-01', '2021-12-31', default_options={'assets_grouping_field': 'none', 'unfold_all': False}) + + # without Analytic Filter + self.assertLinesValues( + # pylint: disable=C0326 + report._get_lines(options), + # Name Assets/start Assets/+ Assets/- Assets/end Depreciation/start Depreciation/+ Depreciation/- Depreciation/end Book Value + [ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13], + [ + ('truck', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500,), + ('truck (copy)', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500,), + ('Total', 20000, 0, 0, 20000, 9000, 0, 0, 9000, 11000,), + ], + options + ) + # with Analytic Filter + options['analytic_accounts'] = [self.analytic_account.id] + self.assertLinesValues( + # pylint: disable=C0326 + report._get_lines(options), + # Name Assets/start Assets/+ Assets/- Assets/end Depreciation/start Depreciation/+ Depreciation/- Depreciation/end Book Value + [ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13], + [ + ('truck', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500,), + ('Total', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500,), + ], + options + ) + + def test_asset_analytic_groupby(self): + """ + Test that the analytic groupby works correctly. + """ + truck_b = self.truck.copy() + truck_b.acquisition_date = self.truck.acquisition_date + truck_b.validate() + self.truck.analytic_distribution = {self.analytic_account.id: 100} + self.env['account.move']._autopost_draft_entries() + + self.env.company.totals_below_sections = False + report = self.env.ref('odex30_account_asset.assets_report') + report.filter_analytic_groupby = True + + # No prefix group, no group by account + options = self._generate_options(report, '2021-01-01', '2021-12-31', default_options={'assets_grouping_field': 'none', 'unfold_all': False}) + + # without Analytic Groupby + self.assertLinesValues( + # pylint: disable=C0326 + report._get_lines(options), + # Name Assets/start Assets/+ Assets/- Assets/end Depreciation/start Depreciation/+ Depreciation/- Depreciation/end Book Value + [ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13], + [ + ('truck', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500,), + ('truck (copy)', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500,), + ('Total', 20000, 0, 0, 20000, 9000, 0, 0, 9000, 11000,), + ], + options + ) + # with Analytic Groupby + options = self._generate_options(report, '2021-01-01', '2021-12-31', default_options={ + 'assets_grouping_field': 'none', + 'unfold_all': False, + 'analytic_accounts_groupby': [self.analytic_account.id], + }) + self.assertLinesValues( + # pylint: disable=C0326 + report._get_lines(options), + # Group | ANALYTIC | | ALL | + # Name Assets/start Assets/+ Assets/- Assets/end Depreciation/start Depreciation/+ Depreciation/- Depreciation/end Book Value Assets/start Assets/+ Assets/- Assets/end Depreciation/start Depreciation/+ Depreciation/- Depreciation/end Book Value + [ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20, 21, 22, 23, 24, 25, 26], + [ + ('truck', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500, 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500), + ('truck (copy)', '', '', '', '', '', '', '', '', '', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500), + ('Total', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500, 20000, 0, 0, 20000, 9000, 0, 0, 9000, 11000), + ], + options + ) + + def test_depreciation_schedule_report_first_depreciation(self): + """Test that the depreciation schedule report displays the correct first depreciation date.""" + # check that the truck's first depreciation date is correct: + # the truck has a yearly linear depreciation and it's prorate_date is 2015-01-01 + # therefore we expect it's first depreciation date to be the last day of 2015 + + today = fields.Date.today() + report = self.env.ref('odex30_account_asset.assets_report') + options = self._generate_options(report, today + relativedelta(years=-6, month=1, day=1), today + relativedelta(years=+4, month=12, day=31)) + lines = report._get_lines({**options, **{'unfold_all': False, 'all_entries': True}}) + + self.assertEqual(lines[1]['columns'][1]['name'], '12/31/2015') + + def test_asset_modify_sell_multicurrency(self): + """ Test that the closing invoice's currency is taken into account when selling an asset. """ + closing_invoice = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'currency_id': self.other_currency.id, + 'invoice_line_ids': [Command.create({'price_unit': 5000})] + }) + self.env['asset.modify'].create({ + 'asset_id': self.truck.id, + 'invoice_line_ids': closing_invoice.invoice_line_ids, + 'date': fields.Date.today() + relativedelta(months=-6, days=-1), + 'modify_action': 'sell', + }).sell_dispose() + + closing_move = self.truck.depreciation_move_ids.filtered(lambda l: l.state == 'draft') + + self.assertRecordValues(closing_move.line_ids, [{ + 'debit': 0, + 'credit': 10000, + 'account_id': self.truck.account_asset_id.id, + }, { + 'debit': 4500, + 'credit': 0, + 'account_id': self.truck.account_depreciation_id.id, + }, { + 'debit': 2500, + 'credit': 0, + 'account_id': closing_invoice.invoice_line_ids.account_id.id, + }, { + 'debit': 3000, + 'credit': 0, + 'account_id': self.env.company.loss_account_id.id, + }]) + + def test_depreciation_schedule_prefix_groups(self): + asset_group = self.env['account.asset.group'].create({'name': 'Odoo Office'}) + for i in range(1, 3): + asset = self.env['account.asset'].create({ + 'method_period': '12', + 'method_number': 4, + 'name': f"Asset {i}", + 'original_value': i * 100.0, + 'acquisition_date': fields.Date.today() - relativedelta(years=3), + 'account_asset_id': self.company_data['default_account_assets'].id, + 'asset_group_id': asset_group.id, + 'account_depreciation_id': self.company_data['default_account_assets'].copy().id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + 'prorata_computation_type': 'none', + }) + asset.validate() + + self.env['account.move']._autopost_draft_entries() + + self.env.company.totals_below_sections = False + report = self.env.ref('odex30_account_asset.assets_report') + + # No prefix group, no group by account + options = self._generate_options(report, '2021-01-01', '2021-12-31', default_options={'assets_grouping_field': 'none'}) + self.assertLinesValues( + # pylint: disable=C0326 + report._get_lines(options), + # Name Assets/start Assets/+ Assets/- Assets/end Depreciation/start Depreciation/+ Depreciation/- Depreciation/end Book Value + [ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13], + [ + ('truck', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500,), + ('Asset 1', 100, 0, 0, 100, 75, 0, 0, 75, 25,), + ('Asset 2', 200, 0, 0, 200, 150, 0, 0, 150, 50,), + ('Total', 10300, 0, 0, 10300, 4725, 0, 0, 4725, 5575,), + ], + options, + ) + + # No prefix group, group by account + options = self._generate_options(report, '2021-01-01', '2021-12-31', default_options={'assets_grouping_field': 'account_id'}) + options['unfold_all'] = True + self.assertLinesValues( + # pylint: disable=C0326 + report._get_lines(options), + # Name Assets/start Assets/+ Assets/- Assets/end Depreciation/start Depreciation/+ Depreciation/- Depreciation/end Book Value + [ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13], + [ + ('151000 Fixed Asset', 10300, 0, 0, 10300, 4725, 0, 0, 4725, 5575,), + ('truck', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500,), + ('Asset 1', 100, 0, 0, 100, 75, 0, 0, 75, 25,), + ('Asset 2', 200, 0, 0, 200, 150, 0, 0, 150, 50,), + ('Total', 10300, 0, 0, 10300, 4725, 0, 0, 4725, 5575,), + ], + options, + ) + + report.prefix_groups_threshold = 3 + # Prefix group, no group by account + options = self._generate_options(report, '2021-01-01', '2021-12-31', default_options={'assets_grouping_field': 'none', 'unfold_all': True}) + options['unfold_all'] = True + self.assertLinesValues( + # pylint: disable=C0326 + report._get_lines(options), + # Name Assets/start Assets/+ Assets/- Assets/end Depreciation/start Depreciation/+ Depreciation/- Depreciation/end Book Value + [ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13], + [ + ('A (2 lines)', 300, 0, 0, 300, 225, 0, 0, 225, 75,), + ('Asset 1', 100, 0, 0, 100, 75, 0, 0, 75, 25,), + ('Asset 2', 200, 0, 0, 200, 150, 0, 0, 150, 50,), + ('T (1 line)', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500,), + ('truck', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500,), + ('Total', 10300, 0, 0, 10300, 4725, 0, 0, 4725, 5575,), + ], + options, + ) + + # Prefix group, group by account + options = self._generate_options(report, '2021-01-01', '2021-12-31', default_options={'assets_grouping_field': 'account_id', 'unfold_all': True}) + options['unfold_all'] = True + self.assertLinesValues( + # pylint: disable=C0326 + report._get_lines(options), + # Name Assets/start Assets/+ Assets/- Assets/end Depreciation/start Depreciation/+ Depreciation/- Depreciation/end Book Value + [ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13], + [ + ('151000 Fixed Asset', 10300, 0, 0, 10300, 4725, 0, 0, 4725, 5575,), + ('A (2 lines)', 300, 0, 0, 300, 225, 0, 0, 225, 75,), + ('Asset 1', 100, 0, 0, 100, 75, 0, 0, 75, 25,), + ('Asset 2', 200, 0, 0, 200, 150, 0, 0, 150, 50,), + ('T (1 line)', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500,), + ('truck', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500,), + ('Total', 10300, 0, 0, 10300, 4725, 0, 0, 4725, 5575,), + ], + options, + ) + + # No prefix group, group by asset group + options = self._generate_options(report, '2021-01-01', '2021-12-31', default_options={'assets_grouping_field': 'asset_group_id'}) + options['unfold_all'] = True + self.assertLinesValues( + # pylint: disable=C0326 + report._get_lines(options), + # Name Assets/start Assets/+ Assets/- Assets/end Depreciation/start Depreciation/+ Depreciation/- Depreciation/end Book Value + [ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13], + [ + ('(No Asset Group)', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500), + ('truck', 10000, 0, 0, 10000, 4500, 0, 0, 4500, 5500), + ('Odoo Office', 300, 0, 0, 300, 225, 0, 0, 225, 75), + ('Asset 1', 100, 0, 0, 100, 75, 0, 0, 75, 25), + ('Asset 2', 200, 0, 0, 200, 150, 0, 0, 150, 50), + ('Total', 10300, 0, 0, 10300, 4725, 0, 0, 4725, 5575), + ], + options, + ) + + def test_archive_asset_model(self): + """ Test that we can archive an asset model. """ + self.account_asset_model_fixedassets.active = False + self.assertFalse(self.account_asset_model_fixedassets.active) + + def test_asset_increase_with_lock_year(self): + """ Test the dates at which the moves are posted even with increase, with lock date""" + self.company_data['company'].fiscalyear_lock_date = fields.Date.to_date('2021-03-01') + + asset = self.env['account.asset'].create({ + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': self.company_data['default_account_assets'].copy().id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + 'name': 'Car', + 'acquisition_date': fields.Date.today() + relativedelta(months=-6), + 'original_value': 12000, + 'method_number': 12, + 'method_period': '1', + 'method': 'linear', + }) + + asset.validate() + + self.assertRecordValues( + asset.depreciation_move_ids.sorted(lambda l: (l.date, l.id)), + [ + {'date': fields.Date.to_date('2021-03-31')}, + {'date': fields.Date.to_date('2021-03-31')}, + {'date': fields.Date.to_date('2021-03-31')}, + {'date': fields.Date.to_date('2021-04-30')}, + {'date': fields.Date.to_date('2021-05-31')}, + {'date': fields.Date.to_date('2021-06-30')}, + {'date': fields.Date.to_date('2021-07-31')}, + {'date': fields.Date.to_date('2021-08-31')}, + {'date': fields.Date.to_date('2021-09-30')}, + {'date': fields.Date.to_date('2021-10-31')}, + {'date': fields.Date.to_date('2021-11-30')}, + {'date': fields.Date.to_date('2021-12-31')} + ] + ) + + self.assertEqual(asset.book_value, 6000) + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test increase with lock date', + 'value_residual': 8000.0, + 'date': fields.Date.today() + relativedelta(days=-1), + "account_asset_counterpart_id": self.assert_counterpart_account_id, + }).modify() + + self.assertEqual(asset.book_value, 8000) + + self.assertRecordValues( + asset.children_ids.depreciation_move_ids.sorted(lambda dep: (dep.date, dep.id)), + [ + {'date': fields.Date.to_date('2021-07-31'), 'depreciation_value': 333.33}, + {'date': fields.Date.to_date('2021-08-31'), 'depreciation_value': 333.34}, + {'date': fields.Date.to_date('2021-09-30'), 'depreciation_value': 333.33}, + {'date': fields.Date.to_date('2021-10-31'), 'depreciation_value': 333.33}, + {'date': fields.Date.to_date('2021-11-30'), 'depreciation_value': 333.34}, + {'date': fields.Date.to_date('2021-12-31'), 'depreciation_value': 333.33} + ] + ) + + def test_asset_decrease_with_lock_year(self): + """ Test the dates and values for the moves that are posted with decrease and lock date""" + self.company_data['company'].fiscalyear_lock_date = fields.Date.to_date('2021-03-01') + + asset = self.env['account.asset'].create({ + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': self.company_data['default_account_assets'].copy().id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + 'name': 'Car', + 'acquisition_date': fields.Date.today() + relativedelta(months=-6), + 'original_value': 12000, + 'method_number': 12, + 'method_period': '1', + 'method': 'linear', + }) + + asset.validate() + + self.assertEqual(asset.book_value, 6000) + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test decrease with lock date', + 'value_residual': 4000.0, + 'date': fields.Date.today() + relativedelta(days=-1), + "account_asset_counterpart_id": self.assert_counterpart_account_id, + }).modify() + + self.assertEqual(asset.book_value, 4000) + + self.assertRecordValues( + asset.depreciation_move_ids.sorted(lambda dep: (dep.date, dep.id)), + [ + {'date': fields.Date.to_date('2021-03-31'), 'depreciation_value': 1000}, + {'date': fields.Date.to_date('2021-03-31'), 'depreciation_value': 1000}, + {'date': fields.Date.to_date('2021-03-31'), 'depreciation_value': 1000}, + {'date': fields.Date.to_date('2021-04-30'), 'depreciation_value': 1000}, + {'date': fields.Date.to_date('2021-05-31'), 'depreciation_value': 1000}, + {'date': fields.Date.to_date('2021-06-30'), 'depreciation_value': 1000}, + {'date': fields.Date.to_date('2021-06-30'), 'depreciation_value': 2000}, + {'date': fields.Date.to_date('2021-07-31'), 'depreciation_value': 666.67}, + {'date': fields.Date.to_date('2021-08-31'), 'depreciation_value': 666.66}, + {'date': fields.Date.to_date('2021-09-30'), 'depreciation_value': 666.67}, + {'date': fields.Date.to_date('2021-10-31'), 'depreciation_value': 666.67}, + {'date': fields.Date.to_date('2021-11-30'), 'depreciation_value': 666.66}, + {'date': fields.Date.to_date('2021-12-31'), 'depreciation_value': 666.67} + ] + ) + + def test_asset_onchange_model(self): + """ + Test the changes of account_asset_id when changing asset models + """ + account_asset = self.company_data['default_account_assets'].copy() + asset_model = self.env['account.asset'].create({ + 'name': 'test model', + 'state': 'model', + 'active': True, + 'method': 'linear', + 'method_number': 5, + 'method_period': '1', + 'prorata_computation_type': 'none', + 'account_depreciation_id': self.company_data['default_account_assets'].id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'account_asset_id': account_asset.id, + 'journal_id': self.company_data['default_journal_misc'].id, + }) + + asset_model_with_account = self.env['account.asset'].create({ + 'name': 'test model with account', + 'state': 'model', + 'active': True, + 'method': 'linear', + 'method_number': 5, + 'method_period': '1', + 'prorata_computation_type': 'none', + 'account_depreciation_id': self.company_data['default_account_assets'].id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + }) + + asset_form = Form(self.env['account.asset']) + asset_form.name = "Test Asset" + asset_form.original_value = 10000 + asset_form.model_id = asset_model + + self.assertEqual(asset_form.account_asset_id, account_asset, "The account_asset_id should be the one from the model") + + asset_form.model_id = asset_model_with_account + self.assertEqual(asset_form.account_asset_id, self.company_data['default_account_assets'], "The account_asset_id should be computed from the depreciation account from the model") + + other_account_on_bill = self.company_data['default_account_assets'].copy() + other_account_on_bill.create_asset = 'draft' + other_account_on_bill.asset_model_ids = asset_model + invoice = self.env['account.move'].create({ + 'move_type': 'in_invoice', + 'invoice_date': '2020-12-31', + 'partner_id': self.partner_a.id, + 'invoice_line_ids': [ + (0, 0, { + 'name': 'A beautiful small bomb', + 'account_id': other_account_on_bill.id, + 'price_unit': 200.0, + 'quantity': 1, + }), + ], + }) + invoice.action_post() + + self.assertEqual(invoice.asset_ids.account_asset_id, other_account_on_bill, + "The account should be the one from the bill, not the model") + + asset_form = Form(invoice.asset_ids) + asset_form.model_id = asset_model + + self.assertEqual(asset_form.account_asset_id, other_account_on_bill, "We keep the account from the bill") + + def test_asset_reevaluation_degressive_linear(self): + """ Tests the reevaluation of an asset in degressive_then_linear with a gross increase""" + asset = self.env['account.asset'].create({ + 'method_period': '12', + 'method_number': 5, + 'name': "Car with purple sticker", + 'original_value': 10000.0, + 'acquisition_date': fields.Date.today() - relativedelta(years=2), + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': self.company_data['default_account_assets'].copy().id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + 'prorata_computation_type': 'none', + 'method': 'degressive_then_linear', + 'method_progress_factor': 0.4, + }) + asset.validate() + self.assertRecordValues(asset.depreciation_move_ids, [{ + 'depreciation_value': 4000, + 'asset_remaining_value': 6000, + 'state': 'posted', + }, { + 'depreciation_value': 2400, + 'asset_remaining_value': 3600, + 'state': 'posted', + }, { + 'depreciation_value': 2000, + 'asset_remaining_value': 1600, + 'state': 'draft', + }, { + 'depreciation_value': 1600, + 'asset_remaining_value': 0, + 'state': 'draft', + }]) + self.env['asset.modify'].create({ + 'name': "Inflation made it take 20%!", + 'date': fields.Date.today() + relativedelta(months=-6, days=-1), + 'asset_id': asset.id, + 'value_residual': 5600, + "account_asset_counterpart_id": self.assert_counterpart_account_id, + }).modify() + self.assertRecordValues(asset.children_ids[0].depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [{ + # (2000 + 2000*6400/3600) / 5 + 'depreciation_value': 1111.11, + 'asset_remaining_value': 888.89, + 'state': 'draft', + }, { + 'depreciation_value': 888.89, + 'asset_remaining_value': 0, + 'state': 'draft', + }]) + + def test_asset_move_type(self): + """ Test the field asset_move_type set on account.move describing the + relation that a move can have towards an asset + """ + asset_account_id = self.company_data['default_account_assets'].id + + bill = self.env['account.move'].create([ + { + 'move_type': 'in_invoice', + 'invoice_date': fields.Date.today() + relativedelta(months=-6, days=-1), + 'date': fields.Date.today() + relativedelta(months=-6, days=-1), + 'partner_id': self.partner_a.id, + 'invoice_line_ids': [Command.create({ + 'name': 'Truck', + 'account_id': asset_account_id, + 'quantity': 1.0, + 'price_unit': 1000.0, + 'tax_ids': [Command.set(self.company_data['default_tax_sale'].ids)], + })], + }, + ]) + bill.action_post() + asset_line = bill.line_ids.filtered(lambda x: x.account_id.id == asset_account_id) + asset_form = Form(self.env['account.asset'].with_context(default_original_move_line_ids=asset_line.ids)) + asset_form.original_move_line_ids = asset_line + asset_form.account_depreciation_expense_id = self.company_data['default_account_expense'] + car = asset_form.save() + car.validate() + + # All depreciation move must be defined as depreciation + self.assertTrue(all(car.depreciation_move_ids.mapped(lambda m: m.asset_move_type == 'depreciation'))) + + # Negative revaluation + self.env['asset.modify'].create({ + 'name': 'Little scratch :(', + 'asset_id': car.id, + 'value_residual': car.book_value - 150, + 'date': fields.Date.today(), + }).modify() + + # Ensure that the added depreciation moves are one 'depreciation' and the other is 'negative_revaluation' + added_move_on_revaluation = car.depreciation_move_ids.filtered(lambda m: m.date == fields.Date.today()) + self.assertRecordValues(added_move_on_revaluation.sorted(lambda mv: mv.id), [ + {'asset_move_type': 'depreciation'}, + {'asset_move_type': 'negative_revaluation'} + ]) + + # Sell + closing_invoice = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'invoice_line_ids': [Command.create( + {'price_unit': car.book_value + 100} # selling price: 849.46, net_gain_on_sale: 100.45 + )] + }) + + self.env['asset.modify'].create({ + 'asset_id': car.id, + 'modify_action': 'sell', + 'invoice_line_ids': closing_invoice.invoice_line_ids, + 'date': fields.Date.today(), + }).sell_dispose() + selling_move = car.depreciation_move_ids.filtered(lambda l: l.state == 'draft') + selling_move.action_post() + + # Ensure that the added depreciation moves are one 'depreciation' and the other is 'sale' + added_move_on_sale = car.depreciation_move_ids.filtered(lambda m: m.date == fields.Date.today()) - added_move_on_revaluation + self.assertTrue(added_move_on_sale.asset_move_type == 'sale') + self.assertEqual(car.net_gain_on_sale, 100) + + # Create new asset to test positive revaluation and disposal + new_car = car.copy() + new_car.validate() + + # Positive revaluation + self.env['asset.modify'].create({ + 'name': 'New beautiful sticker :D', + 'asset_id': new_car.id, + 'value_residual': new_car.book_value + 50, + 'salvage_value': 0, + 'date': fields.Date.today(), + "account_asset_counterpart_id": self.assert_counterpart_account_id, + }).modify() + + self.assertEqual( + new_car.children_ids.original_move_line_ids.move_id.asset_move_type, + 'positive_revaluation', + "the original move of the child asset is set as 'positive_revaluation'" + ) + + disposal_action_view = self.env['asset.modify'].create({ + 'asset_id': new_car.id, + 'modify_action': 'dispose', + 'date': fields.Date.today() + }).sell_dispose() + + self.env['account.move'].browse(disposal_action_view['res_id']).action_post() + self.assertEqual(self.env['account.move'].browse(disposal_action_view['res_id']).asset_move_type, 'disposal') + + def test_asset_already_depreciated(self): + asset = self.env['account.asset'].create({ + 'method_period': '12', + 'method_number': 5, + 'name': "Car with purple sticker", + 'original_value': 10000.0, + 'acquisition_date': fields.Date.today() - relativedelta(years=1), + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': self.company_data['default_account_assets'].copy().id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + 'prorata_computation_type': 'none', + 'already_depreciated_amount_import': 3000, + }) + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'date': fields.Date.today() - relativedelta(days=1), + 'name': 'Test reason', + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids, [{ + 'depreciation_value': 1000, + 'date': fields.Date.to_date('2021-12-31'), + }, { + 'depreciation_value': 2000, + 'date': fields.Date.to_date('2022-12-31'), + }, { + 'depreciation_value': 2000, + 'date': fields.Date.to_date('2023-12-31'), + }, { + 'depreciation_value': 2000, + 'date': fields.Date.to_date('2024-12-31'), + }, + ]) + + fully_depreciated_asset = self.env['account.asset'].create({ + 'method_period': '12', + 'method_number': 5, + 'name': "Car with purple sticker", + 'original_value': 10000.0, + 'acquisition_date': fields.Date.today() - relativedelta(years=2), + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': self.company_data['default_account_assets'].copy().id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + 'prorata_computation_type': 'none', + 'salvage_value': 4000, + 'already_depreciated_amount_import': 6000, + }) + fully_depreciated_asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': fully_depreciated_asset.id, + 'date': fields.Date.today(), + 'modify_action': 'dispose', + }).sell_dispose() + self.assertEqual(len(fully_depreciated_asset.depreciation_move_ids), 1, "Only the disposal should be created") + + def test_asset_acquisition_date_from_bill(self): + """Test that the invoice date is used as acquisition date instead of date""" + self.company_data['default_account_assets'].create_asset = 'draft' + self.company_data['default_account_assets'].asset_model_ids = self.account_asset_model_fixedassets + + bill = self.env['account.move'].with_context(asset_type='purchase').create({ + 'move_type': 'in_invoice', + 'partner_id': self.partner_a.id, + 'date': '2020-06-15', + 'invoice_date': '2020-06-01', + 'invoice_line_ids': [Command.create({ + 'name': 'Insurance claim', + 'account_id': self.company_data['default_account_assets'].id, + 'price_unit': 450, + 'quantity': 1, + })], + }) + bill.action_post() + asset = bill.asset_ids + self.assertEqual(asset.acquisition_date, bill.invoice_date) + + def test_asset_write_multi_company(self): + assets = self.env['account.asset'].create([ + { + 'company_id': company_data['company'].id, + 'name': 'test asset', + } for company_data in [self.company_data, self.company_data_2] + ]) + self.assertEqual(assets[0].company_id, self.company_data['company']) + self.assertEqual(assets[1].company_id, self.company_data_2['company']) + assets.validate() + + def test_depreciation_moves_company_with_sub_company(self): + """The depreciation moves should have the company of the asset, even in multicompany setup""" + company = self.env.company + branch_x = self.env['res.company'].create({ + 'name': 'Branch X', + 'country_id': company.country_id.id, + 'parent_id': company.id, + }) + + asset_vals = { + 'method_period': '12', + 'method_number': 5, + 'name': "Car with purple sticker", + 'original_value': 10000.0, + 'acquisition_date': fields.Date.today() - relativedelta(years=1), + 'account_asset_id': self.company_data['default_account_assets'].id, + 'account_depreciation_id': self.company_data['default_account_assets'].copy().id, + 'account_depreciation_expense_id': self.company_data['default_account_expense'].id, + 'journal_id': self.company_data['default_journal_misc'].id, + } + + setup_list = [ + {'company_ids': (company + branch_x).ids, 'company_id': branch_x.id}, + {'company_ids': branch_x.ids, 'company_id': branch_x.id}, + {'company_ids': (company + branch_x).ids, 'company_id': company.id}, + {'company_ids': company.ids, 'company_id': company.id}, + ] + + expected_vals_list = [branch_x, branch_x, company, company] + + for setup, expected in zip(setup_list, expected_vals_list): + with self.subTest(setup=setup, expected_company=expected): + self.env.user.write({ + 'company_ids': [Command.set(setup['company_ids'])], + 'company_id': setup['company_id'], + }) + asset = self.env['account.asset'].create(asset_vals) + asset.compute_depreciation_board() + self.assertEqual(asset.depreciation_move_ids.mapped('company_id'), expected) + + def test_multiple_asset_models_with_branches(self): + """Check that asset models are not shared between siblings, only with ancestors.""" + + branch_a = self.setup_other_company(name='Test Branch A', parent_id=self.company_data['company'].id) + asset_model_a = self.account_asset_model_fixedassets.copy() + asset_model_a.company_id = branch_a['company'] + + branch_b = self.setup_other_company(name='Test Branch B', parent_id=self.company_data['company'].id) + asset_model_b = self.account_asset_model_fixedassets.copy() + asset_model_b.company_id = branch_b['company'] + + # We need to set both branch's asset models on the parent company's asset account. + self.company_data['default_account_assets'].asset_model_ids = asset_model_a + asset_model_b + self.company_data['default_account_assets'].create_asset = 'draft' + + vendor_bill = self.env['account.move'].with_company(branch_a['company']).create({ + 'move_type': 'in_invoice', + 'partner_id': self.partner_a.id, + 'invoice_date': fields.Date.today(), + 'invoice_line_ids': [Command.create({ + 'name': 'Very little red car', + # Make sure the bill uses the asset account with both asset models. + 'account_id': self.company_data['default_account_assets'].id, + 'price_unit': 1000, + 'quantity': 1, + })], + }) + vendor_bill.action_post() + + self.assertEqual(len(vendor_bill.asset_ids), 1, "Only one asset should have been created.") + self.assertEqual(vendor_bill.asset_ids.company_id, branch_a['company'], f"The asset should have been created on company: {branch_a['company'].name}") diff --git a/dev_odex30_accounting/odex30_account_asset/tests/test_board_compute.py b/dev_odex30_accounting/odex30_account_asset/tests/test_board_compute.py new file mode 100644 index 0000000..facffa9 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/tests/test_board_compute.py @@ -0,0 +1,1321 @@ +from odoo.tests.common import tagged, freeze_time +from odoo.addons.odex30_account_asset.tests.common import TestAccountAssetCommon +from odoo import fields + + +@freeze_time('2022-07-01') +@tagged('post_install', '-at_install') +class TestAccountAssetComputation(TestAccountAssetCommon): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.car = cls.create_asset(value=60000, periodicity="yearly", periods=5, method="linear", salvage_value=0) + + def test_linear_5_years_no_prorata_asset(self): + self.car.validate() + + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 36000) + self.assertRecordValues(self.car.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=12000, remaining_value=48000, depreciated_value=12000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12000, remaining_value=36000, depreciated_value=24000, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=12000, remaining_value=24000, depreciated_value=36000, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=12000, remaining_value=12000, depreciated_value=48000, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=12000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_linear_5_years_no_prorata_with_imported_amount_asset(self): + self.car.write({'already_depreciated_amount_import': 1000}) + self.car.validate() + + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 36000) + self.assertRecordValues(self.car.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=11000, remaining_value=48000, depreciated_value=12000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12000, remaining_value=36000, depreciated_value=24000, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=12000, remaining_value=24000, depreciated_value=36000, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=12000, remaining_value=12000, depreciated_value=48000, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=12000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_linear_5_years_no_prorata_with_salvage_value_asset(self): + self.car.write({'salvage_value': 1000}) + self.car.validate() + + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 36400) + self.assertEqual(self.car.value_residual, 35400) + self.assertRecordValues(self.car.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=11800, remaining_value=47200, depreciated_value=11800, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=11800, remaining_value=35400, depreciated_value=23600, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=11800, remaining_value=23600, depreciated_value=35400, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=11800, remaining_value=11800, depreciated_value=47200, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=11800, remaining_value=0, depreciated_value=59000, state='draft'), + ]) + + def test_linear_5_years_constant_periods_asset(self): + self.car.write({ + 'prorata_computation_type': 'constant_periods', + 'prorata_date': '2020-07-01', + }) + self.car.validate() + + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 42000) + self.assertRecordValues(self.car.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=6000, remaining_value=54000, depreciated_value=6000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12000, remaining_value=42000, depreciated_value=18000, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=12000, remaining_value=30000, depreciated_value=30000, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=12000, remaining_value=18000, depreciated_value=42000, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=12000, remaining_value=6000, depreciated_value=54000, state='draft'), + self._get_depreciation_move_values(date='2025-12-31', depreciation_value=6000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_linear_5_years_daily_computation_asset(self): + self.car.write({ + 'prorata_computation_type': 'daily_computation', + 'prorata_date': '2020-07-01', + }) + self.car.validate() + + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 41960.57) + self.assertRecordValues(self.car.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=6046, remaining_value=53954, depreciated_value=6046, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=11993.43, remaining_value=41960.57, depreciated_value=18039.43, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=11993.43, remaining_value=29967.14, depreciated_value=30032.86, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=11993.43, remaining_value=17973.71, depreciated_value=42026.29, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=12026.28, remaining_value=5947.43, depreciated_value=54052.57, state='draft'), + self._get_depreciation_move_values(date='2025-12-31', depreciation_value=5947.43, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_degressive_5_years_no_prorata_asset(self): + self.car.write({ + 'method': 'degressive', + 'method_progress_factor': 0.3, + }) + self.car.validate() + + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 29400) + self.assertRecordValues(self.car.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=18000, remaining_value=42000, depreciated_value=18000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12600, remaining_value=29400, depreciated_value=30600, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=9800, remaining_value=19600, depreciated_value=40400, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=9800, remaining_value=9800, depreciated_value=50200, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=9800, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_degressive_5_years_no_prorata_with_imported_amount_asset(self): + self.car.write({ + 'method': 'degressive', + 'method_progress_factor': 0.3, + 'already_depreciated_amount_import': 1000, + }) + self.car.validate() + + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 29400) + self.assertRecordValues(self.car.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=17000, remaining_value=42000, depreciated_value=18000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12600, remaining_value=29400, depreciated_value=30600, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=9800, remaining_value=19600, depreciated_value=40400, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=9800, remaining_value=9800, depreciated_value=50200, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=9800, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_degressive_5_years_no_prorata_with_salvage_value_asset(self): + self.car.write({ + 'method': 'degressive', + 'method_progress_factor': 0.3, + 'salvage_value': 1000, + }) + self.car.validate() + + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 29910) + self.assertEqual(self.car.value_residual, 28910) + self.assertRecordValues(self.car.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=17700, remaining_value=41300, depreciated_value=17700, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12390, remaining_value=28910, depreciated_value=30090, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=9636.67, remaining_value=19273.33, depreciated_value=39726.67, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=9636.67, remaining_value=9636.66, depreciated_value=49363.34, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=9636.66, remaining_value=0, depreciated_value=59000, state='draft'), + ]) + + def test_degressive_then_linear_5_years_no_prorata_asset(self): + asset = self.create_asset(value=60000, periodicity="yearly", periods=5, method="degressive_then_linear", degressive_factor=0.3) + asset.validate() + self.assertEqual(asset.state, 'open') + self.assertEqual(asset.book_value, 29400) + self.assertRecordValues(asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=18000, remaining_value=42000, depreciated_value=18000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12600, remaining_value=29400, depreciated_value=30600, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=12000, remaining_value=17400, depreciated_value=42600, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=12000, remaining_value=5400, depreciated_value=54600, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=5400, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_degressive_then_linear_5_years_no_prorata_negative_asset(self): + asset = self.create_asset(value=-60000, periodicity="yearly", periods=5, method="degressive_then_linear", degressive_factor=0.3) + asset.validate() + self.assertEqual(asset.state, 'open') + self.assertEqual(asset.book_value, -29400) + self.assertRecordValues(asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=-18000, remaining_value=-42000, depreciated_value=-18000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=-12600, remaining_value=-29400, depreciated_value=-30600, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=-12000, remaining_value=-17400, depreciated_value=-42600, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=-12000, remaining_value=-5400, depreciated_value=-54600, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=-5400, remaining_value=0, depreciated_value=-60000, state='draft'), + ]) + + def test_degressive_than_linear_5_years_no_prorata_with_imported_amount_asset(self): + asset = self.create_asset(value=60000, periodicity="yearly", periods=5, method="degressive_then_linear", degressive_factor=0.3, import_depreciation=1000) + asset.validate() + self.assertEqual(asset.state, 'open') + self.assertEqual(asset.book_value, 29400) + self.assertRecordValues(asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=18000 - 1000, remaining_value=42000, depreciated_value=18000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12600, remaining_value=29400, depreciated_value=30600, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=12000, remaining_value=17400, depreciated_value=42600, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=12000, remaining_value=5400, depreciated_value=54600, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=5400, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_degressive_than_linear_5_years_no_prorata_with_imported_amount_negative_asset(self): + asset = self.create_asset(value=-60000, periodicity="yearly", periods=5, method="degressive_then_linear", degressive_factor=0.3, import_depreciation=-1000) + asset.validate() + self.assertEqual(asset.state, 'open') + self.assertEqual(asset.book_value, -29400) + self.assertRecordValues(asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=-18000 + 1000, remaining_value=-42000, depreciated_value=-18000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=-12600, remaining_value=-29400, depreciated_value=-30600, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=-12000, remaining_value=-17400, depreciated_value=-42600, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=-12000, remaining_value=-5400, depreciated_value=-54600, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=-5400, remaining_value=0, depreciated_value=-60000, state='draft'), + ]) + + def test_degressive_than_linear_5_years_no_prorata_with_salvage_value_asset(self): + asset = self.create_asset(value=60000, periodicity="yearly", periods=5, salvage_value=1000, method="degressive_then_linear", degressive_factor=0.3) + asset.validate() + self.assertEqual(asset.state, 'open') + self.assertEqual(asset.value_residual, 28910) + self.assertEqual(asset.book_value, 28910 + 1000) + self.assertRecordValues(asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=17700, remaining_value=41300, depreciated_value=17700, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12390, remaining_value=28910, depreciated_value=30090, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=11800, remaining_value=17110, depreciated_value=41890, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=11800, remaining_value=5310, depreciated_value=53690, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=5310, remaining_value=0, depreciated_value=59000, state='draft'), + ]) + + def test_degressive_then_linear_36_month_constant_period_asset(self): + """ + The depreciation amount is computed that way: Compute a degressive amount for each year and split it by month linearly. + The depreciation value could vary by one currency unit to absorb small differences that are created over time. + """ + asset = self.create_asset(value=10000, periodicity="monthly", periods=36, method="degressive_then_linear", degressive_factor=0.4) + asset.validate() + self.assertEqual(asset.state, 'open') + self.assertRecordValues(asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-01-31', depreciation_value=333.33, remaining_value=9666.67, depreciated_value=333.33, state='posted'), + self._get_depreciation_move_values(date='2020-02-29', depreciation_value=333.34, remaining_value=9333.33, depreciated_value=666.67, state='posted'), + self._get_depreciation_move_values(date='2020-03-31', depreciation_value=333.33, remaining_value=9000.00, depreciated_value=1000.00, state='posted'), + self._get_depreciation_move_values(date='2020-04-30', depreciation_value=333.33, remaining_value=8666.67, depreciated_value=1333.33, state='posted'), + self._get_depreciation_move_values(date='2020-05-31', depreciation_value=333.34, remaining_value=8333.33, depreciated_value=1666.67, state='posted'), + self._get_depreciation_move_values(date='2020-06-30', depreciation_value=333.33, remaining_value=8000.00, depreciated_value=2000.00, state='posted'), + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=333.33, remaining_value=7666.67, depreciated_value=2333.33, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=333.34, remaining_value=7333.33, depreciated_value=2666.67, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=333.33, remaining_value=7000.00, depreciated_value=3000.00, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=333.33, remaining_value=6666.67, depreciated_value=3333.33, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=333.34, remaining_value=6333.33, depreciated_value=3666.67, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=333.33, remaining_value=6000.00, depreciated_value=4000.00, state='posted'), + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=277.78, remaining_value=5722.22, depreciated_value=4277.78, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=277.78, remaining_value=5444.44, depreciated_value=4555.56, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=277.78, remaining_value=5166.66, depreciated_value=4833.34, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=277.77, remaining_value=4888.89, depreciated_value=5111.11, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=277.78, remaining_value=4611.11, depreciated_value=5388.89, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=277.78, remaining_value=4333.33, depreciated_value=5666.67, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=277.78, remaining_value=4055.55, depreciated_value=5944.45, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=277.78, remaining_value=3777.77, depreciated_value=6222.23, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=277.77, remaining_value=3500.00, depreciated_value=6500.00, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=277.78, remaining_value=3222.22, depreciated_value=6777.78, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=277.78, remaining_value=2944.44, depreciated_value=7055.56, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=277.78, remaining_value=2666.66, depreciated_value=7333.34, state='posted'), + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=277.77, remaining_value=2388.89, depreciated_value=7611.11, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=277.78, remaining_value=2111.11, depreciated_value=7888.89, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=277.78, remaining_value=1833.33, depreciated_value=8166.67, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=277.78, remaining_value=1555.55, depreciated_value=8444.45, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=277.78, remaining_value=1277.77, depreciated_value=8722.23, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=277.77, remaining_value=1000.00, depreciated_value=9000.00, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=277.78, remaining_value=722.22, depreciated_value=9277.78, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=277.78, remaining_value=444.44, depreciated_value=9555.56, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=277.78, remaining_value=166.66, depreciated_value=9833.34, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=166.66, remaining_value=0.00, depreciated_value=10000.00, state='draft'), + ]) + + + @freeze_time('2022-06-15') + def test_asset_degressive_then_linear_prorata_start_middle_of_year(self): + """ Check the computation of an asset with degressive-linear method, + start at middle of the year + """ + asset = self.create_asset( + value=10000, + periodicity="yearly", + periods=5, + method="degressive_then_linear", + degressive_factor=0.3, + acquisition_date="2021-07-01", + prorata_computation_type="constant_periods", + ) + asset.validate() + self.assertRecordValues(asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=1500.00, remaining_value=8500.00, depreciated_value=1500.0000, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=2550.00, remaining_value=5950.00, depreciated_value=4050.000, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=2000.00, remaining_value=3950.00, depreciated_value=6050.000, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=2000.00, remaining_value=1950.00, depreciated_value=8050.000, state='draft'), + self._get_depreciation_move_values(date='2025-12-31', depreciation_value=1950.00, remaining_value=0.00, depreciated_value=10000.000, state='draft'), + ]) + + def test_asset_degressive_then_linear_prorata_start_middle_of_year_monthly(self): + """ Check the computation of an asset with degressive-linear method, + start at middle of the year, monthly depreciations + """ + asset = self.create_asset( + value=10000, + periodicity="monthly", + periods=36, + method="degressive_then_linear", + degressive_factor=0.6, + acquisition_date="2021-07-01", + prorata_computation_type="constant_periods", + ) + asset.validate() + self.assertRecordValues(asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=500.00, remaining_value=9500.00, depreciated_value=500.00, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=500.00, remaining_value=9000.00, depreciated_value=1000.00, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=500.00, remaining_value=8500.00, depreciated_value=1500.00, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=500.00, remaining_value=8000.00, depreciated_value=2000.00, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=500.00, remaining_value=7500.00, depreciated_value=2500.00, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=500.00, remaining_value=7000.00, depreciated_value=3000.00, state='posted'), + + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=350.00, remaining_value=6650.00, depreciated_value=3350.00, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=350.00, remaining_value=6300.00, depreciated_value=3700.00, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=350.00, remaining_value=5950.00, depreciated_value=4050.00, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=350.00, remaining_value=5600.00, depreciated_value=4400.00, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=350.00, remaining_value=5250.00, depreciated_value=4750.00, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=350.00, remaining_value=4900.00, depreciated_value=5100.00, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=350.00, remaining_value=4550.00, depreciated_value=5450.00, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=350.00, remaining_value=4200.00, depreciated_value=5800.00, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=350.00, remaining_value=3850.00, depreciated_value=6150.00, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=350.00, remaining_value=3500.00, depreciated_value=6500.00, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=350.00, remaining_value=3150.00, depreciated_value=6850.00, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=350.00, remaining_value=2800.00, depreciated_value=7200.00, state='draft'), + + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=277.78, remaining_value=2522.22, depreciated_value=7477.78, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=277.78, remaining_value=2244.44, depreciated_value=7755.56, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=277.77, remaining_value=1966.67, depreciated_value=8033.33, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=277.78, remaining_value=1688.89, depreciated_value=8311.11, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=277.78, remaining_value=1411.11, depreciated_value=8588.89, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=277.78, remaining_value=1133.33, depreciated_value=8866.67, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=277.77, remaining_value=855.56, depreciated_value=9144.44, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=277.78, remaining_value=577.78, depreciated_value=9422.22, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=277.78, remaining_value=300.00, depreciated_value=9700.00, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=277.78, remaining_value=22.22, depreciated_value=9977.78, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=22.22, remaining_value=0.00, depreciated_value=10000.00, state='draft'), + ]) + + def test_linear_60_months_no_prorata_asset(self): + self.car.write({ + 'method_number': 60, + 'method_period': '1', + }) + self.car.validate() + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 30000) + self.assertRecordValues(self.car.depreciation_move_ids, [ + # 2020 + self._get_depreciation_move_values(date='2020-01-31', depreciation_value=1000, remaining_value=59000, depreciated_value=1000, state='posted'), + self._get_depreciation_move_values(date='2020-02-29', depreciation_value=1000, remaining_value=58000, depreciated_value=2000, state='posted'), + self._get_depreciation_move_values(date='2020-03-31', depreciation_value=1000, remaining_value=57000, depreciated_value=3000, state='posted'), + self._get_depreciation_move_values(date='2020-04-30', depreciation_value=1000, remaining_value=56000, depreciated_value=4000, state='posted'), + self._get_depreciation_move_values(date='2020-05-31', depreciation_value=1000, remaining_value=55000, depreciated_value=5000, state='posted'), + self._get_depreciation_move_values(date='2020-06-30', depreciation_value=1000, remaining_value=54000, depreciated_value=6000, state='posted'), + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=1000, remaining_value=53000, depreciated_value=7000, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=1000, remaining_value=52000, depreciated_value=8000, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=1000, remaining_value=51000, depreciated_value=9000, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=1000, remaining_value=50000, depreciated_value=10000, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=1000, remaining_value=49000, depreciated_value=11000, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=1000, remaining_value=48000, depreciated_value=12000, state='posted'), + # 2021 + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=1000, remaining_value=47000, depreciated_value=13000, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=1000, remaining_value=46000, depreciated_value=14000, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=1000, remaining_value=45000, depreciated_value=15000, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=1000, remaining_value=44000, depreciated_value=16000, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=1000, remaining_value=43000, depreciated_value=17000, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=1000, remaining_value=42000, depreciated_value=18000, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=1000, remaining_value=41000, depreciated_value=19000, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=1000, remaining_value=40000, depreciated_value=20000, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=1000, remaining_value=39000, depreciated_value=21000, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=1000, remaining_value=38000, depreciated_value=22000, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=1000, remaining_value=37000, depreciated_value=23000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=1000, remaining_value=36000, depreciated_value=24000, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=1000, remaining_value=35000, depreciated_value=25000, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=1000, remaining_value=34000, depreciated_value=26000, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=1000, remaining_value=33000, depreciated_value=27000, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=1000, remaining_value=32000, depreciated_value=28000, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=1000, remaining_value=31000, depreciated_value=29000, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=1000, remaining_value=30000, depreciated_value=30000, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=1000, remaining_value=29000, depreciated_value=31000, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=1000, remaining_value=28000, depreciated_value=32000, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=1000, remaining_value=27000, depreciated_value=33000, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=1000, remaining_value=26000, depreciated_value=34000, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=1000, remaining_value=25000, depreciated_value=35000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=1000, remaining_value=24000, depreciated_value=36000, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=1000, remaining_value=23000, depreciated_value=37000, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=1000, remaining_value=22000, depreciated_value=38000, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=1000, remaining_value=21000, depreciated_value=39000, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=1000, remaining_value=20000, depreciated_value=40000, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=1000, remaining_value=19000, depreciated_value=41000, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=1000, remaining_value=18000, depreciated_value=42000, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=1000, remaining_value=17000, depreciated_value=43000, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=1000, remaining_value=16000, depreciated_value=44000, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=1000, remaining_value=15000, depreciated_value=45000, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=1000, remaining_value=14000, depreciated_value=46000, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=1000, remaining_value=13000, depreciated_value=47000, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=1000, remaining_value=12000, depreciated_value=48000, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=1000, remaining_value=11000, depreciated_value=49000, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=1000, remaining_value=10000, depreciated_value=50000, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=1000, remaining_value=9000, depreciated_value=51000, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=1000, remaining_value=8000, depreciated_value=52000, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=1000, remaining_value=7000, depreciated_value=53000, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=1000, remaining_value=6000, depreciated_value=54000, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=1000, remaining_value=5000, depreciated_value=55000, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=1000, remaining_value=4000, depreciated_value=56000, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=1000, remaining_value=3000, depreciated_value=57000, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=1000, remaining_value=2000, depreciated_value=58000, state='draft'), + self._get_depreciation_move_values(date='2024-11-30', depreciation_value=1000, remaining_value=1000, depreciated_value=59000, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=1000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_linear_60_months_no_prorata_with_imported_amount_asset(self): + self.car.write({ + 'method_number': 60, + 'method_period': '1', + 'already_depreciated_amount_import': 1500, + }) + self.car.validate() + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 30000) + self.assertRecordValues(self.car.depreciation_move_ids, [ + # 2020 + self._get_depreciation_move_values(date='2020-02-29', depreciation_value=500.0, remaining_value=58000.0, depreciated_value=2000.0, state='posted'), + self._get_depreciation_move_values(date='2020-03-31', depreciation_value=1000.0, remaining_value=57000.0, depreciated_value=3000.0, state='posted'), + self._get_depreciation_move_values(date='2020-04-30', depreciation_value=1000.0, remaining_value=56000.0, depreciated_value=4000.0, state='posted'), + self._get_depreciation_move_values(date='2020-05-31', depreciation_value=1000.0, remaining_value=55000.0, depreciated_value=5000.0, state='posted'), + self._get_depreciation_move_values(date='2020-06-30', depreciation_value=1000.0, remaining_value=54000.0, depreciated_value=6000.0, state='posted'), + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=1000.0, remaining_value=53000.0, depreciated_value=7000.0, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=1000.0, remaining_value=52000.0, depreciated_value=8000.0, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=1000.0, remaining_value=51000.0, depreciated_value=9000.0, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=1000.0, remaining_value=50000.0, depreciated_value=10000.0, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=1000.0, remaining_value=49000.0, depreciated_value=11000.0, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=1000.0, remaining_value=48000.0, depreciated_value=12000.0, state='posted'), + # 2021 + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=1000.0, remaining_value=47000.0, depreciated_value=13000.0, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=1000.0, remaining_value=46000.0, depreciated_value=14000.0, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=1000.0, remaining_value=45000.0, depreciated_value=15000.0, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=1000.0, remaining_value=44000.0, depreciated_value=16000.0, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=1000.0, remaining_value=43000.0, depreciated_value=17000.0, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=1000.0, remaining_value=42000.0, depreciated_value=18000.0, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=1000.0, remaining_value=41000.0, depreciated_value=19000.0, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=1000.0, remaining_value=40000.0, depreciated_value=20000.0, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=1000.0, remaining_value=39000.0, depreciated_value=21000.0, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=1000.0, remaining_value=38000.0, depreciated_value=22000.0, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=1000.0, remaining_value=37000.0, depreciated_value=23000.0, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=1000.0, remaining_value=36000.0, depreciated_value=24000.0, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=1000.0, remaining_value=35000.0, depreciated_value=25000.0, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=1000.0, remaining_value=34000.0, depreciated_value=26000.0, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=1000.0, remaining_value=33000.0, depreciated_value=27000.0, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=1000.0, remaining_value=32000.0, depreciated_value=28000.0, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=1000.0, remaining_value=31000.0, depreciated_value=29000.0, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=1000.0, remaining_value=30000.0, depreciated_value=30000.0, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=1000.0, remaining_value=29000.0, depreciated_value=31000.0, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=1000.0, remaining_value=28000.0, depreciated_value=32000.0, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=1000.0, remaining_value=27000.0, depreciated_value=33000.0, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=1000.0, remaining_value=26000.0, depreciated_value=34000.0, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=1000.0, remaining_value=25000.0, depreciated_value=35000.0, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=1000.0, remaining_value=24000.0, depreciated_value=36000.0, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=1000.0, remaining_value=23000.0, depreciated_value=37000.0, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=1000.0, remaining_value=22000.0, depreciated_value=38000.0, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=1000.0, remaining_value=21000.0, depreciated_value=39000.0, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=1000.0, remaining_value=20000.0, depreciated_value=40000.0, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=1000.0, remaining_value=19000.0, depreciated_value=41000.0, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=1000.0, remaining_value=18000.0, depreciated_value=42000.0, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=1000.0, remaining_value=17000.0, depreciated_value=43000.0, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=1000.0, remaining_value=16000.0, depreciated_value=44000.0, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=1000.0, remaining_value=15000.0, depreciated_value=45000.0, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=1000.0, remaining_value=14000.0, depreciated_value=46000.0, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=1000.0, remaining_value=13000.0, depreciated_value=47000.0, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=1000.0, remaining_value=12000.0, depreciated_value=48000.0, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=1000.0, remaining_value=11000.0, depreciated_value=49000.0, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=1000.0, remaining_value=10000.0, depreciated_value=50000.0, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=1000.0, remaining_value=9000.0, depreciated_value=51000.0, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=1000.0, remaining_value=8000.0, depreciated_value=52000.0, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=1000.0, remaining_value=7000.0, depreciated_value=53000.0, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=1000.0, remaining_value=6000.0, depreciated_value=54000.0, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=1000.0, remaining_value=5000.0, depreciated_value=55000.0, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=1000.0, remaining_value=4000.0, depreciated_value=56000.0, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=1000.0, remaining_value=3000.0, depreciated_value=57000.0, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=1000.0, remaining_value=2000.0, depreciated_value=58000.0, state='draft'), + self._get_depreciation_move_values(date='2024-11-30', depreciation_value=1000.0, remaining_value=1000.0, depreciated_value=59000.0, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=1000.0, remaining_value=0.0, depreciated_value=60000.0, state='draft'), + ]) + + def test_linear_60_months_no_prorata_with_salvage_value_asset(self): + self.car.write({ + 'method_number': 60, + 'method_period': '1', + 'method_progress_factor': 0.3, + 'salvage_value': 2000, + }) + self.car.validate() + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 31000) + self.assertEqual(self.car.value_residual, 29000) + self.assertRecordValues(self.car.depreciation_move_ids, [ + # 2020 + self._get_depreciation_move_values(date='2020-01-31', depreciation_value=966.67, remaining_value=57033.33, depreciated_value=966.67, state='posted'), + self._get_depreciation_move_values(date='2020-02-29', depreciation_value=966.66, remaining_value=56066.67, depreciated_value=1933.33, state='posted'), + self._get_depreciation_move_values(date='2020-03-31', depreciation_value=966.67, remaining_value=55100.0, depreciated_value=2900.0, state='posted'), + self._get_depreciation_move_values(date='2020-04-30', depreciation_value=966.67, remaining_value=54133.33, depreciated_value=3866.67, state='posted'), + self._get_depreciation_move_values(date='2020-05-31', depreciation_value=966.66, remaining_value=53166.67, depreciated_value=4833.33, state='posted'), + self._get_depreciation_move_values(date='2020-06-30', depreciation_value=966.67, remaining_value=52200.0, depreciated_value=5800.0, state='posted'), + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=966.67, remaining_value=51233.33, depreciated_value=6766.67, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=966.66, remaining_value=50266.67, depreciated_value=7733.33, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=966.67, remaining_value=49300.0, depreciated_value=8700.0, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=966.67, remaining_value=48333.33, depreciated_value=9666.67, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=966.66, remaining_value=47366.67, depreciated_value=10633.33, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=966.67, remaining_value=46400.0, depreciated_value=11600.0, state='posted'), + # 2021 + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=966.67, remaining_value=45433.33, depreciated_value=12566.67, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=966.66, remaining_value=44466.67, depreciated_value=13533.33, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=966.67, remaining_value=43500.0, depreciated_value=14500.0, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=966.67, remaining_value=42533.33, depreciated_value=15466.67, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=966.66, remaining_value=41566.67, depreciated_value=16433.33, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=966.67, remaining_value=40600.0, depreciated_value=17400.0, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=966.67, remaining_value=39633.33, depreciated_value=18366.67, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=966.66, remaining_value=38666.67, depreciated_value=19333.33, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=966.67, remaining_value=37700.0, depreciated_value=20300.0, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=966.67, remaining_value=36733.33, depreciated_value=21266.67, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=966.66, remaining_value=35766.67, depreciated_value=22233.33, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=966.67, remaining_value=34800.0, depreciated_value=23200.0, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=966.67, remaining_value=33833.33, depreciated_value=24166.67, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=966.66, remaining_value=32866.67, depreciated_value=25133.33, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=966.67, remaining_value=31900.0, depreciated_value=26100.0, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=966.67, remaining_value=30933.33, depreciated_value=27066.67, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=966.66, remaining_value=29966.67, depreciated_value=28033.33, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=966.67, remaining_value=29000.0, depreciated_value=29000.0, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=966.67, remaining_value=28033.33, depreciated_value=29966.67, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=966.66, remaining_value=27066.67, depreciated_value=30933.33, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=966.67, remaining_value=26100.0, depreciated_value=31900.0, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=966.67, remaining_value=25133.33, depreciated_value=32866.67, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=966.66, remaining_value=24166.67, depreciated_value=33833.33, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=966.67, remaining_value=23200.0, depreciated_value=34800.0, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=966.67, remaining_value=22233.33, depreciated_value=35766.67, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=966.66, remaining_value=21266.67, depreciated_value=36733.33, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=966.67, remaining_value=20300.0, depreciated_value=37700.0, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=966.67, remaining_value=19333.33, depreciated_value=38666.67, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=966.66, remaining_value=18366.67, depreciated_value=39633.33, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=966.67, remaining_value=17400.0, depreciated_value=40600.0, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=966.67, remaining_value=16433.33, depreciated_value=41566.67, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=966.66, remaining_value=15466.67, depreciated_value=42533.33, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=966.67, remaining_value=14500.0, depreciated_value=43500.0, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=966.67, remaining_value=13533.33, depreciated_value=44466.67, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=966.66, remaining_value=12566.67, depreciated_value=45433.33, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=966.67, remaining_value=11600.0, depreciated_value=46400.0, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=966.67, remaining_value=10633.33, depreciated_value=47366.67, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=966.66, remaining_value=9666.67, depreciated_value=48333.33, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=966.67, remaining_value=8700.0, depreciated_value=49300.0, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=966.67, remaining_value=7733.33, depreciated_value=50266.67, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=966.66, remaining_value=6766.67, depreciated_value=51233.33, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=966.67, remaining_value=5800.0, depreciated_value=52200.0, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=966.67, remaining_value=4833.33, depreciated_value=53166.67, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=966.66, remaining_value=3866.67, depreciated_value=54133.33, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=966.67, remaining_value=2900.0, depreciated_value=55100.0, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=966.67, remaining_value=1933.33, depreciated_value=56066.67, state='draft'), + self._get_depreciation_move_values(date='2024-11-30', depreciation_value=966.66, remaining_value=966.67, depreciated_value=57033.33, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=966.67, remaining_value=0.0, depreciated_value=58000.0, state='draft'), + ]) + + def test_linear_60_months_constant_periods_asset(self): + self.car.write({ + 'method_number': 60, + 'method_period': '1', + 'prorata_computation_type': 'constant_periods', + 'prorata_date': '2020-07-01', + }) + self.car.validate() + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 36000) + self.assertRecordValues(self.car.depreciation_move_ids, [ + # 2020 + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=1000, remaining_value=59000, depreciated_value=1000, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=1000, remaining_value=58000, depreciated_value=2000, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=1000, remaining_value=57000, depreciated_value=3000, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=1000, remaining_value=56000, depreciated_value=4000, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=1000, remaining_value=55000, depreciated_value=5000, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=1000, remaining_value=54000, depreciated_value=6000, state='posted'), + # 2021 + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=1000, remaining_value=53000, depreciated_value=7000, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=1000, remaining_value=52000, depreciated_value=8000, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=1000, remaining_value=51000, depreciated_value=9000, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=1000, remaining_value=50000, depreciated_value=10000, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=1000, remaining_value=49000, depreciated_value=11000, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=1000, remaining_value=48000, depreciated_value=12000, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=1000, remaining_value=47000, depreciated_value=13000, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=1000, remaining_value=46000, depreciated_value=14000, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=1000, remaining_value=45000, depreciated_value=15000, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=1000, remaining_value=44000, depreciated_value=16000, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=1000, remaining_value=43000, depreciated_value=17000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=1000, remaining_value=42000, depreciated_value=18000, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=1000, remaining_value=41000, depreciated_value=19000, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=1000, remaining_value=40000, depreciated_value=20000, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=1000, remaining_value=39000, depreciated_value=21000, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=1000, remaining_value=38000, depreciated_value=22000, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=1000, remaining_value=37000, depreciated_value=23000, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=1000, remaining_value=36000, depreciated_value=24000, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=1000, remaining_value=35000, depreciated_value=25000, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=1000, remaining_value=34000, depreciated_value=26000, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=1000, remaining_value=33000, depreciated_value=27000, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=1000, remaining_value=32000, depreciated_value=28000, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=1000, remaining_value=31000, depreciated_value=29000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=1000, remaining_value=30000, depreciated_value=30000, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=1000, remaining_value=29000, depreciated_value=31000, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=1000, remaining_value=28000, depreciated_value=32000, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=1000, remaining_value=27000, depreciated_value=33000, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=1000, remaining_value=26000, depreciated_value=34000, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=1000, remaining_value=25000, depreciated_value=35000, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=1000, remaining_value=24000, depreciated_value=36000, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=1000, remaining_value=23000, depreciated_value=37000, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=1000, remaining_value=22000, depreciated_value=38000, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=1000, remaining_value=21000, depreciated_value=39000, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=1000, remaining_value=20000, depreciated_value=40000, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=1000, remaining_value=19000, depreciated_value=41000, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=1000, remaining_value=18000, depreciated_value=42000, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=1000, remaining_value=17000, depreciated_value=43000, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=1000, remaining_value=16000, depreciated_value=44000, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=1000, remaining_value=15000, depreciated_value=45000, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=1000, remaining_value=14000, depreciated_value=46000, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=1000, remaining_value=13000, depreciated_value=47000, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=1000, remaining_value=12000, depreciated_value=48000, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=1000, remaining_value=11000, depreciated_value=49000, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=1000, remaining_value=10000, depreciated_value=50000, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=1000, remaining_value=9000, depreciated_value=51000, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=1000, remaining_value=8000, depreciated_value=52000, state='draft'), + self._get_depreciation_move_values(date='2024-11-30', depreciation_value=1000, remaining_value=7000, depreciated_value=53000, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=1000, remaining_value=6000, depreciated_value=54000, state='draft'), + # 2025 + self._get_depreciation_move_values(date='2025-01-31', depreciation_value=1000, remaining_value=5000, depreciated_value=55000, state='draft'), + self._get_depreciation_move_values(date='2025-02-28', depreciation_value=1000, remaining_value=4000, depreciated_value=56000, state='draft'), + self._get_depreciation_move_values(date='2025-03-31', depreciation_value=1000, remaining_value=3000, depreciated_value=57000, state='draft'), + self._get_depreciation_move_values(date='2025-04-30', depreciation_value=1000, remaining_value=2000, depreciated_value=58000, state='draft'), + self._get_depreciation_move_values(date='2025-05-31', depreciation_value=1000, remaining_value=1000, depreciated_value=59000, state='draft'), + self._get_depreciation_move_values(date='2025-06-30', depreciation_value=1000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_linear_60_months_daily_computation_asset(self): + self.car.write({ + 'method_number': 60, + 'method_period': '1', + 'prorata_computation_type': 'daily_computation', + 'prorata_date': '2020-07-01', + }) + self.car.validate() + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 36013.14) + + self.assertRecordValues(self.car.depreciation_move_ids, [ + # 2020 + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=1018.62, remaining_value=58981.38, depreciated_value=1018.62, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=1018.62, remaining_value=57962.76, depreciated_value=2037.24, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=985.76, remaining_value=56977.0, depreciated_value=3023.0, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=1018.62, remaining_value=55958.38, depreciated_value=4041.62, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=985.76, remaining_value=54972.62, depreciated_value=5027.38, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=1018.62, remaining_value=53954.0, depreciated_value=6046.0, state='posted'), + # 2021 + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=1018.62, remaining_value=52935.38, depreciated_value=7064.62, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=920.05, remaining_value=52015.33, depreciated_value=7984.67, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=1018.62, remaining_value=50996.71, depreciated_value=9003.29, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=985.76, remaining_value=50010.95, depreciated_value=9989.05, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=1018.62, remaining_value=48992.33, depreciated_value=11007.67, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=985.76, remaining_value=48006.57, depreciated_value=11993.43, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=1018.62, remaining_value=46987.95, depreciated_value=13012.05, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=1018.62, remaining_value=45969.33, depreciated_value=14030.67, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=985.76, remaining_value=44983.57, depreciated_value=15016.43, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=1018.62, remaining_value=43964.95, depreciated_value=16035.05, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=985.76, remaining_value=42979.19, depreciated_value=17020.81, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=1018.62, remaining_value=41960.57, depreciated_value=18039.43, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=1018.62, remaining_value=40941.95, depreciated_value=19058.05, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=920.04, remaining_value=40021.91, depreciated_value=19978.09, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=1018.62, remaining_value=39003.29, depreciated_value=20996.71, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=985.77, remaining_value=38017.52, depreciated_value=21982.48, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=1018.62, remaining_value=36998.9, depreciated_value=23001.10, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=985.76, remaining_value=36013.14, depreciated_value=23986.86, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=1018.62, remaining_value=34994.52, depreciated_value=25005.48, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=1018.62, remaining_value=33975.9, depreciated_value=26024.10, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=985.76, remaining_value=32990.14, depreciated_value=27009.86, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=1018.62, remaining_value=31971.52, depreciated_value=28028.48, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=985.76, remaining_value=30985.76, depreciated_value=29014.24, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=1018.62, remaining_value=29967.14, depreciated_value=30032.86, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=1018.62, remaining_value=28948.52, depreciated_value=31051.48, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=920.04, remaining_value=28028.48, depreciated_value=31971.52, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=1018.62, remaining_value=27009.86, depreciated_value=32990.14, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=985.76, remaining_value=26024.10, depreciated_value=33975.9, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=1018.62, remaining_value=25005.48, depreciated_value=34994.52, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=985.76, remaining_value=24019.72, depreciated_value=35980.28, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=1018.62, remaining_value=23001.10, depreciated_value=36998.9, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=1018.62, remaining_value=21982.48, depreciated_value=38017.52, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=985.77, remaining_value=20996.71, depreciated_value=39003.29, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=1018.62, remaining_value=19978.09, depreciated_value=40021.91, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=985.76, remaining_value=18992.33, depreciated_value=41007.67, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=1018.62, remaining_value=17973.71, depreciated_value=42026.29, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=1018.62, remaining_value=16955.09, depreciated_value=43044.91, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=952.9, remaining_value=16002.19, depreciated_value=43997.81, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=1018.62, remaining_value=14983.57, depreciated_value=45016.43, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=985.76, remaining_value=13997.81, depreciated_value=46002.19, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=1018.62, remaining_value=12979.19, depreciated_value=47020.81, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=985.76, remaining_value=11993.43, depreciated_value=48006.57, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=1018.62, remaining_value=10974.81, depreciated_value=49025.19, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=1018.62, remaining_value=9956.19, depreciated_value=50043.81, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=985.76, remaining_value=8970.43, depreciated_value=51029.57, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=1018.62, remaining_value=7951.81, depreciated_value=52048.19, state='draft'), + self._get_depreciation_move_values(date='2024-11-30', depreciation_value=985.76, remaining_value=6966.05, depreciated_value=53033.95, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=1018.62, remaining_value=5947.43, depreciated_value=54052.57, state='draft'), + # 2025 + self._get_depreciation_move_values(date='2025-01-31', depreciation_value=1018.62, remaining_value=4928.81, depreciated_value=55071.19, state='draft'), + self._get_depreciation_move_values(date='2025-02-28', depreciation_value=920.05, remaining_value=4008.76, depreciated_value=55991.24, state='draft'), + self._get_depreciation_move_values(date='2025-03-31', depreciation_value=1018.62, remaining_value=2990.14, depreciated_value=57009.86, state='draft'), + self._get_depreciation_move_values(date='2025-04-30', depreciation_value=985.76, remaining_value=2004.38, depreciated_value=57995.62, state='draft'), + self._get_depreciation_move_values(date='2025-05-31', depreciation_value=1018.62, remaining_value=985.76, depreciated_value=59014.24, state='draft'), + self._get_depreciation_move_values(date='2025-06-30', depreciation_value=985.76, remaining_value=0.0, depreciated_value=60000.0, state='draft'), + ]) + + def test_degressive_60_months_no_prorata_asset(self): + self.car.write({ + 'method_number': 60, + 'method_period': '1', + 'method': 'degressive', + 'method_progress_factor': 0.3, + }) + self.car.validate() + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 24500) + self.assertRecordValues(self.car.depreciation_move_ids, [ + # 2020 + self._get_depreciation_move_values(date='2020-01-31', depreciation_value=1500.0, remaining_value=58500.0, depreciated_value=1500.0, state='posted'), + self._get_depreciation_move_values(date='2020-02-29', depreciation_value=1500.0, remaining_value=57000.0, depreciated_value=3000.0, state='posted'), + self._get_depreciation_move_values(date='2020-03-31', depreciation_value=1500.0, remaining_value=55500.0, depreciated_value=4500.0, state='posted'), + self._get_depreciation_move_values(date='2020-04-30', depreciation_value=1500.0, remaining_value=54000.0, depreciated_value=6000.0, state='posted'), + self._get_depreciation_move_values(date='2020-05-31', depreciation_value=1500.0, remaining_value=52500.0, depreciated_value=7500.0, state='posted'), + self._get_depreciation_move_values(date='2020-06-30', depreciation_value=1500.0, remaining_value=51000.0, depreciated_value=9000.0, state='posted'), + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=1500.0, remaining_value=49500.0, depreciated_value=10500.0, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=1500.0, remaining_value=48000.0, depreciated_value=12000.0, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=1500.0, remaining_value=46500.0, depreciated_value=13500.0, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=1500.0, remaining_value=45000.0, depreciated_value=15000.0, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=1500.0, remaining_value=43500.0, depreciated_value=16500.0, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=1500.0, remaining_value=42000.0, depreciated_value=18000.0, state='posted'), + # 2021 + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=1050.0, remaining_value=40950.0, depreciated_value=19050.0, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=1050.0, remaining_value=39900.0, depreciated_value=20100.0, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=1050.0, remaining_value=38850.0, depreciated_value=21150.0, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=1050.0, remaining_value=37800.0, depreciated_value=22200.0, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=1050.0, remaining_value=36750.0, depreciated_value=23250.0, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=1050.0, remaining_value=35700.0, depreciated_value=24300.0, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=1050.0, remaining_value=34650.0, depreciated_value=25350.0, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=1050.0, remaining_value=33600.0, depreciated_value=26400.0, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=1050.0, remaining_value=32550.0, depreciated_value=27450.0, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=1050.0, remaining_value=31500.0, depreciated_value=28500.0, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=1050.0, remaining_value=30450.0, depreciated_value=29550.0, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=1050.0, remaining_value=29400.0, depreciated_value=30600.0, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=816.67, remaining_value=28583.33, depreciated_value=31416.67, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=816.66, remaining_value=27766.67, depreciated_value=32233.33, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=816.67, remaining_value=26950.0, depreciated_value=33050.0, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=816.67, remaining_value=26133.33, depreciated_value=33866.67, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=816.66, remaining_value=25316.67, depreciated_value=34683.33, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=816.67, remaining_value=24500.0, depreciated_value=35500.0, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=816.67, remaining_value=23683.33, depreciated_value=36316.67, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=816.66, remaining_value=22866.67, depreciated_value=37133.33, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=816.67, remaining_value=22050.0, depreciated_value=37950.0, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=816.67, remaining_value=21233.33, depreciated_value=38766.67, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=816.66, remaining_value=20416.67, depreciated_value=39583.33, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=816.67, remaining_value=19600.0, depreciated_value=40400.0, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=816.67, remaining_value=18783.33, depreciated_value=41216.67, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=816.66, remaining_value=17966.67, depreciated_value=42033.33, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=816.67, remaining_value=17150.0, depreciated_value=42850.0, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=816.67, remaining_value=16333.33, depreciated_value=43666.67, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=816.66, remaining_value=15516.67, depreciated_value=44483.33, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=816.67, remaining_value=14700.0, depreciated_value=45300.0, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=816.67, remaining_value=13883.33, depreciated_value=46116.67, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=816.66, remaining_value=13066.67, depreciated_value=46933.33, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=816.67, remaining_value=12250.0, depreciated_value=47750.0, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=816.67, remaining_value=11433.33, depreciated_value=48566.67, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=816.66, remaining_value=10616.67, depreciated_value=49383.33, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=816.67, remaining_value=9800.0, depreciated_value=50200.0, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=816.67, remaining_value=8983.33, depreciated_value=51016.67, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=816.66, remaining_value=8166.67, depreciated_value=51833.33, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=816.67, remaining_value=7350.0, depreciated_value=52650.0, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=816.67, remaining_value=6533.33, depreciated_value=53466.67, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=816.66, remaining_value=5716.67, depreciated_value=54283.33, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=816.67, remaining_value=4900.0, depreciated_value=55100.0, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=816.67, remaining_value=4083.33, depreciated_value=55916.67, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=816.66, remaining_value=3266.67, depreciated_value=56733.33, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=816.67, remaining_value=2450.0, depreciated_value=57550.0, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=816.67, remaining_value=1633.33, depreciated_value=58366.67, state='draft'), + self._get_depreciation_move_values(date='2024-11-30', depreciation_value=816.66, remaining_value=816.67, depreciated_value=59183.33, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=816.67, remaining_value=0.0, depreciated_value=60000.0, state='draft'), + ]) + + def test_degressive_60_months_from_middle_year(self): + asset = self.create_asset( + value=100000, + periodicity='monthly', + periods=60, + method='degressive', + method_progress_factor=0.35, + acquisition_date='2022-07-01', + prorata_computation_type='constant_periods' + ) + asset.compute_depreciation_board() + self.assertEqual(asset.state, 'draft') + self.assertEqual(asset.book_value, 100000) + self.assertRecordValues(asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=2916.67, remaining_value=97083.33, depreciated_value=2916.67, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=2916.66, remaining_value=94166.67, depreciated_value=5833.33, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=2916.67, remaining_value=91250.00, depreciated_value=8750.00, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=2916.67, remaining_value=88333.33, depreciated_value=11666.67, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=2916.66, remaining_value=85416.67, depreciated_value=14583.33, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=2916.67, remaining_value=82500.00, depreciated_value=17500.00, state='draft'), + + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=2406.25, remaining_value=80093.75, depreciated_value=19906.25, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=2406.25, remaining_value=77687.50, depreciated_value=22312.50, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=2406.25, remaining_value=75281.25, depreciated_value=24718.75, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=2406.25, remaining_value=72875.00, depreciated_value=27125.00, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=2406.25, remaining_value=70468.75, depreciated_value=29531.25, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=2406.25, remaining_value=68062.50, depreciated_value=31937.50, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=2406.25, remaining_value=65656.25, depreciated_value=34343.75, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=2406.25, remaining_value=63250.00, depreciated_value=36750.00, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=2406.25, remaining_value=60843.75, depreciated_value=39156.25, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=2406.25, remaining_value=58437.50, depreciated_value=41562.50, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=2406.25, remaining_value=56031.25, depreciated_value=43968.75, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=2406.25, remaining_value=53625.00, depreciated_value=46375.00, state='draft'), + + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=1564.06, remaining_value=52060.94, depreciated_value=47939.06, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=1564.07, remaining_value=50496.87, depreciated_value=49503.13, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=1564.06, remaining_value=48932.81, depreciated_value=51067.19, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=1564.06, remaining_value=47368.75, depreciated_value=52631.25, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=1564.06, remaining_value=45804.69, depreciated_value=54195.31, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=1564.07, remaining_value=44240.62, depreciated_value=55759.38, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=1564.06, remaining_value=42676.56, depreciated_value=57323.44, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=1564.06, remaining_value=41112.50, depreciated_value=58887.50, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=1564.06, remaining_value=39548.44, depreciated_value=60451.56, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=1564.07, remaining_value=37984.37, depreciated_value=62015.63, state='draft'), + self._get_depreciation_move_values(date='2024-11-30', depreciation_value=1564.06, remaining_value=36420.31, depreciated_value=63579.69, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=1564.06, remaining_value=34856.25, depreciated_value=65143.75, state='draft'), + + self._get_depreciation_move_values(date='2025-01-31', depreciation_value=1161.88, remaining_value=33694.37, depreciated_value=66305.63, state='draft'), + self._get_depreciation_move_values(date='2025-02-28', depreciation_value=1161.87, remaining_value=32532.50, depreciated_value=67467.50, state='draft'), + self._get_depreciation_move_values(date='2025-03-31', depreciation_value=1161.88, remaining_value=31370.62, depreciated_value=68629.38, state='draft'), + self._get_depreciation_move_values(date='2025-04-30', depreciation_value=1161.87, remaining_value=30208.75, depreciated_value=69791.25, state='draft'), + self._get_depreciation_move_values(date='2025-05-31', depreciation_value=1161.88, remaining_value=29046.87, depreciated_value=70953.13, state='draft'), + self._get_depreciation_move_values(date='2025-06-30', depreciation_value=1161.87, remaining_value=27885.00, depreciated_value=72115.00, state='draft'), + self._get_depreciation_move_values(date='2025-07-31', depreciation_value=1161.88, remaining_value=26723.12, depreciated_value=73276.88, state='draft'), + self._get_depreciation_move_values(date='2025-08-31', depreciation_value=1161.87, remaining_value=25561.25, depreciated_value=74438.75, state='draft'), + self._get_depreciation_move_values(date='2025-09-30', depreciation_value=1161.88, remaining_value=24399.37, depreciated_value=75600.63, state='draft'), + self._get_depreciation_move_values(date='2025-10-31', depreciation_value=1161.87, remaining_value=23237.50, depreciated_value=76762.50, state='draft'), + self._get_depreciation_move_values(date='2025-11-30', depreciation_value=1161.88, remaining_value=22075.62, depreciated_value=77924.38, state='draft'), + self._get_depreciation_move_values(date='2025-12-31', depreciation_value=1161.87, remaining_value=20913.75, depreciated_value=79086.25, state='draft'), + + self._get_depreciation_move_values(date='2026-01-31', depreciation_value=1161.88, remaining_value=19751.87, depreciated_value=80248.13, state='draft'), + self._get_depreciation_move_values(date='2026-02-28', depreciation_value=1161.87, remaining_value=18590.00, depreciated_value=81410.00, state='draft'), + self._get_depreciation_move_values(date='2026-03-31', depreciation_value=1161.88, remaining_value=17428.12, depreciated_value=82571.88, state='draft'), + self._get_depreciation_move_values(date='2026-04-30', depreciation_value=1161.87, remaining_value=16266.25, depreciated_value=83733.75, state='draft'), + self._get_depreciation_move_values(date='2026-05-31', depreciation_value=1161.88, remaining_value=15104.37, depreciated_value=84895.63, state='draft'), + self._get_depreciation_move_values(date='2026-06-30', depreciation_value=1161.87, remaining_value=13942.50, depreciated_value=86057.50, state='draft'), + self._get_depreciation_move_values(date='2026-07-31', depreciation_value=1161.88, remaining_value=12780.62, depreciated_value=87219.38, state='draft'), + self._get_depreciation_move_values(date='2026-08-31', depreciation_value=1161.87, remaining_value=11618.75, depreciated_value=88381.25, state='draft'), + self._get_depreciation_move_values(date='2026-09-30', depreciation_value=1161.88, remaining_value=10456.87, depreciated_value=89543.13, state='draft'), + self._get_depreciation_move_values(date='2026-10-31', depreciation_value=1161.87, remaining_value=9295.00, depreciated_value=90705.00, state='draft'), + self._get_depreciation_move_values(date='2026-11-30', depreciation_value=1161.88, remaining_value=8133.12, depreciated_value=91866.88, state='draft'), + self._get_depreciation_move_values(date='2026-12-31', depreciation_value=1161.87, remaining_value=6971.25, depreciated_value=93028.75, state='draft'), + + self._get_depreciation_move_values(date='2027-01-31', depreciation_value=1161.88, remaining_value=5809.37, depreciated_value=94190.63, state='draft'), + self._get_depreciation_move_values(date='2027-02-28', depreciation_value=1161.87, remaining_value=4647.50, depreciated_value=95352.50, state='draft'), + self._get_depreciation_move_values(date='2027-03-31', depreciation_value=1161.88, remaining_value=3485.62, depreciated_value=96514.38, state='draft'), + self._get_depreciation_move_values(date='2027-04-30', depreciation_value=1161.87, remaining_value=2323.75, depreciated_value=97676.25, state='draft'), + self._get_depreciation_move_values(date='2027-05-31', depreciation_value=1161.88, remaining_value=1161.87, depreciated_value=98838.13, state='draft'), + self._get_depreciation_move_values(date='2027-06-30', depreciation_value=1161.87, remaining_value=0.00, depreciated_value=100000.00, state='draft'), + ]) + + def test_degressive_60_months_from_middle_sync_with_fiscalyear(self): + company = self.env.company + company.fiscalyear_last_day = 30 + company.fiscalyear_last_month = '6' + asset = self.create_asset( + value=100000, + periodicity='monthly', + periods=60, + method='degressive', + method_progress_factor=0.35, + acquisition_date='2022-07-01', + prorata_computation_type='constant_periods' + ) + asset.compute_depreciation_board() + self.assertEqual(asset.state, 'draft') + self.assertEqual(asset.book_value, 100000) + self.assertRecordValues(asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=2916.67, remaining_value=97083.33, depreciated_value=2916.67, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=2916.66, remaining_value=94166.67, depreciated_value=5833.33, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=2916.67, remaining_value=91250.00, depreciated_value=8750.00, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=2916.67, remaining_value=88333.33, depreciated_value=11666.67, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=2916.66, remaining_value=85416.67, depreciated_value=14583.33, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=2916.67, remaining_value=82500.00, depreciated_value=17500.00, state='draft'), + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=2916.67, remaining_value=79583.33, depreciated_value=20416.67, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=2916.66, remaining_value=76666.67, depreciated_value=23333.33, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=2916.67, remaining_value=73750.00, depreciated_value=26250.00, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=2916.67, remaining_value=70833.33, depreciated_value=29166.67, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=2916.66, remaining_value=67916.67, depreciated_value=32083.33, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=2916.67, remaining_value=65000.00, depreciated_value=35000.00, state='draft'), + + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=1895.83, remaining_value=63104.17, depreciated_value=36895.83, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=1895.84, remaining_value=61208.33, depreciated_value=38791.67, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=1895.83, remaining_value=59312.50, depreciated_value=40687.50, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=1895.83, remaining_value=57416.67, depreciated_value=42583.33, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=1895.84, remaining_value=55520.83, depreciated_value=44479.17, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=1895.83, remaining_value=53625.00, depreciated_value=46375.00, state='draft'), + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=1895.83, remaining_value=51729.17, depreciated_value=48270.83, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=1895.84, remaining_value=49833.33, depreciated_value=50166.67, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=1895.83, remaining_value=47937.50, depreciated_value=52062.50, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=1895.83, remaining_value=46041.67, depreciated_value=53958.33, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=1895.84, remaining_value=44145.83, depreciated_value=55854.17, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=1895.83, remaining_value=42250.00, depreciated_value=57750.00, state='draft'), + + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=1232.29, remaining_value=41017.71, depreciated_value=58982.29, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=1232.29, remaining_value=39785.42, depreciated_value=60214.58, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=1232.29, remaining_value=38553.13, depreciated_value=61446.87, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=1232.30, remaining_value=37320.83, depreciated_value=62679.17, state='draft'), + self._get_depreciation_move_values(date='2024-11-30', depreciation_value=1232.29, remaining_value=36088.54, depreciated_value=63911.46, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=1232.29, remaining_value=34856.25, depreciated_value=65143.75, state='draft'), + self._get_depreciation_move_values(date='2025-01-31', depreciation_value=1232.29, remaining_value=33623.96, depreciated_value=66376.04, state='draft'), + self._get_depreciation_move_values(date='2025-02-28', depreciation_value=1232.29, remaining_value=32391.67, depreciated_value=67608.33, state='draft'), + self._get_depreciation_move_values(date='2025-03-31', depreciation_value=1232.29, remaining_value=31159.38, depreciated_value=68840.62, state='draft'), + self._get_depreciation_move_values(date='2025-04-30', depreciation_value=1232.30, remaining_value=29927.08, depreciated_value=70072.92, state='draft'), + self._get_depreciation_move_values(date='2025-05-31', depreciation_value=1232.29, remaining_value=28694.79, depreciated_value=71305.21, state='draft'), + self._get_depreciation_move_values(date='2025-06-30', depreciation_value=1232.29, remaining_value=27462.50, depreciated_value=72537.50, state='draft'), + + self._get_depreciation_move_values(date='2025-07-31', depreciation_value=1144.27, remaining_value=26318.23, depreciated_value=73681.77, state='draft'), + self._get_depreciation_move_values(date='2025-08-31', depreciation_value=1144.27, remaining_value=25173.96, depreciated_value=74826.04, state='draft'), + self._get_depreciation_move_values(date='2025-09-30', depreciation_value=1144.27, remaining_value=24029.69, depreciated_value=75970.31, state='draft'), + self._get_depreciation_move_values(date='2025-10-31', depreciation_value=1144.27, remaining_value=22885.42, depreciated_value=77114.58, state='draft'), + self._get_depreciation_move_values(date='2025-11-30', depreciation_value=1144.27, remaining_value=21741.15, depreciated_value=78258.85, state='draft'), + self._get_depreciation_move_values(date='2025-12-31', depreciation_value=1144.27, remaining_value=20596.88, depreciated_value=79403.12, state='draft'), + self._get_depreciation_move_values(date='2026-01-31', depreciation_value=1144.28, remaining_value=19452.60, depreciated_value=80547.40, state='draft'), + self._get_depreciation_move_values(date='2026-02-28', depreciation_value=1144.27, remaining_value=18308.33, depreciated_value=81691.67, state='draft'), + self._get_depreciation_move_values(date='2026-03-31', depreciation_value=1144.27, remaining_value=17164.06, depreciated_value=82835.94, state='draft'), + self._get_depreciation_move_values(date='2026-04-30', depreciation_value=1144.27, remaining_value=16019.79, depreciated_value=83980.21, state='draft'), + self._get_depreciation_move_values(date='2026-05-31', depreciation_value=1144.27, remaining_value=14875.52, depreciated_value=85124.48, state='draft'), + self._get_depreciation_move_values(date='2026-06-30', depreciation_value=1144.27, remaining_value=13731.25, depreciated_value=86268.75, state='draft'), + + self._get_depreciation_move_values(date='2026-07-31', depreciation_value=1144.27, remaining_value=12586.98, depreciated_value=87413.02, state='draft'), + self._get_depreciation_move_values(date='2026-08-31', depreciation_value=1144.27, remaining_value=11442.71, depreciated_value=88557.29, state='draft'), + self._get_depreciation_move_values(date='2026-09-30', depreciation_value=1144.27, remaining_value=10298.44, depreciated_value=89701.56, state='draft'), + self._get_depreciation_move_values(date='2026-10-31', depreciation_value=1144.27, remaining_value=9154.17, depreciated_value=90845.83, state='draft'), + self._get_depreciation_move_values(date='2026-11-30', depreciation_value=1144.27, remaining_value=8009.90, depreciated_value=91990.10, state='draft'), + self._get_depreciation_move_values(date='2026-12-31', depreciation_value=1144.27, remaining_value=6865.63, depreciated_value=93134.37, state='draft'), + self._get_depreciation_move_values(date='2027-01-31', depreciation_value=1144.28, remaining_value=5721.35, depreciated_value=94278.65, state='draft'), + self._get_depreciation_move_values(date='2027-02-28', depreciation_value=1144.27, remaining_value=4577.08, depreciated_value=95422.92, state='draft'), + self._get_depreciation_move_values(date='2027-03-31', depreciation_value=1144.27, remaining_value=3432.81, depreciated_value=96567.19, state='draft'), + self._get_depreciation_move_values(date='2027-04-30', depreciation_value=1144.27, remaining_value=2288.54, depreciated_value=97711.46, state='draft'), + self._get_depreciation_move_values(date='2027-05-31', depreciation_value=1144.27, remaining_value=1144.27, depreciated_value=98855.73, state='draft'), + self._get_depreciation_move_values(date='2027-06-30', depreciation_value=1144.27, remaining_value=0.00, depreciated_value=100000.00, state='draft'), + ]) + + def test_degressive_60_months_no_prorata_with_imported_amount_asset(self): + self.car.write({ + 'method_number': 60, + 'method_period': '1', + 'method': 'degressive', + 'method_progress_factor': 0.3, + 'already_depreciated_amount_import': 2000, + }) + self.car.validate() + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 24500) + self.assertRecordValues(self.car.depreciation_move_ids, [ + # 2020 + self._get_depreciation_move_values(date='2020-02-29', depreciation_value=1000.0, remaining_value=57000.0, depreciated_value=3000.0, state='posted'), + self._get_depreciation_move_values(date='2020-03-31', depreciation_value=1500.0, remaining_value=55500.0, depreciated_value=4500.0, state='posted'), + self._get_depreciation_move_values(date='2020-04-30', depreciation_value=1500.0, remaining_value=54000.0, depreciated_value=6000.0, state='posted'), + self._get_depreciation_move_values(date='2020-05-31', depreciation_value=1500.0, remaining_value=52500.0, depreciated_value=7500.0, state='posted'), + self._get_depreciation_move_values(date='2020-06-30', depreciation_value=1500.0, remaining_value=51000.0, depreciated_value=9000.0, state='posted'), + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=1500.0, remaining_value=49500.0, depreciated_value=10500.0, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=1500.0, remaining_value=48000.0, depreciated_value=12000.0, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=1500.0, remaining_value=46500.0, depreciated_value=13500.0, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=1500.0, remaining_value=45000.0, depreciated_value=15000.0, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=1500.0, remaining_value=43500.0, depreciated_value=16500.0, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=1500.0, remaining_value=42000.0, depreciated_value=18000.0, state='posted'), + # 2021 + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=1050.0, remaining_value=40950.0, depreciated_value=19050.0, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=1050.0, remaining_value=39900.0, depreciated_value=20100.0, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=1050.0, remaining_value=38850.0, depreciated_value=21150.0, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=1050.0, remaining_value=37800.0, depreciated_value=22200.0, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=1050.0, remaining_value=36750.0, depreciated_value=23250.0, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=1050.0, remaining_value=35700.0, depreciated_value=24300.0, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=1050.0, remaining_value=34650.0, depreciated_value=25350.0, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=1050.0, remaining_value=33600.0, depreciated_value=26400.0, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=1050.0, remaining_value=32550.0, depreciated_value=27450.0, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=1050.0, remaining_value=31500.0, depreciated_value=28500.0, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=1050.0, remaining_value=30450.0, depreciated_value=29550.0, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=1050.0, remaining_value=29400.0, depreciated_value=30600.0, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=816.67, remaining_value=28583.33, depreciated_value=31416.67, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=816.66, remaining_value=27766.67, depreciated_value=32233.33, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=816.67, remaining_value=26950.0, depreciated_value=33050.0, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=816.67, remaining_value=26133.33, depreciated_value=33866.67, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=816.66, remaining_value=25316.67, depreciated_value=34683.33, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=816.67, remaining_value=24500.0, depreciated_value=35500.0, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=816.67, remaining_value=23683.33, depreciated_value=36316.67, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=816.66, remaining_value=22866.67, depreciated_value=37133.33, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=816.67, remaining_value=22050.0, depreciated_value=37950.0, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=816.67, remaining_value=21233.33, depreciated_value=38766.67, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=816.66, remaining_value=20416.67, depreciated_value=39583.33, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=816.67, remaining_value=19600.0, depreciated_value=40400.0, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=816.67, remaining_value=18783.33, depreciated_value=41216.67, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=816.66, remaining_value=17966.67, depreciated_value=42033.33, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=816.67, remaining_value=17150.0, depreciated_value=42850.0, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=816.67, remaining_value=16333.33, depreciated_value=43666.67, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=816.66, remaining_value=15516.67, depreciated_value=44483.33, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=816.67, remaining_value=14700.0, depreciated_value=45300.0, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=816.67, remaining_value=13883.33, depreciated_value=46116.67, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=816.66, remaining_value=13066.67, depreciated_value=46933.33, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=816.67, remaining_value=12250.0, depreciated_value=47750.0, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=816.67, remaining_value=11433.33, depreciated_value=48566.67, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=816.66, remaining_value=10616.67, depreciated_value=49383.33, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=816.67, remaining_value=9800.0, depreciated_value=50200.0, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=816.67, remaining_value=8983.33, depreciated_value=51016.67, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=816.66, remaining_value=8166.67, depreciated_value=51833.33, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=816.67, remaining_value=7350.0, depreciated_value=52650.0, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=816.67, remaining_value=6533.33, depreciated_value=53466.67, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=816.66, remaining_value=5716.67, depreciated_value=54283.33, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=816.67, remaining_value=4900.0, depreciated_value=55100.0, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=816.67, remaining_value=4083.33, depreciated_value=55916.67, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=816.66, remaining_value=3266.67, depreciated_value=56733.33, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=816.67, remaining_value=2450.0, depreciated_value=57550.0, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=816.67, remaining_value=1633.33, depreciated_value=58366.67, state='draft'), + self._get_depreciation_move_values(date='2024-11-30', depreciation_value=816.66, remaining_value=816.67, depreciated_value=59183.33, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=816.67, remaining_value=0.0, depreciated_value=60000.0, state='draft'), + ]) + + def test_degressive_60_months_no_prorata_with_salvage_value_asset(self): + self.car.write({ + 'method_number': 60, + 'method_period': '1', + 'method': 'degressive', + 'method_progress_factor': 0.3, + 'salvage_value': 2000, + }) + self.car.validate() + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 25683.33) + self.assertEqual(self.car.value_residual, 23683.33) + self.assertRecordValues(self.car.depreciation_move_ids, [ + # 2020 + self._get_depreciation_move_values(date='2020-01-31', depreciation_value=1450.0, remaining_value=56550.0, depreciated_value=1450.0, state='posted'), + self._get_depreciation_move_values(date='2020-02-29', depreciation_value=1450.0, remaining_value=55100.0, depreciated_value=2900.0, state='posted'), + self._get_depreciation_move_values(date='2020-03-31', depreciation_value=1450.0, remaining_value=53650.0, depreciated_value=4350.0, state='posted'), + self._get_depreciation_move_values(date='2020-04-30', depreciation_value=1450.0, remaining_value=52200.0, depreciated_value=5800.0, state='posted'), + self._get_depreciation_move_values(date='2020-05-31', depreciation_value=1450.0, remaining_value=50750.0, depreciated_value=7250.0, state='posted'), + self._get_depreciation_move_values(date='2020-06-30', depreciation_value=1450.0, remaining_value=49300.0, depreciated_value=8700.0, state='posted'), + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=1450.0, remaining_value=47850.0, depreciated_value=10150.0, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=1450.0, remaining_value=46400.0, depreciated_value=11600.0, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=1450.0, remaining_value=44950.0, depreciated_value=13050.0, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=1450.0, remaining_value=43500.0, depreciated_value=14500.0, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=1450.0, remaining_value=42050.0, depreciated_value=15950.0, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=1450.0, remaining_value=40600.0, depreciated_value=17400.0, state='posted'), + # 2021 + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=1015.0, remaining_value=39585.0, depreciated_value=18415.0, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=1015.0, remaining_value=38570.0, depreciated_value=19430.0, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=1015.0, remaining_value=37555.0, depreciated_value=20445.0, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=1015.0, remaining_value=36540.0, depreciated_value=21460.0, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=1015.0, remaining_value=35525.0, depreciated_value=22475.0, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=1015.0, remaining_value=34510.0, depreciated_value=23490.0, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=1015.0, remaining_value=33495.0, depreciated_value=24505.0, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=1015.0, remaining_value=32480.0, depreciated_value=25520.0, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=1015.0, remaining_value=31465.0, depreciated_value=26535.0, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=1015.0, remaining_value=30450.0, depreciated_value=27550.0, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=1015.0, remaining_value=29435.0, depreciated_value=28565.0, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=1015.0, remaining_value=28420.0, depreciated_value=29580.0, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=789.44, remaining_value=27630.56, depreciated_value=30369.44, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=789.45, remaining_value=26841.11, depreciated_value=31158.89, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=789.44, remaining_value=26051.67, depreciated_value=31948.33, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=789.45, remaining_value=25262.22, depreciated_value=32737.78, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=789.44, remaining_value=24472.78, depreciated_value=33527.22, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=789.45, remaining_value=23683.33, depreciated_value=34316.67, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=789.44, remaining_value=22893.89, depreciated_value=35106.11, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=789.45, remaining_value=22104.44, depreciated_value=35895.56, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=789.44, remaining_value=21315.0, depreciated_value=36685.0, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=789.44, remaining_value=20525.56, depreciated_value=37474.44, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=789.45, remaining_value=19736.11, depreciated_value=38263.89, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=789.44, remaining_value=18946.67, depreciated_value=39053.33, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=789.44, remaining_value=18157.23, depreciated_value=39842.77, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=789.45, remaining_value=17367.78, depreciated_value=40632.22, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=789.44, remaining_value=16578.34, depreciated_value=41421.66, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=789.45, remaining_value=15788.89, depreciated_value=42211.11, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=789.44, remaining_value=14999.45, depreciated_value=43000.55, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=789.45, remaining_value=14210.0, depreciated_value=43790.0, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=789.44, remaining_value=13420.56, depreciated_value=44579.44, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=789.45, remaining_value=12631.11, depreciated_value=45368.89, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=789.44, remaining_value=11841.67, depreciated_value=46158.33, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=789.45, remaining_value=11052.22, depreciated_value=46947.78, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=789.44, remaining_value=10262.78, depreciated_value=47737.22, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=789.45, remaining_value=9473.33, depreciated_value=48526.67, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=789.44, remaining_value=8683.89, depreciated_value=49316.11, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=789.45, remaining_value=7894.44, depreciated_value=50105.56, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=789.44, remaining_value=7105.0, depreciated_value=50895.0, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=789.45, remaining_value=6315.55, depreciated_value=51684.45, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=789.44, remaining_value=5526.11, depreciated_value=52473.89, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=789.45, remaining_value=4736.66, depreciated_value=53263.34, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=789.44, remaining_value=3947.22, depreciated_value=54052.78, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=789.44, remaining_value=3157.78, depreciated_value=54842.22, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=789.45, remaining_value=2368.33, depreciated_value=55631.67, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=789.44, remaining_value=1578.89, depreciated_value=56421.11, state='draft'), + self._get_depreciation_move_values(date='2024-11-30', depreciation_value=789.45, remaining_value=789.44, depreciated_value=57210.56, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=789.44, remaining_value=0.0, depreciated_value=58000.0, state='draft'), + ]) + + def test_degressive_5_years_from_beggining_of_year(self): + asset = self.create_asset( + value=100000, + periodicity='yearly', + periods=5, + method='degressive', + method_progress_factor=0.35, + acquisition_date='2022-01-01', + prorata_computation_type='constant_periods' + ) + asset.compute_depreciation_board() + self.assertEqual(asset.state, 'draft') + self.assertEqual(asset.book_value, 100000) + self.assertRecordValues(asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=35000.00, remaining_value=65000.00, depreciated_value=35000.00, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=22750.00, remaining_value=42250.00, depreciated_value=57750.00, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=14787.50, remaining_value=27462.50, depreciated_value=72537.50, state='draft'), + self._get_depreciation_move_values(date='2025-12-31', depreciation_value=13731.25, remaining_value=13731.25, depreciated_value=86268.75, state='draft'), + self._get_depreciation_move_values(date='2026-12-31', depreciation_value=13731.25, remaining_value=0.00, depreciated_value=100000.00, state='draft'), + ]) + + def test_degressive_5_years_from_middle_of_year(self): + asset = self.create_asset( + value=100000, + periodicity='yearly', + periods=5, + method='degressive', + method_progress_factor=0.35, + acquisition_date='2022-07-01', + prorata_computation_type='constant_periods' + ) + asset.compute_depreciation_board() + self.assertEqual(asset.state, 'draft') + self.assertEqual(asset.book_value, 100000) + self.assertRecordValues(asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=17500.00, remaining_value=82500.00, depreciated_value=17500.00, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=28875.00, remaining_value=53625.00, depreciated_value=46375.00, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=18768.75, remaining_value=34856.25, depreciated_value=65143.75, state='draft'), + self._get_depreciation_move_values(date='2025-12-31', depreciation_value=13942.50, remaining_value=20913.75, depreciated_value=79086.25, state='draft'), + self._get_depreciation_move_values(date='2026-12-31', depreciation_value=13942.50, remaining_value=6971.25, depreciated_value=93028.75, state='draft'), + self._get_depreciation_move_values(date='2027-12-31', depreciation_value=6971.25, remaining_value=0.00, depreciated_value=100000.00, state='draft'), + ]) + + def test_compute_board_in_mass(self): + book = self.create_asset(value=35, periodicity="monthly", periods=2, method="linear", salvage_value=0) + shelf = self.create_asset(value=250, periodicity="monthly", periods=8, method="linear", salvage_value=0) + screw = self.create_asset(value=1, periodicity="monthly", periods=1, method="linear", salvage_value=0) + + (book + screw).validate() + (book + shelf + screw).compute_depreciation_board() + + self.assertRecordValues(book.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-01-31', depreciation_value=17.5, remaining_value=17.5, depreciated_value=17.5, state='posted'), + self._get_depreciation_move_values(date='2020-02-29', depreciation_value=17.5, remaining_value=0, depreciated_value=35, state='posted'), + ]) + + self.assertRecordValues(shelf.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-01-31', depreciation_value=31.25, remaining_value=218.75, depreciated_value=31.25, state='draft'), + self._get_depreciation_move_values(date='2020-02-29', depreciation_value=31.25, remaining_value=187.5, depreciated_value=62.5, state='draft'), + self._get_depreciation_move_values(date='2020-03-31', depreciation_value=31.25, remaining_value=156.25, depreciated_value=93.75, state='draft'), + self._get_depreciation_move_values(date='2020-04-30', depreciation_value=31.25, remaining_value=125, depreciated_value=125, state='draft'), + self._get_depreciation_move_values(date='2020-05-31', depreciation_value=31.25, remaining_value=93.75, depreciated_value=156.25, state='draft'), + self._get_depreciation_move_values(date='2020-06-30', depreciation_value=31.25, remaining_value=62.5, depreciated_value=187.5, state='draft'), + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=31.25, remaining_value=31.25, depreciated_value=218.75, state='draft'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=31.25, remaining_value=0, depreciated_value=250, state='draft'), + ]) + + self.assertRecordValues(screw.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-01-31', depreciation_value=1, remaining_value=0, depreciated_value=1, state='posted'), + ]) + def test_copy_prorata_date(self): + """ Verifies that prorata date and acquisition date are copied when duplicate an asset + For this test, the prorata computation type is set to None. + The idea is of this test is to verify that we do copy prorata date. + """ + old_car_asset = self.create_asset( + value=60000, + periodicity='yearly', + periods=5, + method='linear', + salvage_value=0, + + ) + old_car_asset.validate() + + self.assertEqual(old_car_asset.state, 'open') + self.assertEqual(old_car_asset.book_value, 36000) + self.assertEqual(old_car_asset.acquisition_date, fields.Date.from_string('2020-02-01')) + self.assertEqual(old_car_asset.prorata_date, fields.Date.from_string('2020-01-01')) + self.assertRecordValues(old_car_asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=12000, remaining_value=48000, depreciated_value=12000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12000, remaining_value=36000, depreciated_value=24000, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=12000, remaining_value=24000, depreciated_value=36000, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=12000, remaining_value=12000, depreciated_value=48000, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=12000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + new_car_asset = old_car_asset.copy() + new_car_asset.original_value = 60000 + new_car_asset.validate() + + self.assertEqual(new_car_asset.state, 'open') + self.assertEqual(new_car_asset.book_value, 36000) + self.assertEqual(new_car_asset.acquisition_date, fields.Date.from_string('2020-02-01')) + self.assertEqual(new_car_asset.prorata_date, fields.Date.from_string('2020-01-01')) + self.assertRecordValues(new_car_asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=12000, remaining_value=48000, depreciated_value=12000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12000, remaining_value=36000, depreciated_value=24000, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=12000, remaining_value=24000, depreciated_value=36000, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=12000, remaining_value=12000, depreciated_value=48000, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=12000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_change_computation_method_before_lock_date(self): + """Test that we can change the computation method when there are draft moves before the lock date. + """ + self.car.company_id.fiscalyear_lock_date = '2022-06-30' + self.car.compute_depreciation_board() + + self.assertEqual(self.car.state, 'draft') + self.assertEqual(self.car.book_value, 60000) + self.assertRecordValues(self.car.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=12000, remaining_value=48000, depreciated_value=12000, state='draft'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12000, remaining_value=36000, depreciated_value=24000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=12000, remaining_value=24000, depreciated_value=36000, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=12000, remaining_value=12000, depreciated_value=48000, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=12000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + # Change the computation type + self.car.prorata_computation_type = 'constant_periods' + self.car.prorata_date = '2021-01-01' + self.car.compute_depreciation_board() + + self.assertEqual(self.car.state, 'draft') + self.assertEqual(self.car.book_value, 60000) + self.assertRecordValues(self.car.depreciation_move_ids.sorted(lambda m: (m.date, m.id)), [ + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12000, remaining_value=48000, depreciated_value=12000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=12000, remaining_value=36000, depreciated_value=24000, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=12000, remaining_value=24000, depreciated_value=36000, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=12000, remaining_value=12000, depreciated_value=48000, state='draft'), + self._get_depreciation_move_values(date='2025-12-31', depreciation_value=12000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_post_moves_after_lock_date(self): + """Test that we can change the computation method when there are draft moves before the lock date. + """ + self.car.company_id.fiscalyear_lock_date = '2021-06-30' + self.car.compute_depreciation_board() + + self.assertEqual(self.car.state, 'draft') + self.assertEqual(self.car.book_value, 60000) + self.assertRecordValues(self.car.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=12000, remaining_value=48000, depreciated_value=12000, state='draft'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12000, remaining_value=36000, depreciated_value=24000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=12000, remaining_value=24000, depreciated_value=36000, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=12000, remaining_value=12000, depreciated_value=48000, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=12000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + self.car.validate() + + self.assertEqual(self.car.state, 'open') + self.assertEqual(self.car.book_value, 36000) + self.assertRecordValues(self.car.depreciation_move_ids, [ + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=12000, remaining_value=48000, depreciated_value=12000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=12000, remaining_value=36000, depreciated_value=24000, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=12000, remaining_value=24000, depreciated_value=36000, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=12000, remaining_value=12000, depreciated_value=48000, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=12000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_assets_one_complete_period(self): + """Test the depreciation move value in case of having just one complete period (year or month) asset.""" + datas = [ + ('monthly', '2022-01-31', 'linear'), + ('monthly', '2022-01-31', 'degressive'), + ('monthly', '2022-01-31', 'degressive_then_linear'), + ('yearly', '2022-12-31', 'linear'), + ('yearly', '2022-12-31', 'degressive'), + ('yearly', '2022-12-31', 'degressive_then_linear'), + ] + for periodicity, end_depreciation_date, method in datas: + with self.subTest(period=periodicity, method=method, end_depreciation_date=end_depreciation_date): + asset = self.create_asset( + value=1000, + periodicity=periodicity, + periods=1, + method=method, + acquisition_date='2022-01-01', + prorata_date='2022-01-01', + prorata_computation_type='constant_periods', + account_depreciation_id=self.company_data['default_account_assets'].id, + ) + + asset.compute_depreciation_board() + self.assertEqual(asset.state, 'draft') + self.assertRecordValues(asset.depreciation_move_ids, [ + self._get_depreciation_move_values(date=end_depreciation_date, depreciation_value=1000.0, remaining_value=0.0, depreciated_value=1000.0, state='draft'), + ]) + asset.validate() + self.assertEqual(asset.state, 'open') diff --git a/dev_odex30_accounting/odex30_account_asset/tests/test_reevaluation_asset.py b/dev_odex30_accounting/odex30_account_asset/tests/test_reevaluation_asset.py new file mode 100644 index 0000000..330dd77 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/tests/test_reevaluation_asset.py @@ -0,0 +1,1662 @@ +from unittest.mock import patch +from odoo.tests.common import tagged, freeze_time +from odoo.addons.odex30_account_asset.tests.common import TestAccountAssetCommon +from odoo import fields + + +@freeze_time('2022-06-30') +@tagged('post_install', '-at_install') +class TestAccountAssetReevaluation(TestAccountAssetCommon): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.account_depreciation_expense = cls.company_data['default_account_assets'].copy() + cls.asset_counterpart_account_id = cls.company_data['default_account_expense'].copy() + cls.degressive_asset = cls.create_asset( + value=7200, + periodicity="monthly", + periods=60, + method="degressive", + method_progress_factor=0.35, + acquisition_date="2020-07-01", + prorata_computation_type="constant_periods" + ) + cls.degressive_then_linear_asset = cls.create_asset( + value=7200, + periodicity="monthly", + periods=60, + method="degressive_then_linear", + method_progress_factor=0.35, + acquisition_date="2020-07-01", + prorata_computation_type="constant_periods" + ) + + def test_linear_start_beginning_month_reevaluation_beginning_month(self): + asset = self.create_asset(value=7200, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-02-01", prorata_computation_type="constant_periods") + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': fields.Date.to_date("2022-06-01"), + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=600, remaining_value=6600, depreciated_value=600, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=600, remaining_value=6000, depreciated_value=1200, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=600, remaining_value=5400, depreciated_value=1800, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=600, remaining_value=4800, depreciated_value=2400, state='posted'), + # 20 because we have 1 * 600 / 30 (1 day of a month of 30 days, with 600 per month) + self._get_depreciation_move_values(date='2022-06-01', depreciation_value=20, remaining_value=4780, depreciated_value=2420, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=580, remaining_value=4200, depreciated_value=3000, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=600, remaining_value=3600, depreciated_value=3600, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=600, remaining_value=3000, depreciated_value=4200, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=600, remaining_value=2400, depreciated_value=4800, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=600, remaining_value=1800, depreciated_value=5400, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=600, remaining_value=1200, depreciated_value=6000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=600, remaining_value=600, depreciated_value=6600, state='draft'), + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=600, remaining_value=0, depreciated_value=7200, state='draft'), + ]) + + def test_linear_start_beginning_month_reevaluation_middle_month(self): + asset = self.create_asset(value=7200, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-02-01", prorata_computation_type="constant_periods") + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': fields.Date.to_date("2022-06-15") + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=600, remaining_value=6600, depreciated_value=600, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=600, remaining_value=6000, depreciated_value=1200, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=600, remaining_value=5400, depreciated_value=1800, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=600, remaining_value=4800, depreciated_value=2400, state='posted'), + # 300 because we have 15 * 600 / 30 (15 days of a month of 30 days, with 600 per month) + self._get_depreciation_move_values(date='2022-06-15', depreciation_value=300, remaining_value=4500, depreciated_value=2700, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=300, remaining_value=4200, depreciated_value=3000, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=600, remaining_value=3600, depreciated_value=3600, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=600, remaining_value=3000, depreciated_value=4200, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=600, remaining_value=2400, depreciated_value=4800, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=600, remaining_value=1800, depreciated_value=5400, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=600, remaining_value=1200, depreciated_value=6000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=600, remaining_value=600, depreciated_value=6600, state='draft'), + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=600, remaining_value=0, depreciated_value=7200, state='draft'), + ]) + + def test_linear_start_beginning_month_reevaluation_end_month(self): + asset = self.create_asset(value=7200, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-02-01", prorata_computation_type="constant_periods") + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': fields.Date.to_date("2022-06-30") + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=600, remaining_value=6600, depreciated_value=600, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=600, remaining_value=6000, depreciated_value=1200, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=600, remaining_value=5400, depreciated_value=1800, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=600, remaining_value=4800, depreciated_value=2400, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=600, remaining_value=4200, depreciated_value=3000, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=600, remaining_value=3600, depreciated_value=3600, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=600, remaining_value=3000, depreciated_value=4200, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=600, remaining_value=2400, depreciated_value=4800, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=600, remaining_value=1800, depreciated_value=5400, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=600, remaining_value=1200, depreciated_value=6000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=600, remaining_value=600, depreciated_value=6600, state='draft'), + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=600, remaining_value=0, depreciated_value=7200, state='draft'), + ]) + + def test_linear_start_middle_month_reevaluation_beginning_month(self): + asset = self.create_asset(value=7200, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-02-15", prorata_computation_type="constant_periods") + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': fields.Date.to_date("2022-06-01"), + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=300, remaining_value=6900, depreciated_value=300, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=600, remaining_value=6300, depreciated_value=900, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=600, remaining_value=5700, depreciated_value=1500, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=600, remaining_value=5100, depreciated_value=2100, state='posted'), + # 20 because we have 1 * 600 / 30 (1 day of a month of 30 days, with 600 per month) + self._get_depreciation_move_values(date='2022-06-01', depreciation_value=20, remaining_value=5080, depreciated_value=2120, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=580, remaining_value=4500, depreciated_value=2700, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=600, remaining_value=3900, depreciated_value=3300, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=600, remaining_value=3300, depreciated_value=3900, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=600, remaining_value=2700, depreciated_value=4500, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=600, remaining_value=2100, depreciated_value=5100, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=600, remaining_value=1500, depreciated_value=5700, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=600, remaining_value=900, depreciated_value=6300, state='draft'), + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=600, remaining_value=300, depreciated_value=6900, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=300, remaining_value=0, depreciated_value=7200, state='draft'), + ]) + + def test_linear_start_middle_month_reevaluation_middle_month(self): + asset = self.create_asset(value=7200, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-02-15", prorata_computation_type="constant_periods") + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': fields.Date.to_date("2022-06-15"), + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=300, remaining_value=6900, depreciated_value=300, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=600, remaining_value=6300, depreciated_value=900, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=600, remaining_value=5700, depreciated_value=1500, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=600, remaining_value=5100, depreciated_value=2100, state='posted'), + # 300 because we have 15 * 600 / 30 (15 days of a month of 30 days, with 600 per month) + self._get_depreciation_move_values(date='2022-06-15', depreciation_value=300, remaining_value=4800, depreciated_value=2400, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=300, remaining_value=4500, depreciated_value=2700, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=600, remaining_value=3900, depreciated_value=3300, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=600, remaining_value=3300, depreciated_value=3900, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=600, remaining_value=2700, depreciated_value=4500, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=600, remaining_value=2100, depreciated_value=5100, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=600, remaining_value=1500, depreciated_value=5700, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=600, remaining_value=900, depreciated_value=6300, state='draft'), + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=600, remaining_value=300, depreciated_value=6900, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=300, remaining_value=0, depreciated_value=7200, state='draft'), + ]) + + def test_linear_start_middle_month_reevaluation_end_month(self): + asset = self.create_asset(value=7200, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-02-15", prorata_computation_type="constant_periods") + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': fields.Date.to_date("2022-06-30"), + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=300, remaining_value=6900, depreciated_value=300, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=600, remaining_value=6300, depreciated_value=900, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=600, remaining_value=5700, depreciated_value=1500, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=600, remaining_value=5100, depreciated_value=2100, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=600, remaining_value=4500, depreciated_value=2700, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=600, remaining_value=3900, depreciated_value=3300, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=600, remaining_value=3300, depreciated_value=3900, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=600, remaining_value=2700, depreciated_value=4500, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=600, remaining_value=2100, depreciated_value=5100, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=600, remaining_value=1500, depreciated_value=5700, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=600, remaining_value=900, depreciated_value=6300, state='draft'), + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=600, remaining_value=300, depreciated_value=6900, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=300, remaining_value=0, depreciated_value=7200, state='draft'), + ]) + + def test_linear_start_end_month_reevaluation_beginning_month(self): + asset = self.create_asset(value=7200, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-02-28", prorata_computation_type="constant_periods") + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': fields.Date.to_date("2022-06-01"), + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=21.43, remaining_value=7178.57, depreciated_value=21.43, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=600, remaining_value=6578.57, depreciated_value=621.43, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=600, remaining_value=5978.57, depreciated_value=1221.43, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=600, remaining_value=5378.57, depreciated_value=1821.43, state='posted'), + # 20 because we have 1 * 600 / 30 (1 day of a month of 30 days, with 600 per month) + self._get_depreciation_move_values(date='2022-06-01', depreciation_value=20, remaining_value=5358.57, depreciated_value=1841.43, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=580, remaining_value=4778.57, depreciated_value=2421.43, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=600, remaining_value=4178.57, depreciated_value=3021.43, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=600, remaining_value=3578.57, depreciated_value=3621.43, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=600, remaining_value=2978.57, depreciated_value=4221.43, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=600, remaining_value=2378.57, depreciated_value=4821.43, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=600, remaining_value=1778.57, depreciated_value=5421.43, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=600, remaining_value=1178.57, depreciated_value=6021.43, state='draft'), + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=600, remaining_value=578.57, depreciated_value=6621.43, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=578.57, remaining_value=0, depreciated_value=7200, state='draft'), + ]) + + def test_linear_start_end_month_reevaluation_middle_month(self): + asset = self.create_asset(value=7200, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-02-28", prorata_computation_type="constant_periods") + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': fields.Date.to_date("2022-06-15"), + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=21.43, remaining_value=7178.57, depreciated_value=21.43, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=600, remaining_value=6578.57, depreciated_value=621.43, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=600, remaining_value=5978.57, depreciated_value=1221.43, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=600, remaining_value=5378.57, depreciated_value=1821.43, state='posted'), + # 300 because we have 15 * 600 / 30 (15 days of a month of 30 days, with 600 per month) + self._get_depreciation_move_values(date='2022-06-15', depreciation_value=300, remaining_value=5078.57, depreciated_value=2121.43, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=300, remaining_value=4778.57, depreciated_value=2421.43, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=600, remaining_value=4178.57, depreciated_value=3021.43, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=600, remaining_value=3578.57, depreciated_value=3621.43, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=600, remaining_value=2978.57, depreciated_value=4221.43, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=600, remaining_value=2378.57, depreciated_value=4821.43, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=600, remaining_value=1778.57, depreciated_value=5421.43, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=600, remaining_value=1178.57, depreciated_value=6021.43, state='draft'), + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=600, remaining_value=578.57, depreciated_value=6621.43, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=578.57, remaining_value=0, depreciated_value=7200, state='draft'), + ]) + + def test_linear_start_end_month_reevaluation_end_month(self): + asset = self.create_asset(value=7200, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-02-28", prorata_computation_type="constant_periods") + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': fields.Date.to_date("2022-06-30"), + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=21.43, remaining_value=7178.57, depreciated_value=21.43, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=600, remaining_value=6578.57, depreciated_value=621.43, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=600, remaining_value=5978.57, depreciated_value=1221.43, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=600, remaining_value=5378.57, depreciated_value=1821.43, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=600, remaining_value=4778.57, depreciated_value=2421.43, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=600, remaining_value=4178.57, depreciated_value=3021.43, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=600, remaining_value=3578.57, depreciated_value=3621.43, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=600, remaining_value=2978.57, depreciated_value=4221.43, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=600, remaining_value=2378.57, depreciated_value=4821.43, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=600, remaining_value=1778.57, depreciated_value=5421.43, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=600, remaining_value=1178.57, depreciated_value=6021.43, state='draft'), + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=600, remaining_value=578.57, depreciated_value=6621.43, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=578.57, remaining_value=0, depreciated_value=7200, state='draft'), + ]) + + def test_linear_reevaluation_simple_decrease(self): + asset = self.create_asset(value=10000, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-01-01", prorata_computation_type="constant_periods") + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': fields.Date.to_date("2022-06-30"), + 'value_residual': 4000, # -1000 + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=833.33, remaining_value=9166.67, depreciated_value=833.33, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=833.34, remaining_value=8333.33, depreciated_value=1666.67, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=833.33, remaining_value=7500, depreciated_value=2500, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=833.33, remaining_value=6666.67, depreciated_value=3333.33, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=833.34, remaining_value=5833.33, depreciated_value=4166.67, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=833.33, remaining_value=5000, depreciated_value=5000, state='posted'), + # decrease move + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=1000, remaining_value=4000, depreciated_value=6000, state='posted'), + + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=666.67, remaining_value=3333.33, depreciated_value=6666.67, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=666.66, remaining_value=2666.67, depreciated_value=7333.33, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=666.67, remaining_value=2000, depreciated_value=8000, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=666.67, remaining_value=1333.33, depreciated_value=8666.67, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=666.66, remaining_value=666.67, depreciated_value=9333.33, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=666.67, remaining_value=0, depreciated_value=10000, state='draft'), + ]) + + def test_linear_reevaluation_double_decrease(self): + asset = self.create_asset(value=60000, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-01-01", prorata_computation_type="constant_periods") + asset.validate() + + date_modify = fields.Date.to_date("2022-04-15") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify, + 'value_residual': asset._get_residual_value_at_date(date_modify) - 8500, + }).modify() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': fields.Date.to_date("2022-06-30"), + 'value_residual': 18000, # -6000 + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=5000, remaining_value=55000, depreciated_value=5000, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=5000, remaining_value=50000, depreciated_value=10000, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=5000, remaining_value=45000, depreciated_value=15000, state='posted'), + self._get_depreciation_move_values(date='2022-04-15', depreciation_value=2500, remaining_value=42500, depreciated_value=17500, state='posted'), + # decrease move + self._get_depreciation_move_values(date='2022-04-15', depreciation_value=8500, remaining_value=34000, depreciated_value=26000, state='posted'), + + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=2000, remaining_value=32000, depreciated_value=28000, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=4000, remaining_value=28000, depreciated_value=32000, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=4000, remaining_value=24000, depreciated_value=36000, state='posted'), + # decrease move + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=6000, remaining_value=18000, depreciated_value=42000, state='posted'), + + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=3000, remaining_value=15000, depreciated_value=45000, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=3000, remaining_value=12000, depreciated_value=48000, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=3000, remaining_value=9000, depreciated_value=51000, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=3000, remaining_value=6000, depreciated_value=54000, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=3000, remaining_value=3000, depreciated_value=57000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=3000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_linear_reevaluation_double_increase(self): + asset = self.create_asset(value=60000, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-01-01", prorata_computation_type="constant_periods") + asset.validate() + + date_modify_1 = fields.Date.to_date("2022-04-15") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify_1, + 'value_residual': asset._get_residual_value_at_date(date_modify_1) + 8500, + "account_asset_counterpart_id": self.asset_counterpart_account_id.id, + }).modify() + + date_modify_2 = fields.Date.to_date("2022-06-30") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify_2, + 'value_residual': asset._get_residual_value_at_date(date_modify_2) + 6000, + "account_asset_counterpart_id": self.asset_counterpart_account_id.id, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=5000, remaining_value=55000, depreciated_value=5000, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=5000, remaining_value=50000, depreciated_value=10000, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=5000, remaining_value=45000, depreciated_value=15000, state='posted'), + self._get_depreciation_move_values(date='2022-04-15', depreciation_value=2500, remaining_value=42500, depreciated_value=17500, state='posted'), + + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=2500, remaining_value=40000, depreciated_value=20000, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=5000, remaining_value=35000, depreciated_value=25000, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=5000, remaining_value=30000, depreciated_value=30000, state='posted'), + + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=5000, remaining_value=25000, depreciated_value=35000, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=5000, remaining_value=20000, depreciated_value=40000, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=5000, remaining_value=15000, depreciated_value=45000, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=5000, remaining_value=10000, depreciated_value=50000, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=5000, remaining_value=5000, depreciated_value=55000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=5000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + self.assertRecordValues(asset.children_ids[0].depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=500, remaining_value=8000, depreciated_value=500, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=1000, remaining_value=7000, depreciated_value=1500, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=1000, remaining_value=6000, depreciated_value=2500, state='posted'), + + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=1000, remaining_value=5000, depreciated_value=3500, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=1000, remaining_value=4000, depreciated_value=4500, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=1000, remaining_value=3000, depreciated_value=5500, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=1000, remaining_value=2000, depreciated_value=6500, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=1000, remaining_value=1000, depreciated_value=7500, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=1000, remaining_value=0, depreciated_value=8500, state='draft'), + ]) + + self.assertRecordValues(asset.children_ids[1].depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=1000, remaining_value=5000, depreciated_value=1000, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=1000, remaining_value=4000, depreciated_value=2000, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=1000, remaining_value=3000, depreciated_value=3000, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=1000, remaining_value=2000, depreciated_value=4000, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=1000, remaining_value=1000, depreciated_value=5000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=1000, remaining_value=0, depreciated_value=6000, state='draft'), + ]) + + def test_linear_reevaluation_decrease_then_increase(self): + asset = self.create_asset(value=60000, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-01-01", prorata_computation_type="constant_periods") + asset.validate() + + date_modify_1 = fields.Date.to_date("2022-04-15") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify_1, + 'value_residual': asset._get_residual_value_at_date(date_modify_1) - 8500, + }).modify() + + date_modify_2 = fields.Date.to_date("2022-06-30") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify_2, + 'value_residual': asset._get_residual_value_at_date(date_modify_2) + 6000, + "account_asset_counterpart_id": self.asset_counterpart_account_id.id, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=5000, remaining_value=55000, depreciated_value=5000, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=5000, remaining_value=50000, depreciated_value=10000, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=5000, remaining_value=45000, depreciated_value=15000, state='posted'), + self._get_depreciation_move_values(date='2022-04-15', depreciation_value=2500, remaining_value=42500, depreciated_value=17500, state='posted'), + # decrease move + self._get_depreciation_move_values(date='2022-04-15', depreciation_value=8500, remaining_value=34000, depreciated_value=26000, state='posted'), + + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=2000, remaining_value=32000, depreciated_value=28000, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=4000, remaining_value=28000, depreciated_value=32000, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=4000, remaining_value=24000, depreciated_value=36000, state='posted'), + + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=4000, remaining_value=20000, depreciated_value=40000, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=4000, remaining_value=16000, depreciated_value=44000, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=4000, remaining_value=12000, depreciated_value=48000, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=4000, remaining_value=8000, depreciated_value=52000, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=4000, remaining_value=4000, depreciated_value=56000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=4000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + self.assertRecordValues(asset.children_ids.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=1000, remaining_value=5000, depreciated_value=1000, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=1000, remaining_value=4000, depreciated_value=2000, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=1000, remaining_value=3000, depreciated_value=3000, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=1000, remaining_value=2000, depreciated_value=4000, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=1000, remaining_value=1000, depreciated_value=5000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=1000, remaining_value=0, depreciated_value=6000, state='draft'), + ]) + + def test_linear_reevaluation_increase_then_decrease_in_future(self): + asset = self.create_asset(value=10000, periodicity="yearly", periods=5, method="linear", acquisition_date="2018-01-01", prorata_computation_type="constant_periods") + asset.validate() + + date_modify_1 = fields.Date.to_date("2022-06-30") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify_1, + 'value_residual': asset._get_residual_value_at_date(date_modify_1) + 1000, + "account_asset_counterpart_id": self.asset_counterpart_account_id.id, + }).modify() + + date_modify_2 = fields.Date.to_date("2022-09-30") # This is 3 month in the future + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify_2, + 'value_residual': asset._get_residual_value_at_date(date_modify_2) - 200, + 'method_period': '1', # to reflect the change on the child, we go in monthly + 'method_number': 60, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2018-12-31', depreciation_value=2000, remaining_value=8000, depreciated_value=2000, state='posted'), + self._get_depreciation_move_values(date='2019-12-31', depreciation_value=2000, remaining_value=6000, depreciated_value=4000, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=2000, remaining_value=4000, depreciated_value=6000, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=2000, remaining_value=2000, depreciated_value=8000, state='posted'), + # move before increase + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=1000, remaining_value=1000, depreciated_value=9000, state='posted'), + # move before decrease + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=500, remaining_value=500, depreciated_value=9500, state='draft'), + # decrease move + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=200, remaining_value=300, depreciated_value=9700, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=100, remaining_value=200, depreciated_value=9800, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=100, remaining_value=100, depreciated_value=9900, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=100, remaining_value=0, depreciated_value=10000, state='draft'), + ]) + + self.assertRecordValues(asset.children_ids.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + # move before switch to monthly + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=500, remaining_value=500, depreciated_value=500, state='draft'), + + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=166.67, remaining_value=333.33, depreciated_value=666.67, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=166.66, remaining_value=166.67, depreciated_value=833.33, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=166.67, remaining_value=0, depreciated_value=1000, state='draft'), + ]) + + def test_linear_reevaluation_decrease_then_increase_with_lock_date(self): + self.company_data['company'].fiscalyear_lock_date = fields.Date.to_date('2022-03-01') + asset = self.create_asset(value=60000, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-01-01", prorata_computation_type="constant_periods") + asset.validate() + + date_modify_1 = fields.Date.to_date("2022-04-15") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify_1, + 'value_residual': asset._get_residual_value_at_date(date_modify_1) - 8500, + }).modify() + + self.company_data['company'].fiscalyear_lock_date = fields.Date.to_date('2022-05-01') + + date_modify_2 = fields.Date.to_date("2022-06-30") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify_2, + 'value_residual': asset._get_residual_value_at_date(date_modify_2) + 6000, + "account_asset_counterpart_id": self.asset_counterpart_account_id.id, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=5000, remaining_value=55000, depreciated_value=5000, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=5000, remaining_value=50000, depreciated_value=10000, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=5000, remaining_value=45000, depreciated_value=15000, state='posted'), + self._get_depreciation_move_values(date='2022-04-15', depreciation_value=2500, remaining_value=42500, depreciated_value=17500, state='posted'), + # decrease move + self._get_depreciation_move_values(date='2022-04-15', depreciation_value=8500, remaining_value=34000, depreciated_value=26000, state='posted'), + + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=2000, remaining_value=32000, depreciated_value=28000, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=4000, remaining_value=28000, depreciated_value=32000, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=4000, remaining_value=24000, depreciated_value=36000, state='posted'), + + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=4000, remaining_value=20000, depreciated_value=40000, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=4000, remaining_value=16000, depreciated_value=44000, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=4000, remaining_value=12000, depreciated_value=48000, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=4000, remaining_value=8000, depreciated_value=52000, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=4000, remaining_value=4000, depreciated_value=56000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=4000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + self.assertRecordValues(asset.children_ids.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=1000, remaining_value=5000, depreciated_value=1000, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=1000, remaining_value=4000, depreciated_value=2000, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=1000, remaining_value=3000, depreciated_value=3000, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=1000, remaining_value=2000, depreciated_value=4000, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=1000, remaining_value=1000, depreciated_value=5000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=1000, remaining_value=0, depreciated_value=6000, state='draft'), + ]) + + def test_linear_reevaluation_increase_then_decrease(self): + asset = self.create_asset(value=60000, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-01-01", prorata_computation_type="constant_periods") + asset.validate() + + date_modify_1 = fields.Date.to_date("2022-04-15") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify_1, + 'value_residual': asset._get_residual_value_at_date(date_modify_1) + 8500, + "account_asset_counterpart_id": self.asset_counterpart_account_id.id, + }).modify() + + date_modify_2 = fields.Date.to_date("2022-06-30") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify_2, + 'value_residual': asset._get_residual_value_at_date(date_modify_2) - 6000, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=5000, remaining_value=55000, depreciated_value=5000, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=5000, remaining_value=50000, depreciated_value=10000, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=5000, remaining_value=45000, depreciated_value=15000, state='posted'), + self._get_depreciation_move_values(date='2022-04-15', depreciation_value=2500, remaining_value=42500, depreciated_value=17500, state='posted'), + + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=2500, remaining_value=40000, depreciated_value=20000, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=5000, remaining_value=35000, depreciated_value=25000, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=5000, remaining_value=30000, depreciated_value=30000, state='posted'), + + # decrease move + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=6000, remaining_value=24000, depreciated_value=36000, state='posted'), + + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=4000, remaining_value=20000, depreciated_value=40000, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=4000, remaining_value=16000, depreciated_value=44000, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=4000, remaining_value=12000, depreciated_value=48000, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=4000, remaining_value=8000, depreciated_value=52000, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=4000, remaining_value=4000, depreciated_value=56000, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=4000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + self.assertRecordValues(asset.children_ids[0].depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=500, remaining_value=8000, depreciated_value=500, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=1000, remaining_value=7000, depreciated_value=1500, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=1000, remaining_value=6000, depreciated_value=2500, state='posted'), + + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=1000, remaining_value=5000, depreciated_value=3500, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=1000, remaining_value=4000, depreciated_value=4500, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=1000, remaining_value=3000, depreciated_value=5500, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=1000, remaining_value=2000, depreciated_value=6500, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=1000, remaining_value=1000, depreciated_value=7500, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=1000, remaining_value=0, depreciated_value=8500, state='draft'), + ]) + + def test_linear_reevaluation_decrease_then_disposal(self): + asset = self.create_asset(value=60000, periodicity="monthly", periods=12, method="linear", acquisition_date="2022-01-01", prorata_computation_type="constant_periods") + asset.validate() + self.loss_account_id = self.company_data['default_account_expense'].copy().id + + date_modify = fields.Date.to_date("2022-04-15") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify, + 'value_residual': asset._get_residual_value_at_date(date_modify) - 8500, + }).modify() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'date': fields.Date.to_date("2022-06-30"), + 'modify_action': 'dispose', + 'loss_account_id': self.loss_account_id, + }).sell_dispose() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=5000, remaining_value=55000, depreciated_value=5000, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=5000, remaining_value=50000, depreciated_value=10000, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=5000, remaining_value=45000, depreciated_value=15000, state='posted'), + self._get_depreciation_move_values(date='2022-04-15', depreciation_value=2500, remaining_value=42500, depreciated_value=17500, state='posted'), + # decrease move + self._get_depreciation_move_values(date='2022-04-15', depreciation_value=8500, remaining_value=34000, depreciated_value=26000, state='posted'), + + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=2000, remaining_value=32000, depreciated_value=28000, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=4000, remaining_value=28000, depreciated_value=32000, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=4000, remaining_value=24000, depreciated_value=36000, state='posted'), + + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=24000, remaining_value=0, depreciated_value=60000, state='draft'), + ]) + + def test_linear_reevaluation_increase_then_disposal(self): + asset = self.create_asset(value=36000, periodicity="yearly", periods=3, method="linear", acquisition_date="2022-01-01", prorata_computation_type="constant_periods") + asset.validate() + self.loss_account_id = self.company_data['default_account_expense'].copy().id + self.asset_counterpart_account_id = self.company_data['default_account_expense'].copy().id + + date_modify = fields.Date.to_date("2022-04-15") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify, + 'value_residual': asset._get_residual_value_at_date(date_modify) + 8500, + "account_asset_counterpart_id": self.asset_counterpart_account_id, + }).modify() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'date': fields.Date.to_date("2022-06-30"), + 'modify_action': 'dispose', + 'loss_account_id': self.loss_account_id, + }).sell_dispose() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-04-15', depreciation_value=3500, remaining_value=32500, depreciated_value=3500, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=2500, remaining_value=30000, depreciated_value=6000, state='posted'), + # disposal move + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=30000, remaining_value=0, depreciated_value=36000, state='draft'), + ]) + + self.assertRecordValues(asset.children_ids.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + # 653.85 = 8500 * (2.5 months * 30) / (32.5 months * 30) + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=653.85, remaining_value=7846.15, depreciated_value=653.85, state='posted'), + # disposal move + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=7846.15, remaining_value=0, depreciated_value=8500, state='draft'), + ]) + + def test_linear_reevaluation_increase_constant_periods(self): + asset = self.create_asset(value=1200, periodicity="monthly", periods=12, method="linear", acquisition_date="2021-10-01", prorata_computation_type="constant_periods") + asset.validate() + + date_modify = fields.Date.to_date("2022-01-15") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify, + 'modify_action': 'modify', + 'value_residual': asset._get_residual_value_at_date(date_modify) + 2100, + 'account_asset_counterpart_id': self.company_data['default_account_revenue'].copy().id, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=100, remaining_value=1100, depreciated_value=100, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=100, remaining_value=1000, depreciated_value=200, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=100, remaining_value=900, depreciated_value=300, state='posted'), + self._get_depreciation_move_values(date='2022-01-15', depreciation_value=48.39, remaining_value=851.61, depreciated_value=348.39, state='posted'), + + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=51.61, remaining_value=800, depreciated_value=400, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=100, remaining_value=700, depreciated_value=500, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=100, remaining_value=600, depreciated_value=600, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=100, remaining_value=500, depreciated_value=700, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=100, remaining_value=400, depreciated_value=800, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=100, remaining_value=300, depreciated_value=900, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=100, remaining_value=200, depreciated_value=1000, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=100, remaining_value=100, depreciated_value=1100, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=100, remaining_value=0, depreciated_value=1200, state='draft'), + ]) + + self.assertRecordValues(asset.children_ids.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=127.27, remaining_value=1972.73, depreciated_value=127.27, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=246.59, remaining_value=1726.14, depreciated_value=373.86, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=246.59, remaining_value=1479.55, depreciated_value=620.45, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=246.60, remaining_value=1232.95, depreciated_value=867.05, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=246.59, remaining_value=986.36, depreciated_value=1113.64, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=246.59, remaining_value=739.77, depreciated_value=1360.23, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=246.59, remaining_value=493.18, depreciated_value=1606.82, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=246.59, remaining_value=246.59, depreciated_value=1853.41, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=246.59, remaining_value=0, depreciated_value=2100, state='draft'), + ]) + + def test_linear_reevaluation_increase_daily_computation(self): + asset = self.create_asset(value=1200, periodicity="monthly", periods=12, method="linear", acquisition_date="2021-10-01", prorata_computation_type="daily_computation") + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': fields.Date.to_date("2022-01-15"), + 'modify_action': 'modify', + 'value_residual': 2945.75, + 'account_asset_counterpart_id': self.company_data['default_account_revenue'].copy().id, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=101.92, remaining_value=1098.08, depreciated_value=101.92, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=98.63, remaining_value=999.45, depreciated_value=200.55, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=101.92, remaining_value=897.53, depreciated_value=302.47, state='posted'), + self._get_depreciation_move_values(date='2022-01-15', depreciation_value=49.31, remaining_value=848.22, depreciated_value=351.78, state='posted'), + + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=52.60, remaining_value=795.62, depreciated_value=404.38, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=92.06, remaining_value=703.56, depreciated_value=496.44, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=101.92, remaining_value=601.64, depreciated_value=598.36, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=98.63, remaining_value=503.01, depreciated_value=696.99, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=101.91, remaining_value=401.10, depreciated_value=798.90, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=98.63, remaining_value=302.47, depreciated_value=897.53, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=101.92, remaining_value=200.55, depreciated_value=999.45, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=101.92, remaining_value=98.63, depreciated_value=1101.37, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=98.63, remaining_value=0, depreciated_value=1200, state='draft'), + ]) + + self.assertRecordValues(asset.children_ids.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=130.08, remaining_value=1967.45, depreciated_value=130.08, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=227.64, remaining_value=1739.81, depreciated_value=357.72, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=252.03, remaining_value=1487.78, depreciated_value=609.75, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=243.90, remaining_value=1243.88, depreciated_value=853.65, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=252.02, remaining_value=991.86, depreciated_value=1105.67, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=243.90, remaining_value=747.96, depreciated_value=1349.57, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=252.03, remaining_value=495.93, depreciated_value=1601.60, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=252.03, remaining_value=243.90, depreciated_value=1853.63, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=243.90, remaining_value=0, depreciated_value=2097.53, state='draft'), + ]) + + def test_linear_reevaluation_increase_amount_and_length(self): + """ After 5 months, extend the lifetime by 3 month and the amount by 200 """ + asset = self.create_asset(value=1200, periodicity="monthly", periods=10, method="linear", acquisition_date="2022-02-01", prorata_computation_type="constant_periods") + asset.validate() + + date_modify = fields.Date.to_date("2022-06-30") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'method_number': 10 + 3, + 'date': date_modify, + 'modify_action': 'modify', + 'value_residual': asset._get_residual_value_at_date(date_modify) + 200, + 'account_asset_counterpart_id': self.company_data['default_account_revenue'].copy().id, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=120, remaining_value=1080, depreciated_value=120, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=120, remaining_value=960, depreciated_value=240, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=120, remaining_value=840, depreciated_value=360, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=120, remaining_value=720, depreciated_value=480, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=120, remaining_value=600, depreciated_value=600, state='posted'), + # After the reeval, we divide the amount to depreciate left on the amount left + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=75, remaining_value=525, depreciated_value=675, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=75, remaining_value=450, depreciated_value=750, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=75, remaining_value=375, depreciated_value=825, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=75, remaining_value=300, depreciated_value=900, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=75, remaining_value=225, depreciated_value=975, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=75, remaining_value=150, depreciated_value=1050, state='draft'), + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=75, remaining_value=75, depreciated_value=1125, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=75, remaining_value=0, depreciated_value=1200, state='draft'), + ]) + + self.assertRecordValues(asset.children_ids.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=25, remaining_value=175, depreciated_value=25, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=25, remaining_value=150, depreciated_value=50, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=25, remaining_value=125, depreciated_value=75, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=25, remaining_value=100, depreciated_value=100, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=25, remaining_value=75, depreciated_value=125, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=25, remaining_value=50, depreciated_value=150, state='draft'), + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=25, remaining_value=25, depreciated_value=175, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=25, remaining_value=0, depreciated_value=200, state='draft'), + ]) + + def test_linear_reevaluation_decrease_amount_and_increase_length(self): + """ After 5 months, extend the lifetime by 3 month and reduce the amount by 200 """ + asset = self.create_asset(value=1200, periodicity="monthly", periods=10, method="linear", acquisition_date="2022-02-01", prorata_computation_type="constant_periods") + asset.validate() + + date_modify = fields.Date.to_date("2022-06-30") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'method_number': 10 + 3, + 'date': date_modify, + 'modify_action': 'modify', + 'value_residual': asset._get_residual_value_at_date(date_modify) - 200, + 'account_asset_counterpart_id': self.company_data['default_account_revenue'].copy().id, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=120, remaining_value=1080, depreciated_value=120, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=120, remaining_value=960, depreciated_value=240, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=120, remaining_value=840, depreciated_value=360, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=120, remaining_value=720, depreciated_value=480, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=120, remaining_value=600, depreciated_value=600, state='posted'), + # Decrease Move + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=200, remaining_value=400, depreciated_value=800, state='posted'), + # After the reeval, we divide the amount to depreciate left on the amount left + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=50, remaining_value=350, depreciated_value=850, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=50, remaining_value=300, depreciated_value=900, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=50, remaining_value=250, depreciated_value=950, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=50, remaining_value=200, depreciated_value=1000, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=50, remaining_value=150, depreciated_value=1050, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=50, remaining_value=100, depreciated_value=1100, state='draft'), + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=50, remaining_value=50, depreciated_value=1150, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=50, remaining_value=0, depreciated_value=1200, state='draft'), + ]) + + def test_monthly_degressive_start_beginning_month_increase_middle_month_on_degressive_part(self): + asset = self.degressive_asset + asset.validate() + + date_modify = fields.Date.to_date("2022-06-15") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify, + 'value_residual': asset._get_residual_value_at_date(date_modify) + 8500, + "account_asset_counterpart_id": self.asset_counterpart_account_id.id, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=210.00, remaining_value=6990.00, depreciated_value=210.00, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=210.00, remaining_value=6780.00, depreciated_value=420.00, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=210.00, remaining_value=6570.00, depreciated_value=630.00, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=210.00, remaining_value=6360.00, depreciated_value=840.00, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=210.00, remaining_value=6150.00, depreciated_value=1050.00, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=210.00, remaining_value=5940.00, depreciated_value=1260.00, state='posted'), + # 2021 + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=173.25, remaining_value=5766.75, depreciated_value=1433.25, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=173.25, remaining_value=5593.50, depreciated_value=1606.50, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=173.25, remaining_value=5420.25, depreciated_value=1779.75, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=173.25, remaining_value=5247.00, depreciated_value=1953.00, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=173.25, remaining_value=5073.75, depreciated_value=2126.25, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=173.25, remaining_value=4900.50, depreciated_value=2299.50, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=173.25, remaining_value=4727.25, depreciated_value=2472.75, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=173.25, remaining_value=4554.00, depreciated_value=2646.00, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=173.25, remaining_value=4380.75, depreciated_value=2819.25, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=173.25, remaining_value=4207.50, depreciated_value=2992.50, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=173.25, remaining_value=4034.25, depreciated_value=3165.75, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=173.25, remaining_value=3861.00, depreciated_value=3339.00, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=112.61, remaining_value=3748.39, depreciated_value=3451.61, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=112.61, remaining_value=3635.78, depreciated_value=3564.22, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=112.62, remaining_value=3523.16, depreciated_value=3676.84, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=112.61, remaining_value=3410.55, depreciated_value=3789.45, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=112.61, remaining_value=3297.94, depreciated_value=3902.06, state='posted'), + # Increase + self._get_depreciation_move_values(date='2022-06-15', depreciation_value=56.31, remaining_value=3241.63, depreciated_value=3958.37, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=47.27, remaining_value=3194.36, depreciated_value=4005.64, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=94.55, remaining_value=3099.81, depreciated_value=4100.19, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=94.55, remaining_value=3005.26, depreciated_value=4194.74, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=94.55, remaining_value=2910.71, depreciated_value=4289.29, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=94.54, remaining_value=2816.17, depreciated_value=4383.83, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=94.55, remaining_value=2721.62, depreciated_value=4478.38, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=94.55, remaining_value=2627.07, depreciated_value=4572.93, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=87.57, remaining_value=2539.50, depreciated_value=4660.50, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=87.57, remaining_value=2451.93, depreciated_value=4748.07, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=87.57, remaining_value=2364.36, depreciated_value=4835.64, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=87.57, remaining_value=2276.79, depreciated_value=4923.21, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=87.56, remaining_value=2189.23, depreciated_value=5010.77, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=87.57, remaining_value=2101.66, depreciated_value=5098.34, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=87.57, remaining_value=2014.09, depreciated_value=5185.91, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=87.57, remaining_value=1926.52, depreciated_value=5273.48, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=87.57, remaining_value=1838.95, depreciated_value=5361.05, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=87.57, remaining_value=1751.38, depreciated_value=5448.62, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=87.57, remaining_value=1663.81, depreciated_value=5536.19, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=87.57, remaining_value=1576.24, depreciated_value=5623.76, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=87.57, remaining_value=1488.67, depreciated_value=5711.33, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=87.57, remaining_value=1401.10, depreciated_value=5798.90, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=87.57, remaining_value=1313.53, depreciated_value=5886.47, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=87.57, remaining_value=1225.96, depreciated_value=5974.04, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=87.56, remaining_value=1138.40, depreciated_value=6061.60, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=87.57, remaining_value=1050.83, depreciated_value=6149.17, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=87.57, remaining_value=963.26, depreciated_value=6236.74, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=87.57, remaining_value=875.69, depreciated_value=6324.31, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=87.57, remaining_value=788.12, depreciated_value=6411.88, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=87.57, remaining_value=700.55, depreciated_value=6499.45, state='draft'), + self._get_depreciation_move_values(date='2024-11-30', depreciation_value=87.57, remaining_value=612.98, depreciated_value=6587.02, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=87.57, remaining_value=525.41, depreciated_value=6674.59, state='draft'), + # 2025 + self._get_depreciation_move_values(date='2025-01-31', depreciation_value=87.57, remaining_value=437.84, depreciated_value=6762.16, state='draft'), + self._get_depreciation_move_values(date='2025-02-28', depreciation_value=87.57, remaining_value=350.27, depreciated_value=6849.73, state='draft'), + self._get_depreciation_move_values(date='2025-03-31', depreciation_value=87.56, remaining_value=262.71, depreciated_value=6937.29, state='draft'), + self._get_depreciation_move_values(date='2025-04-30', depreciation_value=87.57, remaining_value=175.14, depreciated_value=7024.86, state='draft'), + self._get_depreciation_move_values(date='2025-05-31', depreciation_value=87.57, remaining_value=87.57, depreciated_value=7112.43, state='draft'), + self._get_depreciation_move_values(date='2025-06-30', depreciation_value=87.57, remaining_value=0.00, depreciated_value=7200.00, state='draft'), + ]) + + self.assertRecordValues(asset.children_ids[0].depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=123.96, remaining_value=8376.04, depreciated_value=123.96, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=247.92, remaining_value=8128.12, depreciated_value=371.88, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=247.91, remaining_value=7880.21, depreciated_value=619.79, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=247.92, remaining_value=7632.29, depreciated_value=867.71, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=247.92, remaining_value=7384.37, depreciated_value=1115.63, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=247.91, remaining_value=7136.46, depreciated_value=1363.54, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=247.92, remaining_value=6888.54, depreciated_value=1611.46, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=229.62, remaining_value=6658.92, depreciated_value=1841.08, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=229.62, remaining_value=6429.30, depreciated_value=2070.70, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=229.61, remaining_value=6199.69, depreciated_value=2300.31, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=229.62, remaining_value=5970.07, depreciated_value=2529.93, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=229.62, remaining_value=5740.45, depreciated_value=2759.55, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=229.62, remaining_value=5510.83, depreciated_value=2989.17, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=229.62, remaining_value=5281.21, depreciated_value=3218.79, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=229.61, remaining_value=5051.60, depreciated_value=3448.40, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=229.62, remaining_value=4821.98, depreciated_value=3678.02, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=229.62, remaining_value=4592.36, depreciated_value=3907.64, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=229.62, remaining_value=4362.74, depreciated_value=4137.26, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=229.62, remaining_value=4133.12, depreciated_value=4366.88, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=229.62, remaining_value=3903.50, depreciated_value=4596.50, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=229.62, remaining_value=3673.88, depreciated_value=4826.12, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=229.61, remaining_value=3444.27, depreciated_value=5055.73, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=229.62, remaining_value=3214.65, depreciated_value=5285.35, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=229.62, remaining_value=2985.03, depreciated_value=5514.97, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=229.62, remaining_value=2755.41, depreciated_value=5744.59, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=229.61, remaining_value=2525.80, depreciated_value=5974.20, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=229.62, remaining_value=2296.18, depreciated_value=6203.82, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=229.62, remaining_value=2066.56, depreciated_value=6433.44, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=229.62, remaining_value=1836.94, depreciated_value=6663.06, state='draft'), + self._get_depreciation_move_values(date='2024-11-30', depreciation_value=229.62, remaining_value=1607.32, depreciated_value=6892.68, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=229.61, remaining_value=1377.71, depreciated_value=7122.29, state='draft'), + # 2025 + self._get_depreciation_move_values(date='2025-01-31', depreciation_value=229.62, remaining_value=1148.09, depreciated_value=7351.91, state='draft'), + self._get_depreciation_move_values(date='2025-02-28', depreciation_value=229.62, remaining_value=918.47, depreciated_value=7581.53, state='draft'), + self._get_depreciation_move_values(date='2025-03-31', depreciation_value=229.62, remaining_value=688.85, depreciated_value=7811.15, state='draft'), + self._get_depreciation_move_values(date='2025-04-30', depreciation_value=229.61, remaining_value=459.24, depreciated_value=8040.76, state='draft'), + self._get_depreciation_move_values(date='2025-05-31', depreciation_value=229.62, remaining_value=229.62, depreciated_value=8270.38, state='draft'), + self._get_depreciation_move_values(date='2025-06-30', depreciation_value=229.62, remaining_value=0.00, depreciated_value=8500.00, state='draft'), + ]) + + def test_monthly_degressive_start_beginning_month_increase_middle_month_on_linear_part(self): + asset = self.degressive_asset + asset.write({'acquisition_date': '2019-07-01'}) + asset.validate() + + date_modify = fields.Date.to_date("2022-06-15") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify, + 'value_residual': asset._get_residual_value_at_date(date_modify) + 8500, + "account_asset_counterpart_id": self.asset_counterpart_account_id.id, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2019-07-31', depreciation_value=210.00, remaining_value=6990.00, depreciated_value=210.00, state='posted'), + self._get_depreciation_move_values(date='2019-08-31', depreciation_value=210.00, remaining_value=6780.00, depreciated_value=420.00, state='posted'), + self._get_depreciation_move_values(date='2019-09-30', depreciation_value=210.00, remaining_value=6570.00, depreciated_value=630.00, state='posted'), + self._get_depreciation_move_values(date='2019-10-31', depreciation_value=210.00, remaining_value=6360.00, depreciated_value=840.00, state='posted'), + self._get_depreciation_move_values(date='2019-11-30', depreciation_value=210.00, remaining_value=6150.00, depreciated_value=1050.00, state='posted'), + self._get_depreciation_move_values(date='2019-12-31', depreciation_value=210.00, remaining_value=5940.00, depreciated_value=1260.00, state='posted'), + # 2020 + self._get_depreciation_move_values(date='2020-01-31', depreciation_value=173.25, remaining_value=5766.75, depreciated_value=1433.25, state='posted'), + self._get_depreciation_move_values(date='2020-02-29', depreciation_value=173.25, remaining_value=5593.50, depreciated_value=1606.50, state='posted'), + self._get_depreciation_move_values(date='2020-03-31', depreciation_value=173.25, remaining_value=5420.25, depreciated_value=1779.75, state='posted'), + self._get_depreciation_move_values(date='2020-04-30', depreciation_value=173.25, remaining_value=5247.00, depreciated_value=1953.00, state='posted'), + self._get_depreciation_move_values(date='2020-05-31', depreciation_value=173.25, remaining_value=5073.75, depreciated_value=2126.25, state='posted'), + self._get_depreciation_move_values(date='2020-06-30', depreciation_value=173.25, remaining_value=4900.50, depreciated_value=2299.50, state='posted'), + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=173.25, remaining_value=4727.25, depreciated_value=2472.75, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=173.25, remaining_value=4554.00, depreciated_value=2646.00, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=173.25, remaining_value=4380.75, depreciated_value=2819.25, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=173.25, remaining_value=4207.50, depreciated_value=2992.50, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=173.25, remaining_value=4034.25, depreciated_value=3165.75, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=173.25, remaining_value=3861.00, depreciated_value=3339.00, state='posted'), + # 2021 + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=112.61, remaining_value=3748.39, depreciated_value=3451.61, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=112.61, remaining_value=3635.78, depreciated_value=3564.22, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=112.62, remaining_value=3523.16, depreciated_value=3676.84, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=112.61, remaining_value=3410.55, depreciated_value=3789.45, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=112.61, remaining_value=3297.94, depreciated_value=3902.06, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=112.61, remaining_value=3185.33, depreciated_value=4014.67, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=112.62, remaining_value=3072.71, depreciated_value=4127.29, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=112.61, remaining_value=2960.10, depreciated_value=4239.90, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=112.61, remaining_value=2847.49, depreciated_value=4352.51, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=112.61, remaining_value=2734.88, depreciated_value=4465.12, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=112.62, remaining_value=2622.26, depreciated_value=4577.74, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=112.61, remaining_value=2509.65, depreciated_value=4690.35, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=83.66, remaining_value=2425.99, depreciated_value=4774.01, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=83.65, remaining_value=2342.34, depreciated_value=4857.66, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=83.65, remaining_value=2258.69, depreciated_value=4941.31, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=83.66, remaining_value=2175.03, depreciated_value=5024.97, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=83.66, remaining_value=2091.37, depreciated_value=5108.63, state='posted'), + # Increase + self._get_depreciation_move_values(date='2022-06-15', depreciation_value=41.82, remaining_value=2049.55, depreciated_value=5150.45, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=41.83, remaining_value=2007.72, depreciated_value=5192.28, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=83.65, remaining_value=1924.07, depreciated_value=5275.93, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=83.66, remaining_value=1840.41, depreciated_value=5359.59, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=83.65, remaining_value=1756.76, depreciated_value=5443.24, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=83.66, remaining_value=1673.10, depreciated_value=5526.90, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=83.65, remaining_value=1589.45, depreciated_value=5610.55, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=83.66, remaining_value=1505.79, depreciated_value=5694.21, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=83.66, remaining_value=1422.13, depreciated_value=5777.87, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=83.65, remaining_value=1338.48, depreciated_value=5861.52, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=83.65, remaining_value=1254.83, depreciated_value=5945.17, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=83.66, remaining_value=1171.17, depreciated_value=6028.83, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=83.65, remaining_value=1087.52, depreciated_value=6112.48, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=83.66, remaining_value=1003.86, depreciated_value=6196.14, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=83.65, remaining_value=920.21, depreciated_value=6279.79, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=83.66, remaining_value=836.55, depreciated_value=6363.45, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=83.65, remaining_value=752.90, depreciated_value=6447.10, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=83.66, remaining_value=669.24, depreciated_value=6530.76, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=83.65, remaining_value=585.59, depreciated_value=6614.41, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=83.66, remaining_value=501.93, depreciated_value=6698.07, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=83.65, remaining_value=418.28, depreciated_value=6781.72, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=83.66, remaining_value=334.62, depreciated_value=6865.38, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=83.65, remaining_value=250.97, depreciated_value=6949.03, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=83.66, remaining_value=167.31, depreciated_value=7032.69, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=83.65, remaining_value=83.66, depreciated_value=7116.34, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=83.66, remaining_value=0.00, depreciated_value=7200.00, state='draft'), + ]) + + self.assertRecordValues(asset.children_ids[0].depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=173.47, remaining_value=8326.53, depreciated_value=173.47, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=346.94, remaining_value=7979.59, depreciated_value=520.41, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=346.94, remaining_value=7632.65, depreciated_value=867.35, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=346.94, remaining_value=7285.71, depreciated_value=1214.29, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=346.93, remaining_value=6938.78, depreciated_value=1561.22, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=346.94, remaining_value=6591.84, depreciated_value=1908.16, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=346.94, remaining_value=6244.90, depreciated_value=2255.10, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=346.94, remaining_value=5897.96, depreciated_value=2602.04, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=346.94, remaining_value=5551.02, depreciated_value=2948.98, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=346.94, remaining_value=5204.08, depreciated_value=3295.92, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=346.94, remaining_value=4857.14, depreciated_value=3642.86, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=346.93, remaining_value=4510.21, depreciated_value=3989.79, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=346.94, remaining_value=4163.27, depreciated_value=4336.73, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=346.94, remaining_value=3816.33, depreciated_value=4683.67, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=346.94, remaining_value=3469.39, depreciated_value=5030.61, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=346.94, remaining_value=3122.45, depreciated_value=5377.55, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=346.94, remaining_value=2775.51, depreciated_value=5724.49, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=346.94, remaining_value=2428.57, depreciated_value=6071.43, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=346.94, remaining_value=2081.63, depreciated_value=6418.37, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=346.94, remaining_value=1734.69, depreciated_value=6765.31, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=346.94, remaining_value=1387.75, depreciated_value=7112.25, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=346.94, remaining_value=1040.81, depreciated_value=7459.19, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=346.93, remaining_value=693.88, depreciated_value=7806.12, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=346.94, remaining_value=346.94, depreciated_value=8153.06, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=346.94, remaining_value=0.00, depreciated_value=8500.00, state='draft'), + ]) + + def test_monthly_degressive_start_beginning_month_decrease_middle_month(self): + asset = self.degressive_asset + asset.validate() + + date_modify = fields.Date.to_date("2022-06-15") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify, + 'value_residual': asset._get_residual_value_at_date(date_modify) - 500, + "account_asset_counterpart_id": self.asset_counterpart_account_id.id, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=210.00, remaining_value=6990.00, depreciated_value=210.00, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=210.00, remaining_value=6780.00, depreciated_value=420.00, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=210.00, remaining_value=6570.00, depreciated_value=630.00, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=210.00, remaining_value=6360.00, depreciated_value=840.00, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=210.00, remaining_value=6150.00, depreciated_value=1050.00, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=210.00, remaining_value=5940.00, depreciated_value=1260.00, state='posted'), + # 2021 + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=173.25, remaining_value=5766.75, depreciated_value=1433.25, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=173.25, remaining_value=5593.50, depreciated_value=1606.50, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=173.25, remaining_value=5420.25, depreciated_value=1779.75, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=173.25, remaining_value=5247.00, depreciated_value=1953.00, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=173.25, remaining_value=5073.75, depreciated_value=2126.25, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=173.25, remaining_value=4900.50, depreciated_value=2299.50, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=173.25, remaining_value=4727.25, depreciated_value=2472.75, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=173.25, remaining_value=4554.00, depreciated_value=2646.00, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=173.25, remaining_value=4380.75, depreciated_value=2819.25, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=173.25, remaining_value=4207.50, depreciated_value=2992.50, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=173.25, remaining_value=4034.25, depreciated_value=3165.75, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=173.25, remaining_value=3861.00, depreciated_value=3339.00, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=112.61, remaining_value=3748.39, depreciated_value=3451.61, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=112.61, remaining_value=3635.78, depreciated_value=3564.22, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=112.62, remaining_value=3523.16, depreciated_value=3676.84, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=112.61, remaining_value=3410.55, depreciated_value=3789.45, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=112.61, remaining_value=3297.94, depreciated_value=3902.06, state='posted'), + self._get_depreciation_move_values(date='2022-06-15', depreciation_value=56.31, remaining_value=3241.63, depreciated_value=3958.37, state='posted'), + # Decrease + self._get_depreciation_move_values(date='2022-06-15', depreciation_value=500.00, remaining_value=2741.63, depreciated_value=4458.37, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=39.98, remaining_value=2701.65, depreciated_value=4498.35, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=79.97, remaining_value=2621.68, depreciated_value=4578.32, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=79.96, remaining_value=2541.72, depreciated_value=4658.28, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=79.96, remaining_value=2461.76, depreciated_value=4738.24, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=79.97, remaining_value=2381.79, depreciated_value=4818.21, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=79.96, remaining_value=2301.83, depreciated_value=4898.17, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=79.97, remaining_value=2221.86, depreciated_value=4978.14, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=74.06, remaining_value=2147.80, depreciated_value=5052.20, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=74.06, remaining_value=2073.74, depreciated_value=5126.26, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=74.07, remaining_value=1999.67, depreciated_value=5200.33, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=74.06, remaining_value=1925.61, depreciated_value=5274.39, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=74.06, remaining_value=1851.55, depreciated_value=5348.45, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=74.06, remaining_value=1777.49, depreciated_value=5422.51, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=74.06, remaining_value=1703.43, depreciated_value=5496.57, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=74.07, remaining_value=1629.36, depreciated_value=5570.64, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=74.06, remaining_value=1555.30, depreciated_value=5644.70, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=74.06, remaining_value=1481.24, depreciated_value=5718.76, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=74.06, remaining_value=1407.18, depreciated_value=5792.82, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=74.06, remaining_value=1333.12, depreciated_value=5866.88, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=74.06, remaining_value=1259.06, depreciated_value=5940.94, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=74.06, remaining_value=1185.00, depreciated_value=6015.00, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=74.07, remaining_value=1110.93, depreciated_value=6089.07, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=74.06, remaining_value=1036.87, depreciated_value=6163.13, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=74.06, remaining_value=962.81, depreciated_value=6237.19, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=74.06, remaining_value=888.75, depreciated_value=6311.25, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=74.07, remaining_value=814.68, depreciated_value=6385.32, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=74.06, remaining_value=740.62, depreciated_value=6459.38, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=74.06, remaining_value=666.56, depreciated_value=6533.44, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=74.06, remaining_value=592.50, depreciated_value=6607.50, state='draft'), + self._get_depreciation_move_values(date='2024-11-30', depreciation_value=74.06, remaining_value=518.44, depreciated_value=6681.56, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=74.07, remaining_value=444.37, depreciated_value=6755.63, state='draft'), + # 2025 + self._get_depreciation_move_values(date='2025-01-31', depreciation_value=74.06, remaining_value=370.31, depreciated_value=6829.69, state='draft'), + self._get_depreciation_move_values(date='2025-02-28', depreciation_value=74.06, remaining_value=296.25, depreciated_value=6903.75, state='draft'), + self._get_depreciation_move_values(date='2025-03-31', depreciation_value=74.07, remaining_value=222.18, depreciated_value=6977.82, state='draft'), + self._get_depreciation_move_values(date='2025-04-30', depreciation_value=74.06, remaining_value=148.12, depreciated_value=7051.88, state='draft'), + self._get_depreciation_move_values(date='2025-05-31', depreciation_value=74.06, remaining_value=74.06, depreciated_value=7125.94, state='draft'), + self._get_depreciation_move_values(date='2025-06-30', depreciation_value=74.06, remaining_value=0.00, depreciated_value=7200.00, state='draft'), + ]) + + def test_monthly_degressive_then_linear_start_beginning_month_increase_middle_month_on_degressive_part(self): + asset = self.degressive_then_linear_asset + asset.validate() + + date_modify = fields.Date.to_date("2021-06-15") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify, + 'value_residual': asset._get_residual_value_at_date(date_modify) + 8500, + "account_asset_counterpart_id": self.asset_counterpart_account_id.id, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=210.00, remaining_value=6990.00, depreciated_value=210.00, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=210.00, remaining_value=6780.00, depreciated_value=420.00, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=210.00, remaining_value=6570.00, depreciated_value=630.00, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=210.00, remaining_value=6360.00, depreciated_value=840.00, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=210.00, remaining_value=6150.00, depreciated_value=1050.00, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=210.00, remaining_value=5940.00, depreciated_value=1260.00, state='posted'), + # 2021 + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=173.25, remaining_value=5766.75, depreciated_value=1433.25, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=173.25, remaining_value=5593.50, depreciated_value=1606.50, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=173.25, remaining_value=5420.25, depreciated_value=1779.75, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=173.25, remaining_value=5247.00, depreciated_value=1953.00, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=173.25, remaining_value=5073.75, depreciated_value=2126.25, state='posted'), + # Increase + self._get_depreciation_move_values(date='2021-06-15', depreciation_value=86.63, remaining_value=4987.12, depreciated_value=2212.88, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=72.73, remaining_value=4914.39, depreciated_value=2285.61, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=145.46, remaining_value=4768.93, depreciated_value=2431.07, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=145.45, remaining_value=4623.48, depreciated_value=2576.52, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=145.46, remaining_value=4478.02, depreciated_value=2721.98, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=145.46, remaining_value=4332.56, depreciated_value=2867.44, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=145.46, remaining_value=4187.10, depreciated_value=3012.90, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=145.45, remaining_value=4041.65, depreciated_value=3158.35, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=120.00, remaining_value=3921.65, depreciated_value=3278.35, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=120.00, remaining_value=3801.65, depreciated_value=3398.35, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=120.00, remaining_value=3681.65, depreciated_value=3518.35, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=120.00, remaining_value=3561.65, depreciated_value=3638.35, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=120.00, remaining_value=3441.65, depreciated_value=3758.35, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=120.00, remaining_value=3321.65, depreciated_value=3878.35, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=120.00, remaining_value=3201.65, depreciated_value=3998.35, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=120.00, remaining_value=3081.65, depreciated_value=4118.35, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=120.00, remaining_value=2961.65, depreciated_value=4238.35, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=120.00, remaining_value=2841.65, depreciated_value=4358.35, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=120.00, remaining_value=2721.65, depreciated_value=4478.35, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=120.00, remaining_value=2601.65, depreciated_value=4598.35, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=120.00, remaining_value=2481.65, depreciated_value=4718.35, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=120.00, remaining_value=2361.65, depreciated_value=4838.35, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=120.00, remaining_value=2241.65, depreciated_value=4958.35, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=120.00, remaining_value=2121.65, depreciated_value=5078.35, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=120.00, remaining_value=2001.65, depreciated_value=5198.35, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=120.00, remaining_value=1881.65, depreciated_value=5318.35, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=120.00, remaining_value=1761.65, depreciated_value=5438.35, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=120.00, remaining_value=1641.65, depreciated_value=5558.35, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=120.00, remaining_value=1521.65, depreciated_value=5678.35, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=120.00, remaining_value=1401.65, depreciated_value=5798.35, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=120.00, remaining_value=1281.65, depreciated_value=5918.35, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=120.00, remaining_value=1161.65, depreciated_value=6038.35, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=120.00, remaining_value=1041.65, depreciated_value=6158.35, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=120.00, remaining_value=921.65, depreciated_value=6278.35, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=120.00, remaining_value=801.65, depreciated_value=6398.35, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=120.00, remaining_value=681.65, depreciated_value=6518.35, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=120.00, remaining_value=561.65, depreciated_value=6638.35, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=120.00, remaining_value=441.65, depreciated_value=6758.35, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=120.00, remaining_value=321.65, depreciated_value=6878.35, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=120.00, remaining_value=201.65, depreciated_value=6998.35, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=120.00, remaining_value=81.65, depreciated_value=7118.35, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=81.65, remaining_value=0.00, depreciated_value=7200.00, state='draft'), + ]) + + self.assertRecordValues(asset.children_ids[0].depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=123.96, remaining_value=8376.04, depreciated_value=123.96, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=247.92, remaining_value=8128.12, depreciated_value=371.88, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=247.91, remaining_value=7880.21, depreciated_value=619.79, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=247.92, remaining_value=7632.29, depreciated_value=867.71, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=247.92, remaining_value=7384.37, depreciated_value=1115.63, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=247.91, remaining_value=7136.46, depreciated_value=1363.54, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=247.92, remaining_value=6888.54, depreciated_value=1611.46, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=204.52, remaining_value=6684.02, depreciated_value=1815.98, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=204.52, remaining_value=6479.50, depreciated_value=2020.50, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=204.53, remaining_value=6274.97, depreciated_value=2225.03, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=204.52, remaining_value=6070.45, depreciated_value=2429.55, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=204.52, remaining_value=5865.93, depreciated_value=2634.07, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=204.53, remaining_value=5661.40, depreciated_value=2838.60, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=204.52, remaining_value=5456.88, depreciated_value=3043.12, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=204.52, remaining_value=5252.36, depreciated_value=3247.64, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=204.53, remaining_value=5047.83, depreciated_value=3452.17, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=204.52, remaining_value=4843.31, depreciated_value=3656.69, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=204.52, remaining_value=4638.79, depreciated_value=3861.21, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=204.52, remaining_value=4434.27, depreciated_value=4065.73, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=204.53, remaining_value=4229.74, depreciated_value=4270.26, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=204.52, remaining_value=4025.22, depreciated_value=4474.78, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=204.52, remaining_value=3820.70, depreciated_value=4679.30, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=204.53, remaining_value=3616.17, depreciated_value=4883.83, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=204.52, remaining_value=3411.65, depreciated_value=5088.35, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=204.52, remaining_value=3207.13, depreciated_value=5292.87, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=204.52, remaining_value=3002.61, depreciated_value=5497.39, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=204.53, remaining_value=2798.08, depreciated_value=5701.92, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=204.52, remaining_value=2593.56, depreciated_value=5906.44, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=204.52, remaining_value=2389.04, depreciated_value=6110.96, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=204.53, remaining_value=2184.51, depreciated_value=6315.49, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=204.52, remaining_value=1979.99, depreciated_value=6520.01, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=204.52, remaining_value=1775.47, depreciated_value=6724.53, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=204.52, remaining_value=1570.95, depreciated_value=6929.05, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=204.53, remaining_value=1366.42, depreciated_value=7133.58, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=204.52, remaining_value=1161.90, depreciated_value=7338.10, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=204.52, remaining_value=957.38, depreciated_value=7542.62, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=204.53, remaining_value=752.85, depreciated_value=7747.15, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=204.52, remaining_value=548.33, depreciated_value=7951.67, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=204.52, remaining_value=343.81, depreciated_value=8156.19, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=204.53, remaining_value=139.28, depreciated_value=8360.72, state='draft'), + self._get_depreciation_move_values(date='2024-10-31', depreciation_value=139.28, remaining_value=0.00, depreciated_value=8500.00, state='draft'), + ]) + + def test_monthly_degressive_then_linear_start_beginning_month_increase_middle_month_on_linear_part(self): + asset = self.degressive_then_linear_asset + asset.validate() + + date_modify = fields.Date.to_date("2022-06-15") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify, + 'value_residual': asset._get_residual_value_at_date(date_modify) + 8500, + "account_asset_counterpart_id": self.asset_counterpart_account_id.id, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=210.00, remaining_value=6990.00, depreciated_value=210.00, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=210.00, remaining_value=6780.00, depreciated_value=420.00, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=210.00, remaining_value=6570.00, depreciated_value=630.00, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=210.00, remaining_value=6360.00, depreciated_value=840.00, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=210.00, remaining_value=6150.00, depreciated_value=1050.00, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=210.00, remaining_value=5940.00, depreciated_value=1260.00, state='posted'), + # 2021 + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=173.25, remaining_value=5766.75, depreciated_value=1433.25, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=173.25, remaining_value=5593.50, depreciated_value=1606.50, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=173.25, remaining_value=5420.25, depreciated_value=1779.75, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=173.25, remaining_value=5247.00, depreciated_value=1953.00, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=173.25, remaining_value=5073.75, depreciated_value=2126.25, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=173.25, remaining_value=4900.50, depreciated_value=2299.50, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=173.25, remaining_value=4727.25, depreciated_value=2472.75, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=173.25, remaining_value=4554.00, depreciated_value=2646.00, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=173.25, remaining_value=4380.75, depreciated_value=2819.25, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=173.25, remaining_value=4207.50, depreciated_value=2992.50, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=173.25, remaining_value=4034.25, depreciated_value=3165.75, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=173.25, remaining_value=3861.00, depreciated_value=3339.00, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=120.00, remaining_value=3741.00, depreciated_value=3459.00, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=120.00, remaining_value=3621.00, depreciated_value=3579.00, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=120.00, remaining_value=3501.00, depreciated_value=3699.00, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=120.00, remaining_value=3381.00, depreciated_value=3819.00, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=120.00, remaining_value=3261.00, depreciated_value=3939.00, state='posted'), + # Increase + self._get_depreciation_move_values(date='2022-06-15', depreciation_value=60.00, remaining_value=3201.00, depreciated_value=3999.00, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=60.00, remaining_value=3141.00, depreciated_value=4059.00, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=120.00, remaining_value=3021.00, depreciated_value=4179.00, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=120.00, remaining_value=2901.00, depreciated_value=4299.00, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=120.00, remaining_value=2781.00, depreciated_value=4419.00, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=120.00, remaining_value=2661.00, depreciated_value=4539.00, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=120.00, remaining_value=2541.00, depreciated_value=4659.00, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=120.00, remaining_value=2421.00, depreciated_value=4779.00, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=120.00, remaining_value=2301.00, depreciated_value=4899.00, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=120.00, remaining_value=2181.00, depreciated_value=5019.00, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=120.00, remaining_value=2061.00, depreciated_value=5139.00, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=120.00, remaining_value=1941.00, depreciated_value=5259.00, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=120.00, remaining_value=1821.00, depreciated_value=5379.00, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=120.00, remaining_value=1701.00, depreciated_value=5499.00, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=120.00, remaining_value=1581.00, depreciated_value=5619.00, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=120.00, remaining_value=1461.00, depreciated_value=5739.00, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=120.00, remaining_value=1341.00, depreciated_value=5859.00, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=120.00, remaining_value=1221.00, depreciated_value=5979.00, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=120.00, remaining_value=1101.00, depreciated_value=6099.00, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=120.00, remaining_value=981.00, depreciated_value=6219.00, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=120.00, remaining_value=861.00, depreciated_value=6339.00, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=120.00, remaining_value=741.00, depreciated_value=6459.00, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=120.00, remaining_value=621.00, depreciated_value=6579.00, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=120.00, remaining_value=501.00, depreciated_value=6699.00, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=120.00, remaining_value=381.00, depreciated_value=6819.00, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=120.00, remaining_value=261.00, depreciated_value=6939.00, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=120.00, remaining_value=141.00, depreciated_value=7059.00, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=120.00, remaining_value=21.00, depreciated_value=7179.00, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=21.00, remaining_value=0.00, depreciated_value=7200.00, state='draft'), + ]) + + self.assertRecordValues(asset.children_ids[0].depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=159.32, remaining_value=8340.68, depreciated_value=159.32, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=318.65, remaining_value=8022.03, depreciated_value=477.97, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=318.65, remaining_value=7703.38, depreciated_value=796.62, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=318.65, remaining_value=7384.73, depreciated_value=1115.27, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=318.65, remaining_value=7066.08, depreciated_value=1433.92, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=318.65, remaining_value=6747.43, depreciated_value=1752.57, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=318.65, remaining_value=6428.78, depreciated_value=2071.22, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=318.65, remaining_value=6110.13, depreciated_value=2389.87, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=318.65, remaining_value=5791.48, depreciated_value=2708.52, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=318.65, remaining_value=5472.83, depreciated_value=3027.17, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=318.65, remaining_value=5154.18, depreciated_value=3345.82, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=318.65, remaining_value=4835.53, depreciated_value=3664.47, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=318.65, remaining_value=4516.88, depreciated_value=3983.12, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=318.65, remaining_value=4198.23, depreciated_value=4301.77, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=318.65, remaining_value=3879.58, depreciated_value=4620.42, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=318.65, remaining_value=3560.93, depreciated_value=4939.07, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=318.65, remaining_value=3242.28, depreciated_value=5257.72, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=318.65, remaining_value=2923.63, depreciated_value=5576.37, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=318.65, remaining_value=2604.98, depreciated_value=5895.02, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=318.65, remaining_value=2286.33, depreciated_value=6213.67, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=318.65, remaining_value=1967.68, depreciated_value=6532.32, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=318.65, remaining_value=1649.03, depreciated_value=6850.97, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=318.65, remaining_value=1330.38, depreciated_value=7169.62, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=318.65, remaining_value=1011.73, depreciated_value=7488.27, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=318.65, remaining_value=693.08, depreciated_value=7806.92, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=318.65, remaining_value=374.43, depreciated_value=8125.57, state='draft'), + self._get_depreciation_move_values(date='2024-08-31', depreciation_value=318.65, remaining_value=55.78, depreciated_value=8444.22, state='draft'), + self._get_depreciation_move_values(date='2024-09-30', depreciation_value=55.78, remaining_value=0.00, depreciated_value=8500.00, state='draft'), + ]) + + def test_monthly_degressive_then_linear_start_beginning_month_decrease_middle_month(self): + asset = self.degressive_then_linear_asset + asset.validate() + + date_modify = fields.Date.to_date("2022-06-15") + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': date_modify, + 'value_residual': asset._get_residual_value_at_date(date_modify) - 500, + "account_asset_counterpart_id": self.asset_counterpart_account_id.id, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2020-07-31', depreciation_value=210.00, remaining_value=6990.00, depreciated_value=210.00, state='posted'), + self._get_depreciation_move_values(date='2020-08-31', depreciation_value=210.00, remaining_value=6780.00, depreciated_value=420.00, state='posted'), + self._get_depreciation_move_values(date='2020-09-30', depreciation_value=210.00, remaining_value=6570.00, depreciated_value=630.00, state='posted'), + self._get_depreciation_move_values(date='2020-10-31', depreciation_value=210.00, remaining_value=6360.00, depreciated_value=840.00, state='posted'), + self._get_depreciation_move_values(date='2020-11-30', depreciation_value=210.00, remaining_value=6150.00, depreciated_value=1050.00, state='posted'), + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=210.00, remaining_value=5940.00, depreciated_value=1260.00, state='posted'), + # 2021 + self._get_depreciation_move_values(date='2021-01-31', depreciation_value=173.25, remaining_value=5766.75, depreciated_value=1433.25, state='posted'), + self._get_depreciation_move_values(date='2021-02-28', depreciation_value=173.25, remaining_value=5593.50, depreciated_value=1606.50, state='posted'), + self._get_depreciation_move_values(date='2021-03-31', depreciation_value=173.25, remaining_value=5420.25, depreciated_value=1779.75, state='posted'), + self._get_depreciation_move_values(date='2021-04-30', depreciation_value=173.25, remaining_value=5247.00, depreciated_value=1953.00, state='posted'), + self._get_depreciation_move_values(date='2021-05-31', depreciation_value=173.25, remaining_value=5073.75, depreciated_value=2126.25, state='posted'), + self._get_depreciation_move_values(date='2021-06-30', depreciation_value=173.25, remaining_value=4900.50, depreciated_value=2299.50, state='posted'), + self._get_depreciation_move_values(date='2021-07-31', depreciation_value=173.25, remaining_value=4727.25, depreciated_value=2472.75, state='posted'), + self._get_depreciation_move_values(date='2021-08-31', depreciation_value=173.25, remaining_value=4554.00, depreciated_value=2646.00, state='posted'), + self._get_depreciation_move_values(date='2021-09-30', depreciation_value=173.25, remaining_value=4380.75, depreciated_value=2819.25, state='posted'), + self._get_depreciation_move_values(date='2021-10-31', depreciation_value=173.25, remaining_value=4207.50, depreciated_value=2992.50, state='posted'), + self._get_depreciation_move_values(date='2021-11-30', depreciation_value=173.25, remaining_value=4034.25, depreciated_value=3165.75, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=173.25, remaining_value=3861.00, depreciated_value=3339.00, state='posted'), + # 2022 + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=120.00, remaining_value=3741.00, depreciated_value=3459.00, state='posted'), + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=120.00, remaining_value=3621.00, depreciated_value=3579.00, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=120.00, remaining_value=3501.00, depreciated_value=3699.00, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=120.00, remaining_value=3381.00, depreciated_value=3819.00, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=120.00, remaining_value=3261.00, depreciated_value=3939.00, state='posted'), + self._get_depreciation_move_values(date='2022-06-15', depreciation_value=60.00, remaining_value=3201.00, depreciated_value=3999.00, state='posted'), + # Decrease + self._get_depreciation_move_values(date='2022-06-15', depreciation_value=500.00, remaining_value=2701.00, depreciated_value=4499.00, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=53.15, remaining_value=2647.85, depreciated_value=4552.15, state='posted'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=106.30, remaining_value=2541.55, depreciated_value=4658.45, state='draft'), + self._get_depreciation_move_values(date='2022-08-31', depreciation_value=106.30, remaining_value=2435.25, depreciated_value=4764.75, state='draft'), + self._get_depreciation_move_values(date='2022-09-30', depreciation_value=106.30, remaining_value=2328.95, depreciated_value=4871.05, state='draft'), + self._get_depreciation_move_values(date='2022-10-31', depreciation_value=106.30, remaining_value=2222.65, depreciated_value=4977.35, state='draft'), + self._get_depreciation_move_values(date='2022-11-30', depreciation_value=106.30, remaining_value=2116.35, depreciated_value=5083.65, state='draft'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=106.30, remaining_value=2010.05, depreciated_value=5189.95, state='draft'), + # 2023 + self._get_depreciation_move_values(date='2023-01-31', depreciation_value=106.30, remaining_value=1903.75, depreciated_value=5296.25, state='draft'), + self._get_depreciation_move_values(date='2023-02-28', depreciation_value=106.30, remaining_value=1797.45, depreciated_value=5402.55, state='draft'), + self._get_depreciation_move_values(date='2023-03-31', depreciation_value=106.30, remaining_value=1691.15, depreciated_value=5508.85, state='draft'), + self._get_depreciation_move_values(date='2023-04-30', depreciation_value=106.30, remaining_value=1584.85, depreciated_value=5615.15, state='draft'), + self._get_depreciation_move_values(date='2023-05-31', depreciation_value=106.30, remaining_value=1478.55, depreciated_value=5721.45, state='draft'), + self._get_depreciation_move_values(date='2023-06-30', depreciation_value=106.30, remaining_value=1372.25, depreciated_value=5827.75, state='draft'), + self._get_depreciation_move_values(date='2023-07-31', depreciation_value=106.30, remaining_value=1265.95, depreciated_value=5934.05, state='draft'), + self._get_depreciation_move_values(date='2023-08-31', depreciation_value=106.30, remaining_value=1159.65, depreciated_value=6040.35, state='draft'), + self._get_depreciation_move_values(date='2023-09-30', depreciation_value=106.30, remaining_value=1053.35, depreciated_value=6146.65, state='draft'), + self._get_depreciation_move_values(date='2023-10-31', depreciation_value=106.30, remaining_value=947.05, depreciated_value=6252.95, state='draft'), + self._get_depreciation_move_values(date='2023-11-30', depreciation_value=106.30, remaining_value=840.75, depreciated_value=6359.25, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=106.30, remaining_value=734.45, depreciated_value=6465.55, state='draft'), + # 2024 + self._get_depreciation_move_values(date='2024-01-31', depreciation_value=106.30, remaining_value=628.15, depreciated_value=6571.85, state='draft'), + self._get_depreciation_move_values(date='2024-02-29', depreciation_value=106.30, remaining_value=521.85, depreciated_value=6678.15, state='draft'), + self._get_depreciation_move_values(date='2024-03-31', depreciation_value=106.30, remaining_value=415.55, depreciated_value=6784.45, state='draft'), + self._get_depreciation_move_values(date='2024-04-30', depreciation_value=106.30, remaining_value=309.25, depreciated_value=6890.75, state='draft'), + self._get_depreciation_move_values(date='2024-05-31', depreciation_value=106.30, remaining_value=202.95, depreciated_value=6997.05, state='draft'), + self._get_depreciation_move_values(date='2024-06-30', depreciation_value=106.30, remaining_value=96.65, depreciated_value=7103.35, state='draft'), + self._get_depreciation_move_values(date='2024-07-31', depreciation_value=96.65, remaining_value=0.00, depreciated_value=7200.00, state='draft'), + ]) + + def test_linear_modify_0_value_residual(self): + """Set the value residual to 0""" + asset = self.create_asset(value=10000, periodicity="monthly", periods=10, method="linear", acquisition_date="2022-02-01", prorata_computation_type="constant_periods") + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'method_number': 4, + 'date': fields.Date.to_date("2022-06-24"), + 'modify_action': 'modify', + 'value_residual': 0, + 'account_asset_counterpart_id': self.company_data['default_account_revenue'].copy().id, + }).modify() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-02-28', depreciation_value=1000, remaining_value=9000, depreciated_value=1000, state='posted'), + self._get_depreciation_move_values(date='2022-03-31', depreciation_value=1000, remaining_value=8000, depreciated_value=2000, state='posted'), + self._get_depreciation_move_values(date='2022-04-30', depreciation_value=1000, remaining_value=7000, depreciated_value=3000, state='posted'), + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=1000, remaining_value=6000, depreciated_value=4000, state='posted'), + self._get_depreciation_move_values(date='2022-06-24', depreciation_value=800, remaining_value=5200, depreciated_value=4800, state='posted'), + + self._get_depreciation_move_values(date='2022-06-24', depreciation_value=5200, remaining_value=0, depreciated_value=10000, state='posted'), + ]) + + def test_asset_modify_value_residual_after_reversal(self): + """ Tests the special case of residual amounts on a board with a reverse entry. + It keeps its focus on the computed residual amount in the modify asset wizard as for now, + the recomputation after a modify on a board with reverse entries is broken. This should be corrected in a later task.""" + + asset = self.create_asset(value=1000, periodicity="yearly", periods=5, method="linear", acquisition_date="2020-01-01", prorata_computation_type="constant_periods") + asset.validate() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=200, remaining_value=800, depreciated_value=200, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=200, remaining_value=600, depreciated_value=400, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=200, remaining_value=400, depreciated_value=600, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=200, remaining_value=200, depreciated_value=800, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=200, remaining_value=0, depreciated_value=1000, state='draft'), + ]) + + move_to_reverse = asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id))[0] + self.env['account.move.reversal']\ + .with_context(active_model="account.move", active_ids=move_to_reverse.ids)\ + .create({ + 'journal_id': move_to_reverse.journal_id.id + }).reverse_moves() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2020-12-31', depreciation_value=200, remaining_value=800, depreciated_value=200, state='posted'), + self._get_depreciation_move_values(date='2021-12-31', depreciation_value=200, remaining_value=600, depreciated_value=400, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=-200, remaining_value=800, depreciated_value=200, state='posted'), + self._get_depreciation_move_values(date='2022-12-31', depreciation_value=400, remaining_value=400, depreciated_value=600, state='draft'), + self._get_depreciation_move_values(date='2023-12-31', depreciation_value=200, remaining_value=200, depreciated_value=800, state='draft'), + self._get_depreciation_move_values(date='2024-12-31', depreciation_value=200, remaining_value=0, depreciated_value=1000, state='draft'), + ]) + + asset_modify = self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': fields.Date.to_date("2022-06-30"), + 'modify_action': 'modify', + }) + + # We want to show the actual remaining value of the asset. + self.assertEqual(asset_modify.value_residual, 500, "The computation of the value_residual in asset.modify shouldn't care about the reversal.") + + def test_asset_gain_or_loss_account(self): + asset = self.create_asset(value=1000, periodicity="yearly", periods=5, method="linear", acquisition_date="2020-01-01", prorata_computation_type="constant_periods") + asset.validate() + + invoice = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': self.env['res.partner'].create({'name': 'Res Partner 12'}).id, + 'invoice_date': '2022-06-30', + 'invoice_line_ids': [(0, 0, { + 'name': 'Asset sold', + 'tax_ids': [], + 'price_unit': 500, + })], + }) + invoice.action_post() + + asset_modify = self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'name': 'Test reason', + 'date': fields.Date.to_date('2022-06-10'), + 'modify_action': 'sell', + 'invoice_ids': invoice.ids, + 'invoice_line_ids': invoice.invoice_line_ids.ids + }) + # The remaining value of the asset on 2022-06-30 is 500: if the asset is sold before that date, it will result in a loss (and a gain if sold after) + self.assertEqual(asset_modify.gain_or_loss, 'loss') + + asset_modify.date = fields.Date.from_string('2022-07-15') + self.assertEqual(asset_modify.gain_or_loss, 'gain') + + asset_modify.date = fields.Date.from_string('2022-06-30') + self.assertEqual(asset_modify.gain_or_loss, 'no') + + def test_asset_disposal_on_hashed_journal(self): + asset = self.create_asset( + value=3000, + periodicity='monthly', + periods=3, + method='linear', + acquisition_date='2022-05-01', + prorata_computation_type='constant_periods', + ) + asset.journal_id.restrict_mode_hash_table = True + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'date': fields.Date.to_date('2022-05-15'), + 'modify_action': 'dispose', + 'loss_account_id': self.company_data['default_account_expense'].copy().id, + }).sell_dispose() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-05-15', depreciation_value=483.87, remaining_value=2516.13, depreciated_value=483.87, state='posted'), + self._get_depreciation_move_values(date='2022-05-15', depreciation_value=2516.13, remaining_value=0, depreciated_value=3000, state='draft'), + # At this point the asset is disposed, which means its 'remaining_value' is 0. + # But the next 2 depreciation moves could not be removed due to the hash on the journal. + # This results in a negative 'remaining_value' and a 'depreciated_value' that exceeds the asset's initial value. + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=1000, remaining_value=-1000, depreciated_value=4000, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=1000, remaining_value=-2000, depreciated_value=5000, state='posted'), + # The next 2 depreciation moves are reverting the previous 2, + # bringing the 'remaining_value' back to 0 on the last one, as it should be. + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=-1000, remaining_value=-1000, depreciated_value=4000, state='posted'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=-1000, remaining_value=0, depreciated_value=3000, state='posted'), + ]) + + def test_asset_disposal_with_audit_trail(self): + asset = self.create_asset( + value=3000, + periodicity='monthly', + periods=3, + method='linear', + acquisition_date='2022-05-01', + prorata_computation_type='constant_periods', + ) + asset.validate() + + with patch.object(self.env.registry['account.move'], '_is_protected_by_audit_trail', lambda move: True): + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'date': fields.Date.to_date('2022-06-15'), + 'modify_action': 'dispose', + 'loss_account_id': self.company_data['default_account_expense'].copy().id, + }).sell_dispose() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-05-31', depreciation_value=1000, remaining_value=2000, depreciated_value=1000, state='posted'), + self._get_depreciation_move_values(date='2022-06-15', depreciation_value=500, remaining_value=1500, depreciated_value=1500, state='posted'), + self._get_depreciation_move_values(date='2022-06-15', depreciation_value=1500, remaining_value=0, depreciated_value=3000, state='draft'), + self._get_depreciation_move_values(date='2022-06-30', depreciation_value=1000, remaining_value=0, depreciated_value=3000, state='cancel'), + self._get_depreciation_move_values(date='2022-07-31', depreciation_value=1000, remaining_value=0, depreciated_value=3000, state='cancel'), + ]) + + def test_disposal_of_fully_depreciated_asset(self): + asset = self.create_asset(value=10000, periodicity="yearly", periods=2, method="degressive", acquisition_date="2020-01-01", prorata_computation_type="constant_periods") + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'date': fields.Date.to_date("2022-01-01"), + 'modify_action': 'dispose', + 'loss_account_id': self.company_data['default_account_expense'].copy().id, + }).sell_dispose() + + def test_asset_disposal_in_middle_of_fiscal_year(self): + self.company_data['company'].fiscalyear_last_month = "3" + + asset = self.create_asset(value=10000, periodicity="monthly", periods=12, method="degressive", acquisition_date="2022-01-01", prorata_computation_type="daily_computation") + asset.validate() + + self.env['asset.modify'].create({ + 'asset_id': asset.id, + 'date': fields.Date.to_date("2022-02-24"), + 'modify_action': 'dispose', + 'loss_account_id': self.company_data['default_account_expense'].copy().id, + }).sell_dispose() + + self.assertRecordValues(asset.depreciation_move_ids.sorted(lambda mv: (mv.date, mv.id)), [ + self._get_depreciation_move_values(date='2022-01-31', depreciation_value=849.32, remaining_value=9150.68, depreciated_value=849.32, state='posted'), + self._get_depreciation_move_values(date='2022-02-24', depreciation_value=657.53, remaining_value=8493.15, depreciated_value=1506.85, state='posted'), + self._get_depreciation_move_values(date='2022-02-24', depreciation_value=8493.15, remaining_value=0, depreciated_value=10000, state='draft'), + ]) diff --git a/dev_odex30_accounting/odex30_account_asset/views/account_account_views.xml b/dev_odex30_accounting/odex30_account_asset/views/account_account_views.xml new file mode 100644 index 0000000..dc3b053 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/views/account_account_views.xml @@ -0,0 +1,50 @@ + + + + account.move.line.list + account.move.line + + extension + + + +

    +
    +
    + + + + + + + + + + + + account.asset.group.list + account.asset.group + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_asset/views/account_asset_views.xml b/dev_odex30_accounting/odex30_account_asset/views/account_asset_views.xml new file mode 100644 index 0000000..38d1add --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/views/account_asset_views.xml @@ -0,0 +1,518 @@ + + + + + account.asset.form + account.asset + 1 + +
    + + + + + + + + +
    +
    + +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + + account.asset.kanban + account.asset + + + + + +
    + +
    + +
    +
    +
    +
    + Original Value +
    +
    + +
    +
    +
    +
    + Acquisition Date +
    +
    + +
    +
    +
    +
    + Duration +
    +
    + +
    +
    +
    +
    + Model +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + + account.asset.list + account.asset + + + + + + + + + + + + + + + + + + + + + + + + + account.asset.model.list + account.asset + + + + + + + + + + + + + + + + + account.asset.search + account.asset + + + + + + + + + + + + + + + + + + + + + + + + + account.asset.model.search + account.asset + 100 + + + + + + + + + + + + + + + + Assets + account.asset + + [('state', '!=', 'model'), ('parent_id', '=', False)] + +

    + Create new asset +

    +
    +
    + + + Asset Models + account.asset + list,kanban,form + + + [('state', '=', 'model')] + {'default_state': 'model'} + +

    + Create new asset model +

    +
    +
    + + + + + + Confirm + + + + code + +if records: + action = records.filtered(lambda asset: asset.state == 'draft').validate() + + + + + Compute Depreciation + + + + list + code + +if records: + action = records.filtered(lambda asset: asset.state == 'draft').compute_depreciation_board() + + + + + + + + + + + account.move.line.list.asset + account.move.line + primary + + + hide + hide + hide + hide + hide + show + + + +
    diff --git a/dev_odex30_accounting/odex30_account_asset/views/account_move_views.xml b/dev_odex30_accounting/odex30_account_asset/views/account_move_views.xml new file mode 100644 index 0000000..5be8e1f --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/views/account_move_views.xml @@ -0,0 +1,68 @@ + + + + account.move.form + account.move + + + + + + + + + + + + + + + + + + + + + + account.move.line.form + account.move.line + + + + + + + + + + + + Create Asset + + + + code + +if records: + action = records.turn_as_asset() + + + diff --git a/dev_odex30_accounting/odex30_account_asset/wizard/__init__.py b/dev_odex30_accounting/odex30_account_asset/wizard/__init__.py new file mode 100644 index 0000000..71973ea --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/wizard/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import asset_modify diff --git a/dev_odex30_accounting/odex30_account_asset/wizard/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_asset/wizard/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b7c88855869296cc506f7a96b2943f02e4f4bd0 GIT binary patch literal 295 zcmZ3^%ge<81j4%`GfjZ>V-N=hn4pZ$LO{lJh7^Vr#vF!R#wbQch7_h?22JLdj6exZ z##=mz#l@*5@wxdanQ4`NnoPGCikN{iD;Yk6O!(ERpOK%Ns-KvXosn2ol$EI;P??;O zSd<%3l%JKFTvDu`pORW(YyhP4^K}g^^dKy-sF6W@VsdhRX;@$s2?nI-Y@dIgogIBb9pEX_%^E8+mU3gq-+c_8tDnURt40~-UQ O^aTbfOjN`MR09A^^ixm( literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_asset/wizard/__pycache__/asset_modify.cpython-311.pyc b/dev_odex30_accounting/odex30_account_asset/wizard/__pycache__/asset_modify.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35e54448d82805e596910547911e1485ce37e03e GIT binary patch literal 27960 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 PwSUe&e)$>{R=58Pu2yK~ literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_asset/wizard/asset_modify.py b/dev_odex30_accounting/odex30_account_asset/wizard/asset_modify.py new file mode 100644 index 0000000..310e1ef --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/wizard/asset_modify.py @@ -0,0 +1,409 @@ +# -*- coding: utf-8 -*- + +from odoo import api, fields, models, _, Command +from odoo.exceptions import UserError +from odoo.tools.misc import format_date +from odoo.tools import float_is_zero + +from dateutil.relativedelta import relativedelta + + +class AssetModify(models.TransientModel): + _name = 'asset.modify' + _description = 'Modify Asset' + + name = fields.Text(string='Note') + asset_id = fields.Many2one(string="Asset", comodel_name='account.asset', required=True, help="The asset to be modified by this wizard", ondelete="cascade") + method_number = fields.Integer(string='Duration', required=True) + method_period = fields.Selection([('1', 'Months'), ('12', 'Years')], string='Number of Months in a Period', help="The amount of time between two depreciations") + value_residual = fields.Monetary(string="Depreciable Amount", help="New residual amount for the asset", compute="_compute_value_residual", store=True, readonly=False) + salvage_value = fields.Monetary(string="Not Depreciable Amount", help="New salvage amount for the asset") + currency_id = fields.Many2one(related='asset_id.currency_id') + date = fields.Date(default=lambda self: fields.Date.today(), string='Date') + select_invoice_line_id = fields.Boolean(compute="_compute_select_invoice_line_id") + # if we should display the fields for the creation of gross increase asset + gain_value = fields.Boolean(compute="_compute_gain_value") + + account_asset_id = fields.Many2one( + 'account.account', + string="Gross Increase Account", + check_company=True, + domain="[('deprecated', '=', False)]", + ) + account_asset_counterpart_id = fields.Many2one( + 'account.account', + check_company=True, + domain="[('deprecated', '=', False)]", + string="Asset Counterpart Account", + ) + account_depreciation_id = fields.Many2one( + 'account.account', + check_company=True, + domain="[('deprecated', '=', False)]", + string="Depreciation Account", + ) + account_depreciation_expense_id = fields.Many2one( + 'account.account', + check_company=True, + domain="[('deprecated', '=', False)]", + string="Expense Account", + ) + modify_action = fields.Selection(selection="_get_selection_modify_options", string="Action") + company_id = fields.Many2one('res.company', related='asset_id.company_id') + + invoice_ids = fields.Many2many( + comodel_name='account.move', + string="Customer Invoice", + check_company=True, + domain="[('move_type', '=', 'out_invoice'), ('state', '=', 'posted')]", + help="The disposal invoice is needed in order to generate the closing journal entry.", + ) + invoice_line_ids = fields.Many2many( + comodel_name='account.move.line', + check_company=True, + domain="[('move_id', '=', invoice_id), ('display_type', '=', 'product')]", + help="There are multiple lines that could be the related to this asset", + ) + gain_account_id = fields.Many2one( + comodel_name='account.account', + check_company=True, + domain="[('deprecated', '=', False)]", + compute="_compute_accounts", inverse="_inverse_gain_account", readonly=False, compute_sudo=True, + help="Account used to write the journal item in case of gain", + ) + loss_account_id = fields.Many2one( + comodel_name='account.account', + check_company=True, + domain="[('deprecated', '=', False)]", + compute="_compute_accounts", inverse="_inverse_loss_account", readonly=False, compute_sudo=True, + help="Account used to write the journal item in case of loss", + ) + + informational_text = fields.Html(compute='_compute_informational_text') + + # Technical field to know if there was a profit or a loss in the selling of the asset + gain_or_loss = fields.Selection([('gain', 'Gain'), ('loss', 'Loss'), ('no', 'No')], compute='_compute_gain_or_loss') + + def _compute_modify_action(self): + if self.env.context.get('resume_after_pause'): + return 'resume' + else: + return 'dispose' + + @api.depends('asset_id') + def _get_selection_modify_options(self): + if self.env.context.get('resume_after_pause'): + return [('resume', _('Resume'))] + return [ + ('dispose', _("Dispose")), + ('sell', _("Sell")), + ('modify', _("Re-evaluate")), + ('pause', _("Pause")), + ] + + @api.depends('company_id') + def _compute_accounts(self): + for record in self: + record.gain_account_id = record.company_id.gain_account_id + record.loss_account_id = record.company_id.loss_account_id + + @api.depends('date') + def _compute_value_residual(self): + for record in self: + record.value_residual = record.asset_id._get_residual_value_at_date(record.date) + + def _inverse_gain_account(self): + for record in self: + record.company_id.sudo().gain_account_id = record.gain_account_id + + def _inverse_loss_account(self): + for record in self: + record.company_id.sudo().loss_account_id = record.loss_account_id + + @api.onchange('modify_action') + def _onchange_action(self): + if self.modify_action == 'sell' and self.asset_id.children_ids.filtered(lambda a: a.state in ('draft', 'open') or a.value_residual > 0): + raise UserError(_("You cannot automate the journal entry for an asset that has a running gross increase. Please use 'Dispose' on the increase(s).")) + if self.modify_action not in ('modify', 'resume'): + self.write({'value_residual': self.asset_id._get_residual_value_at_date(self.date), 'salvage_value': self.asset_id.salvage_value}) + + @api.onchange('invoice_ids') + def _onchange_invoice_ids(self): + self.invoice_line_ids = self.invoice_ids.invoice_line_ids.filtered(lambda line: line._origin.id in self.invoice_line_ids.ids) # because the domain filter doesn't apply and the invoice_line_ids remains selected + for invoice in self.invoice_ids.filtered(lambda inv: len(inv.invoice_line_ids) == 1): + self.invoice_line_ids += invoice.invoice_line_ids + + @api.depends('asset_id', 'invoice_ids', 'invoice_line_ids', 'modify_action', 'date') + def _compute_gain_or_loss(self): + for record in self: + balances = abs(sum([invoice.balance for invoice in record.invoice_line_ids])) + comparison = record.company_id.currency_id.compare_amounts(record.asset_id._get_own_book_value(record.date), balances) + if record.modify_action in ('sell', 'dispose') and comparison < 0: + record.gain_or_loss = 'gain' + elif record.modify_action in ('sell', 'dispose') and comparison > 0: + record.gain_or_loss = 'loss' + else: + record.gain_or_loss = 'no' + + @api.depends('asset_id', 'value_residual', 'salvage_value') + def _compute_gain_value(self): + for record in self: + record.gain_value = record.currency_id.compare_amounts( + record._get_own_book_value(), + record.asset_id._get_own_book_value(record.date) + ) > 0 + + @api.depends('loss_account_id', 'gain_account_id', 'gain_or_loss', 'modify_action', 'date', 'value_residual', 'salvage_value') + def _compute_informational_text(self): + for wizard in self: + if wizard.modify_action == 'dispose': + if wizard.gain_or_loss == 'gain': + account = wizard.gain_account_id.display_name or '' + gain_or_loss = _('gain') + elif wizard.gain_or_loss == 'loss': + account = wizard.loss_account_id.display_name or '' + gain_or_loss = _('loss') + else: + account = '' + gain_or_loss = _('gain/loss') + wizard.informational_text = _( + "A depreciation entry will be posted on and including the date %(date)s." + "
    A disposal entry will be posted on the %(account_type)s account %(account)s.", + date=format_date(self.env, wizard.date), account_type=gain_or_loss, account=account, + ) + elif wizard.modify_action == 'sell': + if wizard.gain_or_loss == 'gain': + account = wizard.gain_account_id.display_name or '' + elif wizard.gain_or_loss == 'loss': + account = wizard.loss_account_id.display_name or '' + else: + account = '' + wizard.informational_text = _( + "A depreciation entry will be posted on and including the date %(date)s." + "
    A second entry will neutralize the original income and post the " + "outcome of this sale on account %(account)s.", + date=format_date(self.env, wizard.date), account=account, + ) + elif wizard.modify_action == 'pause': + wizard.informational_text = _( + "A depreciation entry will be posted on and including the date %s.", + format_date(self.env, wizard.date) + ) + elif wizard.modify_action == 'modify': + if wizard.gain_value: + text = _("An asset will be created for the value increase of the asset.
    ") + else: + text = "" + wizard.informational_text = _( + "A depreciation entry will be posted on and including the date %(date)s.
    %(extra_text)s " + "Future entries will be recomputed to depreciate the asset following the changes.", + date=format_date(self.env, wizard.date), extra_text=text, + ) + + else: + if wizard.gain_value: + text = _("An asset will be created for the value increase of the asset.
    ") + else: + text = "" + wizard.informational_text = _("%s Future entries will be recomputed to depreciate the asset following the changes.", text) + + @api.depends('invoice_ids', 'modify_action') + def _compute_select_invoice_line_id(self): + for record in self: + record.select_invoice_line_id = record.modify_action == 'sell' and len(record.invoice_ids.invoice_line_ids) > 1 + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if 'asset_id' in vals: + asset = self.env['account.asset'].browse(vals['asset_id']) + if asset.depreciation_move_ids.filtered(lambda m: m.state == 'posted' and not m.reversal_move_ids and m.date > fields.Date.today()): + raise UserError(_('Reverse the depreciation entries posted in the future in order to modify the depreciation')) + if 'method_number' not in vals: + vals.update({'method_number': asset.method_number}) + if 'method_period' not in vals: + vals.update({'method_period': asset.method_period}) + if 'salvage_value' not in vals: + vals.update({'salvage_value': asset.salvage_value}) + if 'account_asset_id' not in vals: + vals.update({'account_asset_id': asset.account_asset_id.id}) + if 'account_depreciation_id' not in vals: + vals.update({'account_depreciation_id': asset.account_depreciation_id.id}) + if 'account_depreciation_expense_id' not in vals: + vals.update({'account_depreciation_expense_id': asset.account_depreciation_expense_id.id}) + return super().create(vals_list) + + def modify(self): + """ Modifies the duration of asset for calculating depreciation + and maintains the history of old values, in the chatter. + """ + if self.date <= self.asset_id.company_id._get_user_fiscal_lock_date(self.asset_id.journal_id): + raise UserError(_("You can't re-evaluate the asset before the lock date.")) + + old_values = { + 'method_number': self.asset_id.method_number, + 'method_period': self.asset_id.method_period, + 'value_residual': self.asset_id.value_residual, + 'salvage_value': self.asset_id.salvage_value, + } + + asset_vals = { + 'method_number': self.method_number, + 'method_period': self.method_period, + 'salvage_value': self.salvage_value, + 'account_asset_id': self.account_asset_id, + 'account_depreciation_id': self.account_depreciation_id, + 'account_depreciation_expense_id': self.account_depreciation_expense_id, + } + if self.env.context.get('resume_after_pause'): + date_before_pause = max(self.asset_id.depreciation_move_ids, key=lambda x: x.date).date if self.asset_id.depreciation_move_ids else self.asset_id.acquisition_date + # We are removing one day to number days because we don't count the current day + # i.e. If we pause and resume the same day, there isn't any gap whereas for depreciation + # purpose it would count as one full day + number_days = self.asset_id._get_delta_days(date_before_pause, self.date) - 1 + if self.currency_id.compare_amounts(number_days, 0) < 0: + raise UserError(_("You cannot resume at a date equal to or before the pause date")) + + asset_vals.update({'asset_paused_days': self.asset_id.asset_paused_days + number_days}) + asset_vals.update({'state': 'open'}) + self.asset_id.message_post(body=_("Asset unpaused. %s", self.name)) + + current_asset_book = self.asset_id._get_own_book_value(self.date) + after_asset_book = self._get_own_book_value() + increase = after_asset_book - current_asset_book + + new_residual, new_salvage = self._get_new_asset_values(current_asset_book) + residual_increase = max(0, self.value_residual - new_residual) + salvage_increase = max(0, self.salvage_value - new_salvage) + + if not self.env.context.get('resume_after_pause'): + if self.env['account.move'].search_count([('asset_id', '=', self.asset_id.id), ('state', '=', 'draft'), ('date', '<=', self.date)], limit=1): + raise UserError(_('There are unposted depreciations prior to the selected operation date, please deal with them first.')) + self.asset_id._create_move_before_date(self.date) + + asset_vals.update({ + 'salvage_value': new_salvage, + }) + computation_children_changed = ( + asset_vals['method_number'] != self.asset_id.method_number + or asset_vals['method_period'] != self.asset_id.method_period + or asset_vals.get('asset_paused_days') and not float_is_zero(asset_vals['asset_paused_days'] - self.asset_id.asset_paused_days, 8) + ) + self.asset_id.write(asset_vals) + + # Check for residual/salvage increase while rounding with the company currency precision to prevent float precision issues. + if self.currency_id.compare_amounts(residual_increase + salvage_increase, 0) > 0: + move = self.env['account.move'].create({ + 'journal_id': self.asset_id.journal_id.id, + 'date': self.date + relativedelta(days=1), + 'move_type': 'entry', + 'asset_move_type': 'positive_revaluation', + 'line_ids': [ + Command.create({ + 'account_id': self.account_asset_id.id, + 'debit': residual_increase + salvage_increase, + 'credit': 0, + 'name': _('Value increase for: %(asset)s', asset=self.asset_id.name), + }), + Command.create({ + 'account_id': self.account_asset_counterpart_id.id, + 'debit': 0, + 'credit': residual_increase + salvage_increase, + 'name': _('Value increase for: %(asset)s', asset=self.asset_id.name), + }), + ], + }) + move._post() + asset_increase = self.env['account.asset'].create({ + 'name': self.asset_id.name + ': ' + self.name if self.name else "", + 'currency_id': self.asset_id.currency_id.id, + 'company_id': self.asset_id.company_id.id, + 'method': self.asset_id.method, + 'method_number': self.method_number, + 'method_period': self.method_period, + 'method_progress_factor': self.asset_id.method_progress_factor, + 'acquisition_date': self.date + relativedelta(days=1), + 'value_residual': residual_increase, + 'salvage_value': salvage_increase, + 'prorata_date': self.date + relativedelta(days=1), + 'prorata_computation_type': 'daily_computation' if self.asset_id.prorata_computation_type == 'daily_computation' else 'constant_periods', + 'original_value': self._get_increase_original_value(residual_increase, salvage_increase), + 'account_asset_id': self.account_asset_id.id, + 'account_depreciation_id': self.account_depreciation_id.id, + 'account_depreciation_expense_id': self.account_depreciation_expense_id.id, + 'journal_id': self.asset_id.journal_id.id, + 'parent_id': self.asset_id.id, + 'original_move_line_ids': [(6, 0, move.line_ids.filtered(lambda r: r.account_id == self.account_asset_id).ids)], + }) + asset_increase.validate() + + subject = _('A gross increase has been created: %(link)s', link=asset_increase._get_html_link()) + self.asset_id.message_post(body=subject) + + if self.currency_id.compare_amounts(increase, 0) < 0: + move = self.env['account.move'].create(self.env['account.move']._prepare_move_for_asset_depreciation({ + 'amount': -increase, + 'asset_id': self.asset_id, + 'move_ref': _('Value decrease for: %(asset)s', asset=self.asset_id.name), + 'depreciation_beginning_date': self.date, + 'depreciation_end_date': self.date, + 'date': self.date, + 'asset_number_days': 0, + 'asset_value_change': True, + 'asset_move_type': 'negative_revaluation', + }))._post() + + restart_date = self.date if self.env.context.get('resume_after_pause') else self.date + relativedelta(days=1) + if self.asset_id.depreciation_move_ids: + self.asset_id.compute_depreciation_board(restart_date) + else: + # We have no moves, we can compute it as new + self.asset_id.compute_depreciation_board() + + if computation_children_changed: + children = self.asset_id.children_ids + children.write({ + 'method_number': asset_vals['method_number'], + 'method_period': asset_vals['method_period'], + 'asset_paused_days': self.asset_id.asset_paused_days, + }) + + for child in children: + if not self.env.context.get('resume_after_pause'): + child._create_move_before_date(self.date) + if child.depreciation_move_ids: + child.compute_depreciation_board(restart_date) + else: + child.compute_depreciation_board() + child._check_depreciations() + child.depreciation_move_ids.filtered(lambda move: move.state != 'posted')._post() + tracked_fields = self.env['account.asset'].fields_get(old_values.keys()) + changes, tracking_value_ids = self.asset_id._mail_track(tracked_fields, old_values) + if changes: + self.asset_id.message_post(body=_('Depreciation board modified %s', self.name), tracking_value_ids=tracking_value_ids) + self.asset_id._check_depreciations() + self.asset_id.depreciation_move_ids.filtered(lambda move: move.state != 'posted')._post() + return {'type': 'ir.actions.act_window_close'} + + def pause(self): + for record in self: + record.asset_id.pause(pause_date=record.date, message=self.name) + + def sell_dispose(self): + self.ensure_one() + if self.gain_account_id == self.asset_id.account_depreciation_id or self.loss_account_id == self.asset_id.account_depreciation_id: + raise UserError(_("You cannot select the same account as the Depreciation Account")) + invoice_lines = self.env['account.move.line'] if self.modify_action == 'dispose' else self.invoice_line_ids + return self.asset_id.set_to_close(invoice_line_ids=invoice_lines, date=self.date, message=self.name) + + def _get_own_book_value(self): + return self.value_residual + self.salvage_value + + def _get_increase_original_value(self, residual_increase, salvage_increase): + return residual_increase + salvage_increase + + def _get_new_asset_values(self, current_asset_book): + self.ensure_one() + new_residual = min(current_asset_book - min(self.salvage_value, self.asset_id.salvage_value), self.value_residual) + new_salvage = min(current_asset_book - new_residual, self.salvage_value) + return new_residual, new_salvage diff --git a/dev_odex30_accounting/odex30_account_asset/wizard/asset_modify_views.xml b/dev_odex30_accounting/odex30_account_asset/wizard/asset_modify_views.xml new file mode 100644 index 0000000..c36d943 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_asset/wizard/asset_modify_views.xml @@ -0,0 +1,104 @@ + + + + + wizard.asset.modify.form + asset.modify + +
    + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + +
    diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/__init__.py b/dev_odex30_accounting/odex30_account_auto_transfer/__init__.py new file mode 100644 index 0000000..502c788 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import models +from . import demo diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/__manifest__.py b/dev_odex30_accounting/odex30_account_auto_transfer/__manifest__.py new file mode 100644 index 0000000..71a683a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/__manifest__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +{ + 'name': 'Account Automatic Transfers', + 'depends': ['odex30_account_accountant'], + 'description': """ +Account Automatic Transfers +=========================== +Manage automatic transfers between your accounts. + """, + 'category': 'Odex30-Accounting/Odex30-Accounting', + 'author': "Expert Co. Ltd.", + 'website': "http://www.exp-sa.com", + 'data': [ + 'security/account_auto_transfer_security.xml', + 'security/ir.model.access.csv', + 'data/cron.xml', + 'views/transfer_model_views.xml', + ], + 'auto_install': True, +} diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_auto_transfer/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f93de87ed2668529ddc7a86ec269be3e08db45a GIT binary patch literal 333 zcmZ3^%ge<81QGipGaZ5SV-N=hn4pZ$azMs(h7^Vr#vF!R#wbQc5St0eW{P40vYCS! zG+ACU0u^a8-eSwmPf5)w2C`UEQgieDG?{NP6fpzkidcZeN`}uslHpgIenx(7s(xZl zc1B`VQC6mYKxJ}9Vo`2DQGQlxa!Ij1(2xpa10a>3uWM+b2VsFljSS)wlaupH^GY)F z()CkP%i4BO~JnHU>t~3k)L2=mvw(1#GB@9jFTc*cx0S literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/data/cron.xml b/dev_odex30_accounting/odex30_account_auto_transfer/data/cron.xml new file mode 100644 index 0000000..a6b169b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/data/cron.xml @@ -0,0 +1,10 @@ + + + Account automatic transfers: Perform transfers + + code + model.action_cron_auto_transfer() + 1 + days + + diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/demo/__init__.py b/dev_odex30_accounting/odex30_account_auto_transfer/demo/__init__.py new file mode 100644 index 0000000..7eaefb9 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/demo/__init__.py @@ -0,0 +1 @@ +from . import account_demo diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/demo/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_auto_transfer/demo/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4638962d6ff096c9d1ecde763ce462786a8cb0c9 GIT binary patch literal 299 zcmZ3^%ge<81lK2oW=aF;#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@8G#a- zjJJ3alaupH^Gf1VQgieDG?{KO6fpy3Rx*4BneeMyKO;XkRX;H&J0r2GC@WJxpfWil zu_!m7C_gJTxujS>KP9!o*Z@f7=j$3;=s{RuQ6qzRsM(o$>G~@tJv7fK6rT0(+KCNG9B=}Jr3t1^lmuFm6e*yjl_*qggn$BZ3)9Wc#MyM$Yj)Qy zj%bwwQmIs_msaf|2UN9`ic60@RXuWCN0wrZgo;!lwKpR`syOwHy=%t_reZyQJ2UTR zzW2@F{v3-%5j>ZEpI85kAoLe+cu&x+Jbo7{-ywpCprH(Z`!qrKWqi6n{3-BjUe-NPq^GLtc>EeuVDAzy4&xL^y}i!GCyjE*)TgIj=GSvyg5Os#z@jmZ9r% zjwr4}?G0%wj5zuVCLBz)$(4$1U2Om1x+wb4s_cDT_1u3Mv!011*12@`QGsBRfS zKrNn;R!VO8!i5# zXk-W3x#nxd_LA|tNOya*q-T5ltdAttLMqmw<``D@9!!BkuHd&$1`=*htL`1ScA``7qBlBPMIKG^IB z=2mui`+C_Zm^oQvy>h`eux-jYYmu7R?OsWqK6&<>Gz&UiwpB$s?;2Pv$ThPpoTWKx z%GycwZ&>DVjs$YDPFX;KgNp_1VxF=tYsvT&8#zp5YiYrdO~OQrUM1}|o`u~Oi#EDRwzi>GXJ^tr7IkyPDq-O~ zH5Kj@^K30yqZaG&nnX3JVq?Xy?0SruGc)Os8H0E%O5iBOmJKH$i!7RT=tUNFN#gN4 znqyf^)YKe>UTZ~~r?ROPB~6tVR86(1C2^h`DOxO01Pj)q6il8I_6$|P*5x&d*i}Os za#3E;fYYYV?W&{x=-dq3odd3)7qGYKw8_M!Y?4zJtMRNAaqZq=ogAFkYTgCj1dY|K z(j6>l6@XtB$60D)LUjYC+Ll?Ukmt;q{Gx)jpu)NkE!$kI)w-I-E_ckQ5|f{!ETote z9GTyuHr$2*i)xE3tQdM;&J|gtIYIjj?>uOaro&!P)0ruVYOPIAQz*u%_US`*#&pLnt=zy;=49d!rBIJzr+O%5KDm z*5gCBE|%h><@jhd2%4Lbs)!=pPWND09NG{^*2R%Z=ivQhpVNP|l$TabQIUo=q{($@^4HJ*C^~27OH!uH%VlT(m4}Hv-^^7~!yBpT_0;rlAKp9WT)13H zT`BV-R|XFO+@W1n1mY3$_wIhe#ZwXW?%nK$ojJv!S}CQMdC9l&t9C^8bys6M2Ot>` zPlsy2r%TD><>c`#zy|^Ned*AT9hF3KBQd<57+`gN2+rI+S%ub$;YsMP+B;d7MX}KKZh}9 zQOq}ULF4sKjIS1C&DDrl%`H(=wN3u<#?M&z)~u~o7IXKNLNyKJv|t|POOt<@&6pD) zP0, 2024 +# Malaz Abuidris , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:43+0000\n" +"Last-Translator: Malaz Abuidris , 2024\n" +"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#. module: odex30_account_auto_transfer +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_form +msgid " to " +msgstr " إلى " + +#. module: odex30_account_auto_transfer +#: model:ir.model,name:odex30_account_auto_transfer.model_account_chart_template +msgid "Account Chart Template" +msgstr "نموذج مخطط الحساب " + +#. module: odex30_account_auto_transfer +#: model:ir.model,name:odex30_account_auto_transfer.model_account_transfer_model +msgid "Account Transfer Model" +msgstr "نموذج تحويل الحساب " + +#. module: odex30_account_auto_transfer +#: model:ir.model,name:odex30_account_auto_transfer.model_account_transfer_model_line +msgid "Account Transfer Model Line" +msgstr "بند نموذج تحويل الحساب " + +#. module: odex30_account_auto_transfer +#: model:ir.actions.server,name:odex30_account_auto_transfer.ir_cron_auto_transfer_ir_actions_server +msgid "Account automatic transfers: Perform transfers" +msgstr "تحويلات الحساب التلقائية: أداء التحويلات " + +#. module: odex30_account_auto_transfer +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_form +msgid "Activate" +msgstr "تفعيل" + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__active +msgid "Active" +msgstr "نشط " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,help:odex30_account_auto_transfer.field_account_transfer_model_line__analytic_account_ids +msgid "" +"Adds a condition to only transfer the sum of the lines from the origin " +"accounts that match these analytic accounts to the destination account" +msgstr "" +"يقوم بإضافة شرط لتحويل مجموع البنود من الحسابات الأصلية التي تطابق تلك " +"الحسابات التحليلية إلى الحساب الهدف فقط " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,help:odex30_account_auto_transfer.field_account_transfer_model_line__partner_ids +msgid "" +"Adds a condition to only transfer the sum of the lines from the origin " +"accounts that match these partners to the destination account" +msgstr "" +"يقوم بإضافة شرط لتحويل مجموع البنود من الحسابات الأصلية التي تطابق هؤلاء " +"الشركاء إلى الحساب الهدف فقط " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model_line__analytic_account_ids +msgid "Analytic Filter" +msgstr "عامل تصفية تحليلي " + +#. module: odex30_account_auto_transfer +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_form +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_search +msgid "Archived" +msgstr "مؤرشف " + +#. module: odex30_account_auto_transfer +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_form +msgid "Automated Transfer" +msgstr "التحويل التلقائي " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "Automatic Transfer (%(percent)s%% from account %(origin_account)s)" +msgstr "التحويل التلقائي (%(percent)s%% من الحساب %(origin_account)s) " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "Automatic Transfer (-%s%%)" +msgstr "التحويل التلقائي (-%s%%)" + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "" +"Automatic Transfer (entries with analytic account(s): %(analytic_accounts)s " +"and partner(s): %(partners)s)" +msgstr "" +"التحويل التلقائي (القيود التي بها حساب (حسابات) تحليلية: " +"%(analytic_accounts)s والشريك (الشركاء): %(partners)s) " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "Automatic Transfer (entries with analytic account(s): %s)" +msgstr "التحويل التلقائي (القيود التي بها حساب (حسابات) تحليلية: %s)" + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "Automatic Transfer (entries with partner(s): %s)" +msgstr "التحويل التلقائي (القيود التي بها شريك (شركاء): %s) " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "" +"Automatic Transfer (from account %(origin_account)s with analytic " +"account(s): %(analytic_accounts)s and partner(s): %(partners)s)" +msgstr "" +"التحويل التلقائي (من الحساب %(origin_account)s الذي به حسابات تحليلية: " +"%(analytic_accounts)s والشريك (الشركاء): %(partners)s) " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "" +"Automatic Transfer (from account %(origin_account)s with analytic " +"account(s): %(analytic_accounts)s)" +msgstr "" +"التحويل التلقائي (من الحساب %(origin_account)s الذي به حسابات تحليلية: " +"%(analytic_accounts)s) " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "" +"Automatic Transfer (from account %(origin_account)s with partner(s): " +"%(partners)s)" +msgstr "" +"التحويل التلقائي (من الحساب %(origin_account)s الذي به الشركاء: " +"%(partners)s) " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "Automatic Transfer (to account %s)" +msgstr "التحويل التلقائي (للحساب %s)" + +#. module: odex30_account_auto_transfer +#: model:ir.actions.act_window,name:odex30_account_auto_transfer.transfer_model_action +msgid "Automatic Transfers" +msgstr "التحويلات التلقائية " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__company_id +msgid "Company" +msgstr "الشركة " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,help:odex30_account_auto_transfer.field_account_transfer_model__company_id +msgid "Company related to this journal" +msgstr "الشركة المتعلقة بهذه اليومية " + +#. module: odex30_account_auto_transfer +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_form +msgid "Compute Transfer" +msgstr "حساب التحويل " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__create_uid +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model_line__create_uid +msgid "Created by" +msgstr "أنشئ بواسطة" + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__create_date +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model_line__create_date +msgid "Created on" +msgstr "أنشئ في" + +#. module: odex30_account_auto_transfer +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_form +msgid "Description" +msgstr "الوصف" + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model_line__account_id +msgid "Destination Account" +msgstr "حساب الوجهة" + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__line_ids +msgid "Destination Accounts" +msgstr "حسابات الوجهة " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__journal_id +msgid "Destination Journal" +msgstr "يومية الوجهة " + +#. module: odex30_account_auto_transfer +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_form +msgid "Disable" +msgstr "تعطيل" + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields.selection,name:odex30_account_auto_transfer.selection__account_transfer_model__state__disabled +msgid "Disabled" +msgstr "معطل" + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__display_name +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model_line__display_name +msgid "Display Name" +msgstr "اسم العرض " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__frequency +msgid "Frequency" +msgstr "معدل الحدوث " + +#. module: odex30_account_auto_transfer +#: model:ir.actions.act_window,name:odex30_account_auto_transfer.generated_transfers_action +msgid "Generated Entries" +msgstr "القيود المُنشأة " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__move_ids +msgid "Generated Moves" +msgstr "الحركات المُنشأة " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__id +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model_line__id +msgid "ID" +msgstr "المُعرف" + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/demo/account_demo.py:0 +msgid "IFRS Automatic Transfers" +msgstr "التحويلات التلقائية في IFRS " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/demo/account_demo.py:0 +msgid "IFRS rent expense transfer" +msgstr "تحويل نفقات الإيجار في IFRS " + +#. module: odex30_account_auto_transfer +#: model:ir.model,name:odex30_account_auto_transfer.model_account_journal +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_form +msgid "Journal" +msgstr "دفتر اليومية" + +#. module: odex30_account_auto_transfer +#: model:ir.model,name:odex30_account_auto_transfer.model_account_move +msgid "Journal Entry" +msgstr "قيد اليومية" + +#. module: odex30_account_auto_transfer +#: model:ir.model,name:odex30_account_auto_transfer.model_account_move_line +msgid "Journal Item" +msgstr "عنصر اليومية" + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__write_uid +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model_line__write_uid +msgid "Last Updated by" +msgstr "آخر تحديث بواسطة" + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__write_date +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model_line__write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields.selection,name:odex30_account_auto_transfer.selection__account_transfer_model__frequency__month +msgid "Monthly" +msgstr "شهرياً" + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__move_ids_count +msgid "Move Ids Count" +msgstr "تعداد مُعرفات الحركات " + +#. module: odex30_account_auto_transfer +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_form +msgid "Move Model" +msgstr "نموذج الحركة " + +#. module: odex30_account_auto_transfer +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_tree +msgid "Move Models" +msgstr "نماذج الحركة " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__name +msgid "Name" +msgstr "الاسم" + +#. module: odex30_account_auto_transfer +#: model:ir.model.constraint,message:odex30_account_auto_transfer.constraint_account_transfer_model_line_unique_account_by_transfer_model +msgid "Only one account occurrence by transfer model" +msgstr "يُسمح بوجود حساب واحد فقط لكل نموذج تحويل " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__account_ids +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_form +msgid "Origin Accounts" +msgstr "الحسابات الأصلية " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_bank_statement_line__transfer_model_id +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_move__transfer_model_id +msgid "Originating Model" +msgstr "النموذج المُنشئ " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model_line__partner_ids +msgid "Partner Filter" +msgstr "عامل تصفية الشريك " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model_line__percent +msgid "Percent" +msgstr "بالمئة " + +#. module: odex30_account_auto_transfer +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_form +msgid "Percent (%)" +msgstr "النسبة (%)" + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model_line__percent_is_readonly +msgid "Percent Is Readonly" +msgstr "النسبة للقراءة فقط " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,help:odex30_account_auto_transfer.field_account_transfer_model_line__percent +msgid "" +"Percentage of the sum of lines from the origin accounts will be transferred " +"to the destination account" +msgstr "" +"سوف يتم تحويل نسبة من مجموع البنود من الحسابات الأصلية إلى حساب الوجهة " + +#. module: odex30_account_auto_transfer +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_form +msgid "Period" +msgstr "الفترة" + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields.selection,name:odex30_account_auto_transfer.selection__account_transfer_model__frequency__quarter +msgid "Quarterly" +msgstr "ربع سنوي" + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields.selection,name:odex30_account_auto_transfer.selection__account_transfer_model__state__in_progress +msgid "Running" +msgstr "جاري" + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model_line__sequence +msgid "Sequence" +msgstr "تسلسل " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__date_start +msgid "Start Date" +msgstr "تاريخ البدء " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__state +msgid "State" +msgstr "الحالة " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__date_stop +msgid "Stop Date" +msgstr "تاريخ الإيقاف " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "The analytic filter %s is duplicated" +msgstr "تم إنشاء نسخة مطابقة من عامل التصفية التحليلي %s " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "" +"The partner filter %(partner_filter)s in combination with the analytic " +"filter %(analytic_filter)s is duplicated" +msgstr "" +"تم إنشاء نسخة مطابقة لعامل تصفية الشريك %(partner_filter)s وجمعه مع الحساب " +"التحليلي %(analytic_filter)s " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "The partner filter %s is duplicated" +msgstr "تم إنشاء نسخة مطابقة لعامل تصفية الشريك %s " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "The total percentage (%s) should be less or equal to 100!" +msgstr "يجب أن تكون النسبة الكلية (%s) أقل من أو تساوي 100! " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model__total_percent +msgid "Total Percent" +msgstr "النسبة الكلية " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields,field_description:odex30_account_auto_transfer.field_account_transfer_model_line__transfer_model_id +msgid "Transfer Model" +msgstr "نموذج التحويل " + +#. module: odex30_account_auto_transfer +#: model:ir.ui.menu,name:odex30_account_auto_transfer.menu_auto_transfer +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_form +msgid "Transfers" +msgstr "التحويلات " + +#. module: odex30_account_auto_transfer +#: model:ir.model.fields.selection,name:odex30_account_auto_transfer.selection__account_transfer_model__frequency__year +msgid "Yearly" +msgstr "سنويًا" + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/demo/account_demo.py:0 +msgid "Yearly liabilites auto transfers" +msgstr "التحويلات التلقائية للالتزامات السنوية " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "" +"You cannot delete an automatic transfer that has draft moves attached " +"('%s'). Please delete them before deleting this transfer." +msgstr "" +"لا يمكنك حذف شحنة تلقائية بها حركات مرفقة بحالة المسودة ('%s')؛ يرجى حذفها " +"قبل حذف هذه الشحنة. " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/transfer_model.py:0 +msgid "" +"You cannot delete an automatic transfer that has posted moves attached " +"('%s')." +msgstr "لا يمكنك حذف شحنة تلقائية بها حركات مرفقة قد تم ترحيلها ('%s'). " + +#. module: odex30_account_auto_transfer +#. odoo-python +#: code:addons/odex30_account_auto_transfer/models/account_move_line.py:0 +msgid "You cannot set Tax on Automatic Transfer's entries." +msgstr "لا يمكنك تعيين ضريبة في قيود التحويل التلقائي. " + +#. module: odex30_account_auto_transfer +#: model_terms:ir.ui.view,arch_db:odex30_account_auto_transfer.view_transfer_model_form +msgid "e.g. Monthly Expense Transfer" +msgstr "مثال: التحويل الشهري للنفقات " diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/models/__init__.py b/dev_odex30_accounting/odex30_account_auto_transfer/models/__init__.py new file mode 100644 index 0000000..0664ea8 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/models/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- + +from . import account_journal +from . import account_move +from . import account_move_line +from . import transfer_model diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_auto_transfer/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f077a44198c41f13aaf77b7ac5ea110484aeca9 GIT binary patch literal 466 zcmZvY%SyvQ6o${_QoL1hD_+)F*r^KQLVN@%h@jaFLo%AgWJV@QvA%=2^by3D@ENiU z-MVsD=&mbI(gqT6`1#Lwer67b`Rw;M0MFg`efW;`r)rvGtYChQ@Bu#fB!+~zgj8%G z8?I5aiEO%N%@(rdTFCYdIK5wjj~z1I;hv{*nXyRaTJjj9ttLv;SYW@~?pYklD%{RA zm+6DhEK$CQuN`{|+QgaKs?4sehxP??bXdI6KqZ3m_$lD8ItuA%;ssnMBdsFgWhuoe zFK0t6N*$kE43<=)Cl-E+M2Y# zKmdLUAsVp?b3VkG9Y6qq4#>eY%qeLF3R!W~oR-!gP{1G{>INVhh1tjs?5P0k^Cd@G zC$Vvm)PD&vsf2pYBh>Lj6))LI7`BYO>7N{ai6%#1jgC+B4G*J%;l4quVqD%LSLXv< z+yNA%ApvQHz_h9Ws$D)zl+WrO4`-h*If%9a_BgvADL@1#yxwP7UfvB}dwJ$!XRR4a z+007C1P5o}0OeiV^#klUR@EzaCV~~X&JQ@*0q;SU?{Z|T_jZ*?SGx!LrBsiWJ*)LY z;N9xQU9HO2Fhn6Lx2Pt5UR{9o9(QZrx-_iMh$!iJc_p>cwL4K70)}0Go-(ssuduO_ z7G#r9vE5`ts8V-1Y_L2xpesSBF3^ApB%$t8%&bhP+Qbj_yzAKRBG0AfQ)k{6xoN-H zPG!6tO<`v-gV$KrPK~Wv8O(BH%*#?M@Kd}+Rvvfp&GR}R_L`C_Yaex?3PRgmND;b> zQ4H^GJQl z$vQYmG;j8n60Jvxw!=i*kM{0jqNkMTIR)?XMd9Q1!5 zDm5?&hWXv8KvqfXBWXu(!d8!I~>E)b11V(vP;t07oM-d7ek-(jI1aBbp zE{~ncNgUa3hB7-~qOHQX=kh<229(|A;wQjb_{MGt(hw0*S$~j|_3C%r+`c|^61%xR zzA^J5D8xF7v5r!#<5W>%0+pa=D$pPNrIRP}4dGsZ)N*s$ TTury8wr9@DXTSe(qYUT|U%Fm> literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/models/__pycache__/account_move.cpython-311.pyc b/dev_odex30_accounting/odex30_account_auto_transfer/models/__pycache__/account_move.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb7681953c3fe473b997f6cd9fa78860d195b751 GIT binary patch literal 771 zcmZ`$J8u**5VpM!P9fol5a=32DqtnJ4M9Q_5rPURE<~b%6^CW5ot%$-B;LIfcU200 z07yuopbkRt8~6>2L;#`Agh&C=2Wg7M(PL-_^vZ-z9( zslj|5z&_%L;|Rq#z%dC3Mg-kPoIFF^5@cvKNe6)59kIaX_I>0z-_5Z{w7Vrm#53*2 zDHl-|Hd$u3YcjtEU>^w-V2%R9abOW7>|rAZigN3{eL$cPtZD=|NP%>BM?Yh-t$z&}}gkElnnM@H;$={;6(R}#AAEdGHS@dMU zrfMkt%}F?5D&AD-P=tBrL;TaLtFWc%A-TB(N@XCGNE-v0I?mj9y{g0jgr%u1H zPghg5n+rBPN83hu*$-v@t#-=ZRz*&jz%u$Ipu^UB)z=&96i^H+qhMwh#(3r;yi%ZZ bf6tj~;m3G}{%xP1e|hOgdG_-^5v71%lwQxS literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/models/__pycache__/account_move_line.cpython-311.pyc b/dev_odex30_accounting/odex30_account_auto_transfer/models/__pycache__/account_move_line.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..620c95eb6bafe8c6eced6067e9c2b872d2db8cda GIT binary patch literal 1533 zcmb7EO=ufO6n?X-UCBSO5{HsPjJ+)_L6EGRIENmL!QjxABt~F6Gz;ml?2e;V_D7vr zrLu596d!WPA%{?(dg;L-_>x1<`o0-?~}6r7V!eX}bG%Si~G-F-9j&Ad0? zH*aR2o;o!SSbq5Pw)Z;$cq2Q5qV*exH?Xk_F1W;pfLJ6@EG1Aal}JqSbAe`Q1Qhrd zTy+QB98+rgAjqByu#aC>th}qOK}r8tc1voa+I26{gUDsRNC+*FWNbq)evR{pJAI$D z8bml;!R{_Fu!swm;u1?$faPifuE=K(b?oDp70GB1oBIO*EZxl^2Q4WsJ5JOHx`WNW`Kz4Bb4N0yGcD)IKzM#M=mA_9oEt8LVRq@B|ESUD<_s5rNn3AfgJRY zht%Oc@}qvgpkySju8xpVFvfx;vxw$85G1q>cg{T^+oXm_R%%0vk&d|ZNy{zRB?KOQ zo(3kXn325Hj*62rF}Fjp$v92ZgAgA>pOTU&=6sTqyCY;A!#Mi2T#W)&w*7lmyTxl> zxw7R{Z5~v3RAWvo%9!8g!aP<{bm{UpX4Xp4EAzC!>0WrZ?6Uhbn|mA`MX23~BRU{g z&dyG`9|XA~d&$kLZyk*--enQtF?Z!}oyD6>s5>*k^#IkqpB%wd#C zlq*a$|KQVx&Qt~87gry~kG8wTOP%7<^RNE6n4!n*A$mY-;daz896Jo7*bpo>*6pSd zg~l?f3GCQ&jP?G0Ul0ZhW9~6wrZ*(q;_^0ec~0%Fx_4# z_-6<_gEU&Iofi;DO&%LU{u|oE=T-5`_IIzfv+cE=A0K~zpv`u**`A_kl9aS>RnX^7 zVA)8vfQ-FbDkM31Y*Q{gCzq3XNQx3PS<_+l*h7M8iW2Q6o>f0%bzaVux>Ke{g~d$n x5}!j%rceBg26u^&o({z5z}&~)SMYUb^zG?7kvcwXA8$VK-=<^lJ~AUE_8(KpjBWq` literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/models/__pycache__/transfer_model.cpython-311.pyc b/dev_odex30_accounting/odex30_account_auto_transfer/models/__pycache__/transfer_model.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d583ba533796c673ba40b8b39ad3ce993d532da GIT binary patch literal 31691 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 Z^xU#qXbd<0!aVbRq(1-T8Ohi%|6eD>E+zl~ literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/models/account_journal.py b/dev_odex30_accounting/odex30_account_auto_transfer/models/account_journal.py new file mode 100644 index 0000000..95f5402 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/models/account_journal.py @@ -0,0 +1,11 @@ +from odoo import models, api +from odoo.addons.base.models.ir_model import MODULE_UNINSTALL_FLAG + + +class AccountJournal(models.Model): + _inherit = 'account.journal' + + @api.ondelete(at_uninstall=True) + def _unlink_cascade_transfer_model(self): + if self.env.context.get(MODULE_UNINSTALL_FLAG): # only cascade when switching CoA + self.env['account.transfer.model'].search([('journal_id', 'in', self.ids)]).unlink() diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/models/account_move.py b/dev_odex30_accounting/odex30_account_auto_transfer/models/account_move.py new file mode 100644 index 0000000..d4dd1e5 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/models/account_move.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +from odoo import fields, models + + +class AccountMove(models.Model): + _inherit = 'account.move' + + transfer_model_id = fields.Many2one('account.transfer.model', string="Originating Model") diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/models/account_move_line.py b/dev_odex30_accounting/odex30_account_auto_transfer/models/account_move_line.py new file mode 100644 index 0000000..623c520 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/models/account_move_line.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from odoo import api, models, _ +from odoo.exceptions import UserError + + +class AccountMoveLine(models.Model): + _inherit = 'account.move.line' + + @api.constrains('tax_ids') + def _check_auto_transfer_line_ids_tax(self): + if any(line.move_id.transfer_model_id and line.tax_ids for line in self): + raise UserError(_("You cannot set Tax on Automatic Transfer's entries.")) diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/models/transfer_model.py b/dev_odex30_accounting/odex30_account_auto_transfer/models/transfer_model.py new file mode 100644 index 0000000..a4cb5f5 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/models/transfer_model.py @@ -0,0 +1,531 @@ +# -*- coding: utf-8 -*- + +from datetime import date + +from dateutil.relativedelta import relativedelta + +from odoo import fields, models, api, _ +from odoo.exceptions import UserError, ValidationError +from odoo.osv import expression +from odoo.tools.float_utils import float_compare, float_is_zero + + +class TransferModel(models.Model): + _name = "account.transfer.model" + _description = "Account Transfer Model" + + # DEFAULTS + def _get_default_date_start(self): + company = self.env.company + return company.compute_fiscalyear_dates(date.today())['date_from'] if company else None + + def _get_default_journal(self): + return self.env['account.journal'].search([ + *self.env['account.journal']._check_company_domain(self.env.company), + ('type', '=', 'general'), + ], limit=1) + + name = fields.Char(required=True) + active = fields.Boolean(default=True) + journal_id = fields.Many2one('account.journal', required=True, string="Destination Journal", default=_get_default_journal) + company_id = fields.Many2one('res.company', readonly=True, related='journal_id.company_id') + date_start = fields.Date(string="Start Date", required=True, default=_get_default_date_start) + date_stop = fields.Date(string="Stop Date", required=False) + frequency = fields.Selection([('month', 'Monthly'), ('quarter', 'Quarterly'), ('year', 'Yearly')], + required=True, default='month') + account_ids = fields.Many2many('account.account', 'account_model_rel', string="Origin Accounts", domain="[('account_type', '!=', 'off_balance')]") + line_ids = fields.One2many('account.transfer.model.line', 'transfer_model_id', string="Destination Accounts") + move_ids = fields.One2many('account.move', 'transfer_model_id', string="Generated Moves") + move_ids_count = fields.Integer(compute="_compute_move_ids_count") + total_percent = fields.Float(compute="_compute_total_percent", string="Total Percent", readonly=True) + state = fields.Selection([('disabled', 'Disabled'), ('in_progress', 'Running')], default='disabled', required=True) + + def copy(self, default=None): + new_models = super().copy(default) + for old_model, new_model in zip(self, new_models): + new_model.account_ids += old_model.account_ids + old_model.line_ids.copy({'transfer_model_id': new_model.id}) + return new_models + + @api.ondelete(at_uninstall=False) + def _unlink_with_check_moves(self): + # Only unlink a transfer that has no posted/draft moves attached. + for transfer in self: + if transfer.move_ids_count > 0: + posted_moves = any(move.state == 'posted' for move in transfer.move_ids) + if posted_moves: + raise UserError(_("You cannot delete an automatic transfer that has posted moves attached ('%s').", transfer.name)) + draft_moves = any(move.state == 'draft' for move in transfer.move_ids) + if draft_moves: + raise UserError(_("You cannot delete an automatic transfer that has draft moves attached ('%s'). " + "Please delete them before deleting this transfer.", transfer.name)) + + def action_archive(self): + self.action_disable() + return super().action_archive() + + # COMPUTEDS / CONSTRAINS + @api.depends('move_ids') + def _compute_move_ids_count(self): + """ Compute the amount of move ids have been generated by this transfer model. """ + for record in self: + record.move_ids_count = len(record.move_ids) + + @api.constrains('line_ids') + def _check_line_ids_percent(self): + """ Check that the total percent is not bigger than 100.0 """ + for record in self: + if not (0 < record.total_percent <= 100.0): + raise ValidationError(_('The total percentage (%s) should be less or equal to 100!', record.total_percent)) + + @api.constrains('line_ids') + def _check_line_ids_filters(self): + """ Check that the filters on the lines make sense """ + for record in self: + combinations = [] + for line in record.line_ids: + if line.partner_ids and line.analytic_account_ids: + for p in line.partner_ids: + for a in line.analytic_account_ids: + combination = (p.id, a.id) + if combination in combinations: + raise ValidationError(_( + "The partner filter %(partner_filter)s in combination with the analytic filter %(analytic_filter)s is duplicated", + partner_filter=p.display_name, analytic_filter=a.display_name, + )) + combinations.append(combination) + elif line.partner_ids: + for p in line.partner_ids: + combination = (p.id, None) + if combination in combinations: + raise ValidationError(_("The partner filter %s is duplicated", p.display_name)) + combinations.append(combination) + elif line.analytic_account_ids: + for a in line.analytic_account_ids: + combination = (None, a.id) + if combination in combinations: + raise ValidationError(_("The analytic filter %s is duplicated", a.display_name)) + combinations.append(combination) + + @api.depends('line_ids') + def _compute_total_percent(self): + """ Compute the total percentage of all lines linked to this model. """ + for record in self: + non_filtered_lines = record.line_ids.filtered(lambda l: not l.partner_ids and not l.analytic_account_ids) + if record.line_ids and not non_filtered_lines: + # Lines are only composed of filtered ones thus percentage does not matter, make it 100 + record.total_percent = 100.0 + else: + total_percent = sum(non_filtered_lines.mapped('percent')) + if float_compare(total_percent, 100.0, precision_digits=6) == 0: + total_percent = 100.0 + record.total_percent = total_percent + + # ACTIONS + def action_activate(self): + """ Put this move model in "in progress" state. """ + return self.write({'state': 'in_progress'}) + + def action_disable(self): + """ Put this move model in "disabled" state. """ + return self.write({'state': 'disabled'}) + + @api.model + def action_cron_auto_transfer(self): + """ Perform the automatic transfer for the all active move models. """ + self.search([('state', '=', 'in_progress')]).action_perform_auto_transfer() + + def action_perform_auto_transfer(self): + """ Perform the automatic transfer for the current recordset of models """ + for record in self: + # If no account to ventilate or no account to ventilate into : nothing to do + if record.account_ids and record.line_ids: + today = date.today() + max_date = record.date_stop and min(today, record.date_stop) or today + start_date = record._determine_start_date() + next_move_date = record._get_next_move_date(start_date) + + # (Re)Generate moves in draft untill today + # Journal entries will be recomputed everyday until posted. + while next_move_date <= max_date: + record._create_or_update_move_for_period(start_date, next_move_date) + start_date = next_move_date + relativedelta(days=1) + next_move_date = record._get_next_move_date(start_date) + + # (Re)Generate move for one more period if needed + if not record.date_stop: + record._create_or_update_move_for_period(start_date, next_move_date) + elif today < record.date_stop: + record._create_or_update_move_for_period(start_date, min(next_move_date, record.date_stop)) + return False + + def _get_move_lines_base_domain(self, start_date, end_date): + """ + Determine the domain to get all account move lines posted in a given period, for an account in origin accounts + :param start_date: the start date of the period + :param end_date: the end date of the period + :return: the computed domain + :rtype: list + """ + self.ensure_one() + return [ + ('account_id', 'in', self.account_ids.ids), + ('date', '>=', start_date), + ('date', '<=', end_date), + ('parent_state', '=', 'posted') + ] + + # PROTECTEDS + + def _create_or_update_move_for_period(self, start_date, end_date): + """ + Create or update a move for a given period. This means (re)generates all the needed moves to execute the + transfers + :param start_date: the start date of the targeted period + :param end_date: the end date of the targeted period + :return: the created (or updated) move + """ + self.ensure_one() + current_move = self._get_move_for_period(end_date) + line_values = self._get_auto_transfer_move_line_values(start_date, end_date) + if line_values: + if current_move is None: + current_move = self.env['account.move'].create({ + 'ref': '%s: %s --> %s' % (self.name, str(start_date), str(end_date)), + 'date': end_date, + 'journal_id': self.journal_id.id, + 'transfer_model_id': self.id, + }) + + line_ids_values = [(0, 0, value) for value in line_values] + # unlink all old line ids + current_move.line_ids.unlink() + # recreate line ids + current_move.write({'line_ids': line_ids_values}) + return current_move + + def _get_move_for_period(self, end_date): + """ Get the generated move for a given period + :param end_date: the end date of the wished period, do not need the start date as the move will always be + generated with end date of a period as date + :return: a recordset containing the move found if any, else None + """ + self.ensure_one() + # Move will always be generated with end_date of a period as date + domain = [ + ('date', '=', end_date), + ('state', '=', 'draft'), + ('transfer_model_id', '=', self.id) + ] + current_moves = self.env['account.move'].search(domain, limit=1, order="date desc") + return current_moves[0] if current_moves else None + + def _determine_start_date(self): + """ Determine the automatic transfer start date which is the last created move if any or the start date of the model """ + self.ensure_one() + # Get last generated move date if any (to know when to start) + last_move_domain = [('transfer_model_id', '=', self.id), ('state', '=', 'posted'), ('company_id', '=', self.company_id.id)] + move_ids = self.env['account.move'].search(last_move_domain, order='date desc', limit=1) + return (move_ids[0].date + relativedelta(days=1)) if move_ids else self.date_start + + def _get_next_move_date(self, date): + """ Compute the following date of automated transfer move, based on a date and the frequency """ + self.ensure_one() + if self.frequency == 'month': + delta = relativedelta(months=1) + elif self.frequency == 'quarter': + delta = relativedelta(months=3) + else: + delta = relativedelta(years=1) + return date + delta - relativedelta(days=1) + + def _get_auto_transfer_move_line_values(self, start_date, end_date): + """ Get all the transfer move lines values for a given period + :param start_date: the start date of the period + :param end_date: the end date of the period + :return: a list of dict representing the values of lines to create + :rtype: list + """ + self.ensure_one() + values = [] + # Get the balance of all moves from all selected accounts, grouped by accounts + filtered_lines = self.line_ids.filtered(lambda x: x.analytic_account_ids or x.partner_ids) + if filtered_lines: + values += filtered_lines._get_transfer_move_lines_values(start_date, end_date) + + non_filtered_lines = self.line_ids - filtered_lines + if non_filtered_lines: + values += self._get_non_filtered_auto_transfer_move_line_values(non_filtered_lines, start_date, end_date) + + return values + + def _get_non_filtered_auto_transfer_move_line_values(self, lines, start_date, end_date): + """ + Get all values to create move lines corresponding to the transfers needed by all lines without analytic + account or partner for a given period. It contains the move lines concerning destination accounts and + the ones concerning the origin accounts. This process all the origin accounts one after one. + :param lines: the move model lines to handle + :param start_date: the start date of the period + :param end_date: the end date of the period + :return: a list of dict representing the values to use to create the needed move lines + :rtype: list + """ + self.ensure_one() + domain = expression.AND([ + self._get_move_lines_base_domain(start_date, end_date), + [('partner_id', 'not in', self.line_ids.partner_ids.ids)], + [('analytic_distribution', 'not in', self.line_ids.analytic_account_ids.ids)], + ]) + total_balance_account = self.env['account.move.line']._read_group( + domain, + ['account_id'], + ['balance:sum'], + ) + # balance = debit - credit + # --> balance > 0 means a debit so it should be credited on the source account + # --> balance < 0 means a credit so it should be debited on the source account + values_list = [] + for account, balance in total_balance_account: + initial_amount = abs(balance) + source_account_is_debit = balance >= 0 + if not float_is_zero(initial_amount, precision_digits=9): + move_lines_values, amount_left = self._get_non_analytic_transfer_values(account, lines, end_date, + initial_amount, + source_account_is_debit) + + # the line which credit/debit the source account + substracted_amount = initial_amount - amount_left + source_move_line = { + 'name': _('Automatic Transfer (-%s%%)', self.total_percent), + 'account_id': account.id, + 'date_maturity': end_date, + 'credit' if source_account_is_debit else 'debit': substracted_amount + } + values_list += move_lines_values + values_list.append(source_move_line) + return values_list + + def _get_non_analytic_transfer_values(self, account, lines, write_date, amount, is_debit): + """ + Get all values to create destination account move lines corresponding to the transfers needed by all lines + without analytic account for a given account. + :param account: the origin account to handle + :param write_date: the write date of the move lines + :param amount: the total amount to take care on the origin account + :type amount: float + :param is_debit: True if origin account has a debit balance, False if it's a credit + :type is_debit: bool + :return: a tuple containing the move lines values in a list and the amount left on the origin account after + processing as a float + :rtype: tuple + """ + # if total ventilated is 100% + # then the last line should not compute in % but take the rest + # else + # it should compute in % (as the rest will stay on the source account) + self.ensure_one() + amount_left = amount + + take_the_rest = self.total_percent == 100.0 + amount_of_lines = len(lines) + values_list = [] + + for i, line in enumerate(lines): + if take_the_rest and i == amount_of_lines - 1: + line_amount = amount_left + amount_left = 0 + else: + currency = self.journal_id.currency_id or self.company_id.currency_id + line_amount = currency.round((line.percent / 100.0) * amount) + amount_left -= line_amount + + move_line = line._get_destination_account_transfer_move_line_values(account, line_amount, is_debit, + write_date) + values_list.append(move_line) + + return values_list, amount_left + + +class TransferModelLine(models.Model): + _name = "account.transfer.model.line" + _description = "Account Transfer Model Line" + _order = "sequence, id" + + transfer_model_id = fields.Many2one('account.transfer.model', string="Transfer Model", required=True, ondelete='cascade') + account_id = fields.Many2one('account.account', string="Destination Account", required=True, + domain="[('account_type', '!=', 'off_balance')]") + percent = fields.Float(string="Percent", required=True, default=100, help="Percentage of the sum of lines from the origin accounts will be transferred to the destination account") + analytic_account_ids = fields.Many2many('account.analytic.account', string='Analytic Filter', help="Adds a condition to only transfer the sum of the lines from the origin accounts that match these analytic accounts to the destination account") + partner_ids = fields.Many2many('res.partner', string='Partner Filter', help="Adds a condition to only transfer the sum of the lines from the origin accounts that match these partners to the destination account") + percent_is_readonly = fields.Boolean(compute="_compute_percent_is_readonly") + sequence = fields.Integer("Sequence") + + _sql_constraints = [ + ( + 'unique_account_by_transfer_model', 'UNIQUE(transfer_model_id, account_id)', + 'Only one account occurrence by transfer model') + ] + + @api.onchange('analytic_account_ids', 'partner_ids') + def set_percent_if_analytic_account_ids(self): + """ + Set percent to 100 if at least analytic account id is set. + """ + for record in self: + if record.analytic_account_ids or record.partner_ids: + record.percent = 100 + + def _get_transfer_move_lines_values(self, start_date, end_date): + """ + Get values to create the move lines to perform all needed transfers between accounts linked to current recordset + for a given period + :param start_date: the start date of the targeted period + :param end_date: the end date of the targeted period + :return: a list containing all the values needed to create the needed transfers + :rtype: list + """ + transfer_values = [] + # Avoid to transfer two times the same entry + already_handled_move_line_ids = [] + for transfer_model_line in self: + domain = transfer_model_line._get_move_lines_domain(start_date, end_date, already_handled_move_line_ids) + + if transfer_model_line.analytic_account_ids: + domain = expression.AND([ + domain, + [('analytic_distribution', 'in', transfer_model_line.analytic_account_ids.ids)], + ]) + + total_balances = self.env['account.move.line']._read_group( + domain, + ['account_id'], + ['id:array_agg', 'balance:sum'], + ) + for account, ids, balance in total_balances: + already_handled_move_line_ids += ids + if not float_is_zero(balance, precision_digits=9): + amount = abs(balance) + source_account_is_debit = balance > 0 + transfer_values += transfer_model_line._get_transfer_values(account, amount, source_account_is_debit, + end_date) + return transfer_values + + def _get_move_lines_domain(self, start_date, end_date, avoid_move_line_ids=None): + """ + Determine the domain to get all account move lines posted in a given period corresponding to self move model + line. + :param start_date: the start date of the targeted period + :param end_date: the end date of the targeted period + :param avoid_move_line_ids: the account.move.line ids that should be excluded from the domain + :return: the computed domain + :rtype: list + """ + self.ensure_one() + move_lines_domain = self.transfer_model_id._get_move_lines_base_domain(start_date, end_date) + if avoid_move_line_ids: + move_lines_domain.append(('id', 'not in', avoid_move_line_ids)) + if self.partner_ids: + move_lines_domain.append(('partner_id', 'in', self.partner_ids.ids)) + return move_lines_domain + + def _get_transfer_values(self, account, amount, is_debit, write_date): + """ + Get values to create the move lines to perform a transfer between self account and given account + :param account: the account + :param amount: the amount that is being transferred + :type amount: float + :param is_debit: True if the transferred amount is a debit, False if credit + :type is_debit: bool + :param write_date: the date to use for the move line writing + :return: a list containing the values to create the needed move lines + :rtype: list + """ + self.ensure_one() + return [ + self._get_destination_account_transfer_move_line_values(account, amount, is_debit, write_date), + self._get_origin_account_transfer_move_line_values(account, amount, is_debit, write_date) + ] + + def _get_origin_account_transfer_move_line_values(self, origin_account, amount, is_debit, + write_date): + """ + Get values to create the move line in the origin account side for a given transfer of a given amount from origin + account to a given destination account. + :param origin_account: the origin account + :param amount: the amount that is being transferred + :type amount: float + :param is_debit: True if the transferred amount is a debit, False if credit + :type is_debit: bool + :param write_date: the date to use for the move line writing + :return: a dict containing the values to create the move line + :rtype: dict + """ + anal_accounts = self.analytic_account_ids and ', '.join(self.analytic_account_ids.mapped('name')) + partners = self.partner_ids and ', '.join(self.partner_ids.mapped('name')) + if anal_accounts and partners: + name = _("Automatic Transfer (entries with analytic account(s): %(analytic_accounts)s and partner(s): %(partners)s)", analytic_accounts=anal_accounts, partners=partners) + elif anal_accounts: + name = _("Automatic Transfer (entries with analytic account(s): %s)", anal_accounts) + elif partners: + name = _("Automatic Transfer (entries with partner(s): %s)", partners) + else: + name = _("Automatic Transfer (to account %s)", self.account_id.code) + return { + 'name': name, + 'account_id': origin_account.id, + 'date_maturity': write_date, + 'credit' if is_debit else 'debit': amount + } + + def _get_destination_account_transfer_move_line_values(self, origin_account, amount, is_debit, + write_date): + """ + Get values to create the move line in the destination account side for a given transfer of a given amount from + given origin account to destination account. + :param origin_account: the origin account + :param amount: the amount that is being transferred + :type amount: float + :param is_debit: True if the transferred amount is a debit, False if credit + :type is_debit: bool + :param write_date: the date to use for the move line writing + :return: a dict containing the values to create the move line + :rtype dict: + """ + anal_accounts = self.analytic_account_ids and ', '.join(self.analytic_account_ids.mapped('name')) + partners = self.partner_ids and ', '.join(self.partner_ids.mapped('name')) + if anal_accounts and partners: + name = _( + "Automatic Transfer (from account %(origin_account)s with analytic account(s): %(analytic_accounts)s and partner(s): %(partners)s)", + origin_account=origin_account.code, + analytic_accounts=anal_accounts, + partners=partners, + ) + elif anal_accounts: + name = _( + "Automatic Transfer (from account %(origin_account)s with analytic account(s): %(analytic_accounts)s)", + origin_account=origin_account.code, + analytic_accounts=anal_accounts + ) + elif partners: + name = _( + "Automatic Transfer (from account %(origin_account)s with partner(s): %(partners)s)", + origin_account=origin_account.code, + partners=partners, + ) + else: + name = _( + "Automatic Transfer (%(percent)s%% from account %(origin_account)s)", + percent=self.percent, + origin_account=origin_account.code, + ) + return { + 'name': name, + 'account_id': self.account_id.id, + 'date_maturity': write_date, + 'debit' if is_debit else 'credit': amount + } + + @api.depends('analytic_account_ids', 'partner_ids') + def _compute_percent_is_readonly(self): + for record in self: + record.percent_is_readonly = record.analytic_account_ids or record.partner_ids diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/security/account_auto_transfer_security.xml b/dev_odex30_accounting/odex30_account_auto_transfer/security/account_auto_transfer_security.xml new file mode 100644 index 0000000..21ec454 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/security/account_auto_transfer_security.xml @@ -0,0 +1,11 @@ + + + + + Account Automatic Transfer + + + [('company_id', 'in', company_ids)] + + + diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/security/ir.model.access.csv b/dev_odex30_accounting/odex30_account_auto_transfer/security/ir.model.access.csv new file mode 100644 index 0000000..f214369 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/security/ir.model.access.csv @@ -0,0 +1,7 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_transfer_model,access_account_transfer_model,odex30_account_auto_transfer.model_account_transfer_model,account.group_account_readonly,1,0,0,0 +access_account_transfer_model_manager,access_account_transfer_model_manager,odex30_account_auto_transfer.model_account_transfer_model,account.group_account_manager,1,1,1,1 +access_account_transfer_model_invoicing_payment,access_account_transfer_model_invoicing_payment,odex30_account_auto_transfer.model_account_transfer_model,account.group_account_invoice,1,0,1,0 +access_account_transfer_model_line,access_account_transfer_model_line,odex30_account_auto_transfer.model_account_transfer_model_line,account.group_account_readonly,1,0,0,0 +access_account_transfer_model_line_manager,access_account_transfer_model_line_manager,odex30_account_auto_transfer.model_account_transfer_model_line,account.group_account_manager,1,1,1,1 +access_account_transfer_model_line_invoicing_payment,access_account_transfer_model_line_invoicing_payment,odex30_account_auto_transfer.model_account_transfer_model_line,account.group_account_invoice,1,0,1,0 diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/static/description/icon.png b/dev_odex30_accounting/odex30_account_auto_transfer/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a058ecb05bde7a36fd3b1f850c26be4bd1f470c1 GIT binary patch literal 1277 zcmVTaK~#7F?c7mM zTV)sr@c(;y#>|L@Wfx9kV!LEssNl*c5F8lqbRR&AUx0NnF)?v#U542(GVayErO_;S zWik`$C!l6VFQq0T+!&h}Hb+nU`o4z_OGar=+jGwQ_WXZ0un`F5;eF2Ye@-btL_|bH zL_|bHL_|b1+ypEn3rk~-k=ne3$f#Oi8Ds=4pm*21hiA?T(U zn!r?j#9QCHaq9vsVq-yq$T&i5*wn&oY*`XL5CV796m~_muqq5T>?h=al$cX3Y(q_H zX&5Xq1!>CYqUo5b-Jx@q01JXSU@}yYPJzLf>;z;*AA;*X#-LoK_MVjteknTj5 z?s*LfF4T0-6B1mg>7E7YO=#(!EvrvLqU_Y%OM_}*enG~{rLj}4H!p?A2`SSs*%#j& z`{9?}lX&x~QRGL@AVQn!M_F_~`d}4(5`HmGcqO&RvE#`A9SZW;E2=PGpMC+)IMH=w z6(pBbko=^dAnBYMY0O(wi~xS|9^uOeex-{<`#JiA^gS8Su`(is^=>nZKlVO% z|K5ra;yu`)%PC9K5AOG8&%+=c*Dn4{xIHnOQ*Vl(uB|BB!8ozkCA?2KuvH}W| zpIKTj_-*$JI}@`jvR|K|R}fcGo*u>U zl9irr7Hq#ZbGzYr=VEDL=U>E-Qa?_)+VkC;W@edGndLU3JT0%j1e_VekdXqi?A9JG z4`gaOd;eZeeW9x=;b#z)jbGIWwFUgu{^neB$};_WS5YBx)vfI=i$b9~urXGzT^!fF ztKQAR98yh)Rz0(3VBf56Vd}w8Vt+}=DXd2W|LxJ4MM`mrnWZMEjf^OGPq)_(8JnO|pe`7THMnI7l{kVbn&XGrGR{ zrFUWAXxvsTp-GR%!jo)aM~E%OZe?eG@<(H!1UeAwTEQQU$7iO&7IwghJrC3U|BP9@ zG2QPoY7@$IZ|EO=COO?3d#@m=>E7s@H%UzQ#@|g#TDrI9_GVJjy;b*{gQj~MpOp054~OM{wmDs7oTZK_bbiJqG}{`fr<~j-8ZV)cZ`1F neIgug literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/static/description/icon.svg b/dev_odex30_accounting/odex30_account_auto_transfer/static/description/icon.svg new file mode 100644 index 0000000..92b815f --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/static/description/icon.svg @@ -0,0 +1 @@ + diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/tests/__init__.py b/dev_odex30_accounting/odex30_account_auto_transfer/tests/__init__.py new file mode 100644 index 0000000..7bb7698 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/tests/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from . import test_transfer_model +from . import test_transfer_model_line diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/tests/account_auto_transfer_test_classes.py b/dev_odex30_accounting/odex30_account_auto_transfer/tests/account_auto_transfer_test_classes.py new file mode 100644 index 0000000..c6d94fd --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/tests/account_auto_transfer_test_classes.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- +from datetime import datetime +from uuid import uuid4 +from odoo.tests import common + +from odoo.addons.account.tests.common import AccountTestInvoicingCommon + + +class AccountAutoTransferTestCase(AccountTestInvoicingCommon): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.journal = cls.env['account.journal'].create({'type': 'bank', 'name': 'bank', 'code': 'BANK'}) + cls.transfer_model = cls.env['account.transfer.model'].create({ + 'name': 'Test Transfer', + 'date_start': '2019-06-01', + 'frequency': 'month', + 'journal_id': cls.journal.id + }) + cls.analytic_plan = cls.env['account.analytic.plan'].create({ + 'name': 'A', + }) + + cls.master_account_index = 0 + cls.slave_account_index = 1 + cls.origin_accounts, cls.destination_accounts = cls._create_accounts(cls) + + def _assign_origin_accounts(self): + self.transfer_model.write({ + 'account_ids': [(6, 0, self.origin_accounts.ids)] + }) + + def _create_accounts(self, amount_of_master_accounts=2, amount_of_slave_accounts=4): + master_ids = self.env['account.account'] + + for i in range(amount_of_master_accounts): + self.master_account_index += 1 + master_ids += self.env['account.account'].create({ + 'name': 'MASTER %s' % self.master_account_index, + 'code': 'MA00%s' % self.master_account_index, + 'account_type': 'asset_receivable', + 'reconcile': True + }) + + slave_ids = self.env['account.account'] + for i in range(amount_of_slave_accounts): + self.slave_account_index += 1 + slave_ids += self.env['account.account'].create({ + 'name': 'SLAVE %s' % self.slave_account_index, + 'code': 'SL000%s' % self.slave_account_index, + 'account_type': 'asset_receivable', + 'reconcile': True + }) + return master_ids, slave_ids + + def _create_analytic_account(self, code='ANAL01'): + return self.env['account.analytic.account'].create({'name': code, 'code': code, 'plan_id': self.analytic_plan.id}) + + def _create_partner(self, name="partner01"): + return self.env['res.partner'].create({'name': name}) + + def _create_basic_move(self, cred_account=None, deb_account=None, amount=0, date_str='2019-02-01', + partner_id=False, name=False, cred_analytic=False, deb_analytic=False, + transfer_model_id=False, journal_id=False, posted=True): + move_vals = { + 'date': date_str, + 'transfer_model_id': transfer_model_id, + 'line_ids': [ + (0, 0, { + 'account_id': cred_account or self.origin_accounts[0].id, + 'credit': amount, + 'analytic_distribution': {cred_analytic: 100} if cred_analytic else {}, + 'partner_id': partner_id, + }), + (0, 0, { + 'account_id': deb_account or self.origin_accounts[1].id, + 'analytic_distribution': {deb_analytic: 100} if deb_analytic else {}, + 'debit': amount, + 'partner_id': partner_id, + }), + ] + } + if journal_id: + move_vals['journal_id'] = journal_id + move = self.env['account.move'].create(move_vals) + if posted: + move.action_post() + return move + + def _add_transfer_model_line(self, account_id: int = False, percent: float = 100.0, analytic_account_ids: list = False, partner_ids: list = False): + account_id = account_id or self.destination_accounts[0].id + return self.env['account.transfer.model.line'].create({ + 'percent': percent, + 'account_id': account_id, + 'transfer_model_id': self.transfer_model.id, + 'analytic_account_ids': analytic_account_ids and [(4, aa) for aa in analytic_account_ids], + 'partner_ids': partner_ids and [(4, p) for p in partner_ids], + }) diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/tests/test_transfer_model.py b/dev_odex30_accounting/odex30_account_auto_transfer/tests/test_transfer_model.py new file mode 100644 index 0000000..69645bc --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/tests/test_transfer_model.py @@ -0,0 +1,537 @@ +# -*- coding: utf-8 -*- +from datetime import datetime, timedelta +from unittest.mock import patch, call +from functools import reduce +from itertools import chain +from freezegun import freeze_time + +from dateutil.relativedelta import relativedelta +from odoo.addons.odex30_account_auto_transfer.tests.account_auto_transfer_test_classes import AccountAutoTransferTestCase + +from odoo import Command, fields +from odoo.models import UserError, ValidationError +from odoo.tests import tagged + +# ############################################################################ # +# FUNCTIONAL TESTS # +# ############################################################################ # +@tagged('post_install', '-at_install') +class TransferModelTestFunctionalCase(AccountAutoTransferTestCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + # Model with 4 lines of 20%, 20% is left in origin accounts + cls.functional_transfer = cls.env['account.transfer.model'].create({ + 'name': 'Test Functional Model', + 'date_start': '2019-01-01', + 'date_stop': datetime.today() + relativedelta(months=1), + 'journal_id': cls.journal.id, + 'account_ids': [(6, 0, cls.origin_accounts.ids)], + 'line_ids': [(0, 0, { + 'account_id': account.id, + 'percent': 20, + }) for account in cls.destination_accounts], + }) + neutral_account = cls.env['account.account'].create({ + 'name': 'Neutral Account', + 'code': 'NEUT', + 'account_type': 'income', + }) + cls.analytic_accounts = reduce(lambda x, y: x + y, (cls._create_analytic_account(cls, name) for name in ('ANA1', 'ANA2', 'ANA3'))) + cls.dates = ('2019-01-15', '2019-02-15') + # Create one line for each date... + for date in cls.dates: + # ...with each analytic account, and with no analytic account... + for an_account in chain(cls.analytic_accounts, [cls.env['account.analytic.account']]): + # ...in each origin account with a balance of 1000. + for account in cls.origin_accounts: + cls._create_basic_move( + cls, + deb_account=account.id, + deb_analytic=an_account.id, + cred_account=neutral_account.id, + amount=1000, + date_str=date, + ) + + def test_no_analytics(self): + # Balance is +8000 in each origin account + # 80% is transfered in 4 destination accounts in equal proprotions + self.functional_transfer.action_perform_auto_transfer() + # 1600 is left in each origin account + for account in self.origin_accounts: + self.assertEqual(sum(self.env['account.move.line'].search([('account_id', '=', account.id)]).mapped('balance')), 1600) + # 3200 has been transfered in each destination account + for account in self.destination_accounts: + self.assertEqual(sum(self.env['account.move.line'].search([('account_id', '=', account.id)]).mapped('balance')), 3200) + for date in self.dates: + # 2 move lines have been created in each account for each date + self.assertEqual(len(self.env['account.move.line'].search([('account_id', '=', account.id), ('date', '=', fields.Date.to_date(date) + relativedelta(day=31))])), 2) + + def test_analytics(self): + # Each line with analytic accounts is set to 100% + self.functional_transfer.line_ids[0].analytic_account_ids = self.analytic_accounts[0:2] + self.functional_transfer.line_ids[1].analytic_account_ids = self.analytic_accounts[2] + + self.functional_transfer.action_perform_auto_transfer() + # 1200 is left in each origin account (60% of 2 lines) + for account in self.origin_accounts: + self.assertEqual(sum(self.env['account.move.line'].search([('account_id', '=', account.id)]).mapped('balance')), 1200) + # 8000 has been transfered the first destination account (100% of 8 lines) + self.assertEqual(sum(self.env['account.move.line'].search([('account_id', '=', self.destination_accounts[0].id)]).mapped('balance')), 8000) + # 4000 has been transfered the first destination account (100% of 4 lines) + self.assertEqual(sum(self.env['account.move.line'].search([('account_id', '=', self.destination_accounts[1].id)]).mapped('balance')), 4000) + # 800 has been transfered in each of the last two destination account (20% of 4 lines) + self.assertEqual(sum(self.env['account.move.line'].search([('account_id', '=', self.destination_accounts[2].id)]).mapped('balance')), 800) + self.assertEqual(sum(self.env['account.move.line'].search([('account_id', '=', self.destination_accounts[3].id)]).mapped('balance')), 800) + + +# ############################################################################ # +# UNIT TESTS # +# ############################################################################ # +@tagged('post_install', '-at_install') +class TransferModelTestCase(AccountAutoTransferTestCase): + @patch('odoo.addons.odex30_account_auto_transfer.models.transfer_model.TransferModel.action_perform_auto_transfer') + def test_action_cron_auto_transfer(self, patched): + TransferModel = self.env['account.transfer.model'] + TransferModel.create({ + 'name': 'Test Cron Model', + 'date_start': '2019-01-01', + 'date_stop': datetime.today() + relativedelta(months=1), + 'journal_id': self.journal.id + }) + TransferModel.action_cron_auto_transfer() + patched.assert_called_once() + + @patch('odoo.addons.odex30_account_auto_transfer.models.transfer_model.TransferModel._create_or_update_move_for_period') + @freeze_time('2022-01-01') + def test_action_perform_auto_transfer(self, patched): + self.transfer_model.date_start = datetime.strftime(datetime.today() + relativedelta(day=1), "%Y-%m-%d") + # - CASE 1 : normal case, acting on current period + self.transfer_model.action_perform_auto_transfer() + patched.assert_not_called() # create_or_update method should not be called for self.transfer_model as no account_ids and no line_ids + + master_ids, slave_ids = self._create_accounts(1, 2) + self.transfer_model.write({'account_ids': [(6, 0, [master_ids.id])]}) + + self.transfer_model.action_perform_auto_transfer() + patched.assert_not_called() # create_or_update method should not be called for self.transfer_model as no line_ids + + self.transfer_model.write({'line_ids': [ + (0, 0, { + 'percent': 50.0, + 'account_id': slave_ids[0].id + }), + (0, 0, { + 'percent': 50.0, + 'account_id': slave_ids[1].id + }) + ]}) + + self.transfer_model.action_perform_auto_transfer() + patched.assert_called_once() # create_or_update method should be called for self.transfer_model + + # - CASE 2 : "old" case, acting on everything before now as nothing has been done yet + transfer_model = self.transfer_model.copy() + transfer_model.write({ + 'date_start': transfer_model.date_start + relativedelta(months=-12) + }) + initial_call_count = patched.call_count + transfer_model.action_perform_auto_transfer() + self.assertEqual(initial_call_count + 13, patched.call_count, '13 more calls should have been done') + + @patch('odoo.addons.odex30_account_auto_transfer.models.transfer_model.TransferModel._get_auto_transfer_move_line_values') + def test__create_or_update_move_for_period(self, patched_get_auto_transfer_move_line_values): + # PREPARATION + master_ids, slave_ids = self._create_accounts(2, 0) + next_move_date = self.transfer_model._get_next_move_date(self.transfer_model.date_start) + patched_get_auto_transfer_move_line_values.return_value = [ + { + 'account_id': master_ids[0].id, + 'date_maturity': next_move_date, + 'credit': 250.0, + }, + { + 'account_id': master_ids[1].id, + 'date_maturity': next_move_date, + 'debit': 250.0, + } + ] + + # There is no existing move, this is a brand new one + created_move = self.transfer_model._create_or_update_move_for_period(self.transfer_model.date_start, next_move_date) + self.assertEqual(len(created_move.line_ids), 2) + self.assertRecordValues(created_move, [{ + 'date': next_move_date, + 'journal_id': self.transfer_model.journal_id.id, + 'transfer_model_id': self.transfer_model.id, + }]) + self.assertRecordValues(created_move.line_ids.filtered(lambda l: l.credit), [{ + 'account_id': master_ids[0].id, + 'date_maturity': next_move_date, + 'credit': 250.0, + }]) + self.assertRecordValues(created_move.line_ids.filtered(lambda l: l.debit), [{ + 'account_id': master_ids[1].id, + 'date_maturity': next_move_date, + 'debit': 250.0, + }]) + + patched_get_auto_transfer_move_line_values.return_value = [ + { + 'account_id': master_ids[0].id, + 'date_maturity': next_move_date, + 'credit': 78520.0, + }, + { + 'account_id': master_ids[1].id, + 'date_maturity': next_move_date, + 'debit': 78520.0, + } + ] + + # Update the existing move but don't create a new one + amount_of_moves = self.env['account.move'].search_count([]) + amount_of_move_lines = self.env['account.move.line'].search_count([]) + updated_move = self.transfer_model._create_or_update_move_for_period(self.transfer_model.date_start, next_move_date) + self.assertEqual(amount_of_moves, self.env['account.move'].search_count([]), 'No move have been created') + self.assertEqual(amount_of_move_lines, self.env['account.move.line'].search_count([]), + 'No move line have been created (in fact yes but the old ones have been deleted)') + self.assertEqual(updated_move, created_move, 'Existing move has been updated') + self.assertRecordValues(updated_move.line_ids.filtered(lambda l: l.credit), [{ + 'account_id': master_ids[0].id, + 'date_maturity': next_move_date, + 'credit': 78520.0, + }]) + self.assertRecordValues(updated_move.line_ids.filtered(lambda l: l.debit), [{ + 'account_id': master_ids[1].id, + 'date_maturity': next_move_date, + 'debit': 78520.0, + }]) + + def test__get_move_for_period(self): + # 2019-06-30 --> None as no move generated + date_to_test = datetime.strptime('2019-06-30', '%Y-%m-%d').date() + move_for_period = self.transfer_model._get_move_for_period(date_to_test) + self.assertIsNone(move_for_period, 'No move is generated yet') + + # Generate a move + move_date = self.transfer_model._get_next_move_date(self.transfer_model.date_start) + already_generated_move = self.env['account.move'].create({ + 'date': move_date, + 'journal_id': self.journal.id, + 'transfer_model_id': self.transfer_model.id + }) + # 2019-06-30 --> None as generated move is generated for 01/07 + move_for_period = self.transfer_model._get_move_for_period(date_to_test) + self.assertEqual(move_for_period, already_generated_move, 'Should be equal to the already generated move') + + # 2019-07-01 --> The generated move + date_to_test += relativedelta(days=1) + move_for_period = self.transfer_model._get_move_for_period(date_to_test) + self.assertIsNone(move_for_period, 'The generated move is for the next period') + + # 2019-07-02 --> None as generated move is generated for 01/07 + date_to_test += relativedelta(days=1) + move_for_period = self.transfer_model._get_move_for_period(date_to_test) + self.assertIsNone(move_for_period, 'No move is generated yet for the next period') + + def test__determine_start_date(self): + start_date = self.transfer_model._determine_start_date() + self.assertEqual(start_date, self.transfer_model.date_start, 'No moves generated yet, start date should be the start date of the transfer model') + + move = self._create_basic_move(date_str='2019-07-01', journal_id=self.journal.id, transfer_model_id=self.transfer_model.id, posted=False) + start_date = self.transfer_model._determine_start_date() + self.assertEqual(start_date, self.transfer_model.date_start, 'A move generated but not posted, start date should be the start date of the transfer model') + + move.action_post() + start_date = self.transfer_model._determine_start_date() + self.assertEqual(start_date, move.date + relativedelta(days=1), 'A move posted, start date should be the day after that move') + + second_move = self._create_basic_move(date_str='2019-08-01', journal_id=self.journal.id, transfer_model_id=self.transfer_model.id, posted=False) + start_date = self.transfer_model._determine_start_date() + self.assertEqual(start_date, move.date + relativedelta(days=1), 'Two moves generated, start date should be the day after the last posted one') + + second_move.action_post() + random_move = self._create_basic_move(date_str='2019-08-01', journal_id=self.journal.id) + start_date = self.transfer_model._determine_start_date() + self.assertEqual(start_date, second_move.date + relativedelta(days=1), 'Random move generated not linked to transfer model, start date should be the day after the last one linked to it') + + def test__get_next_move_date(self): + experimentations = { + 'month': [ + # date, expected date + (self.transfer_model.date_start, '2019-06-30'), + (fields.Date.to_date('2019-01-29'), '2019-02-27'), + (fields.Date.to_date('2019-01-30'), '2019-02-27'), + (fields.Date.to_date('2019-01-31'), '2019-02-27'), + (fields.Date.to_date('2019-02-28'), '2019-03-27'), + (fields.Date.to_date('2019-12-31'), '2020-01-30'), + ], + 'quarter': [ + (self.transfer_model.date_start, '2019-08-31'), + (fields.Date.to_date('2019-01-31'), '2019-04-29'), + (fields.Date.to_date('2019-02-28'), '2019-05-27'), + (fields.Date.to_date('2019-12-31'), '2020-03-30'), + ], + 'year': [ + (self.transfer_model.date_start, '2020-05-31'), + (fields.Date.to_date('2019-01-31'), '2020-01-30'), + (fields.Date.to_date('2019-02-28'), '2020-02-27'), + (fields.Date.to_date('2019-12-31'), '2020-12-30'), + ] + } + + for frequency in experimentations: + self.transfer_model.write({'frequency': frequency}) + for start_date, expected_date_str in experimentations[frequency]: + next_date = self.transfer_model._get_next_move_date(start_date) + self.assertEqual(next_date, fields.Date.to_date(expected_date_str), + 'Next date from %s should be %s' % (str(next_date), expected_date_str)) + + @patch('odoo.addons.odex30_account_auto_transfer.models.transfer_model.TransferModel._get_non_analytic_transfer_values') + def test__get_non_filtered_auto_transfer_move_line_values(self, patched_get_values): + start_date = fields.Date.to_date('2019-01-01') + self.transfer_model.write({'account_ids': [(6, 0, [ma.id for ma in self.origin_accounts])], }) + end_date = fields.Date.to_date('2019-12-31') + + move = self.env['account.move'].create({ + 'move_type': 'entry', + 'date': '2019-12-01', + 'journal_id': self.company_data['default_journal_misc'].id, + 'line_ids': [ + (0, 0, { + 'debit': 4242.42, + 'credit': 0, + 'account_id': self.origin_accounts[0].id, + }), + (0, 0, { + 'debit': 8342.58, + 'credit': 0, + 'account_id': self.company_data.get('default_account_revenue').id, + }), + (0, 0, { + 'debit': 0, + 'credit': 0, + 'account_id': self.destination_accounts[0].id, + }), + (0, 0, { + 'debit': 0, + 'credit': 12585.0, + 'account_id': self.origin_accounts[1].id, + }), + ] + }) + move.action_post() + amount_left = 10.0 + patched_get_values.return_value = [{ + 'name': "YO", + 'account_id': 1, + 'date_maturity': start_date, + 'debit': 123.45 + }], amount_left + + exp = [{ + 'name': 'YO', + 'account_id': 1, + 'date_maturity': start_date, + 'debit': 123.45 + }, { + 'name': 'Automatic Transfer (-%s%%)' % self.transfer_model.total_percent, + 'account_id': self.origin_accounts[0].id, + 'date_maturity': end_date, + 'credit': 4242.42 - amount_left + }, { + 'name': 'YO', + 'account_id': 1, + 'date_maturity': start_date, + 'debit': 123.45 + }, { + 'name': 'Automatic Transfer (-%s%%)' % self.transfer_model.total_percent, + 'account_id': self.origin_accounts[1].id, + 'date_maturity': end_date, + 'debit': 12585.0 - amount_left + }] + res = self.transfer_model._get_non_filtered_auto_transfer_move_line_values([], start_date, end_date) + self.assertEqual(len(res), 4) + self.assertListEqual(exp, res) + + @patch( + 'odoo.addons.odex30_account_auto_transfer' + '.models.transfer_model.TransferModelLine._get_destination_account_transfer_move_line_values') + def test__get_non_analytic_transfer_values(self, patched): + # Just need a transfer model line + percents = [45, 45] + self.transfer_model.write({ + 'account_ids': [(6, 0, [ma.id for ma in self.origin_accounts])], + 'line_ids': [ + (0, 0, { + 'percent': percents[0], + 'account_id': self.destination_accounts[0].id + }), + (0, 0, { + 'percent': percents[1], + 'account_id': self.destination_accounts[1].id + }) + ] + }) + account = self.origin_accounts[0] + write_date = fields.Date.to_date('2019-01-01') + lines = self.transfer_model.line_ids + amount_of_line = len(lines) + amount = 4242.0 + is_debit = False + patched.return_value = { + 'name': "YO", + 'account_id': account.id, + 'date_maturity': write_date, + 'debit' if is_debit else 'credit': amount + } + expected_result_list = [patched.return_value] * 2 + expected_result_amount = amount * ((100.0 - sum(percents)) / 100.0) + + res = self.transfer_model._get_non_analytic_transfer_values(account, lines, write_date, amount, is_debit) + self.assertListEqual(res[0], expected_result_list) + self.assertAlmostEqual(res[1], expected_result_amount) + self.assertEqual(patched.call_count, amount_of_line) + + # need to round amount to avoid failing float comparison (as magic mock uses "==" to compare args) + exp_calls = [call(account, round(amount * (line.percent / 100.0), 1), is_debit, write_date) for line in lines] + patched.assert_has_calls(exp_calls) + + # Try now with 100% repartition + lines[0].write({'percent': 55.0}) + res = self.transfer_model._get_non_analytic_transfer_values(account, lines, write_date, amount, is_debit) + self.assertAlmostEqual(res[1], 0.0) + + # TEST CONSTRAINTS + def test__check_line_ids_percents(self): + with self.assertRaises(ValidationError): + transfer_model_lines = [] + for i, percent in enumerate((50.0, 50.01)): + transfer_model_lines.append((0, 0, { + 'percent': percent, + 'account_id': self.destination_accounts[i].id + })) + self.transfer_model.write({ + 'account_ids': [(6, 0, [ma.id for ma in self.origin_accounts])], + 'line_ids': transfer_model_lines + }) + + def test_unlink_of_transfer_with_no_moves(self): + """ Deletion of an automatic transfer that has no move should not raise an error. """ + + self.transfer_model.write({ + 'account_ids': [Command.link(self.origin_accounts[0].id)], + 'line_ids': [ + Command.create({ + 'percent': 100, + 'account_id': self.destination_accounts[0].id + }) + ] + }) + self.transfer_model.action_activate() + + self.assertEqual(self.transfer_model.move_ids_count, 0) + self.transfer_model.unlink() + + def test_error_unlink_of_transfer_with_moves(self): + """ Deletion of an automatic transfer that has posted/draft moves should raise an error. """ + + self.transfer_model.write({ + 'date_start': datetime.today() - relativedelta(day=1), + 'frequency': 'year', + 'account_ids': [Command.link(self.company_data['default_account_revenue'].id)], + 'line_ids': [ + Command.create({ + 'percent': 100, + 'account_id': self.destination_accounts[0].id + }) + ] + }) + self.transfer_model.action_activate() + + # Add a transaction on the journal so that the move is not empty + self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': self.partner_a.id, + 'invoice_date': datetime.today(), + 'invoice_line_ids': [ + Command.create({ + 'name': 'line1', + 'account_id': self.company_data['default_account_revenue'].id, + 'price_unit': 1000.0, + }), + ] + }).action_post() + + # Generate draft moves + self.transfer_model.action_perform_auto_transfer() + + error_message = "You cannot delete an automatic transfer that has draft moves*" + with self.assertRaisesRegex(UserError, error_message): + self.transfer_model.unlink() + + # Post one of the moves + self.transfer_model.move_ids[0].action_post() + + error_message = "You cannot delete an automatic transfer that has posted moves*" + with self.assertRaisesRegex(UserError, error_message): + self.transfer_model.unlink() + + def test_disable_transfer_when_archived(self): + """ An automatic transfer in progress should be disabled when archived. """ + + self.transfer_model.action_activate() + self.assertEqual(self.transfer_model.state, 'in_progress') + + self.transfer_model.action_archive() + self.assertEqual(self.transfer_model.state, 'disabled') + + @freeze_time('2022-01-01') + def test_compute_transfer_lines_100_percent_transfer(self): + """ Transfer 100% of the source account in separate destinations. """ + self.transfer_model.date_start = datetime.strftime(datetime.today() + relativedelta(day=1), "%Y-%m-%d") + + _, slave_ids = self._create_accounts(0, 3) + self.transfer_model.write({ + 'account_ids': [Command.link(self.company_data['default_account_revenue'].id)], + 'line_ids': [ + Command.create({ + 'percent': 15, + 'account_id': slave_ids[0].id + }), + Command.create({ + 'percent': 42.50, + 'account_id': slave_ids[1].id + }), + Command.create({ + 'percent': 42.50, + 'account_id': slave_ids[2].id + }), + ] + }) + self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': self.partner_a.id, + 'invoice_date': datetime.today(), + 'invoice_line_ids': [ + Command.create({ + 'name': 'line_xyz', + 'account_id': self.company_data['default_account_revenue'].id, + 'price_unit': 410.34, + }), + ] + }).action_post() + self.transfer_model.action_activate() + self.transfer_model.action_perform_auto_transfer() + lines = self.transfer_model.move_ids.line_ids + # 100% of the total amount + self.assertAlmostEqual(lines.filtered(lambda l: l.account_id == self.company_data['default_account_revenue']).debit, 410.34) + # 15% of the total amount + self.assertAlmostEqual(lines.filtered(lambda l: l.account_id == slave_ids[0]).credit, 61.55) + # 42.50% of the total amount + self.assertAlmostEqual(lines.filtered(lambda l: l.account_id == slave_ids[1]).credit, 174.39) + # the remaining amount of the total amount (42.50%) + self.assertAlmostEqual(lines.filtered(lambda l: l.account_id == slave_ids[2]).credit, 174.4) diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/tests/test_transfer_model_line.py b/dev_odex30_accounting/odex30_account_auto_transfer/tests/test_transfer_model_line.py new file mode 100644 index 0000000..d4a340b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/tests/test_transfer_model_line.py @@ -0,0 +1,288 @@ +# -*- coding: utf-8 -*- + +from unittest.mock import patch + +from odoo.addons.odex30_account_auto_transfer.tests.account_auto_transfer_test_classes import AccountAutoTransferTestCase + +from odoo import fields +from odoo.tests import tagged + +# ############################################################################ # +# UNIT TESTS # +# ############################################################################ # +@tagged('post_install', '-at_install') +class MoveModelLineTestCase(AccountAutoTransferTestCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls._assign_origin_accounts(cls) + + def test__get_transfer_move_lines_values_same_aaccounts(self): + amounts = [4242.42, 1234.56] + aaccounts = [self._create_analytic_account('ANAL0' + str(i)) for i in range(2)] + self._create_basic_move( + cred_account=self.destination_accounts[0].id, + deb_account=self.origin_accounts[0].id, + amount=amounts[0], + deb_analytic=aaccounts[0].id + ) + self._create_basic_move( + cred_account=self.destination_accounts[1].id, + deb_account=self.origin_accounts[0].id, + amount=amounts[1], + deb_analytic=aaccounts[1].id + ) + transfer_model_line_1 = self._add_transfer_model_line(self.destination_accounts[0].id, + analytic_account_ids=[aaccounts[0].id, aaccounts[1].id]) + transfer_model_line_2 = self._add_transfer_model_line(self.destination_accounts[1].id, + analytic_account_ids=[aaccounts[0].id]) + + transfer_models_lines = transfer_model_line_1 + transfer_model_line_2 + args = [fields.Date.to_date('2019-01-01'), fields.Date.to_date('2019-12-19')] + res = transfer_models_lines._get_transfer_move_lines_values(*args) + exp = [{ + 'name': 'Automatic Transfer (from account MA001 with analytic account(s): ANAL00, ANAL01)', + 'account_id': self.destination_accounts[0].id, + 'date_maturity': args[1], + 'debit': sum(amounts), + }, { + 'name': 'Automatic Transfer (entries with analytic account(s): ANAL00, ANAL01)', + 'account_id': self.origin_accounts[0].id, + 'date_maturity': args[1], + 'credit': sum(amounts), + }] + self.assertListEqual(exp, res, + 'Only first transfer model line should be handled, second should get 0 and thus not be added') + + def test__get_transfer_move_lines_values(self): + amounts = [4242.0, 1234.56] + aaccounts = [self._create_analytic_account('ANAL0' + str(i)) for i in range(3)] + self._create_basic_move( + cred_account=self.destination_accounts[0].id, + deb_account=self.origin_accounts[0].id, + amount=amounts[0], + deb_analytic=aaccounts[0].id + ) + self._create_basic_move( + cred_account=self.destination_accounts[1].id, + deb_account=self.origin_accounts[0].id, + amount=amounts[1], + deb_analytic=aaccounts[2].id + ) + transfer_model_line_1 = self._add_transfer_model_line(self.destination_accounts[0].id, + analytic_account_ids=[aaccounts[0].id, aaccounts[1].id]) + transfer_model_line_2 = self._add_transfer_model_line(self.destination_accounts[1].id, + analytic_account_ids=[aaccounts[2].id]) + + transfer_models_lines = transfer_model_line_1 + transfer_model_line_2 + args = [fields.Date.to_date('2019-01-01'), fields.Date.to_date('2019-12-19')] + res = transfer_models_lines._get_transfer_move_lines_values(*args) + exp = [ + { + 'name': 'Automatic Transfer (from account MA001 with analytic account(s): ANAL00, ANAL01)', + 'account_id': self.destination_accounts[0].id, + 'date_maturity': args[1], + 'debit': amounts[0], + }, + { + 'name': 'Automatic Transfer (entries with analytic account(s): ANAL00, ANAL01)', + 'account_id': self.origin_accounts[0].id, + 'date_maturity': args[1], + 'credit': amounts[0], + }, + { + 'name': 'Automatic Transfer (from account MA001 with analytic account(s): ANAL02)', + 'account_id': self.destination_accounts[1].id, + 'date_maturity': args[1], + 'debit': amounts[1], + }, + { + 'name': 'Automatic Transfer (entries with analytic account(s): ANAL02)', + 'account_id': self.origin_accounts[0].id, + 'date_maturity': args[1], + 'credit': amounts[1], + } + ] + self.assertListEqual(exp, res) + + @patch('odoo.addons.odex30_account_auto_transfer.models.transfer_model.TransferModel._get_move_lines_base_domain') + def test__get_move_lines_domain(self, patched): + return_val = [('bla', '=', 42)] + # we need to copy return val as there are edge effects due to mocking + # return_value is modified by the function call) + patched.return_value = return_val[:] + args = [fields.Date.to_date('2019-01-01'), fields.Date.to_date('2019-12-19')] + aaccount_1 = self._create_analytic_account('ANAL01') + aaccount_2 = self._create_analytic_account('ANAL02') + percent = 42.42 + analytic_transfer_model_line = self._add_transfer_model_line(self.destination_accounts[0].id, + analytic_account_ids=[aaccount_1.id, aaccount_2.id]) + percent_transfer_model_line = self._add_transfer_model_line(self.destination_accounts[1].id, percent=percent) + + anal_res = analytic_transfer_model_line._get_move_lines_domain(*args) + anal_expected = return_val + patched.assert_called_once_with(*args) + self.assertListEqual(anal_res, anal_expected) + patched.reset_mock() + + perc_res = percent_transfer_model_line._get_move_lines_domain(*args) + patched.assert_called_once_with(*args) + self.assertListEqual(perc_res, patched.return_value) + + def test__get_origin_account_transfer_move_line_values(self): + percent = 92.42 + transfer_model_line = self._add_transfer_model_line(self.destination_accounts[0].id, percent=percent) + origin_account = self.origin_accounts[0] + amount = 4200.42 + is_debit = True + write_date = fields.Date.to_date('2019-12-19') + params = [origin_account, amount, is_debit, write_date] + result = transfer_model_line._get_origin_account_transfer_move_line_values(*params) + expected = { + 'name': 'Automatic Transfer (to account %s)' % self.destination_accounts[0].code, + 'account_id': origin_account.id, + 'date_maturity': write_date, + 'credit' if is_debit else 'debit': amount + } + self.assertDictEqual(result, expected) + + def test__get_destination_account_transfer_move_line_values(self): + aaccount_1 = self._create_analytic_account('ANAL01') + aaccount_2 = self._create_analytic_account('ANAL02') + percent = 42.42 + analytic_transfer_model_line = self._add_transfer_model_line(self.destination_accounts[0].id, + analytic_account_ids=[aaccount_1.id, aaccount_2.id]) + percent_transfer_model_line = self._add_transfer_model_line(self.destination_accounts[1].id, percent=percent) + origin_account = self.origin_accounts[0] + amount = 4200 + is_debit = True + write_date = fields.Date.to_date('2019-12-19') + params = [origin_account, amount, is_debit, write_date] + anal_result = analytic_transfer_model_line._get_destination_account_transfer_move_line_values(*params) + aaccount_names = ', '.join([aac.name for aac in [aaccount_1, aaccount_2]]) + anal_expected_result = { + 'name': 'Automatic Transfer (from account %s with analytic account(s): %s)' % ( + origin_account.code, aaccount_names), + 'account_id': self.destination_accounts[0].id, + 'date_maturity': write_date, + 'debit' if is_debit else 'credit': amount + } + self.assertDictEqual(anal_result, anal_expected_result) + percent_result = percent_transfer_model_line._get_destination_account_transfer_move_line_values(*params) + percent_expected_result = { + 'name': 'Automatic Transfer (%s%% from account %s)' % (percent, self.origin_accounts[0].code), + 'account_id': self.destination_accounts[1].id, + 'date_maturity': write_date, + 'debit' if is_debit else 'credit': amount + } + self.assertDictEqual(percent_result, percent_expected_result) + + def test__get_transfer_move_lines_values_same_partner_ids(self): + """ + Make sure we only process the account moves once. + Here the second line references a partner already handled in the first one. + The second transfer should thus not be apply on the account lines already handled by the first transfer. + """ + amounts = [4242.42, 1234.56] + partner_ids = [self._create_partner('partner' + str(i))for i in range(2)] + self._create_basic_move( + cred_account=self.destination_accounts[0].id, + deb_account=self.origin_accounts[0].id, + amount=amounts[0], + partner_id=partner_ids[0].id, + date_str='2019-02-01' + ) + self._create_basic_move( + cred_account=self.destination_accounts[1].id, + deb_account=self.origin_accounts[0].id, + amount=amounts[1], + partner_id=partner_ids[1].id, + date_str='2019-02-01' + ) + self._create_basic_move( + cred_account=self.destination_accounts[0].id, + deb_account=self.origin_accounts[0].id, + amount=amounts[0], + date_str='2019-02-01' + ) + transfer_model_line_1 = self._add_transfer_model_line(self.destination_accounts[0].id, + partner_ids=[partner_ids[0].id, partner_ids[1].id]) + transfer_model_line_2 = self._add_transfer_model_line(self.destination_accounts[1].id, + partner_ids=[partner_ids[0].id]) + + transfer_models_lines = transfer_model_line_1 + transfer_model_line_2 + args = [fields.Date.to_date('2019-01-01'), fields.Date.to_date('2019-12-19')] + res = transfer_models_lines._get_transfer_move_lines_values(*args) + exp = [{ + 'name': 'Automatic Transfer (from account MA001 with partner(s): partner0, partner1)', + 'account_id': self.destination_accounts[0].id, + 'date_maturity': args[1], + 'debit': sum(amounts), + }, { + 'name': 'Automatic Transfer (entries with partner(s): partner0, partner1)', + 'account_id': self.origin_accounts[0].id, + 'date_maturity': args[1], + 'credit': sum(amounts), + }] + self.assertListEqual(exp, res, + 'Only first transfer model line should be handled, second should get 0 and thus not be added') + + def test__get_transfer_move_lines_values_partner(self): + """ + Create account moves and transfer, verify that the result of the auto transfer is correct. + """ + amounts = [4242.0, 1234.56] + aaccounts = [self._create_analytic_account('ANAL00')] + partner_ids = [self._create_partner('partner' + str(i))for i in range(2)] + self._create_basic_move( + cred_account=self.destination_accounts[2].id, + deb_account=self.origin_accounts[0].id, + amount=amounts[0], + partner_id=partner_ids[0].id, + date_str='2019-02-01' + ) + self._create_basic_move( + cred_account=self.destination_accounts[3].id, + deb_account=self.origin_accounts[0].id, + amount=amounts[1], + deb_analytic=aaccounts[0].id, + partner_id=partner_ids[1].id, + date_str='2019-02-01' + ) + transfer_model_line_1 = self._add_transfer_model_line(self.destination_accounts[3].id, + analytic_account_ids=[aaccounts[0].id], + partner_ids=[partner_ids[1].id]) + transfer_model_line_2 = self._add_transfer_model_line(self.destination_accounts[2].id, + partner_ids=[partner_ids[0].id]) + + transfer_models_lines = transfer_model_line_1 + transfer_model_line_2 + args = [fields.Date.to_date('2019-01-01'), fields.Date.to_date('2019-12-19')] + res = transfer_models_lines._get_transfer_move_lines_values(*args) + exp = [ + { + 'name': 'Automatic Transfer (from account MA001 with analytic account(s): ANAL00 and partner(s): partner1)', + 'account_id': self.destination_accounts[3].id, + 'date_maturity': args[1], + 'debit': amounts[1], + }, + { + 'name': 'Automatic Transfer (entries with analytic account(s): ANAL00 and partner(s): partner1)', + 'account_id': self.origin_accounts[0].id, + 'date_maturity': args[1], + 'credit': amounts[1], + }, + { + 'name': 'Automatic Transfer (from account MA001 with partner(s): partner0)', + 'account_id': self.destination_accounts[2].id, + 'date_maturity': args[1], + 'debit': amounts[0], + }, + { + 'name': 'Automatic Transfer (entries with partner(s): partner0)', + 'account_id': self.origin_accounts[0].id, + 'date_maturity': args[1], + 'credit': amounts[0], + }, + ] + self.assertListEqual(exp, res) diff --git a/dev_odex30_accounting/odex30_account_auto_transfer/views/transfer_model_views.xml b/dev_odex30_accounting/odex30_account_auto_transfer/views/transfer_model_views.xml new file mode 100644 index 0000000..de695e1 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_auto_transfer/views/transfer_model_views.xml @@ -0,0 +1,142 @@ + + + + + account.auto.transfer.search + account.move + + + + + + + + + + + + Automatic Transfers + account.transfer.model + list,form + + + + + Generated Entries + account.move + list,form + + + + + + + + + + + account.auto.transfer.model.list + account.transfer.model + + + + + + + + + + + + + account.auto.transfer.model.form + account.transfer.model + +
    +
    +
    + +
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + account.auto.transfer.model.search + account.transfer.model + + + + + + + + +
    diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import/__init__.py new file mode 100644 index 0000000..7749576 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/__init__.py @@ -0,0 +1,4 @@ +# -*- encoding: utf-8 -*- + +from . import models +from . import wizard diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/__manifest__.py b/dev_odex30_accounting/odex30_account_bank_statement_import/__manifest__.py new file mode 100644 index 0000000..f524d31 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/__manifest__.py @@ -0,0 +1,26 @@ +# -*- encoding: utf-8 -*- +{ + 'name': 'Account Bank Statement Import', + 'category': 'Odex30-Accounting/Odex30-Accounting', + 'version': '1.0', + 'depends': ['odex30_account_accountant', 'base_import'], + 'description': """Generic Wizard to Import Bank Statements. + +(This module does not include any type of import format.) + +OFX and QIF imports are available in Enterprise version.""", + 'data': [ + 'views/account_bank_statement_import_view.xml', + ], + 'demo': [ + 'demo/partner_bank.xml', + ], + 'installable': True, + 'auto_install': True, + 'assets': { + 'web.assets_backend': [ + 'odex30_account_bank_statement_import/static/src/**/*', + ], + }, + +} diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..580c2ae6fc5b8023242493a00b275a04c4f98ce1 GIT binary patch literal 336 zcmZ3^%ge<81lK2oX1W6D#~=<2FhLog<$#Ro3@HpLj5!Rsj8Tk?AT|?_%@oB1WHSdd zXtKOy1S-;Gyv3HApOTtW3}TgMRwWjt_-QiVVklw;$`-KziIohWfh5DPcKwX}+*JL< zoa~Ims-mn+{ea5kjKrecfTH}Y)Z~(4eV{QF#s)wtKVR3-LJz_Miy9fkCnhK7m*$mZ z=B4YWq?W}))FO*Q6~rec=4Hnhmn4>?=BDPA#AoIflIY~;;;d_ rxHKo#u80%pE|4#Z4S~c5W=2NF4{QvKq8AuMkkJiPE?laJ9jFTc-o0K; literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/demo/partner_bank.xml b/dev_odex30_accounting/odex30_account_bank_statement_import/demo/partner_bank.xml new file mode 100644 index 0000000..ab15c79 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/demo/partner_bank.xml @@ -0,0 +1,30 @@ + + + + + + BE68539007547034 + + + + + + 00987654322 + + + + + + 10987654320 + + + + + + 10987654322 + + + + + + diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/i18n/ar.po b/dev_odex30_accounting/odex30_account_bank_statement_import/i18n/ar.po new file mode 100644 index 0000000..65b1fa4 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/i18n/ar.po @@ -0,0 +1,201 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_bank_statement_import +# +# Translators: +# Wil Odoo, 2024 +# Malaz Abuidris , 2025 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:43+0000\n" +"Last-Translator: Malaz Abuidris , 2025\n" +"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "%d transactions had already been imported and were ignored." +msgstr "تم استيراد %d معاملات بالفعل وتجاهلها. " + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "1 transaction had already been imported and was ignored." +msgstr "تم تجاهل 1 معاملة سبق استيرادها بالفعل." + +#. module: odex30_account_bank_statement_import +#: model:ir.model.constraint,message:odex30_account_bank_statement_import.constraint_account_bank_statement_line_unique_import_id +msgid "A bank account transactions can be imported only once!" +msgstr "يمكن استيراد معاملات الحساب البنكي مرة واحدة فقط! " + +#. module: odex30_account_bank_statement_import +#: model:ir.model,name:odex30_account_bank_statement_import.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "بند كشف الحساب البنكي" + +#. module: odex30_account_bank_statement_import +#: model:ir.model,name:odex30_account_bank_statement_import.model_account_setup_bank_manual_config +msgid "Bank setup manual config" +msgstr "التهيئة اليدوية لإعدادات البنك " + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "" +"Cannot find in which journal import this statement. Please manually select a" +" journal." +msgstr "" +"لقد تعذر إيجاد دفتر اليومية الذي يتم توريد كشف الحساب المحدد إليه. الرجاء " +"اختيار دفتر اليومية يدوياً. " + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_bank_statement.py:0 +msgid "Click \"New\" or upload a %s." +msgstr "اضغط على\"جديد\" أو قم برفع %s. " + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "" +"Could not make sense of the given file.\n" +"Did you install the module to support this type of file?" +msgstr "" +" تعذر فهم طبيعة الملف المحدد.\n" +"هل قمت بتثبيت التطبيق المناسب لدعم هذا النوع من الملفات؟ " + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "Go to Apps" +msgstr "الذهاب إلى التطبيقات " + +#. module: odex30_account_bank_statement_import +#: model_terms:ir.ui.view,arch_db:odex30_account_bank_statement_import.journal_dashboard_view_inherit +msgid "Import File" +msgstr "استيراد ملف" + +#. module: odex30_account_bank_statement_import +#: model:ir.model.fields,field_description:odex30_account_bank_statement_import.field_account_bank_statement_line__unique_import_id +msgid "Import ID" +msgstr "معرف الاستيراد" + +#. module: odex30_account_bank_statement_import +#. odoo-javascript +#: code:addons/odex30_account_bank_statement_import/static/src/account_bank_statement_import_model.js:0 +msgid "Import Template for Bank Statements" +msgstr "استيراد قالب لكشوفات الحسابات البنكية " + +#. module: odex30_account_bank_statement_import +#: model:ir.model,name:odex30_account_bank_statement_import.model_account_journal +msgid "Journal" +msgstr "دفتر اليومية" + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "Manual (or import %(import_formats)s)" +msgstr "يدوي (أو استيراد %(import_formats)s) " + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "No attachment was provided" +msgstr "لم يتم توفير مرفق" + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "No currency found matching '%s'." +msgstr "لم يمكن العثور على أي عملة تطابق '%s'." + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_bank_statement.py:0 +msgid "No transactions matching your filters were found." +msgstr "لم يتم العثور على أي معاملات تطابق عوامل التصفية الخاصة بك. " + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_bank_statement.py:0 +msgid "Nothing to do here!" +msgstr "لا شيء لتفعله هنا! " + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "" +"The account of this statement (%(account)s) is not the same as the journal " +"(%(journal)s)." +msgstr "" +"الحساب في كشف الحساب البنكي (%(account)s) مختلف عن حساب دفتر اليومية " +"(%(journal)s). " + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "" +"The currency of the bank statement (%(code)s) is not the same as the " +"currency of the journal (%(journal)s)." +msgstr "" +"العملة في كشف الحساب البنكي (%(code)s) مختلفة عن العملة في دفتر اليومية " +"(%(journal)s). " + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "The following files could not be imported:\n" +msgstr "تعذر استيراد الملفات التالية: \n" + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "" +"This file doesn't contain any statement for account %s.\n" +"If it contains transactions for more than one account, it must be imported on each of them." +msgstr "" +"لا يحتوي هذا الملف على أي كشف للحساب %s.\n" +"إذا كان يحتوي على معاملات لأكثر من حساب، فيجب استيراده في كل منها. " + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "" +"This file doesn't contain any transaction for account %s.\n" +"If it contains transactions for more than one account, it must be imported on each of them." +msgstr "" +"لا يحتوي هذا الملف على أي معاملات للحساب %s.\n" +"إذا كان يحتوي على معاملات لأكثر من حساب، فيجب استيراده في كل منها. " + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "View successfully imported statements" +msgstr "عرض كشوفات الحساب البنكية التي تم استيرادها بنجاح " + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "You already have imported that file." +msgstr "لقد قمت باستيراد هذا الملف بالفعل." + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "You have to set a Default Account for the journal: %s" +msgstr "عليك تعيين حساب افتراضي لليومية: %s" + +#. module: odex30_account_bank_statement_import +#. odoo-python +#: code:addons/odex30_account_bank_statement_import/models/account_journal.py:0 +msgid "You uploaded an invalid or empty file." +msgstr "لقد قمت برفع ملف فارغ أو غير صالح. " diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/models/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import/models/__init__.py new file mode 100644 index 0000000..5b36696 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/models/__init__.py @@ -0,0 +1,2 @@ +from . import account_bank_statement +from . import account_journal diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c591a807a3ef2de2d371349ad657819fcf532b1a GIT binary patch literal 366 zcmZ3^%ge<81lK2oW;z4u#~=<2FhLog<$#Ro3@HpLj5!Rsj8Tk?AT|?_%@oB1WHSdd zXtKOy1S-;Gyd{>HoSa{pR}!C;n3o-2T#{Ilnwy$e0+iv0$z>68Hq)?0Y&*)smUe9`uQoT6~+cY zDnDP>&_WNw0*e|M#6#`K%uCl#NiB7fK6rTO@`Ul6PN}GTJ)s`Qn7GOiGwj2T_Kq*Mzl0pxx)Q%=QV`rWHF|+IZ z7$fC?R3r7kp%olB2;G4h4Y`Z9FH>F4<($JLhTIUbM;!u?7kE|`c9vP<(J?#Lxx0=Aydgvz%{kn(*W10Le(D< zFPPS-R*{S(O}9{4qNyusBh^BSl92|7GU1jf)AZ_YaFn=n=K>Nihq=LN%Vmvm5=#m* zAS(DhS-}><^eLz2@jyRy{QLnP|K3(5k5J22z1vO&_@L#Qb=<)+e9R{=nGV8-KeBG_PsN`o+1>6f~vFP=gA z`HISeZw$zkf03y)v9iJP^Anq>s`XY>+uCE%N*}EKEno&CAGEhBL!>a{F^HdLf+i(@SvHQS} z-}dv#Q1zKz4zp|#(2c3*5IAWwWo1&g0~}>?F$h(cI4sQ05f}WzWsCbksBq?oX^f-n zW9*AE>(N+#cC$F^Ijl(RxmnWSRjYV*$($wJIm^8&GXuW}eP;39{qXR-eFqK}VlLW! zXFud2>H$!cB4zV9*4?<VFqK! zSsl=U!z{)Z>%{I#QrL3gMpywC4JA~MK@oXYu*2BDXbXHms|Cmeew5X4sEY@a**1o+ z2pc@n>JiZw{W&0zzTWS_=Do`&*EO_d=e7B-FWuVnt9tjn_Sp2=*mP%X zx~;wrqI4jwEAkditWwFu$U6ETgm3Rz&u2qbfG>)Ri>?~qq>K}N^n6lg@jXl0UZo>byGv1o$WX5ltT+8h4WOgqn*R|Iq$iqL$jrp6+$728KON5c9 Fe*t literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/models/__pycache__/account_journal.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import/models/__pycache__/account_journal.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d98c0e6c93bae477d6af1248ba91f92fb22c06ac GIT binary patch literal 18107 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

    {}
    {}

    ").format( + _('Nothing to do here!'), + _('No transactions matching your filters were found.'), + _('Click "New" or upload a %s.', ", ".join(self.env['account.journal']._get_bank_statements_available_import_formats())), + ) + return res diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/models/account_journal.py b/dev_odex30_accounting/odex30_account_bank_statement_import/models/account_journal.py new file mode 100644 index 0000000..114ea1d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/models/account_journal.py @@ -0,0 +1,299 @@ +# -*- coding: utf-8 -*- +from odoo import models, tools, _ +from odoo.addons.base.models.res_bank import sanitize_account_number +from odoo.exceptions import UserError, RedirectWarning + + +class AccountJournal(models.Model): + _inherit = "account.journal" + + def _get_bank_statements_available_import_formats(self): + """ Returns a list of strings representing the supported import formats. + """ + return [] + + def __get_bank_statements_available_sources(self): + rslt = super(AccountJournal, self).__get_bank_statements_available_sources() + formats_list = self._get_bank_statements_available_import_formats() + if formats_list: + formats_list.sort() + import_formats_str = ', '.join(formats_list) + rslt.append(("file_import", _("Manual (or import %(import_formats)s)", import_formats=import_formats_str))) + return rslt + + def create_document_from_attachment(self, attachment_ids=None): + journal = self or self.browse(self.env.context.get('default_journal_id')) + if journal.type in ('bank', 'credit', 'cash'): + attachments = self.env['ir.attachment'].browse(attachment_ids) + if not attachments: + raise UserError(_("No attachment was provided")) + return journal._import_bank_statement(attachments) + return super().create_document_from_attachment(attachment_ids) + + def _import_bank_statement(self, attachments): + """ Process the file chosen in the wizard, create bank statement(s) and go to reconciliation. """ + if any(not a.raw for a in attachments): + raise UserError(_("You uploaded an invalid or empty file.")) + + statement_ids_all = [] + notifications_all = {} + errors = {} + # Let the appropriate implementation module parse the file and return the required data + # The active_id is passed in context in case an implementation module requires information about the wizard state (see QIF) + for attachment in attachments: + try: + currency_code, account_number, stmts_vals = self._parse_bank_statement_file(attachment) + # Check raw data + self._check_parsed_data(stmts_vals, account_number) + # Try to find the currency and journal in odoo + journal = self._find_additional_data(currency_code, account_number) + # If no journal found, ask the user about creating one + if not journal.default_account_id: + raise UserError(_('You have to set a Default Account for the journal: %s', journal.name)) + # Prepare statement data to be used for bank statements creation + stmts_vals = self._complete_bank_statement_vals(stmts_vals, journal, account_number, attachment) + # Create the bank statements + statement_ids, dummy, notifications = self._create_bank_statements(stmts_vals) + statement_ids_all.extend(statement_ids) + + # Now that the import worked out, set it as the bank_statements_source of the journal + if journal.bank_statements_source != 'file_import': + # Use sudo() because only 'account.group_account_manager' + # has write access on 'account.journal', but 'account.group_account_user' + # must be able to import bank statement files + journal.sudo().bank_statements_source = 'file_import' + + msg = "" + for notif in notifications: + msg += ( + f"{notif['message']}" + ) + if notifications: + notifications_all[attachment.name] = msg + except (UserError, RedirectWarning) as e: + errors[attachment.name] = e.args[0] + + statements = self.env['account.bank.statement'].browse(statement_ids_all) + line_to_reconcile = statements.line_ids + if line_to_reconcile: + # 'limit_time_real_cron' defaults to -1. + # Manual fallback applied for non-POSIX systems where this key is disabled (set to None). + cron_limit_time = tools.config['limit_time_real_cron'] or -1 + limit_time = cron_limit_time if 0 < cron_limit_time < 180 else 180 + line_to_reconcile._cron_try_auto_reconcile_statement_lines(limit_time=limit_time) + + result = self.env['account.bank.statement.line']._action_open_bank_reconciliation_widget( + extra_domain=[('statement_id', 'in', statements.ids)], + default_context={ + 'search_default_not_matched': True, + 'default_journal_id': statements[:1].journal_id.id, + 'notifications': notifications_all, + }, + ) + + if errors: + error_msg = _("The following files could not be imported:\n") + error_msg += "\n".join([f"- {attachment_name}: {msg}" for attachment_name, msg in errors.items()]) + if statements: + self.env.cr.commit() # save the correctly uploaded statements to the db before raising the errors + raise RedirectWarning(error_msg, result, _('View successfully imported statements')) + else: + raise UserError(error_msg) + return result + + def _parse_bank_statement_file(self, attachment) -> tuple: + """ Each module adding a file support must extends this method. It processes the file if it can, returns super otherwise, resulting in a chain of responsability. + This method parses the given file and returns the data required by the bank statement import process, as specified below. + rtype: triplet (if a value can't be retrieved, use None) + - currency code: string (e.g: 'EUR') + The ISO 4217 currency code, case insensitive + - account number: string (e.g: 'BE1234567890') + The number of the bank account which the statement belongs to + - bank statements data: list of dict containing (optional items marked by o) : + - 'name': string (e.g: '000000123') + - 'date': date (e.g: 2013-06-26) + -o 'balance_start': float (e.g: 8368.56) + -o 'balance_end_real': float (e.g: 8888.88) + - 'transactions': list of dict containing : + - 'name': string (e.g: 'KBC-INVESTERINGSKREDIET 787-5562831-01') + - 'date': date + - 'amount': float + - 'unique_import_id': string + -o 'account_number': string + Will be used to find/create the res.partner.bank in odoo + -o 'note': string + -o 'partner_name': string + -o 'ref': string + """ + raise RedirectWarning( + message=_("Could not make sense of the given file.\nDid you install the module to support this type of file?"), + action=self.env.ref('base.open_module_tree').id, + button_text=_("Go to Apps"), + additional_context={ + 'search_default_name': 'account_bank_statement_import', + 'search_default_extra': True, + }, + ) + + def _check_parsed_data(self, stmts_vals, account_number): + """ Basic and structural verifications """ + if len(stmts_vals) == 0: + raise UserError(_( + 'This file doesn\'t contain any statement for account %s.\nIf it contains transactions for more than one account, it must be imported on each of them.', + account_number, + )) + + no_st_line = True + for vals in stmts_vals: + if vals['transactions'] and len(vals['transactions']) > 0: + no_st_line = False + break + if no_st_line: + raise UserError(_( + 'This file doesn\'t contain any transaction for account %s.\nIf it contains transactions for more than one account, it must be imported on each of them.', + account_number, + )) + + def _statement_import_check_bank_account(self, account_number): + # Needed for CH to accommodate for non-unique account numbers + sanitized_acc_number = self.bank_account_id.sanitized_acc_number.split(" ")[0] + # Needed for BNP France + if len(sanitized_acc_number) == 27 and len(account_number) == 11 and sanitized_acc_number[:2].upper() == "FR": + return sanitized_acc_number[14:-2] == account_number + + # Needed for Credit Lyonnais (LCL) + if len(sanitized_acc_number) == 27 and len(account_number) == 7 and sanitized_acc_number[:2].upper() == "FR": + return sanitized_acc_number[18:-2] == account_number + + return sanitized_acc_number == account_number + + def _find_additional_data(self, currency_code, account_number): + """ Look for the account.journal using values extracted from the + statement and make sure it's consistent. + """ + company_currency = self.env.company.currency_id + currency = None + sanitized_account_number = sanitize_account_number(account_number) + + if currency_code: + currency = self.env['res.currency'].search([('name', '=ilike', currency_code)], limit=1) + if not currency: + raise UserError(_("No currency found matching '%s'.", currency_code)) + if currency == company_currency: + currency = False + + journal = self + if account_number: + # No bank account on the journal : create one from the account number of the statement + if journal and not journal.bank_account_id: + journal.set_bank_account(account_number) + # No journal passed to the wizard : try to find one using the account number of the statement + elif not journal: + journal = self.search([('bank_account_id.sanitized_acc_number', '=', sanitized_account_number)]) + if not journal: + # Sometimes the bank returns only part of the full account number (e.g. local account number instead of full IBAN) + partial_match = self.search([('bank_account_id.sanitized_acc_number', 'ilike', sanitized_account_number)]) + if len(partial_match) == 1: + journal = partial_match + # Already a bank account on the journal : check it's the same as on the statement + else: + if not self._statement_import_check_bank_account(sanitized_account_number): + raise UserError(_('The account of this statement (%(account)s) is not the same as the journal (%(journal)s).', account=account_number, journal=journal.bank_account_id.acc_number)) + + # If importing into an existing journal, its currency must be the same as the bank statement + if journal: + journal_currency = journal.currency_id or journal.company_id.currency_id + if currency is None: + currency = journal_currency + if currency and currency != journal_currency: + statement_cur_code = not currency and company_currency.name or currency.name + journal_cur_code = not journal_currency and company_currency.name or journal_currency.name + raise UserError(_('The currency of the bank statement (%(code)s) is not the same as the currency of the journal (%(journal)s).', code=statement_cur_code, journal=journal_cur_code)) + + if not journal: + raise UserError(_('Cannot find in which journal import this statement. Please manually select a journal.')) + return journal + + def _complete_bank_statement_vals(self, stmts_vals, journal, account_number, attachment): + for st_vals in stmts_vals: + if not st_vals.get('reference'): + st_vals['reference'] = attachment.name + for line_vals in st_vals['transactions']: + line_vals['journal_id'] = journal.id + unique_import_id = line_vals.get('unique_import_id') + if unique_import_id: + sanitized_account_number = sanitize_account_number(account_number) + line_vals['unique_import_id'] = (sanitized_account_number and sanitized_account_number + '-' or '') + str(journal.id) + '-' + unique_import_id + + if not line_vals.get('partner_bank_id'): + # Find the partner and his bank account or create the bank account. The partner selected during the + # reconciliation process will be linked to the bank when the statement is closed. + identifying_string = line_vals.get('account_number') + if identifying_string: + if line_vals.get('partner_id'): + partner_bank = self.env['res.partner.bank'].search([ + ('acc_number', '=', identifying_string), + ('partner_id', '=', line_vals['partner_id']) + ]) + else: + partner_bank = self.env['res.partner.bank'].search([ + ('acc_number', '=', identifying_string), + ('company_id', 'in', (False, journal.company_id.id)) + ]) + # If multiple partners share the same account number, do not try to guess and just avoid setting it + if partner_bank and len(partner_bank) == 1: + line_vals['partner_bank_id'] = partner_bank.id + line_vals['partner_id'] = partner_bank.partner_id.id + return stmts_vals + + def _create_bank_statements(self, stmts_vals, raise_no_imported_file=True): + """ Create new bank statements from imported values, filtering out already imported transactions, and returns data used by the reconciliation widget """ + BankStatement = self.env['account.bank.statement'] + BankStatementLine = self.env['account.bank.statement.line'] + + # Filter out already imported transactions and create statements + statement_ids = [] + statement_line_ids = [] + ignored_statement_lines_import_ids = [] + for st_vals in stmts_vals: + filtered_st_lines = [] + for line_vals in st_vals['transactions']: + if (line_vals['amount'] != 0 + and ('unique_import_id' not in line_vals + or not line_vals['unique_import_id'] + or not bool(BankStatementLine.sudo().search([('unique_import_id', '=', line_vals['unique_import_id'])], limit=1)))): + filtered_st_lines.append(line_vals) + else: + ignored_statement_lines_import_ids.append(line_vals) + if st_vals.get('balance_start') is not None: + st_vals['balance_start'] += float(line_vals['amount']) + + if len(filtered_st_lines) > 0: + # Remove values that won't be used to create records + st_vals.pop('transactions', None) + # Create the statement + st_vals['line_ids'] = [[0, False, line] for line in filtered_st_lines] + statement = BankStatement.with_context(default_journal_id=self.id).create(st_vals) + if not statement.name: + statement.name = st_vals['reference'] + statement_ids.append(statement.id) + statement_line_ids.extend(statement.line_ids.ids) + + # Create the report. + if statement.is_complete and not self._context.get('skip_pdf_attachment_generation'): + statement.action_generate_attachment() + + if len(statement_line_ids) == 0 and raise_no_imported_file: + raise UserError(_('You already have imported that file.')) + + # Prepare import feedback + notifications = [] + num_ignored = len(ignored_statement_lines_import_ids) + if num_ignored > 0: + notifications += [{ + 'type': 'warning', + 'message': _("%d transactions had already been imported and were ignored.", num_ignored) + if num_ignored > 1 + else _("1 transaction had already been imported and was ignored."), + }] + return statement_ids, statement_line_ids, notifications diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/static/csv/account.bank.statement.csv b/dev_odex30_accounting/odex30_account_bank_statement_import/static/csv/account.bank.statement.csv new file mode 100644 index 0000000..7be40fd --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/static/csv/account.bank.statement.csv @@ -0,0 +1,6 @@ +Journal,Name,Date,Starting Balance,Ending Balance,Statement lines / Date,Statement lines / Label,Statement lines / Partner,Statement lines / Reference,Statement lines / Amount,Statement lines / Amount Currency,Statement lines / Currency +Bank,Statement May 01,2017-05-15,100,5124.5,2017-05-10,INV/2017/0001,,#01,4610,, +,,,,,2017-05-11,Payment bill 20170521,,#02,-100,, +,,,,,2017-05-15,INV/2017/0003 discount 2% early payment,,#03,514.5,, +Bank,Statement May 02,2017-05-30,5124.5,9847.35,2017-05-30,INV/2017/0002 + INV/2017/0004,,#01,5260,, +,,,,,2017-05-31,Payment bill EUR 001234565,,#02,-537.15,-500,EUR diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/static/description/icon_src.svg b/dev_odex30_accounting/odex30_account_bank_statement_import/static/description/icon_src.svg new file mode 100644 index 0000000..664381e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/static/description/icon_src.svg @@ -0,0 +1,178 @@ + +image/svg+xml08/12/13 1000.00 Delta PC08/15/13 75.46 Walts Drugs03/03/13 379.00 Epic Technologies03/04/13 20.28 YOUR LOCAL SU03/03/13 421.35 SPRINGFIELD WA03/03/13 379.00 Epic Technologies03/04/13 20.28 YOUR LOCAL SUP08/15/13 75.46 Walts Drugs08/12/13 1000.00 Delta PC03/03/13 421.35 SPRINGFIELD WA03/04/13 20.28 YOUR LOCAL SU03/03/13 379.00 Epic Technologies08/12/13 1000.00 De a PC03/03/13 379.00 E Technologies08/15/13 75.46 Walts Drugs03/04/13 20.28 YOUR LOCAL SU03/03/13 379.00 Epic Technologies08/12/13 1000.00 Delta PC08/15/13 75.46 Walts Drugs + + \ No newline at end of file diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/account_bank_statement_import_model.js b/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/account_bank_statement_import_model.js new file mode 100644 index 0000000..99b6246 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/account_bank_statement_import_model.js @@ -0,0 +1,18 @@ +/** @odoo-module **/ + +import { BaseImportModel } from "@base_import/import_model"; +import { patch } from "@web/core/utils/patch"; +import { _t } from "@web/core/l10n/translation"; + +patch(BaseImportModel.prototype, { + async init() { + await super.init(...arguments); + + if (this.resModel === "account.bank.statement") { + this.importTemplates.push({ + label: _t("Import Template for Bank Statements"), + template: "/odex30_account_bank_statement_import/static/csv/account.bank.statement.csv", + }); + } + } +}); diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/finish_buttons.js b/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/finish_buttons.js new file mode 100644 index 0000000..72c1af2 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/finish_buttons.js @@ -0,0 +1,10 @@ +/** @odoo-module **/ +import { patch } from "@web/core/utils/patch"; +import { AccountFileUploader } from "@account/components/account_file_uploader/account_file_uploader"; +import { BankRecFinishButtons } from "@odex30_account_accountant/components/bank_reconciliation/finish_buttons"; + +patch(BankRecFinishButtons, { + components: { + AccountFileUploader, + } +}) diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/finish_buttons.xml b/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/finish_buttons.xml new file mode 100644 index 0000000..f9a6334 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/finish_buttons.xml @@ -0,0 +1,8 @@ + + + + +
    + + + diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/kanban.js b/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/kanban.js new file mode 100644 index 0000000..61fece5 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/kanban.js @@ -0,0 +1,42 @@ +/** @odoo-module **/ +import { registry } from "@web/core/registry"; +import { AccountFileUploader } from "@account/components/account_file_uploader/account_file_uploader"; +import { UploadDropZone } from "@account/components/upload_drop_zone/upload_drop_zone"; +import { BankRecKanbanView, BankRecKanbanController, BankRecKanbanRenderer } from "@odex30_account_accountant/components/bank_reconciliation/kanban"; +import { useState } from "@odoo/owl"; + +export class BankRecKanbanUploadController extends BankRecKanbanController { + static components = { + ...BankRecKanbanController.components, + AccountFileUploader, + } +} + +export class BankRecUploadKanbanRenderer extends BankRecKanbanRenderer { + static template = "account.BankRecKanbanUploadRenderer"; + static components = { + ...BankRecKanbanRenderer.components, + UploadDropZone, + }; + setup() { + super.setup(); + this.dropzoneState = useState({ + visible: false, + }); + } + + onDragStart(ev) { + if (ev.dataTransfer.types.includes("Files")) { + this.dropzoneState.visible = true + } + } +} + +export const BankRecKanbanUploadView = { + ...BankRecKanbanView, + Controller: BankRecKanbanUploadController, + Renderer: BankRecUploadKanbanRenderer, + buttonTemplate: "account.BankRecKanbanButtons", +}; + +registry.category("views").add('bank_rec_widget_kanban', BankRecKanbanUploadView, { force: true }); diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/kanban.xml b/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/kanban.xml new file mode 100644 index 0000000..9252348 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/kanban.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + onDragStart + + + + diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/list.js b/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/list.js new file mode 100644 index 0000000..8668138 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/list.js @@ -0,0 +1,43 @@ +/** @odoo-module */ + +import { registry } from "@web/core/registry"; +import { ListRenderer } from "@web/views/list/list_renderer"; +import { AccountFileUploader } from "@account/components/account_file_uploader/account_file_uploader"; +import { UploadDropZone } from "@account/components/upload_drop_zone/upload_drop_zone"; +import { bankRecListView, BankRecListController } from "@odex30_account_accountant/components/bank_reconciliation/list"; +import { useState } from "@odoo/owl"; + +export class BankRecListUploadController extends BankRecListController { + static components = { + ...BankRecListController.components, + AccountFileUploader, + } +} + +export class BankRecListUploadRenderer extends ListRenderer { + static template = "account.BankRecListUploadRenderer"; + static components = { + ...ListRenderer.components, + UploadDropZone, + } + + setup() { + super.setup(); + this.dropzoneState = useState({ visible: false }); + } + + onDragStart(ev) { + if (ev.dataTransfer.types.includes("Files")) { + this.dropzoneState.visible = true + } + } +} + +export const bankRecListUploadView = { + ...bankRecListView, + Controller: BankRecListUploadController, + Renderer: BankRecListUploadRenderer, + buttonTemplate: "account.BankRecListUploadButtons", +} + +registry.category("views").add("bank_rec_list", bankRecListUploadView, { force: true }); diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/list.xml b/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/list.xml new file mode 100644 index 0000000..0db8ef5 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/static/src/bank_reconciliation/list.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + onDragStart + + + diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/views/account_bank_statement_import_view.xml b/dev_odex30_accounting/odex30_account_bank_statement_import/views/account_bank_statement_import_view.xml new file mode 100644 index 0000000..2fb4234 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/views/account_bank_statement_import_view.xml @@ -0,0 +1,27 @@ + + + + + account.journal.dashboard.kanban.inherit + account.journal + + + +
    + +
    +
    +
    +
    + + + account.bank.statement.list + account.bank.statement + + + + account_tree + + + +
    diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/wizard/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import/wizard/__init__.py new file mode 100644 index 0000000..a7e4f0c --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import/wizard/__init__.py @@ -0,0 +1 @@ +from . import setup_wizards diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import/wizard/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import/wizard/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74fe634eb200f10bfb535392257e3e7347c7d51e GIT binary patch literal 303 zcmZ3^%ge<81lK2oX37BR#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@8G#a- zjJJ4;Q%gz<;>$Cu5{pub{WO_wF%&TarB*V01{v|IPd_6+H&s6|Cp#mtswgW{KcF%> zBe5tqpeR2pHMyi%KR+e4!q@;v<>%`fTIfMoU{NE3_{8Mo{L;LV%)E5{l+?0#h+1S( zsDk*U#JueI;*!LY)ZEm(lK9Nrg8ZTqeTb{{ec z^K}Gt^!3N?S0#jg)tj6unQ(Fyg!_mghCSqC8~Y`@4wSX*ew^*UM`TRh{a^E1<9DPMGn0E}{pg3UNmGXH3yxA6VaE#i_Egz}qkwwSqSCt5aXn64zaNU|Qr*f(=(N;a z95CK-1I~sE`4eP!)l)O~nl)9Cai0sJvr)AH^;`z=)eAxFlRO&PcB5_>MTpUsIufYp_t7`)Zs_wi^|rcnD0*)D#yzJ?g?~eYJ?=!Z4IO@W)>KMQ zmoMi@xWQ(d@d26I&YosjK881|bbCAP>~`AFP#E3jvemyQ8USwi;*%z!l~;BS%%l(O zuU+(K6)i0OwD{@|?7&<}%#|Z^?a*91FxL}vePkRrPA83}hi48O%j3rKLzb+*pR79L zO>wv?#;fAkJo{yL{Orq#**r2g4$X}N^LAq1o*3wLiGN;uZ*)CrTu2&k9xt37)lVQG zYF1T^kbwG}5LG7x{s>|yK2Z%qK82CYG&SM|T`t@xO-apX^>?`E5z@qBQD>kB^Qw3T zc-lEB(_(44TX@8G#a- zjJMcw^HWlDiv2X1ZZQ-w1I1P{db>KSRbgb!q@;v<>%`fTIfMoU{NE3_{8Mo{L;LV%)E5{l+?0#h+1S(RFU|k#JueI z;*!LY)ZEm(lK9Nrg8ZVA_~gXg68-r2%)HE!_;|g7%3mBdK4Vg9s)nVgsrH0Li{r9smFU literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/doc/standard-camt053-statement-v2-en_1.pdf b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/doc/standard-camt053-statement-v2-en_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..36420b4f68726c2afa17b429dfd5b0f30a7e1ba2 GIT binary patch literal 4561065 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 z zJ9W-JmM;2aQW7Iml-85?wI8v}_Z&N%?8wcPQo~lJ;~y($=hXj|=?Y_=3X$w9u2jH@ zEnMNU%NBMN`?Sj@uae^ zOgiPUrTU^?#XhdRiD|y$*l1E2(PwFUYWW!<&d<_SyQO#+Q=4xg|IW`JU8BIuh1mCZ z;k?!?miU10yAuOofSDoR%4a9WyQv#hZ?6}q+z1e;x?T|S*r&o|OpQNzQ?IEtjo(-9QtBXNVSaeSp1($R zu>kSZ4{Fk#$l8@=oT9Q5lMPe!8q0Hap*Q-c?JsGh3cWcbU41H5;7z!)URTOude$zf zY#cSU(I`rm&!6|-KE!f_=OA-&+kPha@5DOpP;<(MNIStiRn+Mw&XvH+npW(&!Zc#i z=_lVMX+^_r%4?|~7|hsNkMI>8d{lPQYn(aE`sVAaI+CPAA{dQvlzCC52X8dW&_vLs zKEt9ZY&bA>c2>qrP|4NINGeV|V9Mo+3$9<}#q+^)03xrKMu~zD( zNsF(!pZZ!vNM9dJYh65a`>e;6)CpnJk*4d1zmv;0>9CAScol64<)c*4V^6A*FU(0sqoX<%{(p^xG- z95J;~LdSEtw|n{$$|rH z{QZnbUq{&{*jyMLns7?y61XOCWnSL=a5Yn3gk>A#y=Z}#q5O&XNNN5j#xJ>b?aw5Z z2nX&+3_ofibEYz->GrLMZ%Q9=AA5mKq9uLmoMm0%{8XGx2jT9>o6|f)ha@9#-9KL; zlFun&&gmK7_0o<;j8*n6%ONnB)A%Nyp>6z;VyQH}<3@xnd>PkW+}TdtdNT4}OI`hi zV7SKo)bw+by8-IYgNBG}gD9MttmR=e{ucDF<+D?&BDAF3tsL-VTe@Q_>#+GK8wG^T zsB1KN`#2mwlh43xKUuOIEHq!>dKUZWT*Tn#)I%j#aQPM5?vMUBpmp(VfX(Z}pNP(8 zuzu-ztfndhdmS3nLyoy1UX=Wh$mRM#fCxyhXbQ(YN8hGa2p1hEh&+8`SiNglGnAqg z_xrx^dQH5Mvo~L+m5(*a;tk!=DV9* ztvNnUpJ3Xly4M|ei8rjnVqG2@HmHRY&nXICp=gN`xRTtff~|#jH*yjL=(f-&!gh`I zATjA0X0m$C8o8lcY4COwO?F#6_ zoum~s1)jK*L7VX3bDH7k9zV?_`jah-P?sf>!0-D=>05d*-b5DXCWHYd66dj%1 zVo8aNj1^Pa>9vm@dJbdWn&r7`MJ#P?@)COX+9hVa+3IiS^M($DR&@-z(Kn=>en8yb zQ!Q1Jd{reooa@C|4!pKJjS#i6ysibBY5T%OqFMl znX-(1*g0nU1SYeWxb+hgi+lQvRB!o3?|0ih??WzQD-Tf`=-xgW=YCfm$oZ}*um-WQ;x;yt9&G#1vD-aOc@n0QWfg2s^(vK zbm;PN1HZOhFh0-M=(>)Z}BH+ipJ;>ZpUeZDYwYVA5w(ZRLvw;=iQnODA9}jaHQ9X>`s$dHw1(ukX9@i55+#pZ>)*w<@frrntmoA=tB^VSnNF>`n0+8`08RGwe}r*KJJC!a%v zRAPOJhX~=Zrnyl8VLaudn>sU0mu?|aQPXnm{f}Z|;wWyE@kxru-n;7j=>GrX?mOVI zY~S}wQ%V%s*%b-TvL!QHS!p0y*(o7JAuBuCLRnd5rbuOzQdESJmCQ1;{qJYJxgYcC z<@pIT!I%5*to72A+UAsfxMD`@x-x=K7Lp2MmClV0)!1gy&8B7wF8 zGeM`t`p8pVuc&f_u>#1JXuCKQdfNH3qtZn6(?e!{fn~rSId@w_-(341HG58V^1u}# z_8Q59O`$_{qserq*-wizANkD|clQ^!$I`FeE?ef{p`z@Zm6upn63k@L_mI z_BpI{Es!7V0jO87MyzX);gXuyqxuiy@n3-x7;F&#H$Tuff&4)J@~Ac$poM`S)A@k9 zLyhD|#&9IB6IzkIrEAwq2yRV5(JN!;XeqSf#TgF<3Vcz%E`A)BK{n*OM+``c@E(H7?}0g8DUJ26YT$ZGlG!N}l2Qc2@t z6Ho&JQRbrvs#i2%wIt!qhlK`!x_nS8&T{^VN@aL}J9AjZe55VFHx*M665=|= z0N|WUiUH0gp?}5dECURsb+mjZC7_Zse+1C4U`OC@d}GD7u|=F`spSKBj+?mxYd$|l zBLdB<0j$6L>nIYzk4XvED1!lCTY;hY&atDtB;aA(oPQ(|;Luf0Hv-v{x)5)mK4#cT z8cArpt&)x$h9Q|=E^P*+h`@M5wvJ;*U>)$b09vcK)XNVnW5|zn%Zf3p=2~G2Cxoo9 z#G|Kll?3lF3}^K6Qwqw6(XXuIl!9aiz&qYmO)k)iI$u|V9|+UPkM)~v_AG zuUB&sVYO`fFbr+^^0N)vdZ1tV56?DG*ucn6pww)+z)Zg#9?!K_D-lEy#f&pzRpq&S7C4D6HNZ>7utjFB{7t;M4*2%DQ^dAK&@oQA>Fd@Ej-mhj0V2 z2KDJr@CJef@MIq03h*yr4}$!J{348>0K*GBTECPI@DpSadhJ$ua7u*|Y`{*;k`Tp% z?H>mni*lX<8du;rzp7LN55jpIBVfp&y3kp{8x|Cw|B54l2jM&nBM7j(pWuY8`3DZ` zyxRP;U0%vffCAEz2R#7hk;@2L?*o(V09?wz6VNIG3<2;64PcDJ0I~=W?se2g0Dj)u zrp4f_6lM7`FhLg?@gcIu!3jVly%<=*ZVOVHTEuNJR^UOuj$;K3IkO9024^f*U`#+Q zEpR+2!eOgWXo5n(N#YtRGy%UeFNR`5iiZJ#$|02hZaD$86abW?tNvKvBNq?!FSt$_ z6-KgbtuiW{ah_jKSp;(E$;N|<9d!vDSlE`2kKk+^q{Fl>@$sLixbnO&A0Gizf$0Wi z-hlc8@Cb0MKj{OY{{TEf#mw~r1$sZQR-nL{59BYiax{eVZ~{v(rm_r(3375TU2DV) z83q;b#h7xTP;j1&8o!mTfFXdN`;QeUn}7(nc!3)w#k2x8q2NRtq~7#5*qjHwwTwi_ zC3wD01%w+AsX%?2heJT70(i83l?uQFbXUk4;ShW=9=4Kb6=pregEk)qMgR=C7%W&1 zq2OH(NVRH_5Q(t@0-cXTlub+G5IrT!$4DqRn?}8Y^@jfr4gsAA0AZlL6QC3UJOb4# z02Tz`5h!W`O#i?mRMcFj5V^Lh5@5On6wm!CLL?qc`YRce7Dg6it(*azR)7Skmc}6-Eb%x9fFX~27I*^; zoMfYfPOu1A+6p`v%mHBq)P`(%9D)M_NTlii28YXUKJiYr)+w_>P1l;$uKB?^4N8?` zMJ(XMBaefH#WO1yj$a^?)s?N_LvR9|y_hZV@-g0r1@JBWYsmxU<}04E@SLG4D?%Nx*kNM}zW`1e0K|jpk$?vSk3eTQfZPu7XgxatFj`J)Sqy@DNzzX9Z*7Tgu__)jqt0N$dlbc+EJ z@LLEsMs@^qY63VB@MzvCJTH)ZAwPiP<$8tbH9c?#U#LNG&aWa&Lj1=;W~${Lh=dNX@UwdYbp7(0w7n9LS7&sB0uI8#{uUBFo<5fv9LrY3uqTy zClsO^!Pe?N1o*ZN48^C8jRZ?>qwt}b$C-aPvgd3e3c;!K>V%;1VL^wjLI?^FA_bxF zKOh9PXe>l7&KM4QEa;GnGuqGA3v}qp`&zBU;5Be{l1~skxXp20SRrYqZ|O8U;TD z_?8}QbplWjJecKiAb>ztOBdo0yhmA`02Ds7=BReil^QDG;5`aTKLNWC{7p*uPoB4g zoXj$96w5T10q42@i9_o(m3lyc?*zh7N?F*kUwRS7gHs*{0gG2u;W$xwRdoZPtBwwIneg&j|wG2l+paF@r{triezov;F?GxV_^Otk6BEA&TPe+m{ zNH$jt7u{xw@S*D?cs0ZA8RdCXudLTQBX762-=4MAqMZOl;O@0}D)7#WL zRd4e|Df-1!x8p?Oqk(||?dLNccZvrqrJ8C=WxjEm;+z)^x*i(rUoOSY@go5iA3I+)_#TY;X~6CQ!j)aN7_F+iA+>v zw}0dvc1N7juAxuJ7Z945YAt;s;yBWoT6(`y#+H}2-*bfik$Km?^yklR@A^qW=`?CL zaq*F(&Wo7>hmlkDKO$^MJJtQ0a?D`9+q!5BU7E)(Wle7vj;WfhX+J(ksyElF2`b+Gu|uS~Bt5js*w+#5YO5)bF0a}B3{9pqE@uFUY~elbUzqTbK0$A@7V zGIlqhAzN8P43r}>qz~*Btn1-JTygqE`^-xldZ9SV& z=*8h734Yx=_21<~HhYhH6B(wRuBq2)m&@;%2+lhZ8hfBX<*b8N=Jlp*)0f0oYNoia znQN2tzTbb++LWdaBHgJ+%Mfn1HT|0-(S|cm9ZbSAy8L=C6JAu1(@Wb=fBRF4gnIH3 z=9HR%kJO0M@kU&CKAvGc-8DQ^u!p_UIHf{17Wkk!Dwqi$^fgPqZ5$8^5UV@-RzE*F z)mT(3==GAYn&obV;rm82!6qxk0lv**hDV#8CLqWzihMn71+{W9YrJVvs78F|-n5?c zuHw!h|97=Pw(`fN%XRbmB=)PMvD*qgyvCuhGptxGFrM!-EF+@3BTAbJJtMX#GZBk zwd}`dnvRs8eaK9*tuZOrBH`w@z6vHQRjWdaGwHw8A-_mI+xWavmc5i2E4xjm>-XJ$ z)#UJd!BLI!cMrH#S1B6BkIkHDo$OD!C=;7vD?{TLqi!6Mprmb65FV=XGO^G75`b%&-10VKq!CkWM8gu!EQwHClVUj)cLX9_9qny_cZz5d}NiR>d-$3-7_xxQP-jW zibMZ4gmyetU~6wuvrPy|V5W`6wR-Ay3QB{IZgMp2ZDhe;GTGT<-FaFHDjF0&QEOd% z01M3-*m+Tenz-Q=*|eDaaN6aV_Y_}5og?=!6>i$a5yu>Vq4mafxtq6C1%-*+72k*% zIqS9Uw__!W`Z!^2q9F}Q(U7Kbq=vCOiR%auN(l`>R1|G|Ye z4^4%eo~ozHN*K#a-Y1705|#|}e4qk-Pwk_t-c2DZ9~Y`7AGa%dTVQiE#AI|gtGXji zO_FU(q|<>aVZV|yt&PD9KWsjbhWliZ*YCRgf{|q8_%6+M;HUYSG7G$Wilpj&^Q59e z!#i6^piG}bD%oO7`^dfrBZu_M6sqjsIBK;_W{RtK56O5x2vzfbu&ZvSB)?t1y(l7^ zE6uun=D!X2TNApSqK6+d?2Jc!hf3 zW&rAR2W{oy*B{S4{2mhf+9oiSmz_y*D2k;nh}5#0)Ka-c#%ni3T%t2dk9W8Gk-e5l zj7-I;j7%n>{H~cE%^^XCrOe-Z-kgLG?cbX3m@!_WCB|^kx4g%r8IY;= z`QXkhugvUL`x+6W*5`WF$4K)%0%C-z?wr_Od(TzUM4?(-C)r{zleSEzR`-S5I**<1 zQ>s06z94n|2;0$`ou%GG7cwL2D?fidr6sT48OQyDJ>k9EPu7E_FRR^x?lO%LF^dvG zzsHlr(RJ&8d!s8auk*}e-{zk?FBt3~QFXnOCc|?=wyf$qOPvqIx(cRlrsSo+yf>g&r)Wv|q@d%Y+or2;@}jHU2a14!J< z{TW@9gfx+ineGhz(jxA=-jXyHTeWa(2Oi~i$)6x)*EOvbRsMe6fI~6)6w6I}TU&<; z!^9_i@!bKfS#@V33qRVLa8-)wyi;=k!tdRz6W%U1)R0}0v|8S-#irr~8$}zhynjjh zgmLIbx7Nlmh@}y|RixYClxLmliyeyg&pi(dKi`@7{QBhRX#bnmp0Ou>g)@_$f#0la zZEuPi?D!N*JLD86LVnJXvh(6xHs6Vc-8?C!-!4suep2R#HVl#vo!MUNTV2XH0m-=4 zT`0LVSAEl6qr@Q9G9vL9s9NaB&w3A=bBx*L{9va-Umf~vveid?Jg{%yR?QsYIya}& zj<>sGK2q&HS5kPMU+M%_hj#|l-J2r*5y9>#eOP2ADH=jwQeC{rRN$5ogAml$_M9Eo1VJAe_ClB z?6!?r^q@v&)TubShr2gT`{lwuUe97My)V@iM#L_r@1SGlZxu&TG`6Yxp%!`E&(T6| zBRf6m7K-aSY`g|fcZl#eb~ICV=F(o#r8H15-)Uld(p-M$ghHA5kY_1ZYW<0nsOfJ# zMgpFBHTToE-GC0p)|pzp7T_c%lX6zf%CHa+53puAD$n-I>m)z(^ozxVY3kEVesFp5*ti1OJtGW{RFVp@;~m$$0E!^0tcwWi#r1{8G+k zCe0RvwfC}Jkbemqh}fb-^hqdm|BgeSAC+#EIj+Zegn?v&kz7?`|3}9omUem`LhRza z(|aDk$UM*8RV(IB@sOvHvSU>``7F<;RbltVyy;v=%db=_H=F{39_Zx|D-LXtawesI zKg%j@zmM1z`8R!}!@T);e(nOlTb7v zU)y9mqec(ESSGjDob7h40Ba7)9h-jpxt~v-G7xRJ2;ZIHP9XdCu%Sy_>dfJT!JF7G zdYGQQYVed#82ZuatiJJ68*yEQfC{zK!a(S$$ZpLVK3_i3{$;{#ia~`qM|mJ`-|?Xu z!F1ls(cF8i;PG@el8txnU%bXYkf-`P&G{0GQ?q4kB-8n_ehGKkC9{lM}wh>&kIB!`V(>gesk&J)`{G14)@KK6&@di#H7ic#18s^t*GFUDTy*lb$c z1Z7OAIs~bv7Rz*_H=trY9F(*BYEX%zMz z2+ipaD>20 z`1pFgUy8O-VyzqiksJVaC+sTQPRwf9%k&+PD(V~(Ke1V~aahxoJ4j@o_65K}Tx$Yj z$M^JxCyxid**tWL_$h61%?)Ge6yH_~wKoCkRK-8P8`XuVG^KcPL8{qnYu$e4j|Y}+ z9M2dJY>@PJ)n?i6#YGxNM|gYFFY!Uvgh?L8p-$G`yXM+tZ9g}aCRLG>^?nQqX&bIS zk$Or?OQ6N5AT@+c`@%al`3JjN@E!f7S9pq-=P`fd+M&I zFwiQ|-{#sVDw*d!BePAmyg~k#P+gjH#^kqamR@?4DZB33yhXT#XQ-8iP+F1e8WlTv zwaM)}{-L~0u8r?J%QW%e2?t>0fQ9a4G+_T1UXO~RVA674L=z*Z4Mk+nM2Tp$4*thfkb?UbHd5k^78D=@9Uph>Erv zdUOizRdubRjIi<#`Z@PjBU1Gd_0irVibi%F=PULrl=FmPC5)Kp%Ct~txY*SyhlC#R19KF?mlt|uOWIZci`^M)a0;|m=sEB8gn_B zJLZZrm*p8R6A!<7RTTak4$q8kto!B8@nIvVzEv7{fKEFFOjq1 zdlCgdAQ0-;{SFKWQP57%+Vaq+afJMH0AtR{@Ivb!A@Qm*J;?-eJD+)d$Zp+cJSh;W z9U!j_b)ror2VbW z!OkBQ+o7fR%wiAI!Kf^)ZfW1)olKPv%e*^2hiu_XQ4~NrZijU$yMzPFwXRP#id8Jz z?p}Nw7otMu%aXX~wx4J~q`$PH&Wjk9InT_gg51U`sg8*@`)LaJdD0-2e4Ve4nPM%s z9^>WYCBN&kImE3{Gd-EG*4NdIYJ=P_EyFxuRjhotA=OYo*-&|7=qK{HPl*H`HE?lb z-g753o9*gox$^A>Rf)Y4qANM0Wt5MRlWRC`)faIPsNDPEk-?jT`|}+Xc-yTmI$dw9 zsT(+I@v`#$RU+rZr_FowuV{}otN*&At*5~4WLFj*N^^ab#WgtXi)P{Pz8~t^H9LQQ zsMG3_wh=q}D!ZW?;kP$&XUXj!YqzJEeBAmxK76 z@;P3CJoAy6J*3+F7cPDI;cgIlsMfc4t2cuUQnRK0`U6V-Ta@-0?)2-a-$Fzp`A)fLuw?!-*=bS1$)_gAYmz4pio;+6lde0a3=;)z9$S z=@X=C2|P4hbU84!x-c*A#?Q&!irNUxNH!|tkd%bP_I#@AUw@jbgs9qlAH4CF+vKZq z5p{xIhfSi(pu--gy;q+-$Pf0vRo(Q~y@$6dO8!v%SI*PQ7izeb6DG-lpq4GhHcBE_ z1thMARAyv>-9=D}cE&4ZsCv3%=}3xB>a)qadbF`Afd9NN3FF~BSD;$(rY4PBi>7OgD=@w4vvkqS1Z z*S{OAN~|2JKPV=ifeIKL<`lf%ZDn-7qd_Az(owIy;CmFUnTPLy^UR$K>VpA1LR&&p zKhITPy~-8-{87?%>barUPxDi*Ym_4H*g>L+&p_AV1SO*n2Ao1>5Ad#HM0&XnppNHy1SVl zrqPEyJ9l9YvPZrvl(A1DU@VSKfRvL}_gwi^U<(j_ul@1nuqYySoz}^|fOl3wR<8TJ zvbKq-lv2iKvFbcOX?WFRm|6T{J0~Hf=Co99^?)+}Rg0?I9|NXTFHAtlLLRnP9n%p# z@_M+G;aODT@R<-mmXr2l=7)3wZm-XcY#J3;nQxjzWXt(b0SgKHhQrDE*Ni#0ZA0dg zm&ijyBHmvRWjz-A%uZv+j}zU&1QDlqBw3To-TcV4rIw|VW6LMa%YtUXr@nPIpN%qS zdpsF`18}6Rqsqs0xSmBNj2#nro0vc=ZLz~Y_nQxKDMw!p=Qm>!mOQejZ-bt{l>fzT z+c-KC$gDgO6C)@TwO>7s?iBmE7s7PRNdwfW-n^0QkIo97E2B{)*EKnwdoSI_&LVH5 z0czr|VqdIKA9RXHU;l0Pev%6IlpEP{tdkdBJ?3qA63jk9_28fa=)GCaj`y*WA`#GQ54{`6Yx0D-uo@P9pma)xkHHp==Za{E~#3A`!lkzE{I;m?oQT=^hzusC8hBoDym1 zxu?4*V>}Ec%Dv(-3O)G0l>Z)0*iyjCZ>R6P%H+HI)JcH!Lg9;r7 zFbJeV!9v)AdvJ_XB|I%|->|XlA>$Q~UEZ@E~uX`QqGC48CuvEa;aMdaIu1JKYhuu9Tx91DPkx*aE8uaMkC3Nm9dux?Zwo{eIw;9;NhvorR@cVYS@n7$FHvt^r40mRS(AdBAxW zpq8?VybI8aTOA!YAG$kz*=&ag+-i+_1v>_RgT#42TOnrSgTMbupC78rY3)KWIB{4> zEeex3tdSRoa_SilR2UP7>4t|)te z(7t$+D_Ee07kN`-;W7YDoKdg*2b}0%gcFk8rZj4$hy{GtjXYlnE8fktk1u>-v{ z;_;z>22VEvdG%}Ibb}LMKvZfqR^Y?`jFA^ucID>j&~SsX07vq^FF+(O zct5g|3=$>^;zRe0kw91;k>G3?q=ob^5&4(7=<+3IsqU26%+pxU3f< z(RuzFAreeZ4@XK6t|CU_!@3Q|0>JaR7$QOY5;#g60~?)|j@0(XU{K;&0qy#bUvq@cqwj4nXdLvNKRR0s;Z30sxftfnwO= zxA3twG@#xCyoUOk_3{UFp<=E40Tdfi@pEN=fa5`_jROMI8PGx`f-+^)wdqw@fd{8H zd^JK#yr66u{mQ?A;y?KMbNz3%Im42-0vEfOzp#?K{$*QKRdLNSSFlh993{en9r-2W zA(}!NyH7zgtOLkebfbbZ|8QifZ6OLl`7<1)`?9hXc+fiISOG;QFAJ>z+X5_t^%UVKEr4Z= zz+e#%YG)iPpvVp8LMuR-GkhgMA&eDxa0$cF(lyJU|ACd^(63;}VtqYgvGnA>QZvTX zVb==u;EWU`n6wD!(KC$?Uo*~3FD~!_R)B*8@oE)&1Q;HC&2Wr9%(96wA2=~az4AZ9 z8geBeZRb!tEWp(iJ>A;gd;pb4W_ITldlg1>NC0HPbtx5gx40a4>Wb$fMN-00zruw^8t*q zX_Ww8eD4ibYJh{pg_ax(eE5Xn7_pya-H0EYgY$z^4v?_U-z+V7lt%wF90C<91OpHHXdZ~|t4<90 z0srC#KF#Z(0ycNRBM^fmAOjCP0`1*_14G~u>ey?Y))Le~{Myy7z-b6bcxVy8qM?EZ z^)n7s;EOVw@`D#Nl$OuRzKaL-GaRLzvl3vz5d`%L){4IY?COg~cp(#6LP9IjW9vo0 zks$DBJx{SP=ag%;838Aqt5Xz$;=%5WGu_Cxm__mz9OSQX(vLl= zKm)~t#~EkN;m9i$xQR0iOl1jQoj4FaJkD^8sMB&OD-29zh<*h-7Jq}hf8eylA<_I( zBrHntihF;890q;>yCf2%^A~BLqJw;dTBO$pkpPJz$|=?;6oU09;UICOMG%P!LikWR z<3It9EO;&iBzX6-l1dQT2wtGk8IG-opiNpbXT?a!ERRQU<_r=E`WrlAF}5Nc7Y%m5nK?KsFu)$$TSmHtY z3i#-DIlSwC5?c>=i?D&($aWD#gb*u@nGEGO$tiW<$r?5rPk_Y zYqStx_YD9I?Puty3DmQIC!o*@pc{CE{^c=W1XN@psN(_Uby~(TXQpd~Pn;-$%v!Ot zvLrO{Accmb=J}ufE9ww=VY~!yXjT$XLdQ!yIHBQ~=CS4DC3r)FdIdWY>l!Z?;PcNC zykK_&l(&I^2#Sb65gm9mzq$j^wj&?SukJvQg7C;sf3`&sq#!)<6YyxApo%&gTC;)= zSV$MXlC%;ECHPQ7{aoni;4S zwZHG9+$vFdnYQ7mZydu$@8M%|WPX+$%CSkCqMf1(-za`GRkIl#7-!j?u`%Fv)I{>+ zklJrmr!Q9~rdtQ=ch~>iZ=-$v>csTm;N%x=^RGW03mxp|x@$r#=4QLU4<+_CY5z>8 zcY6LJ-(k2j+@4WxU5fEL?34U$ut(ZXQzMl%6!|mJHWqXJ z-FGY^pU*i?cCga;4pdrST14(ctIf{}!|UEQO8LF|8O=3o zGAEzYUb=h0U7eyOpFUZ9Af`#M%gS%y#TA>-v9_aM$A9Sbl|Gt1Za=v3x?Pvk2t_^Z z*v0UZ%%D%-|ehyKvUmrwVa!uxvRWmL#%mdbgYmXx<`H!-w5 z(CYr9wn+MTcEpbs&G87ouBtd9?o;)A#_X4^?pMTXUg{gq3^->Y6H^$rb$d3Q0y(*+ zcYnmE^EEX&;Q8rp`E6^PeDu}*#dGhhg3&FnZ`hS+J3V!YYMdDQ zP5M*+al~w}Ij8T7O{JAz;r%7`TM6NT$8t|@+T7^htf~PuPe|T1HZ24T-*LwC_G1ku zPGfckR!*^y&T}8mR7<8Ku5lVOcixZC>@BP)jrF=slI3;#S6SEF$2;0}Qhq%iXR{ll zJbEtcL6=xfXV3VXvrb_{e#d-0>1W&nXf4?&j*8}Tsejp0`IQ+S@KWyFC)GIK1QYr4 z`U8X#3VVF0BFvqSHCdj%qf%*padN-C)<&5vxg}>cHd9$V{1$9W^hLaYE~_A_q@eSR zZ&wkXb#k|G_5sLaxQ6k)i$Uhki0vKI=`QauQmyL^jM@X8 zAfx%=VJt6kTu!9OPJoH4(<)nC_IU1tUsl{ zvy<%n_S)m~=LDMf*F9~150hO9`#LK%7^wK!grZi!D{t%&q9JA|oR6q~fRXIreX?W6l>m zDw^Kc6x=L0zWMPmcTlT&Vo9@pxNo9);;j$;?pHHYD!ycR<-a>dey!DqTO`8Z$#3qO zse5m_3(xM;Y7XM>bd`noB=MzPx1k*;2srjZPch$6N}u7KwM0*ayXx=iBz3dv>2yP% zt$xgiQ|TnSmWc%4KNC0@hXHQ`-5y6@~o)OefE2J{jrfYP;xIRrqM>0WCP5#!_ zose_8ayT|H{sCo&9|Wj?$)epdBW(_qFy3dt`e zs#hC^uk`yX`DogIc&rvPop~skQv2QG`^`3l2_E9VQvYnyjGQ4*QijQq|6Xl&z zJx!-~p0e4)0{9(o>M(37)}zTcuDD|Q>miHk0aB-JNAF5lO_gZhzp_c+h3{?&4{J?J zY^bbk5W+5M>tSW}P<7c<*R9EJfG3+kb$Ue@w4Nu_>$B+g9ph9p{_?|S8}|z zBT&7!L?a-kC_YT$#Kjn|m|s%H61V9cMFZVS%2K!+H0eK?w^b$2CD`$eCIyXZe;)~a z@vUl(Ti+!UUMHOp_6!mime<2_vqDJaXQQTQ%r4z66PNh%4rt{hZs)k8>HPNg4?+D} zxpFe;k&pb7ibKJ5ahA2f1)7!|G+Nz21_O9@%1rHS-ye<)=@Kpq$S`Bd zI_Y9&R~m9}Gw?T~!2Atn<++~KQt>jJBh$1rBUkhp7&-2EyIL`^`~S*gKDZ~GgYYQIiD`ieYzX%%+K$fSrHpMp0lpSPirNqwI(&|rK&;K#Pcheq2xvSZIbW{uzbHs}mu zke|o4o0C0A{#nydqh<#;)5A9bsyP=1Ih!J>2F;ri&((ghsBxSw43!J#7aV)@j+|eP z%vAq*ANP++I?Vby*(({om{G{vXTF;=cF&Y2fi?G=K5f^>qgwE5 zCpu;cV8+om(@iefwIBPiZxhQkQ+DbOdcOeS(+%gxcDp{_*t_wT4<`*z(D=r%v~Kx^ z6Qu_`_?7e6B28SB<4BA-l{s#Nsyz@afXHrQrhB(Ns^ZG=j>lSJ#PJaWuGgc&iHv_= zg0UAKgYS8|iQz!ThT7o#%Si|8f=a~-qs=@VjD3ta%1#hMv*vD~>#%3xM;T={x*-0h0rS-S#iB2VUPaI3l|#FN|%d0gvS5Lc&pGvr;(4y|B-*gaZB6+%pI%i)&EE9Wlx!5RcdvfdE z(-o!E>0YqYrb?BTYLQi${ecJCpR$v&9Y`0eW=}7onG1yk1-+}$J=DePBk?BXJH$$~ z(LXTG)^Wdh>`y})rs)1!%5Yv)*YA>KNwuy`Z?BPW8QMDteetu|OP|ctrt(*P>Gk#fa8)^f za3se$DvC7gj!ETCLBYfNiPWKbm(Tc^6}L39TLZt3brFrzj%t|{VMzBdA?F6xGhbh- zed;aV5`K?hj*KmOD8;Wlgo6M0j_#c9=b8RT_q=_b3Z)c1Q7sthgc70tKF$xSILqXw0ORIByO?GLovt~hs9ks81RtYFYD zjNlH_$MPC%$}#!hxUBj!5J%KIw{)-8&T6674cAQBZB} ztVZB7T`iZMuV;HYxay!*VfI5fa4jLy!x4`nEXn0cR#3TAU2jU zRq!vD*5q(_h7g@{<2JD>{ZU5$+ok+hcaHOZ%im0t;+KinBPY@R_`#9 zV-MU$CKa}6Xy%-F_PwK3w3OnK(nmkLvdfi~c`ETR&XLe$ZIexsi8Q^CFXQHO2mV=a zDp+RA10A(P!%D^MC8^Zvtv=Fb-aN$&R4sN&QTYcotq(frvEKb@R4#CqjM`J4zVw#r zjqFa+`+AdyIOCAxCUKOo?3U`+6Qp-*m|`abqb#Lm^Y_Zd-o6~%qaG=F!Cv;eRjqos zWTv&L+vR-^Wf30SDH=O0ro}U*!^vV3IrjAO`UF)nZH(KcL|_Ix&C)UT*$sL+&N-F| z9xW+$_do|L@P}h^T#~)IkfPX=HjX__n$QB(HjY3lYR$JyYMuck2IO3=J~i#hRrX2d zN`48|z7hJNGyVR`XNZ4m@(giMC5;~4-?O>y!Leif!2>?!DJKnXZ*=*T|3tiwtx(J; zu6i(TgHiDf(c53zUt7iWCLSAh-mbc@^>a%B0|CF6ZRD4n^t&1)uW~Q=mMe?8evH!Q z=(r~I(=DwPQj*#RDaZ&fZ+N@Wj#8{@s~CMnp{bLm^+%48v}W}znGbyX%u1f;{oFn5 z-Khl(Td#p-kv1nWQ(USO+_&4oq*i+5{p|CWXT<&`qH%g$%st1y>j~9(OrAuj{yN9m zV|ZAg_)11nOY$!P_dPYe_pBKW$ZJ}CXuRuNB(`Ul(-E>M#(yU*AO0Xj{oZMWUP`vn zvQ|Us1#1kEz3}IV6V>7@lEh(Z3jGBw(d2Jyi{-d!{aKKLL+2 z$!mTs+?af&<3Yq2Cv874q_E3Wvdg(rm0Z47@Qe@97dxZvDdPPN7xbHk4A@(0 z`>UK&2hyy#$X{xC3Wf;3cpWD)b0lh0eq;b5O?!kqBz5oMxqUCh9!=&8mL%$1PLFZt zXdIdhx$9w{;rglg1#N+P&U7vcI?2O>W<+XNo}wD zWsJ|Y2{b2fGKVX~@+y~X;qS2D!t&?}fBfxX0g4X#9bBLH=4F%jo@@B@+Lhw0ja0w< zJ4cPckbPXiA;!{|_Lq# ztUO|%3RBEMhEEdMYkJ6uD-4Z#u~=PQ~7)@4O+E?KDZu?p#074Fab~ zHw#=N`8FwiV7pZ!t*Y5GM;V9o3maxhlzI-Ug)?w!bRG<=xRe1=H*B{_{l2xx@nh~} zX?;4`0LAf&@!Pl06-vx1+0CX8I~mVd^w&H34sc}+hZH+JzuxLp*R6PpjwBaBB0rJR z$EU3yT~qd4@YRW*kD!!JLPOh*?Hsna9ZzbPac5zQy|8J6PsZt5o8I43ry_a>z(y2hGJ(Y^O~QZo#? zXujXzM7*^qWEZJ0@F%-XDG9`*=GA!<9+4eMpnbOyGhURN$l*@n-P*YR$N*} z>22k);qjb^#PrXdr0365GB{oy`*vU0;abw^sh%X~=^J}zOMG}!hW3X)7HWP+1FQa~ z&z<6{y5GXBjocV-C>iGrTNkyt8-m>8P9^_phxjbsah8_Pw=1`m-i|JO^E&7EpR+f~MW^|e^NtIj|gyf574J{uAC z${>6Cd|j4{&wHQ#m**d}kJpyZ8h0rjxUQC*J(Rw=Q$=$h4JWUZHisg$DMPA~vm%6w z^m1$+$sRA23N`CiB7L#o`$Uz+vu)5FyW8BGE*;kx3B5pI^@~c*X0VI3wV`I5e$(Y= zeR8P<`6o>LNJoZE%ekUwk8~JXv^mQ{2PZB)$|nrVyM3v9NW-l(@38nM+k%F(N1zTI z#-`PA5$g3k^bbot$^$mB=qSfu^r>fL*3IPezb3pPc{ACz%!7AKCZ;wv7{4vKDRZjy zCO`kfvrg2)q}xYmx66{N`I`G~ZGB4E$j*D?$YqhvLyUbU{tryWhb%)UGQ2it88Dg+ zM}*zwoF%EJZEq>MZyaK-kg8y6zwP0EHroE?zTI3^k=@fwU!OXNykNNEEAQw3cK0{M z6YTC2tt1j3sv7C6*iUOPRi(Cg^gg5WoFUy@rJ8)4QqhkiDGox{_2|CMd$HscKN7}R zslC4+)5Xz6357#PxBQ-V`ax9VrRg31o{hJ6M1{pebs+UawwYt0vvhb&sHcc&vg?Vk zmi~5`3D*3Mh^phgPo8hc&!^P1IJ$4JLLt$t*N~M&X`jTd>xxb$;*R^(<&0dRW|sV_ zPwx1Isr4IF6pz;#(5rq;tDSXgCJ*45Vn8Mi*Th*Zl03p?W~1MUKr5Yo+;{LtIM@B| z5)JNUbLg{t5(%wvdr&N8?2pJ4{j@z-HcoWkXLg>K#&{tS8y9}#SLZ)c z&&_hA_{%hBy7k!kFn_}`<@nn~fo@-m-Wk2P6`QFq-6>i>RZK;q46#bS|M=5LRWIjZ zIu=Rg=c84eH?nnp#698kPB{IPv#9Nsa>cdNw9HD6{494~b8FKW+r=j3c}v+eOTR6& zYI{7?vRZ+o@t&7%e8_!DO~t%}tec?9sn^otHtsB%W!%`Oxs&pcE{SC=*>v>pZD#G; z4-CF_5w|^^&?&b$Vq`k#vD_Uo?uc38Pjm0jwP>E&x${{br=eAsHbmny%ZSlYaot@K zjojS+7cQGjB^0Nhx<8~sr@HgBM~q}UMB*6zNso%cU8NTXRo%^A%6q&^RJgjeQ{|(C z2auG~-E4Na*K_P_=~nKxhs3VepYz^}FCz-_cGAjmynI0@%g1tK(Kv@@*8`WqYQ#}E zB|T-T7rpj4S7Be;!9==tv(`XA`zFZ_ciTr())`|uEmXhy-+Y~{z9)X|39rg@TbBE7 z9_JkQAKJ%w4z$g5IOTtBa!HIAU`phwa)r>T%XPnR^xxK$fAR^{HgB@XU8O{wgmaty zEOejxoc|>0RXuag2%Zz=`ZXAe_~IJi_39%TMXdZIzw@t&11&10v(mR16@Qbx{jxok z=ov5tS2qGvAdM*C+;GiJ%y{hONoIem8pgXOx$@FESD)SBj~h!1=^-t;arFA34|m9= zH>&z?VOA-fd{VmYHvfGw4J#ITk>?i^um(h3@?(-sjTkmto{M}BLwz*Q zEvR_i$yke^TZLLjT?m4`a$0U5Jh5TayWtEM**WIY1x{N&^vO}#{Dy>1HQ2k0iV$H% z@?I!EpuU3q!#VoO$3h2V3=n2#Y-WWiC3=h^Rg`MJKiF6m&cnRt#5M&Q=s8obyEnq? zvl%sB6o2{VdbNr~g!X85mO69%o!9B_st2Zn4qf%*-b&TEA|_UB<3o@i_Y#k` zpE-4_1JY*hl}uXe=6!HWUhb%1nSbxW_Tj*@s=)357I?P9Y)eaL;MrU@m_u~7e_LA7 zLkhRHa^oqeC*#QAD}Ac)BAVTB%?>UjgkUBj;K<;}7Y?+6&iG5! zdM}dCn)bQm$G7K3{30!S^GdN&H@VQ_`|}@k)w*xbmJof6+ss}NTJ8$K^^q5ZsT0E3 zqeeNSqWbdS-2ShyOByc1QzehN+>X%Px!^(S>Z;R!|7kQI@WQX zKJbf)CA~O}J#g<#V{E46Mc`C{xt}0g=g|G#Y6&m3m_r{76iMz;KcZqL;tEFB)B5b_#RbjIWZ(z)m0?bq z2FBmGq;2KxsAJF|=i%^bTgHAx0ghL7!(P9}?o?67b&)@BY2V_{!ved`m(?F(t%fk9 zx!*;u`G8VT@?~`@f%;vJ%iPCd?iCxqh{rPL3s)LXq&oMqgf+zW>dim|TVaHsoZnd% zY{|RurG)wwE%SFy|JDn-p_#QJpD3MurVi;k7QeWok`s7c%(2gjW@7g7GxJ)$9FMUB z0TE|5Q3p_w4zOi*X2mJcj6~lZl~E*ZeEUdmL)@<79c<}WUzPpT0+Q>^_rjnrYb!!) zA|KF(?iNlvUl^c7oo8Lm-SXk#=-y!;ntrRWiOl$ICV>8j)OT?piF~Zz>3HF&tIuY? zxuYU}6R!(x!Y5y=GkQ&OjTzYoCS6SwEp(}Zo--Jf8oriO~G@d3*UtpM>X|vzFbKG#5B19bsuf`2kw3D>1a%z;%c%fCUP4EHns=BF999EuQK+`( z^*YQ)cMz^s-wC)I2*oUc9pa_>PI&Pk<;R(4IP%KYLa>3GvyhZgD+q577CgU4+7kK03Lz*OJKGr)3nYII4Ln-U^%QfFVT}S244k*4R2{Hm zzsORCSx8o?Ie;_!sJm(l@dv*7fg;sk*@9K_-or5*>B}xK$!vK?2Jg2}uV4-M8%JL68As*-s0x@eaGlah2lxl_$_BcEwO%uh&O+A8 z$8lV2H3b&L>SZwCtI&^wLBU(xf2|+)_mhsf*Rve`J3mkZKz<`PpMhfp40$8RvDmD%kHXnYuD^~PHoIMr?ySmV_yP3K z+s^X?nLqO5kADD(I6o$TNBb1uJ%E3pTxgxbD5mnYR$&wz!cd&c*mY~kg%b}Q4IES; z7Gnbj2po|&*s$`3@Rd~M(EfpkfCG*Z0JHWY{s9AT22d=xD~<#n`VDXldFirg1Pq+H zf)v*Nw`s&``~%2q`RA+I@B@Oj$d7;g18@c8mJlRB3IU2Iz$4Vn=Jj%swcRD+MDNvP z8hB}HfPsNn^gIa$PH<7goGYOdFHHxq5pd)|&4MKa2F|%wr@w|~@yC*)plt%a^WucL z7#_FfeFVIugEZLw#z*Fr^|7nPlKd#x4DD~069@!YI#8eH`3JCg0FTgF8RiHKP!Izi zt>@kgv!<=p5&}*vPy~T1LKDF^k41R}p$9N1fNk4i&;+kzC`!T=jlf6e0mC}7JTk$N z0`&^kh`&K57Hvzy5sTNqgd;Ln0SS~rfM^apTF=@rrYg2Z*n@-5CQuxc*b!eUeZfmu z11v_is2U;+hT{P9ix2L)?a`bq1waAR_Z zwE_n?twixdt_Ti%^ftiYSUfP{B6L;R13q#aU?bp2%9sTUHymdqkb9aHM*<(U4X_bV zWaV(75ugMcv64<3!2b(lK=SJYWOf*ac|hBZ69HW+c|c%T=#~x9a8QDceg!)cf8(nN z1_Xv>Op1pAfgzNV;%DGNv!DE_%>L29;gXt{aR7%zfKQsqhTrK>(ACopLk)RypN}MVb8IpwtLjQ^`uzA)ow?cmL6#$Xwik+&3nz<41<@yXT2tT^cH-Ddv{xXye zXMuN6dnQeWKl^a>Bdm>!*n%}yTt))9T#Q#y-kU9NQZPv3^{~^G$JWVNp~X+Qqm|LqNId?l%O=I zbV{Rih;$=JgS^8a%DB4gZ)HEb@Ar>&iFuear|whtxeTp9?|wW1c=TtEK8=mZZ96L) z(2tLgB;}(Ia8h(UP2lN$=5jXr1~wqh(4BCGo(yo^z{teb&c>NeNZ(4=0Q3Vz``fq8 z4J<&cBZG(>j^F9zvwr;y-)I3GktVBSVF36h3vqKDBU>_dHo#Ro9di>sAxk5312PtX z(2+Fk$aq*dzevW8jERjE^pSOLOB$FM8QYO@v2g>09E_Ar^zDqvI5=1VGCEGj->?CJ zoZz=oK7J+0;{jB@JjKSz0+2S)Ig&mZJ3BxT#5^U?)8Lm2gV!N4fu07x7a1Ff$474i zQo|#{LF2Smtr z1lhrQ4B2tA4ffQkxqm2R`%*VJtB?)ycm|)R5CS>U=5Joo#@+xdCa__O1HU;;Az=|w zF)@Z4I>uHOr<|s;iKURGt;ts>`n|t7-u?&>H?gs`6EW7YIWlf(oiAUrfou(Ir68MU z{Zi(Fup|f+vp@AAkmUWj9|60|V;6tqNLaW|I}(t$IORwZ*Tk)BEUs!HXcw^!Tps8FiAfr;`mJb;=tIB znEwY(a6+D9zl|t%Duz9&Eu1bs{F1BsC&JRRg+=);A_Q;Q{7cb+0CGWD&KLbT7Ua)G zcic4k)3b*YA}8a7!2SB&v*!n=%&C!9!0A*4g!BbkDhfW^eo4B2IEX-LHRun3b@d-Q zV!qV>&gzJP48;Em>Fn5ULAb=AUge4K!K(06;X~p?{kUYr37Hr{0G<6E;h(bGQ^CgR z5wIVq#4pMFAF<}+u;r`-3K>a)*?(fqe}|W+xps=LKVTpzy9br;L9zC6^mmH$N6S>% zj<@jtdt5$tLTANg$WZyO@YRmZ22|z$cJ8x*jp*lQa~wnexzB_Q4y{*I`>opC3n z_Mb@$^z-jMAKTHc`=ftARa4Nf{{cfeip7pfvS%ei$gl|l7VhtG?}TR{GXQ-FN^y_P z;2Tpd9}l8`gx_atGLR7>xFUGsn0^o{ADaxQCk1M7ot!ja1NyniKtzZ? zIcXrPUm(ovZ}IwX3LVrwVgrZ0*MAmV{Lp8f){0;7lmC!ueHo}dBh&gW4*x5NyJJy< z0Nz129Zy6J7W~ge{VNgWcahD}BPaUyd!jxqvLDLylu3Uz^q;v>h#|#)!ivGs)R}qB z@8Wa_$i5#~@o}Mw4b(>ZmTj_uCH5Y^Ie}^VMJhOtCWrn=1>`vfzCipZ zRDeqmpr$r6=w`|nV>>44r$l_YfBfg62&8idKXO9E-!ZmRjij#@^s_|mbV?5R^Jdd8 z8Q~uy8}NC4y!ihga=%}aq_c9rkm(foviONGexR3N_sa@oX9lIMCmI3Pk6+XXj-zJD zAJh^ES&ISR#{EkoIN46CC77h269IAD{}6zf9SB)ffIxHmJ8F5_^Ph6^-(tLPLEu-l z{Ux3IKREuc5KwH#C=;NtPL@B>3QJ|;jbK$t=Hcwz})ntqWAj-#Oek5oYN0s_G8 z=SUWy<__4ggBo@QIu@u%PVu?ws#e5Y7mkoDIzvpytTEk;GZFvVFXB&>tL3Z zYu9?-eBn|?;8q5$dCF(OI4Z6>nd=uUGXg_1Xrpc$(MtI^e9qIqbEov9Sfz_zMqEe# z(&N{c`JF3vrxp=Y9X19%ZWr%Xd$1J6w!6nMe|EmJ*3EzpZ*F%<>jrF^m9pb&pQP-) z8@DgkHNCUgPRib@&&ys-R({wYxplQgLo6>PO64-*RXDi^36?dFRbY)5J>=v*;~ZY1 z3HU^9x1Ajj|A<0e7QHWn_Hbv&u7py6e=(cdHkUE1?BNxn#d9zj5-zYmwS>O_s1j4t1Yg)unG7Xzes+14{jQlv8k$xyN+mlQUv7Sk zf_=_;#0{3R>l##B$*n4cMe>SyBdU0f(g-!q^cxSj2F}H9`FWt|Td^Ao`jFae^bKI? zy>bW*n`w!A)e1*ut=bqX}k89ouo zgjOJ^!Msbd*@yUyYrOVcKFy4wlq3o|DuY<#T@Tj4U4HW{R^{i=F2r6r491!tG@*C91R~XZ0*j<`8s9RO$KAff(*jXa&{&X3b zixhIFZ@5C;x7+gOZ6htr;-S?>&u3SRteFspSoh`m@$Gy!_!x2L<}yvHoOkj~s|aFS zClHbm+Y8Sbv7*fkCS}&DmI`4TFCfI>t*0*~J0`3O_gm(qO&Q^x^SFvU-KTJfo=IIP zS725%M*U%4;1ljk?Ai!L(d_bpr(}LeY(DICvrbQ=@Z%6xkZvm;eas+>C-S0AA&H6F zK}r|U0^x~jl0`EP0%~iTtcj)g@7K9%Of zpDs|mEDT9k7xCacD2-cj+(okuf5cgrmDTo?xb?DbB6BdbO-O)15SNdC1&;5Ce^#{$ z^^%-@;U|iB_%8ZTUekm%kHrZn#?kRrt3r$3XY8=-UlMr|BEYnXNNGlWV1regLX1SY zAduX8#W%K`X)G;*ph15A&E#l0#xk#5B&)Dpg?@OZ!YrXU)h!id>RUpMuzBLN zZnVO0%kn{jqq`GB7KJ`Hw*&*K*HLh@U4zHAxnd9P7r)c z6kiT?G2Ligz!WiM`(%`*y_z{x&sCk|k|E5jTQP6dec!Th1!C->etaJYH$jZ?I^dQl zdRze8wayvqf=2fKJ?`8YeCsNBQs)0iDxZ?-LUwc^^3be+1l@pOtAPz5C=YMcG-35PN* zxpz9>Tf4uQkaf>xSlHKpC$LXt{3xelzs`TVd9xOYT~O%NNC->nK3v*oO6Ip%qrE1F zJXXe2{5f{n{U2M%UiquEp}R`Dx5po&m@)8o+NlbF=)f3j@2mIGw^7b0>vDP^~ zt4wBPCy^gog6EQQx?()&d#G2dnizROXe8?L8uSAXIs4Y-!E6;85e^SmKRe~^+bb_B zfi8EdSKbis;OOsmxznJfX*4!OqHqQdwhwtS7a8}P3?cFAs-cM`pv@0FWpTCoSW0vO z8ZC=G`k{z*aRAi$Vj9;1&r<4CQ~dW2G|j2s&$&U#-c(U?#ANozSXN*`v3^=QhU0)e zDR2HJdyc+tAKK8(LM1ab={|?D0!y;vy$4mHXc|g2Rm5HmGJobxb;ls zb|!7>ny=5&1QDXI6W-AKfQeVl4phNNBJ zHF8_0=Lg2=lBY!8<{CIdVB+tZj3pMPA>=;btlR~-wBwn z>ND&-Z;y0ujq|LJB$;UTjBkpeP5xkMv^XgObh;3L>Vw@BERLklj(0z1NIG)OU|+TJWtc`cNSx>HmANA zuHA{!8Ka%F6nJjpnIaXwN+hdSroMx?m!}dgTxuK~gB_7Z>0_0*Ex^77#^U`=w)3DCLI=be6EOrD=EyA&OkKwHYCYE zrSVGWbhTk;?IqgI^>C+P?AoL}PE*)V*U`K*2`FSpKRKXxigX2DK}UWaaNlZNz9ZGe zn-1MKXbmq6%N;QMNuuhrJt_mQ_;k26&ogb>Z^;JjElR^V%Z0)0P=Gl~rW5IF0tzM)~(qFa~LYh0@GwrDd#wCkXeFF&Zfm+!UX6Jjoxt5(~6 z`Mi2f;yqsMFOoCQy%_pjM7Wh_c5y(sc*F=A@ZnxTwJQg&)(Kjp0}2O|Pq zBezGTVdTwQ1m2V$@)`vS4!#|xarWU&H{%gZuDmzM{xUANDvi9I(E^?04&4Dh)1A!# zgkCx$V%&bFDDI@6_k~{@wFL(F=1ov;_pEdDq(nAT<|8L^&8wa#_+bp z5IImONI?^~T7PahWVI-;xn4FcT>IXPs=VSp&n=QB+1D<0j_#=e=dF2bd`a=3^Kf=- z3qslm=3_WszzUJR3e?XY54Fp1Drs(`A=RC%r!p4cz`L{tm!nlVAfJd4&GLMxL*fIX z_nOa^atwoopbBOSmOF}VF#Y^}Gx>Uw+9DyG&SFsL30ZLi3@wZO>U(Kaa+*Zw@Hhm5W3shlgSBZQDrkOA9kn+3BL`)*Xg z40bfoh@O~v#z?G~wX_)V(43FE?D`0KAkDq`Msd6I9t_FElDrgi9BeJfJ?M(p<>&#X zoDCSk@oP1c=TKM^Z)h%cc#$W~S{Bk@M(>vUn2zb;%SJ@6QT;g2q|>V(dvEpNS{bRh zJ9bwXBbH`xnafg!gjJ*{W2WJK^Nxp|+;>XKF=H}6enwZS$4~#^o=nca0-Xj|w*D`B zGC3h3hJV~K077;Qz>l2NG5$^o;Z$YoTe0A4E#a4n1>Xu(;9ItAM=L3h{`u!RZ(mkm zo>g%GvSJBd(R9MnAEf2r`V`myVfE73ANBjy_$VIyK4yQ91p`3RAyaYWlMF@~pH8vh)nziFBe(f5$*i^YE)( zo@(j+l8OEw>UqD;w&M*-XT-Me>a!3~)n~@Ge~(v3gP3R5^!l!h{M(4y|6LV3o;o=z z6@x6lf>&n!Z(8P=-mnKk){7xPy8j0(^SEtuRw@P=o&7eJ_zx}f-}7Q;IvEIr9Ebo7 zwg28g#1DD(pExLwr$f$4#UKMk2q5w^Gsph|+rI4OJu9|BhPDtO2mf1aJ6>0DR&0aJ zjUZqd&WvsUnnOF=Rk%RN$p5#|BYx=6{ykouX}He?IgSAV194`0^`G!!XBzo)K@N~W z09TwD+x|TjJJWEV3o_jQZG4UYm^q$ljL!ub<3pfg{H|X8cMCtq%dpRCfS(I8_6OgH zKlAkR-?Pm#js3YGV}A(vk>Ay~uSK$dk5^|J@N+>1{NN3f|2ukhwwtE8AftTns?Yx+ zUY%)Z&jlIUgBJ<^^St^7(DF~zq`^gmGpn<5K?d{?*ed`3dns_`;LLc%4H?jbyG{SR zHvMQ1>OZ1aXBx$GLq_oscr`z0ID#9=K+ru6(7gCbuMgb$`)RN5%gV|>@AZ9W{-=kL z|BiBhJ$C;KS=X24`DauF;fBm4AP{DLi&g(xgmMfea8{8oH)Qqz*1q4d{Zlgur?l!v zw;E38WT0Vp@In&seP1yrI|)TQ9XkWi1|SK=-*gk-t~ea8zX#dfFLz17m5sCWvXD6j zcn|Ffr+?r%z@rL4ZqTLGub$)BkNl$N0RC`a;dgZ|2w0q-5&^ow^UZx7lk|&3a2{QC z0=*XU%H4MbB=GW^zvKky2G1!@fJyo}5x;Qb{kw7ucs1(@5r4-q{9pnH@;2GOKP>SD zk>ZRzD`aW|UNCyXzn^Ln=pN1~O#+Mb=R!QrTL1JQ{H{*)+u$&#T-Is#^zVxfT-7-{ zSM;6ijyQcHyWi9O(_A~n%>Mub&o=*pSk(mqPxAxaKfVkG1YQ3EU9jQ@TicfNACio|xd#(hSgRzjNl0#~K6#%iqzZQ(E&) znf|q43tZhgJG+A{ar_lh%omA)*l;2)u<(8^u3zz(kkz~2#)`Kqg!e zU@pI@Im>1g5K)Aut?mLY2}5a=`iTUJsUmKu{ZATT-)!)f~R%t6yLtOxqpvs$EV}jWIsU2veI9n z27NinSwK1L*CnMuR^U%ha!6p7AKxbVuD1k%8T6Ze;;XR!8)wp)w&b`W4<#_Cf5$ic zXZ8IHoZcDfJ7k&gub_yI^_`Q4l^Il5ISF3D+W&KvKb}$gl524M5R2%$79j){(LbT` z5U1q7=D5Ce1kOm1km=eVk(40!fJ34sKyKImy6pP|7vM*T31Hx$>i`JEgkz*4h!px8 zz7Pm8;TZD-0x<#nqZ2dzikJXN&q?Ne2B-|%cA zRDj2eVgV-wjHA{G=(XP!FdzaTAb9621n2*cPz9%gp3`T;*E99s^CRG0)MwN#!5Y-GYN7W1^C-oWk2NFzvdgx7I%^dq7DT7BaGPpFwJUo8I9p zuRB7H7y%(5(SEb$cv|`Y0~&vpIU3|_3aHg_O4oj_@$9V3Alo?6c(DHeT;q>po2EoT)4cj`Ir+0p(je~;0wG}MexUN;n*ktr-qXcQ zu>Sv4`sVDnUJ+)BPSG7^UKb!#}VN@bo(e5AgJP0JfE1wT`26 z`i~J1q+YN-W{4;KL~V<>?gmtJ$EBEuQq>DLcu?5((OYrV6vy3?~cp|d^i zANZzLXYZq>Bm2wB(ow<_b8Zf`G|BI37r4eiZd;A1OruPxZEpybe#Jf`2ZMC)}GUeUk+pz3W8%)Zg< zN8!>1oi2~rew#HMxoA2du^)z;x+t^;ida8d|V5{QMT-xJgGca%lsEZ$GUpY z2W@M}-oiXUghn*u*-c)`Jy^q&;7&EGurXciww%o+nvBsY9HHIwaIk`dpP>&M0-`ro z-Z84Cz9hFW$X~-zR)tb}L0r3)z5b>$Z$PwNQ-0;FJvIqhILy8I45znO92XWHqnaME zwWr#}Z!V6XdzNFBU}Bj=`l2(#hFME=dm2$c^jwVHcu79^8%<`GUX;-XA;nFnkzlnzw+vw$O^q(eVj~tBlS=y6a-zFpVndNyztR`YHp| zr?(X}(zV{A^pxErsUfFoLf>|JZJ=V6|9WiPu~p8c)ryDzj#SZnx|oZux|l_g<}_BY zN>T!%R4CKrdQ51KbcPAjy^ia{tFym?5U=y6(bh09~L7ngdE&7iGBc2))ZkA&UI zevVv_z-cgisZq7$xqK71b578$w{&km3O^G`bt}&n*Y5fOy0PS$RTMejP=iXMwa7D0y>&Lslnqd zO+Z#^2c4^o5@T1};RJBSxUQ0wTZzxr1j$I}6UsShA9f*HOpaz20I^^3%_@oJS#uJ@ zlp&uyb;6BTQ5vG6g-Ma--e|tKSAm+fK(A20u1BAG-Q1dc-o8jQ)ug|Jv!tWTh3zEQ za;c>iZ_PRqYqZDykg+O!P!Am z1vK3#d+G)BH#S|7C*kNdp^XjpPYnvS@yoI8mw-QmkK8T3F;g4Ya{EHQQ#V(PpYJ1X-Yah(S&S#ahTIy^W_4sexYt?4S_;4ZQZ0h>WWvlD9sPk%zxB;Zr@I3lQ>U zJZH?FI?0kb^xXO}rbWuLB=dLe@%O6puf`P240o2@z)0k!#@Qvgfb3@|q1Po%wY1lNdf)_EN*+r*(+JqiNTIzdTTvI@;PVstEAVIlCtp7#asy|@>A;d1O97%q)% z&pMR7yjHoe$3|<;BGSqA3g&N-YIz$SBHoaCD4Fnv(19>2 zO81Jrf<(7+IZ56%)4TotoU{Pd1esKooUlZSiiJx;z4WQ`{b<+Q#AEldieUvC9Ih1b znO+WiEvPzsdGB!a7V7H$yFtubd*;SQMe_suj?um@djrM8LqE$v0%Th-Un zd;jK6EGOIIB`07ujO(R1CzV_bd9Om(0w!;bqJ_ie;tJfpnfBrp`3^uey<&~X?ZcAI zL#8FG+pBrg9+#s#iU{$#Mx9bo!tGmn?M%c?d0Oh@6Qjb&(2Lx%@5JamdZ-snLqI^F z#uIaY4vDyi=c3cdb13~@t~Xdy%rbA{+c?#ja^hapGx4i+e9qvi%XX`hedJ+_FpY%7 zF{TTx5x9dja&>~Fj5Et%&QQ)de-fXFD)XL%&&w$BrjofNsxHH&8xKW&pOe-1NMfV% z2aA5JYLvv@YEz6^@6PVYd7GKMznEg9*H~lr$h7lS2O2ZB_$)4bIOCGlM-jQ?TK^Vl zsz>7Hx)%mZtM%4Q8I5b_=t*a08{96O$GNvGmZl<;{lTV)kdRb`GDT6W@RsAPJ=k&l zSot88_(B9P6}cit{h{70-_CnQ(!(#5>I0)^uk@5fu(&a?h%xT%I|Y6cVmkN;jVu# z@4ecaY-8E{z+ip&0&237F|%!Ar#MAe+I;K`o4z1dARq=iwDj@=s2dFBmxV+@@C0y@ z{F+Zce9HcGQDa{(Xdj-T(#I-A@@~3J!m>rUa3aZvCz9Gk(#aM!j~DM~g;S}jl`>5E zB+?_TGt#sAMO<#hyKseqT8*Ppimy+A02hV{5G;A)(F0Plf*e3+1orR*J#RgY9HMx! zF>CV>5=~q&0iO71nD=~OjUm%5Icy~A24}Yjx;hcL3%>gADO18exs}s#h{h^+B;UzZ zQ_v6OP;a9RM=XoYqnb6PL06N4Q^WRnqN<0g{f_R+ytDs~=N*Y6V~;V$+rvw@2c^1@ zI|n9{kS3~?J9H<68nLTQibWXB=8#Jt1hZ{(xP7d}*$nL&y&iZMubb{YCkJMFT` zT8Q?lBO|#h5o@-M7->=lVW8B-i*2yPMb=DnuN82$niq>}Ma1aFwBO0=r)Ym37K1O{ zfKqy_Q6JyFMOqhaZS5uH41G@_e2<;JEiz1oxxr4o@ny}kTnSp-oNE-A_jT=Qs|Xi! zIiiBYm$n8fR0n#{9*d-5B6r>rvUS((jECYEFb?q(icqSkn6BhtSE-?qXrjCPA-he+ zwfLH&!Y87=u_D*PxEKK_Y&t&McwsaJshNEZ>)YTVc=8%f;)rQ8#2?e zI#&kMG5Q!2GdN2D-#ZcFRU)Lxh6gJ2_aCCeO&V+&9^A-ufc)_ze+fuXGRmbyF@uQZI5w~i%D{RM$BdDKEUk?W3K6L!!{I9{Wn z<<+a4DI%N;QBP?YjOIL}IKzf#)vgNBuwGcf4y(W~;>HhVnUvLgQ9{_qE+0lgP4{^~ zUKAbA_8cBDb3OZgWS2_z2DBa=_)36Y*Ej~nE9}*$!5S6NYRvYTS8p+qIf_OPj@@p= zUo_rS4R&>oHIxvMTia-=ddyIXa)W?7v|NR8KPfbNTIT{_+~`KqTsH^PXD)Y?k*c1! zHAHxpwj>Kb;ALUoj86`@$*As^n%X%5opm)>Snh263dSZ%zDjen?^fCNEyEvIp(V^( zcB@RW7X|K(ZUIA=%iuC6kC4PrK>#prO9LFHYol`noG$M*h#wB zh)=VtM1wBYvc@AmMXecf5jAtzA6G)~l|w325cHvtMM=g;YV?MAZ~!T9G^)aAQ)NM2sl>pypB zsQoUanbkN4Uq&KPzah+Xl0-Vnc)`cjqv2l1fXzX(TditWO&pb6?_4f#gplsT4+;eb9}4U@^wn>oBU-L(>)3g^*+qrn=|TfSlFA8a z9+*clEbUR|0N?W78OjuD%3n#rr5F^yD2&E^InW2LpCXflFg|-2cSovW(|vf_slFrn z0hueBB~mGG*+^_W)>?%1ymqEOeW4}YvsGk{f#GHtsHFHuSb4aMSp%BH@iYxjQ3cNr ziRuj1?dTR)(m06OsfCH9*m$2G_>2ktesa=MWbH2VK~q+6gvrHcWIaN+yGrEi>?ToV zXv{bRnqBG4sRcY8o}m}K*%oxWn{wrcC?-HK&gMz|>g$j&;G~>(!^YkK{8R9pusAp1 z>)f=Yfw_Z$or#_fqp+2^KH%#hx3Y<)kfp83*Y6=`j>&+>D4_sx6B}DQ5n~-2GIlnA zw9c2WK}ewhWfOfnV_PzI5Df4a43Tf+(Z^5!f!uHN)!$~CzoYNZhnjgjIi;Wu~n)5cI2~kEi_Ql`Jd(l`l`R zak2oU4RrKPERD$6*+J971{O-7r@=257PfM_MaBer8vI^lY%HL8VbI%XkU^F=Pxrfi zAQ{N9dPQdoT`Ti%V)&DJdf+iEE95-=af=_4fTKYwFt2Zc#0IY9o}Q;a{?UmnzUsvn zLQWLu_Xp{LU(jB@SEOTv831^Y9()D)IwbX{$9;ZlkRAwrr;`u*RT4i^x-TF8&y|gp z1yb99r?d^o!~RX%Ky&2Zw2hUOmHo7~aeSw3$0`P7Ii+GONBRXMJ9?4~^oK#E>?0n6 ziqr;dVDkdcazii;0=fL>)ojqHHn-~iU_4Dy>0>uLq0H^Out$iny3bV@-ET4~m4s?~sE(;8 z#^+W%1cYkl_0byj;mwRRrcMlP>~5}GNszuC)gV3qVXqhPs*Vjm3mFxRf3}q7SW>bO z2*}g4Zyb9)7b3{#;qWQMzMNElYkX~oy%%+wbb;#eZdv4unex5W0Svb-_xWebj|GYD z2rO96)^o>IMg)&MWN^I2WqG(ZvTj6*{@H%p3w8Is#Cr8WHTtx7ruXt{$#Sh=qM(b} zll+Lf_6H`sDWifUInv0i#KXIOW^cqvhWkUu-$(587LZOTZy;<97Hi9^S zyu5p{oMEpq7z%l>aotF;qSBPbl<+d^=5&u1*J+>5N!s$9xv2q{fBngH9|Jz+!H~Ax!TC?!M+XI*&eOyFPOsh>j_0l2oM7A}8p;$kjKd39xPX zSbIT2h&zk0vFsrqX(FHdhHmuc8=`ds7Ol72E!yEMWAGp6&yg;2QQwuKcZr1MCtBpH zhY9RwW5tR#Eqpk7?oMVcXCJhpCP#S$plRNBlWM4C4bR9z*`njj9TohJ%O05aPqb6Cccgu

    ~;9Xo)x5>|!tefW%xF%-GiJ?)tUqe+J{#5v&z>Y8E=AzI8V^Ye%lIlKruGxAr zOBP$@x2SgvQ2|YG1X$Ky&1JnWlSp?fI-%%=^d3GO)}AI%gnhffie?>A@<|bAm@I;> zi1EByTmioMlbx=q)%5#8taXo?+nPvstjEYqN`lNj5KC&HGw$Ebc4KD5c$GFr$|+|o zjA4nBOva0-l5DnkT^55i=hK@2ahWSyPi49oKG@q>ngyYw_j~8TBBe6h^tT-Fqo50r zguQRJ!pBsk(@BFNNR?g8bw`YyCbW|i5k$&b6m!)Raargc{1j@sX!J^_FOQ^bfmXU? zY%|iZk^@*2wBX)i42XAiwA@;B?AB7ty*a?UT-)~a0ByhJz``Os2G}hd<=-KVPt?n- z9x#9qkLq-r!-!6BJnvD(V53n@?6`1;I{GW!LZipmRu4QJ4qP4fN#w<=XYkwQ;dPg& zUJ0o_2y-!ha-sFnMk(L(@ZM6nE*gupiw-T9gCaIuhv`@D#wi8aK_A?%EsjBZ)fu(v zRrj2#DWz0M_nMxp6kd2`ckp&TO6!`o=G*~UT6f`!&-=^@WS@ssyD&v^l4d*}vZSG2 zgU$%V0TQel(juK7#2C;mXpB>O3TwidtyP@s;?rk1)}4Af`*%5W&M^iO=_6*2C=Q1; z+1-L!lk-&nO zHKLDWE~O;oAYmfr^{g8k?^Y?kmqtc2b%nghZDrLBxZLFe>cwKs^HfR|P-z@|k0Lg? zeNZyzmU8kE>2mFcUB=iQ1#5Z%=yDM~*auGrHKG#(O8CR?IqAEH7*f!;8)O6p#=9lD z&1QHywkx9phw~eab~rr@HwOn4SNMwW&SvYNc)uXQ-{|g*=Oj*}U&`~V$dBaUeM7=8 z?Yy$GCXnjKV77HI*hSQG^`@FenG*W)N^pe@$t-Fctz*5GR`NpbtXIcNQc)N4DeQYP zmvIoR-qo3-B#?f3RYXGx#iZk@NmMH+vrLQ95pQKISg zYip?8S>k}D8ZQ27Jqg%BRemACllV= zP>X<^x>m+POWFgzjR{GU1V{GB%~yCIUky=zcDzn%d)a`Y`u!8aeRLARFn^ejx55#z zil$1N+taKgg!-*6!ceh?vNl~JyfKLTgjh_N3cm~B*-_(Auek2aEGMY_)K5Y96+Xx3 zQ8sqwMIJtajzF3vee@5Q7LB_)HaBq>hENyIaT2Nr8UnhV(qg1OHK0ifl042$Oj<%z z{oJRrA}2me(t*5CYt|#`fBO!U7kj_X^!@? z2e`@Adliv4@1yB2MO{VPq$0In&a3Eebz8@b8LNI@iD6N5$J4ojdcm~{qpCSq;JwRW zxjK^{(6opC99}so!Nsd67Wd02cF^^~0jRU{^sN zKt~7G2OSZ<9@-t}F-1zT<@02Av+69|*5g)p6K~yVSf%DzlXAO~Mf;R^GBq;%MfLL_ z!aK@nWQpg}YSC>tFlT!{(Gmr1X6BqvSgI~BynJriw3_))NlQw7VC5nvwxHT9fL8BR8e^Or2={5`|PJUO=@qw%*n>^->a41 zTxD){j#wmgs)+sEq$3b>{tol!FoWE%Nt2GSkh;LGE3bqX=Y#5SZ{7@xr^-?Yc*jO1 z3k9R5d)@q%tmbWkxD|68`O=EHKIaPt9BR7HD;}=(A_x!* z=l3z+--5%ShW6Zg-?BxYf1Z{(vHo% zOEu>Q`ZLm0vdc2h`HH=gaCcXD!+SwN+wqFU0+N5W^V6$O3LRyiD={0>4KqW{l=EMt zUX>XTGG*wa${2_q6kVV!z&%XiiF+evh#)XdYPoj4u)!4?b)pJYZTE7?XjGqjY&nM5 zkXh3m@ldAEH@f>2cDxcL;VsH1ZwR9s8=zTA5s1iNhe{%y^xkt(yuVIQh}v(!Z0v9U zeqdMvabHL2#v3Ljv`-#{QSlu1q+EopGn$6m$Svzqs(ML+j$3bfR-|qxJsPO9F-3gS zkanwVdbm_P+9BD*h|7rcM*sPmEN-(z`Acz2WI>sfFKZVv!C8hTwZn1v!;PWs{Vdk-q$Q*5* zGtUvtY+sy!4^G@B+hpxqgvAf;w!Iz_x%0sGzJt{G{VmFe%ae-dC=W(2H$2cXox!xn z$D@gEdCcl8JmXh7%jXg>HS>ho@XiOu*=s?Df*gSPK=i9(rO!<{pIvJX3Xy&<`(z)G zO>sA*dMIJFbdIy$)eEmP^ct>vP206RUHSQk0oBzX`Z3;mObNoo6Y6w_6(UgmF3IJCb8cXtPnCVcQXGQ^YU(=~~68h5L>iqK$t;^yDkJXN0*FL=Cz z+iJLfeV==8TcJ!cl$}&is-&JZygXz3eHzhAyA}_GL+G~mB(C{(fT9VLCN)?ieEL~j z0oj1yB;j=|9}Yy+>YJst40z!a*3;ab7Y~!W<#L~$c7qhG&E=q$@S#YmNg7dv^PcErj^a2PG09R*G668^cLboLGbJ@mJ7Xhx=TPo> zBjj*LHEc#A5PL|4Rlh*YwYy>l*NZ#AK_6#&b-kp(g$W$DtIJU`KbkIbl8(3*@aR)we7Wtj^10>hD#;Gkh zH0`ja;3_xQVeiUp^<8s$j^!nzfjT}{9O$((&$2v#bsrYtb0c+6*u!!2u26nLn#{PT zmW+3O3>Dr}SU@Fn89xiIx-1>552U>rQ)q$Vl!Cx$IFfC`>Hr@x)lcwIH6X#$l-xnq zH5x__^uY#a%?XjMFL+wWny3qgS8a$OvcW~aP^R?KPRe0yF|{Gqxi`f@&PW~~-6h?& zT*PPcg1l>j9Uw?`jU)R5EMo7o*v?{a?x3=n7uT$TB5}%kFFq9$&VZ&5jzrk66o7Qu z(1)4+AhNeCf*@UCb`_fojubO%J4+7E{h_<*YrldtMg;<%?k9IEi;*LO385mrfahA_ zN~8?Sm^)H*^e51&KXIiQ-@xy8R40wzm8p8B-?Yg8#M-(TBSf&;W^(uq!7a3Ux7oqa zsT3B^Ndnn>_Y%U!KPL{0g-7ks1flM+OV(M{gxtnPOUbH|}?_8g2f9 z`X+n!Q!``_D!*1z0(IOsWyE9y??W#_*^9fcKw-R{Dw*F!%9@r_ zNUo5oQ6zrxs@Mj>yGdwbhKrG8eh>Nw$r0DD8t&1C;=EHNDrao3srSfO*nI#d^;X@sonq^(qISwML$xrYyhW_ar6USR%=S z4-4(3U!|I5h&B*?U^B*zW7{E2BeIXyM}M8>X>nO53%lIt0Z-Z`*}aQmY=_orM#HFD27DosHua;xqdg$ zIs>O7fl9-<(EFB`*y_hCpMv!z$yMR#3`|aST4P|`)ZW)P6l1nklV8cn3oJyA%?CRI)SL; zvksHb;5RxKSN3iuFl`&*G;?LiE-Txs`8tx`g(5|_Hh>|6a=r4g#>$^tHhm8eJCY(P z#_C7&h%UXhA(-a=pcue>X8#7VRQLv?rpl8Uc6v9fU+~2CA!`|MLGQ{c5;}WZ)lHiHD=(VcBWtOx_tWc#~kQVL#@V$ zsD(arhfEyi;pLi`LrGi3qUa#44619w!TxsP#RA2>1nj-rmAW_y=JD9C#;#(vCN5julgfs9;G}6(j&%tq zji9hPeLh%2fgVxLz*!2nO1rIZ)#?1DJKm_BJecJKOdoTL?_N>0tbu<;|IsY=d2OZT zwFaJoFz=lEA()xus_$?y2M^pSVFiX@3a|GEo8|Mt-H9k(?7<2ZHdIxb78HX5UW@Bt z4DIh}ZLOeQj-a>XmWwfnagCpFMjEN0-7H|l61L^bnD1t{H1NIA3tV&I2m?(E1?w1X z)xyuazpnPelh8Mb&$QDCxjC5>3P)rcgRqY*f7fJBv)Mtt@Fq18yf>4&n+Z!{p?j0r z`s;z#NJ}2a<_8a|_eQV5l=VCIH#KP9oW4y7e14!CIZ(pt)xPR$^P`L^&HT|*-9nNU;dQ%jT3(va%f83=HVqc3P)lk*kHw>$JhcHSDFOqKPzmc{ zLuVt!*sE1R86WF!Yw}PkWFfmA_9}6kaV|73_D5PFy)=E(VYfUt_fr3SDb8LmlPA_m zs~0o@9m5Q|i+gH@PJr{ad5#KJwM0@rZXPHFR?`^EuQ(z)UkRWAR&U!abJB){3~YG^ zZSvE4Q!owRQgtn1bQN)2LKflhK|BaKIQ8CtZ*Vx8!U1QKd z`7vEvF3dIYii0Tl=>@^gNVypqqmnl$&7K3IQ@y>SIid>K1=%q-%$tep_|DPyM{ssF zEfnda=_Ce3nKi?xu9-5aLOtqJadj7ouA#cW3gzF*dmsBFBARHp4!+)Ik?}2Tj5pS> ze$=v|Ok{?`{CocCgozK`pPnl=xG;-&q5tspmAU(HamjDCipARUb0)j+hyawzQoNuBFc8l4CM8Lg5o{ z0aGnE?aDIN$CJf-I7*p~LI+(&yQEucei@I@ZQnMzey)2!)YN<l>2}lUi$W=yD8-)oJpCZCd08Z>ArxahuGbzi%e}4| zgivaZVul<6x1erG=p2#8s4LE)ZuvGOL#O(`{ULg7}xxyZE@0%IlT*q9kj-m zm5h^}gBi3si4C;I_h>mf2auVA^N$nqLZC(Z;MRwbo}G!6B|s5y^ZM1J|LBbE>~8Y{ z0FI81%qF&0pk@{u8?%*-5r7`l&iZam4macu0`{Xjb|(b>yxYLeal9zzTeqQzNW*Fv zxHfY4&^s(+gkm}Zn_5Ar-8Zt=1kJunQ(Yap1f9sm;=F}}hKt*)&wCSLl-7P149aG! ztCsIm_}A_vjyu`gR36&BdOeJnr`*^6D}zZOUb#lWpYDfcx<~5xW22kf`-nFTfg@3!~SFc^I8=L?t*;V z&QoE}26l6ADYVoxGY-Sz7i`06*;uzFGLL6#=Gf+2(B~ND^Au|Io5ZPVU8T=qlA>&> z!crZslJI-ITo4h0Z?Di>(=U8=+$r-?vW#^l58w6{UOjN6O3o315Pgg_pDA$tO`z{} zxP2|}Tt>37+G+g5DxVY;H}ns;H#ZNIebwD6Mn|y&+csw#(XY`I8YH&{yfyU~(UakNj6UVLrdrQ)vJ~1kl!}15wWbzdRg!nXd;IN))C@XiBu?=g-Hp*(50pB{fNIr2^U2isa%Sw6FhQY{kBJ0EAaDi#~! z2qkKUh)K#Xi49DC#9zHNwPO*8OJ&(A$y3g0n1m&}erpOxOEqJgN0S#b34;cKI@kz3 zVGlYdFyopTZb|+FnCLS9j#aX8q2@tM4%mV$Q6Ag9EF89h|Hs~2K*y0K>B3@*nVFfH znVFecmQ*EXW@fO^0*fpQEoNr0z_J)EW@hQBd#I=X>D}3#f6u=2&QzVFtWsuHX2!iY zBEE?G#eLBL01Sc%MtiQ!56ZN>U|dnRT(qSRHSQjwQBL;yY|U{c+l_OEz@=jR0OX*mHGzXh0-}VWECyk2rsw%%w~W$31`%K@7z_Rv7jKe zcUaTwYhLbn#(NYt>+vZQk8exv?#$nViY`upnwNiJXHydA-n46Lo>~EQ62K zrRbe}QIHB+Nn~zji(R*T@IZGmfOmQY1v%Y>I%0?;HGMR90%Q-E$`6A5Vffx{D_&Usg@&+;D+^O20-?gqB&??hV!MIu09CGaaNJ(KDuy<4j zyA@)XsV>9dT6ZdOCZtc{Uoz(^re#1W3Tv$P0@@~%8Y?F>O)%#YZm3+4uz?E` z_0cUSu$mlKS52-?(FJXbu{i6z%NY!Te~kItS@o$Zg>dk3M?rTS3nm|5F58HFl`!-M zML$OritEzMw2F+1ZAx5#X&;n>7@m;pa_uo!HK0dd$kI77>E?$GCX4bl9&vm~&UZ!jM8EUDIMWc`KH?@8n)+J^1E z|E&G4jz5BWnXgX^QG*%{*QjoTtwsu0|JkQ&uj3&AWg6SZwH-edcb;|!J69&-rvZnk z7W}=i(T0#kSM>#wg-6%A(lpFxy?Bzu&7#tgf?-ju@;YaBKrzhboGkcCYf zHu4Zmdzq?uYhFPv7-7etaH%>S-S|?ve8+|%m0N>f+lZ~H39bgK><{nq zGy(2UWSG+u&WXuxyuZM_1(n%XMdWCbEDL&7iMCY4fRniOIqih}u=P*4-zTizn z`NZrO7P8Sz62I_g8BeiSK1cy4H}*r{m3qNMJ6#2hAKF99jmi*?z%p6n2#eLm>p6@JNHrcQQEILvvOq{xtqe%}*Tl3F9%XnQlAkSeMr0 zy9M(hU`Jo0)F78h7gbc`VsmOxv2jC?36ud=qdH7{@8HJ zqKXq+WSH`nd=mQ7dX5h}b{w+{6+6!FYEsqt??khLbQ?3AT4=pV*36U}Mdz}C25#c$ zw7c}#E5Xr0`Lwa`p4(HJs*1lUx@+_Xzr?t!cvX6;G*@6Qef;}{_Q6k#^(QK# z%+@}6-TfV-hR&`s6!N1}!}Vb}YJmcV;p_NQE)Lotq8 zG%6H)VS_Giu#0 z8+3;AgQh1}q3z&(r%xHJ52^W_jg=F^%vqxE(@^NkJHat&MG|gVY8gMx557ZNqtZO6 z!njXvzy)5Yz>dxhJAoSvHE=HfP^Q_l)PswQyhCXCF>lXg3p<8cF9(M(1M$?Kx5b7V z&8N#`9E)vJB~D8ZO|15+WFUT0Nn$YD92>xL%5Djuygr8ajMd z3c_Ail<4CeCR9nQEQpoSExkM5E*9cI{&Wjy_Aj#$*Ku}J(z~`x#68NIHe*p-X!@dk z4MixQ_w^fa0Nw|zi#M1C4P=t@)chJU?bD6iv|_E*SoCXs0H|=*k5pNa{mAagH9yUQ zO)8Za@~SW?oJ%xUgdA!y(Vs!gb{cG)wm~_i;%M+_gP1~v&UE5lE5|6V5FimoOt-N( zP48$1YRtpd#5R2D;9K)ayFzp?iuvYHd)@K(`7zKHffrlIa1GOp@*lc__P&$>*&&|m zAvlF>_H7aD(fg*qvaPX@r7xmN+8s6RoEt4NbQoL!G>@3$B%Q~Ytpbwk>z3$No89Bu zk5RGR2#l@}rd1lIY7EqDhcS!XRZy4+*<-HZin<;3M_;qdB`z}eHlZuYD09RZ2Hq0A zcn|hqW#en_-Gfwz6_pvk!Lb#vGD>ogWwt9Siien05@DvC-1W0A&W>~uE<5)ZCuvgr z=*>ZzG&oQD)-bSFUEGtrDntr5&_n42m)obXT-LZRL=Y1ql#zgZjw`n$`C1eN_YTh2 zcq@LEP%6wxj0$7p6ID;0bhC9rl2aZGeJx((=1mGBeAc`zhRW!ZoK&^|JPs5~cpBzs zKKM%!@k^o8^Yqg{fStds3G)wN=bx4{WZ_|aqq1{xF}_t)dz)a#$n!r1Isd-IBHJ%T zF8%^J|G~|%vNALNQZMHX1hc%&*JNRQTju7ihRA>S?%dgag~D&3n1xAOL0-+w+QQz1 z!3N;$VgfL;_y-92clA8keme*Bj}bB}^PkT94MNt{Q(ERm_mkQbx^pZ|i#e^)(xC7< z{VaXl^Il8TS2`Tj%cMBer2OSkV9*Vf56wz`2?Ld~<~e7}`4;A~Fl#(K+OmcOiD)98 zGt1Jko}bF?UW%Kas^4=G&6VE|uRJ1jcy$;8)41XZ69<((CJdH5 zdSC9we29{D@~Y_^gbpQ=B(I{A`}C!Wq~u5SUcZb2Bk=aty1#;?4t22yILzMMjPL!p z8~xn=bwTJ|cueL33w-vtVQ<%L41OC~iT}~50QlyRu#{T2CIN~-R)ukR-q-rICJ}6& z#{lpg19Bxe{HrfGdd)Y~M{j>2;&KwuMtnp{0>OwOSf>{5EEdA6#sOnyE;(V-^< z+|l!7EhU(oPJm{*d4oQ|i>nhe^SfyLz8&R5Ssa=7I$Ey8&Mpqt8EEVkft2uf#@k1* zuXA6Eh=vf}ht$U#tt7PqVEC6edqHfDEg7NK?;N%*!EpC}OlK5!_11<;wc-WdB!akxgm@_ZEh0<$ft95BJtSctWD;OmOc-vSuJd79 zArTX>yrF9ghG$h#LiIip5h|F<9fwX3(>Z5^rzW}D*!qJXr8f3gk?gXtAam3sjZqn9 zNDpm~4fjlZS(-6mL(yLBZ9^7PPhAeenq?mqG3_iZhLPfIkce^VOns--k4)KW{u51j zlY4B_Mze@i!$aZF_eie^(~JDF%^5wf zzQvPgB6ov6l%jYc?)sBuN)}E;9h#a534HUDB!#RG-MQ$Bp#c~m-n#9!A!R-huyAcA zw^SgrN(RI=>`r@o%eyaSk@xT}-2NTr%+RP%h*+oIguEWJY8-W{Tk+K_3>Kqhs@3OO70+>M7` z>R?)htj68p%#Y8k(wy|sd z8Fro^Qd-1ekDfSr@(WtlEckun20LO$4#-nr%6RVokN}h8y*OV?uo`;s-B{ZVZP5! z_lnOW9xdqkknV-VWt=V%Q8dw8KTs|QV_tUY08>C8Oz%p_D4b#@kYhi@o5y@K>D+Wo zt-xM#*W9J5>imPW(<9&`+4_dw-iDP{Zqp7oH*T9mTHTjYlBPu`ZHAitjxHckRb|#_ z5fqwN3#D1R%WBK|!R5x5)v->e7oj)3(y*FL*1ZExULU0vDB`W*Ktvdwz4bu95rzIR zCM@n6RM5!r1eJr60)%I*e=cx%;L=o z6CzJUtlWBuDy~Z1_WCc^L~MI87C50TnMLHqI2N~!BPaZ6e5N0`m%{qh{K=#x2*%!r z+&=1Pxyu4*8B}{(;bqPol&x?W633ZVx8p>QuPr0ry18l z>f`$owjwPA7mY3OdtzHpUCzS_*Uq?Cg-yr%@JJf7E#_r}{R4I79W|!BSbgq_u`e5O zcM9I=yBIy-jZPb&;SzC7AU!a7@_TQiInbAzjj|##rr6bD<&%^K_St{K0Z2rYuOdjZ|j%krsA&?X#gzqR!E}G;A9lh4u{o z0!)2RY|1Oq`&h@4$I`-$wQ`NFuD;3ARHbqb66SGAyaBkT0>qaMG37YcemB18Iy-%& z;ilD4$MdcaIlOLVyds&F@$sojXf@;IZ%Jmg>nbh(AinXYAr`?pNNRzi2OK?QK06Xh z=JBt~{my6Z?9k`7%K~AUmWm2k(Ze})`2X-|1>*CDD zG$tNbq-wH5oKKC96#8E1@i*aE&CizAM%GV8<<|ZlD95izB!>Mmf8fIXmHF|PsK2(7 z>3a(^m%s9YWb93>EdE5*dCMGdGyR$N!otPPBnGqtI;lCBm|470YTRthEL5dLnM7?| zoRuw{#DMk=K)^378*U~UfQyBb1JLemkzQg;6FX-MCN%{UXWKV#@J~g9{@C4N;rO+9 z_usso<8BsE5D<`_ylW+U7^S?okN>ML4_rt92rfiM$oZdqO@e%J_(L)LmYwrg zO3h!p*Y9X&Z-lJB@{9hwR)wa8ler1Nt_V;w8Uzs((T}$IH_xE3-0x@&_h6=>R$?-QT5C=2&->5*W%-sJ373htD_RBr~ znQg}Lw)!gr>l@f&`DH!jx8Hv2DSyuf`nCMu-#_#(>z)4HL;pv8m5r6{FKU2`_3c6a zRW-o=r==$TxTkV4|5|bFAFBa)qP%~yoBsQ-e@ozhSpw^pT^4_&DSsUX|Gy2w{{e&X zMs@u~Yy5T?{?%d_ZGik&EXMzGGyJzN-({2P^oQ;D+er@pxus+Io265?vA1w0V`Wyf zaDV%&3bZ!?{1?pKpDOYG5zU(Ux90AbAk*KIXW4%n!~5$^|0BlhKf1~P*yeHbu>6*5 z{fF#V_P3bXZ@AVh?7!NpKXa{r&wl+2*P5O6FI?;2S-)So)|_u#Yj(~*abf@7()~6p z_{SE9g_YxXCZ}G@9=ODb`~v8D4J1kh%lGuzMTQuXOKz|Za67LC6%nG2+ccN^M6aQB zw03$&su#o1PrwO*OqO`N+}pbAadouU+}_E6#lXY;fuP>Lxv3m5^xbZi-#26Y)$g1arnF0<=fSGu9NTgt1>hSu$zqA|12G zh#bf7i%3SRW?%}Jb$Uv_A$~+<_cRQ%;bVTjymxWZNN8s=e=*_pjDC5^RuojC`gz1%RKHZ#K638aFg`1&W=cyi>->8Pg}R$yxYe zO`<&|-aFSjw7H7(rD=Q>)9;%EPl!EaJ%8`SROVh8VYOC_ifv?qdS5nk?Nxl>-KH7~ zd>EyunhgwdR5OG`Gx_9qmy1I@)lL`WG%^vKGnPQbg!|3UAXCAw?(@b1_ZV&ycg~cs ztdBpp9UL!SQmPjQYYmeMKHvH`FOP~JMqI)_6u3fHsnn^erJMS6eW(fd6t}YSnZaak zOUM9}_F;__6F7``0<^uxZR*zEZAD2j5$LIVKPqAxJ)^sb;dC%;UC@5LSTr4o2GipA zh9)e=UvE5y-GDDe{RLW`E-_4OhR7yqEATk|O^4!~AH&_x1 z2;OCU=d9ei;7;X#LE)iDUvre*C7cO*j8MPbN;d{RRNKdxVtV6tQV=;KLH8TfiRusb z^z?y&x(^cxYLTqwW-C%@cb5O`doF6{HwS;f|V*kMum@Iv4ise&ULHnBs-lp@M3-2KzG>M>LxLFDOXWqZYGn5B`3kEY=U9}z!?&}8gP2BP zgfMx}*WGAai>mgKT-`f#HI-)#^=Iz&xAEJx(;o3W_CpQDwBcE_)#HeRH5IU3&xNW# z2gb?pnaX$zz=(4hkrlD{b=U5>P<{>-=o@fMk z8hQSl$uZ2}3>w}Q*u?-7Za#NCr4%8>p&=DsXkMHAihorIy!(^7xt;}XQdP>?qaoGW zz?Zjy{=Okj4EFNou0z^?$2gnPt`LWa%@OPYaX1kbP1sjDhP%CI|AleiRIx4vrUg<64c9@%`UlUzl6Y(- zw=fPx<#xlV8X@U2>Lbd$%C`wP5zw8s~zOluh zip|{=abOEwjctYJJ`4FaHhTVJB>SdF|C{K5{Y~fp%jn>j5QXX+oU?n2A~3yK92X05 z3p1d(#ar18fR&5&TS1NA72G}U21R(Y@I86AO7=+a(Er=U{@*A5TLS;f68H!OZS;r! z=6@-6_gm2ZkA~&{2wwP|5A`-Me~Bsu5x-Ueq=o+r0jB@uR`?e$e`Zx-`-hGA+bH25 z>o}IT#qa(ed)4dM1JQVpUkGVlyNMd59gogO7pX!Z(7BOQ*E45w)Xzym>QV|}t{TEm z*4FMUl3m@}S-yeOoba;66HP`7e9aK*u&-oFFAwAQ;r3rK1Y%8DwihO1RY^!s4kAdRKGd2VbSgVsQe^x>Higce;y836bQ<=0Bn7+kTCPhdTS zkxQuOe0xdHyg6;xAEWYB*ikZN#kdPGp|#M-n+=qx{P~HqdLi4m0rFlx?1>oWH7%u0 zM_q5(Uaq(&L_UkB1`37T903aRmx2DFg_-n{kZ~g>F0D_xK+DdLAIVjWBVFNJRE#M! zB$IUCzb^z5vT9~Yl}YSQ=2wkQwShzem>~4`t}%GlKO0E&(9EnljOrtsAS)-*vQ#;4 zk@l(|CTFC6Ut?tS54 zou^H_jE^{?p#BU5Qs_kyxTj0`k8R=9awrxGI4Q)RRmH2-u}BV7#m86- z!L+f!Xtf$jQN`7ww11qyGYG%sAV*sG>0r+6hTWiPc#*4ju?}igVELzxlKg{~e*8qlg*F1Lbyn!ZqQF;Z! zZ*A3m0lWncw?QBQDxtA0+vs{OZLpB5Mm0*EKI^NIv%($ySTKdtyB%`7Lt;rdh48O1 zVX*?W=wqF!4vSE!7~7d&684|A$1mPjuzXf*G%xK8x6?GO8h;q)e9OI?F_7s$`rKjm zH8R&kAbiJ1D&iW%q|`#kg>}U`>$&FPPg&#S{4|Hv#?M)v0CXWg%#VFM*h3-3cIT>^ zixSnj9)MELOG}|EfNUwQn6E}`9B4e7)7o%-T1sD|2l%6XUe|wS=u%cIY1%rv3y4>E zU`0CP+-kCj`ytWibL5?(;UJIS@M18Kv)gw5QNj2`)~(c|!Q5)LcyB9a!$TeSbe@HQsX$m z{EQNQDorW|+b5fzSy2sPDhAL`h;$&@*n`sORx^OJkJ4xw+4KE%eU9;jyOsA;GxGaH zCH6B(qh&1ia^~A9Gw9iz-J_^T^NVh6^lcm(-lbpMt1Jg5($=>jY_szeU=Z7kpso<+ z3RQ7wqe!J1umUjCvyHNMD%SDJ6JMk;2;;-t{X@w#Rmle7a(B6dLGp zgG5S$A1oZ0zO|y~PliV|S?vE#l6cx2d_oh^CK@)O(hARcxip(31n} z@*jBn|DS}-f0PSg|659so1Nod_x3sdlDzpNZ=Z$b-|qgu=#TvS^nXj>-xBy|Brpl3 zA@oO{`>&enpHA2OXL|B~0DiIkeyZsIWs@iVnFjcO=a_(W&_TFA>`TARzyAj)kb{l& zcN1b(a_pY(>+3brs8811xyiynZ=!K_ig>zX{@c zFBfpF!?T~LmkPMr78@669&g!fkF@2%c9{RTU+C}qWVlul?`P}(;bp4iMoLJ+sh~

    mQPi$JxAi{{1RToRp$N6tZSpI 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�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%0A^!=^e>z}A17+}zmahv4VE@fYl~}iDCr`k#^LJ|b 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%0AZ!&mYKe{ljQlT0e075QCgX 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 z%0D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

    P1Nt_JgxWJc&d{9 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

    _VPmtiHIq+C+>^su%XEJNVguNRV4aze^f(3gpg` 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℞%0Fus3 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

    0d}jM%#&Q0Z(I+f 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

    ecxRt{m1uby#m~~qr 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

    4io9}K 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%0Do01Xpwu7}J+92xsY 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

    KxM6Q;mM?U0X+%IjQFhstP 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 z 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⋘)}n4!gvFsYIGB2hlYZntD1B8wH< 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≪Ch&^w-&jvDc`#n2*Pf`#k37?bD9Sn_(ux+8n+ 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

    *ODwg8IC}u7JN?;dK##ImTJXGu529Hp<$-kE_ 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

    hfnah*1&&&lDTjVI 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 z zZSMHiZ6rUtelzIGMgHUSrIjx48>reRUx2WogkGjFIW|n-9aI zomjxrhs7Y-qrvglprfeuC-{OOC`9&C|I+1{R*jiSYJ0)B=(B5BWSGk#+9{64yp^qI z$MAMIN0o`Q>uEiLnqyo8i1$Y+egpQccqhMbOUNgkq666WgA?bbICLNJz)uZjL4-BWk?5Q((25l}nvrN)* z5I^OnOX4B}`JI#ZK+q9_pA!h+SuB4q#JYU&>tQ_Hz>V+BAZhGZGc2CiSdNNR2o&L` zyi9^Up-Dd5LbdDzaWAki|pW}Hk#>Mju2W;=ghP|vHB~yL~s)b?5TSuuCUmI_{r_f zUGZ={Mo>ZZVpuho0*(!PwQ&hYHIMi_?cn*LOy+fGZ~QF7N<*yb&aI5rRPiHduWeA; z9D)$(;TR|tJ~|u<*S|t-MW|i>D>KUZCo}rrvWr+**#1%O!pZzUBIw1<`nQ7U<1{Us zLuO>r>MO=lz4?Swn6GtT?dBu;0) z6YGQI!Dvr%I6cB~u*J+7OhaFT3-3=WbGq~X{B7EX<~aKopz^yQ^Uhu4E=0WabhL7h zO_nmTl*$p#U;mhih7y#wW>|ycrX%%v#~kHHx>cZjSNjyT+Rfuqyz*RJ9XGh^NFtY~ z$rUA%9lR^mQC?5`AWQ#*%#yC5&Y*@W%i~bgbXHt;$i!Z>92a;z85cbLF2#<0qUy_N zva>8f@_t{TVOVZmBHO$VZE;S3aX>f~GIAAKyiiC}H)=vh#G%d@epDXqqdaO|95Zv@ z3}YI>PeUC=0vhM7I?Jwt_iUcGM3Um9Q%Zq0Jp{R3@2(TQ&3Zpi%Oh<8E}Z+xP%{q#PD zyKH$pcVA-~h=ans=X(GQVVjP@mpgYo$ji{Ja}yK!Y{?x=CJ^nGZv?e&G-HxGBAe%V zdZnMpr|2az9flD2hVC!V9vR7n8S0>Ys={3kA4SVA;npPdf+Q`UkdkFt^DaLoth=W4 zp9Ri0i)N6*wI@>+ULGyW^XOu}%Hu+}uP%6g#$#rn@tF|#RZiC;9IZ*&g2!^1JGsoC zg4BM{Is3V;l%>;CkXX=#fH!~qXW7Vvp{+cb4(pLfEG12v={Y^k7@)YKr~G|B$@ieu zFeLL-x#B9;@0FBPm$_*gyZbw#V1K-s^wz4Zc{LtFkUtzJ)um&U68U`c*1Ud-s9g;h zNn-4bVLP3wwR(lQ%#ZXmu|6AP?apTfbB2ULf6lf~(0cvZrc)gKX(3j7?Mb8(*9R@o z@Qv2dWUX?2;LS|x7T=jtsCOCB0LfYPm$9)`|B_d4!GRSg%den0&vtywJ>GhFiXwys zJy;yl%zNK&YF8q_Z={J(VjE~O-rSy<1c@e6SvcZ zN}sgkD6h7h(7AXsVf>!Azbsn}9)}&lj5j{x-OgJmPnqoG#O_dnX316S5-)gzRTh;A!lB@B;((!X%`I8_m=U#r!wM31REr|9Z2O79L;~5WR zKhi6DeTc?=QrvCT`G2*c{F&za-)<-z>>vNRq5RJ%1hR24fBd^bAVZ{*9&Qi)Iua1- zTAmpmS>z529{DRY1~Mr`Ac!9|SlBR%QvE9|k_RP1nb56sV&M8r090>X0Q< zZ2xFSTr)V2y#zw_AeoY-D@l_JhJd0}WRgG?g8o`ICdojSA@xmo^h}mH3jMGC_=o4m z+qBP?<+`m+4GnXzbVOYN?Y^%9%NGG)F;AaokH?!*pubpPLmWRybUtQe0hAACT#Nw zZhGrv=-KtvTp}gZIna*bi7nJ$b@aF1@_$PxOwmg}G1b>ZQqwS_vw)<*=`7++z4Z_D3Dlp}8s z1~#|^x; z@;tLLHYr7jw?Fm2pcv^6T3Y2OcBM=Zw4f`v(&g@WrTr`r6e9wt2nE6=w&~zg)3Mtw zcqFo(N3f_QyDCGkc+u9DJ!HyVyp>)qheH0Yre%nDOXZjSA}87-uH6PCmBoyi#nihknxh5$h)~dG2~|NUS^B6`tLFQkBZLA5lq&nvFhax1a$4 z7A>b1X3-uxMiR+K2KYJnl{Y&I2VCk}eSh?!7(*cNJs_o{9B*vkU3&Q2L84&2F}!Bk zv$vWxWKm4t1;S55#8phFW%6&?^QHpwT#D?yCe@?M7^amzK_$E>9epm$?h&W04W%LW z?wq$x#k9}W*NyD8cojzdp{f1#yYy$N&iJYfC51u?c&KnpxWiBRQ-dvXyhw3D^*r(7 z8*T=sysEEjZmk4^CB5-K>YbPma1<@nzj{jQNq*e~2J=K6DoPXMDvFujJcc+=9~c+$ zIAo|o*%zxI&l=QAtngsZxcSRMEoTqJg=jhl4Vua@Q`>yrCq;UX9gU({^{C7hY93*xsoE24aM{ z_Eo&uFkHF<5UPN3VWWqD%W+tl(xu)?S%Vz0b2U)0+%schVxV(DnjflB-Wkn+G@j={ ztyq$!4jV7ESb4=9U$V0Z5@{4i#nUeBNAGPlJDsz39R9~?>DCNoTJ&3=-Y?@XM%McV z1!j(S52Dh>Ak=LZTnpFjolI^6$=KJ?)t+i zNNZN0<*+71IL15wOnLSbu2pYIyg^8{Zp?WBGW6FTyX-rt2U$%9tc6L6 z<*z#8k*i*YxdK1-1Q=MZc5gqrjprcdd(4rznt;5k7rcpsWzL5*IYLR3rdu#am&)rE z3Jn;BBc4OeisC&4xt09vF=oB6$ym5HVSCyXC14XH;bseKO9JXch z%FILYI2mkm!v?5&x|Q-3Es~wu7LgXpq0(Ac7uuH-A&5xp57~w{Nlq`9X_7#wBuWR) z@IlvQz%jqd(-)pbMO=#S22w-J61TNOvZ-%^WB61jd9EmfsM_xV>V>8;-M~YH$6R}i z<_DWp%Mc}fM78(eH%v)egF8lPqAkB6J7uxO>pL{T1(RnNXvkhFQaS}*Hviv^oL{^L zHTZkv;mG-eBoD_X2{`T+XUtt6G=6`Hf7(!;z6$!v-XUrJSV|K-C8YdMfE?$7_yuY2 zkAM0stMst#^%UpewXccTs?h8!Lz2o}Q_rMfZo1TeSm>I$Buzo#R@7C_V&~(#?c=As zu@2Hs0fxWYW3ZX%9e;8m@a}it{KiiO>rzP{(nXUuRI#8p>UFHldd&sUokBLEJb;ifiTo*!#J-^u)QHfEl{jjtWh zIse~$1^vHF#&6H7;x8lrW2WK_QO=a_%ai;41(ha=fY;sS?&wR0UYl13WQKq@0pE19 z>*?77*frAA)*h;Cv{e@~g0+Eno!Uh0Hbpp*rGg6ANRVMWzdoED`f9t{RtZD(m7xH3 zkkAa3f(HxrXTJKGLT?_{$M-PB&vWi31UHYjrycTaSC$&~%5bz^oFH7QA$t?h z8NoJ0d%E+52eH^Af+r}SvF@y64*v^8Axvd7iycNTNJ<^REnxU1>qbtHTbGsN=TN^> zZXWuj>KaRo&6#wzDTRGW_-v7@_eb-1f@>O7QuRWMBokQ#Shi?_(l`mk%r}`_W*~%k z=zi97hA#={!t%252C{|gFn4j03fmiQIcO5AmD}H>huc{eY8;r-d7g!T?>|fywO4bA72#(EwN}ss!>chJ1mM}j$L`ZT*$%lVd!i)7E zd4vD8P7qNXF*6##5*}1A<%LMw70>?BBD9vx;;^7yBZMV4!a2n|pPxoUxll~m;wP16 zTOtk>euA4{dr|R$+tzO8ye&LRYXCBjne6iU+tcX}&5rc!KgGJ>XxW1oQ>=e&Rwf)^ z$srRGb-`&;e?l`g`9@ex!~z2{c}LruvW&tuln9%YUopEySC+ITxYH{zwux=i*s^=97FC7P^ly}k&b*v8N>F^N*M*L8=I(N^})M@9r$8d;wF_?-G{6xZG2$DJIyO0eZDZbC9axzXA(1rUFY&ItEcaBci<~0<3n}y zyv-OHt@ku;EHt0_u1)qX3I|L0p0?f`#GAa<6bm`Bdz7$SzBK1s8p-M~4vQY6he=r6 z@PfPq-!2I;j3z1CcJgI?w6PN~8r!5%v%tqZUe8CKgYUZPx8w`S*x$*kQjO=qmO_^K zM*v2Wo8E;1I5-UWlgX%1qyewVavXhy!NGsVT+?HrD?_Dk@}D`zEkk<$uR^bBm4n^U zj9HF#rhgh3txIr}<|kAByfd64b40}kjvn(aSAAcnIkHgY)A=-XHg!Y)lW6iki!lFu z&HBu@n%Do}UxnmHqYy8YtXmP~+In0|Fe*DCR zYW}nUH(RM=fJs}6ZFPCe%XT3a$DlQ*0~h^1+R=oIjflkJ$w6g1Y`?^CG$T?^b=v6$ z;4^3gioIB0bi24>CiP8ayfoC@HfDLbxNGfHYah+8znl)kJ(}Kz@npwG1*ydtYvXZf zAj8EV+{F&@+OTzbeX(*t1FU$RTQ!oPLaUJhzFOk0S>ynUshmxTmorw8;W!aw+AI5; z*Vowh9=VCU2vFw^50N-dl71Ce6%9O|aBIgKV-Fix)+waJnINm-&wIx{B}e4+#aK4b zCbtBq)I@VfH^5};Q0n=8!;#WJQiTV^5ZRJzh|06IG#V`grkSS~!t;vLTYeS`Zo&R) zia!~2$V2^=;e29U4_t)N;4I5)!%9s&AT=0oP<(H9)@xg0MxVK^pGoEguRmtR+ANiW zg7V}G$H-RW14okbL_2`U@e*=x=Y4(?^ZmVoP;BUg^1v@+P)jBH4FP9Pwk!?N|Dx?J zqw46kyk8Q6LvRQZ+}+)RyGvjL!JQr4B?PzN?jGFTosGM0Ah^3jfVvGA{+M4O9PV4nZEDKq8_lFdUITh@m&%b{qQ*5po`_L z*XBcHbAR9N!Vc@)I}MU zk1*LVnZUyPqeb&=jIJ;o*VqfxR1mfSOF!!^xvVci?3t3=9cX>=fxMhPBS5tHpqNNJ z*7?d%)>3^Vt!VX|7m6!$TqjHMug-ToH2o40-=Z2J3GtTBfVx3GEz?!9kk;0A)x*MK z8xi_+Ky!CfAkl#|b^C-NwVlD`P?mH0m2Q*wvz7^daS?TpkR1x~Ig9_6V~Hb)PUd9t&VYweT-SD_M1SSiy7_sgj1AuY{_-kzfM#9S1m1Ub z2~HG{%8loJ)bY2s->j34vqi~J!6olkO9;!*2@AHjfj_c21+|Z92McfKQx-VM`6dPf8a5fqnKR ziuzsI{`0Jyd@@Wt-drm?Jxo^m1Mg2-lG`ZoX|+6S^n}plNLH>hTn61j^Dfg*+DE^f zlZmAlqnYJ0AL0aFq4?9wk<*4!q3ShXlx7uZ88A_XGELvoYT$q}5Ns4W$X7g-xe<`W z8v7JIRKnJP*O^b}>&FG;#u<%w1i%tSM)Kh=ml1JB%%H?%(0#BXxavL=%x z_+i846qayTUEpql7TZw?>BL^+mu%@edR*Z!N<;k55mn08Z}U+Y5|>L4_dw^bo!T7E zcZgW&I~y#TNYUJaMR)Ia_4y;VLt{*$!e$_2n&uz@co<7g&V@9`Bx&w zf4krd2^&e9TAEupk+8G=uLO`-xmo_U+?z0k_>BZv;`z1mazc|Nk;UA>yu~K?iA1$w zW;%q-U4Ur9k;a6^*bJ7VCUlyHW&SX_XGrvdttqA+meQ!3NU$ejx_ypFW{WpHYUYEC zHPBKW$Wf9J#(W~Q_)|ru_h;L;D5)u9r;nF{XNhRPPOcR*dQ4LD}XdHjj?i=~1OKjh|6BUdU+dA?IR90T z&h@`jj?T;bw|ttDbd?_~kN};p*KK+!+#-K**IP^5@O+xkIvS6VyBL}V4r7!P6xF); ztbb(uuwCZJx__=^QR;9{q@J%tPqc<=jpkttEq~*PQAAnIX`r}SN6`Q~DwCerH~)<{ zbS8EYpM~092Lk}TOQ9%dWZjkCXDMTYk{rjwn7WSH&OE-n&IBqr`qbXg*V$!u)2}@P z*JUy@cxmPa1Ei1jz!)U3gDe!TQiB>BYXj5*D2H}{{x=~4i@K=<=!&>FhpI?MqQFw0 zXnq5qU65n*r}6%6PIP^EBtIUn3W@i_{BlGj#Ch5k>Qm*YlQg`j!`}yYw+lDr{gQ_W z6o^3Wr(r*RcpY?1g+QRdYr0jC%R4m^2I#a3UIQO9UK=XRmauKjH>?}ePrTUf=X*Lm z>NjZVJKOoodW$OTWq*7APdZ%y+EN%Ov^N}Yp@c2oLHRUuh;E+2 zLmCQc5+3R|GN&kSheijsSwO;Soy%gvx(^JlCCx;e06wW1$jsDwu(-S}VYH8-Ng5Cs z6ev0Q`D#(}hgwE)$?<^|{EdlXj>ump{S;<^5COT! zTOOLu*Z`a3HF&-CC@brU4=KMf7U&%qeB#KU&9*d&B1xFgcboSkh0{eNQ2k_voVeyt+}0Yh6Eei zOYvSwo}ZfoGJ*N`DITg6jWA;%TL}jbV9&O_dr%4=jv)GwoZgoenWszbLH+JSr}}UwU-g>pRN;jh!iY`%$8D#A$es7$2o~S}|{G?Mv4r7ng0&U(2U3m>Z9T z8(;t-$eAb{J)->1T|tcoNHHlwGQ++SOmPP!s5UA7R&b^A67IDlR&Yz3l&1$mG4@XRL@WKW}$9cZ|LG-QUpP zRU))%|3(}={;vIWL;B8`ASk*z@=K6=BpL;>e{$oImaB7V%UmpAPUGZkkIlGv&ZFhg zJ@av1O{1Lq>tFI1|Nbx6#r44q;eRx*VcXMb>qM4t6uB92wPmgmaqn=N>rxg|taW1lnE{;hzS_CSleL0R`dIbC@FmD3gR4^G!#)sF}GeE%l1Ph$Kp znf-q%4@du3eAv)G@L?$d@$zRj)~siQtm^{%kvGrG?^Cn39UdNbU)-|7ySE!VTx(|Z zE4CjbZ@f&K+Z|)G-OoXv({1PO8Jo0M9#c9OSH6zdY87p=s~K-Xy#X00O=g@j_=*#@ zHPtvyskLD+GkL&`Jxsk&fmOSy$NX{CI_IxL_E1%yws9NB-PA4{BIjg7VLFx#&N}3H z1m}0V`x83GKL0d`J`F^QmyZr#HQO0b)?NR};Tm^|;u&jI;)chcRB4+rwUAF}1W{!* zdRSjzTh;y$sPM^kN{@+e+#zrICDbBz%O#;{Txx{BXnWPo9s&*Ev&!k{T-r>;5Fg zf$XSGn-YRY8N@w<#m$7F$_A_$e;9O)9pr2Fe(h|3iBF0kD-pk{Wph&X}PfoB*WJ7*!SpDgGWEtj*KYC zX2WOl+p~s9C~3H`Ac(J?p7pzy*TZa+!obPiqoeW8S_K#Er|@q~mmF0ujQJIYP3xY~#l$Hk+P5b#A?^*&i~&c)6cXwI+P z-Xj+BvG^H#v0x%v8|Pr8;?yMO4Zf8SbFG-BBKV7WvkaKR$WIk7YY|d)C`` z-Sw6o#;Xx!NuiP@&GpWFli>6n4@S52f<{}e87O2QNg~*7ouUY z3dhC;O)y<>D59dlX{9}xZ|gL4(1nc;`9^*$w6I{b@9R=yhk)-QnJfX+bf}hK?`iO> zl%qT)``A(eX~0B)Ikn;EUsNSeO*4}f+NXHl;@7*npb)3w-vU3@gP39ul(azbgNd)m z`b|zVbKDY#SbZd>+ikI)mU*a%x{|+BN3p5mQRGSrHyf@FI`{iH=rdbECh-$PFo{Ox zOFm>)tC!Mo5qK*nX9c|Y=E=YFSM|SMdeAy{X5YvB{-m;@f)D`#U-`hYw)S-_tS?;m z6yPfxK-4ePvaWtumzWuP)mwiV2*<=lpi2q&FK_4-6H+N9r24tw&AZU_X^X~Ym{Vau zolTx8Oop=YLP4GFhm>u|{Es0;F$D3BP(LB266?gGPZ^c^u5G;ent#ME1efm2)iGln zJ1{i^#}(`|A}oRf;v=-m!&vLFJdX14j5CnqN8>M+AMoU``ZxJ!!xfF6kmD%H5JogS z60_2b>XA#E*e=9OqVjArWtI?R2RtH>`5#uR z$Bdx+I=?9B-aH9ej}dc%IG@Hi$+zh9=!j!qO{|K`7@yYfOZNiZi&92!*+Qj-UN7dz zmwkq53(74Yfr{AB&lEEYl_tMy<=W#qE8S}4j>AN6`LFQRt5tJ2t3H^fggPWW?Zdi; zUQVu2(%=aqn~tX|3G|)gMV&W)P+}C=%2CiOb**XsJUW=Hhk@YNjtwCJAP7Up%R4|| zfnxMN{cRY|5-RET!CKXuWayN={^4OX>&IfV$Es9Xzhj>^D^8;al`jp%%OZDfR~hA?_nfLdkCHDmN$$=`>vy70i4K$`E#+S2@99Yi6~x)i zOB$9>Zj}^LfUnx{B=Uy1eA ziWaMgKY!m@%GSRa8Hb{bBOHLsXhm8%F$!=(M?&x_WtAG}KM!*ig(T1Dg50tw`-xpd zx{SkJ=_OowvikKF^{>LX)KMgV)5Oc47YF&7{y}>QRN|f|P99?!_gDUA>4JRn)vZ!A zEt6{kvY`94{ghb`m2i_sTAGv&^&OI{qK($7)up+${ug{+eH#RH>j}wG*8VGvojGx# zEeLc7)q(%%@w$sWBwlFdF5y%LZEhZ%=JsjbeoOI1+H-0(+D-lzU%GV<+&=M}aYsn% z71td?f3mZ@`#sDq0-}I$z4m+=hF9fZRASA2g{-O&-OfRMpL?@22Nl1rB5g z3b4I(Kc}8d*&IHmwyp3TlgG#oEQoi$Yw(iHZ-w;r&=1yC5L_2ppIt<7gYPO<)th&E z-{DiXD?jT$7kl7CJeyc99&0hue@G3(i>c5?-qAoAz{9stsElg&t*TnV&p$vq5Xb+a zdcA+dC1pT3UvB9^PTugM0{FCZMh5r}9Vw3+WSj_fcX{!I%URrW)cUaNNMI?%$ zu!9N7Ul+(uzQ_05!mkVf|V=2-ie#^fyy&x`V^co+YW-uwUteTv6|Jg@3zP(rdmUEBTTOU>cXn720r(cS4%r5uxkC@71CMb&B%mMgZ_oY{nL`gbSXY(O?s3i z63yk7?JN5EtyO#0)_QYH$GR1t0V}*IR?dHg;X+;?sj2_YNBQ&|XSU+Ee<70ndC-z> z=BSk{)KDB6Jca-0hW}8v`12x03_7lKF4Fb?%bx#F-uS)j?(^L`vCm6YHMq^4-4;{S z{pqA}213iW4gf7d<@X#Pm+9$meDFG&FRv?SNrF@w(-+33q@{(s=aX(5g>#JklLc%7 zT<^$eK-eEh0osiy!^v zb=E4?Cg@l@H}D1Zj)>XW2hW=codwT91}fG(!Um1}gTx}`jLe&7h}ErkWFp?Uz9ERT zBHd+li9d;xbmoczwGPI_GNw?=6SQ3;UeM`>NNL&PJU}As)LIhJ{8?8Qu6EgE)Bnft9M| z`;8Efwmb~}-cRU=k%`F76i^_{7!>K?s;SRS3%nmA&?9o=JlvOynK_o%izOYqK1TYlm&^LUty=q)qws^=ZnuLVgYTht3XIo>Lcb8ag2Mz;*%2@#X~g zIsS~foIYstN+Y6ZmBXG6oo$>0ngUHVyRE%+T+L? zFM(1ddPIlfFkYuC(cB19WaQ~oLO4hSI?tMI>kv(YC^I#-*`e|cCHts*(P4t_TjWP6 zUt4v#x%sGTeLf6};^@`|Uh}cL6_ukI-DYPF1FPV1v3kB0DG-(!h8A1TaVf@6;2aX~ zJiOJTlrYD>iEf2*$*Xq0uInX4A>&eR&-OHS{QT0sox_O*YJre5G2zix?h*d zkH`HX{k3YFhXC+tcHK69x1>~Q0QUL;$LfB#m`XO}hCsKLu8o}w$GC9+B1Z|uiPfV-RUv;%C z(lRDT|&nr?yDR=KF!5PFB=8%oz& z@>H+H=a}N^r@`?Q`jWE3?#_ct-j8;<2E)eK&|}WzJde$Q+ge5H%Ty=gUQWEntc}&d z2G-(Ocju1hu@ZXYN8yIVWzyUq6)|b{1jBmw7X;eBx(Vzc_R6rAtR?zprr`5iO9p=w zGJ_9UH4N$m9}`gy*bY35pMGQe4*cNQ0tFx@a0IHhJNBi!cGq`X})ZxS?F|}NI&-~wjY0?8q>)nI$6Vu zOe(|+G&~LsZ(}vLB!CY*=E6;4DzgO(V%5%l?WmZDmm%Q)+AKFy?TP>u%3AYDoW(=w zM)!VqDv6z=eyK4ZDngU()CIc+tjw^M$k+4@NP6}1_CR39n@v9;ujAmObK*Tfy`@TP zb#M-+q%`V~a*DIH9pt>$YQprFkvvo_u92@x~+40z$uRPnO+X_~M(P&Q#DlQ=~NWmnAu<5NOCTnZmxA4G4c<*!z#| z{N7h+G;d#+f46A*f5(MjW#j(aT4sh8K{7kr z&78Ud@$W%#uo=Cb>nSp{_ABugpLj@#d>x<6Y*2rMvw0FK$-21l@Gy;BY+G`f=5@>H zCq9fk8{EI}5r8B1mW*`G9*penZk0ES!UdSk`=`+PdHGGLdx7S5IiJb$O?wA{QmhD_ zVcH+Xhs&_}4100WTH26oI*wiPCoOyOS%dwaKwnD&wGd zWW1yEMMfS9Tl6`FedG8?RKtBLI`wRw#95vEtcxvzT&&(Aw-mO}p`9 zG!bIRq*3Pi(a=dr-`n`~_T~AH#|Gmfvt3PUsPh8nZ!8=@Eo9clEo&Qo|}BRO#CBQFB2mI^d z4ad87CA2adkbX(m4N8zQZAZYo@q)i3OK0?e`)U5NpV$StIOf~1oI zXckW*9HhcArP^?!jLZulxss_FIRH0kF5W)uD*ws)MPZNY-;Vk3!;KCMN=<(+TaCj z+LMy^_2Y-HN$;G+s^f%Tu+z^IR$yU_(K}Kvia*qm@qbGk`dO&>wH+Nu?(X^UOXsRv z7L2XwMM58gxTQ()O^=u>1U^?{X-d|Dg?a{xY{NB6-`;Zo=Qm~Tytar+$wANz%qv(L8Hkle zqg2oMX$ea?!g+l;%cUh#UGB}mfN~oW+PP$X%5-Zk6Z-ZXTMxa|Un(`<1$cQ2S21lK z30_X4s|J%yF5F8^wB|4ji8wShyKb>Sr_QvYy3_o1TF4=2uemNy5nG;0lyy(^QFHH# zKda98X1Aw`I~-GY-r~goiS$``xk%)eJ#)92u$m%MP>u$hNIw-+Q|jE^E(7Y@+GxyY z+VN-Kqrl3ddx+;{IK9)K=?U*+fy><3>5(hm7rMT;P2zfsNbb~cwS;=a*_#48c@nmG7GytiPzLe12atR*8cLsmN^msU94Yw z++}q-{#kwbi=_heHjInwxn;p@kLmC{a|oAu=JLDuZ>m5APDueDC#b89w6uN`>mRFX z{X0wg--_1%H7*VbhW{_89k8?hJ?-EV1|;nO`uVl=UV9FJ`Z-5LhLhi2WL{n+AHJ7m zjQ86CHoCMIS$$=U>bq##@Z-d$W-Ba-LkU8%0kT`wBb@ZskW=lGbkRNjw zA$6~8T@pgIL-*C@STVtS+zZubfn*lS?@)r_8T82bhLqn$`i8NLN-Nst@cRF|cKaXc z+jFt;{IlV>I5_`T5;nNlxw-yU^Lv~@A4@ng9T1v*p8YB5BLjs;Q+8EyL-xl}3==As zF1>DTKO7P!3JRB{G7{g{qgoe7Q_aqz7SEO*NO6OU5E(gn@0CVEIW}UTXpS-s)}KG; zeCO@TG=vev!ally0MQ&fnBNd4wv_#m@5@zIaBy&Ap#KFVCv$Lc&{|HV>HX~E*?Q-~ zx;2t24Hi={H}w0BdE*1OvHSG^F)Ton+|QevM&xYe&)7bY61Z2Q{_=@H=xDHqtu`XA z#7acjzV-r6kur@g{Nbgr&uv{ z+7l1fP#TRGQBhGf3twJ-KU|%xG%6`6RkpjxWjEd2UO*DcUC-7)MbDg{d?W|t<4&Xt zz9gJOve?5aI}dTK)>qp_gh5eDsQZ;|KiMp2a&UL@zLa9Fq5#tY8UbK8*N6uiZbe*W zI_Ip-dG>CeU`>N)|L6U6`uBQ3y#8|T_fNs^jrcx)l@e7cA-4`Fh6_Aayu4fYUFq(r zT?}f{n0Tz`n_B&q*sSpoF6mCMjQaZfYMuE@hruYsV?uq;N|<09=j zFLtvq5WC86d%gkheX~TSaX@7dNqRkVrL-F&1M{Bd49{VG=}~jj&F&Nzm`*Fs24*Fd zJH^UrG*=9YaB+UjFY`5F34- zZpYG*Kw(NZ$1re$lN@#M<^BLMiM||8*UGAPM6AX&9zLKm2}Q`)?T4#(?Ah`eF~Y$j zHMm{n8Lx(XU6V0BeXgEZetHW|Uw-GOuiAg`-K>$8(5#Q}s%_E+*4N(XoPO}j$?Np? z!;@pdFmkqKuO=h5nbVj*uiQG7IJ#W+^lR2=JLu*G<^V9~p~1r;AL~axHuJXS%ab4a zX*1f}k;@ZS=pEE5gFUtu2g)N(O-?M=h*&or9eU$^V!&3f{$IWmj+I+J*w(IxMLA4t zQahMQA~(j)0q;IH@c|P7egWvu1!E(#?Z`b%Q%o5$aW5{bq><6iL#LimatoU;P1vi$ zywbsVxjc}UZraylA>52D*Bfbf3p(9&@9o!{iQZnm5&8(}em`u%VP9j)*|6$NFGt~{ zpEccFwl%pp>r4Zg2&|2T zC~1I`cE|R90$*L#E*Q%2`OOEP<^*S!M}E?uS|~X~nHw%(*^(H5#Bg7c%01v}z9-kh z@u_@`*DB2vM}c65!LX6NIiY)RsNCrtf4kS1-?-5-Be2~R%+u(xCn`z#_1K^314Skw zL83idN#Cq{p_RCCXi%V3?2v`&EzvtBotW0`c^oM=_-=B+LA>w7JxWEF zOqkfP0fy)}C4ODLbeQPAo<|s&$xi+LNAnz9^ea&ZcuqZE3ZS93AnrT z`cGRn>^y5$CzIcMwLXI!+sabGvdmo%O;IdWeVjW)rAo8(W|=ECX(xAAo5ggZ&895pb0yrFNNfL7aK#$*HKYBUi5 z6R0;#@)Bq(bJ4g_UTa7T;DVUKD$U!Xb+x$)j5Yz8TLA91g!ARO8(r`te)fEKyMRJf z4&U2IX+qRvR=q$sm4)ZGQSn<|&q$=hNIS*C&!vR%Tp4p$0|&Hy2p@%8VSUctw}A9E zZ=2^FT*_MRijax%+yOwjU%;lDhi_*H6D8hUp!;;tnTXaze|hD*yzmwD9He710pfY` z+ZT@ATE+)Cn(XsSi^>4N7tZC6_SPFTSdBP{N8FM6yUdY&@hN{(fWrrOSu2h-P*?;ewof(T&+W#{)!-niee=*JuhEM;%nnw8EWgH}h%^(`y@t=tCWvQbe{ zjazw5D^ss8{C+O+>7Ij7s_~<$k^C=xH%H7NJNP>yHU!*Ek&aCox3^}F&R<0p**?}! zx1jfz)U{TAwvD?49oEr-sag(4=?>|lkv;p~q$pP77%H(i?Q{RtTuhxF=#e;Mg* zwfMVeT<28dS%U7a#}EuuSEJF5{;zf=CG1ZSZn;o@v6K<@o!h7J?Gc zI9A)Xu{L;#ys-o^m3(vnRJcScRT0a zCTkx#Z9-g(0mt&_0eed z=(-wF9Fi@l(#|t)K*fr4=DL(xk%x7sQZ5F^*X6~Mhq4v%V#V@*nMZyym1VM3&dn_r z=NI!}C9n!;!kxJeD<(@8pTXg1K}>j`knm(iO)xJFF!9F^*=C-gSHh>SE7oofJ zXsn@-DnQhNzjWe|-TgT$Oo|O{V^uzykVY1Va8ePFoG56h^<^a!qvXf%2A$eMT=U$V z%6petBEj+9Ji5JHM3)4FDD0QS>PW!KZcu!KJ-n@hQ|9vi8*j7s^BRq7nc~rkv7073 z`jc^y7o`r;My9o`{a6#{BGMP=O3j~YFp`IyG;%j=TFc_+A1GGc(nyeQ@Zme!pPQ*7 z(#ED&I1)#6W|UH5oMWX`+_avpQYcwqXtyO?Qq7vN7Y5hp{Z#WN=+JUX$u|mB8m!&9 z#M~$Qf%VoLvIP{h$y)EF&X&0%df6*t&DWP=O8bl(okLtF5~5|@kKn@Wy*T5@7I~Y# z)K%Ff@(_l6GFzexjjE=bScgA=`muT4oPsBvIcK{#(kb zC0ku-bH1fwt@erO7Omy0&s_9U=&Dz;rHCy^p2#Un`X7qyORc(p$}6w7Cam=~&v_f# zf`|S2lSXU!SvNaiXTO9*k1o!FTwthPWO8HwOP2>Un^rKrw$pl*~s+RmPxg{RyOn@mxw#_=jODGbcVQP7H2V1OBf8XFA zn7Poj4{Y7;;{#LtNNpUJR<(TO9IRt(Xm_zI#jQl9lrhemi~%H|Vg}n}D?){hzz}ww z+Ri^pG}ZSz*uUSJ*w&oC&QDBl258~_()6eFe)Ys}r27tfyJ6m(urpa^iE)7dULF%~ zAv7`I(7rU*5m?&)cTDEtiMtMo)p5`vUS=UI~`NOBBjMca3^U_E0zP^ z>ko~+O&W-Ja4f-&)+^U)bN1V-nsX{v3iT>CnVe2*UOeB z4bH>FN<51TfyZsG8>EJ0Q&jy8nT*Oqh8do(Cmt!QWvxLT+zP);ySQi+^vUjS@*Qi& zI3X~fv=mbTH7g`Y0l|s7ZF?D3LGMM4zROBPRU|;q!?? zmF&w}A1`L>9iVnH-cVg-1ysJv5K*!s}A5w-O09QO0;QLfLZ%b{*fJfhDL{<*#x(a_uZ?(tO>Ew!EF~YE7$Vz`488J z$xD%K1(#&|I!lj+UW#c9YV-Y~aH|2f9^(;97VhgT?Ftp8>_elx=+q+c7phU` z);;_0;&sO&iOsZ?1XtHSY+#eF&-KsH5hGX{E~ag9#K+RGjXRb#$*Pl#kO=h|ZCAy; z;VsSn%0*D)BSPRV9#%$^;cwWSoqs;tz^0|(niVGS?qegJ*bm1DOgvb+uwTvYB|mLj z61Y3|iG4m4SK9H*Bs@CjUJ&Rgt0Wy)3GiH(mVe{)ZVSf}B8myg4d zj^ejJOMVbi9Z`=bZo$3d6I-sc4Wi-T*qvHZ(n%d%-1Gh1t?Wi*SaT$KC1e0g%sN}G z@zj+=zlq5s^QIUtAuxlzqN@KA^W=w(9`kNA0Ri4=f2LwADq>EGSKX7LsF|sjfp=ka zvC>+SI#n69ImdIrk%*2YE(?`6N-r>O&_K}E3xu>z=1%kDDj>PS+=^zs#OG=cpELC? zh(S}9&yB2Z$1Rv8)f7qX?7u z+Pb7hHX20{5xZw7!4=C!#p}AWi-#?e_xklpo8pe76h0W_p>y{=i1Cwqt{7X+BcV;6 zBn@%D&J`UlN;Y?y)3s&TaoFelB~!!Mee(fQrC!%+mpdamU@`cICDAFTu_jG4s}ePl zwsw#9QjHS>doaiEw2Q`e*9d24Me<+`F5&G@$Kwy%Q_Q#vflY{ymbaX}fp$F*pB@do zgyFg&5@FpF*u&7mIogu}sShPpuhjnIxx?i)-E^pcThK}t$}s!O1I5mtpIq0{@xKtz zg5e;3yy(CD_+Ei7Qe1j0K8VZDI}C*w$hn1v+6DMPj2OJJH5dg^6i6_FOffe2e$553 zeG@gLbgP94wmX8j+3q)mRk&^0W2K)L5)15L&I?>WG$_-Qz1d2ut*2^3vy!pfq4|%= z1>Z;=+HidZrgI_$O8<{}!~blmQQPbcxA$^2;VbO@c+H{r8k6+V>-8lgE#E9I-50bF zX`orHG@~$6j0ueLDAo~HVE#6`hW1SMkOh01j-gtWCG1;r+M#;&PC(%-dTklu_9J-s zV=8Wvg|oXMJQL~j|tm^z!RooZt<87=sJZKXWBNz*+T1g z`~~*h`^WwAmFO8pS%oVBQwXlV9_c{ZA2X3pMMlw1HN1*{M+GwO(E_L6=?Zu#?z*oW zL>j;~4qM(YA0ch+1q8DBV&Yb=zZbFritmseK&v^gN>z-yHf4Qdk0XYu-az8IfXtH~ zv@%-G90QLw5Sm|F6?z@&hk~1ko^^g*g7ae2dm&KsOYBtxsIX(BP0@m%9~;-MTAuYB zO6#ac&dAOqPi?p2;&N~fnriCShA90g_2YoQ(~_trSVL>t@t~D8)D(Q?n9Xi+sQYp#nkop0&c z!C@0&9MeS8Uev|}jSvImeVlWgDJ{y6rV&QBLO#V&5`Xqai#-SPd0UZMp(dgbj@ozG z>l^EH!it=w+SLbW`gS@AUK$9tlCnj1*8gn|^4`F3n~$m{(V-o4GeJ0@p&7)NB$H4+ ze93v_A>!lV*Zu}nn~>3Y6YAqO53S*oTA{2(xPt7$x#E58nh4M~sOFV{j;CyDu4e65 zLX~vTfU|abn!Zv0m?Qy1iS12IF!YhmFL0k47qXnWEuD<8ij+=40B^@170)2IkJx`g zqckW53l2Xfm1^c8L@u<|gl@6m2#9BSl$5A7<694$8FFc)u==EhB1LC86^b}l8CEDd zM|R0It4Mk)pqKZ{%7UL(ywk|@{ZcD|Gh3s_SB|^3UxT)B=o(xLed&{OORk{us=bCF zX<)x7{GAWn_H<#z2BXfV+mwiXl~ST_Edwm$P+YH0g6XgrRC-Y$HD;wTeaGmxG6BGB zXN|l}0T1G}P)z_em85j$Fxs1IdZ9`1a$%?jTcHshF^o=rx(B8oT!ezQd!F`kwvz`_ z3j5F2u7+P+KnXXO8aCbXP<4;&nirqc_OMxNq3?k!S*0SG`n0~4adKD1?S$$E)FI+o z^`oHVN15{MIxabw>FmXF=qZ74m5hYcm>ZE+b9%RCRKpLj1`c%adfoiuj`Z~0kAa?V zjG_0A-RVzfHL47VZrt+_ANYawhw5m<)#a&nlyt%eIY*{I@)Szj{NJoP9*CkkbV1>W zb#O!PP4#x{hEj7Zp6lzS)hW~uewPFYO1`6XdthXz(h#{w)E?FnTtn-(Ix=C2hcv&E!TckyT#VAI9 zN+op+649GDw1^KD02wEa7R&0?kef6Hx~kX7_Q{%BhFqA67BQ){Stl{2R&+-sgDG-e zYB~)*_Vi;N*6~KMBe<->6%@prea75PJG8Ccq)-vORci_(SYUKiNZuf(!w^!)Ca1w) zx51@AHWOIM8KTzM=BfBfb^SiW;npJG_K}3LgJHdP|fz#M2HnXaJx(@!BOoTeM&AK##z?O*$i8GQW*4;H8 z@Nh3H`m)rzJENrID7yP53`JnXT(;HmzT+0YQ-+b zN#9>M%`8&Rb?{c1>k5vPTOl0;;AqDKu8{RJO?z_2fQqzU$oV)#)}{qNn@pmiw$Q&< zf5J9rZrt5uS)B4-#sTgyljr@zIqvMA*Tk=m+qKvVks{;Bb40xI+{Ur^f&!n~ z^$&{uwicB8QFm)D@uYdugJSh=tlqICf0x7LKEZLo%0R51>;lbc=*qZqHBrY?z#IaY z4xzO-WflDkj-W2^5of?tAVRFZeY%6pDa@2|xR4$uHxAf2XBGeKc^A#JrJxZsh@93A zyD7-CL`1Ioyll(NRwvmzN|;sX*w&2lsnyPX|}fm5l8TZsCG zlTEj@y`!Cl-<~X8-f$>Ywt-63U5w>0hqUzXx#h0R3wa@9$%OZaefV< zi2=`WF|!WYo40IK(`?F)U_NeighIo*S1Ittl$(ialB}3jDmb*D^AhgMw*j}b6B?V_ z*HfKG^D@&Ftg4CRoXf-%t*Ud^8k}fE9F5oXC#%*bNiUjrYXS*WFhmzwRUGz73y2aJfvOx!WXx@6cOqrQZ#8GyGumN7aI~ae*qT09_`<%-gBlR*TvNUn( zHA3^PE~>F=k*u$lX@<5$h-4b6UsmK_c`HCu+Nq%73A4*3UM}V`M|kxqhvVxy-VO_~ z&3N=+lzrU8OhUj;K#@|polqEig|E{7d&d0wTCXwEU|;GguM)V+!7g>RVbxum0q4zn zg+W$@=-Wl|>!O@3&1LR|^)`m|LATHGc7$BNytrCzA6{UCy3f;cu;?iW>kFDy-oh1S z5U@>7(vp7F7gmsp8cKN?7x+#ZruLA{W;Pj_Xo)}91IHG+US41qByQ@?oEgVxd5+bM z;0P$ZO!5IEd0nDdZKW_G;6MpRI`oXbTJpU)Iu#?~Qx{EdU{p5fRYbK&I1sCtHi6-F zj)T?{l!GG168BMDO=BK-pMW#Y{jN;@eNS_!_K~#pryj-9>E0op^iQff{i7IDfZcBf zbRo4aLfFVyKM(E3(=9l1^Q!CC^bATwmYEa+(SIZX2VSNvq3iR|1j-LX4#qPjQf#q2 zcY#6QWA+!?zhY-JQ0Xp)|A}e~&vK(qd}>_Rp=r~{YGev z?^pZ%p?6?Uso0+w2vCoj4>%UJmlbp&x(12aKmF(NUJ|#2z?+PZkh5U_nO9*oR$!7h zI*?Om86H=(?Y;fvOP6>ih_TOH?!Go$Z_z;?$$ad*9?gJ-$o>7#qkvl!M;%I+;-Y@; zVW;bA?*Js=uiIH5v1W)O?yyqMqY>mN(G9LYQ?xL^Lg=b>j~8o4>wMgdZ0>kl=p`gv z;U$-Tb`rG!vzzoADX^#fpEpr^r3vStk}A!9*0$x5eJUxpZZV)>wQ6XrV2PcHdx?V> zm?rwKXFEBK*d-fpo3B+kesC0peH3B<671!2;BFA;cmu23$*nm_h2|%(fdgjh=PgbnMA*mP@QSIRWhqAYhYO8Db z1zQRQN`V&l7I%uf6?YF7g1ZFw0xd;~yE_yoI0Sds0>y*7JH?swd7t;*xijmVwdPL( zIpmz3ea`;r-sf7|5nGM^JX~kSq=#d7SNR=%bzvRu(m-3Q^|U#HW`6zW+bB5e3%>&J z5&!=Zxc(=g8r(dCy-fOad$DskSi6)@lJ?U9VP+6g;<`g&nhSSF=xHv3Ueu!3kba)u z&Ocq0dxl#p2+BKNg)K98gNx#+y=E#5+NIWTjfKV&OEqc$D%rkXj^t6jxyBE0oNFIi zIJT)-9z~L4?Nl+7^vNJz^ZAap3;xwvpw8i7=xzn=0XjkfSAgRFe(C8uxQFzE@Rw*M z7`?FHQ(3Y!K!=YcO@exiMpZM|;=H;+3%*-6#EI#T7k0V=qn+#{C?R1>9`&58rf1d& zD6LZ8+*-9OC3&;%Ax&R(me_mHj`XD;a5}z{HxOt5aORND^itpX6=6m` zy6`m|ODn1=?V^a*b2>2+lG&KkmT?y;8l(dkFMBhWIH^8VH(xN^GLHbvJmjammd#ou zfayX1Rn69`nv+!^f+ap-{HkMzrZTiBe#5&Bbtd9}ypY^jw*0W0VC<~Ul(4}o*0g%N zHBDFLh-m3GcQjU@W+>a@mb!03>Ewyiep3W+dMhP-L}}d|cX`hOu5)kR3OA>x-7S6F zBBN7SJnq36(*W1|xTo!cykKsox+d^=W@ipBb$G{kHDc8iY-W_@8^7k1 zwvmfi@~)eqlqt2~`Jkd*d#IrhwSVBIcrf%(#Hh! z;SoU<)q`lw-G&4^CeM2?O+Ho6cz#O-Hs_JCP>J2l0|$}hFM6Daee9xkcHH3#3nT`m zV;mTIy(6Qm*09^bDU(HxEH=C`oA`7gl8hkT8$W1zfSW7DxCFayknDH%vyuu5QP5O^ z1y4wxUaDFOUE5)3pv{%>Jx^%j+;OJ0<7BEPRf34bwp7wv)2*{K#ou)*pJcF)V3gj3 z1j&d~?L*d=Sa%`znUt}mDKNSBYW{Y~qGojYjTVj5yE;@!q3;&005*GBg88*}dZJgV zy(`$37}PnIO^pH>6mwG)35d}Ib8iI$(E@=9uh1igB{5kfT~!-u`{`2otMht7Tb)>M zjX|8XB`F2|9hTxE`HbSWMWc2(7U7|OfLfQ{vFu(IutPb8_H$4FWPIUzxQ2i99qxDg zI3KwPQz!LHFLtOd@ldA^@&>FP;Uh?goa%wCQ(}ravCY~A7U~>lRHRcov>xWs;r_7wO3zQ-bLLyb1<6Y)1}SOutgH#f z&=7fB^#fYKgmMORIe}4=9fpWJ>wdYKtxQRs;-%*WWMJOYCbC0)0r8>B*&-TcTsu(o zQyu)0TBa3k)>1XfgRLubE%Qh(%3LzlkcbAp$(5kJ+>M$HN6rEZ&uXwaE6#D5nI3DD z2g)lvvijN(*HEdn`sxkG7Hb=F6i+U2Yv8@_GgspjvFL40j7=<)Bd;+fz`PLM5-hzH z3~3nkoVS88gvBN%kIA?$$(^jhO1}K;W;qpZIgaEq!jn8B*i(z$KGZt;#m-YF;{;AC zlSes@IrCA1)4_9$~>q#VeO>g29YxlQrfm<~9$`m(NUeP=(8 zvHA$*TO$Ckc~-*Rf$`#Uo;jREw|4GD9mn9bDkiap3(vABRAcJfjYAlu`lmKN)Ll_K zU%T5jw=Trk_LTxRsR3WNUgJuM0v$yo7bvuG92ROAX{aVo1VFirCv|hHPloL;9pQ+! zQzWCrkY<&|JS&0|aOaVAU+E+6{zix;b$XFyQn=U&zdC41y1w?&w5dO%?P%*vl|VaY z=Lz53Ir8RPR~XQGa0I}vORa*_8F&|X@Y}*(3(%OfE`#**xHa#iSs>m^es3BF+xMT; zUIGxKpb*{NQ7Os-SlD5^kcjJw=yXTa7Muw9y@cgq>)?)T z00PR3N|O+1sIyZ-31@Nt1g)MKt=L7+*vyWJ5DD_v2~cRo76=mv1x_n!Gs=LsIO{gj z79!U*+dUnLp!K7t%0!6)8?P;$7{$?=Y8W%SsQ?^lR&ZF_lE7sIm@3rAUg|k|YM4gT zlREBMD{Ut6zzsV?U6R&y?VtUAAD{W>xUl_=i@bl?I==*s;-4OgTUqPNN{PG9LqZPh z8ykey0!41y$nH!K;*OX_(q13W>Rf{(=d)bij`jD{?VW(KjQ;0>lhzB(zSq*07gvUx zGshXi0uItO3?7CYk?*Xq__>iiqqE3DOsIdFdN@t!X zoLkb{F~CRLS^m@__W4AHS7#k8jx9?3gDgo1@qBDG*j1KO1!s_EOb(RUsb;n8$Je);viQw`_=x%> zq);&jN~o9mSLZ9Wh75*fjsGwV;OT=o__7rCc0q<~!(gDWrVS@F|kq<8;Y zRlVYJ%hyyIigg_q@4jUw(1c#ky)XDkZ?HBecxO70W3bomP%G9~oX8MXp{~Hl+RV(H zKN9l2L&c&x2f1n4JVC=W7OZ~jVcBV$G33P;qbVg>f)Pg=>LKz{{=hn?R_%wHEFYOo z6>DyLqx&ZSU4VJ6|0z4Q?pwJ_sg?-o_m!oWCRVj15$aF#k)a~Gz0+`&u%rr}a8Vbc z3;1p{@5wj8bANZi+ovLiq<@avk{>gbSh&YY<8|Od!F;QbAujc}%Izt&cu7+|8lud@ zn{&A{YT<0zCWxhsa{I2RJV&9)j3v;;_j`IXjXH`Aj?j?-+T(2Kfj?E$te6eoH6I~ zNGA{N6NBd0p$gfJkzE*5PDAIs6*-OW&%6dAYqA-HoVN|F@e~7C_@n`zV{SS8o?VT= zvOK=z;kd#Sw$2vU!=HrfC0nuY9eHE?Sve`5`E@m;r5v^Lr*e#(Hon1bremzQd`V|b zQXHe~`hBIXw>|HqGz*c<^YFx-CadY9a|aO#Vee{cCd$QC!*rmYp!E6`-G5P>tvB+{ z^~4brPpRWZSEn3xg-M(7qJ5*pwjA{nGJT2qYN@Yc1spN8@XzXcyl>G5Pv1O)m%lc@ zG3UEnTU)!%ptVOoJ(Mhz_*2{(_>pFm!>ZyDdlwEX)}|Y0y24fyoJ#p`f>ELMmDeSm z_w8LrCvJ|S?wT62>j>Bm31jpz0*2{ugmv1aXS0@nD%S`%qqQ*oAClHT*0le}${idB z?AIzP|1pmy6@_#HPR~-#se~gh{4PcKKka25hG==lB}I*2ls$P1z`U4f%_YMlfhXqz zRDoI%|KhoD*iio?%csG}ai$iQL&%RGSAcdDod)@TAyn>$X4}p-ruG@1rJvEwpOcl_ zUI=&V_g@9dCay_dj9Hub%he|Z-F$po--AOp{LeRD=&hs>VjbNF;F!Zd+r&@{F~_?( zMe_Gt!%ij7cF|Dk`q9}+&+8qM{*$#h%nyPO=Uc-^3L|KNny@BCrq+(5K%a?GjU@!A?d{xCM$wIbjXnjE*w^a>D7KWCrouE*&k*{+V>Ls{{^r|ADcNipf#w0>7pho%88N{(RlEC=$9D zU5r_f2z+29GiBD0I2;a=;B2e@rFL8Md>f%@P;-oi4%92}0p)MbD@r#0s7IfzxW9j( zkqb-Bdb&VI@Z?Ia&>lVLTi7nW%FDd)YHMLHP-%GoU(}ii6v`i3oL?|k8lt8IF*q~2 zqlTohlYa)_N=m#--_zM}|YO2ursZ-TZ| z@-_l+CFEfV8>jKiTsqIVUx2f6T#U36v`<31P>L=z6KPWgE zs3Tlgq<1|u4MI!>eoHE@iM&hl7V(i}T17C9$qQ6P!MZc=ZiUG$<#S>(!!_B8_x~Ps zu9?R6^?PzBVGACpS8B0B!_k7{!#p6SETm7%tpF+XB-_L>WjK~f#gxZ>Yk8yvn|Z#z z*XNjmcO2-ml^)amN^+RXh%6S^dYgvtFW*IK(^W2Gu1^O;`4?=nIWgAof!j2*Ph6hP zx6sseg?}7}U#UPVvbOWAvehoXd_zV-61pQ|BAK z;+ZUXyBlnxH8cvXt?6r%7{+@e{l7Sil}JNU?XeF97Y}3O?}8~Ez7=FTr__3f1XZ)E z#5AW+4&nxvJ(OlT|Ir+8r=jZ_M;+)EnyvZJrh*u%gqjgWHWH5WQ-LH4x`#Zr)^lUn{nW5W2?iMX? z5M1&&$c5jX%7*Ij!d;yhZ|<)CirMq8m~k{C;S;@5Y*yFuU>k0CHH72gZM0xqt1y|4i|} znmJs$7t6tgvIPA@mcjW7%U(#>S|8{DP9KaQ;CCG2|EBJ!_l8Q(o4>MuSK$xrS6<0_ zQ8(~Snxt6($t^5rpk_tBWnCJ_A`rfW8b+%j)=P4*qravE(0=>msp(eFmDG^}Tky$V zT#YP=f|F!-msVf?NQ>MSFlS@*+G+L=_)b+CH$o4l0x&-apJqoNkhNZerjf;bzS&e* zsedaS!jK)VGls=vM8EK?ag#bewBtVIo^WJL%F1Pdwq;iACN{pm8u=Ew5Q$N0eOw-v zTg*Fs_m1typ@0j?&FQHFByFSNtG!0jr-JtPGGgFYU%q^4ag-jK#qxM^_m5}Ns=Qp) zDc8<#$!Ny#K!r=$6e`pof?uj-z^O_Xb-gmzitr?X+C=#2fjz=0+(xPLzDKFNC}xk z;ar0veeNNDSJ~+siE*O6K@sdCLFa{BUbs-o&Faam8veN0n@FPvyWQVH13mpYbzR77 z0FZEc*(%l=P(l|fXL+f0c9)uuG11Maai0bLpKaGJZcdP$tmj`q4g8{u; zEI7HLjOZK`WFtT|Q4Q^{Hk57xCk+!w2A^HJn-2jjbh9JlYV zVv^z*orMW<6{vC+=^DA_KkJacXx}e{4?mswi1?Lp*YH3n?;DMDTSvm6A+y^qu2E59 zas)=kWX60Uzq$(r+eLfQMqJ!ZuaVd}CKbc9yQEB9>Gw{(3Tt#dk-yP17|DwUQZ=x2 z4Ve9>8*j}Qm2yk;0*heacSR18A9+kwrhhBEQMm5}>)5G0-2t9UtQmgrhNc^&)aQG%{2lG4fb;yTS^9;yU!ovhrVqrfkwhE)f18UAN=#f_-&V z;pTr%srGC)({dtN;>=$;YG}W{1>8+eU@ll;}H<`zE2z>oafGm~T4$U<$OZqJUr>rT%6Czvo6={0&JDWfsdcs|w9C za3)*pr7QW0`O~_*m;pR)Po5AZ>GYh-k5W-)E6>e=lq+6O#cy@iEwEr_MKS<68Yiz+ zla&-){3c(jv`+14o2^(!gH5YI9sND5Vh&AiM|Zd++3sno4JD@E@nsD0(aF+%8I|+?;0* zBrCf)Z0%XZ{zR_?41MPyi6WFax2^s;>$sfi{6U^#uo%O3x z{*3{JN<8QTOF8;3g0t5!LAb^1l$of6zK;mpf_;XLrh_goY;O zlJiR&+pV90aI_8LLHCJdFtnwcMv0yptT-MKC-HLP2&%kHQZ#$R0|lLI#?q zdoM3k5Vxk71>Es+89bKxOPib>h@krhduuD`PT>q`BpGRZ8mW$2qlwnNkT`N#5w&<1 zfnkUzK~R)ro}2lHQ1knAW}if0O({S5E%v12fn`7}>pbB~T^g|XN8@xcQ<`sV2k4_k z6@QSm--HljyF&05V8xoxY$!Y0D zmB2zKAckR)^o7brzS28eRqzp>;KU*-tf~1|`5jX-6u3S!hO_0g^wQAtoXSQ#DPV2OgHs z4q#WVi)?cSs*IdXEuF-|4U7}Rf?}689v-8Muj@=uIjX46U)&GJ;C!M9ZKbfzBGmL> z{;sgl=HrH|BCa(m;q5d*Z*m(R=-=*G2+PAV7@YrctEOjg61!nK>>>zSbDMO9O#4}+ z@m6f)cy5qd*#Y!oQA(w;WW^3s$7&foumP{3xgkMACR-?&HM~_YRHeBu6i!jr(T=I^ zO1mvk9g=K;3)!uE)aQQo?iFuDEp z=p3HmBZ(S}=JdFK2UyvNzO1?~vPR=9>r2=c@)_8oEFCB_62BAbl$x$1#VCP4J}`G< zzteXk_+_w4MQ=99;aaaG8)v^+cQy=q{Dkb}6*?WxGeu8{A*?ffOli_SEF{oQJix|G zv3WXa*qJggNa}mdJ4GC*wtW~&$|3x8gm+Mshl%w|+Xa9T7zw|>2P8VV+xU@Tb1|{X z4Sbg}RhoE6ef>St@%<3@xLD=(I6ag8p;N@%Z(p1|)Q2QY zzL1genL2Sj6x5a3zOCj>1hW0KRUccZvW%0bP-rvn57-dH4yLk*T4`4ckBr~G&LO=n zD`qGC5Z3#RuHY#*u5b@vlX(WR9cobJogZUe7B@a0{~Ut}%Jwr$MspN4vg{;~a8!vi z36N>F+mmg-i=UWFO^+OaP|S|48;M<8%>eObuJ&$fCL^U!Sl|@$6}k4z!*f*Yg>)pb zPHKa=vz<=uOdPX(`Ii)%ibBTS*MePA1Kxe^2pM0IquXa{HV3_FcR#&q7nM@tc}+6* zZqrhQ@D0)rE6$SAQpWoaO$$_Rg%k;@?bRZmC7pF#Mm0a!evgc6k!DXSokn*k^Ert& z0!a-pQ+(@0wNIefhJ*acwV;COw_I0%;xPO-{S^ZkWdenObl+kDLK#Tv6-|SYP-A z1=dH`ra<~6y%1s}d&PnmaIhBUk**Z-;M656z=Iiqz4EY0x9#_PeEzrt&IUwOcGIZC z7vh1GhAU!Y6`|Vj5O#y_+!$niw40OVmLIRgzxT)7Yls8UwMAInl%8KIz);zwYQ6$JrqR< z+xj`);QUbh6O8kw9W4~d1J_oC*&=~_z6|Zw8mZXsPtM^ZSD3G1Ay_j+S`xkJ& zw(;ixJnI@^6pq&}_YTP!Yw0G=>45BZB|wnSmul-+QaFThyk)<7OJ(Nxeg0rg4KHjC zv(4|hP2jLxWsdlNAE=Nkl-h?M?8I2Ozo(q_)!N~gfjfd-T6YpQPq1@BNOu?cGYS8w z`Yhd=}U@y3GTN32Vta_?l&B-XFb<*qh>zgxWQ%q z2sn$N%;dzVL2c{=``~QjzU!kz>b-n(%qm(hUVzmZz!N%5qV}0&Cr>XSIS}*#c$8#L zl^R|(Mqe$s-dVgAAFaom?T|KRI6eXH6Q{?yhNl+)IcAxIP1+CC1%F_(=rpMaR#u>) zC}BUdc>SK^ZWJ364{Buh;L+U&iW$=W_+UBZGM%{~Zy6oKE*b1@^We?JS{+YpdSO;j;u`e4kB zRF(51O|DpANt!=b(riG{jLsk1v)E|g&+T1n)@o;7HAP!}o)P;q6CGh5NEpM3)7p(4 zyNv{aTBZ4;C;MBWjF;RZaeTz-BiorjG>4$*00X)f+<(U&4(h&*^_qcHAS_I-eGv1S z^5f*lUY(}AvW8+2R6V6_#KtG#?)g}_nO$|Z(G3F;cT3r<*OjK`6zi*L?vg@ZmTy>L zQi3zSbBoFx>c0m)dt*W7HG)>m80%ly zFSLP!sd50Z$cE2V)r0>)^8fcNR)y*QgW}Eq=ZPPo$H=DAK=VU3NwlpsEX)TrK26^p z9r@r9-WBmlyBvFEcVMH?1P%Pi72w?Z8ovMWRRa3P+1Xjb6|3$N9G=7VeT6B3vjbEe z)z^{8JCd9qT~3^{nv`06!}No3(yEI3>MP{FB#Jjg1EYjk@_la4w@%uhX*}}FCPZZO z@6<)i0_3_BmnBDbS4d~VOAg`AfxC-yme4Ou--=<-8LL$JMyhBKRy6Jl@u3SGgAXD|wP+yZP^A zPOLO5xitB_7o2S;+~v+=a4)}_#R1&H2ZvW^T)u(p6*VoDC~b23tI=pWG8kto7NlBn zp)Kt@*Yoi%PN|3im3~OP3E1a+x`A>fiCScsJAH9i3}9AW+me@V(6X*?`gS>`$a+l{ z34!hR7Tj{oFnqJhey`+OxY?-hDEEsn`O?jpEh`XubQe0Np8^yp!W%nXc31y(TVueW z?>0PHv}xYpil%2wcG;?hRpir31T9IVR=A7czUn6-oL|)_;;vKVdIuiburi#c*>IG@ zJ>?E6FV@z}TExd+!a=mWKs1ypP_mW*1BPsCtglEEJ;Q+s!p*;WYLvF3{OeXV%{OH@ z+;Go9Hy@G)RK~pW=B3Z+^3SW@5-z1h=9UF2Txx`thzP6=M%?=%iTAqwxKsiOI<9E2 z34o6n)(P+$xd!9OijlwWQVDT~j?T9q#_;=lwrSi(Exl+BWMP4fZ?7S0>sq{!TQ$a_ zUBVrGH!|tQ9-d0oImAgr;c8n~WDy&pbNEQLBNySqu-?RI3rsbodHbjx%B_|DkhW+g zrzEufJ=s{G3*r@H*TE%BWAY?XFd#oo!g^B9FtKTTk|FgObRiRal}k1tBF|HAMt1A! zad}W=RLyVxg5~4}zUwdOdwQaUl5&L5R&9)f`dyWg3s_SHt=iSK955?*bG+2t>(8`q z3(g;09aQf=xM*@hc*50MnT~wpL5%jMzafDSNQ7Y2wV_`+%<>CIR1~C#mC{A1r?YOPO3^GDv_DUNpFH?X9j$8{Jd`3; z$djx8*t4&F{T5ye;#ew>g^7L1!o!xJ+O=v9;@Z|UW65yQ|KY}2ucGAPM_LN?=%Ppk5{51K@PViU}n~OYy zAtOEj8r*w(#rPoq@~YiCO(XO?M~aGgOLF|?!&cr%LaZx%lQo&nUy$NZo)Q(1jnGUv z_1goLc~A4L(mYH~(F$=nLy&^iW&G24PC7h>yFXR}p3G5u;to=G;D+j=-qqy|D~#+j ztj@AH&dv@c%&!nJZp@IN@~4zcdR@Hb%hU^5GIxdz-4V@R!ySq?=N3X5w}tga(Qdq+ z$u6rl70U~=^iUI6C_rXGuv#CfKfE!Ip@2_j`;e|FqNw+bxAYpOG3nwN)#{CDHG<6P|55|SFAWEvW7*$MO!XJxXqThzH3I%7} zmSmmS$58=~p<6OeAl8lF0ChC9iNFwB5^dL`ChTIQmwV5>qi?x2PEa-Ee$ROtwh!p! z+j?E&_CeTj0ffyomo{yVjxg&3If??`=B4+A^1fTzJDM!j=4Jtx#0gA~RN`qQ_6x2J zJVmc#Ya;vmAiNY|g`!Pf^Ve#1GnbeUcmdci8b4ykAm;scLPp!cd~;w>vhQBZyb@5fXr zV|bXtrVDiQ%;SJp{9ZJmoQ2o}LxOdH(x7eW0BWhJ+aL7FfJ+Y^Gl+k9*qD1&^@;9S zS|TFtt7Q4XFT3|EcD0}c{gtZ`nT$pXc=O>3%4~jHp>Xu-7}(b!B>;oY4B26 zwfeOuvbeW;rA~fI(E-H~$Bxd7fbH8aE@DZa0;TI=9O7|@uQQ(&9PWqcNpIOINFW;O z*FYDeRI;$FBV9fV;?Gz(9^t?vDW@*!1w-Hl1+)pRPGdGMxVN~; z?KBHyW^@|Q*f{-x$#n5@M2!dwTNCHn1?-dTo)ZNNrOHs20fdJ;;2%tE&w!DK31JIo zKX$lipK@sD+w~>aft9)F%z~jda#>di(0*?Jt-6;H`jhOYRit68?el5pO05v}fU48{+GyRkwTG9%9 zHK^xcBaqIZM*`L5#-9iA9#Z|Wk^ODkqA8gc5v+rA>`}=FcC%&^UkTDLW>}mmCT55jc1!~F)Ij~OwB0C8b+^B?LO-opEKMuHx>suwz@l3GDe}(vZLw- z?<0KoOy*{&B-{WmQ}z%s)^%i}AEXx>UegX3&iyv(^!OzZ#@dL9&BV;2g?bs)wB1IQ zG{+R@>1UGGn$ld*z;5;fKKJHf6rOXS?#p7VT`gG~Oerk`1diZC*eSRE%4NAs%7Bs3WmtmH zHX5N!JhMOY#cX0_fx5r4zRZ;(W*TJ|mwa;wK)E(-NMnvEDmZgiJ(#g4X~w(8nlE2` z;Crh+%6A*(87|JTG?LTVT|3lQ&d2zHFXhdzKoH|1Rg2=KET*Ag67WjDzF;#6=a6{t z7@6KrfnetstJ3q}#wzz~2s4hnG|^+WP&q)MTpf1_CG1k~G|n|}A%)!0_#!@Q3lxUC zc6T1%MVD+}-#F8RX*9rB8vZ(v73An-A+R3f$52A*yCf?6o*o<8omuHz!{rtfkiK!6 z!x)1NT$8%q(fZ|Rv+wX5_hcQTn%q>Y9VX$bM{=*3+Iy#@BusU}G`dG$z$jEVF*uX^ zy1%D*kTYjOMP19}GoHok%KR#+zInsvO$DcMg`~IA3rkfp$vo2&+a;aclgkf=wDrF0 z5n&kbP?uz?%1uJ6v3J8;)NgkAYMAFj&%Kzqc8TQ2Ue~g|GTX9Ks+ErZUeRm4?;_B~ zR_9d)62UNFh9pb4uXtVK8Mj;3YC{_=9H*Qc>l`SQR1X!qV0SbAE$DrGYdrmYAqM^V)A(HT@)<+Cv5A2xh#+YIi4{;nQ z81A_DfhQIGvOIg-;U@W)|Gorwkf0OrEyDYMAAV;XEA29l^&JZ9t*6`heeQPslk&>( z-TCLXpi`b8l9<``?>Jd;#UeiZie&HzQqnA`z-|FNeVq;Gk8q&J*cUnJ{c_ zlK6C13(rj4;5H|{wLkQ{SKTD6zf;2A@%f*CBUQyv#_$R|{T^;6UhN2KW%1O9g!wEq zzPcvIDnzy~st{X~f=3koIT2Uz=r8kJ=0t<$>`heUL(8cur*+|e@K489{rZMp5Au)hQs zZ-nDE4?ynJt=Mf9ElPXH8D6pAuzdc9e5+LshslxXmvd>jkjP349Qnu6{-`>zIN7FK zRM@FLm0R2#$BU_^M*ZyC%(upk{w*$E#P8{0ts9wYR#Y1wL~sc&b=3RsV8Lh=Ja+%4 zQqZ9RM1P96n`Hf|1UmF-f}?hHjFknjglsAZt93#o!vyCjgk85qz}#-9?kK4P8_T|B zXio4ZF517$-rtdN-8TB)#NYq?b^2HM|G%*eg`QtAvEc;3L$L$G&!YQ#Z~A)9dT|FY zR${Le-9&ga1NT^|BMx@=^mzX_$e!i*7`;ZluiUs>8_b-$;1E&)kXMA#J{!{$51kXkM`ET(T54`xx=fA~YqwuaUI2HDv zJPt>^&C-9m!kUwT&G&FB^ak!znyoN6GQwJE^O>qxb}B=Aly!LbJ#EMcHu>P)8JZA^ z;&pBo)SW7b4|g26Y<|l1W7)sOq08F;WcQ5?Bl2L0I~xtK5{&tQ#GYl%kTX!L8@`3P zkDuR(gYTyw@KKP*y@U5l;*U3a4>!A?{1EY=FfFPUy>)w{(q9WhqY-$9?|>(~fvevI z2|Lax8Zzl%nz!ReZ$q_?1N@|oi8;_&dRP+jW6(6UmfU*|-oqZ?cqq)X%0g~Evt?mP z{}BnCmUQU>a1`^WG!^4jDQ8`z-i-S_o%F=7&%kd;d(qS`lt1u;%amYudasq!1YdbQ z;P_R)w=oc5S(^!_|8>!A^l^YYV}mnwN?gKCDe~P3uS3n`!*RUzPvek@ly)q)i$=R! zG4OQdpF;~YTKKddS1sxzMF3cBz77LI`$VvnWQ&PzA&qs4KHuT|iOxv~xlb5St8xHR zjkiQ{MZ*XuhDu=`7@+42L+)?!8Tw>F^U3hq&ek-CS8oNJY-an_fzhEFYM|AZKY5D9 zmbL99W+!8RGiEgW=}LbwOLV_WyHotcC+@3T^)#yv??<>MeUu9TZ;eajCyZpt9sXF1 zm8J*i3`y9}E6GEHO%5P~5I9~cAmIZI{&YzFe$4t!P{~o{b2Ty`B^4{ra9%+ZZ@NT) zlb=SR$UU946t|jWr^04Qb;C93YvCo!A zcts+vQ$fLRy@^udlka)6Ip+A?U|``F-VpZvk~JPH5_d>7$! zCAqIuSp}3V%-mv;Z(<0BRPqN{|FCF9D#Ai<)kXG{0a?ep#v>`5Bj=rvyQyQ1sG=K& z1vWdlNNJWNSzY{7hh*?0S5setK4yvDkJ+xd>aTL)FY%#d-4xK0RMtwcm%4TTxpNc2 zJsY$n(iD?kTxrQcA9m8Vc}WG8lYcvBb_6!SNx#&L8A;xbhA~9wbXPk-XC}wKC+Fz#QZW6h=+H^1itzqg&Vv*E$Yx~r^`aV#mgl@oWnJUJ{0Zo ziE57KA{&XG5y0rqifaDTsxYP9m)cAzYA*T`4{aMc4iQ9Grd#omCp6?`T+OlJU`x_6 z*W|+FCH53k9yMi%(+!uAq`cLGe!%*4hBq6uzF4w@x6)ZFEu|1K?~M!gsWnnJVr9PS3WZ>6z@I^y{FUBnU*F)y!(GuMw77y66=$=+Xo#N<@dsfGn zSfH6xe?uK9dulufzmNeVP?>j1+Ahw|GHyG8@Ag;0gBzE=OD3}JLdtF=_LPASTPut| zQvke``ab_d&sDKCUjOG7YMx;uGQ0C5!7jqpuWt#RJ)N-b2VdqLud43V>kwe(Hllj7 z$HuyPe(v|*1KnlK=0w!8^|9Mki+ba}wrq(^=R<29joW8TJj7W0vDsM`3I4ibPLz9d zmnFvLx?;Xfk?&{6k#-PiS}CT7FExhB_>Gg&PNmV``c1dPJnElcG(471M9mE)KWuLj z4R};j_4m_;X#X^2!z+iHMD48auUk*q+v^+m>Fc~d;>bP0`ubkXX9TBW>vs-7-nxBJ za3qSdCWPqbAA`5jE0Bz7TPiK>!)O~5eu*9N!i_(=af1-DZgXUI@{=6oquMA( zo9nfsD!|epWd1!v*#=T$g68TOh=O^I02*06p~3tbRO}dRq!hKQtjC}B(5MYXW>?)y zjoJOmVARpKKbnh6GWU{YnXaOn zDcEj2E}Ik*iy@OBj&)%2F3*U7G34LIY-&aUqZ}C*z`?M6-#Y10)JKMj^5<5G1lWQd zja9HPycrUS66zKd1Cn;ONwe0OEmwE8N%c}{At<{Pf--3Z!j}ls7RqnxHsG<>t|~_x zrS^-4v3I%@ZKyxbPNsMw%CWWS=jX;_<8b4CcG#@T+kvX4@l~=@lL-RE6 z`*{6g39n3v)jcgmi4E#SIQC^W;-}yrOQiDw%Ry2o|5*cHB{8(=)hE2;#83E*36e)j z6M%(^joTnVXy^P!JCGU zg<;a*qc13EJ(?iLgEw%uRD`>Mr5DmqMf7=HMf@d<(M5y#0dofgFBqlX((O_^o^0=A z-F23>z0!{ywnRyXk4P>Ynj((rg@i-K1maDKC!%Vg6H zMZQ!)hMsU2Lsk7&h9{*%y6lIL@6|@RDirz|L0#ZMZe+zC`!wKgP+V-jqd|1lE}E5+ zV(>+StdNsBQq^^tUF%Y7b(u@62EcsYfs_X9Txv1q*<6w-?b45SU}uhe*wgHC{dLEQ zap}bNP_4{bT~Uf>Z_iWgMIE&GHoC7Fc@g&B)n3j@+v0Y~o$Z^852CDvkl3B-;@;bE z2on>adAL)NJE%@JWk_PkV*J%TpEITOv76!dvkk;%%RgH4bnB!)ODGfNifXl?hl%YHqmeIy-|ld>Mvz%!%#j(9ZaVN_#!p9+_I+~h8?-Yv zg-4UnZrZl|&L#o6q3 z#KWP#CJh6<(nxoJ&}s|cT31|y1JO^nou`6^d=5-NA{d9e+$z&Q9h=)JvAU8=Zm}Zj zU&RoH1r3#*LLuDGj8S$xNXx5zy!)$qB{gVXJ4Xs=znP7KyIi=(&1<3^mmQl4oS_8! zX+V-S;BKWhQXu5-`W@U|hnE>fyaBhhI*|R9-u~BWZc6a0@+-#lNGFJZG@)otC1dys zm&h&3hm8M}oAbU`cCwL@p-=yz4o`3!{k5%n_l3ajnzKZ2?%+C?^FOcrt9JkY{=vg} zwu#_mgX;_)cRs7xh3nJIeQ)@P;j7mZSFo{2?~9*V@=9i(yG;-QV$gRhn=R=frB3yR zj2{W6w%$`!)GsT4`#$l&5?!k$_7clPkXC&iWTY?&|Bl8)UE;6}ph#^S685mQw71VH zBZ@SIi95P}W~#Bp35X=3TzWp1>6L@8_-_l3!@u!DyF+b+@<0OY3-HQWdX&%AH{ruB zgQR7W`C~8q^-dv|bPTt1w(LW5Z&2z|`Y1~%u+RDMd~A`P(;U3+OdQy(km6amPTrM{ z4{`U3cf*6gN!-C!ltXhh>`)K2L%cT5-e#%~2tjSO+H12^&GWUqc#`n(L?K_30~SrBWrid@gOBZdXlVko#&C1>h-}+e_wU5f=XL|X5z5eC}wPj z?_iUfOOhIds)v2(Arv<@efSM%CgX_=j>TvupXQaNW1q}8TxENiDBNbE_jLs87!LeG4L(qUWnBC4bA8Guo}TYzzi;P6bH(>DSA5 zokqW%$RrB@4tgG<%5w`APEYeq{!SxmW|w`U5cRZ9c=mBlPe9UHlIR>Wmy;Zk#g$xgTx-H(iUF z9V0^J00btVjH`U;p}nSKJ@e)V`oBjk8Qya8X9%DVl3CP>UvzIT3QG2QdrHpiajl*^ zmJUgJ?_8yqNTL*5qgev^U+I%9rc7m%8+0XPO482flQS zYD~?p-fX}<@b|f75gd7ZY#o*5y8lFs5#u1jW`8)ABpS7FPbwvmMmf0kpEYo@=g_$UPAYC%8>f#cFdCv@I4AmE-80A$Ku*S?7L zs(K^EqX}{spp^Ac>M#zm81YVooXXePg*CdVZ@ z9roDR8praEvXB%uLzRYHGDbo;$M?#St~-5GHDmJ4u8$+fP9Jpwq4X?4tUlG0ToN@; zSDmk$com}%yJRi*ALy+M8+v&BcD6cinr*6cW#u$%61*go8pb`{TtWcR zQAwKpR({dkUs?IaKbbhZbX^%H^i$leK5sT9|80ARXR&36sfISBP~zkjFFpZFWhKj; zBn?;hyQ6Q735_$WZW9zkg#pE}#znqL;*)bYaEz3nvt$EbW()YY^VQA za2=Umw9|kUr;rlk0N2c>Wz%(BpAi4W3MY{hp9c zqp!Ot-BVNAnQ1xU&$q{nCk8p9N+qxfp7hwL18AUb{G3oSn+@9t?M+RyEk|j$(nHo( z2C5hWb<;6TdZO>r{AVw^2bsJDHZ}RO4%g<6!Ve&Oi8bM1iKdT?ch`Ir4)X~X?pfze zTta| zEHSfTQec24pYP{Y6Bz&X56y;Yn$`ixyovNrNw8gH;4hq=}U+D6w)L&jzZ ze4B$3b#uL`JhB5{cUY)Q7%a8q^jGuZ*M-R1Ph>{&?Z`JNMop=SRt2GQvhQwF+#Tllno5othT>63R)~}-;sBSUS->SL{g9{BpdIbMFFZR zxC>Q=4UZzCM3t9p2f7FVa57-}S$wYMwg{=V))HCZZ)1gY-x#@j zR4|<7R7(Z(f#w9bR=or*7B#VC@`4T-kRmzh#FiXos~jT@4z;^-;>EIzjU7$w&|4SX zx*w17M=KbclJtE)7M#V)q(u;?`>{)VV69EQXG{>kPlTsY^!Tlcn0+gvE);N(Wcq~n z>f_fbJ-6|O%0zFSr>Thht^F{PvzxYn@2<*vtvS+)X1IXdB=SU(Gk+_GV0f^LR>&WjV8yPtkY4p@*riF z+e9E zrPj7o-$^1>{axIT{CAxmjgmTkueX;=icoI*b>GMCkow{rz2r#2+5h&MN zZcT5;8CP{6!#M6%V5dHcd6c?%W4Dkzg)5b1m032NaivKmj;ys`2yJY%k+sqL%7P3F zEr{!BOu`C2M`FzM#BjBs?4?-XE0ibWtgio7E#7A{#>aGqU>ASS$>X0bXu7Y@l8Qbk z`I zsFz5TZ=^N(9hhTt)CC=CUi=NI=w8zQAa+plaHFaqBYN6MQYat>$RcdKIEP(AZE+=* z?Q12uyo~`9AKyZMga)K^HoMtbF+X+rOezI6Ns})Y)AA}4LGjSvO zFO+vr2)smJ2Cd1~h*CwGNCp0fH|B;ogmXq;wTXJv+fgqxn~*X;7e`iv zcYlD(Wa(?Vw<|2MQ!DC&=`whqE5ygWcjZKsqa%?Jf-OSb#q$HZKX~sradF0uOxC`~ zqIa5od$s+=G;udhSee!BS4jn1yC)ysqWRA63=uTWRRJ{y0*UX0TmxtIpU<=Z2xn%9 zFb=yscZs`avk`9)sbKDA9{nbgS7E|~85Kf##w^ULWZl=4gZ)|(7c7o;d!Hzi@R?QIa zR;p=c=!amhPgO|=^ps~ag=1u2Hn(dVgxx$T_nQusRBY{@e!m|v+<0p)mU?toP%{ES#T7J~*#8Tw?YpIX2_@xlKDK#AV5DbT~Ltaz7l+$lUYrs&1uf#jLkkAM|m=A7S()& z+F%IOgZrTJsJQ9u7=kpsJ|WcgoHaKJ;hV8YzaQ!SoeI9?HN|H_hty zmysb8e``t{%ykj7#EdTF&$zU{3hW~4M*ZCvYz9U|=;C8>>r|`y9@-u<%LREx-|EP% z@lNmEES*;sNrxhenArycD(7j@-!jfqd{51MTcn~T^cNps)k&hGn%e&!r-fzoW3W5A z3;kE_#0Di?hO|&wSc7qmOd{sRRypOnDXi@+tukUm_rGH0aL$b`8qQ=$u0>Xoi);gMyPK)luu0cZ?ueUX6cU9 z!%D9PD^zV3(0kv0Pr)N_LSpmHkMSu(2heScDOZ^0Y=O_ZQnn>pPywr-h6<3(XLHG$9AbQso_*-=#7}N#f<-0HK zVfKKh;RepKiS@(*M?F@ze+@5u{CHOC(ySy|aza@@7$dC|BUX_Blz_Q|>xvoy9qtl1 z34cqjZOk$kOS;g<*#B-a$yyuR*%*U3eP4HBe94b$@-m^3NH! z?ZpP=zW5=NP!vxwQ;!>j zS`znPZ;Z_ht>doJu6dmcv?4zxupvdyObP;F%m?oMcs^G$$L|K;+cMoWHGqX3`}~ph zfD^_>oU$2d^DLVAInNx%yHZ-dzlmx~MtqAVSYWvcB@Xa%iy=}F-a?Pf8pc3qhxs%< zR*ustty2GeSSE*-J)DWH;nZ9NcP@solXkEkT5~h(&7(Fr5o|Ov{A1(RKr^_q0IY(2<5ynFXLgNc3AKMh~msSkhF728A z4p7-;!*q+`Se(*t#Nlr$!@p48PBj`iAGa&!kCnLzlo!-7!G3I2km05HKz@HmDDXcD zm;OSz#yIS}?e#=LxGp=j2v&-Jp~ji{2)2WHzW-@M?a#B72*ZELV6G8~|ActO+pNj_ z9SkI>@_xl20+B}{cyeQ~Uo5i5hscVtx!;z0y3)jdhhVk*7`_fW{JZaOofHCCrbZ}A zVk5F75d0gV-B}3a8u8-2La39yGaE-B-ne}bAGyCOmx%75aEC1zLab7h!bz)@9Qs$6 zQV*VB6ZnA_Vc5}Hevjckb;A|CWS}HCioa@~QEZiBbbc6@dWynP^)UW1ggF<5NLjSL z|Fa>FKaj_=S0wdxpAaC1N_*>rycXTxD1OV5ztB(;&6eO`yG7a!XC=)wfBZA>`bHxR zgy2Xh!P-qSOa6nenyxER%xvbQSWh#D)KYHTT_B%<`5VZc#=wCN4hkQi5ouead&F7kr* zH{v9C+D(X$4t*xB$+}(Z+d9XrO^dS-Et7#9ap1%8v}dE-;* zAK=&z27&Jv-2c2kBbGrQ|J-~<0zE>qaVw*q={P^BBVU-sgkqj94JomJ&3d#RMMS5y zpaYPpFzt}31G;j+=W+$Uwh+*I?DQ3ZC^u8aMH#hrW!Up1JSEtM%Ai<*c#`HG)0?;G z62qwN7I*L9GaBhdn3-N{GEp4L5mx2{RMaen&9lC9$355*cO4k^AJ)kMZ+xjeTz|JE zseIHxo>c?Zp!NqCM@~M87i0nE^fe`i;AaZW6Z^b-9);%-c&QnjwKcOFb_q&v!(g*K zpaKUaCAOFQ^?mMnO3#+H<7R_)Cd_Z1RCe?zQkP_4bdt?ioQa4GOQ_*c!QHuEQhK~d zVNny{bX%PI&Fqt_hlrMLqoN@%$SHh7m4F!v1_63>hx0h@3J)lso`I5pEJW`$Kn7(Z z=gx#M`l(vOgz2KKOq498(N!EB(wQL8kjC3Iokq}NkJxL8peHl6taO6e7@jtnHN_|n zEPpns?2)|Y317FeZRSMmC54K~U~c5z0aYVY@yPGLSZJ2{(>tRwJ8y|W1-h`UN&Uh} zD$>2-kZG&1Ekl({_Jv2tcUjPz$Hq`5>7&)yI0Pybw=LkLgt?0hM6vs6p}2W4x65eG z=W~p0$8PPUnCGxBt{m}r;ZKs=4-xu?)if(d*U~qJVCi1gpdSJxHKeH;TXjG zCC|aprvW~U{SBRO{)iX6q_YTg&u@&xeIK%nE2rOR!ZfU2xFd)H7l-mr?<=+%hH24X zAg5lG_cKGcRuslIz27EMCwcIIF81%;H!t0S>=ISE4r76U<4dw9HBY3r0~9v+P-&S1 z%&of=cRFxR#Z9e8yuh0WFAX@yfrR3`M0q1i*+t=0usl&Y>MKsc>bA%jAhhSkwH}6tN^^gO}{=8&;H07Yu)~!oiINKf)LD<6nZiI!prpub=6_nnd7Qr{o zjbJ?CV4zh6uiA31Miov#cFM8lkO|?uc26lzLvp5iD&=ecpL?!os7yI3epecruBn)^ zToPAw);^XP*x|uTKPgUP(@-LV=3TkYR9bVWzVk>0M_rHLh%{OoyoP{ zO2jkz@6re2S3dnn^!{+e?uUt*doSf<6KOes>*(N`-Y>U0wdmI?&lfS= zEx)33F{#m90TVJv zKJX--CJd>Ne2xYRMJlT5)4yClEkD|uMs@@ipODbsDN*8U`x4ir##(e0_DuWiohp zks6r@e*CR%{P42V^j>iLjc{N&Gqn8^1RlY!U1B|E_>@T5o_Ku4^MXx>5G~C*foKwu zjWNOSBDTyrwrKkI62M;|=XqOK>`v5q4J&~Bd=r%qH7%}h;)Fwj8Y_xaEmqC#bxxo# z2O?wbJAq?dj?rVfw7sf&3N9Z%X|T*KSLr-#je*a`*Y`tfIA%`g1tBEbs?hY|WffyJ zNP~NQZ(&V@)evhucJk@gE-p9m3-S!S#5x~npIU-@W59l4>p?G3)E`?C|3hSNR)t^x z;hQiq%Si|f`M8bMu#sI3d@curNOSX&RNf!r zr=MWFfW|}}K+(Gf2mSW_{%&Oa9Z8&9_Z=-DCmCdy{hKB7tLB{@@(UPy)gI0ze2nqSv7Y~WS zzdZI^VYymOnXZz@4@Bx9qy@LDXkO~Mka0_%%ajv8y|UF&i)d%H2H3KJDkAcI9pO6Y zIYKNhIvd@v;;LYIYP&L5H5>E3&UluTq_OC;Jv)Pm4;ScE4K~#{V@Qe1gkqOn*q#+4 zN5r-%VzwO7GT#5O<_v72Nz|XuzlJDfooJ($QR+Qn%oIMtzjzc6w$* zQ%(Ew*^vt=#lvX2&~>Ibj{OxFvlVkNhFyZ-m{nz0&vOGSYT9 zw$3mlxF}2d=6llc*>$}?U)0NDLuYP#$>oicH}VWW8{B(DV1+o3mZeC3`YXl@R zNt6hv9iEKDzG)kRL|(pbMNw``Pb;7#hg8gDeGG19CpQXd*|x3;f3j6pBuG#=lx*Q) z*pvR4h})i`VS5fJ=&2aN<){$%#4k#IsZCr~wKH4cd)&CemL-`EYU%a(+=00Ko5zc=kmtpHc{ z0OzY>cxh*;Fj~5`IvjA&y1V`JMc^{!(+^F>7Y$V<#PIC&_S{wm=V+bHVapU_`TduD z?#F(}I(PTrhLXJsspZt7;J`E)5@0p~ol`R>x+tJ)?V_CWLaKmHi?~J~n@$De18r(1 zYk+9*V>$H-K-xg&i8&=iPLm-rSPs~P@zcW}Bgd5!56F1mx>c3Go9a2p7p)*}x ziz+9>D2$jn6~m-2Aep)-NPD9CP$oCPeMqN5E{mZl4`Wg3CXTlkq_5Zm>K^W63t5dr z09BTyy~}O-!u%TI%bE(?N1SFFLYjy5*{dqDNhN{a3*IqTE@49@Pi-|87;o2{3d3@W z3N)gauV*2xwsl^NP*zUj846T@?rkKz)CEGvvKj`Y2p-8V?AVtdhwOz+WRRxYo3xc{ zx?Y_Xqkb~QBQZAE=Uw|0It?xLC@XTCNs;CfoX(y^H_K z|Fl%B3R69;R6A4NYeeY<__m0fJ@S0&O(ncpkD9lhnc?+P4iRa;29LeXbS=c4`bT^f zMG!nGX78PqgqQPRNe>UmO76G$Sx0)wcp2w8e5m|u#*2NObjDJR?hOrdZBh2C^BNYn zL+Tx`ci!I`7ensaHIh?*2T{MjnN!m&0?H9z)Yq3Fr_jLNXKR+ZjFMtr$t=$&5GF@I zny9OkFkoAP)7!;ng-UBQbHFM1ESm260_$P>Of<++i0Vr~ z)WdqQ!C^+r@3*NME|ErcbAI3#RgS5c%j)4@U#qI5?fw3tFGfr9OemVE^EKX%>gtik ze!49}^K@L#utmNp=`p8fmR6_!mcMMZHuG=+FA^>~+WkWy&a56oU3Pp&0{Wm^b|A$k zKF5Yk{chdUfxx0*bkl0?2S~TZ206EFnrwZX4oiZWp|EPxXJMU%0+9d};zLxEm{&eJbh*)D@n)`cE zLO*FLg&QLN!YEx>4l@P&;8!E+H}5+0Uj1md6GTcXobp)Kg+W#(jeoFj%IzJvwaI>}8UTt!ll`ZU$0-Kwt#oxfMy*b=JKwq{()FqT`+>N7g5`Rj}G za^@eJ$`i&h=Frp%g1yxmo65=DD&pHDxvj!!j=Lb)cyC}L@fbCk>20hI1I8um7SDDskjk| zdwM>#W&?cbtv~DlrZbtsAD+)dP`jh;`@AMcC>CZ$XtyNja*oLc)l&;fJ8r{7gZ4~k ze0u9slBcSvt5j1^ZjPAPMO*WAuYmiW+Nlc{Isw*Wm3gr0LR1l=-#oT$P{egi&0lW~ z)fL0wD>K%=c{zhvotOt#Q@WBrO{147P~lH37&bl(n#c6h;cU^oNLh~!c-lADsn7J7 zwB>(hPsIyw4~aYFB-x2&IY7(lW2)t9Otvfxh}uCWf<(V04dr=0Sdl_$?7SnGe(LUB zDKpZll5Xm~OG0NO+I(kPy1En+hmzlE2YX{Yo1qgx)-NJdZ@a+Q(kymQ2QNLi9;wRW zcji|7$}{%Kz~8*y`gwz}m;PV$cGu!~;d+Jo$lfe0inxYDf5s0k zzU6;YnNxjFS@v=#;r6R9(x;NQLSREpsv_cmGH>{W~~}*J+#i#9PY@pAFuQ&&ow{U_Lg_HYVENnW|`h|T;%5U1Qhu63n ze)X0kpDWLB$xAkFj8JUHrRh8KL6FQV_l z62e~Syr0!53>6HQ^DgU4>S-te$}|czzMyVvbo^+G?2jPJFveViJvh67`hJW!VgDtc z%2lr5HeWpl`7{a$OOZG|+Muj5Uu?S$$TWhb3^RaT$FGt(`W49h~t)fWfAgh^_aHV8qXVZTHy0Z++ddy0@bTaL-N@H`cFMJPWGXBA5al65TI8 zO5!4Xku6XLnB5qS5Vb3b2HyNy%^2!BIh40bhw>couo+89B+jwA>#Q}c6p$|2;-hA{ zOpZ!V|F_?kFz0(<$97=)DtY*1o&hI=2%;koXj3#ff$%kAjx=Pi5EGqeo8y<~hw1qpw5!Q@a}G;I!4@Vf z&K*{5hpo-vGeDWzsGoMz3Eo3wGr|)#-qXew5T~050*lBjV-0vlJjPt%U;ee)FtudMgNDtlQ-ml8CW8NaB4FR7;CEF6#imAj8@#kAV$ZO3MnpWuF#>=7E<*qp!TU z>`0qtCF?1^RcLJ=ragCaP|e`|ZP16#2EW~Dp6w=*f^FE>qflfDDeN?Ew!okG}@F#{lz*!S0F8^`SNkqp8A!$N0caV~|awRSPJx}}i6ewT8`OeELA zipFA32~ST<5{{tqm|{@QXZxRkHQg% z1p@#0U*LrXHwQNkl@sQ_2U=UBg_EQ9nCGKkpRDyfp{j>80^A7vpW{b`wX`5AE>{Xr zP`d&qI#*r2GVx?lm%4DkT`7pNPb|`4RB3LS>lY6ipi#elj4!I5mg2pPl&B~c|HeuN z^$QWpT7;?f?~v&cr}@{b;Q!Fx5Qj%B!DwDo;4nGw|K-5?e0_q5FUV#O+iN143_xHwzJ=+r$Uc&*A z7eRn7=Ll`{F8NGxhl7@cU+6Q&4Mo8o8bSKwzt)JNb895>t&`2S&^mhET$GWQ}`CRidV_5i}c4Pgan+BJ!i}#-V zccbiJKRNzUNJAXZ(I46n&geq$dIeykmjW7(Gj&5pRw>7;D&H2N~S z2`Yg0q6hpgq8{w=K~$(rl|W*R<~(7i%UR@V{i=LFE?9+36zvvK> zTvO~nK5ew=7e)` zklFmCx`Le%x%UUm^Vfwf-ik}Jx6QPAWpr$46=z5*WvUp##mi>mrn4Mg7WR@l@6bA1 z-^L}DN61JOaj`r*G@lfJmp*e8i5p&C&h&#cu@6lE`qKhm?qrl!M$G70u>`O1^%BYT zb#|-AJ=(Od6I3%-TTd&q3#N7#cs6WDpnH7>> z#2wkK+U~6(z=F)gpcOq;eU@DupsA7}tp@2(ocYVJy@VE@%*RBznnqJf!F?|b=%dhk zt~Oi1g_+Hqw!gP^p59)y1WG))Qsq>HKrU;yTDX#Vi4JBV5TwtINO(Eb<;W0*OuLn- zUX8NP6z{{pcFba|M?d3LM_U}Uj0Tys`>Eve~mF?ff_&t9DVF6b^cJqKLyTqiz5wT=%^Ayd7b zZkvRcnor}`6Ua#YB6cJAVE(^_k^va)sH35viyaFFeDXm(T>U|hzYrvSRXHeG7 zYOB*Q?Pc!rZh*V(^M72*^(V*roG=G{l{K#J4_qFFVCFLhqa|i8hVtg5F1&&oR8Sm6 z$o_nIHZ#NwAXu}?)Q=-)B|X%2DzY`e95)Z_tS@9`Dpj%bwyQk)6a~aMxR}&-?8Xd; zy+}wDas9P;xa&-9w-_c10+gH^$CvL`;p>nQ#sA*zo#^nzO+YDQQXpb$1AWIphX`Ie#IIm zN@BaNG>RimTVhtq(OpY5o7`MAUeIi6W6R2$#4~7+l3b0^fs42?fx`<&8czn)N z5-K{{9A@8`B+5xmRL%_r#r1#604~>*Z`gjxT4aSa)!RSQ{ahV_1AV7*o{$A!eloId z+l2s=fV!4n0t?bs?XH?T9e)wPxa(EhW`RDqfMRz9xJ4aYU$_RF3$$@%lLDMAHmm9_ z%+{(1ww@2<73yz`H%ZQg5H^BEiy86wzpG7m-474hgNr;rOa(1dU+rUC0)#+zSSX-`!Eam-mG~o2wYR%!UnAvuBxyE zP?wH}eKgs$LxHM2U#j6d<FfujJP;uibjUZR9oTW0^ zR<-IMo^bBUdJrJP~$%1uuD=o}@Q zF{=VTR@@7<;O3XEr_?FNhULK&SS|CNRDgiClX8No_onuGjnpT_@5(-y+K={EpOrcy z2hTm~%obW6jTM?UV5Fm6kDQoYl7v%!cDKd4jRQxeC0TqVETnK|jdGJzEgwn({?I7t zP5%MXS3gOt)ZEhjcFXATv3D+p_D{S34kV3L3@u+Y@{OZ6RiZW%S(;GuPe)j>n|91o zN!kIqia+06GxqY8LbzXdmcpu>*6z>GI94z|+pbDFJH~cY^*$j`>3ONahFzroQy1y86{;y#)R&Q-wlo@it#4Yz zced!^Qjo?EVwmdSL>BqEM1fh|Sv`7Z{!gOZCH4ck6T3Nn3+^7Uha#b|MgMqky`39p zOu~rj8jqiAJJt;|H=5gk&QDb{l8g1lT6upDRGj4rwoA$0LKx(YX%4h-i=3GUMXzLbAVEP_#=sKm4be_yQ{VI`TCV zT9@iyyYpX0+O0~J{I1a;O(Vzu!D;*-oyi`E^FGAT@4~15mFrsI(w>?c(?3=pEA$kh z`JH~+wkINmv28Elvw2B60N=m6AE&%#kKWfp znJNKiw$H;MBf#0=C4wt$-_I5Xx#%a`z3FqH_6Xw2FZSU1b2{JVzLZO}XGPkEbvhj6 z5F~iZMpP!4Wv?#RDDXl~?q43=BD~_WzyH$=VE*R`d6R3|ag^^EQ%L01^=#QCXAF}F zB_0%A`h@Q9^~eHJymn5Saeij=I_6q+%U;Ih;bHUF75w8t?h0y=p8bamt-DK~d{?#; z0S9+(2`X`=Ipw(~zYoW|+_O&m)o*BZYuEkApVxcq{AnE{4qfo2Sg~so*Xf8)rrwJ_ zZx>1B-SJmJBFPW!w`ypAK83)XBX@sYQF@>VWrMW-;D#*`VQ*asdd^P%I2ax&^Pwt+o7a(EZz10ol4vJ9n}u-u zOph&s=2Doh)q*YF|J!gUX(A5iiq@hHJ(s38cVX0tq(4f{ww^j@Gnz{x#n)|}Q&ooV z`CJsGrXOr8cfN^`$eqXfb{g~&QMk`KKdKLw-05zqQ?qAx4-RHY$3Ut0U4;7&HsCzM7?n`26xn8k@Bi8y^B!~( zFHmwlRyOQS1xKiF)T(UhU^fX@mcZ=?EUO5Hd-~Po!FIaJUpfSzTST`GLfEZGA(t;4 zxlX3>L4EJk`lxEQVTB}~1}>&I|qehgPPM* zf)V&$rWU2ED&H=G$UTHlA``eTV)nU0q{I$UHGy!PNiz!loTGq$sCTAnAYKSQ!K@a{ z?MW~j%(VpwHr|IvB=91$k)fqO8bbyBrdT?Bqr(0<&x4RKY-t)1uw3nJyxj~a@vP}z zVl?AkF=x)gmH(KFKkj<6?i;+i!N0qzLX$ri5mPXy`EPatfq=7Flx_Sfvtdf zkk`yPHjGb<(A}e`H;z!VQg13W9PPMX)B)SyUQlE-he7H;2w+qm*nY8NR8>b$6gcLv zQ8rH9v+~Ck`Dc;dw$Oi=GmiVi#L$hzG@a4-cI_hm`O%AYNBaj#;^g&9pBM`V+@baE z_LbCtxCE2Kp$s8mx~mmVV60NY)%2Pvp3aAO$b+=kO+dxZnFWA%U(lZ0STA7x)`W%4 zq`~_S^Jte*(Aw7)65@1`S(_drli4S+;AwNpoV=4#_P{%X58R(Em0Jn&xiYKHPwqTs z^8NRix;L^+xg+SdCFSrJx@m=g!E(h)|TOF)>8nMxb{8yk!g| zs?jT{{~6hbrld&w!%ye~tFyJ22(>k5DRPYt+Nm(iqOigUvPxXvhihF`!BSAk8GfkSeM=JcysUJ!ME{Zmgb-Ph)4@! zSP+&Q*j9!?Dlz^U%Y-wVq@v3d#0FPjH`?gS;I6Y(CEp|Y;OdN3*Pm zJCJWeD$%jS)Yoj6?T`d~gEKobRdtsRW`-d|!;X)R&QE6Gv!V#~ZO^NtWqxSQV+qFK zgQh0n{j^*A*o52a8}b?B-+Ft2-?j?&5F~5WH{IF`01S5bU&-(IYKj~8@}4KHd5boL zc2X3lMR-cgekRzP=b0e}9p@Q5;MzfgE{^`wM5>rCcMxfoGtX!8)(%4|=kSIJCJG$Q|^ zyq)QArYcxd>*`G5pt4Ydy-Z9(&xe_Xi|&WNari@1HHOgCM7c#<+7x&^qov0ES5vjP zc#?h=%49@|AypVg*wg1ahCPN+O!K?a)y%`5D8@LZ5-#vC6HBq5WyzVCyy9D8lU!=W zLKB5{VcVF#?Ayr)ZCgwaCwQscswB^T6X4-Q9DZAK^{Zs4CCxTSHlrWH{`R~^|1k$0 za(h0(bYz94Y+&r26((W1xM1u-eGWG$$kq3?z>MX72vhtbll%OqOeB_Hx5~gXT_P3K zY#U*g`WSQHRE?%tGlu)HN#_}3Ql&JSxGzD~2A|r!OLQ)=Bdi)t0p;05dQWV5r|~fW zAR7Yg(+kmIi7VH179f6$CWq6k%%5|6K*f)#^-){@g855uQ*Sj9^B%vtwKkW1F0%r) zB!C-RV8nf}E>16476jo~aW2E$&?r0ySfPE0i&3O@Xo@J(i;@qGgC`DGv!o)=1V*ta zHWkweV3KIGF;x+KT4E8;(~*nFJ7qI@FktJZcmo0ff|QhwDN1L3h`&D2Luo?GH* zY@0#Jz7CFm->)X{2Hm--OaBj)Y}zE_j>$<_=)vYoCmJfSA_OOg5SncyK2s+nOWzKcu3qOIq% zV_L{sRZJ)nh%?XB$(5(Y2Ga0&%PuGzztMR0;+YK#S6gmKB%ArZ{}x6oyaqJ;l=eKn zMyX)i?ufP`C@mmaD^<$$US4FHHWd}dP9xTwy{$XA`tXX*EzY(?R0WQjaZaPpYBe45 z=&{W9HT~tQsDb_%4Jfy`7@)wBKx55Et$ZVLH@3Hcd1l6FOhC5sl8~Xc=#5EB_Do69 z7ZBF=zE`EalGb8~f^r51wrbsMman^k}u%l+wK6+cT zBs!&-?HL9vo(-+v(TM8qLwMe2$!CRx=bhK}Q_egyjpb%*k^PsOhtIytwptz#8si(G z^V{$Pu^B_w-9n1Cy=tqtsWKz6~d)drSV)KEzJ!P6+P5h(~E z!H(3xt1pa>Fs&csdya0u94ENjDCJ}Sd&}WAD&)QBMct346&Q6t7vO_}rmZ8E^fw#V zvaqO4^)rbf2)8wWYT680PUz&B<5(V?G6n*q#d6TSSn~@Le;9>C?(4V>@PE_McCd=* zdw^}l%5}6r3eB3Hi(irowE7(qGqTZV105RcHMWMzKiy=Vb}EIlrrD|h=JgE4=gM?o_nPlv5f;V zJm>w4a8}GMS#f?167_G~&#O?m_2*8n?jV?}2yqHmHpZ@@Dp32@Okgw$g4Ei$l=*?v zZTwL>*v56A{|cwP@zE_5SSDGH#Y}M}K9~6@_zO;_a|r}g+A~77<@hmomcYNXLG`q@ zaXDb_nNwRmmj`(;N60@{8_11ExpYj0f;*u2LWH?jd zgNYluA^gyyw>kn~biM70J&|vIPoATCQp4Kg+EpI?+q5K(RKf_MGJGOg3qm?GUUZERke5wyFO_4ZL0q|GkXjLzGgt81m)I=BVp#aZ&T zlQ?x>j6B2oEc?;g($}}D9ztnmEOcP|J-?2E}4_^ct;vz%okfCW-~Ha=gMP{e59d%oUf~|xp1If z)6h~ARuG~?UWdj+<`8G7?O<21l|Nk1trW2V}g#T3Rz8YfcGZyQ#c%A)C)J+?F?7Sbjk=Arks2+yu^A{pAMuOJJ zR=}is0Mzq2#;QVC(02CuJtub&E?mJkWdM;EZxK#gD>7(vqUKR*yl<>hQ5peslGq$Y zEd5Cnbvg<93$*BVLb`q;k`=lJ{|!U^f3}ApfBgwWZCFpwf8*>eqvGneZBZaN2?P)B zZVB!L4~1J1DBRuMB?NbO5}d*b?(XhT1c%_kEhKMcx4pk}{@io!eg9~US!>OjbJSX+ z&)!ELA>=@pnxTa@)D4fh=ikp+Hjm8}(PJ<06Mfd$)x$P5{()b6V0P?hXGf(YlKN9x zY-75&gnc;C7|U5ciXq3c|3N$4yjw>vg7*H}mg`A&w>E3*g+2{)306*WJ zlEBItv7ci8`84sy4{A_0WdOj+{{F51$L5fkv!ku8PaHot7C&l_O{hj^d==iwQSzU) z^WFGggyjDxfqA3LF<{|4rINe!31EvoJw5+kvSzsy{xACqv=jn5gZLKD^NIA)g1PJ5>w*EzD|7W@WQrrLI z-vCoQl_v(wtWYfA`Eeoa7l85npLutH4MD%P`b_>4S^whc&LOl%s|=TcpoZ%LBDG^u z1$r?bNzn&T%=7QhzjxT^Gq>V=3%McW_%&i_-MV~67zFxCutI%BD9%+U>i_FQS{0e0 zd|z3&FGHJ&_T4Ab&QeB#FI!U{*KGt=WPnfejAL6@SC=7CuvXyQVkI#vF=rIT`A=1b zsYquJkD+?J3Y?j|MFwhA#+~C|?DP zTB-{&)}RyQN6qMyg<6vfD8jL_bpO6UWup)h*ejEK02~~tH9_q97WcKDQV}Q5Yk9wA zJ*62YyPP1#uiqKR&06p=yl@qe2JPoO;AjJ5{ATDYSm!@V8Hq|h;+zA&Kf9}-xibEx zP`S_SXb~STt<6?d0|Y;wzEocdzD8O2nx}pk6P!?IY=mR*ExU%O-#*ymJ!5nmbYQ`i z9A9Ct>BlfCOVGg)b4@QJnTLsB+|e1ID|yF^@>s0;bbMz&*(%Y6P^MG)Y&ccjV5=Nt0(X$?~cS} zRbRG2WW5sV(5-O#Igt|{VzE=^KrhRw(GPL&Kenl3$Z8E}4|$pBVTFHS`X~z0eU8yB zH@umprY3VOfF5#VGcoD9ua~z%mzhgU*CqGECP)>ST0DgA)Z#glNs*eR+dLY!t97!4n*xt zp;DbMcFdqQr;vy)$b(dj<%4MwREqvVb8kz$vQJX)E3=d5;`3Wnr9rM1{IA*O_&r%b z#>r5HS;08!kpsz^6KV?2h1`6WM#uI1e!LRRBp`|F_AqsliKxZe3hIY3PlTibFE*Z} zetR<;{Bl09L1b@;ey`0OEIFRD$Sfm}EBNpnZNasDU7M!VmUSBMv#4Q*-~_EG*;%za zJF5g!3IgTFg`%4Vc!I@wUil;M z%@25EwOBVc;S_9UFYw6mimUBfLkZ)Y5q0H9Ka5*C?(xcHQr&%GnIboK9E?8roS#m} zB8mga4XB^y8`hZ@A7B)@=jd9hgE?=8S^H^sifP$&9wGrXeFtn3u$1pPEcFbGgW2po5i*3bj9YQPaujLugtKcK@;+& zXtt-ylUJJd(vxn|`)(`*jlZLizjMQMLa5x!_!mpsHDnsxq#X5|svKF`GGe76VxyJz zcQUA~@3MDXKV}2wuN&7aB)(C>Zrc;s>H~FUbJ$bv(H3Lc^rk-15Vl!=&Edk{IV|Re zW_!AqiX;7fup>qEeAYMfEXUyJs|F;+xwtBb9u7zREBul6eNEpYPZ0F-PFw5DoOe3} zWgm}Ud%+p!MzP?hW20?!k3 zyqhk2`>6ubF=ujG)qTS3Jr%`uz{)-C>B>xzkcnPm!fZ6PnlqiEHXzWry8{v3lJw*A zzq|Hjt%8u)7rjk^tcNpqc}Zd0&2ldnS4+&jAb{(f)@Ygu>H6A$-x{l;@I%<=<)TCA z5$RN4dn2V)RW+moMckomQR}^n&>P$j#F^?JBaJcME;>^f_8CW$3Ul!6s55yW;|J>Z z57{(?yt6*)3<(?L@f9V2kt%J1oe-lH%kvl1O#68cqy^J3Ve%Ai2*P7M%{Y7 zqoH#TuXfruvBFnCflf)Q7C*XoZu`ylc!{m~g5<#QX>6~9CFbu+8;Uap6+wNezC=)@ z8Rr!`CTffOqh^bi45d&CMTfP|*mp~r)Xe=2A_9zt%|=Aw4qmcAGk*3!LN(9kCdi~K9x>3 z@^=^o2ffyyCD!}1F;#jB#cL0M&o}WP?*wnIai@$j4AqSIwEu`vD~2wGzpfI}6iFjT zTuTtbx|19S(a?C1|NqEGf&Q>JhWa%~K$+o;K@|yN55J|TwD4yj-C%yB<%bNR)OM2I zD#F0gh4U>OJYYy;mw%0TfK0r({yEF1W#a~TKN*BfY|>`~#fQys&8yg9f&U)jpVs)X z${1G^z7{PmI)>m2C8|ChuXSLynILddpO8?m04V*Ol|04%Z%*iS#hS_$p>c75YH;~r za&Z6m!7@#wl(aEVl@@&SktiAbrf{8j2~VW^N^3ik+QAYbCN* zyAZJmGlonHxu zP-qfWZ{O?*N`qJlGBdk(RC7r4(m7BWpUP^v{VN4Ec+ygH9RUXvqMR@K*R=NQ%{VLJ z(i=YrljEGsbqtcN-A24we(0?^1U;JmNhr{Oc~yvTJe?NquW<Z2A z-4m0hx-XOVy7poOSaxkuc_qDzqe+YjlS`K=Ne0@EXTV|YEq|caJevj=IbJSwP94~r zQgOsUpCV8a)`LI`Cf%zUj@ zG#=SUorQoeyC+S;xjD3|P*s#KsUgLV5Sl0qLeykYlnWkzBeMr>*Pt#6dHLg0zZS|B z6!xh0DEEQ6DBtnvv4%H!L9ppwZ^@1zxwr~B>`P`p{cb2Qi)x2j=X2)C+fC6Mj=7^ zSMQx*ZTP+4LBw+XD%P{N?IY4%=E4dg$+viO-bsec4qwKSwa<@&%$4;Z7`u zJZMQ4Ar0>XwD6ZP8OgkZ>IzUT)v#VBS*lu-(;BS zECtAI%A_CIWX`?E<~O*Pim4 z13V^7W*B&fl8V3KC{PW}?jL+c;b~h;gk-dqH$c^{6*i3g26-70+Pk+XqA~{; zM9dV^QAb4vz#h4KMDitbERGZW*W&xSCaXe@^73cXQE}T~Goz?4TFvKa{LI)qy>CUQ z(DKn!xLX!>FB$Fqn4W22lJd}e|A|WO`UNtXXHyz0P)e!-ib9zh6ltW=mR9Z!eLY;Q zYOd>>)cc_RSK|C6Y31@O`xtwk4cEdw_)}byIBL z{DLB#>_CglR&D7M*|ZD$CdHbhR}_CwrHN{?mFlWI?k8!oyOsvaL3zGVh&G5>dyb<{ z(DK&8*@lVmI83-6&ayUv*Mi8z7=ClBl~}E@yRDB(0jDaGM}a zHF^7qD^GL_-V4@${b)_GZs>z8h*~hl1%8ef4f6&=780JnYM+zZr|g0dzjDlsI#s(g zr#LFS7aQB6vPIkvCOE`iVBx4IY~^%`i6+WJG<4_8c2_+y@U#mA%T; z-CL~XhNC+k%z$M^l=8R#rff2A*)OX1_#8EbmIXOHX_O`xt^Koozk<4+ur4*EHYQ-= zhXPp}F#N5fLT!k=pgx{rGDG#K(2&Lf;(x(=#!>#XnMB+oL`Fq@43iizE;X_csj5O_ zdEV76UwCp2g{&*S0cmeiV-@)AF0p*;=04obmCwxOIY?jGK%YQ4U_{c!v#0B9c(q24 zQ99i6BgWgMU6tM*y1|ko%HV7EOzXT7#D2K*NYlKqG7+Xze=qunUWDIZ;EsNsxyjqc zr=Qq-GV!&LNJLGC&{?&@B+Pp4>^XTCJcv`&pwcRE=j5x%KLr7OX1x!uz2NVyoOK_~ z=rebJWgb&&oxl(k`GJ@CL>8ByPYKz%#WL`v{fBanywLg&8mZcC(ck?j#o_|myyTsm zQz|C#3gdhlTH4Ry2pyq#W8|+#6A(m{28}(_KHK7XYIa8Ms)iy2v3PAX(_DE`MOZ?| zHcz5(CAo}fhYl@CmJnteTiIPWKHgxZIu5eOG#IU4b!^IpFDM?3|9)75Cx+=_L9qCH zBiI(Mk-6e|wz5?GD04CVrFRtWx&4~Qg}_@)_j>+Da+Jme7o~~s6MEcfPAm;?9ikr@ zZ8=dPrDoa@Qok6U=RI*f8im7m!St2P&P+PL(S{~0-l(}{qmA?1eyk=p&YQCEW|mbe z9ITkYiR~k$!ZmGSN|Jb4o!fFW2GPEeCJ(nI?M!qutnF(_t;!qjeN~Jq69Lu?ng#7f zm-R={{!ZBk#ij<``?CwA=H7s=B_|Tgq%Wg(erls62t@0QYDOwsPa1>$XUc;>^4gY> zMMYn(z7AF-X!qh}Y1Ro;*IDhs^pMIZmdLO#0TaH$xbk&zaFiHH>w`(F2`AS#7JPC2 z55tTXJ+6Ty?^C~8CYp{_*NYgbGTLEG`LpoBuj}fS-Z{m)UFU>Bwgv0Y9~cdHcsAX> zdo@drKMhn9*_m&=%7iraxivSC3fi^fa5r`0?AF$5VNBdCUwbKs0nVoTi>HoA_Ip2a z&eJU0$$tO{8@C%8UDFR2}k^vy)t`ahfwqA9=f`3`2C}S<%~b1`DwoC z#5n{?y}Sa|@2M`zF?KP@)jPO%2Unq;I#^AKyVw-eTKrugXDu<&WF#isKV;rN6FHKG ze92^$+$BT!&=YdjEnGUfXm+AsSg`2!97Q+^reFQSlZ8WEZ9)}AYM#{=NHnj~DDkKn zMB{GaCH9eVId*SuId3IaPUAle%uR$iwW{t{7OVcsx_5iSB~rdtiGQX`hC9eQ3DM4M zESTE9c|$1OjwxHhPz{s^;{LNOiI5@-Aum#trNNQPW(afB+1i(1<&M&|~*6x|(0!4N7*-8Q# zRjUOVs7olN_L#AUH?0Six8AzCZ=d2*;xw4bfH|Q2Gl$XNOkrvKUEG*eBhuDh{aQiy zJjh?=q3i7FMuKfIgI+B5IYuI?Z)aw6z9DSMD#{BS%ku{{J1eD4-x@?~c&-Ia&~34_ zFKst`X=#{Q=K34VM|YLKYeJ8S!Ow&)9CJq~B}5q>EjiXWM;7`soNqJ*hycsj& zxfcF#YjFR}1n6CjA!zO=Xjk^Ao;od%o+|Jel~p1J-y==>c? zV4(xo+5ZcA@g^Js2#g)9D=F!a_FPleJo9qyM-0xi6j?X)BV){CfG6ff$`~iy1cMyuG z{Y8<2DNY_B5c14cF(&{+!+(P8@4x<+?|{*Kb9cURs9`2^ae4{38ID)!4`O#QpO1KH zUu+1n^pIOmDqp1sWRG?8jb-r1p5mp)n#GBy07R5BF>-@%Z^+bwV-CHPoE8Z$qsVc} z4_V{C=0O(09E>5W<71@)IK6#W=?z6Zvoo$E|hW7DIc@Gz}wwcuTj1zGs@&2ggyJ z*0k1BLrqq3A91O2)(%_9e|A){>V}k1t>7g+_L7{Op0aKG0ei9FXU1qlc+?Uvl}{iq zJzW#GAbqG^EhRRpVXQk>Gv#)%e+7PikKCy`x7Fxg6vtE2Vw{}lOnvKf zbSd;?Uw-CT?>^8z|4FRCOjVMkUU3cQ)Qw1lHTWv#?^+OfzEL>vN@dF&8%QrSJkzcg z7YieQ5pYV2Qw&)hnyxs_y*7Y+feaBDy z{Gp2(yO+x^KRCbXop=NueoP-wQ}|2^XVa*L*I)9QM>Pezqm01(MH?sqfR5XbL>NuX zx)IRmvRC+THN}UIP89YQj!jit%k?krgZ7w+eN|_M;wb1|-1X+ze|ywKGlyqN-X?9E z*grt{6T$0jd;XL9&8e`<5*PXwIULW6WSQW-fv+szO76Lun5D#2yYLJ`A3FnQXIKxI z#Kyp7wF?#U`P=G@f~-LmBAqD%4^81Ejy6Vet6wr>NEjAM{?zxS2I;;7TkBLCN!_ug zw`dZp*K0MSO`2K6s79u=R#24bxyaqw6O7LpmKSLEfectThl7{C4;evGeTH@5&y5|2 z(_9f(UTcd*O^l}d-yptvH-Cq(exjUD-K;yxcm9;QH}gkfi;Q~jty81l+@H~RW}gp} zg=o-`ip{!p3m%N^EK}7wS4mP|1${v)Dwv;s8x$R^%dR0CB33(;`EhSCZ2`;hg94$u zyn4%fBrA3XMmE}apLiTd9E}27@K*c0vh%?_UkLSXSEuGlb zG&^{{$iPMXBUKf`oxOd;5I5Cl{aWyiLfB=YC(Ho%R!8J82~TrGm^utmz(KQ9S40o_ zL%ndW=7Wq)*?>8zO+kgCDGvTca#U2F8HK#bj`+L!n0L9g-Mr%7-Q6I#+3_|JCjK&2 z{c#;Yz#{*4KtpXnrqcO%>}beqM)Ic0nyB_UGN$Ge?Zv~Uabji@bGu>aV7#{UPfE5g z-O(p9W1liHIa6<^e#L&lTrlc+gO`%5X?ks5TR&>3w$MBp)my|TwGh>>nlE1x6v+^W zGfReOyq#f0qC|u`4m=~k2bK14k!VE{{fNwEoO5@U;#jkAUEaz3y{qGwyYFXSyd0Ev zS>VpaP~HXFibR;W@u5VCV`Uyxwt(dH&v$l0fxal1eOBhAChxMW=;kA8+(IGnq-ijV zr!th2O7FZS+p^eieaJSt!fQYy;=?(3A~Yc;TgrE1{w$hhr~*f+RG9!;PGe9nhit2| zQ+$#~Vm50$PZGNRx_1}-;uIf8VJ+BpT!sywZnOv47clQPE{L3w=Yo_UF1O!EUz;?C zl{?pKGIF$Xb$K&$^N}1*vvR~x#YGwt8@CEh?tn92_kKhxEW>$FF8&tGFfcA?(NLeX zZ9SUWT@~hvVAFPl@3pWGc+=FUsL9xd%w}AI0V6?(3n@!kX|)MS8)@Fv4{8r0rQsxX zJ*>}GO3)VWTqNb)MW=Mrma^Sa{*pXs2%|p77})y23-#!98?h<2C<_`lol=<1EiUSv z3DY4EuzP{g#L2*>ZIZz0!8#QJ6HG%OvFuAfjyyX=-8^w#wd5D#DYOl$(5Sx{`q@YH zu3T)8%&X8vfnl3A`h?Bq3b+IzlJ{#uXhyDC!Me+vy(_Y~vVl|?P zK<%{6BxIt}%XP8B1G5R_jF=ly7j2pznY#~6b-Q*`fZpEhl#ej!;ca>LmMjS%Ph-7( zfH8|S`-|Y_*~CP*>l-!Hs76&H~RkJ%l z6fzchRj!hGR*gj0+fKkoK=w6HLrBQRU(4G?)`fI{0sBUUWy2?`MKNR`-e^2$V}Zx0 zIxR8Tbl9w_x3Uq7rJLMkt`C>%9It^3ngcmd`oAbu~3uh6V7Xl<+FuCkN zJ4lH@x{Ou7!M&it9PGt5b(Ehy&vjA8IdpxS>e4g|8ykE!kB`D{DHx5?MuNha?Swp7 zUNhD$qz~I++8Bz`HZm(~uZr|akUSjZTDBoP$jX$naF5beZk4kiX`cKBXg_C3AcUd0v5}e7I|cZ8)M(Rzr2p( z-P12NA)Fb{x+$sl@pfT^DnR)j@aV>|_r;=8-!7GQpgIcfZoJ5@K2GMTO}48_qn44Q zDiWcOQ)e_VN^VzUu-D@<_X<~_Bv|Ik&z{)ZgX`wlx2*XvP|YB!!X|Qzbdz+Ujy&50 z=l>ye9Lbd+Bh5g2VFZRL53ek%U%7axyIt~f9HMn4NS63GV&0f}V{IS={;AM~=&b+T z&w`ra;`Jw^AfI~eywA*g<(O;LhqJvJ(J$|(d-J4;#^$y^*m>i__?Tbs{CcYq zTY!esPMsO}TB#VO-(hZ~=OjR8y@d`NEjHSyb|%i&+v5MxH6|OXHT z4|@r0EO*AL<`!zc5B39|56zr^GkpB!6ra@VKlK~=Pm@2-o!z?E@g2Tc+50*D64ljl z<69rPLH`o#E57rq1-9vGOw@9r_7`~i2^;w2KlAs2K}Gm067jwhopml>m!S){9(Tv!{=K;A8Fe> z3B26s6Zr}X!+q-99&Z9&9*XNriD9xY;2ACCneVLp7vgY)W+aSRJ(QDK05)pq2iten z{gtaK3~65u0|E@s;>!k`x{9xZq6|83^+pGvK0pv~hSPbKX4!NsNg zK4$bnPj{b024=XLBqr_|jb`|l!UpCiDwqBX*>0P#uX6&APKDi#5vTf&Nvl;M7n|14 zv<26DC{3akR3x&~|3Inx^m^I(>wY_X{JoX3uVnnp#P(mZHO{_nQ#!*Az`lu`CId*C zf)<~OeZG4m{e!a@xl}A?$eUKM_JnaD(A#%-Mcov z*sGoA9Itv^>-aR$@?RU(-s_V=tR?yXf|7vai2n)c1#(~jqQHv|CuD!t*G<+xE@$hw z_2KSEp05wp`2uB3!nzTD0aot^j?k9_r>CcRG4(x~zc|>Wcg*ssZ2k^t`l~3+3xfnI zZHoPQn7ZqeMvUQ_vFY_01R`gOsDYO_#v_7j>61^_4Z`2E6u;Cm0Nw(YH|~Ei=RYC% ze?DgU2NnXTE8x%bok75JXqd{*5(4RGbAF{c9B#a)NJRc|I=-uo?(rjqR3(~8I(;+R7LZ`p0R<15n9tIFUredCC#iGW>Zp&#r`_F`uIT9 z)YXX6GiO-j-UGI}gGu+0{&I(FPJKU_7tm3^iI86%MrYc@e697+o#eB67GNeOGs`wR zV7KM5`|H}~-q=KRXR{k`;+uAZ0G2YZ&vo7mA>J?olhuPgaK~_iKRGhgbpTvy8Ojm_ zXdF}#8Db|cl*^+mG8(&3K|R`UwG68|3c)uOdF?u-!>qJ8LoAWMm>O8>a%aRs_^cKZ zG{sHI5Zow`5-YAVj}sjk-vC-vXxp`{CQ-dkSgEy!ffdEa-)eczCF%`Fl?q@0 z0%i^!WzXbjI51soV2}psSNut_-G>t5|LDn*pw0TDVbsNzpV1Qm0tf7S#x>#P!dh1` z>9Xd=9Ty)#Uie>=>+wd@ZVeX6HNTx8>`vm)A>1pMe`cm+8l@Z2Q!JH!m>no(3T4bR zV9HtLETPZfQmaRu8mF_NSTMUXw1`>gsQ@yyXJ&EpK8cW9p-8AM7hixSv<$b1 zMV>-?>?2#~_=NHmQw4>WIQ*!{Rf9Ikop^JUIZtAgnme@y%4LB_)X>SGyiDYwwS@D6 ztvlbmyql?(X7<-?i(Rl>=*w^L2pCPRb=+=jt)pHn6FeK2d5LzK`%S?a5KZkj1T6gx z6*?+(mn;duQAFu}$?Jgx`onow-*dca@eiY~B#DzI?MPhgq?n83mc1>9mrCXvy8)Xk z#F1h;ud?9Mv}%k&W0&xJv0DFf4(m~=KzO3C+^=BqJD}4i?!wEur|BinC1it^WsSNe zN%pe{d!G+Hn1v_z?NEh@kk_?|6MnBdBu1l0wh~&%m`OX{u}%$^8G{@OyDLygL@`M; zrPMpqoj^zMB~ra7Ka}-7yiy2BVqx%@;^|qsOeQP45)MCLno0F9>#-b|I{j~spudwp zloPuK!$nr3A_gnOCk%#bqqV3z3u7&+YK&AdhKNVx9$E;}DmS&$xId zE0->Je0T6S>fV9}jHt<_g;pkvL04?eZVhDnq>TzA0?53WBH^zq&YA;kar%bqA3h{t z^KcZ*NiK%I`u$N5V=5P;RAn}c>#_z#?+f4JD-{GT#lndN<_L?V^y7@t^$4zy#CJ?+ zq3R`O6LS|B@L%#4>f}A;_qHO9_pK{skyb3D28KzCSk~;yL=Fl=AvsYNb82;AzPg^s8kS(pOE~5@LyOGKeGV7HmJd`!h!ZHh@>hAh=YPZ+A>6^S4UkESX z_F~7pPH=BKZUUN#10r(%Y!^ZoxAzSKGn>ByIG!wCm~ir+xj?rmcEB8HsiAG(tgNML z)SRI>(O9DmR5$NDnnHwD{~D05DiGpsCx;FrH>v*2#u*DLiAT z0EosDDC`L7iu!vo3?xqb5!1E;-E>gK=nRyms%Gm8-Sj{9wKq%8Wci6_lme-Y*VXrz zu_t@Sjr20BzT}|VOpN*t@(#PIp$?8(v2#6Ts|AVR*+)QxEsne$Uvs~*3L#E&*;Bd} zG`i-srM`yy=bh9s~35Ol2%y`$!dL zt&v$&GSR#m=Yxha4uh9;e@5qbx7AjtCU~}3tMd-r8OJtXH*Ar5u2rn0A8>co*y;FG z#CQ{E?_M^L*J%;B(>O8pUx6KZqMsOE3>o21p2R-|W=G0hBtq<-`CZ=;GO!hTaMgFk zeZ1X0eu>~m>d|oWN6&E2r!y%P_A>q2X+N`OX+#|7>lA0q4?^p40f@(h_p@m~jxMi6 zHQI3x&$iz!9zUcFt10>^OpTV8PSHLER2IBYXuml5%b>dwBo$C+l<8Cmf2(qx)Kmh0 z%xf8PLmJmHWW+eRExfj!i=a-%7p8aE6zY{DUOuUcvf&ler%gYZE9WNKZYsYgHWL!( z_4+JD|B*7}HtT7_x1|S;Kof7suHmAcQ6$PNQg|thPPLvd0J{fDFi(%ATiUyY+k>q8 zjD!(iD7nA|W1H*F>eDieZk=mIm=rLil1svby24zkJk0IP1!ova>8We}$y27$7 z&PM_4PyD3b{l-6f`k0FsPUtOclEDHKxq}-mj^x$L54Qe0Z?CDJv-(7k+k@S{%0!+T zBa553U{S|&t*OPD7CisRc;KuIzgl3lASK{_Q#|`2o7jR17SEdgL`g%Tr05u!Js|T( z$Ng>I-DID>jzaRxI5z=8<>0RtYuz55PaLcwBa~Jb(T+q&J@An!g z*mcU(_Op43o|i>u zhnI5-G^OuV9}W8ggF##Pk^j7B)L#&7hkF}6TkjaSCpI9?kG$vX{4V@{Al3oq>?6g8#i|*_(?_ zU3QGGH#Bbtz(5oGno3JXwAk*0ZScL*Ev{lLAUHbj*iZIKfncN@vk|mrK}a0P{=LNf z9rUa?*k+cz%-~?fYm3%>(l8VG{vi+3S@r|p!MVjx7WUFO4(H`NYq)pJO|i?+hB#ZH zSIX5ZP*~*8V%1mVAIdAxXx7e=u$Ve$Jn{doA?gaSr0%G!fg(29 z@2k-a0{^m~-iplt=$-rq=a+i;-%)V(&;MH#JT+O_74WA~EZOB}*PrKe)e8(jnj~R~ z45afl@^ypEjhkSeKs6eq+mBlL=0B4k)wD0&M4&{JBMY(ofC&o*hk#Z{q*aM$;BB=% zo!sP!HZ)VKjxbredYNHUC~)+$bNy1kyK;8q^t3WuG6*Qkd%l_y>+*X7|6*p2-Dc@c z<1ml_>x-$ck={cr-gIFX^ z57v4to`nLvWnGRx?tnY?kkAJ;T)CgCEo$G(r1D6{)J>gH(oGn9eTP?aVfkIKes0Pe zH6fc9X^1hHo?$^yd>=snv-t^l+99wOMwA4aVrRuI#Nz*3NM{vkk17DQGSKB$2 zY2QG8I2+YWcVXlxk5dgy+Gu4e-b>z95wEi5!sl|v30c1v4u*^NP_q|+vJGJ)FUkjB#zQ@1b>O)CRg_Wb~ zTP?MXRI>Jt2{Xqo;o_CP1{V$)(Pijyx#W4rBi#IQfoEAZ`9eFij~wwMRfHk%J&F8xVt_qo9dBd!$v zTk3TxU&_4BCYUK~F#CmD$S_D3t2E(3wK%XBKkUX!;yP(>De5d_r>5&9wU2Tok%jDe zhddWIbE?kAk7WHw+lslZPBGsXUmU$eecJ0V@Jxu|+n4vPB$@>lBGVge!g|U~A3Ptc zKb3IR)kk-i;$6@NCd)XuiM0y7=c&4ui`4q4nI&8A>hAtR^aaf5Viz;uH^hCfQCO_Sh^hnJ=(>!3Yl`>H~L2n#yj z_zO>ER?sG{$1rt4``5=zMl2<%2c4Hgx;e3SL7Mg{=F{&J^EdT0@&paX-&67>$8Ii~ zFyLw^DuFc*6I-n-=vL@vr`Aj;>zv-031~A-RDK<&$XT}@h4$ILY%sX{#ZH2Qot!pN z@UU(>{IP@fY>P#r_vBNvk>Mh2yLPNpUEVPX$gxuFTlY zlRNWW>mKm^=i97bxOf;k6%1<=WU5I}Y#Tdo6>6AvXmbCNvd^)xklGNaj5+C5lQ%!2 zim7fl&t}z3PJ(;nLJ6`1j@H@I_I^&(ZfJxw6Jr#x(Tdxth%>2N_Hn z9A#>mqXMu@8ydsKUtG>MheBA^J8zomVmRqZkdir%nXRBkMp9o-STS&eG@U{{1E2Fn z3>w55HM}Cz{c7i#4Y&OIt(V)jz#LYoOn-dg)VvGcSqQ3W>1;04PGregH4W&;6h(dE z3-bwj{>vH5mV7?nW=$e@=1GaokVpJ2Gi!nNhA*{Igj@%gx2g3gh1k5GNhrtU3XG#F z??|~WW=AGFI`o_*Y*Hu9H{5Nc{C zF^5Y3aMShMb*$<3x|M`$J?LG8+_XFjRux+PyrIbPKwXz^>P`26O>fDQ(#+t;W*&o# z7EP?i*6R&n=qC0$fAnz;emj&Uj%)DXN8s!aPae;~!lN)=S~T47h->0XJx4Bdyw-r`Y&Z5n2|Qm2?p zZm+$*G3)%5;tX3kg@)r<+Eyg}YJ1=1Em-{LMq!}_im}7UaYHlr3hH=`N?gcSpUg94 zby=VRjx04`WnRQGsY*}mc^+eekOw3cp+w_EOqae6l;q*YCvZ4VJ!hoDlHR9HWOKAO zA)WkeM$Ii>)W@(aHJ7*a@UrBZ6-{zQK%k8Jsq{^M;p@;jCzy_>RzqNr^b1Rz)0E%6 z#>7Dt6|>9BAV^xVl=1V`c*`>)t2EqNlaBc=1zo7;CS3k@x>NdIH~uH`S;$of3TOjKgnj?htKXL#%Y0-n?xnZ|BVc8SJu2B6ck7w|c} z>Mk-c9DU;<$Mq4ds2fcUGx+j7<=)p+d1^2Fi95>+kac(1P-gu3W zXl0QpU&+b7V2A=2VxJl-oVgTJJ>pTKd6N9kj&u^Pu`F7(m#Uz%;am>Wt{US6Dd_@c zw)gv<5?8U&I?2gGQ8vE&va9cJhZZ`yY(miS)7S4$z8w!#vnUBT`V%%i=g;DecdQk) z36av?Zr7Np3=4M(ng_&Zv^qvuKDbab#yAYU&9aAb546PS;rbnHx%1ba!#wYnwJn&?J(jK`wg{Lc0PC!Kq7nOPp-RKiC^(L(Fn9kI!Aap3MVRZ@-H>dGLU{Ewd`z4 zBx8K4SGf{VGTD-%t&Q6;NgU6-_WMj@kF~EOT_PFN-du1xm<24(zrfbM5S9ad+_Emq zY3^Rs&Piy@8vVtH&D~kEXME3)4UU{s9CgGmp8t=ww+yPI+1iGKyKAuE4jXp~4#C}> zjRe`advJGm4elP?J-E9|kl_B3`<(lc^VRvP&X0%MMa}ed&-9Y+S+myFy&lpj!Sy;5 zYo|NY3Hs;&?fuqcOhvEcmQP>q>wTpPi?Ve>5wW(T; z`Yw|s*=`2^{9JK&YXy#Aq^MaeXel{2?d%xCyH+K}vHJGa28eF;{KB*M z=Ld}c{+w+w%e?g_B?CoM-EybM4td{=uygg};7;mfPZXA$@^~;`I6Xog@7xj;aLK7f zh(`^p1w6HGUMCvEP~VChz6tc7@T9C!3j6QrvO%;jr)Tw6V60wXNuAy-uG_xn9=;K0 zZof;zS>eDt_#56Hy*J;JVw{`Hr<<>zo48%Zn3=!z`+No5##bI-EdCfOz38On-bMuD z!%6l7n``73?lnJ9$R9$g@jg0B&S*cgq7TR!duvf6*Wl%=cm+-9AZ*;LBm;#uO z#R_~QEnL=jc**bJz6wjDyv#QQHNO&oDd>SkJoNB)Uh{^oE9IiOp z!dD!sxDeiQ*kn}Jgub5+cD<2z*7E3v;uCKLO_p*G zt)fiCM)&oJgxb<7&%xV)&l^xys5lcNXy8;y71)6%PSQq`=j-PC*Rk7&#j~tRxiHv^ zc4S#;oCr_8sbXnnGm!%i|Lt_~ocG&s5Ukrx(NEqTWbx(7LPzheGO6_j-WGFz8cOwY z-f>)EoFW_tV88G4+c(r5y4mYRf2|&-FdMjYPAb(prUsa!p_ zPNk2T8~;6q|F;Lx)1~huAY$yKrRgiZ<3{#68{;3`{vXFynl_;8&z`H#Bfv|V?8Doe zp2*^NSIR%vOn`87#xJLp*w#7zv#IHSVFC)x9@6wH6*w2O(t|7?uSkEw3Lhx?Z8^V*$0S);$Q+hOrfZ81L6WchLB zG~5d1cgs z)$-ZN5la2$zx}E$W>_%R0ED&>!uY_2u^OG=`yWF;3JQ1USC zLs^vA3iI<`>OOD9_33=OaLyiSXqS}J^rZ6fS1Mjo^klTDbRM>U&`OIT2zE1r|ye?tzBzD?tdgo`0l!ak5FOA;8Euf8flf z)okx4$CGy^y3$aOpe~28p=}g4W!l_Ior<#DAcEPPU)7b(cHenh=1tyd^dk<@^PJTL z_?#BmPU!eX0R~~X(5+YU!$^gZFLH>wP71e#W15{gCW}gvBN$4_C)^fjx!tBS9+#t_%)7|8=EYyS7#M5#d48lvpe5DIw;EATw~Fl{l#{1vfUPcsE#kd-y0{!UMJ$j8cYfrM_TP2YV1opQ{mQ#unpymnV0FK?H>o!fz~R4-@)V% zqCjGs7*y_|&V9enpeLP619TYpi!0VCGb{pjlDzJ$Xm!_DJ{6^LD>`Y0ax8z{B0Bk6 z&MpabSL4PhcW6lH9)37@7K-7Z&pC!l_N8$z4s??CW;C(68v{&wN0PHot0ZL7RrY+8 z@*j89V61j;*8qA?oJWlc<}SMv%+04Rb@KX`NLvqiziJrNCNxv(FlAB<525P+P+#)F zcbI2IKa4G7k{IOx2_Ul*X-u@Y6l0oB0?G;F% z1#f=tao74kxh=Edc7HQeVj!UR8@r@aD5$C9I8w=)KkDnrn2L5M?vFgCJA%xe8xc?m z?Hm3-1SHdNbJAVq=!Vue)pI;|VV|#}9i6|-!#X#wWLoqO-nhBDmo_G`FyLr?usGS- z*}1y9shOnvL_<{rvv@vmTv~;2n3lnEgYdXfeLKl6 zKRw%V6Aql;s;L%s6fP*+f5n$`QJO{35mqXI))Fqb-q?u1!A|cF=luC))O6u$JN5Fk zE@$Z1|?>2&n}x5=XEjYM|3wMk1TirS8FmU3*L-Ir^>QV*1m} z@VMi{JHY+wjKPid>`vS)gKGry?J<)(?bN%jF?uM~SLKG9N zESy9?lIHru3ZvcAXt4KrDe<=|lV`KeJEGH<(>sAXkKLDkZI&-Go8v|eTC2qewv8I) zdE8d3YCY3&)M9~G-uhT?$Uzw`+u#C_fQhYdCqtQ%I^Sj}*V68j$M4i zYMRntxHk-w`qC6X8!G8iZmp=9MzzasJj+drm8dF*+tMpS+F?5@qhKAvro!EWG-4+k zNIGiKc{d3%>9FiVfq_X}K!KyD_^7XswR-XS?JB_`czt2SI9X6aRY*L$nuu}T+fzbA z<$IiMVyOy+g(g&z;wYqRl_6}yg!v94BE$wp8)y-_c?oLN(HgA??QFoa(|1|2+|8f??2VV3=vNKh;NyB| ziJk|0CdcyTJF>D%-em(B3bE&*WLwO`P?lJ##Mvl@X7Bfq?3Xbm;iF`pEFf;I`22&M z2d#xgUV%fXCKdL4z*l`Fq&3oc>$H&tEMP{DsY1&WT$~bpF@!1~Vo+XJJU62&T=8Xr zgqeqmJqa~y?iUslg<&Qb`e>ZtM^xl8_5@x91!zdC(4kR<1R4IJ=63<93DHZ((n6SgE4QM<(I=oJP|=-o^5+YNpE z#;9#Bd4RhO4F`qkrd2os;U2kt6vF=dd)*cFlG@%9__Nl!yl3IB$6CP@oqGeD1{3J` zWPubv9X%!ym-Cat2S?Ilz)v(JZneCe6{S8bhkD)QNDGbHkL&0pzM`GV zBMSzN>Qv7pDI4?4w> zq+HoXLVVCdC~tg1BR}HnHzJ3KI|6Lz9J*tNus7*S(4awkBCWY)GR?0y&0z7MJwvE> z+U`(b1o-E!=(e0=w>for*($xX^c5beBh8~ZIsjbxV-nLec?*Q{r}=Kn`K6X@D>J&9 z>W!%xl%_(bNr%mpv~uz>3IpvmozS@3irCt7+2%v1H5Q98dU!Ens$pK9CY; z0P`F2m^`F$DdE67lMLzKnH14}cW`A;htM=J0?rfX+?E67k`1Oc{)@f27DCHluWIwl zuW!FsY@+srk~wCJdKc*-JYrhv`(UaAZb*R=`}Qrrq*<|~-lpZkM+5l>v6NTv%SxTJ=%r~S=ms)(I zD5FHmB*m!e!^pEk)%>F5%&|uH3I!c+x$3`&m!}S$-U%t%a4KZUs%cYXcG04a!UGRa zN@{3ly@rs?qSkkoze(pV-|n9MD5Nx(!WFMucMl}Ul;3wLNSO%s(MPr)mXgfwn~72W z3bL1#^Q-u_iy6rul)(sbR`PM^vH$B$T4WJ^Yw2)NOJIVON&^b7wmO5pMi9|D%mKUN z+=|(eHN9+w?ZZ_^Gbv8Nu9ff#)CU)!(U?f2aPS><{&nyb(#( zP8<)kYa@n!;fa|<#M^~V|TObCH2SFDF*}RO&?I?wu zG$DfRJ6}F9qK+Z}H&05y82|8PNc<(f0Rvs9pozadJ$XI*g$SD9ji#HPnPLpQGkEs? zi8Un^-p8j%dN!H^%xSYGlENSam?7+^^KEHr@M(B0!69Y04QlD`igma#X(6cFBM<8P zdP*WoHJs^B;)s&+tp#OLj{Ud+*IrzRZQ|+Ab93`5d{QT&1+^`i1#Aj-yw0Nqx>JY% zmlU@gPi6f5?_5k)KhZ!M)<_6Nm-gn1H9s%jgs~G||D6fI`9Dkm6*pTTKttZ>E6~^x zpzLJi_~%^8+RzLLP`5C7w*)x30g^xqGjm5`HgeyY-?x?1c(BiEsTLm62bss z3r7b9puGsl+7@I3v~eWn0!Z1s+ZDE;KXwJNsiBnv@c+luU}a+d-*=HwPLiD|1f`}%b0b#u)1Y>D zk?vt{9=gWJm^-BUNj0+c8%&{cvA#lDe^AAlJRKHxxo6)Gk6vmkqf5D-u=6pIMDE4x z{1{ru`e|Hq6pkdvIfhw6AUcPs9*;#mB0fso0Jla{y3NI0jQ-eHrFt(Z48x{FSr7#L zsakLfwp(-$GOuMLRk(9oSE|?oh)1Bwqam9Q<^k*9Nto+DkuW#M-x6l!_`i`bH~YUx zIB~q<8xv}PE{T%@B!dDNl)?wIg4JgGy`fk#tosVwEsbYfs-@&lmg4y#^wo>m3zn9k zq#}#7_n#h6tq^@`Ylli+I?Z!TE<0;Y+UO;qaA=T1rpWb_B{Q8W@zt{^kNSgk)dtX;zqzH4HZoZr z$tX~Voh|Xi+L#EaexwpOY3Iw{uBozdmhAq z2_Gn&t3drDn;E_p<(p999uls*rUksW5vsL_O(YB8!IMR6)VRT zXzT+q%1-dK)m6phS%iD}CJl3&5>}SYk3bAR>z7%L7X5tL{ZIBzn^%_Nokb2Tb2E9Pl940`Xd$GP6SR4*=mA52qR!x2I28!iqtL6|-k;(jP?( zuV6nEbeBx0D#3xF-Qp|eEM>^a3$R=>yr(+zx3WniRXLs9AKIvotO; zMy?#)N)eEUP8;ECL)e24cp0ez#ry&VhYLv49otF+Ho=cXKKgtUuwttf1-9Q9Bluh zc8QAUy~MD8y_xKN*N2^pFixmRb7(BqGGCbbh=1V5Pm^^sA@<^@hfLG(G$@;dE!w1! zh)3qNJp_67<&_~P$1euqpH}3f-lm8n8=Z2i?I&;&d6Xe0efzrl+IgK>YY_;)#9ft> zo&xIE>*iimnuZKEVm%zCJ7=VtKM7fjpG`&#&ZIdwD#S9aB&FOuZWxZL=q`;ld`)c# zfWGN7xlcx?1Kd3HhFaX>+G&Z6J&K=+$Vh51G=-&v{wnMjOB&Sd&ADj)9f_E_ z>bJNtDnZ|RY~YuoN^FWX!5qIz<@40LOtt+;D=2V_9ijA-#X^SzzN}{g=VKMqmkA<@oL4`wZi?%HLOeUlcL#`>Q|<8R=*6dF5x1PxE?9 zdb3Ni3-;5mPw5|(&}l-o+&u2~6#B{rZMg_0Jice?ot})Z9XC#NJRV=?RjN0k%<(+! zUE8ZKv_-!Ow7*^{J3YP}d)MjCrLWyy7ayeKee$YXnVWlk=46R*$>X5GM1DONzVOe^aIZ+pzkWR;H`APAdC}Z~I;cksl<@0=d zQ>KqC2$0t>#QC%tT-Wb%(K}13{mR?+`gEdx?h9W~kg3zHKsfd~YJ@;0TC>>V$DS7( zj`WHd-gbC~?Q?C!4&CCQ(HQEcs<=CED!lJM^Fz!z+Q%G2hZB4DC$ zJY~R6W>3fT>G-D1=Y?VAmWtR`BZd6AD^JN}p{bKTWgqNyCx$hAwrR*X&d2=w#JX4W zNbStIqLqM7yH7e+@kT}C-BR9i*7Hs=kQ^7Dir$I*qxiwd$e3gnYZI@S4Lq{6;)ghV zY49l@ait4YMJ5M<2@iy_T{JClGq8JK`=p|bNCmyx9|@P3XyMTJ52IYYxH1M$(x}_d zqO8pd$Iqf4n`6{3L^m;@ai9dIUg0`e?nOiQ=QzjdPO_1wj+#%0AkJ)tGSSWaXtfg8d@J~75d!jCNi2od2x78H_yy5aK)UbBT}vRdOkb>R zz(z}%pIUDW8Vv}i0mA@bFj)wFKpsj~?=e76%@Q>OetF@Vys3}HD;F=MJlIw_%??pd7R1R{+iYRY`p`*je{`#yYZZK@< zIi%jly*y^Q*h&Q91C{aM$Cy+;=15E^>3*;O7% z&k>3`r2{oFj2ZJL=_RV?xiz_|YH{UH=&}?kp0N$U>AC{M5Q2$To%SGFENR*Pe8Wk&%dbLYFVdYTa>m ziY1+$Q>#4w_fIQ|pq*Bv!M*K|uV|&|rFD>&^^AK)O;C&^QwD;u^03m7Rsx)}JjbsA zE1c#TUl1>m?jv5(P=B%3O1G7>t7Jon_ehF{npk-cE@s&bzQDHIc*&p2*lM2y!vo@q z;!UMLI+YM>hPbho(Cz6U^s{TElQF0;-2$;`30zaXA}il|C!0AR=K5jcXlA#-Ilq7b zpq@uBoxpIe6Sm^PA10OO1H)HCTuTd#gUD5`4K`++q0>A$NLqEkBt+9ldL!~us(~{5 zP@fiSyXxG-YQ3f-5XLOYM9H1jz1#zrI7YU`*nXc~tPfMev$RKLd=(F}mf`1Q*g0dZ zW{bALlO+W)DqyEz%WPShK?qO=Ocw&5;L4={pdHCSdlp{nJU^nB33EdQ)6!;SDH z%1FgRt`sF_AgY&=3~WJw^RS4K4g%{OSb`|kx`2ICP}QzMBR${?dP&;i$Jpb`5mpSTX4)gk6BP^1%7)Is7nz&{ z|Ia~4N(7-SX{?w-o)&)HuIbwur^a}!A>{-LA8JqnK5ua`^*qC4NQ{Xy5BEKzzY59G z?mfU2vth8xyhRz-9vd);6(YX&bOxJfa9kw)RykqOj1(M*uJ>+44l~Vlxj&ueA56fl z(eHUj)Qv^N=^e!zh|`?UaZ5ZWx8jS;;!2QIG~=UD~_j z^JwrdvdDQ@buAwj;1{iaT}Mni;Lw7h27!%4IW^bqQY+`6go;mv80y+mzhKaK^FS&H z@0as2Lc$KpK|1f=kS(SY@?^tA0J?1@W&7uhYF2i1L%UkmtGlkWXCj6d%ic0F!}>z;#G5s2WEA(f>M(C5VR`7gMLy0-jeRR+}T98j)g5 zXAvD@9X9FP7DR5tNBAb?uo3Cqj{&wZK#n@B z+9~sRh$DcP&Ee)qHqTRgOc)?rvjTs)Tq`S=3PZrTi@EU+r*R(R4>35Gyr!ENRUgc- z0Hfk)%IxW)VoPi{NmAhreMH~DGnNEniSh<*8Mmv#P?!+6XKgDVwjmTb00$Lt{VHX+ z*#6Yy9Uqny2c8&pGFcnV7^z{`_Rc3wtg?8xiH~e|I{8%CJ1Fn@mp*Zhz-i2l3;X$c zNKA=0_@nLmNReDlwGXx&^|O>Q@{o9+-+B7z-ejFM@n6!}%8306@Z6d%B=Xk@)r|7bvg6W zTW^j_&oe3mH>pj_T6z4H{6Pv<7j98Cz^mhXvdVY30aGf}80>kizo5V|~* zC9BqMs8}VJIYUrmWb{MxjLVf;1iT~47+Ywsp^;ZAA&}yFGFB@Wh@*X%S#WOX&^!HP zyEFu@l3BuwK1SQZ?EVMGT+Fo@JzF1+Jeg~;+XAmb00^g5;?;}^jYcZw6KP%&DU;Hl zf((GWE%7loBUmrYZTX+Ov2c2FgT36sOu))%Mz4Pd39~AOXQSd(GI{U|oA>wy2T%sI z=LD^XqGWsZJc&k5@Utt#u35Y4{wm`=p6lwrO#=U&YS^gaDhJ4L_fDz61?o8@4JDE@ zBN{S~B_SNu`ow&{w!pD5odD;k3sL{J#S?E`KM^2*J7fj53J;0l2kr{U*m=mpkqbFG zFWIcF&_d9dK|GnydTlW=r;dkVleKYY`Fs=6Eq+@FjZPuxPXNg}A-G!J*jXsvW17H% z$4!5a%pN?cn&iKw_bHctt4m}Q*>K7@{>Jv~I4zF82|*-1PnXiMflQx6T|QvU`r|l{ zzC1Y*PF52SBNX>J>U`>E+|6^p?YBP3;AG3hQKFtkJeEM2D3acoDw!&i5V1%jFo`N* zdOMSEdQie}=NMTEg6bxFUs>!@w9j;YYdw9#{(4!GMs9rCm0Asz6^SsMk`IO9lgHtr2if@XZS3SGs z#w>Q3XH0g`uU&9R-JONwOjK4%j=g~8G%*MNflHJ1(!+pFT(RTJ*1a5WO+IeSqxh_x zkkD;rg1159X{;}wUt3g>q=bWtXrzHMKe{C3R3gViXCZOOi81Gs3W?{49H z8b~J0ktkFIRxuH4T4L*N- z-ve07;1W6|A^ z%gEUAU&NK=DKRq2>m!?{9q|9!HTiiGX4~%ABPKsZL!Bl2*8EBI>0l1D1+$M#Be28NKgdqfFcm zYo0E%lx{@PW0&RQTbp(*A%Rc3EK~MT#WK*xg6WIZxto-uGW?qT z0LQU%5L#a!_vEaQh|Q6Ma&WuLkC;g=J={p2?#mwA)wl6W;p47*vOor`X~m$mPe=It zdA#qCY)^DW{O9|M!A?yoG$F-+jP)Ai`5dfpgO+4u9vp_at&%F`@ib`ppT1im2Ff2p zjAE8#Hf1veF)@lkGe=y5S#z=3#P0*6&>yW_FlAS%+pF0 z7IEg>WPwGbhhJA(F_P)dUtHLCELilKMPlms z>3H2myK=&aC6vxi)ON!dRbHdWl(Phn$dJY!v&*QrpNFu!Cup5IDvnh#UIm?7)_)jt zVT+vFPT*v0$E84zY2jzx`;+teJLU4lUt0&2nLzc#A>+VvILL+c$bcs55Xm+ehnyWM z=f}Y|?;~{5#ZrBnH+LCt9wbL~2*aHHCP)MqgjQzfSnh->>RgZ+NLnc*v{Q9X6db9L z8|84N4b#qR^lj+B)xbmoVOLm_?gYw`WrOWfQa`+{ntk30ipknOa5ddFze)HgiZS#& zReXFkU94_twvjh8ixE`idRqvbc&N5fS0(y9Xr^l>tl>tKiMT>@MoSHWA+noZc9hCs!jmjjd$sw>d7GBrUqEA)&_(GsGKCyI|n)3$wO3j*>j^ zG{0MY$puN6BPL3?Oj@%q2!hf@UF*)m+RJ2Tn$6|Dlllri>?lrGT~HLH&oelSw<6%6 zoJw``aFElu__p%ZberW=2$mrX*tmQ<>k`u|jNR%eq8)$#gCI>&Wv$1^$|L`w8e5B^ZV0{Cyr-iuX05>leFhPMCJZGfmcF*6er6X5-# zvYUe=&|1pI6!fPP?0A4#cc104Ya9D+^;G8#5~)F%v-Ok9-`7xtZAiDJw@}1{UUb+6`_0 z8K2~2;Q|OboBbnf$@U(%lr?ny#|aC^`=vk6Q~yUKlk=Tt8vks?!p`&#dNTZ@55%mj z0OfZssu8ns{#9LA804x=%<$g&uV)dnyfd5l{V}@4e_eieaspZY;^m)s+rRSie@0pV zy*reJi~V2Rp%r+Rpp~J^Hn6wg7fEcYuqSd&NN}SAMI0P9oHlbm@=qqxNlQa{c@p-o zcbTcW0&24(j?1IN5Hs29+1XxE8qbMq&o9rX3_qW|y>AB} zK6*TD#YIAZ>!`Hp-ry!}>8k$X`}nmnaVXB8CNU)A{*~Z`m*|o$TA)kp;?Skp_E*i0 zpQXXF>jj-}jD?D37h#^FVrVj3>s{8_g;AabtP5kjj%%}*RbpX1eAfw^?C%VzL`lo| z1cnRw&z%?Q#iUa~Qt{t2?7rFRPzl$JKR=)9`xusqfY%e?sswyO)R1&`xZ~aycfNST zv(F;CL$c4_6XdHh*oi(w`NUYYUhVk&aJAMgQXzp?<43TUsa%rTrxe!R0@Ob_nu+v@}ofm zgD}01`~xF$ztkaBCSOxP+Ywo}m*35U)bE*KaJ6L2i7a=KA&_6$cYQZ`THvH{t3TW& z*l5IJ?wfx{b#-#BQe$T6g*t_gQxjWh0iq5Zrk*(uJwaz7Ny1o~?@!PwidOGQIR-;# z8LTy~ZtK<4HL_{0eJeehKz{)HemG#HH$97Y=2X8#5*T+#uWd?%rr7}Vm9A_9?*>QI zBu~t~>z=_dKX7PSL?>E(jaetVFyIb08z6A+12nXCiYqKW!(C7CGS>$4z`p+I_iqCc+jiz7D{w=WV>Z5zvhG zVIY9q*1cdDxo{a$jv>=xTBJp1xmeqGe?V6Ac0Q543`QD#~Fsf?|CGhSqo>D6); zh+n?u^%*i6)WxX{ldiSPVS>m~f=R5gHO#qKfIbpE7L1gp@`Xw8ZXr%~3YWl!yfsfe zKM`|9+au6EWz3D#EyWYi7*0l!P*+7WjXjKX*v@|5xb)D6RAyecVZ2y7pjT_$&CxvC zWcB1*8)r;!79sPNiP&1zyAT(PtVM~uJ(S?zgZ2i04F4ro=g}x@HW5*kG&pS3{6sS% zlC|<+e1H~An%>c5t}#y+PIWV$0onjIFvykSnEsnIQ^{wQz{lDGR59ZARazCme$P)M zW$UH@Ks}trM=;L~`DEu`XrjS2+TV%AM^CC)X9heanwI%7Vj`F;)^(}5KZ^A@8PIxK z;Wu6>F%J-BIr&e{;D261;rX^58AD3L61}d&5v7E0O9b_JW)K34YaZ{rshp;hN=X z6>$i`siM$oJ8v=O?<|)w@wHKmE}ONQ$5OBq+SXYH*`@?0^4r$DS(^$|zAxzZ zz;;b5wDhthRUG0e^`J0}R_a82wgYd5&%%Tl#^#~1_p!dv zNwN>)BKg5z%$b#q^HQx~Fjt%sv`V>aSoOhQI_b_ooXfxPLn9x(ms_+r#RSx2D9oWM z>Y2h6zkxzuZjOEp$RO&roOwmbuiM&BNI*aNZag=Xg_0z#W>gmAhbc#l--%BTH=YPR zA*C8S5uO88c1&TxM70UR*8;PWQ^}B>jC@OTY78zE*GEMU+saGdUtq{}!D~%KIr>w& zF^oy!wI!V8q@P!2{kSU3xg?RM>yK%9G?Ilh%S|*!vZAhxd7RNLe~L{>5`=x_UdnH4 zRIdGu7UqX}JSRRtLOQ(__oZHuXeyQ{-K$bB@2qP+(b8`=4JegGxK}FfCBz;DV%x-4 zZZZGTr`htkQCGsyay0Qp*UJ6Y5eZCPO)WZFW#`mb+k5F{5i=uGEs&RwgFQX*DwomH zgX%24MXanm(Z#}YMULt-Th`LhoV8l>Q|q}<5($JSFEW+MHAQXk+Y*sBUg9rp%Oqp64O)777$5f1J`Mlbyx~(|`G}*II;BayZ$5KscdcBi}v1HBVvFGan(e*gsBrtdX`Y zD`&^8!XH9#6+C!k;r7sFqy=mhdYDFUMR>|XUxsizR}pXZ-DD%{v~Im;68~C$+J3V$ zuWFNgJuTW?A0fT^1p6a%3PG}I9rSzQs7N=E_rPSaq0Aa0sLO|=9mh-yJ_l)3kF$fw zkqQjYT-tkX?ZUTE3Z1OiLo+Ww&5ylAI?wOt8NCsCBUBXCXsl#(GLQ`|W~cf?egiq; zB(D>D)Coykz{D8*!|mdydE{W@l3~8jwmvWJEK0Vj$rm1GJ|!6ukepoZ%(+rPoTDCr z{rFhVz4<~e`&_C`0b8>AC+-jg){hn-i*KW@`N_@!-YpVh5InEW+ZeMSQB??$J?P=O zsKL@P8$J(ZLwei800`_eA%3K$oK?TSaL`!48l0^kQo3gDgEW$KTSa-e{D1X^Wpn~jw*~g@7{x|^}X~y#j&yG6Y00MoOO`b)_ z%Ns(0J8EMK#!5YUra!|0^<1_;%KIR$sX!u$BRE8@E0-2zA;LaC9q53EHb=PyorfL+ zou_mcf-RIMCa*`rl2jH|U-~4QxZ5)lx81avi*%BVg5e?II=Laviu8;^SCcrz& zBZTe@YPB#d9Fqnc7L_;z2~wzfK-C%8XF#@pO^rplX-J zpA zx96Qc7tKPWY(H2*YSVAy*lAA1MQp15$L`x((1n$PHR-P+1l12^@ zDQMp{b%$|kvb(kIQC3ctjKL$glxk4x{#V`AI*EM9NH{iu2>!xLfryG>Gd;YsZOe)T zF4>fte3{DZpAW+m5rsvVmJWucJ$2!bMM6Q7Yo7$3Kk_Nd&r9mZ-<6beXK)|Bq+*J5 zr^95!0E6Q*v-y(jS5u6v8D&(5%%Y*!gHM35ZP&2tnA3rFE@eZUpj3oXgiXeQZ|c^) zuZNkJ9Cwuk{*xlMZi{ZIX{(}w*r&3+_GeFB_D~E5$XYPB{?2~wIl2Y_bDTwlWvIVS zD~wzGlN>f+lIYC2@4O6J{5kB;+bpjaz867ZiJtMW!_bDTI(0~JhFDj$L%$!hm!h$w zjuxY0)0%U;G&c44-8JHWC$>k)X{ME(uke0*eVHkiHx7t+oAGT&sEK_-srpgFxxOyR zUySux4ju}|FdN{S1M7T@N39j#1TO(}X^Lgd7))G$V3;PV^XOPt{ zpT(CO2+;4SZYn>tl}(er5Mjyqq|~LyG<>0?Ymv%(o(OS%vQU-CPUQpT(Jj2cyrN$@ zWscW%1@@Ratk*($3MGV@nZ@rxDgWrH?l-8H#!+p+7W)%xFEfJ?%%gib0-9!|ZvM>O zPdt)s2T0;JJsSC*1ZnSqX`F&jEWT>lph|Z4nZth>;%c1@Z=CS9QLkIoob68YmU0!6 znn3!rK_>rpB2UXhJ@rlt`ql=w+JyxBG_es9G-tC2?vecSdpm2@@~+wv*%o!mT@jdv zL*FVy_d1)*5}oxhKfi5ctoBxvCb+2s0QF^)sW&MWNwM3>{(L@sJU%f2uB42!t5mx} zQ>eY1Vp5`nA+*J%Ob)XQy;C?U*WtC=Td5rsGOKW>Ayo-y=^Z9r@ zi6C=V+w1S1mtw~Y3~0xf;~LJ6_y&@;CO37~r4{{G>CUzeX4;}0o9x#1_|Ca#aF5Z& z6X=6-h@0c9^_<`zUFWHJu~)8qzgOhVQwOG3;)^=5I`_z%_l2498eFv7jZd9^O|KBF zO_%|EhsJ?4=wtI1b>u-aK}*A{tSn8 zb_Eth*Sxn$1>L0=)4L8%A&0PN8TPVN7M$h5?D76pak_XSR{Xm0s`hqJz1vy(2*2N6 zp==tVMFe+iI&Slw@svTH?pBF>F`cG6r?t9?ueRB!QO#I7t^H*gJh~*^0H6^Y)N|rC zeAgi642M~id*M#x(63c1n8Sw@xNtS}!~o>MkPmh{AA?T<*hEQA@Vm&Hf_Y%jHVc~W z>4moPpUPHjPE^Nw=r;M_z&q8?|+6G-xD~=SW$g0J^W20nvbOuDDD87 zT_47AJXNv9!W;Ku@R&TPdr~vH>-Yctjh#|8!}5FXbBSB84$pC0=IYU=(4~h;KFthjjG5HiBRPd43NwyZ zx6aCY9)>QK?$T2Tn1WqrM)0l<(*C4wokQOcV8eTw86LT68M=9shPW8M%Dm>I}pJZi{Md`@lPKoyx?I-G)I7WcYdS%*&UN)NMNig-Jlgw#n5P`0dPj1+))& zh5chVg|CjkPl^9EKT?FW>EYk?{h3a)A`+Y({20`K+Mf-JF8?(W8us9|CiqivJ#^cy zIfA>s6Q}g+cu=Y9fuBOvb^V!euk?PhiICJGSHoB1)FYfi{W4n8`};l2YfkuIbMpU~ zq8p?B+|=unM&)L&>zLNZrzKm#bZy9gdDC}I+@sk4>QDQ3w$OhBt9VFUgsSi#Gv#gy~bFlW_y0?R?MbUqqOoa)zaB`TGdvzJ6EV5KL#L!_aPuD zlnTCoIslZzNTGI7Db~sxjioQe>tQS#z<$r$4|i~36W@WAw9y2uy;!hSb+ZrB=lp_- zA~rV}@0~hw!W`9m>p&we;a02-dNo4gl@PM{j zSSWuDRImpCgOzgvUbqMXYi_&=`kQFsbxU{e-;Mrm%WWr1^d_+m(b0CX^eakz;r7uZ zO|}KFDk)b@=VHJU#xHUL^^~Y|SVQNmD`6$JT-Lkf)!%XH8Dvq3+U+G;vV?hZGTTwu zFQ-nU{J0192fq;Uf7?#&I~HlbJuf-1>@hfOv0pyI6$9?$or2O=FuuR`(xsR>)4cDh z5*~%+ZY~%zG77Sf;<9sWu)9K^S3Qn#iTWv0I?T<~LXxUYJF>6%Dd1uHMt?_%>m@;O zNscYwWKw_ghy8)uu>B({0gXecObz9zaMMUl$P4N-lt976Zem2oG26_rvl3p-;Q`dd zC~q&aG#j_X(jB7S&wEcj`}EaT#^t_~By}80jfKlNGOHoW2y+K7U?m@GL#6aXJcI5_ zYvqtxx0_-4A={`vt=vRxD8K1%UX3Q-c9ApxZb+168F!%C0@@ae zptb2ZY37WM)96!~#uj_$+^drMV-XxV<%$Px|D0QJiJuDYYg77Yc3*51P!?q2m#ZM7 zf_mWzgz~>kD*EJfNLO}Jp*jL=A%#x<=u~@`qS@AiIlN!~#EAWMewI`A>5sHfvK`DZ zeSA}SXC=Fq_KGG`Y9y>*DSb+@0X=PH=}naJS&@ZXvk4ySux)yIXJz5*+UCqRx5 z?5g)&T#{#+c!LGIlt;ru%V-M_3K8m)`E-&bVjU&ExiV*B6NV8D$>Pzmkb6Zue68D* zmmgEdD=RB!k3?o02~G>vA08fDOZ8NEq?Dq#xxmESDC}cS?V5S`_!KcSGcqXeH`MmR zqL3SXEUon@EG{lC5D^i7u&l%JfW>_D&+Sly7N!Wlx_4xj3{U_CiCC~P{2YH- zoypI~$MLf^k~yD4yLN7RfXN7+dBi>&;vll)R7X_TAOhj9>2P zctjU6EhvrP#w$aQ-3LVn9{xAs)By83)K>w6Wp||Mvy9|$M2?yP;5t2%l%BaIM{vuT zn5}E$a!&QjtOInPw&o=XPsM-=#S9S=8p8m@=JzmuA&FRZJYP}72xul83d+H{8%;e5 z4k+FAh-$H_^$Kq<%Y*X4eQd-Htj>9u5yYlZd$t2+CCi5-Os>aa>-nyVbI-l3<%viP zpFK!jDvmf$nsGCSIc9VQq-x1k{dfXAZaD68=UQZS&Nj%k;EH<>Sx)Rotw#De>BPQn zx|?h=yAaiXwH)E&#b*CzdVWCCau#%fm4p0Id)WfZ*Nnq07uY z24*5SVl0s&3}+9FaDv$zLce3lxIbvgk0cQ$=fdyrxbC#wsO5Yo(djo2ENyifi9S(F z`a1Xa-kLofiP$EO(PnN@BtlyWmo-HJEoVN^7K$56j7P@=oO=YH2m?fHUO`e&IWYHJ z(5n4_0hhJ7J&qQWECn{1MCtZ|xz6`cwwQ>#_MAq#H=0V!3`?y1Ypqp8N()znqlq49 z#9E7`XXQcq$VWXoE8K6LL90@{ELZj{Clfv7xRxm&?ce55*JDkGVvm(_Xzi5OhZ)Pc zVXti+njytp;Gor`W5GM2i;wN!0%Y@8JIhudDTI6N93DPMAWj=0i@BEu18c41BJ@q? zBjt<|arl)K@r&(#uIjv4Z#T}8rs1bv!A;OT@2%W60n=A8=;3EmQPu6pC>=saih*-;Irzc^1*C32ldM8(1qF|dRG|~1(*~vtpWo<|Cpa% z5$P?~ccPMlk3j4O1}-@4hK2`YdF+sYypGV!?w9ZI{MXzrzEiX_?oDcE}w>*((}G zIV>6lF(o2(ELQN}t28cn#Ghy$s1Ik$GdHIl3C`=NKRa?4S>qzH%HpsHWc6CdXgc~} ztMN&0!jgrTlMTkr&Pw@uZtdeptbKhJ9c$-!$t70DQdwufpp45iuvCxBKvtM!CHhx; z@?^SuAVUN-ggDVjzIW^UGSCjOTx3Ix?vhysAm{>(oXQ}0vqfMljMNq& z>xKXY?8A*sy6!v%83tX&Q6zem*Uc|Wt7Ot|oW{kOuN8Bqd1n}PJZ;G&BP$K*lUP(P zg(+jF7PAO2F4cc}oJB|rkzZ=)lMc5W8J(L`Q!f}8s9|DkprukWFyLJ7cdFUlipMfi zvqKljyrW2dzt&4;tml;M035}otGEA-`%TR*l?9-t4K$#^IVypOWoF)HnJkdKB;i)W zq3p=X$3*iv>| zjrRJqt8ncwO#tuL$>~Jckx@BOxakwDQb?WKIt@I94rkJsn-oVinTgrv_7omKILbv@ z#_{qtD%|d^6&(^ex5_oOKl9NYwkLe}SYXVFyJDo5ZUe_gUhXTFy&WAaw%+EII;l9P zyo{Xb`R@7)kN3+6MT*1NAYJl+wjx~pdKa_C1|G^W&qod4k2nB@*#i_d15jA0RF;80 z;#4}l>JwYVft=0Z+QxXD{GMi)Ckq5XS+;WP43Y`L&OUvGzC$vJv5- zxHgS7!xxLYG|=SPxuCm(inxkB4{q-f8VlWwoKCq(If3#?i9g?@8BCW;N@n3?!ws$a z;BVCXH=e;+VCt_O_cdX(?R|7!{J>4_-J`H*z!tQ&M`yrKntdS4ER+87C8Kr2H~41l z7U9|DfpgYyk$!XaBbSwJyMqw(JsktriWPnOkIljO$fmaln(WOvhJkx={`4!kcZ+g~ z%N@s2@+KG~{9>wh5&<6upK1IO5RC0ZUYjGh+O#N&cPJATZ&k52zFw%=FmprTNqgCT z9Ow$7Hh)xDV=IfbH;|?{=t)*h-`c@Giu!PjJ%P*UF9#!>T(ItzdY`*8q=}E1ckXI@ zu9!4~`ynF5nx%DK9NB430`QSUb}AP>!>rm|FbpQ}nM%P9x1%do7`Bx3@+)P~7|-Wq~d+jbWtD8O(`uL#ur{D7bZd>7^Mx zSf|$oc5|>6+$8&Gxpz#KNvSDYQcreQWZ%x3(5&x^L@K>s?(P@SMk*x`yxIaVE^=9D zhp}{!LpD#zta|at$AgxKDW~jgIkh;cVNHEpFWI2s{4wxFff&d=lxzG5FV1s02!Kr} z0&3->941MTO))0IWUXpa`$jY?gPdV{)Z^wb(|Uda-KF(pLsyrUB3Pj^J;HH>nV$(} zH~JvGJreFvplUT>F0+5-+9kdxQBl@z-2_X@VO7R7YoCh3%-dK@5BRdf#L50K;iy^W z6PDfP)M{`oT)QVOyV7u(F9A&M!r@qh5D=ctvf|@z6;W5t>M50P1Tq$k21b?vNZK$PrPVHmdXXZnL#<{d8eG{s9k*^c0v z$B#Z^Ge;eRe&jToij5F$Y@zdwm;ro_0Ur>0A1hWq0fMQ;L{_$i6$&aTS4YO!dDpY8 z4PkVQDmiKu(_>gmuZ3=d@t(vQPw$P{x8Mx?eo^(%7pt!vVoyJWF3IBy2D1FpX~2bg zMGPbbjWhY85Dr1&Vw56QlZA3u73D$jqy(WIXu!#)s?p%4tgS&sA_WhzCz=_~$5b{0^4T|Df0){$D-Ja=Sit09UO z;6POOb70o35#Gk#>q279vyI|vR)e-4ocD7~f|zRw6P*s*uVJkhtn5b0UL|H6u+a1~ zTCQn9| zfYViI0DDJZs#DO1X=9u1A78y6-mLIAt1B}C*c;#6$-~Vs`%Zi#C-aUt;lFL$*3zPM z>ten&tU5?9X6p^!z7T-jzD>dCe*br;+y6U2FaTx!w+Og-4NGerc9d7Et~Xx-)!IXuA?TV$$;7UX6#eXsKw;R+@Gy;LEgZgRie_j5&lY zDNIt=uZ+FwNvt=dC!AUz=GS*pJTf#Z2)t7@UtgP&JkmDlRIk_V+EYB-9&38DJL&cp zzm7Xd8e2~epI+S<+I5HI*OMl)7gB`HT}C437T3fi1;vg+W<4Cm5;d;Q#->~i#H7Hi zcNH3@SXiwaq`Ewx$Q4p#zGr$2*L*#@*~1%px;q-CFQnL854LBLz+}+4a5@RDgU2|z zrK`zS(y$Z8Atw8_aP-prxM(_NuHoqeYclWN#DHFmDx;cJ7qMTd8&p(UpV=hLR-?X? zUtyJFt?Dv8&(psOWA56=z2ER7=Hr)#l8WMb5pnA0l)1fk{3!Q5g(aLSDNr)`WYW7l z1(b<~wH&+;2RcK?@;)Sx;Q70VuuD*OuD8wl>fp~hgK3}Uye4@*J|qskAKD{%>CL%^6F?Io7ZQ39V}EhtxsV{zS5vFUGEWrUz=A3hGt!OIN45eR^(Jf#|!6NgQFKT z@a52dFHi!-u=Am^WfHy_Z1@H>VEc%2Of z_!Dc3Jy2sO=N!TeahJ!oDorR4Y{|LRFE2Y-Jc^mN^B{JaDJa}JjB#(3k*JLA8iVjCM-qIt;T%(L z+(iL9_DazpIx3Xlbz}-l+}?ABU5K%FF&6gZT8RK3i^g~f9a;;8(oh=EZY0JOJI3-p zGozj7D)@$!9~V9V!xZYUIb;{C*VYvoJokYJ&5}tmGAA+d1HHjeQ}31$BhHxTr?CMc zNP~9?Nb8EW7`0s3Ckw9(Hme6(Hw_bu%^@l1O%SyyO!h^3$)Br&6pXH_Zt9NZ5jc96 z>N@neH+?L-l%*OOef$OLzxy=uZ#7jUu#?QkaD;MNVQ;RQXuNH0Jj|@PGsANk!&f5UC9$bm^>>YMC9eLzC8V^#(!y&MNGQ@|L zho4i<@jF90Q>tI|0!LevC~BWIyHsC2^MG2@Cveo*anV;fRNH31)Ad(L!nsgFFdHU*&8es!6{aXV~c|gA48Iz)!=mBytUUPw)SFao1 zPc^2(Sm&9#k4~AOO;_2q{p1DtE=v^14iB5|3LOldOQWlgdXt2N%VNjIzF$bQdVm2q zAm@!?u=#@e7wnnTQ75N z`z;|0sdg7}=NR8pn%Y{)TU!HbZBC%v=Dw7ove~ns*j`Q|gLLv)>eDf33rN6>ca?@= z$j4Bt7`Js%&-K+UZRNz5e|Dq6U-X*&F7OD&AhmfAgbv|UTM;^?#qW0hG`*tA&3t4|yzvgr@;%AQBWOlTMLaXR2OB7P4#rRu zy+jb$^%PYkoMnave>b-JR~CmaD!S{-E4TX3Ki1`qR?5GiG>y<7y{I4he*wN(QFSqG zzdGwEo%a)p$^>=c;d9=4W&3i%sOlYpRPBiS(!|-t3r`=s5SXtZ-aRV09oUnJh#odb z^MI82?j#EK!v)#ij96k&!KVy;9|{wgNw3(HeCY(N_pZ!ipNA4q)Dc{fu&YDfoxO$t zrYj~6cf%#h(DLR%`#&5=}XIzRyJ@> zVIc;0Fz!ST?*cs`&iZPqkwu~oHwvA=NgpEP4{o8TKcbjgJ@>d-8%hIjcDI6PGPiUO zkxoWMo$nN@ps@<9A}Pr%+8kPlQ3O&itA|6T94>`cr_hr1HAWEC$YZyzYhmX--^P8$ zF~0ZZF?M0c>E>guPtCrBo*Zh)z2ClstwYODhr=}~@(b}u_^JcRz3z%f6+9T zV7eu?W_eZAsB0FhJCZfaB9N4nFiWFqYl>IqdqR;YwS~6Sa1pJmJPMBKQT$+RPG{xP z98Ff29?iL;iA5m$ocolW7ehtJtU?$-MO&sNCC-h>oc9Us$@T3-o6<-K#6ZD>A)x_t z7i0!u*XL&5Q(jVgL^7dT(R9QjJDKQgbTuolC~n1nP@{Z>>|)EoJh)EF@9sjXNs_CW zZ2^jgmOB5(6tsFF+wM2>15;FbFINm$@>e~Ha2(-O@^V9%w6SQy&nYp9Cb%4*R&Y7C z`|#5$p4U1nrrHgsI<%@LHF%A|l_Yh+9F=3)D8LQ&r=mY8As9rk!5T1ppIk>2_qWz2 z^%bWTD7ZHSL@mOy)BzD$#wmV9iR;@8h`my5F&U9B_#Qm5m_Zj37b;C%qEqw9 zu!L*?z9Ut8Ov<qw`g4&=p} zy&5`&63p`(++~?8Dj8>nx2Esb@Fe2(D!76CVW(EC?6Eh{H4fa-zdNS>kDx??Lc$`V zqVJXUOsy^dM{pv}e*q`@mG;lLnV)I@fD>{43pmlwv_DWf|9}(yix>OfgcNc98%Po7 zUm!)l%KU9O|BH~KpMCu?@c#%Y`WM3Z&#u(PrL9Zd8~<$sgnU%^B_NB*BE z8<_#{rr*&`jGT=Bzo@bP=8`x|A9Y*hf`edpv#Gq&{Ny&|5`w5Q zHwe78?KrxQfb&CFiqnwz8O4@p`c}<^24$yG9(H%6VaE4z(RHz&Zepp&_Q!Eh!ii_q zXsH%;H5xPGsy~pe;`sA#4foC*to!=-h~ZWoA@4|yW0t&0n@|JA>yIb>`^ZQZ0g)=(_%P77{-|>IR+u&8$$6 zo?8@|$Zn_2q;**u4L0&2nI0bwt2YHdf8Ba@l*|mC!PjWLA3nI^b$WH{39)rQe_i z-}v=uRTwudJktZ>sQQ6C*$VQ#PA$U5mr{=pN7Xg5@$cxl5fUblAf=i{O~6ui)T8rr zdU+sA5pM?<2suonsu2nhZKu#UOpzQRpIG|3`D~^Lb8*|6k4*r*1HOCVl_frQt$;zo z@62^Kt~BYOy>6c$z#;VLZ)Hht6Sk>s2-XJrUm99MMtWe=-70{K+Dr)*M^aPz`M;C& zR36`<1H5Zrw>+Tt0Q^=wu*jcZY#GqbuduSkaNz=50ir>M6yE-8xqp*w;lOaM>XB|e zo$1GIn+OnA16Pyc_Et>ONp)}c%_jU&$($Ak)H~CWY@PLye133eKYxfL8=G*^%TLqi zHv@wHU^T1dEkg1DOaxGYcz9gFx$h20!@(vu|C!gfA3L`>gkNqO|X9Eu9B}Awm*iK+n#fZG|mVm{cA?HJFI;x0h~ZQC~nv zAxubJhyrebV^~>VWVThZgESGl3k{ORYdg^Aq~0$vYf*x{7`AjK7t=!A*S59lG}%;< zs}Uv5T+N)&;u@_rX)|j<$BWA}v~#-tqFjDkjR!j_u$?mxLnFf1r7rIhhTqzy>)KRXxjs6IVc4Wv+9Rs8r$$2CZ5#br9dVC zhBPCkL3vx0n*aR*ZymsWo_Fnauo;ULBY+Dh8tZS62q#hBv6JBbMshT*{0y+4a)gbC zA9hc7sV@a4`PX!(w!Wt_=6d4AV(T>P-tN~MN2_v;XcKU;eu5GBY+(4 zObGgLb3TXaEl6zdo~^Zhl{Nm*fadI#t}@@ZWg8v0>mfC)xjx?qsU0lQ|>064tx(D z{Nr67S2&8-{+{>o8}z_b$Dc(?R5tZhiTwQ8U?IthxLrWcaofCj)s~aWv52joX<@Md ztEocf*8;wb^C15_e}4#o(rt~(Dl<4-K#_4ZTL(j_K0(%MP?u;=BSDgtrOOra8uJ%Y zTXH%wte;sLm?8IdyW1qnxd_)FB)sc;&h2e|&%24g7P-MvVCM^YkEB$6FfzxRnGrJ*?j@dGbQx z|6FQ!bSc-q*~jDG)m|((`#3Tr%ee&zhztQ1^=^9PtD}m+g(pLrH58@amWCfcYdEcy z8dm}KzCRcEoBILd`%SuH#0c1h2|!I+?jcVml%HSEIGWPqAJvu(&pfz{=5BQ-{F)Im zJXO6d0CO1v>nV8*{s$gSDgPXShCg7*GUmQ-py}x7Fny2k!`FX-C!JyQNg45B<^1*QrIPTi<$U1h+y1JZaT-UxbeY$A}n3RgaU&_N>PU zSK4UC{{FXjIUG>6(C1s0Dt8!=B()9x81y?3AAigyWqz)Bwef}FC{kIYhmo_9FSU{H zS$PPX&YfPle5N%s{bSF ze{@`ntUY#t8QkUojm$lV`YpD#3j5Xw@d#+Or55b;mX_zgM;n5?N*Ko-;4uf4CZw)(o2EM3DAc&ZVwmBuJ%y*g ze7iqH7eOX&cD53nC)?m>#hIGQS^g3Fq&vXEzD=A`db%pw)U@A5+I&`Sfz)HKb;k{Yl&I03ElUcHZpqzRI+-iAbq}K!LDvtwFKM^D98K_9Q zu?a>d_K~Lko9loPPEIF#M)312Cae4Hd0ch>)0D+VdWY+9-_F^?ehO>i$-}5>ZJ8d& z!uJUycww&Lbb}3!jqrX~#@g|t#PwUPuC`Cahtx#bf_o`S@)X+=G;P7ig3F;!Ps$!d z@v=5V%>5WbLyJ4jS{##EEBJ7 zG#aO48rsoaxU72(u&gu7xvMnX(_VQo^ZIvdSx0

      c#nWu>1nr{VJhNxhuIYjR%><>?vrO2G%$35{A-belGCOapg9Re)IC><=Ep1%$nl=IG zY>)w}yC~325afqTSHg2Q6q;U-%u~OFqTNCjJOR~WQ z+rkh|MZ-bd&o$pBfI+M7lJ%KR(>K_Um%8LWZYvxT?$&1SA_bEI$EuQvgAG>r<+3~A zQq_<|ur5!M2Oy2Nn9ZDWT~f9O!}qo(yfzjxVKC_)o8dV$CdpYVvwYQIwuM-K|a92iU2 zCLi2ap#z_XPYbEkJN0I4Admr2Y$=9+wJ4@G?pH=5Lv((qx1 zxnL*)%b;dfem=LfEyE|D{7s9PJ6wpr#p{HME(P-=v=XpRcbFV0I_Wava+ zdrcN-xI>g}Oy7hI1Qt;zFs}Ig=w%QiQC|Jzk3Ya@s#sNX$n&L@mJ3l;=Fs0YP%x>0 zrdeZSBo`YW$2AqLb-Rp~OYab)4oJtMpg4B0%G!sIH?nfYQhVw2h+`rvtAQ=C7(+-< zqB_sXS>0hif+mmMu;v zwNBkh>}mtXzVpSco47*yb$c%ymr>LyDVAyZz(!^cE5Xocht(&QR91|1nQ=J9B78e9 z^zCR}o<$sPXr#?500DE_CvPZ1V8O6dfIM_Fl{!a4S3q@w(t%=FAh$*-G9T4H8!S2A z-6CbherN7-m#Z(cY#42_yOQ&k+Y#t<(`+ctmg^ zmTzZn!^5)BEmKvr{ALUV1NnH)a_Z_4@PrCHVZc+UT0N}epATQJY&MfJe3s^YQ&T+T zs@ZCw(o?yc1bMrt>5gKb#68E41O zQPdNQBUuYrWT+U-c<~7mTr5cwLN$n;i$)R(tMx8r&hP2Vj&F~At6r$&u6K2o^wPPwK}q0brpfYDe4r^My?Uaqmbs% z=fHq?viNi)viz#IwrB%g@y)*EF%4yX`AciJN|Hv#P6S_LQdMfU&0*D5!o<$t6_*m9 z3T=EMF?T{ExdyFuj+!2{5@kNsZJC}X`62&y01B}Rz8vy<;iL4xYPgTK5+3xSq}&Na z@#ErmFANc9U_d7mH_2NwKPs!vOHaEJ*v#TE^eRSA71(!ZZowfb&9IV-hhf-9%GL}L zkn-Gq7+K9h$VLnVlgWC1CS1aRp}!`9g}`8=V#0~rQa4x0b4l5zTjh1OR;D>U#u$+vjw+~EB zt7DPgv#uB09Xz|d9ABz)IGhf+aiya#sBT4dqO>T48@o&~^Y?MQBi6g%qs7KpWF>S5 zZqvJFD?LR@bT0WlHdPOMa5BAW!lx?HEAWmV4E^rekyaN!^uAZ5^4BiiR02(bra8Ck zo?_$3cNi+LVV^vWay>88zqv14pESXvvK!e(u<~$(LR~ z-HFxRr7H=@+VxL8gV4w8q04th<@YxhH*al)kDP#H!oSJgCu;HTGwt+}iFs&~&1rjh za$|n~ER@?8LohP!+*u93#Fjx%N`YX^0aMdZ$iB@iQh{7^X-m%WeQjxouq1UU&{eiG_F>wTu;slj`_og9 zGY)m%^n47|iOJks-6&s6FKe3xMg2hp3oVx@E0yJaH_Sq;-dMu^Hez@j%G$89iVfmC zie_&fR3?K&fDWe2g;&xu4aJ97`s~LLw10O@`YZJ3-yf3zTv0!XoBq7$ZCu^bdX)|7 zSM)``UcrN`86dRSY{tmcr_Qk&SdhP|dKWvSe9TGyX7eJV#z=t)U1EJD+sESTofl%H zv&BFqTkCHGL}J=)n4K#C0wSG#W;^Z-!^q5mSnJ5^@8b^DnsUyg7QC;QH?F~zUYT-$ zSpCt&z0+Gx&Qv(aT`5_V5wzqrL`c9rZ-an)-Y7zsl%s}WOgB8L46E@FFwxC~FyqMs z3wMGn01U~{G@ahexN9FsUq#5h;UF=xE-tpW)@=mnDkg_Hwz@twtQwV8Atrumxc1;k zDi6q~QV0$0TlU0xL678+%K3bc#N!4_py|Hva*7?shX01mLHe~O%{EwHxvmfK-MV|{ z`DL%jY}Bd9jEGB(r`e|pGrX+f|LJKP35x8*5vV5cr@rHKJIJO2-S5MFf(CRu+cQRfF*?wWxNQjFEs+G_#s$AF@VfIvktsc%t#$p=T#12#wT?m2d)al8po zY#2IO!X1X;Of#gI{ElD0J}8v%aT{k8ef!r5B@ zn&6ejiJ6&86R86#OI;c87Tt*sqFE!fD*O&rB0;&5mQPqrLy2oSLG}%O1-&F`kOa%J zQFc~8LXJfs4~QiBL}!q?jR+-b(6f3dBtMdKLTfov=-$E=k^kHv{baK%c9q0)IDo>X z(UHCuU4DDRZ^tc5;KSMIv@BfBe#IG8qulqQmPMTiV~$n?w8dL_&2bpti2yS5p5uwg z?O}`>*0N{p$Qj)t1ha!3%o2l`PTx=iKA1q&s@(6&ObQL3wk1{aYpZZu4x|HO407IM z^g1H1jH9YY+_=vWdr}Ys4ba@>G*gX|t8u^#jX^DB!;0;B$uR&g_jh+<-9t!DuZ3D` zo`EZx(0u7$D0NR{wI%E#ZISo1zwjk)wKpRmLtsiZnbB2TN(_#DFIJ!=w{ptOkzYqo z)OLn4;yE)_vC0V~$Jj>4Xmyr^k~r-N9KoAQlzFGm zDjm)*dJG@Grjin)8 zAG~LrD4iVpW+IGR@^xKqgJkJ|u4OU}MCGNSLPy-U@Y5%L-RrQ$D%Tz-BHA#qaaoKy z7%r8gS(rYEZ>G&4qhvV+p@D>GA~5I@!SRb(S=d=N)VWW6lromci6RZlwYWPVmfBzH z$==o3X*BfRy+Ar}qnS$NmvgM5fN^CnuyJWbVavwOk)UsZ_v`l|!-jyU2n%MR2~beF z%3IUEwCFr;=UP8TmaWg|>^yxRSA5?jUQk>Uzg6e|wQsqH4dOt&gz^C244N(k%_qzZ z7NaXe+TZQ74dcreF-JiafwpAZI*^jFgAbHL(;F6k05VIx%7w-PVrn{r_doN*6adtSoERWhJG)LUhjOx$8pidI>W&} zd{TF8rA4V5wTfLen!`Mw-52Nh2#HR1Ux0@VXT((25)?!l7IX=erKBApSqPjpwrU1+ ziFpUwwL|oznMQ*+dgi5X=ee(k`Yx!)G=B0}-}Q7~i(#^0X{I@T*HI?*YyjnSWAtj(nw_rN-8yVAdO`Q@ zeA>;Vx-7GwAtRt6)u(_ro>m1%D*1<*|59z4vGH}kQSZEmu*#ykQpS(cW1|gOm34#X zYJ0){O<8}z+|KynuH0KOP+SC!%(Dkmq&dxC;0s7lvZvmxzEyY#qk*?O5BV>0g}~X2 zeDToTx#fxZd8;A66$?Lfc7T>iKC^d-$KuA*G8)LVX;og>ymcy`J{mcT5qmm4Qxs6v zHzU?42^^rC=R0G*QxR--bYNZAVnZV{o+|JXE$&+_r;Nw)-iK2E-Z2Zca_DIUc5B*c z4F+FQPLi{UUI4OpD=L!Qh)T>ekjdo#aqXPNpRGkJS&(<-B2&=6A6Km@+c_HjO#MlP_<@P> zPlCwbotVPbj&^27b|g#;vPRB-a#yOFSqWO%oBe~!@;4XbpX`c+j7$u_g< zcMvw!`;GsRkzQKwFAqP-5dl<-jGUbRl??J%{r`!#^`Bq#Kl@ub091?raJMpYaQwyH z%Erk2r@NI6;L7|5jUzkDKY3eO{>I|?%iGHKPu^BWCMH5!K>LJjOw5FUmjBt=`jgM` z@63%%4F4|y0RVNF{Kg?^|EGrj;LZG3?4nEz|0Ns%@G?I&_D`PQU*-M?2Vi3Oui*f{ z(*DrX-@^g^e69b*U;rkDe;o|K#PE+`0Ki~=4)AY-`QHl$_|?}R!~Vy-`f~>S^tu0> zRKL%oKSlB1m?kIZKTH!a(!W?HJ3Hf_mdU~S7t3U1X65{AAi%#iO^#n>egy(B0N6xX z34g0d2x#}e*yV3F_|J@@zr_sv$9jNR{YV;LE;L1cu5Ie13UW^&P_J^*Ib7HU93a~ zjR9nkLJUEeUR?3vfWYM-gmoGCGVR?E=4~3A1T(Q*5%|^l{Q1IGjueVaZmm5wtXWb9 z*DPoikaUwI&yZZAXm?12v{30=lx;-mT{5F5m6A!w zvIcUX@qIzv5bw}eYs_;3BDnl`W-vY$RX@@H`fMN1pu2ik)B z1-KB;IK;Vr&p^YC*B|g3rs=H>N_A+#_9Xax{-m1vVe|avIrAoh)Q9$F-I;=&gJ|o;NmQ0`f+a$_CZ67jJnb-CF&&*g25Y>e!Ga{!#CYgDXBqG)ldA?{BMZoYno!WWy| z+40DOCrHXlswDIubFrbdV2MzZVET%VEJaq|A_e?6zKy><`oLOvGrJUPv$+&IV+_j< z3>LPgbkJ{u3^#nkN!ozjVJcePo$Ogj*!->tJ2$%5&#A_+KCFw=IeJWc%f`@Azt`NY zwDvkR2n)d;V`1#!(NcQ!6ho6_^|XQSrs_Wh$M>?~*Igs!Jg1zM$G6!!+ELKl^x*Za z)lU^`PQto-{(V|PIQ>$YuQnCmQ-_s>#@h`c>Uaz9i=xhI`$;ApWm`%fGK445<`={7 zM}4L2XY0rt0{5Ke6*gQ<9lEs^$NrC6M~&;Ny>*3zjI(~zi%y=E-QN?rz73?5I^#O0 zF~@e`ZSzr+3kG;!(45?7Q(C-dt~rDJ<+2TY4?|l%nk|gZLxmd_&3aZiyQ3gMgHjUGxTh>U&6jaVJ(!ohxwmjlkz4LB4`-q{U}a z>@9QPg{(dAZ_ep9hwuH`DF`31ELIwO?&-Bw72tX7h%?U37OUi`3^9ZI|(*gVs)#dqJ1k?*O@CT5Bk_ zD_<>QqCM=^ua|apryPmy!9uv>->F~cAI%3i=j|rg-rA#SXKPOxdeqM{y;Kyanr^f= zT0UrCo}$K7d+*$ey(wF=(=WA^?U^@XgxzUg7)v`JPj?Ztao`?e8Y+$LUn zYI*LCD?!}l$ME+z@nn>oZQPQ%BWWA9e6UO0h%fvKY3W$}v}M`wZda8){_(5@d(HGW z<)d_b|K4zMmhEa3GO;zw|El;pQ>P0-#?`KVy)fIjuo`1X5!0VoLGCSoiSHj=S=QcN z8q;z-f8YR+5UaM0*=kB5z=gk1ThkEeOyeE7Yz973YFmW`FwL)I8rW$ZE|Pz|%lK=5T^B+^xMNPn;LKYNbqc}wR768K0bb1(J$ z)cG3BLx0x&cmx6@@~s=1fG!CfNOuJC?6T=o8NV=)kFy{u6d(mihq4X2zl9hGXd(;x zZTkcoXvvRi1}qh*OG-CX4jk|oo&lT_JRV2@Ra$Vbn*_**K7?ExY>WGn)}IHzBMc}H zOee|+kPh92(Z_%ZMu_AwN?6gujttbe1&cx~4%P*I?Cdj=@+M_deH0;RYXXHichRF^8NBL(y48JaRQzDy{+!Ydo5EjVP5!vmk0);< z76rG~J&5rh8p7JI5y%abPr;Adjm&c+vLv|dGI#6 z)EL{h6oojV%0Q(1XakuC>?{K9t&Yyy*&f7A2s!A+W=$uA0tt}Y54R5l0d0v&xu5RZ zVb*}ZSvzMT3T=q58!dQNf;bBlule#pxw4JFt37u|ZvvGZ#XIzmDx5i?Kj~2Q<<4^W zEqmHzO7mCgqgGH)q@3ZV+Oj8Y@N*v~he7LT10*53Z;hV^ERELhsBIwQlDY3egog5= za7J1#RJIT(nVc`d1ES0dbl7bm4TaRsJb;M|qe?vuf0h1vz6A?KR5;XWwS_R$H(xVI z7;xIW&iAXk<`V=sA-)WpUsZP_as{KH9)y0Ft2Tr=ZkBf8$!FL=q7WTjhcE$}-Vt<8 zBh}xy2spgX`uPm+tcw&wXsrh7EP%aX4+%jec%8ut5Y@J&GcLTJNXV)MTYr!SuMEz+b`T( z++fEX7FXZ;SOMaT3pnrAHqehf95xI!{-XXP)g0TQO?gH*%udm~VvGJZGp02;ZQ?yuZg zTL?l46u&GLl4umw^Ku7)vdKT{+wUC+4qg3j=7ff>Kc@n?Gg1xD|4nm)SJ`@g4>%Nq zf6NnmzPab?OnsDq9qQlf<70z+vG~eA|Na7lw-u2^&_A=SO`Yeyt!prF7`1J=T-F)4 zm6~j9QzyaAvQ3tJSruY@lh2`8i{n7HojQ{ibDN|Z@ArotS!Zm@HNgaLKYy*E37}?t zOY$TCy-b*xoAnht#$5v7mUu4w@6k-aKb-jV`7(v~Zl=cg`zWE=$z(-v9k>zJ89O30 zI@Yd+c6j5Hyqhvmtt8VzI1Zf}LLcX^(zqe+P_zeWH!bWvss~8+3F;;TQc);~5n9r_ z7k!V|198ry%F;THW93*mHkqX1u8Ofy7qS5s_*)A$gGwHGl?p+SfJ;q$WB;gE%q zD%S*A%x{lURImAWD-PsF5=$X1`k>eUD*<2>CKB>dF`@OpmKhIc!U)4J+EG0@zbDuL z65^n>VtZPCPcU?DLK(d8bauW~Otf;gZrqo%Xc4{!aj$m(^a_|fe%u)uE`_dM20gGC zo2@ki9A7i@Tz%WsTmCR~Ik`4BCLQcWRn-v!zx~pv;aC>>Dpje)U#n8n?$H+t2Ql8^ z#?Xz&#~M45Ed<0r=1dK@n^+30n}7Sq0seTI0L3mme3V~yzl-ObhADk<^lV*0pabd5 z@%t2sa9$(gx0}a{Ini9np6sKQ(mVQH4o%!`<6Z8(1kNn%X4<-y2^GJV8=K%jZnusu zyiV@t>&-4BDjKa{%PpAm;6)T8fpg*-<2~7V7akE{joWGMjpsWa=HaWsE7HL>B`)Rm zx(nh?^XJaWvk8Xuv=D{>^~j3cxII~&hYjFnN$fWZ9z>jL>(ZwEy-`D3KrtklW4YPC zByJ(>5Ee$FICB8@2#LLj|HIx}$3@k(ZNrp+(xK!4(xIR<4k6MlpoFxPbTf1#J#-_e zw3LK&N(=~yl!^>FfRsaby_?YMy6-36=e~c>`~CI(Icu-I_S$QmbsX!Qb5HpPihrEn zQ*Q_P1CMm9Ll5kbAEvBr7Xw^^G+;;1C;&6M5A^K;O!6#`y45uP8DQJTCj7;ZC12pd zXJ`S}LWOLl^Dp)X-U$S;#>(r(G`G3AhV;DdkiNYv_>u1R`K5TX!>GcLGed1B)2(7& z6)xNONh*2rjygX35Z@t1F`=d!;Zt^1+JWuGS^h#ZUJziYX*9bSXrq4b?Z-0|FRu`E zaHK&e2tS+lv1~^=x4jJZF+uCbH-AsfhN{=@kh6hb#K1$_) zPuS7xTSQj%U$emV>Y$W5R%Sx3pM5DMu8|{Csmzp#E1cW@iktQRuWsZcI@$0OD*K)R zq0sT1m+>~majcIlY{!p{X7SJVX#=BI-y@-uohmYE3!9e%o!~yGdyLsQ7l67DjSazI znj#OP>abD!IlN}`t;4Y`D&Oeuf`sLeTKkv$0K3ZV(5t5PM+rJiXOnW@|52IH-oFXw zHAwfucPd{2Z$!Xm3kR((PlrJn>@V592GOP7X)+LX(eC+#U<(|EX?B6CbFBcEBsvR4 ztX1Uoc9~!2x*1WcL^%lBVH1Gg76w6Tm9|mitTFk8nqh56A{1{9D%aI!fES;EJGks~ zsK7wBB;Fn-lzzk>Ymj3bG)Qd}31qc%%X~jyZhVTDYrJ7(X}cWFL*OIGhuGU=pVn^x zX>S;^QB>P*t_Z)MayI^$smVd4X(Vcx$+h)rI>6Q&XNfu%D&Q>Zh}8lImNsf65Jdw@ zMZ5X+=tU@AD^?8*vAsPRaI){YRwu_?oNv~zlovk-E#DJIE4g6N08DA9k5>*W87c>^9k>EztvBhzAk1`rx_rp4Y zanEf|K0&<-ogOrTv5!}4-)T3dwe~#7C&VRvyVUD}TGkMl{8g>eveRO$3~|k!;EPp_ z>wj1)18438g^~PjvIji4xGuA;_KiPgE3j4(UP1cDj{LjZA0AyRu^-KyhO_KT9JiL` z)?qVbiYyTGh;N8o6P=hGKk_}cNFn=PbTKn-yjGf>b=o^r4HAyR^bYCH8@ReWE-*+c zQoN;A?zezR<)N|~-3d4xEqZia9?p#S6TfGv)_5xaw=U3+;bs7Oxb+l1BV2wVEUQO< zEHY!dzj2=3Zk6Gkgk*k;M{s67XV~dc_$2Qn{;|c0p7h%G(x|;mfMnL~Q`odR7@n@| z!v&uadx<1pL6}hVECr7F)Kem5V-|Tj&d7yN^%ZAUW=!= zfu!U7eTmk}bcCqW5ByTx9Y5WDKCtlk1F=6lc6WY(aKFX~x!6TI( zWl58CB8eNhY!l#(U7x)4Hc(6=6~e*mt3}&a;&3zc%rSe|O~~rDeu??gMsmMXFf2W} zsh+mSEYmS$(<1%1;2uY}l{|8aT}nf6;rLF?h(-@^90aZQFSo_`_JB0^0>Q$JhbS9j z=!sti^(C9lmT@i}2PtG4`Z`SX;qk!36Z~M!f>HaSTNe`_AsPP)+B~@k6&}X*x28=} z6$1jZ>lM3N*J+~$H=2bmcssyGFSfPE%&=d>L0G@cI&-q|$2izP4$iE%0IiR4UA_i0 zz%Qk9FLZY}@yUZESZn#P!3Qs5fQ=(<9UvqR8_yw7W}m(LFW7RzsWC(rip69b&*>y{0>(Nw6r5v| zMgL$Zjt5$Spy-zP$@0@T9p_y${jKs!P4=h2-u|bV-uQo$m-hnS?F`>(_Rxh{il;zD3;M{3ckS}iZo+0W1v%E76EhJ;ij}AGj zM833akzS)Vm=XUJ*cQkz50{f6V2mBCjYJba3{V)7a}u$dfS+VK5lZ@3}2%)3ny zBiTo8x^810=$d=Oo;aI(1zwa0jz6ls8P!Gt6A*N(6k*s_R@sFE);JMtJFx7bd*mEq z-)1pTi%>f^O@R2?E3Wm^_fB0aw618?_(mEs4^V$2S$iWu8MfhI>aH)K zoxUm;n1vX}ghRa`lJFuhSQkU*`^tJEphas}x_a>Ow>f4;7L>i;TK&6T_W?ksnuLU%j-xe?RM<_ zK`S-2s>_zJweuE^>o?TY$}d~wX3krfgx;yDm0q^=%mOV$VixkMYDHIl=FVG$QkNgA z6TkI&2x-=SJV+fE#l{yFRD2G!l(WHZ&AkQyumpONQD&Ky+bTcv2cNT z6Qb)7-y3ByOv#h7E&*!uGSrxifheK8dHIs++jNIek5fdmdW+xfiRiz=(AmR3+%OCp zpBY|GzYP??FJ>fKW25BHMZ?B^Ijw1^PE^)7bINn^>z54VHHa|pjer}ubxvD9Q$??c zp2-XX11^s3esA!nG;~mt zoo$5cRniGf8>j_f+HSEN!n^Mu`UtttI3I6sRU#KB9^3%fw$AGhI9z9;4b1%%lTI*; z`RNt88BeU+bAysuR6^2IVTGgs8e`f0+Hp?430{sI2LLz zALZ*naA4x_b|8v6doB5woic1CYsEmBORZ%DOoIa#@1DhYbrb9W0|{ea^gCy_|8q)D zRPAhHOr&oLJC^a1AB3fEiGLP5V~fTZ43fPh51}E_ZJrO@xUf6l8(s=h0Js$5EvZCD zstJf5L%qcIQ#j>Hh;vj_&poRxhK0(Bz{h=J35!>R+qz(6fIh@m`_?0XZBrD#k`Ba| z&t5IHcZr@je)xVRo;DD=h`lGzPiH)oFP`i*3fg}jCDSMN;*tslL_E-rf*JGRN!0a~ zFPHM0<$(2RosMXW+dl4+R`&zHf0<<%)5Ls9F~$7=X|bb6 zZq@Ng0Pm6)s)PIU1u&}<-M|^W961c`FZk%Ey1~N>MwBT6V8ftu1=4c=6+On(4BqeE z_$NZlFzTNOF*<0+zYycKzqp4yKCSRsYFm-{2h14K`J~uXHTpybNxV&T5(xGJsHAD= zJVQCnl3gPad`9R>CzGN({K3m&y_Tnr_G6Sin2qz0kUtUJg{jOKXx)gR<$6)NR`|2Z zr+(-lyB+ko4fHsm0WsifaDbk5El_p8$?&+hEnwr*EM0&_EK6OpyhG1)!i_F$tEJxVJ3MLX8^@7km#T%kp+IzA&Ff}EZhKsa4O-TFN z3OWVm%U$1IDQ=0=E%im%Y8jd-YEApO^@{w`hq&=~Q#rX6e-2P#6}Mya z6F0hLjDH7;ZpPJR;#)rHu=Fy1yL@<{MD=^6`a&#H;*C69I1w5Up|Dwzwxx^QeQ_h# zJoO6z^08Q+0%}8_&{_EjU>AWvfwo*a)*JY;?aXFZH)YXWC4XU7djN~w?o3~Jcmi2E|%hu!rAdniePRH$(BqIIN+QtDm6wa=zT9#<@ zg1Q|l1pa%Xm&DgEiW%p}j)nHXf_G-G@mgo4HEph}azy7VUK<1>b!mSGu#O9s2pVf-gujSfYiHci~>855VIk zw}9ZN+I0`8nDVKU`PQ_!Y6Wv%0Z6T^-gthv;qUP(77(xIp3$rz`V&PA_I;flXZhKX zwa$l2#R~&If4Hw>f`?Ij%N&s*XCt8KRTw~>@RouxrM0G^>M|)-Xpo@xGu-W#c8qhH z%Bk!WB)c|>;8GFWGxLm|%*D(%n6No{mt}2q#eB}zI2J=tyMTba#wmL7{~3MqPh{#p zMXWLX<=4(~Y&{~DN?x5gwG^qe|E3RtSPck@0#ANXO}M#?;U|mO|INMyfN9c}KXS0H z4SDXk0Y~e=3BwTxLhUQYug5Q_byoOM2dpm(XO5c3pINGDfe3$4VfmvI7I{-C9{U7I zQ4_a?XrQ%9mW$A)XC9S@`&5x)uUhU~WQsOjaAesG{oC<8moQzD(Kep49x?EkmZeu# znO5<1c$5)&FY7p3*yi`Fg3nO*_pbnvFf0&^$%RLH@4ep;h`26D_BV)I7elE*SJ6{y zHoQZ6;*$XwiivuJiUMsfynNFFMN*vScD|vRa%|IE&FDd7+KoPs7uKCTgyHIjNop-CVd7 zMXs10#llG;jZglZ1*r5bBeH(+hWy%&_6zd$+U~v})^Oy{PsH{iz{U#m_l|-y@o#Y5 z3R6-l8fSiBQx>9P1|L4?+dGVfMu-J1?=ge%`X`P1UoRfnqO&@3x3l6unz-{xzjH!nL#nz;X2<8=sASt|5`1&6M*2t(u`>wX{_}TOGbXz^#gBTqSvC2 z9%Kxe6L01$VSM9#Wao2VRI=nA>mCo&Pa3{BjTDm3BAiJt8MV);n{E;*yX_G_3r+a@ z)u2gm3E59MLssRXXjqb z?9l%uhIhCqHdf8&) zeBKhDFwat`ay5<%Y+&;&*wvA*g*L|hmDbJt%g1fj8{4UE-IiOPD}5lReF-0#8o)kZ zLRxaTgyfX203|wde`cTzKG*B3?7}X4Iiy!R$g}-9Ve!mmiozxnWYs1@{QXOJqN|%c zk>AtF0uAxnH!rhKK50&r*WANwqht;?ze;^*Ft#&c+gYRsy~%(}z_XcIR^FK<>GQ{6pXu$KO)I}RrM^tvxnCnOOw|4Ho$PP?atj)PinHp+aC`-OLZTzFPMP|q za8j=_dj1(Ko+o06|ND6o|Nn6R%GyzV2I)xIwM{2%1R&am(>8oEy|S#@KtXqu7sFIP z)@Sea4mrXMH>LxKA-K9E7l5||MAj0N?uLk+Oh4}LY%-0bQu+o%J4ezEuuiTSW*Vd$ z`Z+MZ>Zc=hV(I=F6zF-qj0EkxJt&i$Y5EJ57bwL?-EGMeHgX356_*dRhdCi@_eFtB zA?mz?{ymz7wcruCd%Vw^g8w9T$hrkTyr-WOg(Gx!oG+ZHu*c^sPb;@wM`XLbBki#j zCA-kF9uVh*_}JlQ%-#4da4+C-($i2tIk5#!mfwle*l{9HDj-S+bxr+2fithE(Zu=u zA6xf!0R|>0(`}u!&z~wP>nX`z(DT!t)vu?eqnYYx)HFM#rS1_9;m zO;F$k>+=Z8&^Xnchr04Q_l3_R(fianZHKqiA)OtAowOfw_LAds!V);*FE%3#W!xTt@{zO{iE zA8|ijB0&0)<}Ar~#0pxxb1u8GveVFSW)pr?n(6F8>N@VraUC*g=2O9W^}#Y8mI@dT(xZ zMK#nKhXE-<(tA+`@*2tl7N^DbGIRit)}Izu*M7d?rc{n>7JT>&9>7teBk!H>x%!GJ$kN1fK|fEPwBFtP45KQWI=LGwjf9);uwfV;)(+ z6d-f!Xm&XyF;9N)Vr9a9&U|jgM`$|8)WYqtd^0|Lr%Y3U{hr{AFAY0HP^9T+=vrv@ zH2$gJinr;aSQ_us`fum%dtHne=3Bui45>HsfS&~p#pH3&I$#+{=&}K{fC*0bC(lsKM^6!gYB==5T4=wA|V+7Jg$>3j-6g{LgM?fSv{KE>&!3e^iiS{D*Ozg+3p&^@&|(n}`Eb>VI2_`wWO%4~WsTGVrAfYb7eA+TQ!Tt0tw z+a}R*^ssC5Ij*J45(QT99G*j-4eR>q>T<2f zJfjb{mkyUS(yjXV{J|)X00E!)Eb>+*jeX+WV4+q4mK6X~R~m=)B`%KxIBU)+9BKlL zCCx*Hw9*bxSp1c)q1-*62&3}9b#sdSv5d;FDNu8)rQE{`)_Wlqw-2x&I7sg11{1r} zGr4JpqN~jmi7Wte(#F1n;t=QZ6M;3I77K1xSQ}NaYzHx)OE#V9Wok0)}ADNQCLHSchlMYLqwe2~;tBDG!;4Lq?DC2ZJ8eD_j zw5T8Y0y9@!?aS}HE5e~ znL&wf0Z27#yfL8zz}|P9WSY$VI^pS2!z9sGP%-OT24(&!q#%g;%yAjI^qtlk6Vhs4 z$4kz%65Z=j)8MhfYF&#Ef&js4^%syMpDgF|%qu-*kui?qK0ew|S`VIeCWHt^n?sHZ zxBbDTqUTWa+>eP0)s(1a`7~l91%WO5){rf5ypoJ*wR`6E3Dnep^X*9SYLnvQU344h zl{7i2{C3vlpvOyIo#a}t>t4IhFDdL48JFPRYLNf?ehy?uv;ME__rESIx(m?5tdWVM z8kacVZGom$&-A+Th204UtcQYt_n2J+?F2QJ`~Lv#IP{oKeeY|xC5V;Z_pRLk&O z5k5#&7Z~Q9wv`MY1n-UZ^GU04pPg6LMUHbhF?Q3B;Z# zM-`mzGR(+yyE=gm!~-;(1DR54J&D$eo{WibJ~^lQI!E#L&D()P=Mjmc{bk^wDOU!* zv2T`ubXz{>U@p8*&!ARz=ufYbm%|_jnb2wI9$Ynx&j-KO_!;o-SsCNN(erJCi=$^C zzptMgV(tAq;l;vhLx6u+hv)0q{yEZxG!EDuSbP>4YB1XZID#FQ3xAmLq(kR_#bNyG z-Ujd+lP!J?&dD1S!JeKwcZH95`>wY8T)Z4NP;_}5VUVRJ_9x?L=%V}7f4>S?f5!YN zdzi+_T9o2ICurr|;2C|~sCjyBg+{Yz=MEN!olWmRuvJ?2nh;|RZn9U3U?eGWjMdwP zjG-owPb=khhUq_Q67o9MgJpf4GTm0r(pNIR1vk<WeGA_~A4De)Dng|~r|)N=f@6*K+3sFv?q>rFrz?m+s;ITe@vYCF@*#-7L`U^mc4+=d z52!yqk5r}&1SuIroF~V%qV-?v=TI@Aq}>k>*vmMYo>qM2(lO^wf*FI-hD+;EuoVd6cCo(+5 zd>Kxyoh4Qr@02zpMo0x5a+ijNiUyqsJ`5@5uFC3K)K_g=Zo?%?c-0TIT<`eq9{mt2 z(`jD*VU(URkeXcO0bPv&F~*p&(>5cuY`bw--uFT05iA5czM@CqGeveih6F_^WFmnfosx!wihwoQUGBtG7JsmRNT{r&ev>B1sKI}SGAfge`0rTViV>%%9Ya098GUR%nh7Z zT0Hk+LCI>yqnp=<4Up6`eRd@@$Ln5}%4RDY@*pi{1UU-X&AtUp0b5{tzYlBEYkM&$X^D;TtyRtAQ0 z&!uLwKW|@F{UEKf>czR#cp=!pLr+A>dFou6q_IsQl; zlpw%kqU>=`rhNqaEJgomKwzvkcBKuSWK!%K zISm~q57*mqAKrhUkj5v9b;y%=YfcuRO?1TZJcc^;RIYt$H#vFQk85Riu1hwFVRQBw zmE-_NW9YAqZ`X#56Z(|F$2O~_7+80-nfW+Om!96geJ9Q9(;&|cF4LweJwC9lJl1`O zseB5NSL>EvKN~j`sO{4lWe`)_zii5R!q$fR^Wd{a;Toyr0R6U%SAmg&%PpWF@nJl7DzA^F9h2s#8 z8rQ-71Y+pkCC5>&^Ak%p)#YF|redhtaTKC9#n3I|G4Z{YA(oU%9Pyi!Biu2O!|Rp| zC};p4sd4IC_|82sFC1w*?fOXaX;QaeEYRZ{F-2=~FQJPTC$Hb#N0R;WCMZAU2${J3 ztaM-Eo;PZUlFalf@s%z8q?)jLsO-on(}P17PQ6q#cWs^Daqblpm!Ez&kvr;R31~Nt zA7vKbj809%GjFPFF&#gd>!kNlzjUNn&@-d_kau;T4M3y&w2Udbly~B*whhK=y~&q8 zb&B<${*U)HV`k(**tgIXl&%J;8sNV;mtQ>-$_>_k3Oq_Q9t=Yb^Mfts$ zoQX+L{h|)OreO_jMHqr_Sxac#0^&P((w|PD#+4u`Gr4j*^lk)?grneApM7^k?}X8b zy(gqwzoofWnA&ztlyj{TLMAXeY)2-Lm6b#$Hd*?0e7wE>hyL;A@r+;DX?0_h0rFPF z>T>$Z>hi+z>TFc^jV>40EqfnkZhT*Qr=-+J=A{W^{S05c_9A*Uj<$F{n`oP4u<3lv zzr{aZQcx$$dv-i=FxDWPev&kCj5uD^SzMd?X)g9E%XF%_=`$xWN$orQkmdU#Ap%cb zLKhwr=qSKGDOxe(Q0_Gxe;dY10T*A#noU)Ej&kyxF2y%WA(JweHp}CZ!RpcO1IA zzI(VfWpX@wH2#adH+lR(%r{j^qlo*Bx>?apj;16bC*6-vaAWRi#?RQ93?IbP>N+fJJIP9Q2>Lu*Sl}Q%vH1SzOXmcf7iK4xhF2%Byme_`y)Sr0M0E zA|j{Q*t*(n4~Gcyp%k2F;q13Cnpr z<-{0I*2G$|XAOdL=nAKkLTQ*Dp? z^~ntsopo~cB-0-j+miX^)0JO+%7>{pa7n-~Td|gIy+i1HXn)a^5{`rrtFbrYx{hH8riU+aF4+hf=sqRQI@RF^+*|da2 z`zO!xHqjlfsxWTq?-QlUl8PQIVC4WGqF+|Yp{pyhme~!pZ@K;Mq-ZQQfpQZwIdii$ zK+#0p^hW@0%6r>etxDnjXz^b|UD8^xQK_Z++^*O2lkX@(EpOipFrMzkD{Ky~_I$$O zR%Q^lni*P zkE%)ESI^_))#5y&|NIi;`^PS+UbCj~6}gq%+e?vJGGDDQOoLo&KRYD*+C0{<6~F)8 zjr#hA8*-V((z-kX+p!e=ahMcY3r6`UIx6WfOVFM}0qP4b&v)thuk#X89)g}aDOjaE zy>Ek|u>F`m0oRbt)G4M79FO!dbh2faoUY#PC44(Cj7RstYs!eVZ1<>-jP4^@onT@1 zTkN&?1xiuje$VdsriGv$B69Yin|cBaUVb`LVpHPN1W=`lM-@xp8Ix+cAOTk#tM}3-#&r%MnI$$S96uGv-ui;pfKbTQ&%CmWAV80T0(}|Vf zAxW5MzYNYuT_cn^NS)Q@xi(IOMwHLM6zlf#>2%t4_4eETz!x7Gu<_d&Lp$*0_y%?e z@kJx#+p}5u)Y*~K1%c0*QQ%D0}xiC@vT(*aa7-Az&KAjvV9lZv9l zY%<4kJDWX)d#M>~K|@(m+SrI?-}K9OQ<3Xb3|*Ae79=VCLEE%kuNfZaloL^|Ep24F z$_}8ay+mQNTuN}7FbXzRd2&>Cf_VemW0Cx2suq*n3{M)Z5@Tz@3vtr-9|GSpsXhsL z-xO#obNgmZj}AfPquq^dr27JjlpIFWk~o_(e@6h#RxGz$)AKGv{Ef5r!Gb`<2e2rG zY@(G(CTTQ543z)#M`jZ#g$IFMh8sXo-IC?akU96Gb3p~iB{cf0!4n3`#S^njSNi5yY=`zvUFT2{Qq+duie8gV#=BLJ$@1z%N8-0faIcp-4Q=d_VZ~4%HY>V%e+aXKcjvUVU1|?)z_tIf^nrj zP?-=}Jtb|Q$Y$9XEfrg4Tiaz6@+&X%{Ahjr)~slUwih$L(p;DE2A*gx`~Z#Son6zw zA+&Yq+jT|`YvB#VJ~izFJbXeri-4*^R0|s=j{T7Q_DE=yxcg`|@O7&E7Zhw%6703; zW3fo;DR1i+X3JER7TXj0QnSx>8e?p1ZYbT=0_RD2 z#n`L8U&a=^tK~uw-)71A3PhmkqQGrR5BPgAkVRCwXl_re*s?(vl;Ka_);T6*emtEnTYC!`l2<9sY+h}ziR zku$jGX0juhXY=}<+V{sU@xtGTW}b_>5tmSXm~f>YSNP>tonIi*FgBv+sq)0eJpb3H zsyiuF<+JJy+$9*nd7L)(TvUy{A24}m_4ezPPZwpxJcVq>-H5W47iOth=0a|oLKCP& z54-2lcTO#|Swwy8f*GxjQxDL3yOr&;W|TmrqTR%q5#HWuYg;T;|kY z9wrZ-Fe@@gZ1ko@2_hsq$_G1eHMlv9UuLtVyia0-s1aOq5_!3UZXNqlpploh!Sq&X zT2((-1X~^BhP~)Kq<^W;-hp0sK>u=g(oasgb-=BPKd_ zA3c_GIONn}sU}f4r(-Nem^+RUlhjZlm;Fjy{l$cZ1mC7n&^S7Riqh_udeB8pWs~ z7o+z1`QX~(vmNqJsDT~4&lYrPjYqT`2A494HLHUu>QZR&Gwlx>C-0md?jFsdN`@IR zy;U~lMtdH;A}77N?|dYC&^G*%6Raduu=#>gPJZEjEtEblmn7QT(>g)u!O`%}*wpr_ zj$@bc%y6Zh9K}SAoUAN))N&EN^yyNy+)gIH_XHpO{RWm>T9qtum`7E@;=$o3mUn*h z^^^ImZub2yRqwuq3rx9fa?6FWkn}7Olze~$vbmeRi+mWP5PHnzb~}{uzkp8n|1Xt5 z-R({9{fFwGf2tM&^*?$3hqWc|UsnEnV)xY60!ZmGrQ-q0F)|u|247#Z;aKRGq z2Jq_V&-y*qzf@oHVmbc%8k0iYg8!2mlLA0(yg$`X@89DV_`lbf6u9j34>cx%8~@W9 zlNVJy|7ivPUZL~9t})4b|GvQajek{*Z_>4~ga3y2-ynM0UStui4`&&r2$affylTWG5B2Lwz%Wb)bt}GgO^J`lb`Ez zrl^pQQd;vbH>cgxC6XcM^=RIVcNzj2HC1+>McZD}PQF`cpBQG*Q*fDbz8g=eFBIFq zAhEn?CnoH@X}fVW80UO4i`S@Hv44FsREt-}m)HEv?QrfUs|*UkgKLV3{zH%mos_ov z&L7I~x8%*WT{X5FKI^~Grskd}Qr1mj`xlm%;(gCb>LxS|U$%!iFwiRIXgj%X*or?P>&{}y*bY4v z-zVHGqjA|GDGXVCu`2p#jRD8{T*&C83`uj}V@faP z=9r8@4Ls|O;uZav_>&$smg$V?8z6G-hP1jDWA?0kDLPJha4)lko4-s4rhaU)3l6Nk zdc~uV9N?CQMd~g>Ay{weTx2>lVDxn9#1Q4>+cFiw#*I^xo@u>;cqXZ%p7`9>wThJo zn7%(*6p+p7XHBWh55RC0*qhlp5G4(QtN0d|RMu+r!%j>Tm#N?raI9O*nAo&9b@v{# z`^FpTA~f@jZ~L^8E=Ux5-eKh#o^ti9HO4gek8k;Y{2~;#5jG)oa3@ZS$ol9o+ZiA4 zzf_!*>%q^PtIC2-F)3*IV%VF?Q_z+?{5BVZU2-|gI<%$-7{4!pZBbM#d6RUwYv}Y*FiM5*TsLnW!Lm$ zz+tE$NH?Y}6k3SY#=P-Ux#ElA+xxNQ@&sM4g^VBLyM^$yZ1Ml9a4)oD>PJK>cAKZZ z&o4>fQ6leqW%kkj?H2dFH~h>&1jHh^qG62=euFVY7_kl=cMz;}9A0@20d>QXB+9&9 zM3c-TWsRjD?HmsohP$=%h`f836o)aK@>7{JYWs*E2C#^}GZ9G2KEv%2?WmKtint|f zqoHGBbCcX{Do@KqkiuN1n^LF(M3(4u^5mTb+emYUNL4Ra!MRI4z%v<}1mWy%H z@<4SCrb;t^?;$cLD70Tn5vnp{}A$e z4le;UW7W_=mgK!Ab7$Ue2MWqNv6^}rIaGX7Qa-3w)3&bcc)&tKLdQBeSn!-8G1|1vbwz&R zs}d*#ExkEx!ZC77pW)~vmnOO2NO>b0jjGgGG!@&}mICSMVoRa+4BHHU5vU~KU+<=Y zH3H+o;qCsa{koWN^v)ML?Vo;!tw1XlKk!YQ<7?>Bg_RH8y*|jWojSR zeV6X&(&xYzA|U(zD7e;Vir&|Ix~elczMDu2I~Dt7lL;RNqbJ5~*5+#F9Cp1&38A~A z(r?u0enKN1t#YX$2OpKAReJzJ~ zvT}PyDo*2<$GiM8Kwzqxq){=xHz{`n|$Ux@i3Z650ShHRR#&aiTMmH>*rh*yKa&ky%)NHRkcqXSdp zH4b$h%EgtEzvWf9o4AZP-@#l?iY{rlCc=LrTtAx9dUwnp%I8{<*301ruF>3%b&;=p zvt^^il9&ow{{91hV)D^5OQ(+uT1VZi7?NJoipHAv7PxeWlZdit1?`vyf(uegpeo86 zWPR1C>+Ydi&js~CzD5pQ#sQCHQXU1Ty1pz#?JL)FF$@p%+&?@f+1;$>GYRQ@1?8T^ z9W&}ku)6K>hA1dkxa6a!*)67u_UFtxcH*lCuJqNf3#Zxp-Ok{^AL4GZJ-=^IBGZdu z7fkN*K84hMBZ)Msv~Z55A6kqN=U1G=wN1|Ub`y1%mF?Xi&!ccOK2x<8GVEsPkS=5EfVP-qT>oyR%X-qMH&B_Hf&@26>q8kn^|T`O-lQ!%Yw!wN!LmPA zPHJ2MoxGDcHjzIo3DcWr%?_G;9 z$8EVUGaloQbKiSXjdi`JGp2jn`Us^Xb@3L1+2DigmO9a44(filSvL_62{+1%A3nQv%_xz!zA>nFCIzOgdkRR|%>j>lS>tb)WKG!=#uL+AKmb0x@ z>}x*KpAbnD_SBJatj4E6Z#ZJ84l3Tqeeo+axNdxsINRD#lu*#EXgg?=|KT?}hjk2d zCj#vBQI`GCFU@Y;)jNHQrP_Rfd6CDip-eVlKG~7zGC5-g7F`-_gT+3Vri@C7FetFXIlg^@-!Loa8SJ%;-HLW>)9xd`|>5 zx|Qpj{9#Aece-EX>u^dd#bVDPxf5$J-3_qk@L%kFHDr2Bt9tiKc!_xCxZ`?nD_Y4E zWiiGw@cG1tR@4TJT2Xa`>eRHBI%!6g8+w)3H`U6%2>BG)e@EZKFsm4k!0<2ZlCt>b zC}J5JG~N*L#MM)EmJ9zy)A%>k9a}qpjoK#J$$K=lP1hc@{aW#RP-89P~!ZcdD6+6q2X5h7YmYCH2m&@j}YG5E*sapRc#kc-1{&Um4?q zqV>$DnEg^M7vYp6?WC?srK;JN_GUh#&?K!^F30k+Ez08iVmW+m_pXNeqvL@Od7K-W zxDp>i`uk$h5Dy#mLIg^lH8!7Eg}+`2d4@dPmF42JMZwGL%`NnF1wAjG7JVMZTMzOf zm&a@?-V6I^J>$#&fiNj%V5R3d&-U=x2u}kjgu>_c1NKRIJOgkFkGMB7a$Qx2LiO!B~9`)Q_ zsW+b-IiD9ZRpc?yk-$k=R1R)p7<>0x`j)<)z14vc%&8E3gQVpBm<{U98jj^Q)lWpD zDSX66!+M2|IuDt$PzZx~u&V0sKE6H@!h=)w_U>!P6Py;pJ6{f~A2K~&JCdBHe7EkM zNJk*(E>D#*=r={?E!Kv&eDlH76q|L@!#9%o{lgZSiMvEk1BgdBl80il*R2Dqw`?O^ z^v@nL9b%1sXRQ@3ZHVQF)q;FhVE?N32IrUm*RqBOuYD%8U-PY$ehGGc$Wjdaww)NH zVa9t#d0=o4Ce+%O={SY9@?tzU6Mm1?k2%z(*GkfQuG%|;6Hu3Hj|h%V9cvd(sPHK-h#uGoFxxgMTFG7GRUmnwtrFU*V*``@D^Qs zw@v+}rNY}fb{jd~$J)v&x>bzhr{uLdiqd^^)^=R6uL^io%GgcwJ<9pPQDITpx{Vxw ziu5a^2M>=sdF$#W-HxpOiRo8sF(6LOFH&BLBF&;D^Fc&cEqv7|PVGfP_(F#AmzN%N zgw|lbR9^#&9tEF#4;pjCS)~=PKqS(w$Y)tjCU0yXBaLFFsq`Vxf(&G2052 zZ}ODvW#Id1x%I`U)#$qY0U6`l_Q#G+dp|lPdDU|jBmohjf9r~xd_?joiOwT!%_1D}f750>pe z+~}N$nHv$_w?+$Uu7NyQrAv40NZQIh$ zag!}{pH97rh3%+HeiDHOiaeo_>zWvCZzrHKrHSm`bqgBJa`R)jb)#z@!d;X#EnC(4 zRSo2NuT1Ue7J93J=5A`#l10LhM)*wCfWT4G#EGr;Ybs5>N1u4BUtt-S_1i@#(jSFK z=OjjGOcT(091UZ()>W&#>!f{%2xJ+4OHocB+dIZI(`P;17bcVMVSu@tx;)4zx%qIe znN)l@nu7QFDM4?5FUfyJgPjvM|AAQf>w`G|M1wh67+K$WWcPn)`wFlqx3=9u8fi%x z=}u`zK)SnAP>@cCZUiKxTN*^^lx`7}?vU~ zKk_CoV6Aq@fgVDC^!(xaE9u1oe4CsFmFC)}N)dS1tlTO`DpcY?M5H z3LE_qiIbiGDdt^ZYy(~9`CbJ@WYBhD^1-*5WVG4OY8(nDk$V#a5k41t7hBDg{)Sz% zEhVK-eVgY?OT8PLDaoEHbmiH9Wt^{_mT$ z(5?zf@~gz989n7K4}v58d=~R972|0|)htj)Iy>-IV|EC?Yu(-iTGyk2Aw=|Po+!_$ zI%lt%jRI*7=4n%PDx2}sQ?85?@LwLmueIfFcAS17^%9yEh_NguzPWOXGASmPPZ-uj zn{s9QJ~|36dG8zWaC^9_VckI;GjK}X@iAA?r#IwW7{zY1x1@aiBcC1yKdJoKZY-+Y z@1QHK)5Z?@obF#?vzLDVRKLONHnr|ir#j1*&GDa48`8u?=n}(ta;y#62#Ub>=^ejS zNIxD|HVs*93>S|nU9d7xkwboOWUF%!imU!o)!;`~_2|3QlS7aoW#O!~5dV8hPl~cS zgq8x!CZdf`K6u%pD+hrRx_SPzxnB1)?vFx=7Uq>TD>@`(l6;p`3Ot8I-F`r&9}W*n znz37CUQ|-omv5-&t~`52!ryQ6aQ1++@#&%3oB_3DP5nS8QO9UM(f;S%7PnKN;bUC= z>lK1AXHI*fp6f0oX>2MJCt*rNw& zsbQr%DV)VAM7i+EKda1ia!4}Kw<_STB;(Ee)^Of3hlPFx3eU{PWA-M-vr162f$Ff` z%X5YIwZs@v-$_EXKDhs!bJ+`#hf_D8Z`K`AiICz{`}OKV`1+$s)>kUNylU#yeDXo> zt<~X{R#M0n=`B}CC|DP-p9IShPs`8MwTsHT+Oq~+4cm?v7J~5jGM-e*zPiT?Clg3o zQ+=6BfF1F1G;m1y)6Cm=u~G6pEbNwN{CxwgzNo_0Jl3;v_gr>Ef;1}6eQ6>6*K=^G z9W6cxNbkq^Yiw16Cbe)P?-#gDC&*=%K8&0# z#wY_?ZIZD+o~`(i#c({W3;cBIXad{hOV?TRyCONEtq)l6GKT2S!c9G zTApT>^gN%q)JxyQvlk?nZm`LCbn(lnh7;5C_}@m;xaah64tckD%I)61=U-K56)bLv zr$bR?qbJtk1e<;m_=%5QK;-eZg!G3N-ggFV^HlF^Cu~}bj{L${y~MFlGYlJFP$!^k9}o*VJ{SWm{2-uZmFTz0Hu&;ADHZ4 z_Kdh6Wa>tTH} zeN1O44{}Nprmux-$)3OWqDD~wp5qidDxj*E+jBFc-`M{knQ}L$6r$@bSjC?Fa6EO&7bXBd9(n`kO z2B%?=lv=%TmBUH-gmz%l@kpjdMQy&rbzs8QAH4~qv|F2;hazlG$=Op)=?6I<&69OM zK8G>>Sh7#w_Rzo2*?W~}I9FhQGi#e-md_z^Lwnciin=pF`vF0YHsd*nQFEwiX1CDV z8(jLdjY2h1y&CQd{R;+h;x%d zR)>Dj;KoF4s_)em35|tz#mHxze1b6dN|vup4HAel6lIVdC_4*IV2FQDb}(=?@f~wQ z7mwYBj?*2nYxFM<59Yk~hP!y@=JK%7uy02<*RbNrvJ)zM1#|es%6Gj@OB#CeAFmB0WpHVk6 zgzU?XzD<7LehVLYZTMfMae&{X3qBhi#pISiw-aBA z=hV}${n`6_%l(Z%cllfQkWwUY4bg<$-jr!mr+6_K2#^|o*qt5I2n~H%Y_uDyXO_pw&Pr}jP-tY!Gw-drjMUku0y74;%PYGz^K44qb!Si~hoAON9u5aw77zB0D)~LU=hB+IE>>1(w!e8t%}x&}Wt7>L`DoMCZRRR=r$^3CTUi|?^5$GZ zZ;!eL4=r{A4K})N;^bXi3};rOYp+^>M{loOFU}6JlYDElx(uyo8#p0U3)UHqtJ&2mU_EXIk^~Ggdc#{}u3-qEzg#nQ(_7}ba9wmWNW_Gxyw4SsH$%ol$Wam@vB zuN6IrUmsi0m*t9H-Vt__3r`r1exoFl%D0#s-k{Ug^}NlR)Y!5X$sxe?-OpyfR(mAZ zMamM=Xi((O9JTmwhly|>ot6pwNm8CAZj$#u76>5iPgF-3u+5}W{ZzNcfHsi9P#L;7 z02=lbI#Wg8tGR6vH>Z8U^n$_!MgEch!`UMj)xEZtGDK52QUXqPVsP48_?Jodbrjuy}-eH02W z(1B&9i5IUS9-dcS7z?Cm zBzmjCZL?#@yf;di^bt#2w3t42h>g%3yBp-&Z@U9+&smUMKkvdTYDg-(hH2byE0q)c zY5ukX-)uQnFVH2!-E!Q9qKyFa6Jv2+FIg+o80Vaf@ivv(vI^UZKi0}xZ1U-Y&?l~@ zyp6s`>|eZvj)}G1`vQwGAR*^rOEH5=xgBbq1S3nBDb&OsYn+R2lw3mR?r@xei43FY zKBX?Cs&x)j^3p3rU!Om>d-$X79woI1(VK7Uspw(seWfE0rn{78et5sU|CXSLzcpNd zgPv*Pg9oO@^2;`;)|&UtNdFa)?shIql#CI&9uWzrm7x5)Nz6C*=@`Gd_ z%I`6!?=oM%-EkR&IqWC+?Am*Mxb2!_TBSh|Wjr*5bk&sL+kP@46N&EEM@MZ(8 z-*j8jS$~N1o=r;d(Kkmdz7x~ezMJJE3+>(gL-EiQQw?J(yTnwfiM;jfMfzWOkP zxE!Ht>zExqu0bB^C7#ORuG=d)tE8hHk{fppd`izRZA^%zju1xVo0j{U?W%`1^H6=x7r5>Jpq&`rsa_>5qfoaGfRc~?Ag>?Jk%#kX~ zvZwr>x1&pTq}-{1q^skQZA_;tKFbi2PkKWk;og?h5-}siDue)a#NQ)KXmZW1z}oL6 zBgc#_p=!=Ykqo$iYAMt5P3`MlltY5?aF{dEq$TI?2}3*>89)0mD%>vE~-A`MEv4= z-B+_&hp+A?0{uhdFBq{LYSbzY+ES^oUq5;$PLt;-R6w)gQtA`9xie#JTtlF!zwNzB z7A}x9C$Hhi5w7C(w4I5u&v#d>1ZD(U0t}xLLUVO#ibf)7 zi!F1l4QYtIi7-nRomz4P+mj;q7|90j(}Twl*orU&6Wc&zoP;A>Ujs#(;?w=cQ1H6K zai}r$GT8KgK4W?SFKQdjU&8G2exqw&z4A+1ef4X?dsXrRb%pb0_<3J?vGbC1xmL-m z7OhCY`u)_Pw>+4g!?X;a(K{QSv3(g+keq6o#*)XW!oZ@L==;80LD+-aJ28^v@KsG~ zWxFT~iG+xGye^~Cyp$|u>;3W7IKjqt*bHVU@yN7i(;JNV5dSd=?^}_62K1S?C zVoU9~KqVlVE;X9^GJ#G$O%S1U_~Q0O`oPG0dfmraZ{FJr#u7kX(DmA#*JOQ457 zq{g))~cYGoPk=?gSHH-5p@M4zGpM(xya360l7~;lkUwR zBbyJRl0z0+TTi#)Q6-ag`m2_Q_fUUy$HrOZ97v}7zrmR&svBCh5%@9L31>iDj5j!e zXdQxm{rHL8mi2&w$nEE7TJUZj8QC+sGDf|y2jDO8>V41EOv)n=H0`GaG}Q5=3wd3Fla}u?<$favNucCP&X+xH_*+ z`@gym5pjx6)p3$>Zdb;BCeB|-5i)MIN3dH|H_f|MB_+~jv(zqEGB2S5wNTU+d3C*o z`9#|9*iTLw7f~z5Pwx@RadmS1SMzgKJBpA`<&O7?%0A(46d&N$+Dpi0)^y80?;6qn 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Õ=$~(qqdDVhhj1^>{%HJ=-8iOL;a4|f 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

        )-(NdC7lbYrBEGYQr$h&Z91XUr&c{ZG)zva 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�u-D_o>P_?p04;Z*Zo;7ew8gTPy;mXOj8G>6|j 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 z

        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𝔍>6W);?Fxsqt;q;UK>T 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

        domGPDonydwN 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

        GF)H18<$#|l;aSUrs-pC6DE!_ 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

        E(l$Ny+M_sZ*5j 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[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≫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

        %>N8TkSsQ=t> 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%0AXc!Hr5i}D1b0;SI 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�_O%(IIs33l^*#+x&jR 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 h_Ig#@BoE+a!va)1lkNtfH_KE8= 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

        E57h2gu zY}xCW4ocpIMd9Zp)(EMX-Tn0fM8!gqO@%q5H{M?s_@R5&3J{o44O*!hQ2A#ob4HI5)CMn2OmNVh-SkTC>!ZsKn zxCFr_3T8DoxK`b1E}q@e9IRf^2qmD71nEXkSjW)>YJ>I}^$}77zti9eWxwN@S?9-D z+DL$IaKmpw!3p#cH((Rr`KH4|AzqU&2lEyb*83GWaJFynrn__51r%no43sR}RHbw# z+x_&aoL9?gU|{9e8a0l)lg(~=X+@<~Dq;Q)Bz{+sOl8u@p!l=clP^H*Q&{5(tPG;g z#T3v%TSIan8Yx0>dcV#``1>IKQhg@RqRr?mcm`Nf*|NYGvW(>+c!#qS3qJ+osG^MG ze`PNg`2t<S(qa;TU+wetJ6+g9S!F=RxjV#V)j=yS?R@D zrKYB+JA-Jn#;J$)KXa$*0d>+>zN*5dw4PtgF(!`}W&!B4y3_1L8i&c>qiG z3xq-qs(Q7N_hY}tzW>iEZjDIc2Py~W`Wl1H5eNxpTHE)r^}I50!>jNQoc%r_Citxr!juUy{p@hQ}2KnTUWHmYc9Rg;@q3WL*iqyVgp)g>}K1 zJ>u~E*47)+wxT5u&+mU}jp>H#d<}(WzRId8T-noE>8x1w@GN^(Lq`FAA-~+MsIM~k z15vA`ta?UK^O{CSS401ER1STKE&hS(vqzoxpJD<$};wl!rwYCFi6E*-_qiM)V@jC{aur%K(Pbv4|pP z^%Hj*;ml4WCL?8yB@HOsX8x`lREpj8rS4e`Vd&lcpaQ58CG_Qbg2YKS5t`B3;%mIV z!3lsW5+Tlx{IKHQHnXdu)eH6}pnn%pBfeN|(8#ahGr2*u8Xg0#8QT|t$BHWKDhcGN z@bV@0N028M<~gi#SQ1XdBa*;V==4fH=o4+XM{x%ky5*yOHo{pU03EFxkM-~4TFFB zt8{KZ{4PiCtcZ;;w;nz^O>T#jMljzIuRmjxv+^Nz{aSrShhF)75sQhC&oDK}BvbD~ zTY-r2OTCIFQa*ufd~R@7_nKO3jeEH;-)4ywrGoUwa)a4t18-4LiTLE7WSSxhJZ;H$ z*tIp?_ssEexqr@gD$7>RCWuhNuH?h`%wgA+xJP~j=km+V-T)7BAaf++Ie&yli0@!z zWTC`zHUkVY)|;c%{&HM$yTQc$+xY7yDg(`hUiBe1;~#)_~ya@`ux z`>RM*pVuoLfG>uS6}_ ze_CoNZ6P|EO3c!9-HsK1S}eWht4xLfcWha@oJIRbws8D6EvfIK@*tY~FMmyb%32Mh z-m)W7i3H#{)Kyi#2FF>)iStl__4uqliA0G0Aj6cC?ns8m?nq?W&J0||JTM^pU>3{R zgIPY^Y`c5Qjfa-Jeq_h}k^Ai&{+e~iDkYZK{ z^4{v8S{bg!Wlz5O+^Tu8`qbx-ZTnksBK_W9ZleE5|6q<*q$S2Is1`}u(KP#>!5cq) zaNAR+yv@Wd-=79jphnLIfV7esNUIBLJ}MFlIS@_`gp(3lor5lyVNh?9NEC=%fso6^ zbc1;&9EXv?`GeV_VTe%=2H!0C6YfUv?Bi6fJWXZNH7S|7-BH|-rVpJ>m&$LwRpN+6 z&KgRZM!w1F46B1axTMKUD;ww1CAC$0`u@6g0%f>{W@XD=?4ys&&LB5H@0SKaOK_WEntig`R`u!f$N`FTZ%_ny11X%y^Z>Sp8ehwW{_Wio{RN!=($iYM1G|h z6F`@shUtO|?R$paii6L>d!nCy_slu^)o1Vz>HkN+v+v^LARiRdf600( z@*;C<>qhl==*RnQHlyh{BuR*TRlnKHLdOF0`N3to@jRi#}_@nHi)m^{@~6XET|Lp(8HE8bVK{& zLHm=aWrI?acu-<87+_YR8Rwy*W4>wplS(GHInDG+Sb-nth(gMQYErhHV~iaLbJOeez#rzhFnb=n5p$N#Sa+X$At1v6$P&iARv`66*2XBN66g$73wHSoRKm(Xv+xN`;^s6oB_N{t`IQOqPvpyO8eWt2@`n1*vP+Wfc{9QWc{D+iW zV!gpkhu0mHLQ3R)m^B{}q>D*a?ja*mgTQ4Kf=@U@f-(p4Gz($NMh!CGU#UcbQI!DW zutWL6Z8`3mA*|#q!9rV=8xHFY2B#C|Ve)>lM1mbB9he+*k!Ff-KoxeFFMkHpWy?|CAlJek z;E-)ZN<;if7e9nXidtmxF=P~5!LVB*FCRhv!o*C4Lb}{pd;=d zS(C1?iqcF_hTq?SM+$D*vB)d`O<{rBT-ZLN37!GV=@j`QL^eBly@4vNQU0S46p}() z*poCUNt?%D@YqNtt7#g*PKH8$&QPrW&r)-lR1z~ojV3Ho5R=BF+QesmB!SeBMGLe{ zYBX>3_F&#TSt5bvo@FuUcg7xN$vn#v{hG(rJSGo3TmR$0vlaY@foJl?cZu?IANSO| zT#ji~An)KS8~^#t&(CgYYIH1jp zr6bnX=*;HsIq7mdmwA!jK}(Ec(+--T4#+VdbZGK^W$1JmnOlV9Q)<_s(_+F1`=G-D z!w3ruBP_ZxpEl`AU^v^UJ9W@`T&;4_A?S>OkC#3(edPlcQePeIF3(ph;5 zY`FQ`zu#EyRq=eCK-H!QP;@@4@5?WLd{knrXaN6iqw*z9qD#XJL1rm4JP`3$;lH1I4B1s?>K_~6vq{itzR$0KubiD;w96{GE7(94_J4tZ2;2r`5ceh|eaCdiicMI+e?(Q%I z_Zd9+;0{Z^@4vfu_u2bAXWr?0=hUfF)!oxG)m`TpXylJG(4i3jO)1mu9MJw+c;avE zo^E89UbX|v>adf79=`h2@jZd$RW3E3$W5Zn)LpDp7i_b{}13^Aq* zEiNw8PE(Q9?vL~Ns1oh>B%*e;&g5i?*j`j|tBRaQ{=$AZa$&2n8LBMq8O3aVc3w=h zL|Jq_U23)0sjL`JO!Z$F$=<19@_ zSr&oJ;_bmZXQS}IG?Mh+{{`(sg5P@>(H#0JJX|{Q!wTtD+OP$O!bK!Grd`CSUzXoRhz~gT)?W4ZCrl7$ ze6HFJY<xN$H3gz&V`kuEHrpCd7zbS8oQ}tuU^@+1GOvWF)z#Q5M!F4KvVls zaaI(9N`2cnY6-@)finsjUbmtUX0q%XX=A9sZrm=yA@w@&HK4PIEG`_l$h4>T^)|w*t6HCXb}(R*6SBGR}J~j z*BD}(GWV^R0Bf=$pN$jXg{15#SvDt_({&gdn|Z_4Z1eb!iY>|FS@E*###gZ3&ls8A zS9bKJ)IkC$_AWZ8;`(VALrwVQsK;o`GH*54T#b;W)YvHP0e3!+p_^}Cz1ZODWOntH z60-2rnjX%AeCui}4f$HRXv(s38JNAAtJZWloML_OQr))d6ni=3UpR4T(`kC<7{T8P ze&(^xrsr&r(emlV`7uHGjP346jQ)(>P>_z~b{OFErGI+^l@F}_fyo70(s4q*BB?S59 zD_?i^$EU{sOaGM()&@hZao;I+;nxE%z~ph}%Y0`*s{Dx$=nLw0qTz2mn&o<8C?I*#y6e^VS|k z+1=;-5d*3M%`8JFv(}t*UdO+z1J%rW-M)?s3S7{V1qbSr5R?$PIPsXJdVCEwNQj}n zj8wODQ@dwU`C~wZ>_aDx*)ifPLSEC{2Y%|*8N_z4a9IZ6s1pvMPiCm|6g_6|L}ej= z3*9aDw{6Vax=JiY?HDOrprP&!bd27m=%iT?o52px}Z_k+g+L(Hh6 zMwCH0Rr0y|pLS8i%jiFzVT$?o%J!wEv=B5gv9*Glf=t%Ao@WvDph#alTwBf$7n6%e zT$7hOJBuMIxCv)L4x4hDa)Yu7oRl=lxAd=a^9t8~j5M#V(i7^95_)B)b4lj%=DvlQ zC99Gb;V)u=lhA^5yb;4$wAt-CM|XMM(OdmXrMALRkFmu0Dl1>a5Qyci~y$Gvd|ijPUg95lo`g z6C4Mk5EsdZxl&Y zE#kqiJ^$;O#G}~_&scfTrTF7i7}NBLE(1`hroS|D8u|BPSk1Q@Tujl$M4L~YF^AmY zRnv06xmBL==xwPw z{?oSjwB=xX-jNh{oXx;fS=umWC$gu)V0G(;Y?aP{ftYPkhV>T8-;(YCQE1PrIN`J2vk?Uy4J@1wFImcg* z8T8+a`3e-8=j>qf!rI`I(3dPrQ?4t%sArTm45hl5Dts1E+aP@fuLbPf>xMD0hKDzi zptt>fL4DX7?qO4qBd0q1ol{N~n0{0LPb``gC-KUczj5mH?!-) zHLVfEHrnE^0Q#83dm_zZwuQXShEtKpN)!Fp+UElQ9gb2T4i;21O+F|7E0>i&Zz9in zPtb!8(Zbgkc7X+rqmr>h=(9d2m;P_k3cSE=7$ekHk6pJGany;C1E$r_b9 z?h!3C2kyZmve>DQkN(;)vir%*Gz|FZ>}N;53Nxy#F$rBNt}OPg%9}N0dzKMXHO*WC zKomc7>b&7K5f|^NcWb5TXvo=aeGGau_o!*7gLP@Qe{=*nLuxc5-HT1D71rKB`>q4y z_~|84+I#wJE3-1jWi5Icmz1%D?4o-5%2*S#vPz7K)MLhEDt;N$(J5uEdZ22`{}dBR z&^s8H@8$OZ$rBUwY02|j+M`|*F%`MV97tmT^$0TNwah<(V9)7OabKjvC)(7!>a?K? zHm_r*V;8Paxx`_QerCWwjBN<2+f5e&}vg8J${q zpSdzxW1}V0o-mf&av8^ky-L3lE%+7l?BIKB_gTI}eO9QP(V|$nRQ*T+SHx#>MQOqN z5tOTQV@a=2(*{XQK&iO39llT!Z>DmCnvu8AjI_NX%6wHfs0sh_S}GMFlUO;XnBu+rK~V4#b~nN8ndjg>C>an^ogN zDR4Rk_2Z_pOt?pL1W8iHw0dwa@?+g}`lk|dhuU_OdXv{KmJ=S-K1kA>DAykcOe14F zq(2T)oT*rp<^A0Qw*0-4rkRWQg?8gmm!rEIchc*5|1Ew8U6AJ3VL(l#D*DEpi%mU97G3*@S)?A2wkqAG3xl~ z(pXe2q#_idl+!N#P5nGx<97$eU`r~2MuKpE`mLsn$Jh_vS{kEc4U>3HB=Q10pt8WKV_6b*DU?4Kc=ZrPJ-N6&V(m6gFR>B~J}BnqEq$x8g|3 z^ZEBWLgI6AF^IN{2`Nw2m+^Zw?SlnOI+scPwQ|+W$?{66p0OF+ad1 zA?F9iMV*e%YaC$zxPpQ`E?Hg$+MzxYzw=%&pTz0g#Kq;^Sj$*}nQ<(*#%D#o?NER@ z$x(8eeL0N^33RxjP?fxJGc)@~zUwyOmhuQ5WMHds&)!z^+ZDU4`O0Q9KbwE2gDq9F zrT>OoW{N>W=owG3*g-|=kYTr=$SLI&+yRDq{ke>peXJBbxv&Cd49Ajk_X;c;UbcCk zDtEiLtsdEXR{4akCY$E$Ic1=dn(q4Kwoab{Ju8l>v}UVt2lYeeb#1QGBTrmXTL(@Z zlUk3d_LQ3!k6ohAmpeLEESpn!bWH&j6$8hvnb|hCZ!;&WdPddEk`=>8cK2*Uhun|! zm6}8Qnt)r=bhCT&E&BH61*@8GlDWecsPfzAZN1SdVj!>3#)*@9zA}X8XAEMSu_}z3 z+0FXLQlcc%B3h4=yzPPF^5ZFOAm}Yd?wCYiSid=UYI|plsZA<*V1Jv;?>myLk_H6N zV5GI4M1ZCRcOluF7a*--?UeIzyb5x(AGnt6v$n$E*`y6&rBg3{n3_% zi5PUTQ9^TcQyN04Em}9PscnaRb1iFKIbkB)F0D!B^tk30)p6Rh*%Q;l){5o?Iv0-Y`mj5L+^MKTqqA(tZ~c)< z`Zfa_?~b9uT7%;INFR5bbr{?NI}x9sgvcCifb&X*C4O63c5x&^!bWkDHRJkB2yyc= zK2?74Bu^r|0#J)8nqL)_-^|bQjrr;R4hM%}$W!w(n0-sLtO9f|Y8%zmdZaq=t@#Q{ zc1;{rUqLN0+xv{2c|Q<4uD_S-+F%@zhTbvRxvlRZl#1gpT_-<2=SVFY80hI`t9{I( zN9E9swLfLAnOD*G?3^@+NW|SpK6P*AUr)A^V8Y~^h7sTB>&Fc#x4Uz7SRYKLk_ZF|Jdi49x-*6Ro@gi~BA2l1pb}dq8t3>HobPY2mm9n+oN9s zH-unSSeYWR#fM(kEe=*WsG|n12@gQ{FH)`0((*;gg47?-|35ITv7eC75eJb;Zp3fwoBMNa8VQP5#7>+yx#ekQJbYURFiv^mSBlG zpT!c3eHpNc*d$(CTh(W6m1#%gsY+|O8vM8{Z^*mKB*2*U(FOISFR^dG&j$fpUmbvI zo2c-`4TU`9JPH8>14&2D;f3(R3E=zfD?=-HeU18F(clDf;X#2AcX$Etw-ZUoGGfkt zFECP&@^3E(x(e{Spdy zdd$%CC^(Q4lmsrPwWS?b;0#uQ+^u@gHv=xmv-i>ra!=&e1(!q9d-?VaJF;NdcKwaS ztvGO>06KvHBKO;0hiD<@s6kqZ1h@nC$)H|{0tRp(*Pcr_=o5j!D|`<4Gaxx$z*xUS zB8Rxgk=yMQ2~-HVXLfr*a`S=70oO^0!sUdaEI~hiCKj-T0j>4|Nd%rDgzrFdkXB-W zTtpCl@1-;J>4ShU3!*YgpYH@9Q3&tb*dQoyyH&%2IwAL#PyzHD zFi_R-oeqU8z`2jH39qR= z<-KHl92_TTHZ4=7)?uj$pD9p$BUO8N?&0>FVw^F71+y^GQ0!H z=r(5w_Xag5JbNr>C=pXbDxKL+Aznaz326S4%@)vB-wkbVNNtYZK6J*!7=%cNO#avH9iWZ|Z zyx`&m_;t6O+1aZ@T{oKIMqLMHw$7DSuMF(J!Zev%G<~fdCtf};Bk||;j>$W^qA)dw z@S-IsS9^MnEw0x@qBTbWw-znvWZ=4y1JS?o;Oj1W(RL(aJ_4P%hIyg z^2&|bwl~8IRwZO&Py>7yd8smOM6vi&MIhd-CV{K#3ZI(`IQRuq@BdnY{h zKu{bzO84nf`Zs6B?i#26xU(~-hxJ`n?m20Qz!dky)#p^5m9L1R#>eNpw`~&RUsqIS zeom?B^b`Knmn-$*B`56vYT+O-MlafL+(6q^7Cmefwc~N8-;ZPu?!PC3nK_Q}a1RmeSBG6}X>->?Ot7d-DtJsW# z{>WT^Pcee?3atA)+#tE?22++bJY>3|$eKcZXFCw`jeHiHxXz+CZ?`TVeHSTNnzb|& zy7{>G=OY?sAl|J?iCkgbY_Z(#Z5Sq)Ao~rn7I8jGE z0lc-9+Y+?rkC8sF-34e?4(dEi+qg4Y*ALEyuObn+KrbkvCEG02*la**o#L4NiX;5~ zQ&qURoSEarmTfpWfUMPZXTwdVV=#=HWu3;~{Hjzc!0vJoNZp~w1!RC5`$UVD@AvKd zpk6XqBQGUoa5{E9*t>(p2sKL09?^eKO=Bu&#hZ? zNED{Ncr=?;9H38Og@Kj0>jlrVys2ryQi1PtImAO`m2j%9ginBS4T(tYAN*0 z-4q;LJ&fh3nvM$|q4CU24Ow9iCj>1vFK3-JFJcHFmX6-2lIbf#jrm)$WM=j0!Q9(B zm!%nxomGk}AGeos!u!4J)*{LKlCO(6$8*2~GGqOpUcxJv8<1~nIO7T=mKB7xn**jf zNAvle$+1P(LXn!$vRLCz_6C@>=GM{NU*)`Pw>-_obs=A}Uo2Z@$A;?8E6KNChb4UY zGCo<~X+_hirs0K(eWq2NoTNr*Vj6xYOg1^`{WU;pI5w32DOv}YBJFEcRh8UKGlR#| z-27BhlXguaRkHhuj8@a^p=%xCua7>OX=VVrsPKZP+exF{`kwB>0$c6ho(Mi%QIZO~ zmF|})OL2YV6P&O1qFd-~gD+$iAz<1;aSZZ=FR9gC`gHse*myR{E6%C z_YHj4?>DaGF;?B(pXxhrgeg{21&NmR4TzRE@?xyOrLk7vyX}#ilkNyB@NR_FtCGFR zW9$pba+j~M$)h9OmsNv@xC5MCPfl$8uF!*^+Q&ucl5)s8ca2$J*R_D;;4!N#dlGR+ z2$5LlX51!KKV1?FjNXv!_V;b0ZH}Q!>O%9+9(qiiaTjrJ<|z!jag1+sJD31r@#pF! zA~AgYO2VXYO3)8j#0172Bj^obLPAPHPC|S_dP3sZIAK|2p1Yohh1y}+S8r`EZGg6q zHd{lkc6E~M4++JYlt113NUh>LG@y-$lS4J(9GL6_zlm3ys$jzxV7_)Y_jA0}&#M(p&DKm!Dorv? z<5U)pf;UE%U7c(CF)1>-$Ad1Zon>EFPw5|PkDcxZE(l#T+(V6x@4pW(P!-95bv#y< z$5zK^3ZC=_hfg&GWCVOb#5veGjvH8D)!gCcI%S=7eJz!HiTSca%^&j47#4zLzSmKv zQ%Er^-TS>xpm5xAZx#3Ph+76r^@U2^&Wq`>S%z-p9Rxgh>CZVmhdnC(r)uVLZ!06A zZOJ7X(Yo{X9#@BsmQis@J+Ky9oq*#E*Tb2^`a?!%j>EmVbu|s;{VLSC`9zLy`WtkU!|l=%_@}#1=${ z#2G{`oC5Q9E%~jRZepJO_aW61-o{?W9@~G1&ZBvw8HfxHuDy^zZY|%lR)@Gf@DCbp zJWd15SaiQkDQxXxWZJqVR*w7pb~{)W)gx-Z6}?bphPHdGOQtXd zJ&|i-70O`JI}!Sf=^CQV@$F^Gd;)nAag$eK3fu|MpevCunRnA-ryIW%Fd&&I`#Au# z21u{?IeJ}3<8{Gmhv`W44z<%tpm2M~ptTcF?erHfJG^Y$4-`s`m3NTW=;1`L=E#8G zM>Y-8^0SEnX6YIjW5UGf3Ry5r&GvD5?++^{9AEUu#w2$pK&JSn2eKLYITomQ@)=XM zHXgrOsh;C6B;_4E1!wA4ItEB^9K#uv?)Y*umfFhMBxE-EWBy+;31st7GCS zJU=B${@7&55^K>Flo(sSxqxuG;dkuwhs8C2PJQY6boolL)#lQhNcoL&^(M?@cjGrV z>LpFY@LA@eRzL~5lyl`UD3|x*60z?nAb@5T`Q<79BbgM`DFA9eU#DYG&NnFOArIZ3 z7@NI9`=XT`!XNvDBaONvrIB=pO&|L;bzT?hwAI-Tw{97=+VGSfXr`F*B=AMca>%>$ z>3hK3ByuufM1i@6QKuF9VmY~Lb2 z)}2l4(sUdFc3!MTZO3hIY&UkzBh9|+_EGMVG%wYDxJICDg!uyv^C!!@Tfpm&Yl^ejY=y&Ifs48NTmoMQuUubK zxu1=(!mXpsOK>N}d@gD$+8jRgk3S|psv4EleqW=>!qy1}4Tz1o_jsKvu3R#5pRn2` z?cQA1p38ooFqHaxPq@(`jMZ%<9o0d*sAu9K`awt0Q8uh!U|TV#UjpS)sVTqXy8r{c zogfXFG3@ExS*Z`5OWv#06>)5a@h?x@BM`CyzVJscO6KoJWDUn~Ky_A21Z>cbnz3|OIbv1^02Xl8(a8Gfqax{%TM;0(0{6Xaq8?=tSRu4UGc z2}-bhV{*vz_Sv=s$Tf(2_R*%t81BZTI4ddd5$p|#h9gB7pq^|9yB#VW?YwyVx7nW7c2vAtQSYqUzg8hB<&zOc-6W{J7L8>CcYltfhc z^wDzU^0rgWtFcCMO-$b-S?@O(a{=y&J1Ef)=NwB0S4T6$E#o?vNTY3$u79cBx1vsvR5|#HR=K?wznAvMS6xfePFl?6@D2 z-)`EGsIJC4Xty1i&l5@uycbgweUb=T9*nX*hRwTr|Ir?Sb4H_Qt3JoAgCMvb1^>Vv zke^u3Wsf0be+vnjhAf7c}E^qH1))8|bv-Lo|=SzG-qi7?#j@0sk1jWz8zQb!l3)?E9 zM11cDs|ZV zbE_HRo=nZ&Kk0k#H z!=>nzT4X#W>PJX`h6WP?OW4EulZO?SfbL=0x#v2~mQluN+l~}d_8m1W_q*kuXb}uM zY*ySB!rFJUegZ%F;xN}>C*A>I5qcOQ>OV19@mtW-kS35&{K;Wa{l4^|;J|U^!PmkS zi4ZErbn?A>ang?H_+hsA^G6+Dp`HW5$nLRk#s?O)`FZ3m<@ zNlqCcO0x7f?SXq|6^1q&@gE6CbNp1Nq zPQSh%s|j2srtL^uamA0LM+<_TM|y|DgXD$ih4F-Z#{or{hJl<=oC`p4?O%w*+cEP-$JkdZ& zrxCm`o!|uYu3ZC!cyBCvR^2(8&S0ipCY|0gfZFMkrEM7jBP^93-31D zTAx;E3%k-PHaXjxj9v5zKcc+(=(s6Z7Wj%v+J|q|{p~07uI5hxR{s-?DY!j2n>;+X z57!KS$vs36njRsDd4pi!5wOP|!UVB~aF_b-cZap!-nEo_oNe>N;UvAM%9ep$Qr4-Z zY7#+Z*OmTEi>{a#JW|xFoFC7w8$qdCFb&%~i;^UxSk4-u6!j~HPrsa})J-bcLu%lU zSV7Fv0Q-02e7}bGPQqvDr$+LzIm7!k`>`O)lg`BzPr$;%OIJ5oKlqn#NbWZNUol@h zwI|Zvg1ZC=4(Afb`3)rGPOi6dfZ{GBgOfN*`Ee8yvZ8<>V<~+0^f9TXMoh@9;HD1p zvT_CwwD3F+xShe=s{Vn2)c&pkjVB>%>(*!bF1(w0JuIQdLcq1)LxBAs!PzyADuJ4F zgN(?U$En?%XrIZr<+s>zoq&o(tEy_%`9TMTf;FJ!+36qIt5h)W(}Q{Wwi&(ek=c*x zJIh`4ouldr7L7Tza0r*JBsmw{tG^oUt7+P5qbo#S%P9JWc`e%0j)gC}RpIf^g@LSn z$Aag=@N=<(+qiq4axMTahQv$s)ptwgj=c+(Qw7Q-5HTFJDdfLGr^t_RSPU7yL(b_@ zFkFCZRDq&iZKk?mbq}e~Zec2_AovbQpamwvXHhO4w+n{u*CDV##5;nzH%+Yuxxml3 zPoy&N8sVwaS#u;C&M5qju3us)Z1E|%Rn~t zS>CwYw3ge{H@P!>P-DQ!imp)IGGC1Gzs~Z`;Dpg*|hyKi%;;4bZO1D27kANC)3<=0WER&vTGYc^A^|Q zUq*Q|d%nmTMC-u=x(#HHh*^~<;}&wu&qmvr5K)tSjM$3)ZA?)nGL6V#;Xu%qVd?nx z`rmUslU|c|jMKT|kT|2|fiW1p-1-4rsIbF-b= z13GCZbMn%Hy;Y&^HJ=fv-QB%#R`cwpS?>Mb$E*shb=0NZUAJIcnS5gToTA-blp;1C zk*>|A!k}+qUY)XM;hSHB`5f13>3gP)>;!78*JaRP2wcb}NjcoW71Fr1VJ`ksr4qc5 zeYW;!lkK|Bch=^-;e7NfKL+nmwb=Qrf=9opT70tlOO?)E7W3iXf>Ssnb0aF9XWtQ3 zHBwQ@r5@1C6XPUkrq`nGDc+7+c>EG*Bb2gfOemDHXKd}oI62JTI~>(2e7s|7-ND#D z&i-Gpl7dQ|ln6Y2J}LPV41xgN2y(@mUqIU*y?PzH|7r=|DGVF*rJm#N=suR;SgzD; z6KjUrZs}ADN7z122#{TNb_EVk9^O8OkpJ=xBhSY_IyYYQ-MY-3wy}HR7*^QQpoJ{n zu?Xz8!mWrt;dS?)DLFl3x)J$)zh_ZHcVDP&dP-g78f5_G?c8ZarOgU&v+P;o_znWV z&%6S$Ol~kNTU1ZzEXE8??t2V({Q83!xsy@n%T(;D+%afUMsYs^^6nyZv|v<3mtv>4VcWe`O@-6O{`=w(3y`40jOKXa2GH z)OROzwVhfk&$%EK^JDzuK?azoNu5){u;)JS(f2JC)$Q9E>_)U;F5C4tiRA*D`r_}{TEFviLA~;%w zl_iVN*6GarRFKpxXx%}A&nLwa^@?R+nP=Er&MkI7C-PF4pB$e@Kj>{$%hs3ME>I_a zDEfsAU)Nk3UI%$|{jgCWiYCKJ%Vvcn{ZX9&H}pao0|rb3ez}ZYp^ZyWa|ioI%>}$o@)W zjE#sA^3qZuneOC8ktD?jri_Tn?Br2hD3m-UmhI#k+)aA>NDAjTJu!H1Q10YM3B2jd zI4EjkNRNw}^U^XQ747ClJte02&Ri&HzetS>o8Qwgy*7*rTVE(hyo`?gxBPoIw`qkX zm}57O%3&Jof2uW*B&Gb<)?rd0-)^2fZz=Fbig*9EI<*J?zfFavjEGq~D7M-7@Tia- zCWXFfIjw(DvjV!-cT)n=MJ_(=R_vbZ9b4U@>2Ig1iSVmyGH|*So#R~C zH$v#rA_DE-62qCN#faT|2&%X31DvmzR-$umXsr6imxwUtpXhWAfXJY{ATzdrw^Ny5 z(4dYG6nwN@6U5^7sDF0i+1Y${z0uX)>0EQW&?%%;b4I$d%!7BIxy-x9rCc zK=+aBvH(Gs%eglvmxyh9g$QDw6$6ofdDleD5 zoXtq=jUaAg@?+u~xi|mm+b_kiZ@Bl~kq`(GzY6ByBK!V{31JyBz|!&US07&O6Jih~ z^3^jS5Xvm=voRE6WAeBPwJ1ZSS)T{BP!O?wBDfxw z!JfmWw`xbRRO>V15i*LAr0^A_4HTK{xwH6QMLc=Ftzi-Z*9 ziiA`i4ko%mz`j=K6HR;j4T4g<^^+u^SS6V=1besN_Yk{BI2>7LmJ7US#HI$#l=rY+Cxr;;t;wzz5Lwkg4 z+F4NPYLzs2r)-5q9lA^q8#Re$HW2e(n1p}kJiS+!gO|H$?!2gF;;y1$F@ODzxY0H9 zmibnIWP|jv?edI|Y}y8O@$3fBA)W$V%b4G^wG;|iwMRM~AX*Dt9pLs!Fg^s;0jZSvg1-AE7dGHRzWUskOw6{7IlCHaWeOS={e)E#}cRZr2 z^6$~J?VskM`zByH`L&rr%6K@hci3<`V~Q2HURnJ4JSaLQmuaI9^QCsh%!nl z#4>@-yRj6NKjAU-G7%}rF###WGSL=2m6GN#_xIT+SqzTRW7{X0cu90w<{M&=-UZ4qr&=HmjQ9hAz*c8`_qy-y`*>%!T&3ml5~x zmSsk1ZLUZg+YB)ctsQpsr>#ca*RoagahA=WzP`7?c{oA#^!oi)e_!@9&r$dMdIee%C?=rRDS`hPCFL2v2%+)>AFs1b5v4d zbX(yotjQ0qu@Q+1(?XbKS{mYAlfo>kw@)1EmE^g`MkRRvhm>C~1zymi-8Jfe*XRhZ_^*MlsU%^Ht6K0Tt12*K_8D(pV-PUUVtDcHY|?4RvD5xx};d8;=j z=Q&6^Gd=fPTx0&vP_wsD(Ryovu}1pbzVi<0bgyTf#Elb)4AR4kk+uB>Yoq>-Bs|0Z zNIZ5ia5a1Xn8`QB?Ks*nTYzAzNo$S@C%-t3( z|IFkTEjkC_aH|&0KYntpGWH)8o>{dC$X=@q%tW^Xa@i~lPfD*<4orHqEECx*j85{k zEIZk7^-Qj`Xt8iJH~_!=Ys#`k3yIru8!+3dMgGqhEbgPtf8>7*{~yTZcmHa@{j)8- zW<|<BlJV(2B>*3@Rv{~ygZ9%&>=^GK4S*uo?p>F~lUyCmkAnNcM^9%*jLgFRZp zm;|Y0*DtW=y12yXd*x;z_1zreIgP2KKqMoMY%pm|^5 z-(b61XoU+uWg2n!=N92QrnEFSDjvRb*ABdiA05@})#z2CA7rJ}5u8T_1Hwn`d;g3I zo)`a=xR_k&Y@8oDF0?h+-&WdQfw$IWC{B>NEy-Fem}-1(MEZp}pd;v7@FG=B8r0m% zCC;zrS?h`Ur)xd!V2I?qdl8hfcjt;@hw0uXS^%a-utb$UW+UuKudfJ zaD|@Lg!l^8kgnAPRW-}tqh7meyR2tATk27J-+i*?>B{^H=C2xLB;`d!Y?Va>$&zYG zPgaU+(UZ^y?n9k?+oH=%`wC0amDL9Fg=YG+1nrY2ikALH{zl6N*MoLRaOV{N`P-Gg zxYM9r9ZYj22ze6qnrT!pC!g`r2Af@ZFWmS4bve0QkqjX09X58g_01WJDX4u|iZux; zAxWjR4jrRbS=#X}sMRvYQNQEHQC|`_1P;+wiWttmu%Kk#u>6!zXrOlOoWtU1-#uPf>=EmwR^{zjn*D!PLSXc&&eJF{LXh+S3L&wc7`qi@Iw zc_`rU3vR>e(woKim_}M!|2`X<4Q1n)uHg~721e;5*vqinG)Jv+QE$hj+M}{tGke%B zrJK`?HXsmk;dinePt+zBpsjxC$1_=oVM})w0a%A`U=INnq?7>G@mi?t7V;7&1c^#C z;)KqvQEj3UOrxb#gpE4?B}YpU(!bIqx6xE zqs=#GcSKtpZN!d~sMhbSB$r`PtnvmPbGD?1&1lyqWhIdwdrBauLn##n;DdGkgY{=z zPRd(w7pMC>45#O+A=x?k8P^Zgp&VsppLxY!RY^L$<1#YJ%=tJcON!m+zQ$$%lvTtW zirGS~eYxCQ?1534Cxnt)w9jXAz6~#5WB&M7zHDES#_~QWObcs(!+E59178xor|1mZ z|Jz(Lr^<56&Vi6|*O6JvzHHX67Ytt8+3|_1l9pKg=()QE@N%*r;Z*0l+GLXJ=j)Et z6@1Sr@rTsE?V6t9E@hx!Y^TpddKPQ-wGk^rN~=WIIug$dvd-gW)xn3|J?_0Uj6na7Fkl!=w-17-Q;gq>2IXBer%YBAP?Zv@8$^wrA;wIT+W!n zAe2Fp(_yiD6X%v!+DYv2Ye8JQLbKbRPP+oiSQ~K(O7Ypoq<|Imi-HshNNA(p8{rh+jDur$(<`N1mEGn?>n#JP>le7>PQ^&IeCOlz@i!n!PMF`)TZ1f{irG?VvePsiI8 z-}Hx38b`=btCYnWP&tKHf)7953aVSTs#(U1<7u}dGH^4m1ZR++d~*(eWM*g`kZ#f( zb^pUW*YXR$TypJJbADI7QJhQbmnm`O@&Dp>chy_P)wO;V5m#QlaTZ-IXKzN|S{iGP zd<<6a7G1mjzFZUxOJtH7tUCSa6lw68NIH%ApKq}(XZaBr<-hQ6CzIHO$Jhnu{(L!Y zAMj3XIV(uQkTx$#3Qn34q1zt(r}<`7byk$~WUDLPVNaueGUgwpXZ%)-*psyHmS4LK zd(2_8&&@CW*I9lMy{)duwiHDTROiV^7r!BKevvn)LT6G`v?CcC;#P=Ct+QIrux|gU zUGUM?WMAMZ>%;9viVN=OR$5m>y}_z0PRxqI%{EzU6{-9-z6Z=B^LiK0U<2tQIgRi zQe9?nS^Vo@(jwd1R>iq0r)RPC$O%npb3$Yhl16gu6!m@6qJF%AyR<`Har5Z8R05_{ zzISDV5>AIdrg_XFg#K^S>HFrE5?2Ss667Gary&7IQQD_IkQP=TUlqHy`Ob6rsp_q4KtO*a zZ{8Hts+tqyZQUo0dC~$QNdYO(U)MH_j%^ytdF|gk6R!#F zn|a>ID)U&`Px@$hwq7$IdoMLCm0wRUjaz~~j3BS!2(ao9rw58Td`jBxe$Nje7l~r<8NL+9-MAW3Enkf)X7*uYu#e{hZ_s*Zqte4hQR{1cO%fQL95z0 zb;GIpEBb=ZERRs^KQ4WnkuWZO><3uD@&wDdaV$9~1A#6ehw8?+(_NztAzSbI>sS$K zHntrcp5)F1u35mE4}8R^n5yG}3W-npkW$cqBZvRsgQ@C~1L!(5N0@u~Jj@5)+HG5- zJUX;r3tlvIJ<>ULH`~%O23j7y^*)Xk0d75|qDNOP;iId;k%a3GOl_`uUU$pw`e5OC zc0Sl&NVD{yL$@irFsy6nTr#$tqO=blp6}X)@21b;(|Nx`y8F7x8c!-rZr5A+LZ~t` zV$z}KAtvPs11e(lC^hmFdP~OkM7itx|3jvaJQbFJa) za9eO`sd@&e&|AnNyujboz8K)BNRnBUo(?*-j%z-|I0CP*cz>1onC8tRHsjO$W)_~CI^CCb%9F*#AJtP7U1}!jb(5#Bq z-EDpL_UY{0q+PVSv+}sKTl3tYld+#j&f5dvYV-UK+CZzOEq~Ln^`LYti3he~1sh~_ zD#H>*i8+wTvMc2X)=GBb11se(5$qo8nm{XD- ztQ=G?tfN8CAyuE(hs3@pF&BCE)=;l~w(&>wj)+q*z>7@e&--)AOQZJnd*g>U3I?xz z!n47U8-%-w82wG@2V{f?LeP2SQIFUGGT(mV<`Up-wril)#A*4%z(%1_GvDhs z;6UtQ2Lg8Bv%^kCCuj#qNcM*-2a?I0dFKY?o5it1cfkVBdf5}f7!l|?9IzCCVTgiE zkJ-3Ia+~$i_If%(OqE%MgVbp@dH+{HzAjaX;-I%*>K2Cb)F|`yn-bq^MFVsdNgkT5 zDD?@uSRVuBLLc8s%nnC48Kn!J!&tSitblPLLaGg`0DQa1-kV7~a6`>%gQrEmC2U6i z8cBIOSgeM!s%>PvWhZga%SJ47xKDTpY7&}T9v@^D*aQ0{6E3qm7(zM|M8hbLcE>+=u5b* z5b$6bD}r`W^yQIrAp7mVhwPkL>%3IqTJ!g=X6Z8)nK5{^`SoKMwv|!{9Pk3YN1F{J z-r)oFmTiiE2`_%g#&JsUJ}>r_8={#3HF`Ig_f;J$(evP;4NHnL%GiN1y8ApO0E-om zCK&EjnLU05ZT1nKABWuC>WE|?DsT}xS+NSGR17T?|3hjQik~GMUqu47lvKqQEL$4n zh^G2$RJPVlx{rCVC7|{sr(A&c5Z&<>GnobOUj;nG+ra@}7#9TGICu!ruNj}#e|OwN ziF20|Gxkn#;XB3S2wO(ez2?o-LaHO#6-_!+J|9zboTG1fbF65OstEhCiS4^Mz>yd0 zWlDatWq%Gvr(f>wzd+{(9VCW7?@L*It6HV5Q=T0#x?$js&K(f2!?%Eno}`|;dMO#i z9kg{+JQnN@+b-s3P#-K|o7F5k%~sAdHKw^QJe}f+$v-Ne8GDD_Re zd!zpcZxX9AX2pFD-4z`%582Ujd#uO-qD=yhxV( z{~-&ncT;BFP_8>W{t=rCrS$vsy;y?ey8k8b2m4;}Z~sH+#+a~hOL1n4B*ib47j

        zyOaU0+16L$Aje+MdhQCLxBdLW=>5jgP^@|ZdMcyokmjw^UNR-0L-4#MuXKboQY7i{NyK_iYbZ`+13xyQ)al0Ynu(2m`t> zx3y0JvZA3sGK#hYNg(^Y3jOZbtpCm1Y%G>F54osJ1W94b4BFzx3|@(IAiHk*H_UXH}s#Qik==YxR%mkMN6;&!B@wFp69 zc#~O8(D=u70zsP`ZM~cO=4E3y`T|lVt<&>r+|JkV91+x??FJu@(A-(SF5FlUk=btL z+j`YU#WX%Ab`f6clUn{SCZTKp{hIkNpDU0=wE6MppA6DJsw_5PpkEA^Y0Udo@h|G% z4H1|Yuff9T-IV{4kGWbb&OtvJDkG>f<2C_Zd1s{_wKSXaBhjty-5R4zpVXNi2Ip^7 zG&(V{p@~@bT6X_nl|1r9i?39K-^0ekHl6ZrGH8Wq!v9ujO|i4FdLiQHd`c=D;Z~AL zqyIehucfU1S!#w$hCBJ!D40~?oKQIbC4%l(&$XXCxfpByO<)o?Jhd*G3FK^1V&Q;s zL!9T?LS0rj$a8<@V}IIzhBcx6sz#sdZmND+OkqK-iFQ2kGCc>2yBqfgy~TjxH`sIG zt;ipjg_i=I&VyFfpZyWi6Bwy% zQ7&qXLs&NOoa%c2{&)D%cavm_R_w)s0cHsox?0&d-G3i-M=JK_I5H;_qn<;wQDUI+ z-4X%$7KMq=lag;QVi>#j*iCiEH{=^|m74uZ0^z;_5`5C@9k1@h!m7K^N^pXA?l0wfU;?WwdUwdb{9Q&k(s<@1h0{7DI>z-(Lsl zHIAW)V&%j}J0Jet6b@FIk&)`R^6)TKwiz~aN2ictIVKPTt$SdK*wD^H?$ z^XwQI352Pe*HbYCXeskv%K|0)SNEg|g{1RoEH6JrW&NIv=k)j`sW9~)A=6ZwjZ`Z& zuxQnG!kzt$baONk8Ps<6UICsM82!vNkWas$w7n<$!yeihQcbM(N9v62A=A0Dg6BM% zC<-W!+7r;v*r&X<;bJOeBX|7>2zYG5)=)Y}FIUC3#_83Ps8LgLLkx0NbVH;vS460n zDKhvU-mZVRic`bWO8!I8bG2JHoOS=SIL^8}**vOs+9Cql=7Zi+nFxbsm}x~7C@$XK z>2$ixXBGh4P)>F=uH}C{pe>f1QtzxV<;`PwkmUXsK^(}k;G4G#a|px7cj{fLtOP?~ zygwcThChzAA9N5w{)dLhD=(D6l0YQ8U}PYIU66jatzyaPue9P{s=IY}TxO_0 z9tv86xmF41oUApBsWcR*MqtIKu2|(UnEw#B%{N)Rel+qMVOam7-Xs#O{LUD&SRHc- zUe2rIZrW|GW9+SQ0VK?l+myw_M~~`u4=RJoh0JSqGbGZjER@k~OUXrS;_-NDE8EZt z^F{bs%qFe{_iSYX~K;$Zr9 z79j7Z4Cdq|c|>|}cY%fcz$u>B>Bi z0RE0mi`-HCiQx_T#iv8wmA9?Kz2xGm=q|V5NgAvUCm;`v&nt)0WBc98c0S>clgc(%styP+1*-A`Js<^RDSr_ z-YD8DV|k}JD2-h(yCPm4;V6`<07&QrV5?vsWXkEc0}!2ev`v~+QhPAgq_1{MpfOp^dN|P^+u^EF zeNHJVC$+{_^I`PL+SQ8d?ba(&L|5K99T->EtS^<&&qJ4AiM_j3xtdJw=zpjp3o0M; z#+zeD-EZGvc%eSNQ|OxB(u7rGQepKv4EeGw*&I{ zEm$YMDjdTVAJFfKrt`k(4`;M8&47OIfWUS&h40q3ea1snJP2^XBVS4Hs2W!muA{nL zin$eL5gFR2h)6Q~<{(EAF^Hcwk5CL_bG!VLc>&G)3qxAe5DI(*fw3dC z5xd@Ju#yNg5~r06G#asxP%#?W1;Rwlpal*DI!NlBCP31{&L2RM6MrkWuU|cI^Uc}* z4JeDK_?QMQrR8NEwSK+UdYzq*2wgY;Y3Yu1j76z=G{20pHjj#~GdfBnb*)K$ETeK1 zq1T^Gm3=yo+5YhwK8&|BmzKF)VQ;`xpF6E<(3cI;>%=2_R0XOEbx(S3ic zBXTVK8NFx#jP0Jz&cFQIDd`xwi88;!E_HI&nOMIHnh1}|d4cAd(mY1J7g*6ojV9n0 zCEHV=JqNYjhOg4?*$_uXot{T+E4!U=Hu^Lsx6nDVOUM@v3}WA=h=zTV`J_YzX<>uTC>tChWBcV(o&i9kK zm2;GtE*$lK-0{JEi8mddypfo-63U7~WI{R4vRN}0<1*taP#PI5y%N?RaIl-JA22fV zBPBH&@-aHf)brg|%YyAkmgmGE2Ep91L|h|NZy_8Sy?1n$krM8LUOmSRMs=bq5_(*Nm@0m0(JZ5g%F$sF(;MNylQzYsVmIHGG!`3MM zyTm$7e#ksU2+D@J);tJ7X8+{3WU=P?8r;*k5ob+6or-=b)I_BbDlv3X%E~zg*DcrD39NYa2YMUprS>H~J zI>Wt>7$~P^-><4RG1uWf{WgGmy&m%3AT^!E*hVC9N3hBN_}MDFccX=}hSV{55!cwHD5&$UOh|@GU25o+fOZ-_b_M=8wDmHqhT?X|dCpCml6;J7u~I6O{sV zvC95_>2og&47+A_cH^Va^DZR*{rUD|0@d#xkt5UVu=}B;%eZdqGxJt7eKj!}6+T^C zyk3>oNAf#fo!7EA$Q^$6h5;qbvnmNz^fFv`s{THSIr>y%xLNn|^Ll!%(=+QFHp@;lAb3nG~n+5P2-E~=u} zVwKZnuWF4h$9@Wczhn)oiS7OplPE8wP*cVzD+!%d={d-25Wtd%v{k~K>uj2kN+j+T zBz4ZxW~L@czWNkh(kdeqASxu=Yr+ghs;5`YlSyo)$AxqZ@Q5(eE&!uaJnZE-mKktA9C%EG~=M!-`1IQb7dKd6VqZ)C2ky4d7`W3P#AJS7CB znol;H5nF}cRe5XN#|qPH=?iZgL?jmUTGi6j^5^k~Gk{UHf}x&yiP-=ZYRqP#xppE{ z%0GV7bz^i*y|YgdYVeGqgdBFN;%`Wt8op1QUz}xfl8_O;<#-`EezYt-fZCW7Bxf3o z#78gzGo2ZVN8uq9i9%%_m%#5klY@Z8B zIieOV2(NMF*=K-GANB&}(`CS8&U}?;4avJyXPYUGK)AO7e&h=xNq;=#FI7%bb*p4Q zg7`n6kMUwXe8=-CLGj)b#cMf}(RC}ReBLZ8uAipU(jmCI-Mo{}L0IPnUT3cZlF3|& zv_0QFD9{?re}l8~rs)gScBS#@F5t~00lW3mC!aDD&}`89L6^NVxT)n%3lyD)miP0) zf%@O4INfABBkya%?ke7j-S*B4!DI!g1 zhN2AFM16*~D`;e6ctfT=nBtIH>}yrV;u^yH+NTfWLgnfeS`7^$SOI&QSk{9_Iy<+1 z9;CI$St0jdq|JmK8-)++M#@jPwA&Tm8E-5cEy8yw#&nEysMZqTE=`h=A3*&uMlmK~ zN`AV$N#^k5tlIZAwo~UT3Z*m{#DiWRe2kGd3 zbs+o;o5y5x=v$*q`#wa@!xZSniS3xmhS_#f6#)zEB+~g?aQ1 zu$9qeAi!;6?{sT@QA$r`EzCz3_65FOjcj`KO&Fq*T=4#a!cwkA_B_l0LUq8bhiKOL zLjv^>!5G%*gH+3_k$Mj^E$_HTI7-OZS*#M?xKf($04zFPK9QYFk!jbE1%(}PdaQys zO5Y39+!t}X@OkINWign%d1%Rfg1ZxWb;7z6f!blM{{UX?u)0K`R#;ggP$MkjF9=BF z{R@EVVV;RVwJ__yz&H`88YY_Zm^8h&Esme~cm|uL z+2*|b%T@^U1Xm9XS_ijH(I&I(Yz^;8Vy08=RjwZ|yMz+yW5wa|wDM>NSthCrgH{eG zGRpBzJWv(5G;4Tc0;QOVVNMmfd8}8$Xxh#`9!h~#vb{Ei(8gkeaq9vuZgwqTgQ-nH08?wo6o-d zw(@0J(TVyw?XgdfbJ_^9HpsE%))jsQ!X=@gC^-`9sLA_A{HMIkd~TNG@F3OsYNW-( zyD5;1u5)Kqa92M?tsKj-epyGmhWl%Ea6&nGrrwelTED0rmi5;`!YM=>sdr)NDHI0~FFs)&W?&GRoAJV|gd zae}giut-Z(m{45ek+{|eLmT5r+sK+IFv9Sezo}a%`!iK;3_K01r|5F)$3Mm2A~9|= ze%=K*a2|xr;Ley-BQL0D^q0 zL!QmB?G)ry8Eao_&ji<$O`o3{YiL{7if5n`Od6wJJ#DjLMmH4?uG4>$>La;toG>r3 zub=R!It@Coc`DtPYS{08Hg~EA2c%p!zi7f~uI!cEm|aEAb@uH(;66PK3CdT)Di*Cd z#*cQIdsa76w@=P=`i{_A^a1sqPKm9v9E-LXa5on$sb#*FXv%QP_?6L&)>H_J@-Ow7*(h<~@whxK)e>C#>REUe z&EwEpqVpu_+5j<2*uiy0ugdYLX$or}ZM!xbYwpb)&UY3}>&j1GSq3i2?#hf9R#r!~ zH)JGkPG+x~X7RJ%5dhwq3!VyFJ(A&dA607@jDL73Kq0wI7CyP#glFEF1!~qf)TQlO zGi#JxH1jd8>3nG1`~bycSzSL~zfxxg$5jE^z9jIQcAZAzsgAwDaEK1T>h&8Fhg)yA zITD+bq~8X8cwQ}WH}4YI|L|zM+k}|kH3d4BOH|LBvBD!Si$6BQxJc-98%rXdm68c! z6dZnVH2#WuN9McgB{#;B;d$A5q4yej91M@fe(J(83)ecQo%hOwztwnW9~z5I!AYw> zvt-OvsCb$u+~GJl26V&v`yP?|1yJ4va(B5ySf=b}b_blLT{a^{Z(laggA1r#{t@0P<2#&sA63k!c zJ=uXQ30Xl}2VjfX{4ddONBQ#IIn$)_`TBQ>v+=32Hm{ZqX@C^0UT9uuNOvM?k@<;R zNBN7{uUtQ4wb}bIrBlw7f0$|duX*}@-<=U7*4aNCoR_ZN#Z;d za-}9M6ylsd&*02-S_8a11^&6`FME(MdRZsJ@27B6js;ekw8=z&dgH_U{0P-;=l~;~Dt~_bd)#brS)mWeJT#=g=jmqp z{HO^EUe3WR?9~0>=eZ%Q(Qn-mgl6=TN&oXOo(74<6!o5oFNclclK|%s21+q@gG#uT z+4(DlcnwxBEcY2Cl{m2WhQOYGMJ(=Ux9^7z@UkJ|(Hr#}$#-X;MfTpmHvF*NZLokC z9Cr&BcX~OFhZ+QC#k|JK^@sEMyugOKp+2BS2WEFGIZ$VeyPL>%N;n|JgvoYBIbeMt z15+)jinoSasAC+{=jlq+mxa3EOjc4*kW+lO#%>XN6Z-XMD1HMq#Y+mzkIy6q1!hZ= zYCSM~PIa<{9uUj*C)0}LMK9}H^uT}(1ALT_KfJuy=uR{mR40Mpb)a%cRnT7{6OH%l zU2ng3N-9pA$TOY&`8W{Lc@pTaWCIK823zow$|J%f(%|K}+uO~>o054Ol&Af}NUk6x7e5iP5x0h6vCS9TJQ&lvc+xLDa1o0`2%Nxf6gB}z>t2bA5QJ^AAML~M=)uGc(Ou}Vea zvUD9zys&pH$5_kbv3FV%uvrh1sK!s*s3Nw1YZc}efNrH( z%0>43^ACo3d`o@y7^C0w_y`p+`ji9Du?+F~|Ct`$t9U0a?x+V)0EwP*HwaaLnAV={?sEn| z*CyGR61(mUp(RBV;uKNMYi$!rP0I3yw6XL3iP8OYY*g#) z>JA8hxlE7>TH zY_k!a`a7o})+%&p`1dhlroNQN%hhD9yYI64j`tXQvoR>w7OoYRuKMT}>YieY*KaND zKQ6B!D?MN_?T1-a;a=i&+AuigsY#(6)GCz?TLy_Nhp!!GNn2Esjb7z9_|(tEG~P|B zi7XL{s|V~^DO!xT;-?wVRg;P;!1qeXgs$?7d@iS-D4ohv*EpxscUK`PbBdQ7p>}tZ zaw0AJQatdzLbB1z{8W!s9C4PbC5BM>x08b(`3b~n;3JdYe|)d9Yh=scHF2Jbk-wXi z79rf1qJ&%gCX2evkMp@?3l+YbloGkylOluf<&$||=Erz2;fdqH_wvYeFY_aOekfHX zJdF7Ix;(NB92g-w2}k1IO^S+W?Mb1)EesX6VSAs82&R$q6u)58hl=8~S1lPo#te=% zl&;oM(2&7fN6R9OpGx=|7&uy<{h1>R96Vx1>tqCjS@a9@UkRy1R#d8{Y<7lJ$EHYk zRtnMziVHPG!o5e90IstmG>-Q_(Z(u0@s>i4G1|R*wu+6(km+4=vg|vT+h=DU-$=-r zt28J+m4eSe`^ac5=wD6}(aq%4I+1Bc{uV}Pg^wdyb%jrPFTKWjpys(n_H5^XOZ7#G z0eq*4CVkd0*!k}ZeDkp2wd)6dRZ4mubRt1z?fw4BvcTEk@F*)up zW;ReU$JL`R#h*2kY^XU?J9LnA#<7Oj$<2C{s+T7<+ndy6n`e#cA|;2{O$5JK`tX_P zm4(;~+jlu=FL!-^-jW$SBBngOR9+V`S=QaUfBKp!@^cNR8y_Dr#IF)ARV#$90b;9q z-G{PbaBxcM^YfO(zy~p9{pGIfzpBk726l)k%P)6be*RN+{^?F)pof?;|8m!P!}pLS zr4xf&Ua%VU?!TvpBV|w&D%qHET1eDTV2Eq=naLB=w!V_Z!pLZ%m~ zbzSH|YMrZIxh`aj0 z3Wno4JC6MNDk*i=CzSs1)ZLSLifg>|dl`=AF5=3wSL!MIv##j+m{B^paSWVhRjfs4 z{7%U%w9(W8Hs`d_H*{wAheterMBQFDI@!VUW+11f|HAzQ(Qt_p5 z7fs@#cGY90xm)!8PR7My=D*|`;S`XuAZk*O0t!S!40$(C3(CmS@F%?j0Y|dgjOeK; zD#<>dI^iig>^Q};j`N#q|Sen!&lgCNcBuI)JoG1>splAF5)uO z%3)AMJk=X&eGgs@IXm&Qp+ZiP;apeAXKRDvuW5qHl3fp*q!9Q^%+)OAj%42_r>VMI zHm#Y$9bzhXDmxkquU3k9iR;y`cSgom8?4zOKgJhM5*s>NZ-AOOFpKwPu?CIiWS_8M>NI{m*uHh zT=85!PUCKEgC9W6_74=x&9TkCN9JCHgN8b<8mt;q1)}QP;*wk^F3`1>{jT>~YdvtP z!*S;(`OOfFf25~SqK~ghp-;7ZtU!4Nre(?D#>raSdd9EA{(r%eg{Jm%I6f9QPTnZ2 zh4#8xdolQC}H8Q78aFmx$~X9h%9wFX5`$|D{?`S@$iiG@yL7I zw*JOc>j9PNdTLV=@QDfCR96jwsWPV*2Ut%257A6k{Sv|8;drko$+uPiiW*c@U6nZ( zL7a_3(Eof!xzBlYRx1!X1Z2sCzKkcRi+ZhHqrHY$$6*%e(?$Y7vLi#caHH)~Yk9OYbR(R5OMf+wQ!UISF~ zR>QX@tM08?-00>*hls)Chaeo^#a0pM+VQ*id}!icO>CV>(LdN-KD`aDow*n` zHc55P%J`^I%^XWJ7+)T-GkAf0i0PgtIGXlpJl0$@dC+N_Pfan4=Jj0S1%-Rq6$+oU zo}Dgb)h`~6`9Y$cD7At%O*M__?TQQTLl-{Xv1+q{R@0sqsWld|>XZ1G0j8&h& zF?nCteaiT;qF?xxlzvnA=;t5?lwNp2QM3{=Ku$qHfgBNDTwFGs>+g?9A6gkvTpWs= zSKhkm-$e0hh}@hvLHS+yyHMofOW2G+{QbvIFJVur@Rr@9&S*JRt*3@$yXOg`RU$i?(nMbup4- zY1;3Txak>ht8lNca;nqYKdwU4n8}o@9fQ+y&4yB~lG3QmOBN3hZhw17w=-s|qRde6 zsWYiPB|&G{8$>%w)kg+A)hEv{iYp7t z2D5)S>xyMfH2fgBji{_T99C}0wPRE`ENlsS5G&f7i_Tx(6&Iqb-jY7SuTxf<|EH3SluVvwvV_`Mnui4+`HTMk9eNg z>;(`<(Ce0^IqpY&AfbE)=)59nV!N?UGhX%`uF8*)*xHJ`x>!8%uCFRQ`0Tc zjR_cta-gK_aFT5;p!9JVZkfc8(%C5u#j=Yeio98ja@wMhZ&qDBz$jYvurul*XbM~I zqFKRiimIw#9_oC1SzK9QsxFAF>bIr9d0@Bq>(1nv(;yTk-$jw$y`fXXIx9}EAK0-s_si#S6owDyL68aPb&fQx0Mb&Kq7Ck6(+k< z`{MhC`>0bwSWfzG>zvRL>9sE25&qFutMCGkTk2`!M$X2^_2bUYPVx=`f3bjWFIR*R z#Hy>P_j-73ojh!A$_|mIj~fdcOdTaPheq?aq>-z{t+O!2qox|mj{O=MBj2mh;*~l_ z`}O!wEP6)w8P`?U2h!gAT6a$qZir4lDSYp(W z6hMlune=`E7&qi|-;pcygZVtrmjhbJ*N8^aCi)P9~4x!s6J@14r`|!J)$G zG3tK!{&k(o3lHJ<#WY`t4BFGK8{R(Q%=s1=D!LW~lU*C9Y9%%AH&kw4<^9g#q!{SR zHcEtV<@wkockR+EI|y*D$J@8G=Nx8eZ*Zfxo-FN!F0##)OO&hzK!x@d!nB3zkq~}2 zFKB0hrRt~?kBt^4l=a5|$EKcWlQ(XD(mE=%^J(K^x4>*2V; z;ni-)if5RS$z>bS3Um!+(j!ZM3%*xzCVb`dPzS|e$F0H_sCam&8; zjTl--dq8nzc4M0~3|aanV$nM10Tm;Bs1${3<3yMJ#O0h9FVuRRZe$RjipgfyCtEgm{uFU2hy8av7Tb?z{R04zVX-8KIVV-wGE z<*_JH+=n@1aIrAYSMy|acNiY7Prs^EeY(+h(Ie4pg>;eB7?7mb(+D4>&060k zuHSQp4!;#;Lb*p;cg9Z@!(x67oo*m7v|-?wcyx_ZM!K>jfYV#qd+5G1tG`ZF?_X@B z4?KK2#b;sfzfIr(dCs=eG5Tg755f4j7Ap&JRe0Kt*IXjB9VwDyvkHvebL~!(h#^uO zzjrk6p&TH*SQk?7CRn^H#YpRM4f~G_ePitr9a}qLASJABM60!3Y~X$__U*!Mbrbmr zE5xya_k;wkrpIe@4Sc*|9$V*XBqZyC8ZL#Vc#qD?B1|lQNcp?%oyPsN4LQ>$a?Miv zelui?MEHL0zOUtWCj?GB5IY656&|+<%vPW5JI0jZWx$(pn+Fi#SXn|#@tS3NvyIt@ zF|)ab09PE6(Ckd*$bMOBa|xbihZ%nRJea{8+m&dalipe!Of4F^dV4b*r+?~E74NM1 zNV}XEbL6*_?K>JX4wDHZVrGlr7_)L*x;A*&D9Dh88nuTpj*DA!_iK?75kuMs&8-0= z?_mN?z|lJMe3YXro7R+rD-%)=4C}&9<`6UYP*eBrGj3%~p15PZ2(mx19VkWYB9}zb z_G$Ak_dY%E4GIi4AtB00p*;5H8*lU00l^Am1ea@mK}Ga_@r`9lsBhbg;F3X4Ya`>P z8#I*w=V&7NrY_jr*5wa#vaE@(rW6Lf*4=d)OihFzzKJ!L4dbs{nYrO8VHO2;k4vpp zxDYP$Aw<2-DTf7G$4mg-#>*{npz<=?DEb~Cm7a;=2oAH2g4}K90oXy!1W&r4MhDX= zip7_#6z=t#3s#g`VhQfg){TYPw7*Y9+Oq}MsULLV3Ist&$*Eo)@oxGYQUj`1<-!lg z%-D|#L*9c#)hSf~8+aY`yeJie3R6~TIRrsd%*-7RuPtixQr5%<&EjC$zn|g)wLuU{ zYj#I9eQ0{i?~b0!ev-G)TpVXlczfC7em&{zmvh*a#H5lYsE02pa-N#zH6jrdUT1(c zzR$@Zt~2WByGW1WemnXVd3NsGWdfVj zX@)gG_`E1%bv%gc4+Usj$Vz+QOe!MP@8)6ZI@(R@qDQHm<)yOd7VaALqoWsRcG*fq z?o3dPUZ1_>X_BWPoN>Rvj7Sy58$^5E9@u{k1*5I`oeB0`+K-0R9cbRw@N&?KwOxru ze@cv`6U-mI`*Bov;S$vR$7|p)_5H}D-N?nPk4DGUrp1~mQ!6RcobZCg+C49>>0Y5b zN_)u~{pqX?xpKSdS^BN&RP?9%qR7<24JN)0w`~~#=<>2&0t7P)C-R}dbi_xnYlJQ% zJo8v}fVU;%cC{?!(fJoBc)>lu`PN1xrt!D$=|C|5Iq5Ehgi^o3INY-x5a}vv96P*# z9{eaKoIP-hTF{iCD?q`^nSC>N(H5TNqDPtCZ`RxxX?z$fTo?~u7IGSka;dcFNNtbZ zs>cN}kMYWWSxU=R*dw?SbXti(9naJm8%N-NU`~P->z2-j^dpFAEXYhFXLMVFSc~#- z7h%qH)}p6II(tOypo#`Td25j5IOMy5InxycFw0mHw3Qy_3QFmZ)8BDTan5i-*Keu| z5~cieU$@gU_HyA#1j=0N8?+y5Jo13fGG~q1b@%|cXPK{W@iJTQlAH^IkO!LSR||l0 z;#7PhbjoPGM+8+~AK|+fo3Lyz5qV7KVz}IANnJG9I0p?6R=0 z52?aJ^tY;piiscsIZ!pVaR(EgSBF71#uC!S)UB+OT?BI0>)wPQ35n6exQCBy zoQbn>9*#NT6+wqCFWWVeShuE>hoM&FyRNwSo^IFF$t&HtJ|pQWZM@KLG!UMc$Aqs) zyc+29osGRRF9B|+TN;39u&8O7VlkTz56bQO^NK!#cfxRblBJ0_0}^;u{kYwfWDu)@As*Cq%9&67oT6|V zGh+B{8Nr|FWtP1v`*Wu^mFj3k&JemWI|5ki9MgmHXH@w*Ws${0%h=Z>mQv-4mEz2! zap}5D1fLxB_>!=0bU)zZ5+Mn8BsNn_Fa+vv}x-zoAO$ilwAPy429At>~j!;)e&PkrCe zBVcYy=PrC|&-f1Ag@`10RbDFaH%S+b%%qZ%WI}$nczv-r2$>3Vzutm=N%Vl+BjUiN z9ZO035{oCi#V9g`kv|mDE6Vou2xC3`&`lzKvMq1WO>c5rSZ~sVy~=_;NS(7eTbsoBZ|!{5!!a(YtSlQg zZ7Hl|THjG+6W)0K%*Z(_--gLgNna>u=6Me6v?P;KC|@ZGsT3|=v2K&Mk_JDlRfdqq z90*)yUI4RxpT^T%V#7lPOa2=GlR#|0AJvaKLO-t8IZ}V6zj8Y0je4uoQE%5foUZyC z{f*OI@78;q9{PYj;PldII?d_LD`E7}KjRiU_Vf53d^eJb6{=+!VK;tuh z=PF+P;sz6I;+-)j!PIeXGxbda=Wbs8Vgj#zG1;V;*3SLrV$;@n&~!3goQF*})7N>7 zSHF0gSHGBTt~U=mFPQ0Omh(BUb+OJoW9B#;%v>|q*<@ZcFFKpeYi6Od#Vj#PoNZ=@ z+2L$AUz@L;9quFUbZ4hs*=1LHaCW=TyK|j=?mYJu=UewRcY$-rUF0ru zzIRu+E1bjbYIn8sgS*CE;~cRoIygVNTih+qF}tFJbKI`z;GD24Iyk=sI|e&BzXm%8 zdpoCsmjy42kikL0!4XbyNN`w0WN>(Jctlk2y5RK@ek+k8Kdiy8q97QphHPzRih*rScBiU~$c3$j z>p{AhVqx3idS&WBRbZ=A9IT!3R|mPOOZAY4`qT)yYD`TKQ&VaQO)F}H{9H_3k#0BY zj{Nk1jYi$=iCoy)TM4zdKXNgEh9cC}u#q&3h9jM8X(Vzoibf+RH_$lb(WE8jnFbYjH{2p)}!gL z_32UAM0$)K$JH5VK^mh4nMFzTBy2K01>1uD0h>rq!~TW-37bN*VeOh}&p;Q2T38>iE2Twq(HgQ{U8)RP+nz|hm*|DmdyC#k-L5oM5iRdP`Ly}iN7NC(c(s=K1SSu)bA8`Bi+A?iAZshxECqjC+6tIlLfVpgQ73 z@e(x>^Tf-PDCUb-sGfLLyhioK0L~V$Zy_HMN2rJRQT#}~#8K44 zp5mA|M!m&xaUA-e#81$l5GSDjS^NzBFXC5(Iw?+4XK_lLqORh!I89x|Z{j!VCVm&c zL;r{P1Nt-K4D_Dxs2h3_Nu8u49lAtD$Oy4O|8BO#ZPr68k^p{BNvp=P#^fs8%| zGWriF;7q{|1AGA6zQMif0m;B&-v$(@xSa}Kmq?k|LauEzsUa< z((O*6ScepQ+Dqr=P3O z5q70oiI`WZRq(S~twz{2Y7J6ctJWgyI<*e^^=borZd4l)!zPuAn765~;qx2y4W9EZ zwF`H#TOB~I4yr@A)9=&|Nact+3e7Qf0(bYbI*CxH)M-5J-_#kz?`elx>j+(nF4CoS zIjW}1>k4$Sj@A{aovx())B#06QFX0#4As;D?NTKj)aYS!td6D18kVAT6p}2&g&s^v`bs?n8Xzk8xkg`uP{Z|b$RqSf z_!*@~(O)dOf_#U*1OD&ScS18sPlBI&^nK7z(bEvagZdG~54?pteOy0|bZ6)%;m7Vf zmS|TYLk{QY=ONG4=za7n`gMd|q!%O3f9ba=SufE`@idm{58&rR{Si|6Sbst(`cu8! zuFaEDbcD)_$4!whNTnVL3@Sk9+!%q!UlVVLRQya0>F?C1+Yu1OGXc7^&foTB$ zjZ9PcY-XBKf@yA=Lz8ThsiJ9NT2MTYXbSwdG%XQBE7J;BTO0Ilz@|V>rmbmzIC3(>%tR_rm?sePEHeu+KV_am>i;nRK&Yq9(?}OsnHpQH3>R3Lngc7pMu}#D zSwM}uXW{LxDeuNV33Tf2XqGz~3&(J*WK27!9f4cvqM(%8PHe?`a zxbxhX;b*@43j6?1QP!=Xn?8_7N{CwfvVvGRa0Z2 z>W)-9*eTcva_3-YsuS!I>`IM--Gbeq=^pGsNx`1Mo|GKy73@VVg1v*N(H4Kh&!8ac zZ}5uX6_gkp92|_WLxMx7e(VPDD!JIDyT3M1^UjIbR>*wKut zqY>KT=>b5@(TtV5F;?!*SlKXE?#);^$XK}w?B$bn*_A|6*L=YBhdUN*kmB@EqJe6VN)oTc0&FdC_Duyd=IYfgG~k&-;aC$mJWdB z90V?JLx+IN8`1Z`k5GI15w;y2rJo`H0;JxKk$OiU_220d`UAEDodIgUMA$`b zItvNx-dQ-pp=3tz)v_S?C{bFJ21+gi>>kC~y@Dt&DnJHehimbA1;*=9jMpnLUXNnD zUWxI#V!W;yulHcQ-iz^iAI9r0(wYiB!~p0TV2$JTrUH`OVL0yK+FwABk+gD zq6y??!1QH+>6=q&ktC9kVzOunxfM`;l(0MARTLKk>sJu%L^~=g+KcwkcMu(b`#Xw` zkUNQPkh_Z>kb8+s;a(>C!R;>w!2dunfhaJ6%Ms5YF$nQoA+CZv6s({ESix{y9RY3- z1#WO1?(}*w66k*vctRy{19*ZGH;J1l25eyr?)_#l4)X0_4w{)mFEEF{gIA0fmXkAP+#3CJ#|PyDBavIxtkju7^vtoH9-sxMiKPRL3drl&8Lq-|nyNbEo$=JgxyQK=?iA-CxJ#X-)P=cIS8$}az?UpL z3W6Oip*a6L;7IY{NWf42Pr;NLf+?-0X8te0mzshveF^;$| z2DOda`L}~d*%ftnLjKyn3-TWS9_r-Z3r=+jIMse|s&B!pBEYPGw*AMzuS)w*`cG0h z|0(||Xioc2Qw9HTU|bc!xFl6jj`Bf{1pBH0_Eic@tTZ@S3^-U>$Wf|1*~6|-}Q7oYQ_8{3H+oXuy`Y|loVzu)tIHU)y;Kt>cm{7Gjo*`aFv$u-wKSS z1v8d-W-QH^v9ttZxfpD!EqF_NFqY1^+C_H(&h84v(u5gH5;K+*W-QH_v7|6#X#&P_ zDdOx4-V)Eer6Kc{X3Se!GH+?dyrn(!mLz?(z8YaId+E&VB~D+fuZ6~Pn3l|8F42G0 ze}&J{dNl6t27LqW=teyTes0z`1K*F;V-faNeJeD#>)YX4wv)_krxUZCIA%N5^kh95 z`LUcQg*i_{JzYk;skEtU>O!t( z>cNlYRF%V=s-bBJjb&C9nOV7EW|d@;kh*17Dhr#6GHpy7=q;Oav#_Zs)75lE43<+x zfm8KCel7*GiZYj(%OG2R6~+9jq8VU-BFyFHa^z=_84P)d83Oq#aIGljS{1>yZi8%D zRwZUxidmLsmeqqf7Y^3Ueoq?THGjKR?1Xq6zoP_?5 zz#q_f0gq~13PN>V=}M~UR&xDR-;Hr&sGl3_#)65}b-_H`CTG59e1!hnEJX`x>rI!!W}_1+;Q$5xH`$b2m1Tn z`=OcYPK9QgI}QFHavy@mvd0wnQSinT_X!s)1MKlBxRyP(17mz1?p*f;@W7YA8&kj- zU!zvc7~8n-xc{Zj?#J%O(64Ymhr8NEj|}#>p4z%!xnF^KZgMwK7k8(-6Z(VhLAWQ} z6NvMqdy+c1r`%K2(LL>+rq0YH+cA@@7Q7^Q38gS^Y{R^Ajh%xdgCi*}I4U?Ap~eKqP_y7I!CR<+l!#->sI*zaP$gL@+OSE?0zD)toBA{k7z>vvZfop2*qOG*5Dt9T|r z;eS*VvF-k!cfc7{o&a^7)ompAq7>+|JG<7loqM~U86{{Fl# zBjx@)2fsu3IGO*K@bhnwvJU?i#UvJS23um0LKWX6{5dHXyb@m_<2dX8qP)WyDEHZC$`YLEeUIk-Y?xz-dcNz1w z=Vx6(ExayXg4aEKKK0zzT0)3X2rV^E{j zJ`tWZ6q*5?KI2iQm&^jpxwj078FQj!_z0YH99c}EXVWF3-JR+s@LSqu&p0RhyhI9k z+w7amv#m(X-iC1h$oCwc(N|a#u+KTYXQqs>p_T1(&8I)NxO1EI@cd-Y@xP(@tpit> zw95^N5&iyBDMvYB>UVl-a_S;@oAh@a;36@;QgfH(!P87x;~4iy<#e zpL0dYf_AJa)IUb-d(C`OvV`AseyJ8vud}zv=eBMUx9Fc0warCKVr!KBpT#+0iTwUA zTVGcv{ydc zb536=60LNeKD|A8KZ|0Q=Mb)y8EB|*;fhzD3%wUuNgKRfi}mdKS_PukaPMc|1owU6 zRXVEDS^C04<>7*@vvxk)>B6@g=NNB}@(e7Vex=0kCbJ(YUU@FGDS?rxf^l)ap%xc8 zL7V5c;DcMeue|x;v-DVbow@=>f)atfCs~vca;eb&+O?e5E9a%Nux;s_iy84$@3#E# z68z@*52iDP85hg;cFwVl%CGG#9-Ar`YNfL8t&^7tuc}bs|7Op@B&2ikv-H2+bLoop zuk4aA#VF}TOK(niWbZY8P z@WEBA3bcsHOZsen1z=Pvxi7My`-6=wi82 zuBNtjUu^2Yvwk|-eX*&N+$^`yB{EfRqb_!LZ0crr$EF@~pWH{iWt#k+`p6^lIQ5gi z$=_&@JR?22!tRbuSMqG2A$E6cy2>f*MA1;EyiGTkTHAberAjn8ultG3DrQF)=Z5G(Dzs z%wOrrnA>6=rlm2nViwSbn0I5A)1jEn0YN|6U5`bzK)b+bQP=KwEcykW4$Kup?0(1M zI=kPo7-{!A7NhKb$6~DA?^xVw_d6DM*!_;h-|T+JVuIc8SWLG29g7)uzhg1eE$v2& zC+$wh;#oJwjT6t=J&whEx0c&LEU2wZs@})e>Wn5&eOXGUB46+mKzKE;Z?j%12>z@VIzZ;HB;bs6I_&FT+fG3!^C!}*v zmqBMek~r|O-_Js@sHpww}ZEQ1jqB>GjqAm%;BoJY%&I(Gao$XD%ANGat*xtbMiT~ z&eU{y+?Qs6FHNGm$UniOvbaZSxknkfM@{GYI+`#I{3?^H>? zF+Cg&;AuwgX*0mn?tpr7z~A)T-!i$sC4;|>!to>Ux>W9U3%J)U;9fU{d)*Z9y3gQv z6@0IN`yS!Gmk7T1I7&8F8Y|H>;}gc!DAo8hcw-Xx#)aG)i@_U@pasU?f=@2y+KGFN zSHLqd^GuY$evceYF_oJhMJeo8$x(snX;VE{R43J@)M>B z$TJnkou_E9(>9L5KXa<~TdXL$37R^N2?03`QTEG-IKbPjh`FS)C&d;a$Q2zqD0KP4t z1yFMly&KLjO-LRf&Jw8kK6)QqRYFT3&r~9d=mYctG#`-Y5oD(2v>fT_qx4ZUomS8a z#C~~wCAy0~P9H~Ew30rFv~(3+1tp)NPrz4_J_F~UqtC%{JzWo10e(UL zMfxJ-H`C2f!xq|vjI^0rP$q4qt?+FdZG(DVp|3!`owh@s=}!u&joOeI@DBXQ{J!~p zWCGOt1oD^6m(g5?eP}9R-#E%N|IPdbG9rSfaHVfCSNbmCO5b9x^u32GeedN;-^E<% zyM!x!@8L?{d%4ngF<1I7;Y#0PuJpZ=D}C?cO5Y-`^j*Z2zISq^?_FH!Tf~*Vi@4Ia zfGd3$a;0wpSNbmGO5Xym^j*kRyi@-hMl*Dt@?X$-3diMSj?0>_ahd6QlQ|0KkTOyR zSirEjkUT;j0n}iKoXrurggix_LiclAzMJE64yh%zP@bW4Az4G#K>26LTEHEK)Y)Vm zSr6qIUf=ySUO!Ks2h9Dis9jI$zsBw)(m=is`L7WCMY0+449Anm4*$MHm>5CxbH(<0B{*sbN*t>xIQ=h!`uV|Om;CfyLR7-~=Fy5#9x zm#pQw9fEuiDB^()Q=OsW_pmeT^PD@Bk&_JGH_soPTfZgd_Aw82LxQ-*Zfg|`_ zj^ODDGZJQ?l!SD^@pO*ksR=s3@$>{E;CMRVcm^DqmO7Pdsb?l+CCr914B6AUt~xDY zF5r7Q$9DtQSl`Dr)>94NHhdc;@Et-^_zs~dT;G;#_{8uD$_A_-LrI1!hAVJnD1V3H zbHnFQe%vq)$1e$$dalx&0U1;sQIrMhOX9MD!xaMybNBMkO zNbiL6O#e5F>;E!2)@RXs>Ag^L31GdMqx^iX1lx|}YDc3039 zaGu40bdLV%^fCGv92xrO0q#Emd8Qyt1@y0mJkt@*`O% zZR!aolW$3~bX2-3SIQ^lN+nrYF6~j)D?z14+M}kZnQER~rxr_5>403SBqdT9DT&lX+9J_NcceISA#ydE8eI&Z+Gu06 zJ?f6`jP8zBM#dwBa7_@l}T4ahvl5mh>KxGT0Mo*tWwHnRST4aLsKjnV3OUNkjc9NNc5BGdAGyp&Ha}VxZHVsUz1tp*M^zZd!bo1EFxnSM zjGT)mMV3WV!;_J%(eg-k6h({R+m!J3@af3Ws3Wo}+#eOgyCUh49ntD&U1U6ZIC?yK zGCCaD5N(c}ikyj-M%P8wM)rWUoCRyz4ELAB?>R2-mPg^)^vZhmg3_a0QYMufs!=)t zma!9hYiFnq+8qp^jU`7;M6;q7V`;HPF%nx6TN=}cDx)LOYq5gRXxOT*jLUH$bR4Xp z3~XvFoE$cX3&L}trb;zMt_xR$mxq$V>q7&OE`pV$g+{y;aTouxW zPKJg<6JdRLNqDJDL)T*7cw4kKRu!v=ZHjG)g=4#7J+a={>DZ;%jo1|!{S-EO@n!Ms z_^NnKd~57_?0Tdvwmo(byk~8EWsHP-pwGb;V#{Nz!4E2-pL1fCm^C&SI~z}oXGSt( zN2G4>zWvfE>86}2=g9eT5%f&8>XP=zZZ#@jl!xV8>QVKKx=L{>US*@QMX}1Y;I~%g zw3;2#!kCwUPhU{$;c=Q@N`<~GCWsVI5*NA zuL0!3y8B`7|5Ltu6roN?n7>zr@O`5R$dBSE5p|$P3cL|-M33MG+U+&>?s!=NytlBfR1T2nk4j=CRvk=-qxgOQqW0FswNe^qnWAEp&^Y?V?ysH zT}`@*{xB_dS}HoN{e$)o=soR++7Hng9oAv=zHX{+DjL!0bq4f-&aAr)eaLqweZ==A zo!95-=c7OIcO`tRFVf$IKGEN;zZZSV-+*w1?-8_7>-z8O8_~Fai@pin)LZlxG^u}0{~G$I{$2erM*8>kUt+>`px^~;2MR7=yG!sw zwxa|Wvb`kuPPU5#7a1}P8Tc-?-ySbA%r`8+ceDK&Z_dcpJpwg88khFgI#Wnc%J^Wp%op*yey^W1qj0`uJY zI7%1Ng*XPR=Pn#)b6fl)nAMiz?eszV9R3L~j*a*zeSyA!Ptfnv@8h@WOY|jtlDPh~t!9%OqE$nuP}8SBZz85=S-l8TJ_jPH{tGG5Ghkvx_0Qbr@Gp7r>wO0qgL zm>C4?#-ti%Zj7yDBMm~^YX9F4rqTt7W-Kn0LS$$J>>2=+83m4F_T?!RfHf6>eqkX= z>G5ra7&xd5DQDrDt8h&gToad%15S>~w;)1R$;0l;fJ{9~E_|1&++cO9>8cT;DWD?6 z)d6`_y3A_!2BF?GWs_VjB&jRa8fB0nrZNe9snDP6JF2cyx5Cvo;rbow0l8E?Bv%3w zUx50}viSA2NkS5En_6X1PKC(j4v8U^N3VTqcW6M}56GG2zRaFSy$Og~1k9&QsR~s? zd&>ad>lkLkJvS(;m0lr9xF}pymdZ%F2{@~Th>#^L2HY%D)<9IRliOtnpzC3IRG9<) zQUw@mfk<$P-9PlrYT$CGmGgkW>y#@jk^s{f0d!vk{GftImVNSWPaj9;jnEgR(gkQ? zLfIv|p}l^H%%xDX6{5@#JRO0EutjkKSG)*iwen6G*pjk@#Sl43wL?5{sU_+PHBrr0 z>p9YIh6u4cL?OO(t4E=y&Ot1>td29bsT>Sx<)l!KG6XDe9q_^SkV8EaN`(kBpq}wo zsb^#ndJh4c>x1Z4iR*NOSpH!E#X@q^GW~yc?YSm2BOhav&>6+>270nFI4AibMXbk9w znujzGA*=SM+MgnucCU6XvhzK(9XgXP137f{x&Z3Z{YdvC^b6e%-44{N`#0S#^zXWE z-EQ<6f74ID?tpFp{ffWQXFzvEH-ui-eXRQ!4eCw$+2}3(q<#_&vlp?UKNyICpwkBU zhu$+#14U%dld}eyy{(WYYvCc3Ygk!eag%h?B0ccXONohpq;*Idh`uK5OL%8lhedLxxlsDbI=`!(oRl?Q^}Uk%h%-_@}!ck7?onUdRRK{s#2E0^>d^N zWtCE+Y!FjfP3&5Cs@$U-QclQ&?g{0baskq1<*IAFC#;Oi1xkss!{v2Vu;)>>Dt4t? zUZNb3Ey__BkuA;>uI29C?mpS#S}t4Vez@z6@+NtUbW$32t%ql0Pd6$Jd$!9KX@d2P zOhlF4zg)rl#Vc=gFLqV1`A5m&(iK)$$s5DYU@;o+F#( z?a~Ca5tN6dYwkvODzx0=yZ|-#x;9GJ#NlnHJOwWAwrqEuyG{;6eaZ3?s54d8OJmSy z>!mR{m){vAB@ybmB(GQUq_qPeEUJ zl~c-odAoAXeNhnYQh(%L2Ws!rfLukDq~YUhi&DR=Vqy%}U$0%gP?8 zwH|uC7c7YA761zT3j_WKVn9;elo5sjct83cLbm1q`uuSYq!FtcDWX13mU&V5zfM zO6s~LWl5z{tyJgEkyL57v`-oU#J}h=yLw$_r!1$*<}OvL<0wU(`{5eYbqkKAk{inJ zgwo|*4K6dodtUOQvsfms9^rb>-g!m57IXy$ZTX#7?EOK(UmsZNXb#HmeE+zkUEuA@ zxh|(v>fGDmYN?Q?}$>vEOLEU$L;O69Cod5vtAM!I&3wYIU~R)4zfWN^P253YjR z+k~*K(%x^s0#D!Q5XIrZjlfXwvfUZDZo3w|YReCf2X6-Lwsk&L9O&HDdBaW|WAKc`Y0Bu*xX6Ugc!S29$d%vUI-qX>7h;X=WJR z6?YGd?Y05&V#iHqVPK7aZ6N5(gwZ+-F)1#(?L9D3lkm5rLk{c`uGorT)F#Cde>9*M zuLahN!{TVbDXt5IgNcDlj;xNTIOZSUwn9pk3nVIO;rVi;e5tH!OiF^WZIqg&INWU? z#4Q-vZTle>B}h?5geS#r3*THs#RIX5`6#M+LdaL=~_ zB(TU^>=*+(Jq~tyFmS$ON5_6~pT9o11A1$RW5Q*IRw(;Gz00?CJ2yxp5Z}sOz2Y^O zQ?8Kq1&=y214F_VWm)im7`OL#bUWg~Q^9kc`cCs#HUL&o5!@dv5gUVhf_nl>gKZs` zZI!{xLKu9ZR@~a6TvfLbMQjPQOAfJR#IHOEZWP?Z99Oc^hglb zB*(U8@SLZaRme;zFezVWJfv$vJ}aMU^^$_-fsnxg{t5xsOvaGAZH;%AAd3Q zDxePdqXWh~E~<_!dr%y(Uje`B0cP+3?!~n;$!$2 z(%`r7TPO*?gWo|@@Voe3l#JiQ@1d#q1N;F>!RPULG>tfk6QvRtaiQr6g$acyE%DXF zSJ8~bpC$eRr6=|!_90W^>BO^$CZ0Y^B-+9`X zwJ)P$ZIiYM-J@;MwxGq@R&6V~SNn?g6|_YAL+uaIeOjB=hDx*@+75KTwo}`QN_7wF z9z+l5p3*&qmg>H#`zCr&SEH*z%XGE6TJ#Ow8r>RHrdz99iyqRg)2&0xb?bHO(Zjk8 zx(#TB?z_70qDKtBHvAfu8(ufOjvh6o7~V9zi5@fj#_$`o((qfuZ_(q1V}@g> z((pUO@6Z#5w+!!~D#Py$XVEv!hs=l2bLPY5!)U$vi1`Tmj`^thDB55?Za$8lHxHTz zQQfRNXBDCE{%bw&U+a1QTF?96y`Gn}DQWBfoxQ*8W}k!wo;+KDqt{m8sqxfXMm;VY zv0bvS^qlaVaU8Ucc#*Zb$o29Pxh;_sx+tQ%a0c*MApyxuzIyiGv z$n$2|PJ4?ijh>@Iy|>zS!&~QV7WNA#n#00PKlSXe6nSf#8vM1M&HlQkX3rUCk+;ZO z-E_^nPU!ZwTg$x-t(TzeWp7#6WXo3XZr{PC-Trp#fIr?^)$A1e{W+r5rgs#GXZ`J- zJ>m^e?vEOmlQ!H9L$JyOCZ}PVXGOYtm4VDpWs>1^JekPFZ$#afct9_eVGJRHy>hs#| zz98J4>#KWn^!kQ;=R4Gnlg-zCS2~V&oNPJayWU#W(&iC-lRk^@bms=wRvYnc_x1YD zdNw#mTx~*LQ)<&STbiZOC0mNbrQ-6=adC~fzB%l_DBQH2wlw-1gmlkl(JDHdH+G$F z=@z}7JubT#6vJJUo#_^2yCJR?H+icqqUEGjbY=SvTKk%IJ16|{E_0yRQz#C09)c(8 zhv%uW4m5AEj085jQUWQ$iGV%eYSIRTfZQ|@*x{|UU22Luhgmmr*O{h1e`8a#u%WfrUgA}| z^ukJ^-d^Hw?&|S6TCM)9uCva8mdpMee?wP+;PQ?*CT+>yQK%2R!BS)`6Y^|9Z==6j zSm8|-gw8Y0oz}iUdXw9-TQs|Bnm39)UAc}WT|HuN^CjjJ;%Tt-E3TuS9j%M})s~Z8 zz0F&krOr}IQp;t_I&qh0l`ZHwDxP1rZi824^`O;x)%8_ z+R{4PgiObB&rR=0Yky06(_vqawNE_K&$ku0qGE-RDP(%GoyRS=gf^kg z>2?_fqqxXB3Mf=2)L2f6maa4*TU;Vmi5o4A;uc|*P;5&MthJFqVW0%A?snF}D6F)U zb+&c3H93UBKs2xle0sZO!kQ1Z+}61w(A~N;uq?2`*%zpHEO9mqg+j5jw#m_|w-mKx zTT_M2&fR{8AbV@OCT$g7w{WzJ`1kqU-ous&i^HGaw7aXvf81Z>U*{e64-0Es=Xj4d zPYTPt7n`oR3IR2C3VUD__Idl*H{Mda-0Ji%_KM#2&f?CkLewudZxl*wRhBwIu%&^I zRtP)1BhFF(ZqHH6h+h@XHC+@g2v=Pzo5RiE;r;>t;g)XK27jr)%o}%>`A_;soQ;+- zhOYimzzD(7-#P9t_vUwwTg!z5!YO|e_*K+(#&uNKD%iaP&QbfgAA#jmdK>(y&I!>9 zeN^ZY*cxBr>xl;;(y+Htu{|znzyPPBJV+UQjnB+i_hz9-A!YK_z1#TeUKU^7o5NT4 zZs+TI*~o@G=nmvV3Mxb)V59c}7kw2yfcBwZprz;#q-DTG2hle;8-0lXV#adxdvppt z%$eyUoSBw$X8I_98*c?p#A#?HP6r1U*O!cfpgDI zoO`~=S?6Zl0etf%ya)K^5BNIc%Y2@sX{x+Du}<`oL%lEeiB5- zV0surZ}C;gclavg$9xs?Q@;LqnH(m^(Vxj6FwpD3Krf&P#yxQ=CepoY2GZR0e(P?zJQe)7V@Dpq`6R%N0hi_}lCap?Hn1Ubh85quZ)$#T#|6=sNHwU8gR9UuJ8d*v?izaR*!d z#GP#Q6T8^&8{loaBf7V+TlbD`2nX5fCzkaleFj$av-Fubtk2TV#Zln41$d{vP+x>! z)i2T);~xEDeF@&nxGmn#xGjE-z1Z^0sb8mGhx^(4DDkh@J1Fr1{Y&~r{5t#f zBK(HFMcXHS9KN+r)JAvo^jXc0~kED#P z@REnv3NKmCR(Q$7jQ^4qjQ^5H82=^ZjQ^5H*~%}eU@O1mF}CtcR+X_P!`I&V5p*0D8W@*G9!8F>%sCOX-8eLBByCCN8#Hh4`2zkOXKYeToE`4v>Ut4gD60 zFa;oq(P!whB+j&d$| zwb9=BtrnS5AE6v3gb>0}%27fH$GIv;DIu5;!izDlgJmIPEF)>P*dV0UnpawBfA4Bn zKg>`{DMu*hV?3OXaTy=w2&I%#*T=XFVJLMtLLH89gm4^X2qly_97p@?lQ!?Qo#wym zOgiuEEYc%A&pyAt-{<*!KF_0vKTY3A|5J1?{RaT29|N3TANQ-DZTRemai0S?y(#YV z+BxxYx!Os8alih#`p-4QHipsw0b^PV{bo#gY9ay?7?Hs{J_P=_g&5Tu9 zpp(>iwMsGjab;5N_1AhP)R#=MnjS`}Lp7bM261MzSoE47_XPd8Y5_4`smn}qa5s_` z$&XY<8Y4ucC(<98j4VYqBRi3!Xks)yS`xKH$tV{MMSG(Ik<94J=u~tz`Ua%Q0cp%2 z%?yaY9yyAfM@~WP+MmUYrbo6Vs!XNCZ6761yIqij~GH7;89>uTji&Qg{Mj z{W(|Z9e_&RvD8}!FQ_ypAWF#Oby3md`)cNw`Fstc?~lKpt_II!-S2(N^3u1l4k<+ zWg4C2I#GMwS!%kPr9NY<>MT{QUbse8L@fxXMhp>9#z=jn2K0{=)X*2LiZGyWM81ON(B_ zl48|>^&J3PN2o<5O*vJIgIl3#aXP#gK2&2rvjH_-*$KZ_%IMMXi|`A@{P?J23tGt< z@P!?5P<8P&DiYCChn?-=>F{Czi$HY0_+4Nr(68(>=9n7Y0QS}rONhCFRrJN40=pQE zOvYAX+p#sxDnM;#pJc`^L0bZz6MGkX7g>r8#wKDFj<&Ji##pkvk(F0PKx6-bc`mjD% zdFP_D-b1>J@G5fGaUq^jxl#htC*`?kq}!6oeuU$mU2mlyljb@Xr8OzY^m(R;7xqnJ z4yWvCzQWKOZ^YFqW70d{wzu8IIS?gJuECyq_0&uIrZ+8E)BZlRK{kX)Rtj;Q+c*^( z_C{oLN2Y8AY4+MDd~04w$?%RSCfgv1D-RvD(ze{_*pi3H6!(bJ>daTIDnTw2L2siv z1ajUcD%=bq_zu-o4@cHI4IYvVk;i1r)=iA6WonID?lD?I*TvYn?6XJab*$ zcN(No^|_lg~rJgVnulkKG}32-$i#=YUKM89k)8l1wLFki8$h!LyWYdm4E`?2*IXGIG~hZyR(VjuIu0 zn8V(MHbQv&d;5`HZ(k+L?av>VV((PL<7&I1vnAx}-1h3Vo_CMnRXDEZWAB{?YSw8W zQyg3F5ppY>t6IGhJ&c#L21h(mK?HwRKhUEF>@|@}#;`+ggg&5;Lsj%!;x#ozbb+#6 zCEVT!S*!ImYrrOm)UeTMAcSzOuh5$r*dv1S4tXq}+sl+xc}aO^KM#$`3-S@!E1x=! zl|@@n#=Mm{Zkr(HY+a#a#*XcI`^gltz(Yx|l@|5LUM8vbGRLtx?x_mxb}$l($3M=n zt$EU!KHn(0K?u^In~|>D38~b-sab{NmF6+hQ^F)o1KR;sAuam49L3}_$Hhl)K3ewn zNU2hWWS1U#5+#8umin}?e_yJTM(z7jx6dTKld{DNDan2$t$cKVwK(g^bg58kkzRbX zMea(~&SYn@1Cb`A3R|D!z<%o4wQqu}{&AtFO18>+S??_hy_MdzPY^58iIOe%d&ZO& z2N@a$p7km;MeIrM<%qwGSPQ*TQlyAKZ=F6d@45BLHKLzn>Yo0v(Y=>{vt#v_Rekly3%bw#ReU_UIS4jsh|fulneXx5quA`s@ak33O|g>;wKq2C6fL~^T>6z)t`XSA^Yh@MiHyz^?l-4I4pOs!NKi5Kd*cgAV;koGjST^&-_Jyo`D zDug}t**nfviJB$W$O2cnx=B3rP~mvu(%Gm+fENx*CuFauiWtR`FjdWN{x+;5}&5O6}jNNeP~Etk03_ zI}D{$th@- zhMWd(8HlwfH!AN{y>h7*ksJORRw712FP(;PYnW7X+TTCU2Jt4b3|sJVHu3s#A(o^h zc^d3`-(g@boX+Nl3$SVI1@^+ROg!|LVJp~nxJo^>b=$hVX=;r!>g@re=4`kecx--P zFI=LWgh5-VHI8F2QVZdfa8|g1jFG)T#&(IB0(;(}$Jtntdn8v z0Y-+gOP32%R}Oi`6VP{WA72v~c}U;oh?VvbC)4a$VvPd3OSa=rE)St4E11I{Dq zy8N7sm#>n;9-}-%hJg3>*}9n^F)h8rR)EEf5-Y?>=sq-TvsUb9=1QnH>#VP49 zH0;U>jS<_jIn*nc**8P8&KyUHBi>_ilmIr8tlQLWB8cw$y6+=8{e=Dx0f(8^&m!^q zdHoXdEBaOacaU`b_w?UGGWCC=|3310{SWlJNVfjZ^@m6fU^_=hUJB?uKjm{Z-grS9muKfLQZ9ZoT>?ODl_uufKxR?PSpZA)qTLJehslgHbp}=#X>g4K{mxh zHYGqdB|*?N6P`0d(T*(`ZHY-)atLJhv=d1??J`h zfc`iR(fyXjopfJ=D*ZjE(m&9+ldctN^)`(==`g6(KfI#5@)_MDsL2aZlNU9nq?4dB zFGFQM1eJLOD)TB-=EG2#k6gQU?bEvGwa;A3(sgUQkahh~fuGZMA?yAP)Zyo$4*v@3 z@PDN3Le?#4yO4GNUfYGNTZB6NAE$mMwM@4THTH9;vHyj}sdN`mY5z;8v|pw^NVVzy zo5rkAH1$y`hsJ5TI{H~nS4T56T^;>gYJX}!nyK+C^z*5!pGMIvjZLB7(AX5(sHy1a z9Zf|??`k{>HETQyZPs`c+M@9&^uETUP&d@lJ%C4j3nidV{!gJ!{!NV|p}!9m@|RE{ z{{yIyPe6tIUqFR?5-Q|>2o>@vsE~gPD&*5pA^(@!-e`12+Z&C32kPGc3F_YOpzi%W zsC#c}d!x}m`OH~*Cb|V!R&LxCjb+6pYAh@6QyR;POVU_Y+~3kzR$MY*S+=-e)%aE1 zKhXG9+*dSy6<4Y8tGF8)zly8U_*L9j)49*a#Z?0q^kLi*;6G&CccE_lQ>YtXAUa*C zZunzXb7%3F?*4@uw|gz9B604OyBv5$-EZ#tz~5KF82D_Km=97QG}&PWq4B0-PcDK! z(g%Ye^t34lyrS-bAPz#kcPoQN5Q;dCK}c$fcd!3H8clz$pI1r}pd+1qT({YrL%ea)`0YZyt-)9W1* zkBF{3`ZQQ*4S_Uc%y7^i3*5Yba|Y5Bf;3M-{MW*^a022P z#2OHD2*gYl3PnOftQ1{D8@T6mB{$xg*lDC|=z8poo21R$Jhwz!xz$JGS~)rsov1_N z)@h8}qzO)Y{)Ln!6$sVhj?gESfIQZua;-#Ctym-(L89U*NfwBxpQ$n>gE3`-((yp8!>V>}lQI1rxUk=KB z;;K9)_a=U|p~)xYv|uj;2?MiY~?ig z@DawkgNrr`z0cmpTntH{2P>EXU|AXLT1RT|grVqUI*rbxa{_O>@;ZSP0{iKv7g&4n zdeDTC>~y<@X<$NJvXCGoiRVH#w2JFOsc>7Y6im>fRAEk-7S_b8z@7|Zy@-hs@kr}G zaLtP|;-wd7cNDs$OwbNJCG_{2nwTtjdn|5*LKi3z$7wRc7Z5n@L(wu z>wFUw93%H@m{)8nXMH#ge4>TzbFFqJvU85i`;}%Fcf_4@3$!E}K%KHBO5%XMHOX_V5XVu=LS_U3*~C@qxCX93$Qr*r7%d@XNbUvR6uOS3&b#K-snM;iZ< ze;Lf6y47y^`KY2hy2zA)~^eI4M`lrO*xqS(OK6w>&M+$?xO}xk8wbj^!jdPZ*RZ zq$>VQJ`^5`25DFt1NQn6O~oCQ&~`%!!6 z0jqwr8hjcYrLWTZwu80apRD45O9VWww|D z=8WrM-Z0BtBZqPA*zCg$c94Aem`gCM()03M*~~7gJ1&l zl9^%?*gW<+Yhr`!3De5Bf^%FY)61fqk9`qX4(tM7vjlJdYzzi*!T1}@2BYtaHu84H zYzOoy11x|^2P28av46jkslDGX8J|vTBftLJ`u_lb)9OQHL_51(L%$gi{boY+`)d&W zW<&J*w;}q?h3NO!A^OdO=rDhJG0!UOPm*9QsG- zw~+z3|KxWyG>d#oL$k=g($Fk2tD#xsUu$R1G@NY835%bq-F!8`YDK1^C43G0z|3>5UG9upKCZ%_ZJ$@ME?%l1@Q&A3!(t-g7_lb z1yQKsO!P|{&P0neoQY0pI1~MMP(A+vRL_41u*)Fw>|+G;LF@l<|3VzsR6$oDaZRR% z6S^8fKiZ|Mz~3#p7JQaVm(ax^v`W__aUU(w`QR08N}}sPXpYVRujofpbS?Lh@Z6%~96v47)AixxBr~c<1cZnCl`K{F!A;^rWh-4UB@`a!nE3s9eR*YGM!^Tq3dae?x%-nt9`oF07lG2rUam@ z2729o;#jyhb*IajVX3rW%ouO6?A$A06Yv`Qp>q&>X`18TcI26!ei&b$au0X9akIIK z$D4-ubY~Ku%TSie&MnIha{zmm?9iKc?_7$EgK0|?dyJB;+_}gtSazEF#naXujFPh0#d~M?s(2M25_7OK zv8<^_Bt&0ZVgq9-0(0@acqE=miQ*7;21aI=RIIfRd1{m%v^ey)CKv>?&vP&$gVt#U za|AnRG2Gq7%FSEsDAUTmu&*?;2-VI#b1Rl> z-?LzX314*!ra63Fu($3A5ATKW9l^~4#K6A8_q94XE1KPHwfL%e*H(V#(!p5HwHiqc zwsNE7Tm(4c)Vb(MV;4V6acts6&N(^_%-Q+}E!@?+E-dDl0oY|hE3sBaIuk2zZsBH_ zR&J>QU`%cYAgm+PNoyl_%AK>9Tt9y5EVa+^2v-kgjUjrR8)p!1^4=7_gEQ7)LA79Q z@y@!ol$$+ws@n?i2q^gi|JIq&R?FjjqPa@gGtIRY371x5TdQNFxv&if{Z_-LG#7pt zul0OeZd-|EM>uRXIA6CJ&77!j8gDbUUr4UDT8R{Eq!@M#=Jp<~wy=Jg;wjtGG0iT@ zNe;%g3+Cu-Ij^}3%+%Ly$4&jxag(8`U+ZgWR(k7@0O~|-67MS!+7I!K8rtN&RD>n%vm?j zohGM%w~J{_p>tZJGuOje1sX3#`AT~PmqS@%vEE(Y5AzL|MQ>)^BgH^L+36auo zt=(+}o>?Q-ILxAft`Q^jyf{wpJGaG27;dL~0Qaf^>}pBM1*{-h%x_DS;v1H3*)`u5 zD*;d21mnz^RB|uI76QJ6HTB;ry;TaVX$Rn9Nh)w&zgK*3%cuVp3vW3nU{4?k4&KUljdBwbOCs}d42CsCwT{~LeYZu#%*9-QW3)&^LuzR2; znObd~*PV;^iXR9~)~3b|lVri4vu=Q+CWJbGmun>>+Xb-TG?!yKu^7xQ_Jm93(zty4 zierW|&_wV(z-K;A;(Bbywqw8!pL44Xn0bI}=Lq{8z@L?z88E|ju8~e=koH%=uMgSx z+yc{TIsqIi({s+%a8@n?5S@!F6Grh$;GHHu2Kelt@WNuS?_r6;TwA%Y=-d`ogf-x` zIAE>sgcHlTWv2}hy7_0qgzFqIiTA=Z7^Rb(rLG<4Yk;DwUHj%LOC>&2|4Mk;mep3= zoNYdERH-_1uG&n+CQ8uo4OeQviWqv!h|}v026DV>zNC_oY@i*JeBMqzF?F*X|`j45aRU5`eOvq|5*QHM0f4R zwHt8f&nKGqCz|&sn)fe}=8g0Mzxp}8FJJrl{R=rrZK1ybiEEtqB!E}6Hp>GzLv4D~ z0r>2N`_x|vLRZaGAT;dWBRB-L?)b}*IKt;I_XD=_^&{^N_)c&y`7;r;k!oToTzg#C$GfM?bN}kC`@QBNx8#nvhZ+~%OZB&JWSa6nNcE(+mpsLua*ylQ zh{t8B^b9wR8LOHOJa0V9cUw#ZNW-`zCM!s@Z^|ce_mU~+4v6WY%%fUNPr1q3RO~PF z*Z3p;b^nh4ltQRPeyB4&$2hoRCZ&%iXu*`5aQB%)tgUkQM=SJbw*jJ3u-u!Kv99z z=Aq_%w{&wOP}sQW_0?`Poi*ipc0I+~)3xWhBj9<9WUgm9aQnt8Sqm;BX{oc`nI~IG zJdj5smR9qq))w9w?T_DNhvedel zZuAE-ZuK`eHcoh4?j>urXR2w;WAU{#KJ-T_(dPU*t2^R5G+EsvpnMA+SM3Jq(W^$T zu}-VAr$lS>X0ylQHke1XI)l`&JgnE+JBA}OYsbT*TXBOtJ1? zr*i$9RJ`xfQ|vEtPrA?jmEd!$AM-EySN;1`f&aOG9M~4Ti1*DifoyGE-kV8m6NlcM zKxv)z*2v9``su*++Kt9MQ(054cf_CU#sbye9j%A%w%l#G6Y))dWA?^sJ?dTeuAB0^ zhDK5 zduN7v>96;<`+F$zXO<0ZdLGnw$G_m!+a-9GT-CL&K{a6LukRcwMBC2sB}4^R5fTB{ zZy+(G2RvK*?b+XlGyHFX8U77Y3TF95kefEcm%$nSAHrXneOag1T|vGA&!f5lXWA+_ z(^}zqRIO+Q`W3{6-av044)m+&R}l>T8d`%m(GSoMkT$d)tw$cBchS4ZBeV%^LfYY+ z+yUq0F8Ir_82sf}4?Mr>AHm;`^}_S3{t3E(E+D^+ei!{NGKl^V{UP#AsNW4i{qCQ^ z|MD@6o}#D7@1Q?He}X)P3f=F5xmS;jz*DbA;i*@@2T#3ve&thFl9AuPl6vLS$Upz@ z?45sHTWOu|&p8R1iVR{%*$@JQA%u{U5RwqWk5ULfrlk}pQpy06-w7ljCYj1qT-EHc>J+wCB?!>tt&8N^yEBGz8E){5OOTf4~C+8ry4c%Sn*jGghNbM=q= zy58M#Ue7z<=X;*>oaguRea`Ff9PD@Xci8Xh0`|Ll75iOHV85#`v;PA|UBs?euVL4# zA7j_6+t~H$C)oAsr`YxCE_S{8N9=la54&Fd47*;vLFQf=^(&EFB&T^Ig(!*Ui&UZ% zS|CalrPA*b=|nm@RAeIa^Sdz{hm(2OM!yID<@H`sv#6OCie3`EL`RB_i#|+?L?01# z&{25CC&4qm7(C;X;u#;AlSNB(9RADeId-2d`hDy^TeOVbXNyi?_t~Q5>^@s`;_lDw z{v55?{rTNrpp$lw?*1aJ+WpGzSLl@8XLp~a)w?h3ewEg+Gc&Da_u`@ryYKD3M;qCh zna*HmX4=Hg%ycF@1JhaT3`}RUGccXQ&cO6ub_S+vup^fRJ91gEBbN<3a@nyXmjgR; zImKb(Fxt<4or4ar|4Bs$*`3zum&BhHpQb+~J|iBcUlzY2euZume@Xl$`Xk~C;#cW* z@t4Jubcgsg@oRLa__BDK{+M`1JVSShUl+ele?q(%v*92${A5l{k9eDV$9dde6D%b2a;4uFEFr!Uzk{$aNal8buD?2% zLwv?yCGlzf`~527Q<88zzs#S7@RFd4_(cAcpqTi=0^7tV@W%zEZyP@GQ1Sj~nk?=4@+j0lJV zia>SXTwpq|7+57Ph4@+Dm6o|cXD~EyEYKL#1WcwiHVvkh;y9Bc!<->3?9QDqtsU)Q zQ($Z-X=pSlGH3F`54Yx-%SZDI&3WdUg3+Von!IMybou?@>EK9kJa|4J3FHPX!Arrs z;5>=3G&ACWu({o&IH)le7nlz#56)M#u(7l8nJxL@7m#-YS&*t{X?ff}Y zOMo$+$em*Iyf2h3^L?ciCFu_h%WR(W!w+08xOVVFhPkNbfUxko|Gxi0!R>wb%#}wL z%)Y|zBeh3t1>z(9W*Nz&@W7c2vq|A!_TSCe3hXjwWsDYw9qsXN<<1>#HT9926Ph>8 zn}*w&l}EY`T+A>VvkFusH=;m%AeYosbzqIui-nY9OQ0~Y7E}`Ig08^BU~%AjU@YkS zU_`JdcrrMMnmrdd7vu+~0_*-a%8dulAG}nyNv>1`OeC&zfr-EzIobl9W{WY4b>(7X zW$?6l$*@wsY?c;i%_G692TAP|t`@EyG?3JHHCB|*nhi&~3XUJ`DZk9tkg?U+N?NBT zy}M-XVCzBOL0|4f{&WcwT*?rZtd%YKSB~5+swwPd<1p5gk7gV<`pV@64~jN2`J{AK z^XCrEBb|f6O;T4WB(>Xt$H55FLS%vNKp$}f!Pa1DurgTl!I8jClKu(S7by9lEKm{D z1PuX4Fe)ewo(Q%dI1}`faxw+#gIPN*dyTZ|A)=WM44WF8**8~`=`Yh?CPUL}^lN0C z`U?FOilM(oe~seNbMzd=rx)l2DuljDU!?@}BE3jGLod_I)Gqo4eS>-zeUrXPh4NB) zsnolLt-@9+Oh^_3)U(1iVH*`LY!|ju?-6zgJE#a@r?8WHukeKM1SJ%93A?CBVYjfG z5=A~2sibyCY9h0!=OXhW^QaUuYF1L}$g0RHDmSt^vYOf#`9kCiR9<9VWF3_s`C{aY zlsVEGX{8Dx?U8n>Fwz<6q>3Wlk#4FuvN5uedS3E%$=9j61E_t0Qk$h9~ zP3oZJTas^4rIK$;zD+E&r#9VFo9?Mi_ZMu_(bJ@b{?1m~lk?R5S+0w?-gmZr8w1y%)R}|3l9zPoC3Rc&;bkVp6u#uV_jQHR`F#dCg#UoN-&N^X~GB zGUl_S`Qk#k*OWKoHSJ@(CFQ40W!`$PqjaWdm-(2c)Dy3sYMj*!?yK5q^>AI!TnYs!s#-+UR(wWBDta~r6H=RjYcwU=j$XIF`HSO2TMl#}r62+D&2VLVY}`rDNU})YO!( z*jLjq?s@Dx?H%)-@b!3yy?wq*zDnPDQeS-EjBm+z!*|Pfhg`$fWGK-_cv~9pd*kyj zHr{oZJ&(Pet~}?McfdL3llm;)o8DFR6sglGbzzg>prWbPw^4MgN$h*%+iZ$!YR>Lb zUCF*sT3l4J$JIDnu#{4jFV2c+>T2pO9A#^$Xjjp$yp5)Q&AsBh;#+x-@*a726;dfx z1*K|T*1e|Vp7^4n+$ygr`$G1G3{saGP1D&XPxiH@U{goNqujXc*{sl}i=?J5dpnzE z$*3^obCI^^_l-Lrde^+`#69%1xr!S-zDeIbUzXeK(y%@<>YQub@6z}Ny>q@+U%T&W z!@WIOzIjqkL*8lM2%CS;oM)P}>BrsypUk_hu{h%Jji8*THr!Ji?x_v;mu$n4UUTxv z9QeND?`)5_&buZlp6ilp#x+lTQ}z_XMb~wro3e>r)5JIHx=nniTxZBHuT8j`5_+gdFV0xh)u@{jHuM7hq#D+Qs&Ssx}|Q7yVzan_PI~Ed)y=C zZRG>*dH0fg!@cPddW^*F_movwJd|7Jv3We6X3ueQjgnkbL#`PwZ*$L((6`(-NJ#lk z$W3>R$L#6X<|s;C6A66TL;cyr$EhdvmlJjBvILo?FHx7c?wU&2*ju9S*N&#Grp+lT z?N@TBtaGlpY#*B@&som}w~yRw#3Lm4nD<;}Q*>D95t4Kn-Rp_D#~^X7u_c@&)ICbLs`n@i3Ynr*evPCgkEG>+=M9pUEq7~!s6o=8BPki#Nk?&o zrJ=8~-s361>7K9btL$qSZW#0Q9u_v7YnbqqHMF=(J!Nc}HWW5gG#qnpHgtQ04Fkqr z`F(Y>YdU9{ts&Q%>x%1&{<2&ybEI8A)MH#Rt|V+6>Pht}LOo(nRdF?2svd!dN(nXg zY8Ex5UC6KLT4fK7y~f_`Tcl*gdxlA=PTP(b52UTDM~kcXcIu7Bm7HGLqH9>|(F=8a z(uy`*!)bHRZ|Xq@2{v zhFuAF(iV#c47=o8I)l#O8q26~-BdR#WP2JDZn(yB?iW`p9_hseSL9p96@7o&b@niX z>y#ul#mHAFsqGUa2e&=5p1Yp=o`uwto>9+5&q`u^!4=XUbM(~SVI8@nR+}JGWNFRr zsDtvB+_2_!k&HClUMYetJ>&;k9%T2grTv5o9!t^<^xwHXY zt9{5FA-k^IOdCs^mdB+n>N^@lo?eo>2c8QJ3~7h)4GPi{Q`{pB)ud(Bv+a=d%x3q= zhE7t}2KS8yM}wohjf68bC`gISlQyd)b<#?5@WAt+VTkmc-iE1$T@B$4xeX-^jSX$? z(gsQ5l&)1T(9LW5v~TFnCs-10=nTaJ1y>ZM#RCafiwD$YnN*HgPTGwAl%h1P#m#p; z&Y=<|@BX&jw0ieMsHNBj4Q5lN9y$?Ud_6!ku9^r zao3ohlC9}48+NhhGMlrravmf$CM@YYTywgb#NpJQ#6^8jyQSSq%ymuY`cnsGbLwXK z?ZheBVoHR*c8^20=GsoYnR-%@r?tuDx*qvOGU9BIe%~c)A?>_N7n-=}dYBlWz_$TALz!u zbKm8E@9FiS9en zs5%oJf287YSCTM&#xi6Xwv4H?mMP1kWmUE+@yp93eiAy=YBzxx(+v z(aI$eT1qKV$(=T57a1?b&N6LPLWIN;N2#^3zUVn+ZpCK)4VzH88l#d_s*SaRq*=oi z$)qh#9n=TY{ZfhiOw#4VVVhR-&=yuBQbeR%Y$}^k;WNZ5>m8QltFbq1W`|2Ais?}H z6lbkv1#jwy;0j++Lkp`E3gSAlNAx_ zpyE=xKlPqom~=U|)v|3{*2EjG=oez{s;(U>wXMX=rqw4kt2$y-w%h6LsdsF%W!lV9 z$)w6$HytgKw92Mp`HDQpq|~G<&fYLgRGv#cDIHE*PYX}DrF1y%X~oIslP7g2or2_B zb#uU@xNUnN(z=}MK;(g~@=R^>SD@JS^O|K6L9@#s0nh~%oxX3MdWInB{t z=dg}TmZC+`6?NxS9rni9^M+jMP>e_VFiE`koP8~;J~>ZTFO?{wtef&U>xiy2b2N5b zby=UI*i>oLN3_P|h}iRz8yo}V z`mw%Cn`57_F73T;UssMfl+tc(hh3rUww7v2l0&sscAb65TI$f$)F)5IEZD;(gZ94Y zl-No86_v^^a^%V1kcq74?Jbs}=n02RQ<1)*?YD03-L_FSa!;K`)vxMTo7ETUrj-Ml z64F0QlmlvWtWTShblV_`=~Y!l52(!AD%C}aUpJW~j+Qu8$&*epDx{?-#&x%JBPzM> zk?NYWBW+btBfakIm7J7LM6aoY((t4%Wv4UFaxT_KZ1WSAZI#(s>x?t>IgOT^PLFcT zS*7-qg)aAuIaQ3I((w^FP=8#WnQm(2-QzxCr zRf5!es@muQ#bkmZ=C0aYQ(xDo(H+Wa^~7Uir}8Z8S=U?2CputIO)M zKTM8N8Ko_0SF|?8rPvwP+2nP@juSCdog;=)@0T(vIjMsI)=9T*{gNBRf5~~uc}BLX zd2ADx+;O;)L-lcnVa>KJF7>pnKjv<#QnP3aCWYC$Z2h)T+nIE!Y`eBMVdF@N?Q-H2 z>B-}^h3pOKx@G&YP*!cbNc!a|)q?FpsE zSrw;^(`7l%JLaW*jwSVl^hb)5nl+m?c|+?_SX_)N+_9-Xo*ZS1)8xixIj%ZxD5olv zq}=$L&X``=RE)}bR&R7(*5=s6F=r25l~Y;qn$^@O=k2}6Vjhs%xW9Kzv7t5UmksBf zE9#uI$BK66vPwWk-fIU{F?XfmWZWHfUXaM-Wl3eut=hP{PUpfAo#eFoIB7Sts;as^ z=@mtBbf2WW(-vh@)*0)3Y?N+3^%ag-+tZNYHhbaHp!|#^lNLR_mm_ z%@A(AWxb=mR@a?=C+%kXo!FDsd)5v0ZL395shm#AQLPw622t`YM{%kwrZ?t{%BWhd zn@Fy-I~3l*8)Y*z@*6dxd^M5=!R2 zDOFCg##$V`Xsxm5>ME_5Vmz9bRKGpNzG^+;h;T?9hFA@$-C9jw@;$pmS)!@7@3QtJ zt=Lm!+j3$;>y4^Y>=PII_S64{c>3QEPyZX@|Fi#wc-s@(cQ3s23M1;a-azr9R>D)r zFB7#CE+@R2be-ttlbe&~h;KS+nfRu{L&+}_b)hDV_|87NMShv6k)w}^@AR`9N7spO zAgPP^`kq}Szi*Bozgu6>%gi#~2FRigl5}bQ4{q@H{JuZonm5D!p|F-6_onRs17Z9- z_x10%)5O*6{Icgq-g55Gaeqp>|4_JA;@YW$p*9?0p;hEKPJTOxuZp;i&@LRkq5b4I zMShQmo*{=VREV?eafZ0j&|1WBmi%4_y+{sW=w;%nh+jyKS&;qZq<-)$Ic$i3fyA;v zj*E!5mK@|tQn#wVpmzjvB6Fw|yeXiLERL+CGvjQ8@vR70IE|B9Q$o_KDWw2imhGQ1Tf?$@!ZRYNd z*qQ~+_&tUDu*bExaDjxb6)f)@D?7*Sor6s?8|tp$KKo1hV(!0_ufb+VW|N-EeiJqq z--O+VZ^Gu`o3Q!#Caf9Xge|}~VGHq1*dlxrwiw@peIDP0-H&g=9>6zYOYlwDgZL(F zDZUAN2;YP)!#82e@lDtYd=vICz6o26Z^An8O;{(s3G2c)Vcqy9tOwtOZNN8S8=sc@ z|D$rJX%*cAEAJ|mN=koq$31=`^Wr$i>hSxfPW~heBYXQbf5+nBLScg(63nQHHr- zJjj4kpdUm$+fg85`^^UAFvyQ7nzt8kh8n^29g>pg#Xz0_KZG|_WFW#Y{|!6~o&#TH zuVVTrGHNp4f#!3#R?7zm!QX!94 zQ{Z2L4uttOSOi```uic5Ak3@y54iJK&9#DvpGJOZgdw96%MXAJxC(dY^&z&G!I#*z zX~ZuSW&pW6 z10p@lYhWFSI2o>F{tNgCuz@4nwi(=!`6%-H8)}4b8+;7@jBV%iPg$9HH~2p2{{?A7 zY4f@C{21~Tr0Vm~H* ze+D6^p*aM36tW5-=OKR#<0>wm1TYNYahACR4bs3zOXHzVdEW<-LS`6pHd1Sb zoCk9K4)xAsz+Zw#!TsR3!1o{x5r_>MW*kJT<{|!&{|Pw+T!aR3@)0MWD?=;Jev>0z zP1ugJFFs;HF5dM_C zidn(guYlhGU&mDe$n`9rxxkTrNW%XLF>K+E&q7`UuYunN?}CfqHu!5!X75YJJyxDT z{67Z~p0@!$#@QfCK{`v?4mv<5$mMzoav4|w%@4qDf?Q6&2fhm40RJBR5yFI{#3GU3 z8OXSbcNu&c{0Mj)>ETN9Q=n@{X3L=;*Sf*I&}+f>gD)a}loe?qEMEY*lCJ@ef>!V_ zQh16Z^Dd&XL2tvoz65z38~`=oFz)`(xM~6X@6g{v`Jf&duEc%@)*}2e^gjgu0pX7z zr^pL$1oR>O7ZK*C(3}L3Q$E+mu0w-1Am~6yln=v|AxfCcq=zww9>#pi>M6)8)Q>23 zhGNr$l#~9;>c0zF4fzbh{~P!V`c*>Yf_D?d-T6k40lyFZzkpnt?;y5cfDfQSenWl( zqJ4&Nbvln2P-`J*QOr-kU*arUBflF&`{bj1Ld=leR2>P^3^@Yq!c|;(a;f?p_}Abl zu0@~XqxM7Ep#KoawQ6WWz5w~tU;##h1@JQzvHkcT=EnKoo*|llg5E_eO)|={jKP@3*w`@qudrc4Fyn+^%n$hpH-F*mq3u~Bdm*Q@_Arl+@u!ozLMUX( zbl~i>tS!fIDa1I>aO3=Ewr{he2hQ4&wrY?|$uU+A*#m09G@SL}Y!l=r$YmgAOs0k- z&K>~&6EqmZnG>7_>|?EBLRQ9j%N%AYXk>HE=Vsem$aOvLUJJe-;a?`!I?Wu%RaqRN z#|#)!PHnQK2fcwdqMV6_c@d=~V;REPht<&6fu&Rn`UU1?HVwRw{`PsI$9%_RfNtC+ zpUVs7VrL3=Wx;cA53%zsh}z_BqLzQn+BwWixT+R49>-eLeAFht6y!<_GdTZcwzcpE z5Z=Ju3-JUXqZR}jq-|n5hOHyq>ys$4UxBDu{yz3D#O`ISWeKPNzXPH?`3|ntA!Z}H zF5uO(WQ^?kh-v3)4QD?F2BG;8u3BP4@-Kt&YLx$zdl;Dm9U=h1^<1gbX&XVausx&z3;D}O1dP2B1=435N{y56;B+}WB zYk$tg0HXEseYXIXe?88vY_z z7a-P0JdA0)+u#twz$)WoY~=j{GHhMupCQ9y=QTo(05L}K^Ps;0c>}~+kB@a64`s{y z8Z>Jl)>b^uPUh_1B@k9R4{J$2*LpFk@DY;#_u$`x6hd-qE-q~t4fvcjz6}}nC!dA} zRwWN>Pd-*9Jghf)Ht-A3{{Vzd&PRCucX1Y$B##G88py2_AoKJfg%RdC$gory*zL@} zfhb`HYa%jVvqUK|XafxDl*gqr72FLT#Mwdct7yrnWd?RKk6USC1;lW5gf$d{9>-|F z7s1~k%@`B-SV!=&s^W9?=tn%&AZNXEHgf=HyCHLPBI<&<45BSDSP?KNJ%$^@f60gl z-+n?s9PtT!IIOiv@Rg zdv|y1-+$k$_iE;ReY$(5r>d)`tL>bx0pS%oqU$Enq8Iw%?=O7oC%qo0TEb$!={T3~ zCkow;u;@Cj#y5viRlUvA8Mn6a&3LR~@r5QH?rA{&T6@K6VXScxK2drGvo%_>FzOMjNgS&1 zNF#$SHKGO8jvKvQn|$YeB)-)Oy-MU4S|miZJR8E=zw6(4r`mN-XdVfOx%{U4?o+s3 zIC8~ii_zJRqc>pQFGpHZV>?1E{b;8{9YKMvUGIZ;+DWdEjh$;J}}?pGlV z3q3vjWhO8-)r2#2Ny4+OLi+t(>w46|0?Uk_v z>(y74L8DuXcYu#2w7I%7^D*K5M)}Kx-;_1aIt9g7_UOO}d5W(T6cp@{5g~NunR16qrGLXymJ@?scCi{EzWB|`~J$hQ} zn0r-U>Q`HBmo7CI3|p%Swuw&tM;?Na9#g=!_`LWvZ0_!E8h-=3$=RlZ0EniCJzs-Z zj%IrUhW%{`#e|{BF<>?yo_aHsWe?A2t@=PGzMM)SG)QlHFfW#Yp;VXd_}=bv7uc^! znaVIK=Aa-)CsSi?M`AEDUq@$a2|{H43u9m}nHSt&kB}H$(Ge`nQnF{@S9^<3SkD6q zIT*f7-Uudmty=8*{Hgf94#mkZ!Xu9(OR$5N!(03jzjpoExGMckCtd!EYdK55$ZCIDf?h+orw;?8DKD4d{t)OQ#ZRtn`T8JuO6zDdg0< zk$L?B5wlswDWz}HN#)rQ2{9wVBng=9#wC{R3^k&03PNVLI5k6O2V8mc34x6vg{|-t z07^+j@D~q`@21NG5#!M9P?f=e}KO;0jlR=jY8KViSVlC zFP{8Vi^V1v^~w`_)kn<@P{NdpcI1lbVRD;bw?TVdg?(~->!9=J3R?C&?# z|G4NVe>505faj>3S<~_?j&O-=kdQj8LuByV)l6(SLoi4-#X<7*Gis$UallgPg0>@c z&?9&0d)~2BQfL3$R%4clmPC5P>1$|pk>I8Tfc`ROJNTIdi`4*)pi9y}ZpRJ1llhXX zAgY1$Qc*R^8^F- zYge?z&tkXs-}B8gXTx{3h6VU|G||fUF%HhcuvI)OS#OgDL|@F&`igqdXdS~<9jSMJ z7>}7LX^Xfk;cZfOoYXsEykh&pY|d@Z5CWrlGomk4sK~?uSga!!u(NKqGas3U)(IXM z+p{j?xAUT2ydD{kUOx$qy=*9DFkRw$Vszte+JO70e4!q=KnGt}VoK2L5QIZ+jOw#| z*5#SnVIHXdI@OmGksoit?gFsayxQ@GqP>vGgNKYrc#?fKL;1Hi6Y^zI$)6G=Hpl>t znXrwuV(&cL@zk{ZTSA#WWFrqgRGNdhpz!{+gak*nb2kq5ZF)~Uumrv=llK>g-HoNo zH{wlUpFbP$J5f!YO?YcN=Tnb*yF>NQRiS4yd zzfvTM5Tap8m?4B&PNu=Oq;J7M3Cdu!Mj;WM+-o;7i- zq60C<+H3c%%)EcLU0b~bCKxRj92(YvG~J({h(|st9PY9FD&E3JvVQZv#gm@7ycapw zLCODRmAd5&j=??EXooe>7L?iVZXX>Q7nIqC2Olc=;GUy{riTR)v)dqZHz_`ZB&_`X z`v$-%!sr0@_76`UDufBNVHs3+RN`N+RNz==qQlx=>)l$XhZMCAOdm4ZG0J>2jNrSi zqXuER+mou*16Bu@zrLXCI7y+5jJ_~3$^m-}iWS-ShjeiBDCGql9c34m7nTQ-gQVfT zKNZW1%J*yTBkkZ2f}Hix;ra|mv0lP4EJLw`gz&|rq`sT;d`jzZ>JPQu>92I*QvL8D zub(zOwsbGieEl5M206Ca8ZeDt+Z#E~6-D0!&v8ra>B+k;Z@1g0!`1~VIeOz-L)QKD z|7|o5-w60Z*M-jux?+^nW!cII@0ruE##di6{CMm|=(|n%>zvZr6PsX&nbcSmx&6YF zB*azYavGHlY|h8TpkyYZAQ0g_-`fbUX2^X}Iqv7ZG~r24P%tKy;m{JXdr6F!{F~_6 zt=@)q&3*W}Z|T>)LwJ!`w_vhY>Di%NvhO8F^xH5u+23ENT$4G<$v4+2JiTOt4BJnG zTbk{&wC-P&gwbVuSi)7e5tnmwz~Y{(1!pnc9DCUm0V>k?sVj&Nm*oB)tLwbxEG~~q|9S?f0 z9Y5UvWnwyIupU}FxCtmv{K{=U9NB}(}NT{7f}cxCU2ny^$Z~A zYMAsTvG&ZH&?^5UiXo>ecIJp)b_fMJJ36j}TJdGjOubRRRQ8$&%mNpR&EhD15EVF@ z4I)!zR31@JPjpJMBX7Xi3(eAeyrc-zfh5}ICoC^m3Vp|D-AnL!k7Xr>ANnngr?f4G zL&2hRQh8QVC+bsvd`WZFzzFo=b-C*m?m<75J3cxoZEaUqdl?xH+1l#UmY=3e_VY5@ z*$%WE&_l#jJl&nu5L)Ny!m3)V=t-5oi@`#r2ujW^WJA+tz>H}7(3tx~-$~{ss9|tg zIb*FujhSCtV@W<(cdBj>xSY4$WdEoWP|m0 z=l%}1U?hf?8cM67B$JVLYczMXq~woiDr*6E$VcNZjrF^%Y3)tP%`v zjU1E9+EqnUlldP~o5T930J|Our}T%s=GfY4FNYh2xEJMBhciQR8_$TR*St`cFEVEh zC7ASo^l04jo+sL*?TFsRCHZB%5Fe=V!&|CK9;l5U-}81~s6_Jm=5uaRS-W#Mk0m!} zjNVZK`-;LIzR1iIKR~H0=c+)g&+XNkQ%?<(*t7ceAI503G$mDj4SA+3r)U;>3o(gu zO8)YEz8+Q{b|-%V=Xal>BK+gWYD>#hFf{}DB>7J}5o#SA~Y(Ci|p`WsdoVk|u4B}5z?9=JVzx@z1K_rwOcd0cZN_oUf z=D_wWCIU@6F97HoQOBPPO5e#69?uRgZEkNAy4UGS+EAVg=}wtjN+&j_N2*+DjGu>0 zx5swf$yC^h$Jk0lWX4wiVN4@oOi=)+az7NG9|qbw$?ZkXZ6pQUDl$4Hfl1oF{3ol1!F9Ndg~lb7%RZ2AM?F zwaQ`xkZ;5}p*@&3A!h)4y5A4$T(TjW_8MIPNJkvjP1%jVNxvXH=8%I@igr9zH&4p* z7@UL?qQM^Zb@#|Aurt^t<>4(^DDTw{PG6{7-@Isf zroBfu3*flKR3v+W~GW_+C3Mg!?5iK|(ZO`NeF!~10C`E8#F1>kWG|r zKg)^s6VpGExW@K98laBRD0yvy$`e*>K{h%QYnm(O zBso)ae*Sq%_U_5#pJ}xwaFf9bkAJ|s}}dKQE7}l93$&U zt!BiJh~fH!YeBh?H{q}az7hXa{1;9Wttv_v8d1_FUAkLa&J@LAdZmz3h7o%CnA}TD z{%B~6nIJ<;JE@K9vh8M&luRX@|L-cmP47|xi?)r+vN{!;-D)Gz6^Ufe^~+Oz>1l&s zs955Q4kt0v%_#nT5dKM9qTx$+4Dq<{L;zaLZ)`)28WZ3Z<9;?&wL~3rB#Rp(#ir;Y zxL7mMvqXeY`K&9o9Lyt^VDy0``E~TKRYM4VO#l>k{vmgJ z2J854hJ;%(j$XqzpFPP_GFkW!B?i8QRs?P}GgiTJd zA#2|MQ{$sV%_sPll)xN}bL!TG-ZtzZmf6mhE+>v_Ztxv>PWUc5Pvw4X>HWrd&*>gw z_dP$Yh)MsznqXnaiJrP*=SB&*mXz0Zc4n4 z4wiPq+1g{8+dTA7Uzw*HU0Q-YhEgvHc2Ar(Wl&pAKmla8RM)`7W)x-<6M;DLS!-;`(q6d~%a-PIUUW40c5F0i(7!r|EoDgCnTVO=1E zHI#?hVF*!5^p^1@>T+BHD?Sp7$lp}8M4#0?EkHGs;O&3g@dV?_C@Gi)reBMw%ID?Qq?4T zM7QR92SqyS}rjp69!?Xl&G&R!4S1cRp8V7}30htl}<;Aine*EvN zy+vdJQ>w?7NYxnBOv9_%gP#4)ZAllOsl$koK%I^H1RNNQ zz+m#HQTDM^qq8X;^jP^7PFuD_kt>Oww^}`J>F&0yU>SCSGV$L`kvi-TJ482c7Ki)- z%YAyn{hfBGoi8ZDMiU-;CoV+I>?~d%mL?+5_#K(}9czUTp!`ghgX}!(`!8-S$g+$N zQm;0tpBxKb0W8Z-(5D!S_14d?1ANAfxt&+v83rSKz7a!_g_IBSH4sk)YBip^8%HQC zm~ga=erK%XhLPJIYhV#TKv_0)+C=Q(!ayk@Vrrq7)}2LZ5q)SYniu!~1Zb10PE>Q% zL>_x+N3w2|UyW=)esTd9Z`mB4C6|n%$?48kBR7h6wb9*j|84eM)NJ<{Y}{yz?4q`V zZ!}$_LN$gvMY_08({+TQ3e#@?2x7S(g3Q8~CvrDzCF1E`i4Bx8M%!&UUJ1{K0Pu|o z2(Dk#v;d^oUQipb<=+=kPTekHc*v5f0)gnh%$V%$s7Z>^lPj&ZT{m~v(iuFkmy9>;RiU;rqK;_Be*u^YwuHiGPKbxemsMH z4+rev525jZ=!2UaHXG0@!zua-fV8ok&+PT{wVTXg-?wg5{xRWip|HN0kNIKz(qjxY zzLPlFZ5Dv65z*3>;4h{>jfDzf-#onDi81vrg#MRL9tsjo4-3u6l(pky? zr&_ALFeC_+D?>eG11yQ2CL&xu&KJKljS;rinO^L~`ZOOX=m1l!ZFVH$XjG(my^Dl;4G?D36{a4>T|P?-RQnBhMw}A~iKxi^jU2gFm>d&}u))DYr-T&x`cd^EsZk{Ptxhvkam`*L}%b=LB+ z3NgJ&{}Oh}@^?9hYm@GaD^*h69$&%Z9{JVVC!kUyb*F1X7mYFo#)1mYQwZK>&4lnq!|jrFXt$F9NZQgrHT z8aOs;b^YM>9PR+X66NSB1~d-L8H%g*2p`vEv^mdLPItO5 z+W(@X>Iz+)BVo%Eel?11y~imz+0hclLBLf$N2q8qpQCKcldtTmQoEfZIqB6J)=bD% zzDTHOH=m<#%L7z){Z(5zCdT_Qb&Rp%NZoO8qu`oUyq}^g7H2)>`g&C&z`JlYN(@p7NT{$+F}5wwPw7dot}qS?uJUt2#VE)=nk^5DiYs*e_N&l1Z+DohC)$Cu zjp7bh&WRfa`2*op z!F(s0{daiPH8^!AR z9F0oeS`}BF(*6I=poJrvs+rHhv*YPdakXjKewCeE83(=>ymiK_(oUYv=T)ywx+t6?TrLheE>Lr8{lhP4$tDyTWoxRHdw2iEFFcSq{x{*>lB!i$)xuSZ+N{1)WV;mRR-m z_FR=XNf{wMfgn(mWFhicjY~Y%>C8TmaI*45Y|HWhrD+HNg;sTA<_yp=%I`;&}tE<=3#> z1J{iWc@X1>UEgDz-6?XAEeAWCpt`*$GU(LZ+4PVAgSnU3p5O6HMiq0psjU#R2NxRz zPhq=;Hg?MMg=r2E!Uq}~kf(xCwwaPyGMxMypzFd;wnoNOS@N(1V1R=pPIzE6;lO

        =ZsJ{Bf;g*+`0Sy|6OJS88MIj^K#`jD-Tv&E!Gp27M$gP z*ClfMXXeapS*mWh4Rp@Zc>c9^^O=J3NIjj%@)?YCTlPOlRkX7%KujB+a4L zOU%b%`E;0B4krdMl*hpOCCnpIk40$JE1rMt9Bi!G&Id!fMrFVsm8C4P@<|iLlax-} z`~>B>4-V@wr4r%P1$5f`yZq7qqe}Mj@SBfFhn*IKG z7VG(wlplb_rxk%`%Z5uOYyC~P_Not-j$_^>%w1L0g;T@Fg{mjvQfI-R;{n^65bq25 z&99b?(I@42m22w)Pe`r$J;g$*2tQTVl^}Pq3l25i3Kxq$cmAp-QDv1! zR?iv67Dbt7k`2JD1&iVp^Hicy_vW`VY5s*NpxmiT*P=rc{~3aNz94={@UzHCf$oej zK7l;iK7!nr@;?<=hC9E!TkF>5J4w|}yoZ(Q*4wG@>r9?UZ2@Pfn#A5DC)dfB=bdKQ zOF`8=ZjhF8^;hj9Ytxvkuh`a~mdx9uZ9u6`|77f(kCRKkDcm5R^JZo~pYvkogtXRH z|DnQ7aChe5Ap=tOM&a~{vu*9mChu*hW%uIUu~@y&U7gz-sBnoEAaLvDC(O?&tf;GX z;(bu~@W4Rq?Uz>RMl#@;sPndpbpvT7F_K$~?!V@~_3t1?s z3bu{3LIpWjs}X2kY||SwB_?NVRSP8KZd|+ri`7q`Yo2rl)Sf`K)=4dOlD;I{mUm4H zc~*QJ!U@nMdFMk^E5a>c*^fdZRla<_Xpi&o&G2}gwG4v-iZi5a00}30#enf&D|K8+?T4MyiS$ttNdh%H zKUg$1yFTzLLeD=8+Y{HZ4w^LtOX{{SBn{+HbW7SgAU>2XB$@Xi@%s0FlKz0h@8QRq z&&+=Dohz}={^bt89Xe5?k8+n~(@m*+P+ks^8H+tkvGpUlZb?rI9!#KmFxC#}Ri}R{ zKV&=Xi?>eZm?^5PDJadU_E;%$_bi~hR`IHzalXk5-!&1~!B=Ze{NPaQv2kFXuGF`P zUMZryN%N8$ohaW|)i>$oHat z7*fkv2yGBxT#|UdHx1PibSquvzcV&Dn!g(!sl>oLDXU{~SMUqb;&g*)G(V>N9aTxR zkGs!(C|Nf;cEWMvc7x+>)a&1yOvN`(U{W~06k)Hz z@};_@SK~C%J5h_`&dnrvKKl1_MLk}0u|ZP4npK74H%?|wZio>(vQ)Mz$|MTYq;;q% z@@U3;Xj^C-WDR&!l$PWByGaRewUdEy3V~XCfm0BHN`_vBT^O##7mEzz(3Mc${nNqH z(5L;JL55Jx39ry4nrXx^684&Ykg#Z+%1Z-};(g znK>GL&7TDKMQ3|0WS@?&7c6X^Rc?76n|({B8bw&t2oH_n)7;;??`VH+KhT z`zvxE>#Oa5-agvSV$Q)m-H+l|bX^7QmF;8iP3;}+D+bzN9k6jd{W)W=9Uh(`Q?GIQ zmp%r6OGjpZ!`F=smD%bd;G5g;{-~h)#VBK(p)-3NO8TkRarzOpn8tAi=8E?I4Ry9w zlPY~>Wp!oqi#k2crwV;KTPy|!e0HJiq7 zr!-3=tM8W9{G57NXz4D5=OX22;zN76VQaO>R_(}~densHP7o)goZv*O_C>39(-|lG z8K=>r?N!KKxV>7u9Va&A_I-#XKI|kSj2{YZ2?=e90Bs2lZ3zc$2@TDIg0POC@SKWM z52Hm*sYQ*YWq!=6a>J@pbw$D;TJ zSSx7)MkQVk!|fohZJ=l=RIiuQ)pV4Gh%7`p+VWJohU7Dp9p$1mFQg$NyQY3I>%P;n z9%5@Lb=cAZ-y@+D>~EkGyg^?p@}Ud~X}H#7SM^Ai>QzQxWJmy-(rE0urS2K&CGHsy zW~hXxD7`{oSC^G znqj6eyjU#$dpP&^aMDP0`w(>d7<55ol2!4Raz34wavSC(UP)S;ps-`q6du%o*;Kr*;;P7S9(I<+rsxolOXfB@ zi}6`P0rRb>3X&BKkt0Yp@hr=+3gnTXL%cf_h>i>qdWhISLcBRI8#{9+{lMz(taY~aa z^{O(e@@;Z#@@$fi6ONOP6OWUR^9fT3^9WN3^RsfY^0IQX@;ljEzqy&(SlejZm>&nt zcg`1Ama9ycww1b<87TE6KeM*d-boy1&%e(P{7i@|Z$9EX@;(YXDmz*{x<67pIzQSt z@;?eXGCoQ?YCMuTs=BSY?Y_l13O%Ae()|l8*DTR2T`E~B2b2LyfhE9lLz%uzf0j38 zZ%1##=e66Qm_Oo~W;E$^7RQ!^mRXjoW_)IyX5MDcX3v)J=3$nS<|CFgmSvU}miv}< z6O4br8QNLeY1*0Ex!T!YR5#-LnG=f>aT9eD=MxB-O6>XOy?Bzi!d_P@ZyRG7Mq^Z<={EtRjEwirfz151U`E;s1!I+9)ZM=wqIK*`Uzezs*q6AM*p>vB_?K7!tN=y;JAfNNr@1E?d;_*}GNcq;8b<^2Z&gFaGo; ze|-DUe$Re=fBh&p*X=K+Z-Vea2YnVrT!#=yZ1lWjDgugz7$PDf@DtO!;XfBsP)Np* zvqyXnETH(x;)N2j^wkMdFb?Ckpojum6gnct`!mGpn>oI?xP-X)u;_C zxyN~F-$i|@diA2t-NmtfHQ&ml*SO`L)>E3jm&Txt9apQ4wtX$S25oiM!YF+syiTb` z2bbPDfL2SjW@QoDwzBoFj;)}vpsjraxAt0%{;|+=o*RhIgaoLlV_9=ENb4fr+Ym~d zR1|5&tP|~CRD4L|9sO<+h|l1{?b~Dw`oA4#RJqs}N6(ZYu6*!baUw9E4$G zXL(;b#b{UV=H@ejwKhukzYZnWWTVGKo20MfW}( zX4goYCcN@xo`+X?D#3M+qC>APEq<(g*ZV06%xJso(4l#r9=?kSVFpgJB>6Y5?DK2W z`SyeCoYPr{&py|rJbP~K=mOOVo_}x3$+CrGBlC3P=RSXQF3uF;fwN`qP4_C)yx*qR zn%6Y%A+dWLuOVM~uB!;{1o}Q)Z2?gXoa#XIFQ#DoUuO%XGlI)X>ko3lI0K0T&I3pT zbOV_KPXoUPa0a*rMuSg&O(Ou{f$$!%53mpL4+t1=@v!j-O7PR26O-;Y`fGRKkhNv| z<2IMIP7<)9g9k9)CzyYk$u+!#a^3kH)+364F86}jU9;VGofd4lj#jl=BUV~?J##s8IP*9&Jkv4* zp7}QuHIp^7Q|MNBAVwsnE5i_)ZGz0uf558;P%$-A=w~xtOsuL?~+`_ z`Ox-oY&tQoW9AOg?(gS*W2tw%i;LwoiAoif@AjiK1i)o83iw;bCwGD7ZITz^{xfjV7 z=@tbSX*IBj@EKxLN5e)XM@L3!M#_F$jN%TbjcAN4j^srM60Ln+`?7|+hU3H0#^V0< z-ucw(RQy!!)GlZEWY~4*y&XG#IQfd^YX55S%Khq}XS(OKXWt{*mB5;cAnca{+#0ewPPcYL{nqz^Q8+0S#VB)G94rns#LbgQRCA{n-YcP~ zG^>)S@~U#H(y!uKpkClu5awd#qT*uY;&XGfk+pHR5rK>f%x&zCBj=kd(JB=x?JM;w z0je)52r6Xdab=1niltL!GM$QifHNijBWb=&ha`tQhg^qrW>dE(xf`+ zc`9|GHM^xcY~OO*}z=-Edz@_;O{=bzDF+wEH14I5+aXyX6U?v|fB4s+ooElum1 z$)|rWcYutUN2WskNd>0GE(Bt7!#BJx1u*gs$g90>NkS2fJNmaI3+|ggXN6uie0~m{ zVS(15l;yIkGFFZKwh*E6pHR!QSYgUEP(h8~3R|4k?@w?$USJ6S#(tPC)=WH`Zi{YB zVqfVb=mg`0;>7Pndx=)i*+yu*2Ag3INuvDWQ;Wch(CZ4R@@(SbO>{7lFHD8h_MdOQ zFd4Jo9IRjtZ?>2)Hm+kV{=c_L*FJMUUCtmDU&fU}fuPK=0>eMu;=bx0wz4jY*28^3 z)JsR}^P|az6nFr1D;WYI0x9t!$zgCpaDx7@i}BImUkOIMM!jJd%<%U0`?rpo*%(b?AKDCr>V22)BLTjQnz3lZT)o)(qQIZT!UNSk)jo z9dR~uqu%~j{s8bH$pXxDDd`^fAt_%!Se(_qST9_CORz$->`Y%;N*g}NMI+pU`%dfwHCt@((T!G7a1b+zIl| z5$2fsh_H~}<{-QREW{sr$}S2K2kU%LG3JNtB|}j>RsJV=k9o(B*n*?5qvT~Kyqx3r9Ke)vqVk=__(BdoCh|DS=F>wFj1 zE_Ke86r?D~r&?^f-zJ=Y_HL*_826TJhHGkz#3v5*iSGR+G>_2nU3g|zDfm!FT=**J z9&)g?Bmn**QNAz!T&m|Ueg+JN7a!973CTfygs_Y;kSPyA1~z0m7^F%WZCl7JvBHlfmDi+66ZVAAXykcohLJWCNA zQT4e4<*{kjv{-8FvSLk>ovBE6859$vjMc%{tI)5r#a)wGYk_tKO(X)&{Dprsh@!!Y zB!Zq#2?rtupS+-UZ9oeNmPQMT zMHf2`>0{apg=NnZR-2+V3=vxpDX$Tek3?`9Z1AU+WB*7HygE7Z{IHIZ)b~KYMU5j@mW5SXlmy z03cBA2Oja_v*BHXV^GICK$_EjJ=VZteM_FPUE$3F(w?u7ib`1gWqf8!?u}a{wXnOT z{3gCh-O0S<7ya1_vj&fR)TU<6W}=0#LoHjcs!;=9JBEMPBt{RKMeZw0X!pF@p^ib^ zsxPm1I^{@=Jk>IzNNFD`&)7r9plR0IcUUF&1rhypgqA>Ne}+>Fjqo~VE{?}1NG+a< zX1?=f-WAb5|N1#a%5Yq zM3CX8XrW&b1B6;w!0rR}>OGI(5!4=;U*5Q3?k){E-s(6W$}d zTP=!Z=M%pkTEyt9IQ^2YgKlP~1)orvsx4vlAJvzk9S?>TK#EBt5Lc7&7{og-J+3MA zA-?6w#Hn>_KrCX(NHiu9kE=77MYauEYtUftXwSq^5UWrT#XlNAp_e2KBjzqocyOMY zIf(z}T^up{6&s10RFMPIh@|FF$9^npTRwp|{dL+BPO1A77#55QMh1TZ!`DEaf9iz= zS151le>tD6$XB1Qcr{;DC|kE%tu0$OTD32$Wvjh*0L-j>`=2iz+nIob!cI*g&}|Ch z{}12^i@|PC>KB4~fwjo)uYi@LW~GPvK#EZ?8!-t(;us3aG#;E_HMYoL<&e)HpqW6$ zwg_Wl9m35pMww`Uvsi}aunQt+>qpi78cfBmNU`(30pUw}AdxffI^6tHInpaa{|@q6(>fv<(mRg|?M*BS2IN6XU_*PH{uzSi21 z^K5+N-EVs0m*im$J`fcM0>J#CQ_|Y`{4D11@bC1D=+w8!+!a{Q(${7f{oJTO9}j4}syNmoq5$Jw|hQE`~8@(T#qIx|{MW z0=J>zy`Wkamy>AlGX=2s5{#Gk0tx>ki6Q6%>yhRE1R$0tLl6*4?*pqjPjZ8B7 zET<3k61y^wR=C8_L*S8RblHXD-mhQ^2%c#Ezug?MUS(|4ocoz00&^Lbgg5f0dDgqi zLEQ`q9&p!n-#2hTUC>^dUoWC!1Q%^Wb*l9O6eA`WSksXwN-2s5?yCFmh=LF)KO4hR z!~|YoUJ63@O7#yRdg3F!BsNrr=tVZB;_F79(sT4&{y@S=1=V5s({Gn!WvWpm%bKac zIjUc3{6Ao;^N(IJy=!dM1XmUNQpNv_SbeLT{h?P}*e)sN92@qJ5bZY?VU#WB7q1LL z>29O{8u@wN z2tEYmgRjTL;<>>UuAkk|i>Ag-!I|r;;!Nzy(em>Y*sY-dR^4!l>O|+&BRY|lHOY_Z z#q~ogsz1At3svSNi_ABnv@m`kdyzXOKKc6K{TL5`b$}9r(u>_#klZMDV%i-I;=dZZ zwITimHGkemhM*XZ=ytjH15M;m}c1lT>bhS%)mnHu$8kc|o zQoi#}Al9tU+=b;;ut?-k%bzrDVbhjiDVYTAw7}VmMxkmQL9h<8n-v znsvvlx$_jtQkX2FtEW(4jjd?LBcvX^OABhD5gn}u?T5z2#kWN&_sF|IuJqQ{eO-)3 z#YNE*?Zw|Zj>0n0lN>*b-ui(-ug5hz-1hxZK&adWj}C5~i~mf{e^qc#Ww=l~!XK zk#Ya{+BEc7BpcJkOEbndaHgXVRy6-nI!EMwF^phYp>rOYGA}<9=;Ez+1h!mkDV!DF zBMS{1(9s#vcgSD4HZ?Ln{5A_EzUWflV6c3V{L|r5dI8m;^B(P(2xfVB(E#;<;{7nj zhprnOQw1pEpEbr!uiGy$y+r-beB}Kp`>q7{LUJ1}tjlL)o)&pyb4PkDb7`g|dIQ|D z_$K|P`I&O%d|CL?`O=>a+~E0x{jziUb6hrY%OUg5o_$o;u$MMo%ACYr9m^Kgy|q2? z4tU20dvh>N;@bLG>%UxI>SMq8v@g{UDr7D&1oD5z5ZUA8sW?EsO(``r@yV8Ba%R=u zj@=6P$?;=sE=f71A&Z3_1GymxKsX?RM`0~eZ(JL9JJDI(7U_Zmgb`xa0i!pvjpp%x z0i!@%zZTls;M-_-1ox`8M%lfCc6)Fi+M3|IXlsM-q1_SOui9E=_W|1N!2@V(f*+!- z4IV_hBX~%)JCxmD&~6WYjJ78D3EJA=VYEAfYS&i1|E91esPnEAHg z-wZQH4Ktq_W{w$VJ~PZ5H;jC47&&1W`O+}*m0{$hVdQJW$SK3fX~W33hLJOdk?#y6 zXAL9g3?n}nM$Q{Xe#|i962r(})%>>wzW^iOfRXQi8zU~uFyitIBd#yQh?|vR#I2KI z#Ldny;?~Qo6*nitj9Wj$jGLQb#%+*c#?8wx<2KAN;^t=VPFp@TmG&YPhF^pVj7`Z63R@~niW||sini*!A8)jM4u+8{4I{;dk*f?N9StL$3?rQl zBV7z5T@54M3?tnQBRvcwJq;th%v$MfnEAb7rjKE!uVJR2VdhdWas?Q<8jM_{SBk1* zsLuQ6Csy&4zV{Ge4ch7FxwE<|ixP4H{Tn?-Kc{Eu_w+pdk#UyA>arZxfaS49%+Ca~ z*$m!>m+?DzIUmX^_?>(h{{tV+@8To)-Fze;#Ygi>K8BCw<9Jn8Ebu6PpLc{FQGq|D zpAt%s)8mBEGgRFd=sEfW$ztjssmpxKN3vNRR)^GM>P2!`eU?k=vxY36G++T{k%nwK zn@$?>OZX+k&-?M)Ngykl6(#Aw+Q3>>aWUeO9A3j~`3}C5@8YlX-TV!{hyPj6UgcMX zXV|sPQof8Y=YQlY_``f9U&UAR|M3qt|FNH+o@DXNlPnjbuO{=q*5mstf3ipzi`L45 z>BpZ`*HXR)&kFxCq8riQ*U;*hC)fE}Rpk?vrE2*a)joosSLjy#yh7R6A$j~!qkYt9 zl~@jCG~|o<68<2c$!GD|d=8(>=kfXcA-;ewQhpmB!f*ez>+a3==6VagYHx|R zOnJ)Z?Rk3@r33GvW?amRRjiI&y+e3s-kJD#SKgIm@$S4ksl$8no}{k2wl|S%waV@y zes7jHi+J7~Zw?823%ms+;w|zPk*K%WTTEi!Qg11Vn{3;w2*t{CXXUZG^3;!C%lq@| zcnQCr-@tF=1Ncq9wsKX3Im+`Q<#8#py@Fq%vb~b)Z?3%65sjL}j~7@$pNxSEy{S zQrUJ<+4lI=Y=4DsmF;Ym?Lw9966Gmd&G|}|ZAX*hPXpAVg4$G4hX$!jL)4>T8lh2jqKVT4EucwS zNK-UT8`BGD6LrG5i2jZ?rOjw_bg|4wx?In4)jWO z?zxI~q*v2Uv@`8OyV7p-8g&ZlL3`3(>KycY+DDy(`q67?e|jA)q1V$J=#6v$y@?K_ zH>gFTIaWp!d^>bP}CRpQK;XujncI4J&20u_5esR>tmNyNiur zce9af6dTPd*%&sKjbl~nymb$|m)*xEu>09WHi=DU53)1tJ9d_R&(5(Q*m?G&DsCue zoO2(~;&pgkp3Up=9A2O2@&-JQH{|)e5%==|x47Uom+HI~Y_ABmTenkNQ9LAM=0aKkonBf5QKT z|4aW@{*(T%{ipoj_)q)4^`G&7=RfQJ-ha;jga5q$#{dbaBVd3Be1WV$oj~0{cA%a* zvDFXc1{wtN0u2NCfkpulaIFul1J;MuLF*&yko6bqW9t*^u=Q8#i1jz?sP(CJ%=*ka zZhdZ@u)eUqw7#-VT3=hItZ%H-*0pSbL^}Th@`a!*Zw0;z7NvZRfPh^QYqOQmm z^+b-SFLFf#k*7~&qLDt42}`|fA=N9WPGuqCiLi)>sECQUNQeTF6on!s((0^sfoLKw zRHwDysk2%$(Ok3;Ek%)NB`y}N#U-MRxKy+imx*@ba?xH~p-ysFi%z1m=pwp`ZsHoz zUGxw=MK94?{9g1CeMLWUt>`bV6D8`jcZ0Z53=lVof#PN{NZcX@i(5shxJ?WZw~I1y zhbR|AMTNLi3=@A4!^K@vN_! zCBC(f+n?Jf>@Vyu?XT>U_Sg0)`y2aP`;7gaeb)ZoK4<@6pSORML{eE_=E?>#Pd1eK zvXS)5fV32)wv^J5LFvkn^khUvWlY9pLKeuRER-qPT(*!cWsz(pFP5$4CGs-aPPUg< z$PV&KSuC%T9p%-slk6@9yU`^diXTG?M-Crjk@@&3>zoqjdglh` zMrVL?lQYn{*%{>AqE526I;GBS&JgEzr%az{ouTSPd#5_j{=pgU+@(&mcRM4UQR+-v z>5Os4I^&!wXS_Pw-s{}wOmOaZCOVUx$<71L6lbb4&6)1Za6fa8yPvx!+%McO-LKq} z?$_=q_Z#6S$sWXWvLE3&*+Y0v_Ahu&_G3IJn;%dYhBm@;vVQ&4G2LP9 zwBDe*@l@gN|o z7Rgoq9K}accGDWEDp|2fc2~Gr_E5N0_WOCvEs#`Aq*zil8B4H){vQ)qQq^1+F?9}M z%~&&4?-a2j<(aDUL7ktxlZ*8Cgi!szPwT(5s1H{gcxF=U%%SKVAPfyt1q^_RK%*nExI7<$u#|`Tx@{siNGbG91J1{$;mR z*^U&)SlR#G9n(55h+skpN3_At`H|W)kLbP3`b_Oh7hs<}srE>{J7)IAAOFc+(f&_% z!++chTd7^}m;LXj-R1waeejpvZl2n`TmQTtE)h#r^>Gk&hpstv#c|B~RLsv*9Abg0 zH@>#M5tr&}L$tNdn!Qr(lX9dSB}dCjIYy3^<7AZ_FQ>?EE!whX08jwvD`0w#7bs`LFJ@UDRINO~hwg+{-$!tH}h`ne`@9SRdAp%w_%AP2?eVGrNT>W4E$f$qIaC@i2Rh zeM?s2n?&Bp@?~X_ceApyvdQ~dIaxVs2hYvQRXe!;Zjl37`B?$AgWFlQ+OMDYf1>tl zD`2VpdRAbT+OOvX=1_lNUSJ*#1l9!BP)mRIL4_5wlGL_RR*HtK#@2<@vwmkar!lLg zbump^msrKLvDMM)PFq<$t%3A%Ymik&ds@S+Ve~rdF6(YuVvVvY>5Zxqm`w*-bFD>m zgtb`J17oc>t#|0t*1OjG^f|Fite_jjO0k-56l=sI^i}bwc#3Wj>%?<(r#LK*(m&fi zRXOan8>`CUL;Du{4tm7C+nz?huxHwjvMl>g_HGup-?Wdis~qlhVgsBx&K$Nfcx~`n zw#q%=9$~B9qwX>GWT;1|2U~|vMf6{g=Hc^_2T85bbp1Qc4sr{Bi@(kPjql~}@O}JU z{vLmy@8=)z1N=jNkblGv@xSno`6v7^|0_Sj|HhB(_Eri*OrYbVMi>i7_?VzNN_)dIJvc(TJCG~A-J0#zB?J)7%o$W5fw!7Iq zh-3G*`w>sw$G#wObr<_aRc-1%MJ`bHDL=VT-&;sCb#LiRTIf3pxmev%`l+bu8mcO- z;^%yxHTksBpTenpS|guJRsHtw?cI5N71b37@bhNP%bXjMcjwK#BoIOfA%w8V9*kg- zgdG79AtJJmB?W6!M1)EWQmR*~naeW_5@Af4S3{FEJ>$@KEsZ5o}TMfCTzmxFB@ z#jwxK&%6eP+Gh*RYp6J zrRLFRh)Jlt#52)-v#rsk}>P~)FlJF=hJ zhYPWt)mm6Y`!PbnTuz!>=9ZD}R=5>pMCV55k{O*JosTQBJX%h6tUOjuaj~Vbr4){> zjjg5lSVgRY&}&fLGiz*3QGe$uWHd`iWgs#deA zrdG2`M;^(h8g5-TmonTuH;*#id^ewJxgFdNl;w7DyHIWSa<>;{yM5d~loPx!PIcAF zR=H|Tt9oiptNLn9tA=i|TS86T``lU79GT@Yy2xGPE};T+og1i7t$5W=t$5X5t#8#) zt#8#S_GoM_b&jo!y+mErid5ZV>th?Jdu&VWJ-SS-MRi4T+vK*?I~jxesP(6c)S6R$ z)e+UT)>@%*xCQ z{Q7?=u|LT#@$c|U{X6|>{&fF7e};d*KhuA} zpXER3Kkm=>pYRv>Px=e}r~E~JaQ=jYyo&Q1c@;k+uVS7%iR(EPm0lL++JU%w>!JFb zfH`b3uHM$DGUuTaSJ@K1eu_HtibEx5w!~!Wd0YPZaSDDXSynyocM2&z;zztlERq~a ziKIrVMyf^9BGn@;B6(t)_&{tIABx@LW3fkkBKCBjTtyAx?@@;=AB( z`+u@>plB&Bq=mDrD-MXSDJG7Iyq2hWm=Q9x zY^^@#*_No^3boFt+z(wZHac5R;JC=9@ge*3$gV+7q{8alxoy`kPr&)3`N?bW*vMS6ezI(?WvN*{-eUy8b6 zx;{&vqtDkD>E-%zeWkueU#o9I-Lefe%3giHen|gTKW%76oRMI-Mv9ScWEr_eBcp}U z%4lnJG`bnRjK0P|W3Vy87;TI_w5)#_;#S^cf+tYOwDYn(OFDz&Cq)2&(79BaO{$SSv%TPv+K)>>n< z`>jLPx7KM}v*YXp+qF~dbUVw=wHw(j>{fPLyQAIB?q&D22ik+}5%y?%yj^Thwx`-N z?Ai8Qdx5>!e$HNDzihu|ueU4gckS)=Zql3rz6cg_E7*=(!}feJ?7+W)9k~tc#FxO% z+!l7>0@#%c;icRTc4J&ePIvAAdvHg18Fzv`xih?+yTD$IEa6|j;XB||E`|5< zov@52!)g3GIGs^HJNNP3a0X9-_wzk)CQpSA@V#&rm%#^l8l273;X`~Me3)mzNBDj? zhiAe^`2jeWXTit#K{$_R!^im{IG-PePw*pf0ndR?@}qDeqr!Hc;>X}3Mm69(&5y$- zoC}+BJ=l!v!{*!ow%~>^k1v2Nxe>gO8^e5V0x#mGa0Qpc#XKKA!wXI~=ijLIYFaMBTYH0c=pCh1#jzl2d+IBhu}uHv;{_z^}rM{2F|VUx%Cc4frR1 z6ISqA_%@?gb2jsO_-Eb#x9~>z4!;H8flefZM{65^x+u+Ci0o=pe;V1kd+{-)Qr~DE8jCaD%c^BNr!7T9we+>8Y z9{44H0uS(B_!WN&4>Iat=WG5P9^!rQFnCjSLm{5`b! zuP{y^S#ww*GjqH^u4YG|MrIZU6vBiF!h%(V4HHEiOcG%j5yOK6S`b+xD zbhD|M8jV%=YQ~vKW`xG8domM{Ju~SxYk)O?imgG`Aev;?w0lvB{fd2pRygc19de}O z(qT~`3hAimEV|G);!@Frj*Fh6Cw=$BJMgp)f3}K~=p;E2M>q+=?>JG%b9^V}Bs(ci zs#Dde=A=2*oph(Blj+oOGMrjYmQ&lwcIr4ePF*KA_-qZ`6FfC8=>ADFgpojoon%MI zvJ31&inDLA$5XuhtX)nVH!W^DCB%IfcbXEz^}_Wj67Czmirnzs;VI;WSA|zoEPOb8 zgi_*b#b;5~_&)JPloo$)e3|;xKq8s6PF9Pqa373f2KpDCN`Q0AVR!U-tK!e0PNAit z=R+@sRt4YT4{Z!pgtmmXhPKOEdIMQqrpp>KL)Mg;GF#S{4P--kfovoj%O=jNEW60A@>1DNc9%UOV?5y~SIMj8069orD+i~%lJaWG>nU%htV`J-vt(`h{~Ff+-Wt~G86mQbyhOH@1@zN3 zo^iIwIx_C+9++TcB`pJga7`s1D#c+f&WY8k@3@kKCIFR-f8^V zk@KUG8@vx$X*B-nKz~~rNYb6 ztv@%=pH?2De>5ilXw0rW{wME@g=i!jYB{&&szRW|-L{=z-AG-7?TOml0y)7-bCk42w|E{QFPEsL#- zz5U<3hxIqpixYhf3T19&b98cLVQmcxWo~3|VrmTvGch?iIUq0~Z(?c<3R@sHFfd&p z4GLv$WN%_>4GJ?dFfcG6Fd%PYY7GiJJTFFRY;oxD@S8sq zo&1t0?8Kmy)PZjW*X$sg`v8&Fb5Qz-jGvbr4Ir9dLzG-LC}Z@1nOXL2M7wV!vaB7E z(Wz@d{7s=mT!mJ1#-t3(>RLIh9Z|$ZqM%3fr{@+;SUw_ys1w@br}F2_vb@x^AcSZ@ zXCm*VlZqx!@AbE&kBPd(5qTv}&MhvYSn@&tbJ1SlocfvV+(#4AjokSIU`EbNv8KmZcHO z0iR=E+Citmb^NKgnd9j*TF$Ywoe$6#bOt%)w3m+3J`Sc2=`1(n1KgYPsDK{jW^{~# zXe^b`I?AH;R7z7(qnxr43#E=!NL#>JR87k$1M`fcbjqhAq91*Zbv=#VchYi-M~#K3 zaf}vVMP8$=v>T&oPSa=w@=B3=kXF)7)R%gr*T?8QKPK$_D9QwZO3=RSDFZECrE=7B z(RMe<);x5Ro38LkjN&d@#xvBYl~{NOC!(KVjCDF%%A-fYM zqA&Oy=J_C1U@RG!SqbXNF%^P?X@&6}=6{@PISTEp!N~I=d2gC3GN~ywqsx$FES*AI zL70Q&EJ)8qg^Ds1ZD%|Bv~z+WuHfz5mk&dFW6)+oKS-b)piqGbJ^D8S8|u-?(wg&IbZL{*rj!2H&80LJZuRY5Y=YX|ZKPvI%F3A!O= zXPTYdRcln3i>YB^qA^D z7#f#OMc9=x-NVR-e%a{(jJ^rV`BAtqLqB$~nH5c4;=G zA@}Gb7{^5D%|47FA3a2n9l80GhgDm`J7_HHG?2&8651jHpead|NkcgmV}A$Z9*Z?h zrP&;V*b4A$rO73rYNf~JWP|*J=njfQFLDIZS`4Ku<1*b&F`zq8A`~NXjiLmjh*RUp zruI0wbhUP4q1`Po-sOybZLPS0k1t+KQgg z>ea%oEum`O58YnJ&FN{{z<2NvtZpF}W39GQ4Xnmu?7tgm1mfS*ukxL_ztYdR;0Wvl6fiTa9e(p z-=xa|n~G2HD)0$@8vG6)=Z|?JEZapc;Y{wuX7=WG^f-SV2=vRC)t zJ3^O3{uZUy zVK0C%5^1Mh>8to2K7x_I!0(`Z1lA$8KJ>)@7aoj#E&H+@RS0&uFTD#1t%By)@J{|& zjZ+y5#NG4bxA@-rxq8yvbGx8A$eW$)-MR{4{aP#~pGQ*0(|Eku9|Ms0z1Y zzsr0x%~W9}SE}?nXtjL*0b`X9=A-8F63tQXld(q^(cft;ED2b&!fHb=D3@-8JdQ&* z{GkC)LlQT`KQLh(-T@uKYTScd*~?m5%U|&&zJ&cfm0#hD{5eO9d`QiSeUn7ddxO zC;8-6Y1d0ZYKoL|gwhA%L7*)9fj;4%v0m^Ll|6;s#2B8yuHDD)at-X@>(Jb4j>XOh zPt?CX19lJmFL|6j2Ue~ zAC~e>JeYTb1}nNl?INj(9&K#2i~el*ySwcVcHwXGD)5>HJM{Os@y`8&9emx6{i9Is zXb+n}^6^+r_b$IK^jOnB2m3wrF@m<@PmS(ZzJJ-=wRtZw?J;ZVp*ab z{;^CcrB|?1Z%4PKxQ{f)Zu(q#cROGOnJ9QmU)Z_asooFt_?)t5j}7=cErqVQ z>dHJ{j6iyujct$1#%#aF1C{Kt10L_b9OUw8@1wJ7#GY2Lb zn7q#oS0{WS-49v-DyL^qb~MhT$@Ch0N$DZ)z^yU}l56gkUII!C$0@UdiWQYZLMMO^ zgAU@JCFui`GORubcAfV=v-1 z84Q}v@!SCvPha9RWcWt7wQ;RzDw^WH;hKY)PQ4S=bqYn33GoBVh-9)qV|8a>BUatEBM>+(4?}n|#FmfTzLFYD4HV3gI!l z5bKB(`V`*Qvv@DZ+iJWMe~Vj6Cy-p@fAV~{weZ+5mmMpYH~s7Qw>**cu$xzJwb!!r zP^1Ns*2lvQzZpmlg;sdj^9`Zlw}ghgMcK;udP~&sJ40jke0OO4{h=WTLT4m(?jI7CTTejJtG4Up%`sh7YzAQ|R^WKDQ9ux>F8 z#^Y(zE@EI6o`9};9{Ei%8ul%LzL4JpaG!k&`{p$4@lIIczUcn||JzN{!Vclnu%`*Q zA;?mpqN%$bsil2!|A>Mn%C88LmeV$7?4yIQQu6d#1TKfR*|@Ee{&RE>=s6mL5ryIu zk|)-A)N&$kHQuHoF9J5_Q#y*uqT9jI$nA@^ZiIecLd|Tdg=cQTDVGjA-x6surHf2y zpp?tuSKY@e`A*cm8TZ0nA`HI0=U(f1638ERt2Ivi2>3d!k#~|RF``(=D6zg&2)IOA zPU3el$ zgQt)#I`eE$9=u~a)^8s?t0PDcf$oHGCJ$HIGnkv<5HdGW7$gzTpMn;E&MC6vw0@Ic#W_9~`*JoZN08QZ|d_x z7!E64sK0SF4n4QBPS6eTb!~Y<&rNd>c65Jg$>}ri66>(G-tdI{kTX@Sj{JJ`3UyIZ{tUjS z4l5D_I}(gL!3tQg>2wMHz!BHBfw#JWPas^ylhv0k;-}^JPx%ECd>s4>uTZpmP4Vko}@N0OL`o`qKMixYQj!o#guXERZm1}tCmCxPiNq%Y6KyP5h-{q(I zAN;at13lU3LfGDP@P1y)|KfiMb`d`TPj@drqwcZt>+W?AQq7qAx1JSY`It0K=|!mN zYrh)$*=#_*UPc|{?t{CmuR=fa17bcvf8Z6YhCeVsVIVaH22lV!-C%{yC{TI5LBQs~ zU!f_%z?Reu7)l|=FOXjgV3@*iY6-jn_%l{J6xfv5yp@3 z*d<0OjHcGWb`)t`f`2WsJz0SrfETeoZGdrP1I8=tNNtTDu%c1G&I-FwG_WhRGrq?u z+X2{}Vu3w?-@%&30eewAu(!fK)Y14Bx+<|RbpqO{3$P#X0`^5$U?Oz`I@EtZNTTk* z0n`JStT2Uo8s}lldjSVhZ{Q&60~`$enubsUa47W!rUB2E4+o$j4!Yw zZv^JhFkmhXH_pIPk1*ta^^rJ{(t!mu(m0J9mBh(33RtLc3S}Cf&@xxjgp2b@p& z#=qz;nh0D#1;B;Cf5P%l0+!Nb;N1!rQK4}HewM_0=~m!knhLxRc%1I1X}||)I`Bc@ zCsana0hcITN;7~DQIYX6PUxAyWpq1mITZs}06)T+F$?&J!bfSgaSZ3s9N^;$SJ7PH zYP!=n3NKIMlXMqwjl#9Gz&JvGqlLhA3fEJKaTqr7Zs6Y)K1GXwPt!fdhxClXXX#$x za|)lQ#l|7ntNVa2(*3}f=mFycoNEsPUskx0%7B}I@6%>l0(8<+V1>d;de}G!-)tFh ztHM`kx$z#os&E^v09MgTU^Van&hbZpJLoY(ez#v`?8lkB8n}y|0Pa>;Lr)s-;-r=M z4_X7~BEc#5_HKc!cUf8dOf_&L1_Jgx8yZ8P@ZzEA}`tME&zHfreKv;+8+!gI6} z_%(1hJc-wU-_S1L1%=TE-Ji4dx1aFKHyKlo%A!k4*Z4Q z0{*J-GQDl=z!@d6mfiu@(YwZWG88tn>AuRQ`~H7v(_{X!>3`Yuzij&dz^1SM%clQj z)Bme%`u|IQddmN$O;7vFrvFEqKJzb|{+FNrA8q>f|0KmEl8{EGJAMg4VIOmZL z>m4=K9%}r1a`vLDKRy?N+`lSsPyno(uK#HCdr#-z zP9AhMI*Q~E=l`3Y|FIMu14d^$68rbF_f6>2yH}6y-MV(^+^J)HTx^H-G3}zG+S=M! zEs?DwZU_%+722{z^N?o2L4g5H{hRpt`k1}FOu8nR;!CmgMXgoMM>;8th;aXX0=oE{5Ei1d<;@mJYt6{EHVsrn^>Hk<>bZa(jsRfXXTn-fh|?0WpIuvAM~W|qzBOboYW=ce3H5kh67?%dMKVQF=3PJCQNV313&6-@)&ktY5PBL($& zDyE9dSlXz1$+8@gZ3q;?Y00->Bw04hskelJ-c**~8^!QsGio^}VnwDneUfv^0uyAq ztnV~M1==iSmk1hQJOA~yDY@QxQ-p13nM*4d$hR1xoFtSQFWU%mH; zkDF5^rr3%CEeIe!N{4K7vlBW&{8p=6;3ZWK%EODZbYzz6-9mZcmE`CYo9z@iGN;Cq z(|okdDfQ&kSI@CQleenf+}vr7uKyPh*rHi#VS6{Y5QR%$Ok(@IiyP_@fvZ^gGx++!3RGBDWEb@iY7>Zsg%&L5NHEesS%GFhZ zde5(7QfX#S8dH9iaHR#hI*L{uIdCTASLv=Cho`iTG_xzM)KxmhUD}MCK$)|hRz<9B(_XD?8;P#B zZfVuF>xHB+Z3`J-p{>xC;2@0DZgGbb+~G2W9S|;ehYx8>D*HwTB>CW-=>pII3(Re8 z<)9H=t5u|zT}9S-Qr2uiN@P+iZ7oK%7Nc5=QLV+OE&v&=u0i@5q_08x8kN3=ST$vB z?{3N+Sz8&yMm%DBBO{(CliCc9gQC zCp%rF3u(xCmS-wpN;g1Cl~ePL}Ni9s!;JE&;CxZw8ww(Us%y z6Nw^G8zDw$I<&j}7Q4Nx3cK}mg*QaF!X{x|1Cnmn+Cxn3X+2oOklSO(?J-r)TO?RO zb=uKx@ImlNuoQSZ2%{Z@(GC-Ahx+YQDKAy-0@wg+P@;Bd|JpJpRXY;gsX;3;H3lg$ zc#A=u7?h1c>PaB08Zti}ybQeCo!3Swa~q|cZO~R5jJ6XnQN;p)ky@Kd;S*2=`Eo)) zQX=F&0*p-Y5TyAKB|>iE0EM00@ui3@B~OiI;LTt!ts2xG)D9E_Y6G%@EFi3? z)*7q19JCDdFz6xBQqU5tPRQoi-LYaqj~P8mdMxX)zQ^VsyL))=5V@cnk>l{C7Am$!{RfWs?=;@O zit`*TWBrfE`Y(_59~0}}GuFRHtbeyy|Ms!|NkN>=W67U(DIB1%tHL%4BY143Kl$wB zo5*U$4&ZiMt#?PBu~z9^8F`Pj%8X!<>+L32&{rnD8rj)8IWo?b6734wT3^%A0*&UE z$(v&xao%rxPw;kl_wnxN9q%3E-Ok(Q9qAon4mJmxo0^-Lea&XGmsvLpGnqrGj8l$S zc`FO?3Y3ADE>TzUK>4dSb%B!y51R!IC1*1&O{8TE;527VKBeVZoIhsRs@NAtxyd$w zoxy38mN_8Q*()}!%G(&_>>Zot^hv)dtAhFAY`i(e12`%(v#QvTNsGg!*IZ4^af=@c zcZb>8vQAco&JR75O)cgmh9(C059%{8ms(Ab7A7)gZl@wALA=SvaU&aN_I zL}aHya?;7J7QIE!)Rbz`O9t6l)xM>ocj_pa?pvCYeYG4}ke*UaRvD;rWRc~_(x_Z( z(My(#l7XvSYgMlGHRUS$SyNLgtX5B%eyU8rYs*Z&w#;NzX0p4C<|<=tP{#WdSydUU z_o?g3wEh!iqJFbX18Eivi2V-_SJO~FT9G_Y-cWLEsRiI1=aM;vq0Z7gi=~>9`KbHy z5}lKmUns-ef+{|0D@buB+fpnQL+4$e@0=&IhuTsqXkKb&R>eF=K}zLN$Iw(;Zc6r+ zLAf0^Uen!!p6)6-tnOgG8Z>g11fI(NZp7f7o)l2 z*^E-M;B2?z6w5z&Lo*}?>25_oOQf%)aD=V3Je=TUoOJVN^8Y3v^XqC2LmY#F%5<~q z$pk&7Fq4P5LYhd2)!z-QLRvR|k6t7P1t9$}X-u3&c6x;Fpd&Qe_ztO7dYUd!9QC0> zqfY%!w2l|h)9m`o?cVgE{H>(0Yq9z{7{?CWSu5v76pvOi>2YdF2hm~&!x!&cM1-)T zRwlixO)$q9osI9gMt|GLqo>#|j_R9eKb_|`I@R4{EHTy?YpE$+)FNv48eNR(s5P2$ zXg1x25tPz8I>6bYpV)0YsQx~`0IA#PU5E@!X!S@H0^Hv4gFl*QN!1G z(s&X5hSLpXf$tlKHMkM$d4Rsc{5o(PC-NZ?E8;ZPo7C3Tbu$JTCC2NoAL-lH$*CrC+SUk-*WENtUZoWZj(ij91MYefsJUvDu@REon| ztad;jt8c2^TGza;vhG5iVU!zAW3RDat#42ClZ+L(nToK%w^>#g+Fb;IkX*R8JGVstl#LANwGVXde;C;{3e zeoq>7DgqdX9dlKF>rZ&8vlZ z|CN?krq|}xK3TiBu47$F-PF1zb$jZL)_rF98M}=$a7{a7jM+39V_bmw-$xJAdg#YX z7~`jOmd;_#zlSU|_Tey$I8v=!GR8d&BOeQwX%eWAZ-x9zxtuF`C)e;Eew*LrLwtfS z;LhG$bOiOqE*LE)VGd7U$x=0p%;T!FMmQSY;?=@alFRKWlK<^ychIm56Yh(3jtqIMNe^DgHiTgwj zJ;yugvKS0ao1+~N8^i={jlNRv&&P1z*rSv1=N~DFlDI$C?n9c16^hq3>+)}k$z;~9 zn5GMV<9_|DNoa>)2m7(m-r;e4p3_AONUN`Sm~40tr*;_xQEfqt> zaimS7M|cnBxPzvN9sCs5r8oBD?VQeQwJx-fXF?i%=vMJ4wGl<44fJ_5{lJU3Id<-4 ztW8@niFD0hrB!W=;4A03LK{pK zd|7{6e;dyCWk@mtnrnu`{V8;M4SIQltXed*rZ<@c?seEtIoRt#;u7B_rqL8$t^J#y z6-hLL3bbM|kRPwRq$g?JAhGSRCdpoX%w)2gBJ}Q9@w3!l{e2&K73wEVi)38;P`hYk z8`ioBrlxf#Xda|97}jkG_R?Vbgj?_}JW@AAnr;|ls9bE;PZ%w^30vs{13Rql6}EF* z!@@HSKOPAUzeWE4b@V0rVtuxL7tW^3u$uSLN_vw1fz#v}oLlW6#~UHd@vuEpa7J{d zuG9mw>rVqgqlwavH$O< zrLX~y({uEJcuB0so%aFpx|k!T&?oeX_NM0GF?3jeP%ohj+=)kWGxXdGs}zZPON|fF zTYCzJ_3w^d3cWYZ8Apv5Y7e5l=j2~AdJUj+Uda?gBlt%>j7_j_kfA==B>%gSHw~=t z@~+}0TLqIzml2J8y-bL_s%aw3$6Kbo%GAm{Vt#1s@W6}qVYT+*fj`=Z1=iw{Z?CmW z?$WtikTodE8f2ZU(-n(WbH!nz%Vg1Ou%FHupNY>*CiNTZ5srYPerNoI+1r-_x!J5R zG{4Q!%%8&iT5JmJ&%XU5HsKoO&E7l35S$KmJe)#f1An~v{OQwyr%zL2;`zYy92DFK z|GIRBS=79|Y;B_3Y0*8p_w3fSMe`6%p_dJ*ND|wkMa!VzmLf`Yve`Now2ST6zk>vQ zW$idiSeQjT7wXrhV@I3s6?4DXID5Yi@pgGX@)gf(d-Ox;#q*GzJgzr+mZNL#22l_KpNV+2B-3e{Lu{`MEpoU@{bX|QS^V<`xf{pt83r=J?5Js zGm}h`NivxvlP@!Q6GI3g0H{D$znMIQh=>RTD58y2C`f_?LlQ!G9uA`ASjt6;6e&eZ zsihPtB1Pmzib!cnQ{*Zlaww%5DVL%bDTkt$Lm|2UwZ1Q5!oycRx4pj`HvhHPUVDA} zx%S$7&np>88NT%3-HBgM+~j-3cSIbKjwF33ok?<5`XtE_88zrWf$QVT#5khR`ts-> zMMx15$q{lyR&+!}RCJOfIgR8l;UDdn{aNXLe_DD{a-aSrwCDFL%+K#%nAFE^;k2!v zYO`6?Bzr=PQJ6=H@FaU=PnO%`iE$?-!C z`{gl7$-djf#FV`n~ACM61#9#rx`cQH-zn z2$SiJcYWlEEbe3cA3p=h@x6P`@VHKUu~-bL3ybC|O?;V)BJgEw2UkC08La!;mfYUo z{@0do+j2dFp7&tG7oL_wh)skH=qZ2~ExDmb`W1#>aa1hTS#J7%yhvloW_G z7flK;ntuHv112L$oy+M)6?xsn_E%lc_`F_U`vIbN_b2)Wwz}dslD*#Kf+0lPU-u<= zlb?x_zA3+VB{nWP%HxTOj#EC2i;j-Fnj;^fI8+Y*w6Nnn_2+a~5ZU7Wo%du<&BoEH zS>6hJu}GFalEorRew)ujB3DA6xP$~xoZlA~>(A^pKCD@q{8DC$BNlPF?oV<1gv0K( z(hDDP$-VSNbc&WFZ%$guBA4W9mX^KLJA09*S<3l0EYBGq!L^N_0T)+B6E$!kP01T!0?7hRcrG9N(v-17Mx8}`zYvzg7 zoNhSw^y*{BRzH1A{qx_Z(@6fTbza+?x$n(ym5zImywbY<#EJDk`r{ulwohSf%aldJ zF5;x2<-w>}HP#&$tNc#-o&6p850*b#-?3|tSZgBXYPnjivDJi4bJj*yM^A~f#iS?^ zDZLbXFRLR3&SLLN5%B{#4v*uw+!@n<8-1B258I!DwfgOHPgIIl4mGVDI`!IX+M8ON zc3!h+&Cv^%^jbVM@RSu+T9?wFc2#d$j_E1McD^h z-S#MCg2cKb;|92iM7ty0q|s6y1tu)a;lh(3vJ#P8MpxhN{~nOsBH$PO3q-$sVGW(H zvi6VmwX~m;qFVMz(f7T-e*OCd>BYV6=cUNk_DYfM=YO^C-S>X@Y}J;)% zz+3tA_5xZvaZ!^AJ)tM`gr3k7dO}a= z2|b}F^n{+!6M8~V=m|ZcC-j7#&=Yz>Pv{9fp(p(R82Ej?5}AGv)%bk^gq;!+lM4~jn; zoze*Pcl3(^s)D*4S`72_88MfZ#=OSz{>)oheh2e5=D)^#FLMkH-WWrJH^$K5jWINM zHAKf4LxVTQ(BO?RG^Rqu@K7no~W8N5d##vRPI&Q?ixo`%U?^%w^)KEW|YT4|UaavsTsJQ1a&=qidyCaY+wD*2tFH z#OS(>AGmqpwwL8PxN7w)dO&)EMVU-Nw|g)q0Z} zy)yV&NHs9kxwW&oH`QI`kY+73K6Qqk*YorG_S45st=22*>*|~4HB{?&);BiPH%@A* zsjth`@2IWS$J9JLwP~h4rg~;|LaV?=ruF-NqSS`q^j!alNuk< z>!;khtTELO&#Il&*qK)nT1;j|&E&@Vne|hevhJ^LoC$TkFgMuWRDs6mdn?8ct)DZg zu}U9a-PBZD-S|NLEPeWO5*UqZKqfPaCRn5$XT2wHpt_n}pKw&bp zs_U9^_0GEM>uTrenKfB@_4J46p=(9ebt>PqMXX*`Q}?jmSUt0;v1T$2P)O}~ysNBI zZa`)YYH6yTPNUgagIcTV=hW5KPYSIRZJuPb6r+mn)}t!WSxpVIn)Isb*)@}^NoQ(x zZNqgPf+MTvg)|8!QwNi+r)4BLVJ6d%{(xO+Xa2n~9K-b4)hTP0Uns9CuK}+pyOb>< zWs!DGSNeS}ySiIl)!jHMNR~@e2t=EJWeKH&4zzTorK0`UFS zLhwcE?cfKf<>2p7?*Ttd9S(kkIuiUSbrkr~>eo?Yr8))t!)h(~>FU2AcY*pS_(eED zD(Z8V3?W%EExmml%OSr3DM+xiapqt<^1f6RIk{GY6U27ku-zrdfh{uTU1>qYP%TR#T>i50VH z{ZH%Pz+bUm1>bHvfK%1$whx42`!MV&A%(3Bds--AtL;u9*~9IzLb1o$(RX{MJsW&) zdtdPR_I^UP7uW}ZztcV#^1JMJgCAJj{sj`9|eB2eKh#5*>M`SkFnnieysfg z@Z%gloZ6Bd$wG1Hj^W@(I4Xqf80lyLKf{4jqodK$2!5txCio`Di{Q68wn66?j$c5s z-LVsr|L$l8|B4fK=yW=9a&<;JBf&>GaYA**I$p3#iWMUs&_%($ zBM0lE{Jt@uBZS~}$F~lXmvCx#nmq0+IPn`it<(sUS8-~0as8B*P&axpV(d^|c*cyX z(D@soB)4-cOd9z}bz_~F%5*N%B}~^a-9+1!XlB~N^bpe%OwTaANL2Dpe`NY2lAmcd z(|o2SOa}?$?-bBq3Fw8E*}sCcG19VmU;JWxBu3VWQH;PC(cgNG7H$!P`%;|nhMF3B(D zNrR+e(imx+)F7>p)=2B6O>o)G(q5@mIwT#F+N3kmdFc{=lnzoFRjFA~t8S^t%WNggXopG3@ z&dep5&t`7RY{@*9c{WRAxwA5}%CbghRb|aJTAg*&=uOrYWB#+p^51QedLJ|6HZwkB z#^(+F-j|FxM>AuW8T-sQ(~R?t=W@!8*5;U_ahuyNryaRCy zbSC_*-~YP-eTbF+D*qKr;S>22b61y@XxhnDP1S^*_ge=JEy*H6O~HN}iJdk_xUmyv z3NP=03E2Hc3BNW5dte6dep%QzV#ICm^!JPY_DcBsAp7hR_SU8Bm2YQ%JcvEylrUaAw7LMm+r_6Sh~TPSVmg6La!BZ}Zti`)PfK#>ll135rG5CjGQgH72mU^H+) z@F4IIFcqM3nt=JhBH#&NnHjGH)&T3!h69K<0Gq)dLcC3g+uOk(1-}#64eSG2fj1yO zf%ph;9B2bh180E?z$Jj5J;@M3*m*DvZ~?K9!Lm!w2~oI}A(`<_`C#HL^Fq@mq)4^4xhk{kW+LE(`qK8Uzi>8(q6s;*O0m_46 zrE3XA5B571+zzaV-WfwTxTWN5acb$F;t$Iv79K{~gkuJRv3L$Be79sBu%Y-o^gbz@ zSmZ?=wvw}utzj7L*@^a?MSI$cx1!9$$p5fpH=#&}JRRxtNCQPVNauHJ=Mcajk{-dR zL%Ip+b>KGu`$`)at-u?l4M7*$=Q7$@^aSGE()A`bG77*GMt~o|vSvmV_^OcfH1I&t z=1&KnX)&=8^=>R$R@y=cE1vAT3)@w33zvO&SvvY|ymWBiJDgrZDz_P;o_YzoaE;#!JLySRWk*-hX! z0Y&$t9H4W4&3RqdIgg>^N$4!M@Dr4C<=VVmKaVu`=KNnmz3rIueT1T5saiAu>Ff1x ze7+TUqbR&ItjJyJDw>aZUxayIhB@C1Jc0CpkaTzZ9utzT1SUW)7clg#B7PtW9oAD*sUn0gS(Xc(XKi8+DOV3=7!4lXeVNB^3 zV0(!DZf9Jx-|dXt(mjkS=o32aw*j`-5MrmZ*(O_pOTaH+yX`jr!D(a@0NEtj;`R9r zNRv<5V)zHPVM3=puQGV}jRS=1{Yue;rk$Td`XbPb^d6)y!)^tygA>R<8C+j_F?go* zGC$h_nEoi(41Q0)Q^gwe9Z0v7o(UcR*23nu04;d_KLo{RKI@MD36NH6Afn2L3niglP*Jh80MTz4a3zp=2pM69(zK^NBH8;CQ@ zh9ZCLwfvIPrhH_GzbYx(Svrk;AmbS7y0&h8gd1$5&Oqnd>qMu#D?igf*P6dlHl;*n zpWFtYe7aMwIJIOm@*ANy7xBW9^wKko96-icUbC$&-E3a2jjckM+KjP?S@ei8bG5`i$e9dl>x1PT)9v zT^o<73|+Y^ec=Xu_$2gqcjsQzZLipUgO4c3x_%s3Qq*3$JgAng>Kgm&_lO1N+A-Hu z@Nw{j<=~fxfJcrR>^_S3;Ab3f7tL(|$|0#PijpMXnIdln?(4PSP z)37(fO4Da=Hhgr~*}z1Jt#nUGIP7#7+C94DLRb2Jq#r~-414X`yNch14HHfoD9MN2 z1_3j^zMWnDDByj6V{iy~0~;BK;De6B2hn-QM`s>mePGXt%s1!d9Ofko z^WrISqrG0V&m4E;@8NZ)Bb|=+UO`$%ItS@|w%5)x5&Ba$CB#05z&`yqoGq?9!v&|6 zEe%!yX8QVhEE!N%#u!|>v1Ax9+T8mMKX4(KYo>!n`{2J;7%=_K{bj2OIK{{P!|xQo z7I!)i;AU|TTH}@fBA*vRNmBCAj($p^h*cg_E()(YTK$?>u8vi|E>>7_EI$#eEE_G) zOAgCcON->P?6>TfGAyl{BxR!67U?0)ra7f5&85Xk(=?Cfm1by(TB6jX`LrTwmR6z- zl)kGypjAmvYg4qT(vQPtgw2pP*yHRz>8JK@*juF+9B(@vass^`CEw><<$P71&aV+g z0bcW!r(}AqLs_czrCX+&(v_cS=IiuIi1HofJ3?rATAq*`A34q$chZ|^r;xTY!-=%B zw=+k`&OT1_W*eeC+tj8Xx^yZ1F+u`0EJZv1qFfNFrO;9&Y+5eb6s8qwMIs!1Efp@u z2aXR#6xZ)|{DtcQ{`bezR^#S)ux_-S}?X4;&OC z3pbzJ4tGHW7Tky|+;+130D6^`3lsn)Kshi37y*niWtG4LpbD46hIl)G8|iKDBF3#W&jJ1vc-%;{a3jpZO)v{Lz^oIHe~1{jxvVn) zZf{u^fy+YBpZd+#0DAU3Lu5w*9>52rLWb3H+Z7=)cQYh2zA2xbeapPibSHE%NQ@Oz zM1z&5)x_@s#_8$Y6=-=r->)#E|No`I&0Qmy{gtSC|6}U$K*ffv7 z7Ti?-ur#-SG`I==@-&yfQmFdAYawl1+8`03Z~Jl~ZDd-ZaOsU-KBUE_whODCck_Ur z?-O#$hLk5#cBd=@w>D)#%AS-}|8!nEOmQhL_@PIYM?2pi((1L@BFvs|&xhBccMGEV z{eT#L-9MIJ@%Qp;`aU5^yJULB&>`iDp+clK!?F5qL@HKuDpoP(TBKqXr(zYSo&d0d zQ?Y_mv4T@CnzGA+|0Hc1R&kmG!0JuI>PfEJkDT`nc z%TiXRtkE4QZ7HWy&Zb;Qxs=lGSN&mrmp|5@==b|G{kgEPDBYv`^i(}t&r7~YHkEu? zFVxHQL3&yCO8r@VuD(!TtS{A9=&SYT^iBF!eTTj)Wt}ekBm86hm4QKlp@ETsv4L@c ziGeABT7;2-Ml;OC%*V6s2_+V`C$a5mYt2isl*+g=RYUMy^Hq)1}hOVRGv zzAgf=y(p1pcf$g+*#dLe0{gH9_J!@mi+ot!YogHkE9X8DbhbG6ixODi>#)iH;e1mJ zbiU<049k26HVF?UJpZtkQJYG*O=aAsf!wA$VByQ*xnbwo`FHT!w-Zzf9w36 zh;SZs9u!f|L(W4Y+WEHgh;Z}ow|-T1Q0Wm|x{FJX>^c#7%o9<7PAeMuBgwJXanSf2 zA6h}@H3Nd)Z@)oDhK`RljdIdLat&>TKMN>{MC2rzf1xP-rX|H<_cnB6Su5ivWhuz( z)H7<#yg^GA^d5))6})E#qfw-T?FS4L$~Ng?IbB0mq@G)Sg(4>YDS-E}m1z5FW1;#cx-girph zd|Cvw`PzJOC!PMqV0*GXUEI}WSGnfw&`;s3coOST-YD-97I`;H@v?TJSvJ|1pT~nf z^C%LqpCqghlIMQ9A@FB3pocmnQ6kE(jhiPZqCNQtn?2irofHx_BQzzc6pP?l$$S*+hqWmJt-!5+#iu|(tGTQk|w9SIPwF(>eDvaA{ z$1b}>YNa#07=yJV;`aPqkh~W~MciD3g}`Fwj1bD-EKOnQb@HV*(V?*77V<9|KCO+{ zx9?VMxmkM_e(|=@X^B^%;8iH`DwKH@YPeSd1mY&RmHbw^p=HVOVH{V)RNW9BN9g32Al#@?6*CQ?DrR|1^G$P& zuqtK`Xahob`P!I`UHtl(mXMqSEIITkWrntDW6V*|ElmIZ@aera`fJps1^C6jS#n$I&Isz+m*Z=U){c5Rk#K1N^N+{>8zRj6;X*`C{2c0w#d zYIQf+yP_7U$GgdP@a)%hlV$SkkLxCTj%R;Jm+Z5~{lCsGZa$}<*II5ihLYGR4)WQ^ zOP?Q$asfCYyEIV|5&q8_s4up+ZEvH`Cv7Lu=Re#2EacC>OY^7Ky3UQ^nLdH}v=2(O`QQt~VGdB*i!vQPIHQSx*0PmuRhc_aMh^YZi1-Xd?oePWxu z4WrR4Hw!C9<5$8aw_r?q$#2Ss;7<RS(f0D_E z=yn}GBw!DS7<-yMjqk_CIMdDMDW*>{{Q=XJOjj{|n))KCQW(a~W%i{H%TguU39p38 z#0e>uciT|e70JfCa;WUGxQNu=ZnCrNhqrW-of01+wWgbFA%8x9aW~mEv5$A)Zk~I+OLlE+o?_dixfASfCHA*6`&$M6_Fe2{ZScBQ z(zcxl8PD&r$~==lQ=Y}2CeNl7 zBrRYMvJ0mj;oJr6HF4O)eqaZ1(2Vzo=yay{hopCeKnfkj-{)#AYY8(oIGLsJtWzIo2k%oqeOs6<&yCjY9Vha&3?vgBZYX4z1zSc)45p@eZvk?GV<#xkVM*%eB|MusTsj zsD$)Rd=5R5+<*O(R~FpxWElU=ny@Y_?zSuS!pW=GK2f1<{AUdzC)v-r?@F7bbNqTw zBl<0DSpT*)U7+;!FyzZZaQeFR*)CqP!B5&Qacsy|iVDlre_YUF|B~{E z>?H4w4xANm0@0d*Jwm9PZVqjg$*;HuZM~>a7Jm7lE&Y3*{;cpN?{r^kO+ibNcXol& z*Q2|9&5b(Bm}|P=JJBhtklp{p!E555Ec{Z#E11V?Fs zl+IVJ9l_4?mORN4ASVGky{jd!l?WzIG5$H zNznF3K-XTS?-I|x`V-LUSAWO32LCEK-&LM% zq4K|>4QDzCG+O%u=ol>qmh&82l*U#x)UeX7*RwD$JmV9X?qeOk0mie?XMWIl%N+OwWn0LFYE+U*r-7 zGUeCyiQ9aVBy3TY?R|(|r5k8R$3}Vu zqk~>W|8>Xhv`#zb5wF^5En9{#4Pyz}|HJS%M8D7US*9bHZX|m)a@z}-{+?lq@&RKU8oEMeO#f^ z<}2_I^0$>rmX|ZdxXIsA1~EU3DZP((k9seyGWy*kxk`m)$`7h!X*uAM@jgDo2QN33+M@%VDL` zL86d6OP+yv#X*|VMWTwskQli{Az8+n%a|9;6OHCoIau}5E<+T2ka_m=N&%O-hIn-% zmo}04lg!g9Nau3)aof_>g~XFSB&0uq>>T_jT&6({3EBT{uBDROu$23Ckv(~(DWA*b zx3YXL(-SN|K_kHJylAx3QpK%3!foJ|aGB}q8_ZM56L@?k@R&@Xr^IEGZ(`cQbRx^Q zk#{1Bz8vA!QeFFuo^ng}ahdyQ_XJ(Ww2C!pJr3sC8O$vi%;V6;`Z-)q4rz*3*3V(j z(`wEmNhUB|L3RR7qHWx^Hm=>nbOrC-C%E1X z(A>RY`7QWM7V@9pvb+qs&4P1|oJCY=Ag_oS8ArZOqqV=3sB(nub16~CSFoI@jcc*7 z=iJSFCDYx8FJ-!vM`Nim3+!nx8}mZr34Sh@%$6W;;@M=YQ+84>NCL}g;T|Ucofnlu+)`tE=b~$~2t3 zG-@BfJeAhS<%jdphKYGrHKv-j)?B?%xPAkslVYWAk8sMruu5e2bf0R%*8BBCfN zAY#RiVgbQkKvA$_Ire(&y#ivxu6XSFO%_`Y=Unf(=RW`Q{r7(IxUw>ttV||r-aVO2 zR=)KTbx3hg$^=Mn17`}Y5^VMr&r6d2t&!O40I35uuR;Dp%Cj~Tb+9}L&hFDU@Cs!K z+dxjSJag;vfUJd@`Sh&_N?0V80jy<+x^yq?xzPNglxjozE2yzqP{L$Lx31d?DcYia z=}joPHdr$NJJxXALEl8L7*tnUI3ou!1)Wf)K-r-7=88Hkm3XX&a0NGleN`y)YS{PC z*L?B1e{&HDkDmkWhbnt;>ZlqApoXzH)HSj^WPzF^ zCuE|G+#$xZ5WoCwh%AvEaz>^NqIl4|MMUc3c<42VQ>AIPAgG0{E0A`v5ksS; z0!Vj|ULf0p^i8COr2Zg-K=ubY1Y{(tn+J&@X2;*vq!4jL^dOzTlyx&S*}s(hUrP1A zkeK?47^md#YZCBT34*V3qPiz~4P(Xt;iZpkLqEj2gSEp=@nK8{2;Q@LDUXQ%Otx^+EU zu&1gQtT$ZWT0g)bz#y~9(k5lf7$`AyRt!^>>#LP9P^8MGo^qL~jESNJek0-hq4Y`O zGY}+G;Z%4P4HZpza`90dy^xqn%;24?H`GInC=uErVVg*Nd4OZX4{Wr0@T*H{B-vAeN8XFa#TVV55m>Ls}#2W%uZ$_vzLi8URCJ6Z)nr36>Ur3 zQ#&%S!(eTC9;#TE9!m`(g|RRqikUQKl2oKA#t{Aot7CQOuXE7O>*nsXSGJDE(E7b$ z9+S`@4O7NDDCb)LNc}M*S}OfW`#T8Yn5j2-wj&kS_{aPsB)*L&V>xBYEna-`DV08x z(%&e_a{8O#Nsr$R1=H3vochZ|G_C&4s+*`_Gr%EC5lK4mhB%NK0BOEkoMU9nwAY7oaYpu`WE1_685pQ_jyWq#HI# zH&L5qG(VQ^lkS5#NmA)T7z-9>-HKFDQU2IkgWF#3yMw2llg^VW?$Rv_Z zCX*>-Dw$4Zl58@EEFg=?GO~iKBJ0Q&Qc8A`a&mwiB!|gSa)SIyE|4qa2Dw8j$pi9) zJSVToJMxiyWh4w?)EJ&=#58718FR*xX~x(v%^7>fk#T0^j2q*@v|?H_ZJGYeASR3% z#u~7OtPvZ+4q=C~!`K)$flXq^vZ-tuo5^OeGuYYee0CALl+9;XvTNCm>}GZwyMx`s z?q?6NN7!TBW$rq6o2%fexQE+PDxGA|1R2uR*$a1Kxld<4t%I(!<5L80q6JcndPXTk%%Z1aHUNks;oV zccZ3wAKr(I@IibK8RMh)C^Eq(@kwNgf5pEdGkgJGK<4-gzJe_94SWMx;yd^b{Z**M zm8cnhfFB@h`~*KiHux!iifr+7+B0vCU*ea@4!_2)k-aQH7JwXNL9!s^NF0a*aw7B( zITL{hNFWNLKyuN+{ND@&; zl0=eFCz4E(kq;S5?~Xf@abz6wC8;D8bs-bUMC3=(NE+%&GDrsMMlwkz>Q1sq7V;<4 z$TZZ0%pfyR0GUPase6*yWH#zW=9Bp-kSrpLP!L&4mZIJypX8%pvXZPseaKp}7WE~Y z$!64#Y$MxHf3kz@Km*7gvIm8b{bWBHNPZ!|ph4siIfMq2BjgAgLfgj)6iUvJGboIl zC+AT(xlAsjq2xNbjv~lyavMdG3Q~chNHwWO!^mUu7)6t3 zA5bj$LcX9lG1wl8XJm{FB`~UtDjLaf42KdKEk+BCVssf@B)+e1f<`lDj2TL1EEo$k zhOuI-&{)Qru|_G3En|zuF?Ng{8qYW|4k(pzVw}(fc-wp;uT2e1Rs zOm;9k7|mkC*>IH2MzK+7HamhHf#$IBY&@FFj$%ildF&W=44Ti5XUC%j>?C#)TF6dj zC!-v83OfZYVyCmy(PB26%|^NGJa!&h!sf6!XeqmdU4oXed2Ak9&K9zTD34vku0i?i z26h8l!4|W{sDRzdZbgOcc6K{j$?j%%qgCuab{|^J9%K)qHSA&bFj~tVWsjnD+$HW3 zTF+hMuAvRwE$$ZD$lc@ap-o&RSBZ+a2iyZx%st{Bq0QVA?g`q$J?EaI67Dtk8g1p? zaqrMJ?mhP&m2w}skEo3M%zZ}Nxv$(;w1b!M610;iJVCp7HC_$v=9}_O(H`EEH$~;V zC2xuL@;1B;+Q-}T_Gmxv%sZn4{6c;q`i0NsbJ0P5Ilmko;tTi!beLbwuSQ42S&Zl? zU&I%oV|)o;f{ycLd>J~y@8Wl%ll&fj4?4x~<@ch~^p{2#O~n@28rxw3yW(0r3(v>7 zcsVY>tMPhVhIiq;_!oQxpTKAEd3+gP$G33>uEvk)@5wVv#l1B>32C|iGC%ef$YQvfwC#T6da*13cx5zzmpFAQ@$xHH< zyeFT@cl?-Pu?3^UG+`7>2s4Bk%9^l)*f2Jd9nQwFiEJ`Ej-AL(V`s5**@bK_yPPdx zSF`KcBDRDrV|TH8*a_&wwF2sS0rgq~_1XaS+5+{wfqLzLdhLOF z9e{crfqI>QdOkqC&Okk1;9VEsogeV7EA*|p0lB&ZoBV-IJ%CLCK%$;NqFz9vKp;^N zkf=A1C>Ti82T0TxNYoEV)F0?G0O%6}^ce{B83gnh4D=ZS^a%y}gaLiRfj&clJ`q5l zNT5#?&}SIXCmM(|9EdXlh!X?Ei3Qfg0bk;QFA2bxk-(HhV9F?9N)j+-G%zI@m@)>K zG8UMU0!$ePOc@VMNd=}%0H#a?rc45+qybaXfhifll*z!9Okm0sU`m!aUlz^5=C~Pd zj-9a!ev4<~d3Z5ihF9QKcpWaqJ8?NafDhy2_%uF;FX3zW7QTn?<42-Kkw`L}%q0s+E?G_r=&$X1QbNkeF0z;Ia|t&i$H*yi zmRuxP$xU*XRFQ|IhP)te$ZzBm`Gy~nmW(lC$Ll5nd}^P0lS!8#;#yjvFq4P>=w3^-N}}-2iW7>748Oihr7=`lT{4i z0BJe`X*vOEe1J5afi%8Anl3;ZKOjw4AWb*uUv&rG_yccx0B-_-H$8zjy`Ya22z{g= zU{7ygPcX2j5A=)r0)hGgf%*f11^|IVfItI*K!bolgMmOpfIy)@pfDg%I1p$k5GVo& z6bS^10s;*K0!0IXh68~{0D)qFK(RoeI3Q3w5GVl%G!h7u2m~4h1WEz|jRpcG1A)c> zfyM%XQh-3?fI#DcK&e2W2|%EUK%hxLpfn&*IuIxW2s9Z8lnDfy0tCte0!;-1O#=c= z2LjCi0?h;h%>n{t1A%7K)@6b?ab%`$w1~gM=;0dvK7Ws|ZabvT|l13`Q@Ulm5gwDBamS2kr>1>Lt^XT%XE z3B8k(NUZ4{z6nY|htL^x6;+@bRExezR3+LHBcu+q;Ke!cPRJGB-1b4;@H<+v4E&zT zO#G3`Y4|ghvzc@%O_*pTC63GpDxH~FD&;(nq})SZlgh{c#NuyY@dH@=1Qx%5#SE}G z94y9w#W=920T#8uq6Ep9criC<3H92@dM&YD8&$6*)oY{cwd5Zf*R5Xb4jQdVvDOfx zw0=oT@P@oaGD_|Dh@s^EOs~QL_7|92-4e#$tf20-Xno7-YhI?TcX5jbtDx7Frq?au zYDmQ^gCy{diaN}old&#zueW$Mr626YmDJ^~TjCnntC;Rp7kS(c3F26ka+LAM7p{yN zyu+XmSN%Rnc%vRygWQPzyCUj{W!FT(C$B-LY-=WYOJS`M-TYR(AA2wu$5Zw#b*)p*_nA>Xn#!Bc}cL3S3KTALHk=UtfW%l-u3^o$b_z z>$lgpfZ6p&RiF@Fm-bkHe$;eI{D$`Ha{lc2erIz*MkB?{Cryse0D7YwGsaW^9IIbx@~h7 zYgu(Jvk$rWO7l(sv<34%^c_%;(KtiMkR28>@TLMRl}M#JF0_a)4{WklY53WtL4jQa zzP_{)Ld!J#B z3YY$L)m3n>Ulr0z|5r-J3#_=E)sc1Y5ztF+BQ&d9HHqsGogjW?s$*a$vrd8jEq&Y+ zo{laa9v+UK?L6G&%>>K3Gcx+=83jfpieIG?G9(raYgj@M&X8y#nyxO*kVw#}yQi9H znl1{?7<|3G;<9S&j=WzEJx}%A)YqkWM0&ukY3Aw!w=8y?+yD4sr)}LXhbQ&@dhh7; zp!4jRugfzVr4+3)w}^GA*nGE{cc=OOe7LIpOpiM~REFQSJEzruPM?8!tv~69OOGYA zDYtk&VC#Fup6Zc%Q@(#V{iILZr11~mOi1n1*SYAT#`+u6Zg`uvv}jkQW-To^^Pt(; zSy7Yk`Fxnt{qW65ljEZ%wkk{3U%RHDAgTBI2SW_ng?S#2@Yy8Oiwv&$xb}4Wa|45h zI;Vd)=ZQ46MpRCA%5LNPtV^)pv!&6sr!}=ctGN1w#YnQ_j+mO=kf_lbA%ZcjQezF7o=g|@ZQADf(bvp^{qolCWku{j#jAAiA!AFK zfuNVBYw7yoMlYWP_2=H7lRuZ*mmGF0)f9rn45qT~LRXYo}U7QICJ{r)Um^Kzo+?%k;?TJ@T| z`je&SWxQ*6zwI>@@zZc^e9z%IEk{pzY;;@YsDED5^=GX*>ss}28?$x!UYqfA2KM;E z%v`+qWAkP2y^VXN&rbHm6W=V;-?{n50E>CytrUaZJ|COsb>^kUlC(C=JWri*T(|u$ zw+=inZg(uTsa2}ZZS^l*XP6OVwdwO(sQ8=v-;GI4DBtwjZ1#uTu|sapTzD>G|Dw5? z1pFKKDxT;6q{vlKRD*M zbGK)`Kksj~XLrcx1$w=@o^m(s)!M3+H^yR0W@?Y! zP3M-pTlH;bEw|La;N3}e^Qw*aCGMTSI%f<|$L}_{-Co!y?{nA78X31d=V*Vse|22a zw4s$@N18d=ZO$_=)iBv{Xp2>uM!?>?Mhil^tWDXzh?BVc~+C!o}4!bm$)dc)HQ!Qy0th`btiEIJxNQ?e4Zz-Bbv!17Ht< zBCvoWFsswQ1wiV{)RUqSzmj+C>Bp9rJ9byie=+FZ@Buqh&PkW=O&*p%w{SUoc#NHMa3*25?K9!T$;7s8 zzA+}YZQGvM$;5briEZ1qZQIt#sXBG5zFYTJoxi(wclGM0yXx7!*ZR$lYE-pdjab~I zRTXQi@=QzCSv=Mc(ka=YWzzw$>WYGei=b7b1Ii(?zBXGR%Xo`paE}@JrrZM;De~g; zIRLrh`*zi%?JwR6Jsk>VdI%h}r`X9~+z%KV5}jSHTZ=b)-(Iwuizt#l^ zwbouGwPL3VHe+}vx(C}H~Wr{8(F~oz$%ib)h)k~E#tJXj!oyoJ%k-@h-CV)f#%IE zdB7*ZuZ7d9$aRJ4s=a`PEA3-60=XRl24!bsXLobOAdR*eiN0NwyaYuM(|WK&Vl~Qr zI&D-`Q<#HNA?*)2$45P6Yc0dBzvR8sV1rVjsc8**@wk|Cg(nNoEJb=tQO}L)a%H=^ zWBDT?JejblQ=MCY`OU3cN#fRnMRA|kk_l5COFej+(@i$7iO$4Ik`x!!mY0T=j`o?k zNgLb+huMaEExV@<2R$F={J9IdfeISyP&#()CUOVmYpajo1-%V)a&&DOd~4>yxqYfE z&m(bo!g-V0CF@An&Xu4KcK#9%m0G81Je{1a(8v`7J-KY$a}va5n>?ipx(q4nN)s!G z^}a3_|J;XlJy<{*711}3y3tjnrtYi(ePqB!_^D*(ES95M34_0|e)QG9X=Rh6Rd{z0K6M!bNQ#)coU)uq znq-7?!-(XaTu4LBUn0`ZQI2Bn;#t={3$kP~xF((YbA6Pm!TxZeJtKBT=SFj;G*4N0 zys9hrbs~1LK^7FK`3H%5henx*BR_t(but_dUnrcp;J2Tm9Prv;&N8xUHa6#eRS|K~ zmu<;8RB?6td9pn-)z;wHzL=Bx;rbe$=bdzrHveax_0C_kBD3v6qlM4?;7nO} znSvQ@XDH@ZtK%Xc(1vQK2T$$s{b4Ub#V7EJHo^7un78@y@Nf((qM4!0$+qTNsldjik=ggtd_W*-BkRY3&ZJ2OBAGo>A0~^&g?z*mbzB+Rp ztZF38dL6R{a#zKXV(GMX5RS1qn8E!_YoL<-;`1F-KyQ8;`PRkX zL@f!hh<TkTD~YIo*;ksgGVpU;|w zdKI$VM$Yq}ExTi=`IWCTjudH|{5}dJ+WaKD$bR8xkdbYvyevhxN+jo~nEly$_wV{H za8h$X*r^NZn5zJv@Nloxadkz6K$nr?$oTQWvDuw^Kf@2)*+2%fbyJ?%K876VrmOfw^OJ&#~Y149U;cNZkvn%&0 zqBphT$@XQkNeXXgKHpJq;UiDVQxg(3yTfSPuHa?2w-t6HA_2TkOirZ|{DAecw%X$D z1?VIUeg-t}-@AFsl2M!St|A)qVf%nb$|BgT(9 zhI|uf*%0J21M0!Ek9e*$UlR!&;52InjIDWIQd!0>8`9hVF)Fuiq;9<)eAL>+*P-hK zcKVTqBBs^wA9sW=4!3@*B4-!$C16((a$iXG`}b5upxvuB5#a6UnGQ}5@3reP3rmw~ zz%$qv!YZOI`c$hdcMtW(FXYwlY%z1OVR08LRM=kpiAQcUVrZQkI9u2DJ-9GC{G%pg zvas%LXlmuaS;Om~e7Rc3C%@=p!WlGq9qUMEp~zcmt3WJiFupwZw#Lph%WqNgHrMhC z*Ts=|t?5)ne~$;iK2hbH2zZxV?Foh5Vw_aEPVjJ5MTgGzds76shNFDx7El{h`TK32 zBcFzIwZUl7#yaw@D&>*W=2z%mO4l{2P=`dsn(h0J+%7(bpNFRhEp8PRpRM!c<8!|) zH0Zp_eVEB|pPKTUFZdUEQB+?H=^;q7`VnPN6W|~-3*=T+mO0!M+FtThZN&LV;bju| zWW>7^nqBX;2L&^U(zWV*(j9b*1v(f^=v8Vjt|ws`VY=2fNR(R)(mXZ`zqB9}AoB46 zt3N(ZA0%ws-eY6x=Nn~BJ3J?_SGI}*FE?jr<1ZB`RO`R8k`1$xx75SD*LA)A?u2{8 z-reD4E%Q@VJplIXUs{PPfDM^d3)`P;Jq$~mI`M9$ChwijK+?jQNaH)OF=m8S@QY>c z_J{l4{ps3fq09y-c30m5yf2p!V$-!IFM!;5EiYCJ!<2jJqr8RH5Z%Y&c`3VJb;rK4 z`^qw*V@sxzz)WvEn-ND6IxV)1yV0j|<_!8|#6zhA1ehrskNh?BUE<3^5jjAX-e;y@ zw}X_}mz!rtjfxJk5)otc@ zFRE$E?Of;l$#%MbSSyKXjwUDv-gRfcM@ZgZC!OvzCRc$|Qsjnl7%x2jFBXgt6{UZr z=*+!*DZDUM@S=t4SA7k60cpQDSqM3t6w}*WYy_=vz$~|^T4Q*dzFG_M)yk?tL6`R8 z@uHb+DB;A+0mCiDZDwf)jV`Xk?1%}DR)Mm{dCBaHjmmm7RdA1t=4tfV807sk;YxMi zLpRR`fIw0BX?f@zIyp(pqhocs(oyDSZdXBrVJPF#iZ!o#43JRX1dNtLJK{TIwOs26 zx9BNEX?1rgPRnp|Q}2!we3#6w((^RM!zx_$+PkX_&5nmR%%ZiKFSs{2?io>OBOTmA zx5(rx%4sDjR_yF6*B=_pZ#Fw?LmP*us#+ia2@>o13Z3WwcF`u3K91`TlkKqp=b668Q^`S-W2l`81- zYdcOW7EapI==u2}XTQ~qT0}bS@Wi`KhK%L_N0wTjue0bCbOwW|E7QpU9Z-h`pBcK4>Hh`)J?K>UiQ|me$cWI z)bKET<`;JD@U@!VqdIiMQrz9ylu9bS%)A--=*WfzV1<>R2diHy=fN3*wZK2T!*wY7 z}+FmI+#hTo|k1SEomADHMtE_merKj>LL&as9?1JH#_p14$1VtqeHT= z{wEDm=kJtdA0yo0l`jn5ny|wv-l8yLVtp{~W2lK2$dD>?A2H4V*ZzfBTR|YS_4D)- zN;WC*aXmhgaBBsKKmr#-yLXPk{u2-r)87etCf#0k3zUE&LRqhH>MtqiiEM>@iA#6d zM`Ncr^IC^_8AM;1`3bBllxo!ydhUUy5+X|kjTFYd&+RMALNe}gt&s7-Skf{4#Lc!6 z;6&}{3TE2e#jO`yWX&xuQ-(RUq9*%$-u1a7_7M28n6WWbbY3YtMO}8NIDeqN+(sie zGR8-o9?VrhgF#i}NGSfysd-JL^zs2(y5uPO|J9B8f2A7}3o|?W|DkF!bFy&$UplUP zLwhT!bbei}11sJ-1=MYEG+}h&>z$2kEXGv*g)}rd(#e}-tke5RZAxIlivK`}n~LD2 zD%eAz!v7;-tc;>O4SVB7b5oc>hB8xLUv1ywdMcD5x~L!by7SBaYRS0bdZO*R)0*Ov z(E0-+z#9M>G`iYSXV!kB$t!RH31YMHov?pI>3#|RXEq>@PfNXQiUXf#=LaFrjn7K$ z=!;7QLn9rSyv`pZKGvpmZFmZ~wjZ;N+o@tsZEEiFT~-*~{ZQ3@jtONg4{3Hq&mgmY z-4JT5KwkQ2gkA>#!>p8bqZ_-;>yQ_xp5HHvPveIAO5XS71!4hX1cCSk>U3JWgrn-% zZ64H_kmsQ5vg^!Sj>*+i9j>=Ovk2WgGU195()iCuAI04x?iXQnhjFsU1M~u=zJW$5Z%w*`Ay)(m5Cr~NuSS8XiQ37 zbLMOUa{w>f)0~4jmab~h`}rWhf9$(fq&RXY$(BZP@B;nhAYWrU1ow~Nvoz%gM$O=? zNFgo=hJuI%oDVbuFyFLfK#29=0$YR;%zmmILZbdo@bA$@5DVW5LV*>FoqGut_7!Kl`7tWD^wCNBj-RuN+@34WD|XzDq5)C3Bx&$uHjV zg|Ls)yirsHC;>#?uJefTkXYPs)JKy%TO%J-@V|p$Bt)Zw2v~jB$L2rr*QZ#+c90IQ zLVo@n@+1|}2fz>`=V1*Bpc>MOkPHe&ePM)!s`rD32}=jL_mln>kPZ>~n)(YW5mo{x zF2KC|`?uh{Q0W&1CIktRc;D}SrhlTiuzBzN0U&wEbC`vFm?C&lqPS22Ur@t;So@`a zi{m14_tRpAa{gd`H`6EXvmO>1_rD2i`5T-Hh4Q|&rwc%y0a*zX8x|Z7)&6pm@3#N7 zPlO(TU-J_#Y(W3s50>n2tU3%tSc1W?T~tbu3>eW*zh2gmxg1Of$V9?q!ICcmd4vRH zvtHDGnA8Y$=sBb^{njs>)B$_;ae)jllQ5?oTnGH|`|J?QVu5xLYUHCn+I|Q)4B}5b zOMUiT;?%%q%tPYEUf!>zYVcCzlwOFiF@3&WNA*AIq3$rJ21L8T@`3Kiv_kEe=p?$J z4WCupis}K)pvlDS-OM5=ePZgD-&e~)m;rqVBi0UE2FG~m3NmfRoPkLpT-{deAJd00 zgx$r^4~6VkWhCPMhdcvqDuSW@PO;;NguF2wbnI^`!qCTF{mLKeT218IZ4yS415tx= z{yDV`V=mhM3pY&7ALYg}q^$ek3)L4Qg`^UaV;B3Huo8k{mu>ox|HqOL&#ud~e{;-^ zr+Rqv5AKib?gx7aLk#WkX5>ntb#S#e{tz5}wB4#5wJ?re%l-*CKQOCzf*v~qx?LH2 z_+9j7gd5Y4rf%-9P)9PQX=uj5-k5WhdsVNE^c{cAgr{TJ6(UvJf5 zwj%9d>?E5b*YwZuyBpV9Utacz>p|Z}cfoc*E96=7c6 zh+&At_@SZO>>>o~G0hl_B$t7BpKkj6>;BJ->*3Eo*MpzMn{jRwnuosFarNDiE=764 zpNKx8U5WW1+urSZ_NsAipqmM9B-}x6sFwG>7~HY(MR>=rr>>E9S+<3FLA^fwg3SyF zcAcsTZYX)9o_To#occtt>ZZL60ys;2owz{>Jvyt?IhmiCFhmiF` zDc-C4aIQ&rfpA|iazw-!VRk(RUsl)b?^ri@?vOW}yphlJeNWq5UuD;PxT5cWc0#Xt zcg3$kcZaTXztEn+KLgxBb%owhV~Bhq8Q%0lrgqT!6RxRuG2ps_mXN+6tKMRJ)UF|S zsoYU+te$Chw|2Ua2)q1PzOX~cU4d>Ne*RZGfPR*1zFoxYAG@*F zIbWjB(0oGQbIW4y5PX8?rpsUy?+kwk_(Z|i9e&7)h?LlWHxRL3{gJus)t;wI?xjZk z%pAK=u_D@r&C&3+<7R{@Si-o8Lnaau6Tc?+eW|EX-4vKC=k=Axr$^v&V+5sn%@sd* z65a}q<<|%LbBc%&GRFypLwDdm;?sK>drh`cad1kRbOW)Yq6xUu1Va$|a9+vC_g<)r z^&((R{F{Rq=k>jNzt6?Y>e@^@67I9kuLtoUb(2H;_b+Y?wzM=pcUr!nDki&}B1|4* zlsy(F8F`4gv}Clv14R)+rt~Nw4IGeys>a9&vy##FUa-S`1>;!_8ds= zY7MtbAS_2B9%4QpBPtiHU=%8AI{qJJ*Z^*2BTYEpb=(AYXXf5+oxbZ3-*7yfqq2X# z7S@zT&{#FaJ@rvJ30NHVON8Y3tTl9Oi4Y-~vvb0%g(ibNKYvf*e&5_Y6I|?7%IA^s z{E5)_%%1cgg}+=5$HwGvwY}9I@xOT3Ly+mgiptB8qEX-_Fb!5hauQ|`YkTcA;!*zR z*!ntBv_~*iv9Hh0^av{4dJ>CuR(^j>wBWnZ@rXIxOsXC?D6@g$$@EAf+&WuWIF!t} zHoS?yK~b;#Aa#1BD15T?x5_18Zt#Y?f^$D%Lhdrw8Dz3>OC1i)ooh;1LS+lBw<~vd zYDpC@jFx#N!ZW!7pNFRBGPsDa%Ti1XgC_L8 zg=qkDo525m5Qb2010J%MDVCN(tlufnKj#cqB61R1+_x)(`%ENc&moz^{NMl!OQGiN z%gInG)xF=fGGK0W1pi&j@ps^et3}V!8g9ni;YgT`wJlV3kjs9Fu{}p`G!JPMv`?0f zE@zGF1SPqtkifMH)tu0S~8G z{D(7GBqY4$Zx`;5`}euzxy!kyOumyRungHVpRe_+*cb5ZDWe3V&FGi&bpo$sv=mf1 z>R}G-dyf{b6%-2N=&5ncA}KkP!I*Cv1dpSLrKF>xq0l#rNZMK1Sj0V5tU{66Jw`w_ z$yPORd(8TpirK~KaDUb<6BUm>GA)d2yK8!dT<#_b(dh z;F1c4nWgwsU%sV99yX^dG<6JDd^bSVGq1|lBNTdI-2R>TNYJp zeidUzo~45SPRu`zlUNlSNCZcBQK>K3VeY{w1eVmf>MZ^l#9lcF9LThI6Pu*rIsQUA zRDsr!I(4?_#M0F1C~=(M6gk#hZ}GEDV{G!1vz^>r=9HN8$}`%RG*-43J-;wwW6xOp zd-kUk`rtPQhE6|4D#U)i?9m>xBxM-cv>F8X*$xT=%r&XT?Zng65GO;8< z89dq2>~is>q5=gPJ6?In=;vLnj$&C)jDHGkh@8ASTVw=?96c;OnKGUN+*Q5Z)w+Khb>9Oq&DLU*Dt9m{y{ukNqjoq+o7 zwW9rS$TJVLQ?%<8>{uz;v{tjTRkTB205YiBb;@_N=ytTo0%Q{^ky(vc^H@pPO45yG za>;d3%EA{#EPL6oqb2jE?Xh{ozV|z9YC1d#%5PcB!Y+B+Z=I@ce}WiVr;Fw%NIRb` zi*=b<7S!S|_Sma8&OvUj$o7|(EKbB+k$&Fjxdp1y-x#K3_}G3=!KmuYy4g3?M zU9Q4^i%M@?G(0n1Y)xylHLWNy)`Q?4}<^=I;2%~TYb0c+!5neuk*O3~FV z`?r?9b%RA7u#?HWZ*$IC6>r2v;wIZQVY^&bFOyoY%(5GjZb9AOTl8O5oKJ~gBhIs;_)3;l^{bY+PT<*USZJ@~6t26ZwvK>V z-kuw6B1IQRoMya?Sf24EnnIe`(p{ASOP)6!H3Yj32TG!XMi72$_FX3r29*cS(M(Bdl zUN&^1DfDKzO8u#%XYJrtZP+yfsP!Lh`V6=MMJMU@xSOFY#hIAi#o7b;iL^sS_yimp zqLrdP)^MJ-gnoo?BSiaGqPOH6=mp96Jdz9!9`H@kUa4MjZ?I24+ydU>-$J1Hz9&FA zZt*|yeL23EziJI*3`2Jj2HGOrl0;67(j(N!O6e7B`ppu!r8jarRX=bZY)<(@js#&w zlL8$l`sD0Qk3}RZd!@WF>Q;5V@k7L~xnT4Zxvp=<;-`xemE$#xsrVlDh1!4A|3cJQ zp_$p(*R4(9jjC-ApVHdrd`Uec-xbO~PH-fbvq6kDhdPHQg_iQ~e2Q9@ zQZ|>2i>zu~9-W$E&q#$ku`CfMsVPr9TQN&fl)0k6?3c2V@|nt-%A1N^S?hwtsj&+; zpNC~$tE!D!Q<+rg|MeiK}UFUVc8PRVTQkS`B}^)4GFPDl{bw zJwtw?`o%H}vx&}9G(~S!Tq<)E^NY)N9oQ*qE_mc?x5S1J0XZj8T+YRtLc#VIXTGtPujn2tQM78MqR|)@N}3}2OI-0 zg*BK#W=3}RE~&RUYFt}|eZMN2v|#ZVOnayE-1-uvrIHq^`JY4tQ<}u9`Y$eeqghlH zUMF=17%$f<3DU?J9CK#1c?c&iX$E7HDEnU!n0 zsc14q%6HfqaxbLVRbOn(+@-I0syKg{ z*U%k}3DD8-`$Mx?wNM3&zjsM ze14+hg}yQ*UF0m`z>5I*oZg?udnJk;UVAhvRLRH+NsF%M!Kp+VlkZhP~DUCVAqn z6<;0(-zjIzF=}>ejb3SczRVMn)QvY)dMBfq_X&%fPC^sOue~qEJw=VRwN_rH#=mCF zS+6I?9E;Gk=il2zD_1o`#j@jZnamX3MW(PWEkqrj&RL_yis5k#)~h`yZX*uprjq3p zu^2A-lB*O1PSuxoD?K2j{9aB6(+11Sjp&>{3x|S`+lKtK>(KJZU~7pGN!)&+<~f+)#O9GZ-l& z=RH7jR~9$tJ3ERPTn2@&C>6>o9b6;N7`zkJA~D3jm>}=jMNQ&l?oCWY)AJ6~1v3Iz z@D4BSkA^6&U1#U--rI(}vM6L;?iSN3xzwMPkAf@=m^>=#Y<;WlCtDj1 zw1pO*lwcJ{GN1tz5)Fk%c#0{jck=!Qn_91LsEhDj7b~B(Q?U6zfp%+*%*-V(Ar~G` zKS!f(ln}Al*KuU%f1i0oDL>*;U>SLBDx5R`^yHq4kK}Q&7MxsgZ)WlA5Umw5^?5ec zo6nI&y%lSPbns9u z(fiwy%)8eH%!XuK(;YW4eM=Qyo@2>$>*bYnYPLQB{ZHN>{fjhB&Kd-*k0TUSK0ob5 zy@rjnn}~m5NqFP_6!+8bMHz(uWWoMr-?rJeu>CLHHk%YsyqbD%z*s=59oSUbP_3HN zZ{wz`k!aZfDtctMZ>t>iV`oq-`= z?tW}4+MF-ndRS6+YwWZgz60IETXQmG@|9AVGF0=KLSDMaJjKx6ERIAz7~Aj`=emJ@OZInMq&%EYtXo*k2u5E zsnC|1jj9<~(I;`h#Rh@@*4EgNwYx+e@^(qLTn6*Ok5S(N4Q`@@tPj4vM>AuK)ZYawGiI&Mg)t63fHSlN!q5NC%mdXImB*n@y zg9d7iN-IJImq=|yHNHP(5)VIz)h?3H6pTAhbzb4Wp;wh*^V0e*Y#(O;8KSbet-?C< z(tU1!_X*vWNkM1BcPwd~)FUo{raGPa<7^VsEDukG+fZA-ulw1oR7QM z2N(FJS6?Y{X%(Bev_ZCy11H++4P3dn=LEJ31<_ zHbbw{T6N}bu0PpB^=awYs`<(>?}Cc2i|r-3!~V_LST%AQ~e9FO=u}Vo`@F~t^JAKRDlPiW0#9Oewh71j^Su~>z=Qc z0<1_2Y}HF63Db4bMOe@c4Vw%$*{YRc=UGVK2)HEz6tzS{`@;gQU7>L@X+*7$tGQ^$ zA5GgP$ehGYt{8Lhv1JnDcnvCr88v9xPe-@}@vWRvFKmi^J$4X)OVq5~$nx|StfdjZ z&gSSfM;C*rol_NX<$x=r&u(j^EL@qc5_hWLh!1!uIuhoMN@&B%$K)_3k1%FSYN zrByR4t6>|eGwZ~|@eovn3*lnWrlX6NmSUY=SV%JFR^foga=bnWnV`+-)i7QKL*1si zOKa1`l+bX5x(S=cydy684qFtQP+fD331_TRrb5+I17%Ed^t!CI6?4PSi`qRHPV79e zJZK}V&{_j^yT0NkNZhhPi-dReTmwP!e6_^V5jx#XF{ApDiJs&FQ|Q}yJ_=DE9t*wh zc-BD~bJnP0U*0y*vJtWCkmUk-Rf-rJq0F@9O+jd2Ty`NlkIuSbyt<$x9`VKl<{3Ip zreIpb@_Oz#-Nm&#&xP``#&PS#_wTHGSIOGOR%ug)26-dk2E8Yla9A-A-J{8|^@P1o z+ly-f&ZH)mt6b{dlOxo0W`){wgT0P$CC2jLmfbjGwa?F$-a zTHV^V4!E8W{L+xHlH3J{k=sf$&VuO~dNA4-kP8uQV`OV8glN^MAo!Q*G}*9hWFw$f zUvAn;>9{VaG=0^W>XMpxt*T>o=ASsIY~!Dml|uod63MsUv?tD7X?o6@9lA@#9i4f3 zBvowFnW0RjPpxb65A+IC<>gmDuPdwE8g~k3B%T1;Yve6I8em)9$|lZ|VyH(|7G_~b zSI|ZD?1vibbAH6_AvlX$O>1jiJsRZ1glT1s*~XVox^gA{04(_fW0BO?Pr5hw#@Gds zv~W(!`7~p?kN?uv>{t^BvM8-V^@`|bohTKu1v~sT=~KDJ{73CJCydbaJ9NVWMmJG3 zww(yJBi*gh!=b2;rDVet{RFej+%1y~nX?<(_LU+_KUDMD@B{=l7smnPr#l|Ywo*{T zi#`}jBTr9Y3-l0-e2-}xW_tBN2pg2|J^DY~la(6nD4PlW0X{@8lp0hAXP#ULarz!U zWUu5sPNPfbLLZJPxg~$PZB9Ld0s(FNIMAQy8{#Tg)}U29>cKi^r)DEpG{v}Jmlm9?PyVoMt!&gPIUrl zWMq!`Vtc}pv2cK%sj@pbh^{WI^CHpbzsAEKP|lgyckAC*5hy34-}8Y%Bf%R{p9Qv&9W}F z@fN(H6;?**7m;2pF*QU_A1)ZxUQm0nqw~X-@nW~jw!8X!w9;z+04}pXfaJwvNt@cI zr7j>6O&OaqE1I#+c9x#YMu8Hj`0*b4O-8sJC{N zN)OK`Jf$k>`Mrw{-D$mq%1tKxMix)?aR}NaN-aL|1Na9;aSc$9b{KcOa#x>ZnRv4+ zq?u#6-n$UR5*IeN8g>A)q0$~*t*#HwRK&>g@NL~D+>!crT&lC9_*3fo@@)oQhek(+Qe$PqH$ZfHtAkd<5O9e ztyA)phS?wh$Hwe?VQp~rapW)J!O9O7p;?wqctD6mN&Xjn_TMO~_%=2_OJ$@-x zQ9d!zE_RIJ_Cqh{(=6T&jjMLxJJN~k*q3qx6!Sj3g!Eev}A7O4@`Q1dYZpWwe) zZ>fRRe87-E2J@^#q?ijhQXB(BY97~#Mp$c2+nUBdRhurJC4Kb%s@ICJc5|-#SX|+u zaJEB%J93ifE(3F@RqiYc6MV8_0Qa+;9>e7fBxS7o7$VYQ-Y&>#Ru4#as`=ok)^n~s zzBcq>o?SE=pQec2=zW`-OqfytXcfskdbW<81{!KGY~chvREByE<~Yy&izD7>AZ@Yv za19h_|J~+BGbbiM@WGF$JoA?t`kIH(E{qg3S%mFylJt$nY#r~eb z4STDTOZc39dNK3sECfIKBS}0$?1TN&y`}9bA;US+xjJE%^v|K_0~PlT9Gzy{VyF`t}t;K8~G!zxeW%K8v(fp&ql;9S9O4Z&L_vU+GyU@d^o@gC(zS`oYJ zYJj$}W~wZKuqG0d=t z=Er^*kiXgBraXdWNb5)h>xy0Ep;j_+cs@NkO2W59D5+aV-By~JbQ(iOXx}l;x8n$j zTAF?))jX_d;xs61l-(_FWX85`P1FcZv2XDjeBoDFNgoZiI8J>%5iya1B@(qrQ;Lt4 zY*#gN3|my;hPP1ddPo0aL|Lll3dSzlK?oC-LI|i)r$M}b0jyGP)O`bC*T3re>U$w! z8>BiZt7xhaQj3pcliW2`D=XLipH6s(yhe=%0rm2p{{rbmyDSnHOVKv&&*%_!oarPG z7hx1YyOR4s8bh6|p#60i&fDG?7@!e@^?W|S&eml4+qZ#;Suq~9EBDVj$qHBRCqo!8 zmtBkYJ{zSnLt2|Ot$@Q3wJyz<*cdN0t|C5N-CChB zn=gqi=EF-CH=8!MeTByBH~HV_DL>6|$b4zgY5Z z**~!#VgZOBcDTvoxmmrc3>C%txr~oiHR5D{9oF3=4`r|Lw;8Stqwx${^EsTj>FGU8 zEIe_<<8%QDZa!&F##}ewX9ICo3Ep4j=lSKv{k(>z7V!|tWmmdBPxu{pxj%KRVsIAQ zO;Yn`{|!+mSqhRmHdg40Q@l|D$H~yx*Iw|-*JB2}0XpwoJd|vJNlHL?qT^2o!9J4qHljD@KTF1*oPdi zxAB4-gZQTJ>tfdVQW5Q3dvM+V-| z7fqalEhn~QK%c`462=0KV}U5k*FtW?d1%!aGwIWU@r1{f%Ng2Ip(=ZWPVH$L*xE$e zrv=)VPKSp$TSL7SufVbWu}nmcX#O$6z`t1_@vK)Iem-SK;P2d75hO-uBIpoZk$g%~ z`PP4wVF5oqkAKINhV`a^h;xZ|996b0x=nHWnM`DzXQlzJ-hfAGX~rSUBg`;3Z*b3e z_AjMQh=vPNbul~WnJnx(O~$2A&GBYqZP9$c zZP(9hb=1=H`-?loPuuoHQ%VgnMGtpFDH)MHPl$?&kAG~+4$?No&Y2c$gBH~D5G&oB z4>;z9;A?g;bI<^AJ!s+wtPUswH?t9S&9eU_C(`9(snUe!Sp~pwyun2vyoQvF;~(_3 z)XJqU!Ekkf2A465g|uB18dLnSe&a7B-DpZAC8KmH$uvfV68V7)hf0D;bI+g6&neF)_CL0`-7%;ZSF}{%7Fk%uP$wM zUM?0ETV3-K0p0Vpr(+u_oYo1@22_YDcGG8_tXSWuh%13v4fN>f$#i9t+DbSdsoOG) zJ3w;FLvt_!U5hpk#dS?%0vrW) zwle;^yaXcCDPnj2KV0ojMgHiQZ8fP(rs_#!IGLsd>!0Kuc)w=;csZ*G@Ls1y`RU}w zF1&Vx&snnu=on4Ca&YUd#0c%rB8T^-COmUw~w-C-C? zx~NM*!3m>5Er9bF&@e!|eUoV)D%5s{{sYQ_f^_Wx^#kr7`LqgG3uU1hj1@v1iKN#S zW~uH#kW-yY7gr13J&Gy$rB6_ zQ7^1EyQ(gliVC~i49?E{KDzkKU*_=R z+c1^TYu>9O*^?!k?csrxL8p7n_BW03wo}TufrpVFJW-G-n`UCy{bqWurREN>jTq-g zNjRp25*d=VzJxo8S(k7!XI$i;e=29;R`Z!8@(6*nx`d9beyVrzqsJy8tM^WWt^>vL zg(1sZ(w5;&g2H!G81p=|{ec2al45`b)JF zl?=#&rQg&Dcr_?@tKVzHH|qHM8bW;FVCs~CxJR|wYdAoaO>4pam814UdQ7!3enq1` z7Ht?Mcb6wd=9R_qvvtvy z`OLAE)%QdJ&!qOx@#J!7BAR1EWKS>|Hj?@wrU7JVMywd`**o5c^%&&9Wodk(o&s+6 z;8a%Ll3tk}t9e<%m1!RH(sJD4&k~FH z&j2Oh&z3%~W^y-o2%h+!scH*ICH7=^8W!O9;zj&L|4QkZDxttGFL+>>b*G;Chh?b0 zr2kNWEf7V0V{AqOE80xhw3vfqx&udr|A6VKhC@ZToewl#R?-}pHH?lttJZ>kSZs>*Xh>SCI!U0(bR zTNEYKo7h|{(XZ`SS6CXV)RN&A-k_-^y9#cgJJ<5EzwM& zGfiXrY)xk776sWk`Y0nU1_^BP3gr z=M-2~Yl+wp_g%hatl?;-NiI6@i9voQ7lD6VY)m~QVW-IEC#F13Dm0a43x}mgjz?$2 zi982L0cX0On*G9-N%NxSHB$B-3F@0RMIX<#zp0y0lhfD4XP<|i)Qz36BYyI+isSeL#R+(UXGXFE^jX#1{Q!rfEVqF$9s{ zR|HRVxYCarlqET1y6Gw;>_?noK#vUS;M1_ufp z$Iov09ol;wsGW z@ECDdkYvxl2YUokbTre)ZTI|-5d7bNb2qFpNUobecX;M;koTi7nlg&`w01Pb~ zrIx~l(=O@?+x~n3{_zRY>uGdcz zx%{faFTjsK0-^$MuL!ajL=qDsO1r-XFnBdZamKr$9j1nOl@)f!B`pnN_>N+z=eUM+ zdg+i``iJ@7^F(;O*zb?q{>?`xQog9#zM$jM1)uDTk-OM5??x=Xw#pMTa~ zF^m3yIEQMiL0h#i2TJ>X3yzEcc~UmLFjPeW`)hDu#T=9qhiY=-6B>?HVg|0{UlXRh zMQ!a6(aS2ZAq{4d;X;cCuWDx|iw7{77l5*L?|YI;;SBE-Es61UrXDPb8SHk%LaA-u zU(tuw>e&;~J)Y$RmoP}-6aN@07$`>3e{GwKBdbwZDv`rWWUM=7hjhC}dl+yW;I=V{4|xv`n#BsABRVs6m&!^>&~r00qwz#ynSNo>mjx~sW7 zQpRUBhcraFvTW1_y!~li2+9fkoT+w4+_x30=*DJm4+EH?Zr(gyC70*RQ~j#O1}zr% z2V}))N)M=)vg8yl!5Eyl0)HbfXzNMQ2x?D#W~q%TTBS z|9i>zz`?71Fmi?NwEGA*E{9G^$w>jnfKK+n(n_OfK*`Bau}GW?jBm3nQ%b6e5;#M@ zKjXp>NV(}-LNIkLkgAm1pJz*5D$n3h%jx>VC3}wCoSSTyzMQFC60fFmR$V~QM5Elm zdwIh=)rzgcn(i-gdno=9^?SG$uId7OVNI znlgY^D9+lOfC&aO!Z_L9A_8;M?29HconJ$;An)I*1qhWtGp5rYC%f|*->p?5qM*$t zY)4EmhfWIV>-c!Zc*c=DbnwqhXn-l>o;x(YQ$+A->Rv@RHO-XUEI;%QhM}o*-0YO0 zp%L{_)a3arNXaPn?H4*z->uYHwUpjAm0&(x$qw(Qgr7jup7r|tP047*I(OO~ZRNrdxg+_9dO+oyq-pvwZFu@e z$vj^dPuJ7P;6MS6u$flN@PCo^4nVea+ty&=lx^F#ZM*7}ZJVcX%C>FWwr$(C-Syr3 z?(6RVj~Cq?9T}0iGgr{f954iBGSI&q7bHjgQa3#Gr}K%)vjbw3>tj<`OV^nk|`jkml-!t{mI6WN#b za3WooeVEJ&jQoOo$Fx5+zsob{_bxcXbPpD?{0xy3?5Y)UVea28$BM&kg7>x)2$P2> z?Ac2I?L4_DL;Iy(V`!_iJ@}cD!Z&=33qK{2ZKEI2{Igy|49g^W8fBv25l14T_>=Cp zXa3Nrr{&a@ROY6NmxB7Dwt}_he-pGK|965`VYdV8|Cn%=|5s^aXJuyiZ+;d72P-}M z|2>O~nqXSU%lFxvRM?+Uq$U2OLzTOIDs+qh)#0QiDCe)Ra1%q@oL z8fXB^008wTSF;KP+_1M)lx#VRtvBRosmHd@vOw_l@>iQ&Ibv2%S-D#P9S|wiBqn2y zZOX=0U}pYL0lIrJo@2xFz=uu803#U*84DAgKJHWiC1@v(dKN=B36;?so`7q?0Cpd9 zag4!@jke`rIhlZZ$Z<*3a%*g_$ar4r27hqoYxsRIY{AB6$=3^vkKmwm%V%*9#ZG+W zL|yVc!Fdk20K_7K)v_q?lJZMOwL?DW8;a`=Qb&E4uRlR|HUQVVv*R<9s~>`hFREek zr$=R`7})Q%z&WR} z6Y|1|jA#P~=#}}qrV11-I;oj9kdy&xh|ho&B1jJ;SK%7W1#c|vnU(_04R06i7`=az z((xHU3|k1yO)G#11XJ+LEfh^229zzfkT2#5X22lM!U!&+pPvNP1G%B}SQmu8ME~kV z_bvJ+H(aLhsBx6CK-z1L`;hHn?%(Otd}&#AO$ThLwpT*^vA zQluok?6ece4*>*Ee$J0ni`u}CQKrI_;(0$gDA2P z)*)04D5N_?2!b`d?q3=;q9zas1Fjl@24KyBre@}Yz$XY0}|DrhwKY+Rp$nN;A zU~nU}*Q}s)z7ta9kK}4&>ntI8yz|{1S2LO1!6QrJ;pBurZj{jrlFk4wUGq zUJU>vLJ*x|WE+!<)`K#EQSIAyoRf zdz2~BEtsg3bbGBDzAdPz1Xccc326MjZU~h640|4Gek3Y2$o9b0LL1=Y2tENQA?bRB zcihVTlmnAB8t$-7H7zJh_%{BHA?x}$d$98OR{@fT)iqE{L{~wS13Wc=w`40JEok1# zUqJ7ANPFHTqTB%KiKe^wRs!6=G!fwH-F`I@;09iX4C{gI*`vz!$PWCxG2by~1n`6u z?~o15*Pz`(UkGtSy(7%B?N!^s-(v4ku)_tz)Ai^Ngxd+bBhvON42;`B-$G)GbwH9O z@b$C2V7zYc5Z^7UcK{Z{TkbIL$*}voK}}K0^;o~4+`?uk;Rd(c;oiEo{B?t)CHw+R zhQF@=08a7&Pe#D&MLA?}gH}cO4zLW7+iANa{{Ufw&lZH)V`>R~!M+9W_^TO0x68Um z)#Cqxc}3XeyNzJEi)(G9evS>2gS^0q`^cAV^1^x8QVkcisj0M)YV5-5rwkoWP%nk4X8uw zq--cRY9aNE#kD-oR$?L>erQ;n9C>GHX8yg!7`T+ldJ8G{$AZB}5FL*wRvhWQu$r^$ zOgyu+rd1QgOUmHuA5TF+8ZCz+{|*g0xmk9iiFi*IaLd5Rx-=wXQ-T@Hsc34kuu=Kn zj+B&eHtvT0ZBUukt}@$9d?W|HZ)l`n6|C8>{4cBv6{$v5|G_jerijPZ+G>IQPiPUQ zQALsMvP4ORa4#QF1?zy8(aH)9ErCq)a}z}@l+M)Df478EAlSV6$b9n?)^2ehpH-XN@-5ITJj&Hb+)zLjU8){)HvC8cFYAJH#%Co7w7#kEkuuOA{AE(l?NnCo^RmCk;dH+AkE=hd@gAiopUTBG{{(q^b{?ukz*zmK z<()bHt?Wcd<=-uFh(h!OPqF)#<_s6}L4{j`sPdOtH?7hH_NYswdJRd(3 z>tra!!JWoN0MzI1-BCKD=psJL<^I$-X#;zd93kzW;Jtk^z=QnRXk3a!fansjK*_={ zn9uX;ufF5`tKF?$71BcOj7)5ti}m$JOG`_lT2v)#4NY~8l=RdlMg~?!W_XClMsLO1$jp-5R~aOg-IH(8OB2% zsca9aY*8seac4hS*(l|l07Y!582LrvZJpW?Ip~-Hg|K((ZU4hoYjpuMkXm$0dEX*) zzy!aLVjvU&p*cz5ec&10!ltC|0Y3HdQ3T4yhS)_>Sp?$IQewY0cxoX~5D%3&{F%WL z7LGcjR8HqUJ(f46W_B-|>m{@;8HN+fnTm{3k12q}y$S4)FH&rBf zoOX;h3MeWeC}5zylqKj7!{OSa%9)PE5KJgp^Bi-|!H~kjee%IRom!bj1JM1wnbLSe zHKPjj{G?y9IVm>6Lv=j-#Q~*IprZ*4n-$k~b;L0gp?Ja+%p~4%4RZpw?CM8_kRjN# zI<{MrruBE2PEZAs`GzD0BC1dl8QeW}bKsIh!K#68^0|{NvQdeG3ZLStXQyoRoNY3x z2ckIRwMWpw3f(vsexc%sVN${ZB#P(~6~Y2*9`rF6fQ6yBW+uxo02zde`WnakXDjv*y1-t?zA*ZoNQID1$B?Ua<7bs9Jzg!N{3?le1Pe4_E zNPYlFAz5?`)I+fV3KtSVHK0N_RFYEC29HOT8)EN(K78oDyiaL1;M`iv3E{wCe?RQ$ zt2zrobqVY2U<^QT5+x!KxM6u3t*Y*fJGx}PehE3E{`TF*!!xS zG89Yuk2y6ouNXkpb_kFR7$7{=z6uGP^tMki!l9#O%Sy5=%%xGMmn@MZ6fKi&32X^; zXxCtSlhR}6p&1Y&6RJuE#j}){*96hrWYiccVc-6>@=x=s$&PK+-`LvN;zk?7+Xmd0 zI`?8}@`s>d(DpUG$&i5YMwe?%kz}wYx-#_O7p*Bp;{a2FQSU$PEfxHhhJtD>Zz*>p zCN09DCB^WO@v<KH`sHY1x8z7m-!)4Vyc{U= zNe^=rX`xvF}%ykcIqiss%(O} zaIAF=9+RCk11updBK!F+Irp*Jo|=_NYRNT7Q$Xq^0fefZ@P!>LVTfWBgnIusN+Fmh zt$p^W5nYEh3XmP7Jt}(+U_!L`K9t`(h&|placPg#VFqAw+k4;p%p+i4f(uHhNRvTq zOAK&hAn^j=^$u0E;FSP(_Y!>T2at_z$6$z8Ko6N{taFEgXWTSd>u1klS8;JTRLh5o zCedBOTu^|x6*a0pip}*h)hH%m^VP;fn`6t-mInlARS-)L?Tx<8U&|W@<-ZJ=zQxgi zc22i=!N`jcUA<6+w4s@%Rq}1WtY&u49`^MN``*C`7-oV`0 zz=DC%t~W5da2)fN_U55xaBA3dh+*H#4XYZTUtB2?^9Iye82}Ph!Yc4XUnzg_+;T>A za^mpQ_xL4{N5ta=^QA5T;qvNDHBDDjJ|W(|u&3qj5e9vuOND)D?=c1IR~_(Y7$QUF z90Qlp7Rqe|-T-!YXaYk2gq9V#{r;*;Az@*1Pt8tR=XK+BF!W_t#+bOa(uOUSGxI|J z8Er~MyVpC;XJ6=Wa|*su@_oIE~zpKN%;yWn71I z^_iQIHgi3iCC#~MU?m20>Brag5)49cIR%y&JYKD5#;ir(mRNZ5yNmj7DqR&Ij@iNe z&%@AgC994g@_iTYPbAvux?|_#tori$EnWHqmMYmGD@;Xt;V-Z`YPAQ7(3~$)kVbqG zMD=g+GzsO8bi}E6lG*lKZ415*uUq03U7Lk_;w-;+EH~MB2OFd;FiyJ)-(!E&4BH(R zeo(d)HceW*&lC6|>gwJP$u#)-4$`(1esL@}AZbi@#D|ef817;Tj%J8yV5K{8;At?T zJ5k_jK#2p#q-BG(!v{lm>mqGg&hc|*3N%J*mYbjvEW4ok4g^c3p}XJL7a*k9ZkeQC z&X}H064R10eHmh{iV~ylr={wn63TscV{|+$97KP}7n2}Ir$(fw@&)S=GfNXLw93Rh z3~XFXPinv|r6EpKj#Ygbk*yo3vm@#GG>U zzZ(o-ykM-ZNa9j4c!`VR39aaGv00{r7K6%$8P85cv(AR~F&Mw;&a7DAva@0ZCp8Tw z6fp837#|n0m5*EAj1KHT+oUL)PCWY8r%dHxJMwaoPDGg0Wq}!DFxh0Y#_^Q!^h0!O3$2XErnr* zb>WYtybrTDj`_Ps;DPq!gEY6`-C-(+8<4z$n^plCsZ#9f>gybAL&erwt||K>&%!cY z!yhvz?8EbGJahyc^d0e4lBQ>;;yq!=IXUCE&7LO3`zo9Go0z>c8)n>E^eH=Pn%y&a`?Xg{q#;r@7}Z zmUl-tN1f9+`E(mj+Fw^LP4}seFELI3T$iiqZ{_HVbum|M;=NaVmaPCXwKmE^l{KJe43+7wjjUQn5XpxIFtdKc;Qfi-jMXL~Jh7ytE5oCAo0_{D*n^06Kjw z0ZV)Gob(H9KW_NM8N*$#tk*2oF79!bNhJvO^Xk`v8C-g|+e5rDW@}~jFb}te!~Xi| zCf!p4Uxmg8XNjXQ*d+)@XSPh;ciZA^dMHI0ncOL%8b-%WJK2dTr_sq+Cf_+lbFQ_d(g_Bu z&*#qKaESBgWqXEPIJGJfRHR=Qm;`vPwx5i$d4c||ACkMIhUJ0A@m#jnY>fjW_gg9Z zm&JEVf~bytWLprrPiC8c<7rL6inzDfeGZUsZ`;SPc(oLVsj6aM>b~w5h%i`PXpW zFTysM=uTp8?rB#;7hY}Q(4sexnkH>@71k~_2YJi=J5akW)^63FD`&mE#E7FSs7g8D zu{%8+kNF_sQuwydHI$u3yob)K!Q3L#t(xY8gF^yAQQ13!$JR zbdOXTXleI3KX8Rzrm1a_cDacrywSUfyYCYmhV>}g6TQjHio#jvcs&8LPPnr`Y2~!& znLmFQh1Rl86zpUeksTc}XCoI4kkIL7>Bfjz?iHwE?2!U+{?(_jF-=P~y?m)97+68` z{nb`w z_WN|Bd@YI7B>KSHJ?0AH9+xXC0#jg?alWChRMWT~Pp15d^{5$ZHSnO{;C2B~sM4$6 z=Ivp1xW2RACev&tEPYGtN-|5v_B&8+BA!Iy9@gdIP8#*#kR~ZpquJvaP>0NT2aj*F zRnPIxZBJv;xVl<%qvUZBlNm`45ZE)Uvy2bqL7y$b`HWe|scyV}fUoMU!w3989OvZe z5v%uY^AKH?!?D-d=lbZB+FC|)2@A{TMwSv~-ujF!=#-1c5lFrZK6je67XItV7mN4LQs@3IHYnW^o&rqpJO zuxz|UC%j8n8J7;rbB@mZ#eY!rm4sj+172_^|Xaic8k`H~8n!wP@(q5(fsu-Qr+APy5RZIPt;=9pshOrPw@+`H#Qg9oPAR`qgj5#f`x#WRSWg|=%pkNILexKhHJia|KWOLH zY)^B*%{v}Tc|@{mY#YYiiHltM_U{AH=cUtbnUrTRZsUoo+2Zd!lL?_dv zRC^Ub*^a&33F$Ns`0$=FP1^7G?f65$ZGU(ythZl>Ma`Z%v!-gp;b^-DvYpjA861Q3 zWe8}VL-)zdyLP^=eg~D%p?v-68*!$Zgyn2m=e!iJq9<=$l>69qZ#euB7}AZ%7OtAQ zOEzCXZT7HdVi9UyuD^^Xg0t%GO!gL%U>Vk&G_&2>uRv)%u-|2w3i9?*(cxV=7H~N6 z9XY{cv%7#!i1%?PCdbqM-0V`hiee$MNP_ERFe3QiE;+wa!jYS&&&NXf*3Pt)JEQk5V6^o@_PSVX@KZ^)oI;-7A$3a`o?cQxcGx zYR(?n>T67gMRoikbWtvvz$wyh$3%q2Vg67_;n6J~V~-1W>uK=FM8wY-0x^RyV@D-Y zSJfqKixs3cnaebhCO}k-WyHMk5l-{MzFou$&QRIJBI~<54`mrgyJpTFB6~2-RkOR?1=m(Bu3IX3gxu)HJ*w@{ zlilcdfV@V`);sl&G@rh_dC=Ox3O#*D2*@qJ?*G!bHf5|hK9xRC?40QU%fiYu;$j$I zKeRi)mSjmf>6cL?JiT70Zp6RiB5T|>m}`( z$f8y1Js{dBfNb$VMXo(>Tixz6EQ4tt4|_d+9O)l-w&7e*-l2W_WZ?G+tkw6s_9iCg zF&%pzQE%IaUkwGU1)a;i&uOE%=$!B@)$fAFrKIm>ye`50Q5eC*Ih#dF?!G|iFr8yN1@%XR$yoipFZ2bw*(n`T`Tc9}>SaR8wzu!g^weisK zwDS}e`*EgzY{J7{x|xeF@*HRTDi>Bt;^p!liC*s$wmW#jqAL2Xlee_l$lf4Ey2*BX z6|1@(a2b_Jy8eD1X-M>2`%{wM^&9<~t4jnov45h;otux=Cfg3pTBt%)H^v!pKGqzPqm~yFl(-pi!wp+e;QT00Um# z(_Uiu;_!)6*H!)e=*DVZbq%OL-771glA_q<_rARocy#_)kSa>z?l;?pqMgwAP14@& z(`LU6<>2$F$F0wC3N#jV=F>Ua=Hk~kiv0;c_%DWf)47RtRF!Hr{o7W2aCSR zHRs0n5m;+0*o}%7WSsyD4fs~ z%UYM!*89yhm(7-I@z;s-TpyFHcCPwyl&w%PDZ`EBmH|Afgm;wyQP+94O=K7EHLEsT zJAt{Nc}=?S7D-bbH|MP8(&aIjeNyrvDvyBXQ;M|{4L6l#DhjS0{@}~aBCl@i(nYDP z0#ncTyZk4gq>0o{lUI?-jM#3co6HU)r7_5`gdLnUECrB}`GH>iZR4M@2t$@kbxTtmv&9^5_Jv%_ zdsfaJJ-fY`Y)waIaxKX+x{aHvr$O&8u~^}Vser)ThdMVlY^s!^Uw`y;+!8#9)!(%@ zFARJP=IK8ApD$c>nDCg+4Cn-oyDQ|fR}(q9M%eZA=GY|us7kw1ce1Z`rhgT2nI0Sp z1%0?|{We!(G$d?xeRzPBs-_)W$EC(#>va%Zx$(sk(uIjB{L>h!qcpQ`F=yR2KUgsH zce(mm6iP% zYFWJX%g0}{vf-h#_HzbT_}nv!;-2jT&nw@F`MIk!HLJ_{P`7~_74}&y9EzDmy4?mD z*TmLOO>j79wJ5EeNqkOjQCx>%>Z`EgaXy_ClR*f( z7kcuFyW1yt8Y=OnC=R1KG>wjhESCrEMYUR;^mdTOL9h-aI$cFi5vh^~@FHs5A8+_4 zSg%OTHQW{|{a8>2ja)tP;N01$J2rx4p4ptW@uHsA=;w9q%@)+{clW8TV%>*zbhKSqdvYi5vVCgUQZzRnPcLI2 z+spf%x?QS1ON9$w3w68&)keOga%262JJfCrikVnetqwk`pc?K?;L=|WeeXqb6n%rJi z9KD2XE5;D%q~Zx(qq5xN(gn8cGHz6InQtFE^Zh+K&m5||{rw}yCpWtUkaUD1sE3{< z&y4Z@>{eXUal@9@B6O(7-C9rDrl~ZqPv-mKI&db?jo__)S*%SIpZhF8RAv2Hb9{U; z2lxidC`?@YAFD%H|5F|Ee=WzMXV%1L<6!=$GKcx6NQa$+;eW5jVf#M~85!AsPX7OH zEFAwx3IDUP{7a1a|GPhCmVbKl&;B0||33S-um2$Y_wk==|B1oG!11p;8QGZr*LtIW zI`yyOqyL9`BYJkm|E`?jU}9kWUzCk6ydXT0MV`LP&#qd@nBol`1WZVQ0TIRfU=T<6 zVZi|*;Kc>OiM0TcA&Nm6u;BQCQrrm0A+J0t+s27=KxaUvwdHOG;-!$CBWq~)QXjrG zGvW8IE<}CqR==;GSKZ^^p3Xh0&)pu+RGg=cg3u8H0gWUlGcuSsAFf?_C9NJr^K68M z4&`v`9nPfrV!x;nwpsNZB)i9XwOF!3SoX?FU*jE%l9IA$@IBCrU9B?GIJ)f4M#4M@ zm2hJBlUBpWC{ym!WrV{oT8d1b#tyH}DTjuTRJ6k&pQp;nb(wF0xr~yn`(K$3jmIg; zlOlxSG6j5}?xd)Wak@KqqJ@{Agx$-Jr`4SX?*x3hQ%j`S@;auEr)kpf?`A@%6EZP>mTSxGbHa0kM3l+N>pQ)KYM$JWkPBmbefb zCJehRNI`6VoN=+^Rig-awm25k@nJ6xGj=KIld-+wabS`*ECd6|cJ7?v7&<z*RjPItNuu}D$6$elpow^pj*6UEk<*TyhiO@c>3@idoXOiC^yAX`K8)6 zcIfmPSfSY#J+~IMTEYf3EMRRtf+)69a@TR?j$1b#%Q$s>FVld&{1`x!PiM65hg^UU za+-{^-N$?;EHe_Xv04DIhaRTSARmVRQHv|gW57wpATDqgK^(_?tV|qg|6-PK*ZKtN2MPg5^!y#>gz90JUL>NrpIW$x6CFv zuBYqHast1O9^4t|g~XK(uV|LCAjz#l*thxbI!&}Rk# zdLCZC$MIS%stIn**Becp4$)3jOYe){9BD8vDjwzMz+sX{evH!Q& zocpjucV>_o_2U-}S@aNrDPbg-Y+m>xXxEg zC)JN2+0A?@fLh)yQwjVllX=-2Mxr9Z3u79rH)Ads~_D%Mj7A443K1Pp28b}7* zM*!-K)sA2qaEI`CcfwI=u^B=l(J^BhoE9{<2ucG$%dd~&2Ic+a*}|RVdBGjXwqGrX z9Ave}74m#}R40sjBs8E^d4(h0h%X2(<>NiNB2>OAPOWbQpQ8Kaz1aoj<|qzTxm3Q( za~6-kw2OB!4>EEZF{|bss*1}O_8YRifh%$?c0gg+<`#QooM3K1+kW$iHexQ#I-e=D zA-F}@>+YO z+l2P!x&gn;(OiH#vDra*quGS~z}W=t0DA%4l+yHlHh1IOg!Ke?;r+~N0>mre@`W>h zq2C1g0KVaQBie-7fbdNIc+k9g#AKc699b3lQLLN)>=8Qw+{wq}7425t&K325ZwbZ) zy(;7@v7P6I!7Jti%AUEAYd~tr{y5X;_4nV!qzVrX%QNr^7;X;m5r$J(4oDZIOSXDeX-BuX*w=Q3 zX~aD~3pfw-k%d#*2lSiuhQ%ZJ3&=A$3#?0wuB3YI{ekcX*aN~XKnE0e@dh2|7w+=S zFC0a<+2DsVj~H1XxLL6W%$Mj>=N$?Uq!$RB-@3VSr`9*wvs^phlGi|d#m|3bFuet? z%jxFLVWwvgcD7H*Z=^UuKe%vIb@S>my+z0t&`zxn2Mf7rhJs7vnvK4N^uO@cD@;kzEK!D z(b+Y_FOCi0pbs*lPYX4q(OUkF{e^0L`7)ILMrQD$yT zDDo*8e1L0A@y-*H=F1&?K+=%rtNQQ5{w2ew$4#>txxpI)O%Yx@Kf|ZLo;2LhgP!#F z;QPb3v^3r->b%@{UJ9>9_^IKSh&0|Z>U=l9G+y=KLwI8fZ!S#{8$r>rIfIvhru26Q zPm!E}6YM|cKR$F(=i#(xQoiOuqD}+YB|Xy>hC>~1qvpCv3Tb?u00$T;AmiMaBK$>y zCV)#oD8#$}N_*_4E1GsuVAoBuJpv9uVk^Fe+EUJe*qFt9osU?>h{th0%IwBi1J1+q zLw7Gw$j1yIIb_nFqzkkG7@0rH6e2a|*n*z&$^Op2k!fYxMuuH&O2GmSaW0rY&&hc$ z!VRmdsu#yDz;_lTDAGMkF9O*6=l;I<$%A`Vn5?`0~=WUrTDF!U_WY`RTz2Y z2Z3$qxoYBeby9WMH# z_Oj#;$FD`;N&ndTB=mWA**0zd0=bhR!jKUqH|sL@%bP-fn8g2-goK;jnumCpsUr&g zF15U$jQKA}N&zx2MOVi!ChIaWG=EowN$VjX!`z^4gYvc(RyS2*{1zZMG`*N+fFGlX zQSbiMYsuKB?89^e0^3hr_c}26emWY`e?ry%@?sK4`!|k!00wBSd)o3fp~Dil@)35$`Pe}?qvXIw5k1uog6e;yad6A&A-_;=*Mx_2a1 z25~RL1{woSlS(+LA}(h!17PH22cku=Rq_S5e6 z-1kj+s!d&@dWCIy|&)r8&26w9;u^fMWg8WX!OD_aqsaok?!AX8Iq<>^s9 zk@642&Q$d;Y}+C;Ki#t|71rTwwpw~Brloy~v-$ODMw36LucKUJwo-G-m^6hiGq+ z7?BZoP|q`JjcvTeoJ{rN3#e%dEmip*70U4_jXgB7mKIB`pIoGhO_Ja2%2JhEsfLfIUP}w)u07iG7v~-cnplSnE=MM; zlg%@VXxSUyI!aT`V%flG_gtr4@<{@9_^x?{do~D^nf`z;@QXmBY6H9{F0IfZ0_Qq4 z|Jh{GMZoS|e|VL199wg6+Pu__)eCHIXvaP{cK1(S~xyhQZ`D=x>n5h&=acIZmu=s^;h`()U4cv z8z)aNa95xjHYBlYjqhwlDn@}d$71f@!13X5>`-?^?FlS1r5SMBt+vXyW0s5DxVueT&)El-uc%p(Oz!BoiKRpB#fk63|4}(=T&M&eOuP2xcV#bQIy6tt$ z!8*lbaU$o!GB(Y>u$m<0(@_sT5aXQD@%zM+9GxdVc6Mzzb)iPs?-yjuFw-LZ=L0bq0MK1xv~qLPHwXgNWn7=MaV%4BI@Nwd_G-gLNpns4JOVxvIx;+BGWm4*l>PMn z6!=v5H18~1e#dNGZw^|D}L*ElbqET^fgEUB!jEN4kv$|^mqYz4D`Tg2@z-TD+f zg96iuVI9Fr@Ves_iApp~)Z$Q$4Ib@J2tEi#cK5Sv4`0`!Mazb7=80P0)3V<%3$Jf& z(YI%oihdGt3~Lg*A5@^`8ABVS7{di=7g1nFCOji_^9Z2xQwremql2x6IzHX)vWs%Z zhAp%U+X4ON&K&2n&GtaW-8GtK!Cq>|Ty^Xk>5qS$q9|0Tq9}|aCo?uB3JK(d?((_- zwiA7_6H-A$#xpCS9Nhg1DkG|jHF?scJZ_E;-<-TV+@Aj=zi~<0wo9LH4Ysy6#$1gE zq9miGuqiq77t$A6)UZEPE>i^E8RJfxrYZ$jJ=*ijx6w-Nzw;V8Zs+tVIXiu8da+jk z^yMM9ayX!FfHI1b*D09md#a3~sPp}rVVSC9` z#C^M(_ep;Y`>CulTOq-AtBlr5)3`g4vd3277keozp}jrLn9c@$PwSW5Wu#VcMJ7yt z=Av1_gImAGu}aKoHUFw?nbB(-AdFZB%E%e75|w!@d1-HBjzxiX{jFDnAlH`EyvGqF zOj9PLd`&nCOGV4}*6V+Y`x`uo_3ib`?NSb{JvLLt2d^cc{fnF6eKzSgu1V`YHg(Ohsid;^R9gxYcxh6tulXNBaSjM#q_1FP zhi{MWgMp6`n|~8OJ**9by~FQWY7OL?gVE0$O_VCw%Pd(@P-=}84y4~q!w`EM?kS)9 zzU&L+#xkLsWDWD%-q?<1X&?Aj8b`L}=q;A>w7&O7uTBI1z-RG}jBWHsg$OC^;*R!5 z89;@2j{0XBSABcSM2@W@lqe*!^UHk2jRj&Rj_X3QsCBDUqbCbhOJnC0>&gwL>C}36 z78OIodpuSrni?-9CtGszkj`4BOFa$FCyEAl$a zerKg>*yf*7HcMK?QlI{@SA`Yl*3C!FZOio~vV^HL9$oD5qqpt*smTZ1N0YX5Q!NaB z&qDa=8W(A<;EIE+(ot_(zOY(*pR>f>6N$8O?O^GK&;47rH+=GDc!ez)G#w;5F|f zY1<>bqiNUA);*VCHq}mq`}0i^ZbmU9FP4^~MDG*n5==>xYDKer4CBc}m1<1}AhMZE4 zh2Fm6*kf?zris8t3fq0&mjKRB-)xw-yPhrVWx-qu9~CqpMGy)tlo;4bD4Ln@I^7C-oUAyS>09D zC4+EK*vlN?U`DGlQ|Y!T6>Tv1Ckr+&$aN-7>46P(QnVhiDT75)heEyVcX=s#WqV}P z3~s}%%v)NTI=GaPgcWDGo~9a+ZeU>t*`oj-+6-gakR^`CD>+Z_U6)COb8k>_tk*#O zi)$Rj`xwpKZ}aMjgVa0HTP`T{RcI})SkhVUwqHD5aaBX-pl>*zu^$b|U&225*QpVc z(}YELriFGCij;}6<;~^Zk2n#2FUj4wW&((XdW*OLxNkGVf@zU=NArRYj}96#D&&qZ zI?Z!9X`gt4t9?z;^Gs%^P$#SU9&oH&QTFV?Z|oMzYV6^DA|5rpEB1$Vs}&iWJvIhD zdcmy-ovmsb#M;4|w~lk=it*SKaEbE=a>zx{%OqzOnzD@0}>v=BJpD^G3*4@dkd*AN>J%O?(Om9~^GPbGh zM@a__1Ky>C3KTg6XcLY{&W*Z1*gg2ev@vp}6|WSsmL6xd#j@wr-wukEe$^YGYUkH7 z!RWZdwTGzAice&;n`5;nRvI(e+3uTY*7)-Z$j$nnj6$35!97lLy6~L$lhz7ZAz@7z z+LLJwrXcrK%r(x%-@!0z)XiZw#RS)Ma!YYiZ;tn`+;@Fvu)Cf`(S_us>f7Oxabe|RLtKmTRf zHhr%7b7FuCs>>4;X+$7ryu9~_Y|@bVC7r%Yu{@(o+zw8?#{^oTGuu^~ItYNh zF(#VI%DAe>EGb<*uTR@q%_hB!A%jS^uLuE?at5_bbLbq=s!quTkdEgshsUxyok%Ug zwVL6AcquN%q%pTdp}Lw4;ck*i7$dSOwlC0lZvI@N;hP7V6>F_0LhwTgT!RLU2Q6wo`vxcY1Km4 z7rEN4%{&_XCtWch7Fc>(Q8GXuj+lbH6P!X#Jp;8hIhN zm4++|durOLSr#WuqAM4fdM;>C63zszsFOb^g_l^ zG_OLz)0;&XIQJ)YfpCwKW*s)eU<|o;jx;{<(n=1Zve33$^A3UK?0=*~(GVP1ChD=0 z80HGQ$OrWnWTbjOIhM~QvWD#DEo;&-L`etGV*B9k=D}e$2GQ;{y5g^oIk!gMUj-u% zZ6pi1Z=uI!H=-0pzGbXGbrl^PO6`hBXZMSmuKH?;xHU9rV9dA1yKERJ|8$$TKBpgH z4gMibw(Q2PO{TVrytZjSU~HLipOfyFcFb(ptl9Jw=d@tAXo@jnTA5hgAd{h&rdO3} z3|eE2RpHJ_!G9%LH4kC!?%ht_rth+y8{HtL5{;)=k1?NMIZUZOWVzE2YOGySHsqby zX6!I@X>kwB7@If7%f>&xH*l}BZ!>4@7S6KnSZIjQrJ!S~V!hmLFWel`E;4-ycSz_Z zV<`jkRGQ>vShpbI(26sXX40`_4NRXTtp}{v-DRvtcSfujYuOS8RR!0?R>Z2~InWEC z#)2WGO@;BO7x5WkQ&KJGDv4)wo+vbI6UDu(pZ<~OKc;pl8qh+F7dEL_cMwl$pFFdn zHokjRfM0433+-s2AZ^3&$5)hAj^~-oDr()G$t5um-wBSI5x3^tt&x?G)o@*8I*-dA z@C|~-m}5)Kg%<3y8)S^`Kkpg4ZpqNTyIQ}P+b`y`RDAk^C-J(|Zt|RbRv`>+NhtCr zq=^&Dkr=HAr&|{dQwn7kS@y8lx9n`(WOdP{ypiYDxK@J1<(o;eIa z4V1J!O`ZHdD0}OmIHIpx6n7^;aCZ;x5ZoaI4}%4_;O_1rKyVN4?mhv6ySwWkgX^8- z_uYEm{o{M@zN)V3J!`MM&hGB1?laS;_U7uIlsV=U9oWyQqj5LIHI%o#K3)xuP zUk(?eEi;bRneW1p0Td^8r7QwP9__}(#@$=FTP0iEpp=}Z^DQ(M5xhfqOCi<2ArK?PyRd0k$xwvlK3uTBd%?`jr3@WuwORD+_6)U?b5>u;g0oe zT$N^{(`ve?lQov-WPo*I-0v{V$_D&pZ7npoQ&JBjOvW`bo}AmqY2aFcbEb|{ubfja z;aWDwA@)X#d4r^HKCGhIp-~aFkNGTl>j#_E!51U{kaJ$<7k80gcJeSK8m;I87a`SN zB&FAirtVgs7T4S({m?#&?HiF~y&D|jTi!S4q0D$N&uR$JzPj7Msixn-QjJkZsgGP_|Ai6xFJWl9c@klf?yf+I-Dbr-|oz+)P(dK@9LCOZ+&wWs> z95Q*>oZHx(7TV+#`vl-9AzuMc>_Y5#X}LUXmV9wu_Bdk$Qyry1X>x+}k4Hd0u`{AHxB7~MND{o)uo!9tt3@gYt6(}lWqb9fxlBrnFJg|t+@ znsvLs7SVqh$rSRS_E5D+y?@We{AsaSHmG0JL+#BkK_z^h8jXa`JQ+anC&e%6c{Yrm zprXrq3-$@W%4F>6A^$S^N#426>G8(G_S0~jP}Mq`WQJQsd29I|t-B`rO6Ox)LV*^F zzf~H;8iLTEY0hh|L+^aen88M!{6hE_@+Mj-JuEFkC+XB*Cpc&0?rcbDJ6}MvX*d;~ zsC_q6>TMyKTDa!u?RxrjjqwO1J)P^EKVtbgClfxke%yDG$gI@<#aPC_{FNmx8%qPb z-;{`?MbT@Mb9s|h|I{e%HrKfcnNoIz+1h^oOTO|CT18d1sV^$00(!nxG@q~$dSp!a zg&c^+?htO>L!x88@^UC;C{&8_XArvd%f>2Rx)6UG3n8{(7wK@_PKS0lIPWO9-P+d1 zkIm_D`m-w^UFZE}mQRq|e~VP37|>40M|v?*3g7(7@mQdZAJcBf+kMn)=f38B*XqUu{^W=_SHs0?sbTSu&q;pp=9iHbi+O3C>Ud)Lo}jMdNNHV7B+L5* z<{fh?G<}@f1}l9AyECS#rm_P-uQ^t`dM#_Eu}T3+@FJTn@ZVJ11a?3_47J?cc$ss<&O4&gA+1Q zj!fBb?XYUh4Wiel3z4lhhyFCyBweMpph>K9w$BdrX{;6e@B>sogY@&$J}U}2Ci*6+ zBtmmB0uQ(eqW8kvSxWIi2>0LU^raN3^cSwpq5Hs$q#2t2UQ&(mpK%wb{gz8vB*4fDgRz9 z(2iVidKWI3+N9@#w49=NMTjTzt=s@(vVUVN(y)Ox@o9EkY!tQ+^%;XhACWGWu=8mC|OZ z%g$lF<~$=g&o8ecmd}3OWo>_KUzCx$;Y9g)Mc)GLWZ#~SsA@Pnc`YgH#;x>EFsN`V z==qC=GjU~_+i{37tdle9Rpql9fcx$2`I}!?>6TJa=2wKw1+7qa5?i3?U^E?n%2<_|IpwRisfz%xN;6vfn{jtG9o?N?9&vYj4kFMVb!q_mL4t zU$;8>6+YIPT*Gdp^WSk^i{9Ub)G%A8E_M z6)GOgK{a?25_u!Vv^#iLreoGzx|ZI~ZIwOZfj>c6z^ja|I`h(PR%|oGZ?724fOo*}(!Dn4 zb`GAl5egd@W8iKvD52=KxdYvWub{7_8|q}|7~aeHmDF53_kC0M^Yp8Jet00*a~SWY ze;a$|Lj_|_kZ1UR^waV)zN<=5^DM@w($p*^j5Du9TEq4FkaXi=nPO%3QI}NkYt}U5 ztd*C1^3juuSVIj>^O|v9U)94JwMcXU=}$K#%+qh5!#{`D3rPufsF7hbhV+5%r$~il zln8!xbXbftYaOE4)Dwg7l|!8s5ZMM z(kK6 zB`6m(%bKnI)p5!=LVS(EHRkCSsjr6d0e%maYxdr6$ek{-N+U_~1P9da2W47@qWr z^y+a-gASvO`MM93V!!C#wYMDfn1fnL@Me)S`R8IONNj7aL3RGmJ~(A4Vn{oox{jSE z$6(#U@U|;6J(GS_)qbI)tRvk2;rZ%e4?J?veREmzT&vq{-B_imWz<7b7d6VhLCX75 zjJ-Mj;Y{Y6ut{=5+uBmv<>okNXBBQwmd#khkIiu|zm#C1jbmdGc#x%KStH`=nX+8( z4XsvQ>4>rz#SgP>HIi%uP{bU&FwnVO{~JNb1dKcIn6&C|Q01 zP2fkeid}ATZ$6P_5l0ZZfe7K@`prAHmuHM&`lEop&k3AJearY(H@!JtcRIgAH>%~{ z)cUHuIbLg`n*qs3}bT6UjHa+TO9iAtWnk~n5D#{1q@qQ7^I^;7*}it(#)VU3HGn_Cz_@a$D8x3TBUHtG1dyw3AVE8CKC@AreX_E@K_wXLZtugz0}h36o^ zJ&u;x)XLf3+Vq2gHgQH~mC6F)L~J9h##n8Vzzj*bJgcn|AN`3Q6J4Qs#t1!)&3@r= zxjq80tZeKu{j003(@o!i9&S1ACsb4PIYkpx{bQvPI(+9(u}3xDiLuV6W3H?q*tVmj*1#MS zta+pJ$Vb{SgK1ZE`+Q#dF#{WoXyOx%xkfwOyk&ov#9x(G8G5PqdZ}@9^Q<4@PXS!j zRb8caD4II`mF5~YTKYFyqv=LnV?BK_0R-ONt9NYaV;cMaBfL2wj>@(Bgd3bQVZW4EKG7x7Y9+dV z{q-!FHEoBeA0Nu!jj&u1aS#$=x2 zU4~WmIetr`cSqlkeI+^)l40!1yv-+?&X&*Kj3)!_^C3%{4|+y%g-Uv_8)Egu)&&Il z=MH5L$=uz?9rUTEd*7D5z3#?i_YcL{LsAKDh0jY(v|=9`Co`43YhA0WIIMownM)p4 zxyr=0F8dZ)JG%u4Xzhiro@U8=sq!p68yv3ntCo|C_A{`9qC3?N(l>C&xF#+?ew+9( z!pS&BN&ce4<5lZm=?gN))fx>s6IF~pCHhL+UlIwLhzp3=wOH5J zKD1(ir>A1yKAzhL3Vx_Xxtdc}zq>PGKlNm&UbE2v=)86Y@A#1wQc7EkTd|6@u-Wxh zfIrb5B~N>;4fAe+uLPM*h$je10@cz(!qDk1uMBR z=ASCgX6AZC%)KdDu0ORl#WI~#XpCJ_7#L_SG>C4HlsHdg$%>^+12Uh}dnPW;C)!3k zdC?nV4CC~~jnlj)#8x)qO2zTv34k~=~N}q0U`vz%Dxy#H{i=P* zX+%?R2I#KJxhF0*V`3|))Ed+@d0!E0FMJ!uh~M#H7BN5d-E1*e=d`|Zun!Um8_bb$oDRJ8)?0k6wi^>N)Q~ty{?kk@3T){aj9l={?DvfoTxIslrq!L5-hjEo zM%wl`q?VdKt}F&Qo$tsqkpKZ*$U zQNzsMQCmeBcYW07BB`{|2ai_K==ClKxdt%ei2oW9BkIGSK0wTb_CAl>O#HA$MfN@fws{}hw%lvGWU{ExE7ENhmO zn9C^pFsx3vM`Jmx-sSXJMgaMLQ-T(~!$8je9VjCCpJN)TNwU;cf{IAam}M=Jb|#Yw zeD@AxoJi80{(0ggHR5iQ3%G_IEr+MNoLpoCFdTQ`C9D5m8Oj2Vh60!WDBE35+k|@@ z8FX1K>{qE^e1Ps@?0yNPt!E$rDXQleJJkx$2w%n%@_g*~T5Ml{mY{e8z^f@*re zc2~eQ@@`^LZcBA;OR�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

        |IMep>dC|COeZ_;Ns8^<-GkuB3 z3|;lwk4%??0MW^t;R2IvipfvMw+!XeK>1nD!I-ry*<@4*Q)!-W;}$b@)zB~VkHb__ z92IH(X}VHt#nNGAj{V8E*+)q1BSj2UX;EanC1DAeo4l_N1hQy zWgI1a*npX5;I#v#a>iQVZg=-w9|)91aX=j=r^bxDR;trK|Kc*|gL1~Ovj-4j%vA_| zQSr_r;f@|{zXHq_G;~}A{ZUC@WLw;}ALxr54cgug9`KrH0CapzulWdlkv&3RbZTJz z-Ux&tdO0veS5)>J?_CiA^qboUs~ds+54fRUeSE)i&%k1!qdibOVDoAjz3Wx@@cd)# zeFF(VHMXRw%(~z4Ri$ppuZ0Sry(L=ge3B9c35v~WLvwvTjb_7=JE~}b5-2xl{^N?4 z2SIS_s9VVK1ICyWB!$(5C|Q33e#fTxA73=y_PsR!-Rs1^aUI3tBoqXP?Ys8*Ropk% z=oNPb5){+r)!y>~K6k*BBk0*QA0WlJn}0|z6~@dpUkl1(%*TMOvKukF=6=bx3hF** z!w#8in!l4F@b%^T+qt!U477a?H`{)2J>u_pv$M+eLf1Su;Ooop0@7&o`2)a9+ujRo z(T+N8L%>VBAYV=z?VJyMeVIr{~Yc%|hsDPsTYlSNgOmNyJRfmjXp*`>pdw;v5&Xy*Pj3$%4xr*MPIn`7)68 zWk0daZc7HvK1YO;_5gaGMrYklCPEZlvNIFCU`0E2=Vw*3`0a9{zEf@OJHM)O+1&AH zC%tOHW+1~XsFgt*I(CGBrRLjIk)UyN`sR_6X9F5Q;}?>A(0V_5 z%!1JitVgW)|DL@A&c7R&|EeK1ULWlfq=u!4K5zJbwjwt;XeW=QE)2TZykwK+SGZTQD#|JKSxPL+x(o z(eoFc%v%J!m~yCD0Ufl>zV`d)k13$`H}ryR;OfgkJ1d}Od#a5JRpD=hNZ#AwWKxh0tIkPz#Q)L=Aj8j_+Bc-xn*l9g zoh{4mU#o!Hn!)2<3)XZ54b~{2mfq-auFY@o{LqGo^6mlL-lg7U4Fd~aGFiM7H@vYo1m>ZDaDmX9Hoc0*7sU+D3ppQ%scm2|#80ucPdL z+m$gMfq$a^#KXN_;k8NFaxse~1HrD&dnIvg{l57~^3k}*eeQ(Y|5$M}h?RWhL-{O} zS8=TU&dVQJo*0USANWL~!w-GLtJI2~bI8}ObQS24OYAC7N3TA#F}D0s%*I23v1R7b zvF5KojxBi=t$!#Ww(=q^7mEhv({6%_-~8#Y7) zm-e;gfg*`;Ku7=G@7u3x?3+t}i~$ra_I0lG1Mb;% zXAgWmFyH(&NqlDKm2k%~=Gg^1kM+)OXqWpTU$))bdCtq(00`E{XfW-rcb0-4DfdHe z*z0?=w0po7^vJT1{unUV=AUbS1B~jk6FTk=n(hs`U-Gg)@zqN20|p@1LP3WFKS_Dg z?3B{x&Pq@vD|J=y%WjQ;M`U9Yh_ywpiic*6So)*4uWYm)u=hw$fS}Mc#6yVhHN3o2W}1Uba%sw3pw*P`)T;}=&Yfz&jERVk{KMcESbi3KonrWqLUjXQXPYtj zIuQ?@OFZK1yf_tD&*8%`_bT{0C!Dxn8}0y*3qMX_*SC652nMfKla zTkxOxO&N>g1+P7$^%eIEZec-5+v``>Hit+CBb)EG6t=ew`kDLE%Y`unP$dtPfSDHH zTe22Z$xX>XQXA@;3naB|OxLsm7sK{U*E)a4(#|hj4?*JrP$kR#Z7#Iyf<`&Y0KGKz zs!L+W6W8pn1&QsAuEkyUer-$6r#j8cZ)2ZlIL*)R%sc;$lY<}7KNmQ;bhc|}m?x>| zRoyBpAJ}|e{lzcy10CDH8VobPl%TgEAh@y*xYqxFqE?!J`gZXj)hhvMUnk8u*70!g z(9kCEnSfrI(q8F0xBH!5d4T-BUa1bweH0QN8}F4*-}(-L|11#i!SH4`VfG6fVB(nCOa?6j&vezS9zvip`Wd=GL|^}m(@^8b`35S9#9<7b3q-rFg4-C! z2Q5z+hC1X3Xc>!v>iKji*(GgtqA#zVSJ5I0)%FwJ4b_4Y-6V}p;pI@^>RVnzw-)S! zDu+z#C}SvKsMEjI`ctT?4{xJP>lP0wYAD`SXN7N7?=eG>4CC^z);Zug6+H;aLtMrt zD4XXXC48cXNDq0RCu#R;7rkH~?a|mrjzrT{>wHG*c88|&#Ve84@$O2lzE6f`+6$Id z6_iru2eP&j41hL|0@d?}2*A}B9$utFh32qG2_FQ}>5r+#XIsi;K+^XuQ@vZL-|cF=Xr_*xQ)XAe|qWow zUS@Voe@joDizG6s=$zzai2C>`)cX6T(7!nY-#Z)?_wBL$Slt~5%ZW%izC3Mg)h2{o z0*cqxRpvomeZ+B?Y4F`tn3=~PMdm@#I1R~bgUNe(%j-%J^udTgYJiEWHqHNR_#`bi zD(}C4_(&M>PyF>jojqvmUQ_S`^g7Bk{(POX*bB^inVV)PqWAm<~P zp~O);{d1(FsnbN)uGG^QXyWb;P25Qv{fj*@hD}+cInx)&A9fXbLL!SiZH%M>Sz@)* zO&~|i$d5=x$S`%AGGZXHC3~RGF_^nLRK-!G0gRNz&hwqo0K_!=3w}vJ|e$x z)+o`)X%d1S$kal*UqB*Tg#`ka&wf8#2tDC8E8oMHLkLXp2T$i9_4#s%B**nyf9dx> z{7ZuAy=CE#%e8;+a8&%+@nTfHb4PzL6sdzKRWIGqf01;gY4}ZBHqWBU*J?~L&F5_KO7&B-JBh^8tai~T`tv3izhY*U+Hl$7sWV=vZ zukjucj86%5hqO0~x(Pa!0@ccoJTHK$ z*37YlLOii^Z|**dM{@oOigj}FKIxRF{H3(%24ZtB`UyQs{Tis0pb)feFG&MSZ9a1kDJsGm^o~_46+U z${%?x?GG5xlxE(H#*C4%!vTmuRFaE9HnfooHsD`AJkb**(^gkdqzbhn&({6bm-{z= z?H@cG?NmGC{ijp59rL~K^qZ_<)Q5UEo8{O-&Iu{eL5*MFenV4bMWb?GV(@uD#(SES z=Mfrja}Is$(c^&^KP}F<*_J_yE67_b2`DJKfdQtzP{uSd30;t{h4HpyXEMxgg2>Bj z$Ji<hzTq$m6Cm|``vL^pm;KyvC z_h_QXhDnyE&qSE@>J(Si^B?pW9VR&WhN3gXKuOzTPB3q7T?Obv`Z7fVH(yqy*ngBS zj5*U(yd*r+kE-R&k6}*r5P2}QLjZjlkExdNEt{BX9>UmOdKgtBo_~ZkrI~w=slh3J z^o#=KKyPVN4a6UMWv&2)(WC$$l5{KbMenx+Fsf5dZ_EQKE=5_lZS|wbuPQ{g8Ok!a+^vw4e3FJRWXX%Xqd-Xg zIfqkoMMP=gtm@pTofX4+4|+AnsJJYu!&hxOPJl_*1}dlsF@P3Uzy?tztC503c4g5? z=nEsac@PmUIZ1YifcryiBoL{#NsmJFptYIYMuNsjT9NX@VIo)N{f{3G%=_5ZZ6qnzIXy}`}#TocHMj@lfT58YVm`EsH@`zM8)0B-+P zVb|o`jbGz2G=Hz|OL0VRcD7`SRqF|;L=YIzOxB2~UTLSKM#DLqfnGNAA;Q0t!ikgu zC2c+pbxsu1m=5H8_ghgk9ZpYU{vOGm#_SY9q*=vdg()|rVGYFz>BZ7VsdSY$Q%ATD zW!jOSo&*TVjU>H_yPAL0Eb5bxKl^{dtomzhLINY=x0GCcdY`6TZ$=gX`8t4Dq^JM* zI?zY_ddKr$D2WOUyqX5U8|)w*@wK~K71V_x6hc`#?@KeazSh5+>5-#!3$j*WtavOY zV~UtO2fQZO1$O)|z-tmUS_Y)c(7#FcP112A+jXVC!f3>Do-lM0qpZMdQb#ap9SWVI zLza_anl*4+O7Cl)T%S zhCbUH#2eY?Nxo{WkACY~f)Ub*pB^dD1g{BoW)b%WL0wVtBk`-s4WhaRvK|riHVZ;z zIA^veG+GgRRpld%$69}68X>KD!Hly#+p?Z%-VNeSy&KH994I|_%G$wHd)N4Ascf-R z151JuddoWvTD1nzj10sx5JOH2>GTjXG-C~Dn_$Pe$lQ){wktGBu;YwDqr}EtJ4~}o z5bS8oY8G2I<{L;|0B%ucr(a5~hfvl6KR_C2l$=vC^a$5f_4_(H_f5wt^`J)9PS7TQ z%fsg2Qw6zer#GdomCDshbvrh}OovSNQmB=!KQN38$us?n*noDeo25WsH3`{TWfqiO#Jvk^`=S^|B6K!QE3g zRRK7Tg=|K0s@zQpfD7h-3Rr8EyD1UCabtU?BLp`Ea=-=DL9ej~3O6MH&T=0^F1UxIgAMIfP&hJw{)($yyr9%gj&vY$UKFcC_~+E@uR88 z0oN^=AHny5LZ8+!v-+Pbhg6@57AF;qaGE9F!x<^!rBHR3R6)0VqkBvclvFe#@=HoP z*SKk9GQsiNab(KBfMxNIb`hrj!>|6?Veh^}IW<^5?dT3tx=;|;c*?3xu8ce&lijcm zQTwzMn&I#8o-2HtNea#IUq4(({HYMQ+DIKpBcxo>i1%i>E~~eF9=LUoZW5rg$`w*X zU{?P}oT&F9#9Dtxe~(^Bu)_0spLo8oah(`^DdqPxPL*hIdd!SZ2o9TBo*?-bq}5@x zcpQS6sUa~5>HUYT=Jqp;N=d8z(@tZJt64P=5FmZpm6Je78}(l~>mT8^SOADv|dqeu&C(yd7` zHT3mJN2AYrklyQc_*<+sbyl~yuY0DV$V=lgkC6=H=mB+}yIXJd%nT!i#bx{q-K<-V z$~~qu^*H{~%hnO%tJoPzs_F3LZgk@%DINgz|c9wmWY0}KX0oa7T zy{U&O2JxH)OyfO*-Mv|hs2*1AXVS1CeW+;l0+Q!hN7-^c5<8@_MnLt-Z59P zqb;*oYVHjxq)U_8fg+sK{g6OchDguuE~4`M7wnq*BNd1LH_fUHm6y-`vKzi%6`X!Z z-h~F~ohuKH{YPUDLgLpye{zo!XS)mBxQcLxM^#+LnfhPnW;7HJm0_{kY!A%*rraA) z57n~FOoL2{gZ>U!6&^p6VNn_t<)7Y;HLq?pVraXO7y4(&J317|Ok&wy484)ao15ri z!PDc+Uery;V%DyMez8vjAwG$4vpzle^r>@+{-ckld#{@&Ty)`?_}rU~+kf64d%bG^ ztqXmJtld-;9#GOce{g!@5aL*qo5W9nu^nR?%kl@}SW<9T+HI`839k`YVTj3H*=luD zOxUiWy7|PlPH75}8LF1TJ`Z*2M8pkK=X#6#Q>gLRq=1?<=ml|$RUK-b!uzymItsMX z%z#?U`j%KQ07-uE1nL&-<`*GMkDH%l{+6p{=9sI6Pa;gU7n-57PEgTBTrGl?y(n%B zu7;ZhPT}d#Df;jF&u^!g52yPnTaJZ@gTsrrgO8U_fA^s~X z&0pcaxi8u22Q~pXn(w^e)U9p&B>{7repau0YwOOtohdboKN-BN*@wc&O3fBp82hku zqJMtfCE&dN?#4%=drCZ`aEtl zV@gV^jG<{51qJJ?u#2l(`x#S%$n*X4w_+?GwD>br+@eh6Vf0uKl&Hig=dOHt7=3D} zc0O^oQvp{IMxW_O+5jBvn4zNzwB>wTHy@g?gjy=lR*M}j*j4L%i!Vo;OekWVt30- z`etL4LE9c4JG z@qoFA?+vh3wr@dozgcfpg}(G+Q|2@AKAB2#Q3-Zta^_luUciTSU9xCs<_VE0kb7hS zt$>-HI7)ZO>IB(Ip0F~Ux(e&f<5**7+qJYZG)svK{nOepp4IF!hI$ZrBNEtK9NW^x z(7FI{qpM*|AGB04G!n_)z=mEo*Myf2eUGAMI2Cbgrvg&DWFcS1ED3$OP;gQKN!g#mR~JnKP^ZdjB~T-GL#ajg0tmAhp7CpkyzTz2!% z_UP@4GI&yWrPe?n!U+a%#Iw*jODPzAu9Pq{TdavLJOQdGi%L+n7f!3n38J_La!wO0 zO+m)xUZ6N%W4$66mhr{`0!&fG|fr!&Wxsnso*A71#FvLL?YSLTd8;^5wbFv_BM z&Jm{S9^s7M?0pm$tCqJkO#>0htB^09XT>p;IUa58lNd$t5^3t!mF=bJsxR~-IF8WV zL9nYa%R`C>5oget{}PNlAQo3m%5jlu4I5aC-IDTLB%Z!b4L=uMJM)Dw`mJfCaCp0Lc z+V7`zH-2&9A|WQ_;UE9$hY!ER8*~46e$JouFobG zYq#*Pf9zs`);luf%zh~eD#)}JWSg1$u;a!fv1BJ;^plHkNEQ{O z$rDz3paGfCz|2%EE@n(OB+l{AXvb*Tag7-0Aku38!VTEP)!a`QGu()=|EC=|2oNK# za>_V~_*;(Est2>RLuY(Vlv{oa@hx{k4Y!jv)nxoC*<4e+03g=t+hcT?m>5T2P-|Gv z3huEO?VI_6cNScla+9x4;{|&*K#V9i`KIf)vXK5oAED_s)M-V$wFLE3!fEL2F#;n| zQdRCvs`@qF1_JP>c!d|`Q&gN=ZNb(PxiED-0Agv5RLB6^#Wd*_2lf`AsD|;}1x!nz zOYs8PX8M%3pJ{3!NcPIH2Z-@(Xy{_07Q*!DM^j%T-0GFRSrH}BIVX5VGe0L>-iCXlC}yh;U7T8GAG2t8W6W!ilZ7Qc0KmoiN- zp|+QP;Lpe_{HIRO|2r*l!r?o=_CG(f3qi5ms{@Pue+=Pckov+IE_?7&WD z(V=Kt29kFs7d3LX&!3%>)+1?HI&KZ4)c#0sI?O3Axg?ZZdJr!7Wo03_FPo1nB3LXm z_hlJK7AINT2<1>KmTm`>vDRScCl^J6NHgZKw}1wj-zVN})b0GgT1P(;HRfQKQ`p&=@BBKq8-88PBT77W_l)w0~)iC%#*a2nB(D#etzA2>~4zKreNi*v)6~7os|M}3FV?U z@1e}-m@r>OZ_g9Qq}&leoJF4qb-k1YIVYf!%>K)=OeVVL|IZwk!TUf%`7Q^>$KVe~ z8~$x?zcMEVVjcPh|6Y#GAG~|WTA4jQYXzbOU#4*CUYWLjQaeKb2>M5HQ4#SO?JtHs zGEN!nFE5cU&U_})ka_#E4WO6aOzhM$j8jGt#c2C?y^o59BpVIMp|A|u&ZuiFn1eBHsX$&tX;KMxA^L+>OKui zSA>y~s9mi&o>kp5^Dy~;UXhf9jW{$GJe24j+wR6jv7zrFx$u zNhm!OqZr8RmnZGZbN3N#H|S4E{huIX|7hjFKRsMMKcRBR@Sd9`HBen3-n~Co_Ixvv zlnp5f@>HMS3{=XO4m|@Vv>8P|VQ#87w+e&hXJKgk((bw2TT>6meUV~NL=Q|h74DNc z0O%x33ks}BMnh&ktOO8q^kZURg-b4s6ndCxH1oH}EO{+|H`5_U#rYRVB^m|!Qt1l+ z94+YL&WdJCD~;0jFFFl5V!RpvU6hJR)Bkgs{vaOw4!TLT_zf-g(RMnBBR+F>7 z)-{;(Rj4HjK$rV1xJX!^%G_@8D|*aOQ8saT0kxiZj!BQ!U7}-L;m@@TcDKCfnX!)? zf>72k+RZuIqq->@m5y<5yEZ#IaK_KFz`5PI2 zlWS2%5BLYAESX@-VM;H3;Y;(VDh^Iut-GRj8>j(`Wm z7QHLs&@FHs2hs{J*%6Ut0KnG1;dqba*(PX5PES#LyIr<@HITEy96f{k<@29e&zqkg zX>xnDr`q~EQyYdzVxx|}csun(H=6Qfo(*H$FAeGid%IHWnk+Ea=GrhmZIG%zN#><4 z9`+<&FIj=Px_*r=^Fihe|2M7vsz=dY33pDdv5-75vtcA(TB^|{;i$MddlIYfsmD>K zKDDeBeyi$D+tSi})=Y9E%7#Jx<*`PA=bh9#6AR3XuT*)rx3@483yIZIXKT#x9927t zyYQY3<5lNc?0{zM?P#gW;iroPUE3w+R5q`{2#&t0eVn?l+l*BsZd^?4U95qweUhqL zX+il;FmUZt$+Esz*G5!NrC+?EryUa?o%qSl7}5^;zX?&>^t5R^V`BBRF|*uUF<3nO zBmcv?VLWExaX2^JEaXe&AJ$`*{J&Z8V`Es?Nn=<~Pr}6gT-`8k6UW>zSlpyBECD-d z%pK!7c?|D5X$&{%d{`U~i=VKct1BMoK52}Ao%oyKC%aGl&8}|vN%sbKMwoa$Hw-+w z3DKZdg1XGx1ngckIMx;O2()nE0FB+&tYTz7IEdyvL;T;jr$Lj>Wlq zOng>uIQ(zyNAR5Zj@eT!vkjg`*YmQgMgp(-UzOf-vk$0p2FQ4|ka36Q7^E8!Q|X-jTbTyW8Yr3D`;Z>*nb`X$&6B z#P{Lu4riQr4R;)V@_u;F$zy~`@7En3!KB}eb90?M276AtE{@E3XjxJhGp3}Nz^ z>!kI?9j4W!Yv4V8<9vk4bHf9Jornc@4>ylVbHf8SY0Y-`AWWWrgvm0%o#5sJg3 zt`l+YPQc?PUDp#cc}{w|PLf;ho^F%YHFr<<$@k$27oPY&K)g+S1~?3M(pazQ=R=T0QN3_tRHX`#tuP z-_exUbM@o(?7wiw`+U!Q+7rY3&hM*EH2>$n$IPcanSJLs|23%Z`@a6$|KICp|Ihsc z=QqEe^UV5s?VSB;YMY-E+y^ci;atlCJ;h`@iqZ#qXb= z`OWX2-x;et{=xS({p$Vm`JLbL`}3LK^7|Ogd;jKr|K{J%%uVm#?`Yop@iThVQ|FAW z_hX;EliI0|dW;?IdH47-u{~Gc-i_%ym+!{(-4BxUsSSE!m_Gh)BA@I1y{3=9|31~1 z|2}8Gn_lKOp9yg6p7XrhEDqn#`o0t8`+EHY=N<*OcCXQt_XpSe{J`#aYK@-8xBq?K zu=}pv_rIwTKYxw5E4I(yYVzmxGh?9&XXeCD6aM{w`Mh+!?>q}MtIeGKNh)^+mpoo`@XNyyk_00 zQ@%Yu-}C9Y?fsie@BClB)o=H2{{Hu!xw938z247rf6LF-*x%M3<{mu~&hKlUymR?& zp1j9QJ$L4k@9%q_rM^8A&j01{J99~8@{HA1Jbv$dd>@~g55AA@X!o~ya(;93{|4iNU zegBSjf8RY!U1Q<mKJ}vez73kO`~J-H-}n3YoxWCZ z+qUaI-~O)q{`}XNzV2JwJU`bqb$4y=doA*(Qu3ZVYij}U-*{`AT-G*YtG4gm4=TX^ zyZe1@vxZXJta;QnYoN9DfO`MF%9N{b{QTFy{+inx_&tT(zTbrKYU?KVnoR$x$30)w z_P#aX{73I~q@E_r(tVGgdA7*z?;e-6y*}5NscqJfdtm*&`)O^hs^0hgo%%PsD$%h^ zRPMH&JAbM|_kU15IQMM<_0C69aqD^F+oJw`-{;@`Y@1zA-(y#ya<{cuFtJt0-(#zP z{olm<*F(sCy~?e-uhskRb%E0MxaZ>9p7+{ZZ7J)0kBXPM@4Epvb|qxmW(~d~;B!B( z)rEf1HtR3h^^d;q@tOJ~yLp!SIn%+!mT*mfPC({=`fV}%zHc&k$J^4#%xg_KcOCHa z+hgo~z2E=d&%ItxkJo*xVD}zBj~SQ0N!cAotM_-^(@_0y=AkP48E?P)oRjbCJHPMu zbFbHB_nkSh_e|gUAG98}ZBr*Vl~i%v|Cb(F@4nHK)V;=?qRe}>+U6OvwplakKi>U{27%J;s{S%dm{v^YHXXqvp^NM-I?Bj5ME9$VY2 z5A_1=ckl6f&K%JS-d!8y``!ORGBdxqC6sNebKL*ae)6{M*lN}1e*SAVc+A-EZSCl9 z<-%Q89y@#g;j^)6w4UxxF)f3_etzO&ch=lS>F%+Ial&iwrROBn9!{XOq` ztLwE=Gj?02RKm_P`m<-BiLLj86I<(R^IMvB=YRG7g{Ix8RqWn<=+!gf z9b1nA_dBnATTs02`#KfewEfQizHYzwXj{SE4|>};W2=gN>Xg^M52)1W1=9UneoNfl z_Somi9%=TsJT`AB%H%DDpY@1jdjD5VCi7d`2ypjI8 zCFi~+Y1?|TyZ?W^tel+pVr|>LQ%Cg{V)N0O^xU^)xVi89y?w0({Cf=63ueylX?Oco z_1ityy?VsF$6#&SpOeAKp0=Hz+buB9w!I0QIkDF%(|3CdG5^y_ z=lP%Z-f#Y=z4sdp?LR*?&bxJ*doF3oa-Oq$#GE*KT|0W-3iAEV;iq?e(}$XcW=?#! zaq{j%z0cd<(u47>GgZ3xd-0#%67M~p?I^tRR@a^9#NOP^Gv@m_doX&~SRFiN&)lP> z*Lz-TcuZ~8`@DHJ>rK}EPWb127UAzWzP;6)w$F^|UW-pYT0xohwNHC&?t6Ux>y5y5 zkI$)Wr>zNV+P3y<``_ACJm2H;({{)E|JSaYc^>+ljhpv<>o3#R^mq5QW+AkttoQYL z)SLf7OC#Ghd#!rn-+HU}i0g|Q@l$<1_t7cco7=iNI`i%I)*V|tZJr}~ikN4R@1w%(zQ^M^ z&&9p>n_BWbqR)LF@0oYMjhR~q&uiVgzqB)S`dV88XU(!l;HmxU8Pi|Be}AJf3Duzwsz>;xvWc0 zKP~Co_8hI~$@cDREi2EnZEZ6KfB!ohE&u&3wM~sv+pI~~)(h70ecjKe+09;!+M4Zd z-yU9?`MPgI`d(MAnrUayZPymVYkZvL@q5lW zzxdYLmdqcw2Gq8B>#6weS1qmo+;c>4%Vx~9+}>uy>o>Q}eEz4ue>3l%W%+x2G=t6i zo|ebwJ$nWAtee$#&c*z*Z>hFfk2r1j9*5c*)Z^P=owiwbY^nZda^B9u5Cxhyo;%= zB;D7``^rZOP?B!D=FY1RJ<#WbpPo|=_qyZrzt-2TK3UePX#V{z^}g9}R@>vw zZ%e~dN3}HEPKEn=3E`#t&nEJ_zHAA3{`Va*nSCR*%{%%E#JsQjw)^0I50PC@Y?oa- zneK7k=7l_r8D4iMK|zlso$ldm^0Y?DLd(*W&FCoA&{= zeeayN8Mu<``Yk_|Jy-ubPo4L3Q^C&q%inJc7uWy3wpjyhk#N>a+9deC`%neMjMds^ zO|Z#o-a*zj`c|)+wf{C*R#0F6gDUJ>S9^l1Yu$FAb}V0QJ+a>JcG}$3Mw!d5of`KV zUOSlk$BbP9e7Ci}am{squTpf|_169#M`!on{R~%Ii*DCFI@NaTc@IAGPPn#NTR*2E z?&tQ}zIScVZr~>JfA4!#^?vtx-p1d3w;eXK|Gu_4@7GE}yKJs|q`voj+9tQz|I)=e z$anj;$MDMKQQy12v?Tq!=iOJ2@^@|ZI&c`#o{X#qd2Fg753K#paqj&m-ntv%h~@q!_#YrI)7k zC_2w;4b=a}xBt|wAIatG-dol%Z(G*&n;Yo&-i3z#?Eb&qua z){i#EH{;)SE%sgWZmR+_etS{WoiE>N_B)qn+4g>K+6#<%m)e1l7G(du-X~qX=fB!o z(Yfr};xNAHe1 zw_TgmuQBs!N$Y+#tE~y)^6e@1e#h5T(g?oodZ&KJ)-&r}+c)LR+|(lGoIR|qH#yfm z>XUaZ)DzOIfi_a72CJ>Z@YnU;b(lNe=Ge(wYwP!OaXTevZto4+ygNS2ySGMtnuTti zseqU@t$y+BnfSC-@_x3hI;tA~H@3>qUO!D+5AIi6yOHka;yVTmR-^hSWA=;k3=~J6q4Mv6bDt zf2*yP;48MXH}9H<`o+B+yX-2=?mbV*;JiCY2IqZ6n3I>$enif+4p;J&5QawIp->{|e-O*2}l&)BCriDA%)NF|=NC z+jZA#?AMnY3|AlO#q53lx6Acz@!$SjTdx+c{?aard*5a!VA@-D<*j2Acb!~8SAlfr zqqlTdjnmPGLc9NeJ+xlWtl8DaZ@boQrynGu*L-k}Io!2wZ9UT5zpuf6|6f|^`&{oF z&QXPXjqJ4D?|^D+k^AZg=Y7xh417lF{d|Ag?lX$DRbyZMp!YZ}aQr(ydY{riVcObY zGHo}Xt9o$H-Y3`A9{OwiR{Y-Y{px)c2Y0-^JHF?a^SE}^ zwWsIyufAeyY+dzb)6g)YYODOXeqU`Jkoxy}XO-*j8||j4y1(sObGzoXdfL5Sm*Vw0 z;OYmp^_YHL?R3E>eks@QvJl;a&%n`M1&U>`I)0qqI@viq$jp0?HVmj2uPd-Agl?Rh^BtoM3$V%e;7|L-fU?)kKb*tSDl|AR_{ zt7fW5`7c$u>>9oITvEx|^UA+==lH_?TcX$9Yc1zcWeLy5^jSQ}xu#u8QeeH#?o+Uh_R|y$QR0 zEBCLl_1Dg=`?<4O?LITwqjwvE@7P*NyS29NcfTv@VYk(X`+wDIjk|tpdTwgFesep) z?q`}-$nJH_ql_JyRQ}6-S0al za&r>e2hm2s>;F>Q{9jU(d(U>NpDqtnJ>*bPgKzg6q0oYH_{aYQ6V4I^AxN|8C9eSi-#q zb&e|ZG;rOc2k5&VJXEG@FV6qpl1#j<9^C!DLp#x$u6s0}-ed6WuDhRKdW37zxqLgG zJojjq<+U%PiMXYQt6#NLaPJ-Lg;Gzq_y4)2&55nuQg_|hVZ{5~Q}2zNim$mig-^e) zIC^B5ewD6X@5<{`?NPtxgR*v?^Exxm&2g=*lJ)A7=PCQvl-`Zqdt&l!YxmX1dyJ?I z`!|lWGxXNM+U|Yf?I1nMdi&N5=6bznzjEFp=Dk0sm5j=b`}fs$_qFWqGrY&QY4-Xp zQCRM0kgCS%_pP9ernJTX<{>vbYkJ<=vKS{X1tj_w^6F?KpeKt_t=P*tMaqma(T}pa>#nDu9 z*X*a#_+Ib$+9loN_?7ckkXz0D_cxy>+iNYYd9(lE6U7y$1D&sXS&k>319BFp5N945K%=Fq?PQ3nq zwcU01vAg$Z))u<$>f@*F($Hgfzf(GGoksaLN44Gi$d288=DW6@Y34Wgldqg-SEs!1 z(H`r$Z||r7ZR_c@<@(S4ZJ64=+g882z9Cc6f6(@ewg=jtX!}Fk3vKf~n|=%8sAihq z++4D4h@*ON?GQ(6b8CkD;%FUd?GQ)( zdF+}Kw+(SL2G5Gn;%E+AJH*lY_}U?k)>X!?HKT1q9Mx)Thd6pZSUbegJLa`R z9Mz#?*R%JwA&#Db*A8*C9=3LfqxyX95Jz>?+98g#V(eOf-ZsS1ySBAM9O>`cA&#C2 z*A8){@nhHX{k9>F)@jxbakK`tc8DY0UpvH+rmP*}=$UZrT36mS#L=_z+98g#aqSRC zwaeNej@FxQyR)xv+cu60Ti9(JXWe_Rw{e_z32V1;ocGgfhd7|;r{)~rp6|B}arBJ2 zc8H@j%e6xs(DSnfI=;~J3Rc)5j%tX#9^$B8SUbeg+UD9JAHB;OJLvh@AG>yl1A5-U zG58{m_8ROx5J%6GYlk?X=RKvbFZBHETc3MC&wEUV9pY$BYp;hm+J`cB(DU;yb?uN3 z==pg@Uth%0yM(nv9M$`4hd7|;=iTD?LeI}$?6pH2t*NdZ;%Gf*?GQ)ntYZf~KWFFG z4*7tdS2e*Gaa8B+JrGB0+-rw8py%gY`S?Q5&)LYeLmaI)tsUa17GFEW(R%l zhd7|;=bXs+LeCFRX6+D1?_t*takTEUc8CLdez>dS3q3#YYu65OpgwQQ3Vaa<^!%I& z+4~|N(DTD>9N*q^ZX4o&o*(wp`XUb0=YP=ivqm=8gPxx?(6vJx(DSp-y1s}5_4#>c zxW32-^!$8#V0@wH=e^q6As^85v$uAAkq^}8hh?$8$OrViHxcU#J?||&?2r%W`B_t) z-v>QEXTH}CaX`;IO}oCGotx`H&pY%3JLCg;e$E!`JrD=#^R{5EFZ4X<9_)}0)aU1% z>-;{{=jW{N+93|;`QaCjFZBGpD_=Xr0X^>&G zGtg_d{VHe|>^6?Ju)%KQINz6?`$Esp-s!bN9MJRg{h9Se9H`HG*#Td~0X;uwH|M_4 z^RxeS?T`=X`C$aCFY*CB?;taLkq_wkVP(&Kq35ABV26A_&(B$ay$A9EJwNZ+#}|6u z)4e1A2b;UGMKhKA`94?A-W5&(GP{wL?Cj=lQ`G`GB6E_wjpQ_dK8%Ky5*liqbo`K!wqwU0N2R%Q`nu!g1e)e>% z9pZqVpYtE`GB4W%35FO`8mrtzYpu}XW!D=Ar7p!AI8G^A`ZMiZ(I5LLeB#o!w&rl z>+S7qhA;XR*4x86!594s@6X#rzrN7(!?vFPAN2g}jaoazf%^RHpIl$Wf%W$D9ggvZ zo}cevtsVLm>hm}B{P2eNdWZvhe)hlPi2TA03GpyR&co{>^=i9c>%OIWM`s8%IYhV7K|` zhz0Br2lV`KVdu9%&pQzTJH&zY_H*`O?}0e*{``CgVSJ(I0ij@reBk~0VUX-SkPqyK z3&a9n&)(^^LmbfaPAaW0^!$9^YVH9&4+aN2 z!~s3;)G~Y#2lTvyeCrE6?{q!vkPqnj`F7#_51{7}p?>-c_$oUhd7|; z=SGi*XJ;@6^=#LeCE~Y3>0%KOCF2LmXIdKj#tG7jZz(&$*)UMSXra z1Z#)!f%^P#{ni)#3iWwM(bgAwemE?159oP7E!ZIr=y`|h;fpw+=ZB?o|Gti_p>5;n z*ct3Lj>C-Gdu+ct-&$R}jiUoxutOZs^G;{1FZ8?v?XW`}(DTE}o;XmScXAPShy!|l z&b7@wP@kVOHEV}BP@f-;!}=m0sLwl6x4zKx!;zbNK+hwwzz%Uh&pVJbK{z zLeD$g2Rn=p=y_i@f-lAg^t=UnmEWA!{c#Ibtb@oU7fdVY>> zZ@gQdXNNde&$B}utLNDvj@9#yj3bV%&$B}utLNDvj@9$*5XY{!XNNde&pXnNI9AWI zLmaE;*&&YA^Xw4EzCX_najc$4azz}g=Z6Bj{c80*JH)Yieh9L-9_Fjn^Fx|l-_`T% zFz;@Co*m}h)${By@2;L_hd5Tx|If@EO<6t94smRKo*m*?JgE z1Yg7fJrBgPzR>eHey~Hof}S5P$@~wX=jU5$Ylk?tJ`WCrIH2d}`#p0H==u3R;@Tk& z=y}{Y_#zJId7l+nU+8%NPuL+J(DU={kcka?e!h9Ib{j{x+D#K99@^U*rSz`T5@1+!uP@m&0L)e4su*thK!d@&P^X6DsiCd>lsOeUJ0q zf^FM4&NubeZu1dR5Oy0!&~Mmn9N@!+(L@~3^S*ep_kf-Uq=g;gfSv~?l z_iG0|e?ZR<-*)bS`uy;z*ADqWecng7;fs7g&kuKh?h8FX49T@aKA`6h=y@OE#`O>f z^!$8}d43D@{CtyP?GOj*^9S_&0X+{{ihCdq==u2`+WbD~`C+229pZqV2Z4nz`W5s% zVlI5qub}7W`ycb0q37q@L~DnB1wB9CKv`ep1A2bGm9oCb2lTwpEUho}yf6L04*7td zpKnCY?}MKA#SYkQ9N@zpWbXKa50~A>0X|%In-B2evfF+IK3sN)19}cVTN0$He4KBY?mZ9(^!$A9b9|xaPv|-LaAA_suTYK;>_;A_nIRC@@^FC6K`yvj!Kkrk8>kB>qLwycD zTuY_M2lO0#xO@=@^c;M+d=Urq9DKMwXNY{DKL3NBgAdpB5C`-ee7JlO2lO0#xW1f$ zI8dL14|l%0vHbvg4nADIJ74vg$h{u)yf5>>4sk%w&v!=ec@liMmf(>O=sEas`63SJ zIrwmWpcrvL&;Ow3f6#OA;m${p_kRFA|AU_YLC?X5>vQUe1NAxhaQUKNp*{y6E?@L3 z)aT&C_38xu3VQwrJ@4zw`#*)A_sLJ#As^85J`K9Q(DOc213TmcdfpeV;EQ}f&(C+w zXKX>w&-VgvJMiK9GW^ET*W%&3`f;x1NHd}dVaobH}PVT~en+E#!#pyw~>d7n_;-v>SKqhYW^ z9MJO@^c;M+-#)ar_kf;*50@|EfS!X7moMUgo`Vn9#~)Wez=z9j`xW?b=VOxdKL8&t zyUhpqaM|tn03WXHC5Quh-iPA$_n|(2L(kvPbMWE%Et`)w^c;M+zAuhApy%g19 zqCS5^&(C)iw{W*&z<-Irwn-A`a;J8}&K(aDAy2 z;{)~i8+zWS=J)>$J%2;b-_UdL;re~Z2lO0#xVHbHUqR2`(DOIybMWE12l9dX9DKNZ zcbtO{_y6yj-(wnlxa>9`;KOCN;{$xS>~`J-A1*t@f%+VLxVB#Id<8yScB>yB=sEas z`63SJIrwnD=iAHkzlWZGpywaxIrwnh1NnfSgAbSQj*k!Y9DKOn5A+;-xa`ocpy%Mj z<-6kpe7Nio2kLY1;o5?`;~adr><|a^ypLCJ&Y|bv!*vhDf%SIq;eJ1;&%uYw4soD9 z2Oln9iHLX4nADIhy!~5MScE-o`Vn9v5D$uwJd2N%A+Gf70ZTeMh6Gv?`U)47GsBPk?ZN^7! zlaG$rA&y;d&kk|ydV6+=WA!{c#Ibsw9pYF$fBd(4UK{eUdY&Efv3i~z^0D=KcF4!- zd3MOh>UqZ-5y$Fzc8Fv3JUhg(^?7!PWA!{c#Ibt*03WV4^sCkL?9i`P&$C0n+V%GA z(63g{J2Hy#v3i~z;#fV;4sq;ydv=Ip>+|do$LjgxzkPpR8~W9*w`YfbwR)Z%`qk=r zcIa2D=h>lOZGGNxUBt2Vd3K0n^*lSov3i~z;#fV;4smRK{`hb8yf*Z!)${DoueLtV z4*hENJUjHO)$@)(V|?s-dv=Ip>+|do$Le`@h-39UJH)Z;?H$|RIKYR?ZsYiYo`VmU z@AfP3;j-I)1wLGM+poZfd;CDp!H3Ik$Hx!!9DKNZHy=OHbMWEvMI6v`@ZmZ}k9H?(qXX z2OlmwXa=sEas`63_C^B?Fr_;4XjcD@SI zeZS+&ZpV4>XxQz%8~hk{8%F?M*lj+3QJ;ek_xMG9{tG<^A1+_S0X+vFE?>j}JqI5y zbPVzVJ^zKCgAdpB5C`gW@Zs`B9H`I1hkFG5*<3=;f1&5UsL#QN>mKM=sLy|)=fBYN zUKpfC>@Zq{G z#s~Bqe7Jnkub}4-)aMWAIrwnh1NnfSgAdog5B&=3?GNbr19}cVT=&5EfSy0F-VQ!o z=|w)U-u^&+{(zo?57#{~KA`6h==lTd?cl@JB@qYK+aJ*L2lO0#xbA^Cpy%Mj<%@m= zJqI7|@qnI#50@Rr2lO0#xO~yCpy%Mj<%@Y2dJaBZQv~KK==lTn`2%_mK3w;}d<8v! zK+nO4YYN+O4nACVn-B2evfF+IK3sMi2l#N=Z9bmRbMWCpb#6Yuhs$nt@CiMCLeIg6 z>v}srz=ul~cASF`mmT7Oo`VmUFY*CB2Oln9!~s1AA1--Azk;4Wq32KNIrwnhW5+r8 zaM>Xa)aT&Cg=|F}cz+H)T)ya6&~xzN^2PXoo`Vn9BLn&s^c;M+d@;_U=itNTi+n)O z!H3Hi;~aVpK3tDO7$4Ac@Zs{s_<){2q32KNIrwlrnjs(1bMWEvMLtlUgAbQ4@`3ss ze7Jm(57g)2!}ZvSd_d2^hsziFfSy00=itM2J;VV$2OsVMK3r|c2lO0#xO|Zh=sEas z`EDHG!}Tb?^A-4T*=-!)!)3Sm03R;9ov*-$%MNis&%uYQB-wriK3sM??}87P-R9#D z@6Z3B=itMI&)#tkK3sN)1A6|4`W$??u7@~KpMwvVFY+RsfwG@Q$f%W!3)aQTDbMWE12l4?u z2Oln9`=sEas`63SJ`3v>=3wjPdTub$+NsoIrwnBqR03^eGWcczK8?$Irwn-A`aB&;KM!M z&~xzNvcr4@JqI5yU(8p~bMWEX&am^<2YL=ZT)vwR@ZqxCaSlFQb{hxyaM^7>KB&*Z zhij|Gjt}tRvfF%s50~BcEAZj6+xZH7xVDWTAE?j4hsziFfS!X7moMT#eGWcczQ_ma zbMWEX5`%o8KL0?^!H4U5hy!{KK3u+t19}cV+yi{L+K>*;#@;M&~xzN+BUcK z2l#N=As^6l@Zs`BKA`6x=sEas5Afk?+c?07%WmTUA1=Gi2l#N=t)7Dqm)-U&@Zs8? zh&Z6<;KSv+dJaBZcAF3I;j-I)1wLHcCs)tGhs$oq2l#N=Ar92%;KSvMe4suDAFfXV zBM#K(;KSvMeg!=TA1+_y1A6{NeGWcc+f)$;>T~en@lhd5TxvqK!a-ku%eSUt}Uajc$qECzAxd9~~i$Le`@h-2TMXNNde z&$B}utLGi%K^(ikJv+p)dY&EP*!^(XA&%Aa>=4K5dB=|s$F8?$hd5TxvqK!K=h-2S z)${BS$Le`UrVz*0=h-2S)${BS$Le`@h-2&X><|a^9DKNreyyH^50~BQIrwndt)7Dq zm)+_)_;A^+o`Vn9aW%vNJqI5y-^~a3aM^7>z=z9j^8r3w$LY3Tfe)A6_NyQ0Irwn- zA|KFm@Zs`B9ME&{;W`$Gd_d2Cpy%Mjbv?uZJqI5yU&H}D2OqAZjEDnz4nADI=vUBl z@Zs{s_<)}OK+nO4>-Z(&fS!X7moMUgo`VmUFXDingAdp7P>c`gIrwn-V!nc&gAbQ4 z#yRvHe7JluUqR2ohwJDo#yRvHe7JluKA`8|!{v+d0X+vFuA{l=SI~3t;qpblf}Vp9 zmoNGi^c;M+jt-+=LC?X5%NP9$dj11F2OqBMAr9y{_;4L}-Z;RA%WnG>_;A^6K7OI+ z;KSv+aexn(-Hs3N;X1ax{R(`z>^2|Z!)3SQ;}?1kK3u*#K7LW3gAdnHbHo8X2Oln9 zuA1(|5`W5sXe7Jnkub}7P!{v){4m}4S?)eKn2Olmw^egE3 zFZ3LIxURQ)-p9%B{ruS>AJFqY`nhnG@ zxxUczK5_^<^egCjAFYEg@&P^X17_G_|650@|EfS!X7 z_Y9)D_kf-UUWFa<0X+|-3E%Bk;KTL%wqHG<=itMIi9x@Do(FW>--q>f@Zq`#;((q9 ziNZb5ub}6_fz}uGIrwm4anP@z=itNTi+%+?4>YmA59{sV!-eQUzruPu_;C56Utzty z!_D}8$OqQjJFL3CsLwk@2|M&F=sEasVT#bNpy%Mj<%@hk&pQOOzZvy8_;4YU(66B9 zZMMffkPqm28?VTQJU{=itNTi}3+H2Oln9j1TBJ_;C4Rd_d2i&~xzN>IR4ddJaBZ zzK8?$Irwn-A`a*|_;63~;c7!1&~xzN@$~D50@R{fS!X7moM@GJ^#agIPl@R9`XS_2Oln}KpfC>@Zs`B z9ME&{;qpa3pyz+6&%uXF-Vg`Y+rfv+7ja;{9elWa5eMpX@ZrL9==itMI?nN9}ZwDVPU-T=iw}TItFZ2WJ?cl@p=!kh2^*Q)(`9cSw=itNT z3;lqegAbSQ&b#2l^$5KA03R;9jRSnR?6zNl50~BM1AMsb5C`-ee7I20JI=v}%WnG> z_;A^6KEQ{|ZpR1saFrF?ufT`P4sk%w!H3Hi`GB5-50@|EfS$jg=itLtG9eD=Irwn- zA`a*|_;C3m4(K`fa3Q}jKA`8|!{v*91w98JE?$LC?X5>w1U- zdj3Lv4nADhLq1TSgAdoT1@eLV9DKNZ5eMpX@Zs`BK2V>757)8^@`3sse7Jlu&hh^I z1w98JuInKV=sEaseJWt%03R;99p~V~Ww-eNA1=F{ufT`PZu=GZa4laU4(K`faQSXN zz=z9j=PU5xvfF%s57+YA&b#2lWw+x4e7Nio2lO0#xO|Zh==mFZ4nADVgvbZ<9DKNZ z5eM`fe7JlO2lO0#xF`5^2VY;d*7W^A-4T*&z<>ZwDVP z-^~a3aM|s=3qD+S+poZf>($fh2l#N=?KuBH&%uYw7x{pmgAbQ4;y`^4K3uQRkPp=7 z;KSvMe4sx6K+nO4>w1U->+Rsf^;syyf%Wze^c;M+u7`X;&%uYw7jZz(!H4TrCE|dd zgAbQ4@&P^nK+nO4>w1U-dJaBZuU8QV^c;M+d=Urq`~y7)AFk^m4(K`faD6fiaX`;M z&~xzNx*qx!^c;M+d=Urq9DKN5Ven8K`hwC*v=3VGH_;C3` z2chTS!{rP8fS!X7_XHoVwv7XPxa?Lxz=z9j^8r3wb{hxyaM^9Y0w1pJ42T1I4nADI zn-B2evfJ?iK3sO&ufT_EyTv}2fDf15jt}tRvO^rG&%uYw7x_Sa4nAC;5JViP&%uYw z7ySzLIrwn-A|KFm@Zs`Bzk;5BQJ;ek*OnN>0X+vFE?>j}JqI5yU&H}D2Oq92JLp%? zbMWEv#W;taf1&5#!*xBx0X+vFu5Ct$19}cVT)v0{dj5r;gAdpB5C`-ee7Gn0aJ8Xd zLC?X5%NP9$dJaBZzK8>Q4nADlxsVU&Irwn-A|KFm@Zs{sybC@5qCN*7t}SSY1NAxh zaQPw*)aT&C<%>ABK5skR%)7OX4%Rkt)HeO9w$YE;CXU*sU)47HQQO2(+w`lp@F9-X z^Xw4E*5}zFj;+tLLmXS5XNNepK5yG0;@J8;JH)Z|d3K0n^*lSov3i~z;@JAUt&)gi z^*lSov3i~z;@J8;JH)Yio*m*?J#Tv_;#fV;4sooWXNNd;y*)d`v3i~z;#fUzODf{n z_4e!#$Le`@h-39UJH)Yio*m*?J#QN=;@JJ|*&&YA^Xw4E>UnmEWA!{c#Ibtb)?dW2 z@6WSC9INNqA&z~2o*m*?Jxa<(e>UnmEWA!{c#Ift`*&&YA^R`$c zj;+tLLmaE;*&&YA^Xw4E*5}zF4(K`faDU*#)wXef50~A>0X|%I8wdDs*=-!)!?l%t z^8r3wc8CLd4nADI`&md&4Irwn-A`a*|_;4L3K^)L?@Zs{s_<){+50@|IE9g1+aQR}K zL(jp7>!=LoE9g1+aQR}KL(jp7%NOGVdJaBZM|m(lpy%Mj<%@m=JqI5yU-T>JIrwlL zHA26Fo`VmUFZvbq9DKNZ(XXKAKhSgV;W{3*aexn(-S#W+;j-I&fDf15#sNNDcH6JO zhwDfe;y`^4K3u+=5Afl#+wlQDTz1>9z=z9j$2s_L9ZlQu@r(K#e7Jm(59m4gaQPw* z==m@79DKMx@ZoAhze0TuK3u-Y2lO0#xO~yCpy$7+&%uZ5SRmp+ef|qQ2OqBMVSGT( z!H3Hi{R(;xK3qo`5eMpX@Zs`BK2V>750@|Uf%+VLxIggWYC{~*bMWEvMI6v`@Zs`B z9ME&{;W{3QaSlBPA1+^vbLjam^!yj~Irwnh1N{p1IrwlLb45N-pZ`M7f1&5#!*vhL zSI~3t;W}~){eYf>50@|W19}cVT)r6R&~xzN^4)xZ5BCQ?Ty2{V@ZqxCeg!^Ub{hxy zaM|tn03WWS&6^MK;j%*<&~xzN^4)O`K3sO&uO3)$2OqBE*oXsq4nADI+piwbbMWEv zMLwYC;KSvMeuedR@ZtU*&~xzNvO~Xuo`VmUFY*CBe?ZS4&~xzNIv$UH1w98JE?@L3 z=sEas`C@!P&mYip@Zmbrk2s*`;KSvMIH2d?!{v)Opy%Mj{XI~hgAbP-#s}(i@Zs{s z_&|LQK3u*SAE?j4hYOv6e4suDA1+_y1A5+v&2Ju5zQ_mkypLC}FY5C?sth~i1A5+v zbK#48K+pSNDtwU-=y@N-TwkoW_fbdKVZOq8JNR&a;KS91IH2d?!-de;IKYR?ZsPzS zF1yVK_;A^6zXBgFyUhpqaA7|X2lTv;b4)(^_yyV!2i~9eF$4H+KEQ_yOS0nwe7Nj( ze1H#^9pXTJ4nADIhy(RG_;7zgdG~*S^>*;#@uxa^P*=sEasAz{$3 zpy%Mj<%@hk&x4BX{}1(fuq)VMd_d2G9IY?(9DKMCIEVv!4nADI=vUD5fEoMyu-+cr z0d^Q4(DM%U!x!TmdftI-_#z+B^A6pvFY5CSjlvG&1NC_a{@{y#1w98JE}Rka0X^^F z&fXV#4nACXB;*5n4nADI$OrTse7L_hS?_O#p0`ODcE|_nbMWE1FY>- zo8Q;wEwpVMZ7PD@=A+Fnu-iD=gaNx9A8ig;JJjdBpoSgdfS!X77fuUtK+nO4%NKEA zy}cI<`8_pMwvVFXBLb4nADN zW9KXI;j-It4nACV8wdDs+3kD~6>^c;M+d@(*ypMwvVFZvbgbMWDkD2xx(=itNTi++Xr9DKNZ(XUXSgAbQ4 z`W5PP@ZtWzhpP>7pgsp5E?>lf`W$??d=UrgbMWDMWWe~qdOP@V`C@!P&%uYw7vlqZ z{z82YK3tDEhy(A>!H3HiabSNt_;C3m4(x9SAMOu)xY`g0*4x2{%NKE=J_jEzU&Mj> z9DKMQ9e2J0A1=EcAK=4fw{d_Em)*`+;KOCN;{$xS9(NH3*4x2{%XjBp@ZqxCaSlFQ zcAF3I;r_sfs||5ry&ZhGd=UrgbMWEvMLtlUgAZ2;vHAf%Ty{G?z=z8YaX`<(hszgn zK+nO4tL#A>(DOI+9DKO0hd7|;;KSvMIH2d?!-euj9ME&{;qt{ehn|BEmoLT#^c;M+ zd@;_U=itLthN53V&%uYw7xNYL9DKNZG0vgqZ|FJraFx!81A6{OeGWcc*F!$A-VQ!o zzQ_mk9DKOSeZ&Dh2Oln9^2|Z!)3Sg75H%3Ar92%;KQ{PwEgOX`W$??d=Urq9DKNZ zcbtO{_Xj>)ZO8}o9DKNZS3kgq%WnJC2YL=ZT)xN$^c;M+mfVmJ)aT&C<%@ivJ_jEz zU*rSz`3HIqK3vO$hy(lKz=z8habUgu13d>HuInKm&~xzN{=kQ;4dWbo4nADI=vUBl z@Zs`B9ME&{;aZMGKA`8|!{v*7K+nO4%NP9$dj5f)gAdmdGU9-qgAbQ4;((ripy%Mj zbv@(*dJaC^ANX*!p^2VY;j&vj2OloG%?J2!z5YNP&~xzN@?9MSA1=G?SKz~C zxA_1cuFv;u9R)sIcH6JOhszFepgsp5E??vW^*Q)(y;4FPcz+H)T)ya6sL#QN%NO}T zeGWcczUWubbMWDMU50!>&%db8!H4U5hy!{KK3u+t19}cVT%UkK9ME&{;qt{ehn|BE zmoLT#^!y7w2OqB2l86I(4nADIhy!{KK3u+t1A6|2o`Vn9t5n1RJ^!LU2OqBMp-9AB1A6|2o`Vn9^$-X29DKNZ z5y$Fzug_=Rt!?6{ZSqmu%)7OXe$+N`)HeO9w$YE;CXU*sU-il#ajc$ahd8!A&kk{H zeV!fS*!SnzA&z~2-ZllqvGsX&h-2TMXNNde&$B}utLNDvj;+tzT7fuL&$B}utLNDv zj;+tLLmaE;*&&YA^R|N^j$Loh4sooWXNNepKFUnmEW8a@=hd5Tx+bV=Oc0XKph-39U zJH)Z|d3K0n^*lSov3lP2Cd9G(;j%*+RVg4(K`faBVGHJqI5yyVY~>;j&vj2OloG)pPLSvRgd|AFj`(A`a;J z5A+;-xUPpdpy%Mj<-7R+AFl0s+poZf%WnG>_;A^6zXBgFyX{xt!)1p!py%Mjwe1l3 zfS!X7moMUgo`VmUFZvbq{0DjtK3rQR5eM`fe7JlO2lO0#xO@=@^c;M+wsN9hLC?X5 z%NOGudj11F2OqBMAr9y{_;77MMI6v`@Zs`B9ME&{;qt}!fS!X7moMfk=sEasZLP&P zhn|BEmoMfk=sEas`C^o3L!^c;M+d@(+t=itNTi+%+?2OqAj$>>+mbMWEv zMZbccgAbQ4`W5sXe7JnKUx5$T7VFIi_;A^69N@!cxBUuyxa>9`;KOByI8dMeLeIg6 zYx_9jKz$BAT)vwR@ZqxC@c}+u+t#;Vfe)A6j&tzgvfJ_Ti~1aVxO|Zh=sEasZM8=n z&~xzN@i#19}cVT)v0{^*Q)(`C@#aJ_jGJqZyd5P@n%o&%uZ5dWZvh4nADIhy!{KKHLj@ zxZ02p=sEas`63SJIrwn-A`a;JFY0sf;W`$BI8dL150@|EKz$BAT)v0{^*Q)(9os>_ zLVXTCT)vohQJ;ekmoMgB)aT&Cy}*a7ZQ}qRF1wv~!H3Ik^8r3wb{hxyaM|sA1wLHI zqYww`^9S@Ce7LTMIH2d?!{xjE3VgVZZ>sL#QN>w4%{sL#QN>zEw!f%+VLxO@=@>T~en@W2lV`b`W$??u7`Y}J_jEzU*rSz zIrwlLwL~1ybMWEvMLwYC;KSvMd_d2^hwCUP=3VId1A6{IeGWcc_dq^SpMwvVFYJIrwn-?l=b@E<5A{^*Q)(9U(_PP@jVjmoM^x`W$??e31{V zw?CohPv|-LaIYuy9DKO!5C`-ee7JlO2lO0#xQ^wcU!gvKLeHPjbMWE12j(m2Irwn- zqF+JJ!G{YkfPMu%e?rfncz+H)T=&5E!25IX;qt}2i~1aVxYrYU4nACV=vS!E!H3Hi z{R;It_;4W`(63ORgAbQ4<}2tq_;C3mAJB8~;qu*lfDadXV*6De%DlNz*=-zsz!7#k zKKigA>^2{L@D6r}1MBVJ!@c@I*j^9yIrwn-A`a*|_;C3m4(x{mA1=fP@&P>uA1+_y z19}cVT)xN$^c;M+5F|T3z=z8Y`GB5-50@|U0X+vFE??vWdJaC^E0FN^A?SHfS=b>T z&~xzNx-aqpJqI5y)C=-~_vhfl<%>9==itNTi*XJ;2Oln9jC1IDV5a>)L(jp73wMKj zK+l81;2y{a^gI~I`l3D$QUN=R59m4gaIX&V<9dh#dJaBZ*Fzl8bMWE91tAX9=itNT zi#Sl9gAbQ4#yRTq4o&U<3VPn5AJ}1hK+ikG0bk?;dfrBT_-;PhEIxK^#zx!5(I#Qo z?f7W(D(p6nHdVrI<7l(r+Ck6Tga$jr0X+vFE({gofS!X7moMUgp0_z*e>3#Fm)o#I zKA`8|!-dmAKA`8|!{v*7K+nO43)zJ@pyw?jZ@kd+7B^vseg!>mp=*7y-VQ$8tHliX zA|I&FD_G%+IH2bhCGbTY(DNQL*BAA94?nO&K2V>74;Ow7`9OURK3teKj1TBJ_;C3m z4(K`faQPx1SZ@a(E?49OdJaC^3w*fR5C`gW@Zs`B9ME&{;qpZs&~xzN`nOT~en@750@{-IrJQSxO_1_py%MjC0iKh&~xzN z@uAMOP{Ty5xA&~xzN@WE&~xzN@j}JqI5yU&OI`-g5iQSG7&Qs%_$^ zZRV@mX5OuB;;3!rtJ-GXt!?6{ZTeNO2oT4`;#fWJ zH67yE_vhImj@9$*5Xb6yc8Fu^^Xw4E>Upmg5y$Fzc8Fv3JUhg(dY&EPSUt}Uajc&A zIuvp2d9~~i$Le`@h-39UJH)Z|d3K0n^}JWOh-2TMXNNde&$B}utLNDvj;+tLLmbd^ z@ZowDy?PElTz0GH;KOCNdJaBZcB|*$!)3R64nAD3&k+ao9DKNZHy_}`Ww-eNA1=Gi z2l#Nk-rs%&K3sO&ufT`P4sk%w!H3Hi`GB7PK+nO4>oa!92lO0#xO@=@^c;M+d=Urq z9DKO8Q6L}C^B?Fr_;6hhaX`<(hszgnK+nO4YwHK%fS!X7moLUS^c;M+d@(+t=ReSM z@Zs97f;gb(;KSvMIH2d?!{v)Opy%Mj<%{_WdJaBZTX8VXq37Vk<%@Y2dJaBZzL>9| z=itM&RS4r8dJaBZz8D|SbMWEv#rS}pgAdnMCiE-lIrwn-qF+JJ!H3Hi{R(;xK3u-r zufT_EOV;KCe7Nj34)Ec!+kOQ;Ty~oe@ZqvU9H`I1hihxujt}tRvfF+IK3sO25Afl# z+wlQDT-)5XUx5#o9pXTJ4nADI$Or0k@Zs`B9ME&{;o7c;eg!=TA1+_y19}cVT)ya6 z&~xzN+D?dkK+nO4%NOGVdJaBZzUWubbMWEv#rS}pgAexxAFejU0X+vFE?>j}JqI5y zU&H}D2OqBOofsd`bMWEv#rS}pgAbQ4#s~Bqe7LrsVthc)f1&5#!*xBx0X+vFE?>j} zJqI7|4L)3L$Or0k@Zs`B9H`I1hszgnpgsp5u5G@^2kLY1;qt|Nh58(PxO_2Rp*{y6 zu5HLWUx5#o-R1*)xa>9#@ZqxCaSlFQcAF3I;rg^T;y``=fS!X7*Yyww*4rP@bMWE1 z9^$}yJNR&I0pETFK3sM??>}{s%n=AFg{KAJB8~;W`?QeBk{#_;C4R zd|nK3u*S=U8tCAFgBX$OrTse7Jnkub}6D(DOg6w}TJ&{)3)_50@R{ zfS!X7moMUgp8rA5!H4U5$OrTse7Nuehy!{KK3u+t1MBVJ!{v){j`|#YxbO#^2|Z!-bUC`3iiv z><|a^9DKNZw_o)!#G9R!-Ojtc*9DKNU zAI;g{g8CeMxO@=@>hnJ0fqNhysL%T-1ALJW)aT&Cg(X41f}RIq-}^$(1A)U1`GB4W zc3xlTIrwm)R1gRBJoqf`fqX#E!H4U<$OrTse7JY;#r-YNbMWEvMI6v`@Zs`BKA`8| z!-b;3_`v&f@Zs{s_`v@5fIRzufu0A7fgSPzJr4%5zF2P$Tmd`8f%+VLxUfAKAE?j4 zhszh^1NC`_jQ2M~&%uX#cW4y8$OrTse7LTMd_d1T{5ALOa247%A07IE-Nw;j6xeM( zIwS$Rjib%`YX?1VQ#tGq2lO0#xbRJg19}cVT)v0{dfsNg{mszxHm1Q2`9OW%MkDwl zAJFqQn7|kLfS$LBV0}@agAW%H3;hau-pfkd1N{nm-pj1@g`W4K1a`;=^c;M+&|b&~ z^c;M+e31|6d5c>6n^B*G4;N+({R(mGG1TkIrwm)+t9C|=itNTi+n)O!H25}{R(>ihMt2D*X0lg>T~en@A>QhwFNX1A6{OeGWcc*V}#tK3pl<|a^9DKOC+V(5(;j-It4nACVJI=v}%WnG>_;7Xmop-^9%MNj%J_jEz zU*rS(;lPK>7ja-e9Qbf=@ZoAh9H`Gf&~xzNx*qa@`W$??e9^C<=itLN4IvKbIrwn- zA|KFm@Zs`BKA`8|!!=D}oTEPfK+nO4>w1U-_4x;S4nADhLq4GA;KRMahpP?q73y>F z;qpblLVXTCT)v0{dJaBZ5`}&RJqI5yU*rRN4nADI=vUBl@ZpkB^egE32YL=ZT-QS! z(DM)KbMWE19`b?u9DKMp_;9tMU!gt+A1+_?E9g1+aQSW=;KTK(viSfXF1w8be7Nj3 zAK=4fw|WjfTy}^9dJaBZk6b%Gz=z9j^&EV->^2|Z!)3SQ1AMsfz^mur!)1p!py%Mj z<%@hk&%uYw7jZz(!H4TH7X1o(4nADI$Or0k@Zs`Bze0TuK3tF4$Or0k@Zs{s_`rHQ z_;C56U*Y{Z_;C4Re4suDAFdJt{R(;xK3u-&SI~3t;qpblf}Vp97Xlmo3ibIHdJaBZ z*Fzl8bMWEvMI6v`@Zl=U5C`-ee7JluKA`7c=sEasT@P_U&%db8!H287M8ATbgAbQ4 z@&P>uA1+_S0X+vFuJRZ8Kz;s&o`Vn9^$-X29DKNZ5y$Fz<@wB4wM`tgO+IRy`Kq?* zSG7$Xwat80+swPQO&qn&eASWy;@I`}>=4JUw`YeqcD+42#If(svqK!a-rh0@;@I`} z>=4K5d3K0n^*lSovFq*GA&%AamTnNo>UnmEW9#$m5Xb6yc8Fv3JUhg(^?A!ph-39U zJH)Yio*m-Y`aCxd3K0n>+|do$Le`@h-2TMXNNde&s#o499y4f zhd5TxvqK!K=h-2StUnmEWA!{c#If~xc8CLd4nEume7M>+ z4)Ec!+c?07%WmTUA1=F%1AMra);AyE!)1p!py%Mj<-5-%;KOCN&n4i)Ww*~I;KTKb zV4ttRhs$oCufT`P4sk%w!H3Hi`GB5-57%oA!~s1AA1+_?E9g1+aQPx1&~xzNdhLRK z1w98JE??vWdj11F2OqBMAr9y{_;9@{LLAU@@Zs`B9ME&{;qt{ehn|BEmoLT#^!x{U z4nAD3#t;Ye9DKNZ5eM`fe7JlO2lO0#xL)01zJi{E50@{-IrJQSxO_3rq37Vk^=c90 z9C{8uT)r6R&~xzN^2PXoo`Vn9t51v%=sEas`J!Jz&%uYw7ySx)4nADI+poZf>lN~?&B57%q) z?N{K#WrsMR=itNTi+n)O!H3HiaX`<(hx>pJR~zC$eGWcczK8?$Irwn-A`aB&;KQ{g z0pkPpIrwn-qF+JJ!H3Hi;{$pQK3rQS(66B9;KSvMaSlBPA1+^v59m4gaQR}KL(jp7 z`+yHu8{&YTgAbQ4;((rm50@|EfS!X7*A^Cx59m4gaQR|~_8aA1=EcAK=5a{R(kF&%uYwcjw&)>T~en@d` z2l#Lw@ZoCPIKYR?ZpR1saM^7f;KOCN`2ZiTEyt@LPv|-LaQW`|03R;9?N{K#Ww$yA zK3sOl2kLY1;o44(e4suDA1+_Sf%+VLxO|Zh)aT&CeV$lv2Olmw59m4gaQPx1&~xzN@qrCo74#f@xO~yCpy%Mj<%@m= zJ%2*a!H4S@2I7F8Ke65pK3vyBKCs^Ygr0*B_W>WSHjEGGIrwn-LI+WwgAbQ4^aJ%d z_;4L#Sser)F1yVK_;A^69N@!cxA_1cF1zhl;KOzF25~^o!H3It$N3-XbMWEvMI6v` z@Zs{^aSlG*2Yk5NkPqlN_;C5|I0qjtyX{wh&~xzNI^u+UK+nO4%NO~8o`VmUFY*CB z2Oln9u zA1+_y19}cV+y{KP+7Jiy9DKNZ5eM`fe7JlO2lO0#xQ_OrUqR2ohsziJ3VIGcT)ya6 z(DOg&IrwlLM?@UZbMWEvMI6v`@Zs`B9H`I1hwHc`#s~Bqe7Jm}gV1yE;qt}23q1!P z?gKttZ5s#paM|tn03R;9%?J2!*=-!)!)3SQ1AMrSr6LZjx4)q0;KOx2!~s1AA1>eR zSKz~SY<6`Je7Nj(e1H#^-S(>&^c;M+e31|6IrwlL^+g=ebMWEvMZbccgAbSQ&bu$@ zIrwn-qF+JJ!H4^R4_6!Fz`3v4nADI&=0J) zgAbQ4@`3es@Zmn-!_~HNfDf15_ABt=vfF%s50~A>0X|$PhMlj#hszFeK+nO4%Xjn9 z$Bl3HQ+7Mf!H3Ik`xW?bAtiQvfDf15&bxg)bAKQ7ybnFX4sk%w`@rA&LeIg6`}A=( z_#zJIc^~D1FXDin_mL&|A`a*|_;BGo5C`-ee7JlO2kLY1;qpZssL#QN3pav(h4<&+ z!{v*91w9XjzW-;`=itM2599;&Irwm&V8wf1)aQYEVTXL6J`cPKU*rSz`5W~)_;8_K z5C`gW@Zs`B9ME&{;qpZs(DUG4`#*r52cm)<#yRvHe7JBo=vUBl@Zs`Bzk;3z4cXre zJqI7|69fXj$OrTse7LTMd_d1T%suz*ur%5>A06U_-Nw=3QrK-iI`jy;jibYOYX?2= zKp5;02lO0#xUffv19}cVT)v0{dfw*!{mszxHk!i@`GB6caTvbH2kLY1;XZA?-0MNl z!G{YGg*Z^3gAbQ4;y``gMjre=le}6OdyoX@eAs^859(3S~d_d0=mGy<5gAW&`4f#NQ4nADI7$4Ac@Zs{sIES8p zpy%Mjg_c7csLwypbMWE19`b?pcJSfy-F$!#S7_U>z=z9j`xW?b*=;_+hs$pJ75H%3 zAr9y{_;96Y^8r3wb~`@6hs$pB0X|%I+poZftGn!c1wLGMhy(RG_;C3mAE?j4hszgn zK+nO43yX+;1w98JE??vWdJaBZzUWt|&%uXlSRx2l;@Wf1&5#!*xBx0X+vFE?>j}JqI5y zxkMb$bMWEvMZdy&`xkl+K3vyB9INNa`OH_fO&qmNzp8EKtJ)@x+9n^h&3skc%)7Ns z9JS4S)guVv*!ny>#If~xc8Fu^^Xw4EuD550IJQ3Tu?cZ(eV!fSSUt}Uajc$ahd8!A z&kk{{p7*GSI9AWILmXS5XNNde&$B}utLNDvj;+soJVhL<=h-2S)${BS$JXcBA&%Aa z>=4K5d5_eHW9#$m5Xb6yc8Fv3JUhg(>+RVgj@9$Z0K~C+o*m-Y_4e!#$Le`@h-2&X z>=4K5d8G^D*!ny>#Ibsw9pYF$&kk|yd9~~i$Le|I7UEbv&kk{{o@a+RR?o9T9J}70 z9pYF$uS7%~tLNDvj;+tLLmaE;*&&Xt&$B}u&~xzNzTm^vwsC+Dm)*tzK3sMi2l#N= zZ5-gkRf=yuz=z8YaX`<(hs$@LOTdTAZl6oQhs$oCOTdR~NnxL_z=z9jpRd4&%MNis z&%uYw7x{pmgAdm-2;zXAgAbQ4`W5sXe7Jm(59m4ga4plIUqR2ohsziFfS!X7moLT# z^!x{U4nAB0X|%I8wdDs*=@f9A1=Gi z2l#N=Ar9y{_;4*<@Av>8F1zhl;KOCN`2Zg-yB#0k!?ldQ{R(`z><|a^9DKNZkq_uO z_;C3m4(K`fa9{A@YC{~T&%uYw7jd9I2Oln9#DV%8e7Ig=V0@rH2Oln9^efco;KSvM z@c}&tAFfv{=vUBl@Zs{sIES8t50@{-2lO0#xO_3rq37VkeZhyT4RJuv!H3HiaX`<( zhszgnK+nO4>y;PA2lO0#xO_1_py%Mj<%{tFJqI7IS8^C1&~xzN^2PXop8ujg2OqBM zAr92%;KO~vhpP?wfS!X7moM@GJqI5yU&H}D2Oq9ipPLWx;j-KD0X|%I8wdDs+3kD< zK3sM?KEQ|TbuHq6o`VmU@AfP3;j-It4nACVn-B2ezTm^vhB%<-;KSvMIH2d?!{v*7 zK+nO4>lOIw2l#N=?f3v6E<3~lJ%2#Y!H4U5$OrWNf%+VLxL)rg4%Ful=sEasT@U>V zdJaBZz8D|SbMWE5;KS91aSlBPA1+_S0X+vFE?>j}JqI7IZ4}4{^c;M+d@)}^&%uYw z7ySx)4nADlJTT6o=itNTi}3+H2Oln9jC1HY_;B9`*4x2{%MSU#dOP@V`63_CbMWEv zMLwYC;KQ|@2Kj)VKcMH}!*xBx0X=`9J_jGJ>+SdeAFeGx8wdDs+3h$7A1=F%1AMsb zwqJn{mmT6jeGWd{7ks$d5C`-ee7Jmfz5*XEyX{xt!?mqybr5{G>~?%SQJ;ekmoM^x z`W$??d=UrgbMWEX9)^AeJqI5y-<_|(hszH6zo!{xi<1AMsbHXq=_Ww*~I;KOCN{R(`zwj8exf)AG+;y`^4 zK3u-Y2kLY1;qpZssL%hP=itMA!H262{R;It_;C3mAE?j4hie-*`W4pO!H3Hi`GB5- z50@|U0X+vFE??vWdJaBZThuYmq33_lbMWE19^!zWgAbQ4;((rm5BCKht~TTYdJaBZ zzK8>Q4nADIhy!{KK3qoukPqlN_;C4RzJi{E50@|IUFbRZa2-{^d<8xKgPwyA*Yyww z^c;M+d=Urq9DKMh_;9r$AJB8~;qpZs&~xzN@K;KOx2!~s1AA1>d`2l#LuH{Ed#K3sO&ufT`P zZpX(PdJaBZzQ_mk9DKO%8+r~tTy}^9dj5u z9DKNZ(XUXSgAbQ4`W5PP@Zmb1jPU_I2Oln9^egB&_;C56UqR2ohx@)!pMwvV9rA(t z9DKNZkq^}8;KSvMe4suDAFgBI$OrWNjrtsXxUPpdP@jVjmoMUgo`Vn9(RIWDJ%6J< ze?!l~hwB~~=g@QT;qt{ehn|BE_kBap!H3HZ;{$sBhMt2D*Y%JO=sEasAp$lZAFQ{7 z50~%80X|%In-B2evfDVohYMk_ItV^oc00~L&~xzN^4;p@`3t1C@OrB z54=AIA1Jd7CfyH$%_cC`W5uNm&fo$ zzk;6k(r|sD=e^8=9r6J^2OlnE7y1?IbMWEvMZbccx5&7^8G7C#8SIb`=sEasp~sL9 z=sEas`63_C^NN@K&Cql3;liMyUqR1%n8H2Kub}4%=K4aZOF&y`LRPjranJ*$j9jUu|qya&yOAQF?yce z==o_wK1R=v9r7`He(aEsS#Ljf$j9h;cBAK~4fz;7KX%B+==rfjK1R=v9r7{j?Z*!J z7(LH!^!&6TAEW2T4*3{8KX%B+)aSk_*Q|8}c!Fe(aEs(eq=6e2ktS zJLF^Z{MaEMqvzR8eSX@Ik9mK7?2wPq^J9m6jGiAm z$H(&FjveBFo-ZHn_#z+B^X0?k3qAjVo-ZHn_@ZAy&zBE(e31|6`SRiNg`WRF&zBE( ze31|6`SRh8FUAM-eED$47ySx){sTQp8r74mk)P*5eM{q`EbVBEgvrB zMt#0~xMR0*EFbRJZNFMR+_BqyEFbRJAr9#I^5OD@o-ZHn*loXBKHRa}d@LXC*zNdO zK3sOF&zBE(?Do0j7ka*YxZ{g_K+l&CcYF~C^nCen`9jZ^4|nX)ub}74hdaK=2lRaT zaK{(@3VObLxO`EcFCXsMpJ`SRh8FUAM-eED$sV!eI& zaK{e)3hV95hdaLLS6FXfK3u-g^X0=GJM=5m=gWsXzUWt|&zBE(e9^B^pD!OSU#z!3 zpy$hnJHE&V^nCen#~1m4o-ZFRU#zz;AMV&8A6Rc+KHTv|KCs@te7NI_d_d2a50@|W z{DJlM<-;9c~_9dKHRa}d@LXC*loXBKHRa} z`RWNhUp`#E(DUWP9lOoP^5Kr%&b!NpJ9e9o<-=tMJzqZDvD@*ne7IwWIH2cG)aT2G zJJ&-TsLz)VmoMt`C-i*zaK{&MK+l&CcYM*Wpy$hn%NO;f^oHIqLH#^nCen=X!_(dcJ(Pe4*!0==t*DjxXYX zo;f^ojfSxZO?)V}O==t*DdfN>>Uq0NiTRmSs z+_Bp@mJfIAwqGqD?%3`4SUy~K*bldSxMPPnpy$hnJH9*bE+6jLZ9bL{mmTzc`EbW> z$H(&Fj@^#)<-;92#DV&J`EbV<`9OWXe7Jm}=gWsXc8CLdzI?dji+%+?Up`#E(DOgk z=gWsXzUWub^X0=GU*rRNzI?dji+n)Omk*aO^!yKczI?dji*XJ;|AU?{AMRWaaX`

        IaK{dDpgvzd-0?*|P@gX!E??;R^5Kph;=p?Q3wpkM zxN|+^1A4xExZ{g{1wCIrT)wE!mk)RBkPo~+Uq0ONMLzKUeED$sLeG~EckGZ4==t*D zjxWYJ^nCen#~0%RdcJ(Pe6hd%1wCIr-0?*|py$hnJHE&V^!$Hp-Ak6^NDM>KH96Di z&;B=7kJG~Kp$?%eG$RC4mY$anmlk>c!u|H;!<`n_UCie%}kutJ`(8 ze7Ne6=gWt?y4@ekhr2rXK%Orj?zHF!@_hMlX_4p4hr2rXK%Orj?zC7}$n)jHofiE- zp1+aj%ZKZH$n!Vm^X0>x7CtbaFCXr-@PYY!`EY6RJlq?3zI?dTVqGE6mk)PZtSjXC z^5N2AK3_iE)nQ%Xe*5y_PK$ove*5y_PK$ove*5y_(jw2_n9r9FcUtrVdH%+HzI?bl zAADdwUp`z~%;#_9`SRgT3m?ey<-?s8>k4_ke7Ll@-@bgftHZiNo-ZHnv{+Zj^X0>x z7X3h;FCVTq#E|F9hr7DX^X0=`-TGKQ+|_MAmJfGzo9D}is}A?umk)P!@PRyEKHO zmk)PZ^aJzx^5IU4eqcUdK3rPl`3Lj)^5IU4{J?y^e7Mu%dWHFX`EY45pD!Qo>d+6& z=gWsXE&74^{DVASK3s2dx7CtbaFCQ)~=JVylUEN-mjt$?ZW8#CRQ;bZf>I{4T;uMR$zCsQ4KY@SyKADidBR0tnCpH~MTJD*nvADidZ z!N=x#b?~wCc`sPN$Ij=~!N=x#b?~uyULAbwd|n-VY@YXEDST|6R|g-P=heZ-&ga#^ z$L4u;@UeN`!!z))^LcgfvGaL#@UeMb9eiw_R|g+EpZBF9eC+q<)xpQ+d3Eryd0riS z?0jAwd~BX~0~J0t&#Qxv&GYKuWAC?D2Opc~)xpQ+c>^YV?EUuY;A7|W>fmGZygK;U zJg*Kuc0MmK;bZ6X>fmGZygK;UJg*Kuc0R8TK9J{y{xE&72x z2Olmi`hh$LAFluPSXan%@Zr*8T_MlGhf9lfg**ozuBCx>g**ozE-ls-@*I4)v{+Zj zbMWCp8)97{&%uXFi*{x6ejiu@*I4)wAdfWbMWEPVt*jd!H4To zjQxQ;2Olmi_6PDDe7LmOAINj?;nME@03WVM*?xczSKaymAFjGxSKz}{xBUPgt~&U@ zd=5Tb=+xaG;KNn7>k53h>b4)?!&SHY1AMq*de;^BaMi&F@*I4)wCD%&9DKO6@PRxB zAFhuZSXan%@Zr*;AINj?;nHGVAvON;%1JpVzSgAdpF-~)LMK3pH+ z-~)LMK3rP(K%RpSmlpd2c@92YTI_S=IrwmWJjMP%o`VmU7W)Hv4nAC3><{EQ_;BHs zu|JUKKge_N;W{6DAkV>vOA8;!bMWE%$PXXLbMWEPVxJ?=!G}wW{ee6OAFh!E`vZ9n zK3rPt59B%caA~nWkmumTrQQ7jK3wSS?Faa9)vXWk;i}tp1wLGL+Yj*Js)G;YIrwmm zh`Z0hhpTSa75H$~Z9l+=t8VuP_;8J@yRN{8s}4Sp=itMoML&?|;KQYb59B%caADc8 zu8`-yn9sq7>wNHm`5b(>wD5uX9DKNL6~G7PbMWEPVqGE6!G}wW{ee6OAFf*&SXan% z@Zr*8pCiwIalajWxXuS3xZe&wTzG!?!2Ndc;nKnf?ze*vmlpdR_uIjTON;9j=5z4j zy0wITjywk+E-m&4@*I4)wAdfWbMWE1^@aU`JpaZ0cJSdkAAI0`JNR&E;RE;E!H4VT z9N+`@+rfuRi+zs!?cl?u#s0wk_Fv>V_;B4~Tp!@WRk!;Ce7NeiAK=4Pw?4p!t8VuP z_;B48g%9L8_;6{rAK=4PxBDD?xaxLYfe+WudhGQIe7Nd%pMwuq9eg0q!G}wWejv}E z$aC=Fy8VoPAkV>vOA8;!bMWEP!Uyske7J6pqaVm~@Zr*8e<07nhf9lfg**ozE-m&4 z@*I4)ei{br3V9AbTw3gN%;(_4rN#cheEvk9gAdo&74U&P2Olmid?3%khf50|$nz)i z9DKOGVu26jIrwmC;RAUNK3rP(K%RpS*G~jtpCiwo$aC=FIv;!>&%uXF3m?dH@ZtK} z3Om+YaMkTT2Oq9F_&}b650@7GK%RpS z*H^CafjkEvE-ls-^862Z4nADxgAe36_;CG<7}HufVackmumTrNur+o`VmU7W)Hv{)apVAFi+M;RAUNK3rP(K%RpSmli&d=itLV zz=!J?d?3%khf50|$aC=F(!vMw9DKMQg}`+ec@92YT3oM?=itMo#Xd)#{~^!8hwJeT z_&}b650@4`kmumTrG*dVIrwl7@ZmbPKEQ{oZm(D1!&SHI3VgWg)(7}-)$R4_h5PN` z!}aLQ?ho+cs@r~m4_Dn@cfp6NZubZHa6QJe`2jv$b?|}v?cl?uML%%A9elX7@PYXp ze7JtD66*@{`3rdtK3wO658Q8mAwH*O$aC=FdaMflK%RpSmli&d=itMoML&?| z;KTLU7y5xbe<9DohwFUsfjkEvE-ic@&%uX#fDhL(^aFVgK3rP(K%RpSmli&d=itNj zcpdtIJO>{xEv{F{bMWEP;<}4G2OqA-|8TuRo`VmU7WsiZ2OlmiuDi%{@Zr*8pX2*; z@ZtLDTdXU5fBr(AgAdpF-~)LMK3v-M0X|%hUhcXAAFjIX2l#N+?fw8CuDV@U;KNl1 zAINj?;d+F0`vE>&b-O>nhpTS;0X|%HyU)Rg>v7iIAK=4P2Or3D@Zr*;AINj?;nKnf z@*I4)ezqCw3VHrUo`Vn9`QQV24nAC3_&}b657(o_@PRxBA1*D{74rOzJO>}H^T7x5 z9DKMQe})g_IrwmC;RAUNK3rPtbL2Vra1Zd|ItCxe^EdJwe7Mesb%i_!A1*EWfjkEv zuE)&b19=WUTw3%4c@92YTJ!^X{>FR`K3tE+!w2Sb@Zr+J2j+9|;nKnf=5z4j9^k`u z3_g(OZ{#`naGek93V9AbTw1IvedJNaMf);z=x}D^BjD* zUYmdqtuG5A29gAbP$K9J|&!=*((kmn!dIrwnB zo&q1pbMWEP!Uyske7LmmfjkEvuGeSw^A-4T)$Qji@ZqY159B%caB1NKc@93@1AMrS zp&!U|@Zr+J2l5}H*Obr?q;6^Kc*JIrwm$4?d9R;KTK56?`Di z!G}u=AINj?;nL!Ig**ozE-kLRn9sq7dw>tuG5A29gAbP$K9J|&!=;4}%;(_4^{N~8 zIr992`5b(>&Iccu&%uXFyFS2&>s7qn=itLtxBUPguDZ>0@ZqZ4{Q*8)b?|}t9DKM3 z_;4MA59B%caA~(6;KNn7c@92YuQ%>K2OqAwU02}4Rkzn&@ZqY159Ik5c@92YuVlgp z@*I4)wCD%&9DKO6@PRxBA1*D{74jT>xCi)f9fJ?#IrwmC;RAUNK3rP(!1w3i!}W?R z))nrzgAbP$`yBV%!G}wW{ek=K;KTI_FRoXZ&%elX@ZmZid|*BYA1*C?U_J*Q?g2hr z$IuVt`4@Q(K3wO+x)zrJ~q#*gOAPg>fmGN^XlMZ^SnCv*gOxX03Un5y*l{VJg*Kuc0R8TJ~q#*gOAPg z5D@UO^Lcgfv3Xt{d~BXq2Om41R|g-P=V2@0WAnT^_}DzJ4n8)|tAmf7&#Qxv&GS$j z@UioGb?~uyULAbw{r2kMWAnT^_}DxT4+0;1zr8y6*gUTeJ~q#*gO8ohtAmft^N=R+ zv3Xt{d~BXq2Opc~)xpQk=heXn@*I4)AMoKiwmyPp{?Bf!ZhZuEMBVxbGKjkM5&UlJ zkmumTg_wa4k4@eK3teFtSjU>_;BIKwjT|X^Y3dg!?E?zz<|2#M;~NSw?6uS zg}UuWA0)O8^Evo%;n&~;^Evo%Y2gF&IrwmC;RAUNK3sS>^aJxb_;5+l56tJ_!=*(( zkmumT{eTbGG5A29gAbP$K9J|&!=;4}(x`7iFbgAdpF-~;#D!G{a~3?ImI z@Zr+J2l5`vE>&b-T~OhYJn9>k53h>h^jCK3sLX&%uYQ4n8oSgAdneihkgJ z`xAK%K3wNRKal6(!=;4}{xE&72x2Olmi_6PDDe7Lk&SIBel;X=t{ zpCiw~hf9lfg**ozE-m&s=5z4jx|Mq+mo`VmU7S}7}`4iutgAdoOx%B})Ty=ZB0w1or?Faa9)vXWk;i}u~75H#J;KOxn z*A@71)onk(hpTR{yWqoBx9bXgxNdiDet-{G9eg0q!G}wWeqcTaA1*C?U_J*QuG_X) zSIBel;nJcX$aC=F(qdg9&%uZL0Uxeo@PYXpe7Lmmf%zPKxU}$r`5b(>ZiQoAVLk^R zE-m&s=5z4j(qeyLJ_jEzE%rI)bMWE1&5!+oJO>{xE%pcU9DKO6*dNGq@Zo;IhwB)8 zAkV>vOA8;!bMWEP!Uyske7L?k!Tvy=gAbP$`vZ9nK3rPt59B%caDBCd{ee9HL!N^V z*ZJTBc@92YTKGVogAexuK3vDPAK=4PxBDD?xaxLYfe%;R`T!rUy4~mC!}YZqd?3%k zhfBNt03WWpyvOA8;!bMWE%`V##> zo`VmU7X3h;zi_`De7MdBAGqKC!h8-sTtCx=eqcTaA1*EWf%zPKxU}$r`5b(>z9vRL zFrR}DmlplNeEve7gAdpF-~)LMK3rdI!w2&Gg**ozuJfTE$aC=F(!vMw9DKNbt_?nr z=itMoML&?|;KQZGbr*RKK3tCr;Ch8T2Olmi@&kDeK3rN{cai7d!=*)jAkV>v>rn{o zb36|RK3rO?D?H!+LY{*U*ZI~5_;CG{->xh0;i}tyfDc#Q`T!rUx?NY`!&L_#xZe&w zT#uY=Kfs5pZubZHaMkU)0w1or-RI!L_4v!~5AfltgAe36_;6{_59B%caB1NKc@92Y zKl6xng**ozE-m_jJbxq4!H4U7@PRxBAFfA_-~)LMK3rP(K%RpSmlpd2dHzP8gAdo^ zQt*L12Olmid?3%khf50|$aC=Fe!z$87}H$I{>f zc@92YTKGVogAbP${Xm|B57%RJxLzU8-AMoKihJGN= z!G}u=AIS4J@*I4)&WCk{JO>}HM;6xy_;A&2o`Vlp-R1}QaMf);z=x}D^BjD*9vON;9+@*I4)AMoKi1|P_C@Zr+J2l59*xKK3iCPm zaA}c)$ny{8bMWCh-}(R_u1EKGpMwuq-Sz`~xa!si_;A(jJ_jGJI{3hR4nAD3AZ$Ot zhpTR{SKz}{x9bXgxau~~!H4?+AFgBQ2l5{xE&72x2Oq9iIQDw=#e5Dv zTw1Ivv>op+s19=WUTv}YOkmumTrNutSd=5TbuPI@lV?O^P z&%uZ5eDHxh|02)9hwFUk2l5{xE!GwC9DKO6@PRxBAFfx#u&$8j z;KQXwKal6(!==T#+C1-dwYlzgY}QrB#z)7dA03fmGZygK;UJg*Ku_I`V> zGQ!8^d3Eryd0riS?0jAwd~BXq2Opc~y?zNFJD*nvADidZ!N<<$)xpQ+d3ErydEP6d z@UioGb?~uyULAbwd|n-VY@SyKADidB<_aG>pH~MTo9ETR$L4u;@UioGb?~uy-mAIr zv3Xt{d~BXq2Opc~)xpQ+d3ErydEV>9@Ui#XtAmft^XlMZ@3&V6ADidZ!N=x#uRz1c z-fyoCJ~q#*gOAPg>fmGN^XlLOc@92YuX1mmgAZ5T<~jIq)oq?XkmumTrClH3!~H&x z=itLtxBYk^&%uXF3m?dH@Zr+J2l5 zK%RpS*Q@{N2lD)ZJbxh1!H4T_?B~P>@*I4)Fa*2L!H263K9J|&!==T#LY{*Umlo>^ zc@92YI0dXL=W3V9AbT=jz=x}DeSi;F-Sz`~xG*fcuE2+@4n8oSgAbQ>*Hy5@{r`eI2Olm>4EljQ2Olmi zd?3#QZ|%Pic@92Ye`EJ~K%+e$@;rbJ>aebm=itMI&w&rj=itMog%8Z<0TA}zjQPBm z^-+g@U_S5VYiO~qFrW8=Ewtzd=JQ^nTrKh(e7KNAd%fxfGn@}TkmumT^*7)HdEUz- z`*)G&;KPMcf)C_5_;6{l&ynZg!~OP9@BW*S=RJUmI;<}vU^*69TFrR}DmlpdR z^LaO~=ik@OVH{f@-LypA_M@9=sM~ebO&-*(k8VC}9p>|fV${J0^1Q(ZTKGVogAW%P z4L&fR_hDuKF7h0FxKL~82l5v{+Y|&%uXFi*<$h9DKO`_hEk^&%uXFi~WH-2Olmi_Brmi zgAZ4Gu|JUK;KQZGx^c@92YTC6MN zIrwmGEvzf#IrwmCv96Hk;KQZGxvOA8;!bMWEP!Uyske7JCy zyFb8(t8Uj7_;A&&5Aflt+x-DPTy?vyz=!J+3m?dH@Zr+#J_jGJy4@e(!&SHa03WWp z-RI!L6&1U#z=x|2K9J|&!=*((kmpa#=itMIIz>M)pMwvV7Cw;YPt51w!*xFN1M@lf zaK$ftU_J*QE-iduJ_jEzE&74^9DKO6SXY?O!H4Uk1@<}aw}TIt7W)JD+rfuRi+zsy z9DKOYxY!?<&%uXFi|ZBU^C$8ge7MdBAINj?;rh4+AINj?;nKnf^8ATB2OqBU!3Xjj ze7HVh!UyvFiTNCSxXy=lh5PN`!=;4}xNciuT_Ml^FrR}D*ZJTBc@92YTKGVo zgAW&qA3l)h;KQZG{y?6C50@7E19=WUT(^R-Kal6(!==UkK%W00&%uZ5eDHxh2OqB6 zSL*|OxaxL)fDc#Q_5*yl>UN)l4_Do;EAZid!H4VEuB#WGhXWrjEqox)!G}w`{Qw`X zy1ib357(_j_`vgU;KQYb4}5?ALY{*U*ZI&70X|%H@PYXpe7LmR5Aflt+jRv# zTy>l0;KTJ5+U^hV;i}tp1wLGL@PRxBA1*EWfjkEv?iYNxj-elz&%uXF3m=%z!G}u= zAINj?;rgl){Xm|B50@7E19=WUTw1IvlO0+jXVb*uJgeM@*I4)U-02NhJN6FJNR&E(GTP~_;6|A19|>No`Vn9 zBM$2We7NeiAK=4Px7S_p;i_97;KNn7IS4*nk7d9I@*I4)wA&Bx;i}uuCE&wVxA_4+ z+%NcW9fJ?d=itMog%9L8_;6{_59B%ca6Rg>`y70@>Nd~8hpP@gkmumTrG*dVIrwlr zo&z7qbMWEPVt*jd!G}wWb%i|tAkV>v`vo7aV^~+nbMWEPq94d}@Zr*;AINj?;d%@T z{Xm|B50@7GK%RpSmlpj%o`VmU7S}605BEWygAdnZU+{rE2Olmid?3%khf50|$aC=F z`q@(KbL9C4c@92Y=YtRAIrwmC;REwI_;5W+2OpTv!G}wW9K?JMK3rPl2l5hpTRVfDc#Q?sM?rs@r~iF`t7E*CUJD5Aflt+v^qhaMkU)0w1or?Faa9 zzu?1l4E;c!gAbP$K9J|&!=*((kmumT^~mR5cfp6N4*kG<{zaaH57+t759B%caA~ow zkmumT^*AehAkV>vON;%1JpUrk!H4U7@PYXpe7Ilm;W~zWjywk+E-m_jJO>{xEqox) z!H4UyVe|ue4nAC3^aFVgK3rPtbL2Vra6Q(HeUAAYe7LmO=a|pG$aC=FIv;!>&%elX z@Zo;JhwB*D74jT>xU^VT$aC=F(qdg9&%uZ5k#ejnvFS(0W?gk`d~|I3(Xq*oj*X9wO+R`hA3kfmGVw^s)ro9ETR$L4u;@Ui#Xd-VZ6_WSed;A8W=I{4W6ygK;U zJg*KuHqU!q13q>>uMR#o&#Qxv&GYKuWAnT^_}Dz}6%+W_`Mf&#*gUTeK6XB@4n8)| ztAmft^InUAkDbq}gOAPg>fmGZygK;U`Mf&#*gWr59{AWiuMR$TKCccwHqWbrkDbq} zgOAPgUO$45z29CPd~BXq2OoRCy*l{VJg*KuHqU!y3O@FJdv)-!d0riSY@SyKAA7&O zI`}}IgAdoMUz_LP!&SF=4nACUo9E!eRkwK#K3sL1=itLV!H4VE_5*yl>b4)?!&SHa z03WWp?Z*Ro4nAD3*r6ZDbMWEP!Uyske7Lme2l5xLyy%xhpTRVfDc#Q?ho+cs@r~m57%qk@PRxBA1>`)ufT_^Zr2s~ zaMf);z=!L#^4;e@$aC=F(xM;8bMWEP!Uyske7Lme2l5~gi3&-<}P)M0-h&-+0>Xt6(#=lz%(v{+Zj^L|8YwaD{+$O(1m2lBih z@PQWnK%Vy_Eu#e=E)>Z6=!ZCtv3u}dbAkV>v3xBoyqc3~s-`5wXIJQ3eLJxJ@kG^O^-TLSY5Y%lyx(UB^n9sq7 zdv@~`TKGVogAdpF-~)LMK3teF_&}aF6z{(o^LfJ>>d+6&=M4wYq92&g!G{Z%hINHJ z2Olmid?3%ec<#R$-=BApKpoZ<^1KGG7Wdo1hkN!PwCD%&{E0jVAFe+EAINj?;X>76 zU12^4A1*C?U_J*QE-m_j`5b(>P{xEqox)pU89Y;aZaLf%zPKxU}$rJb&VTJNR&&596z$JPht8ViHe7Nd%U4akR<#h8Le7NfNx(hyBb?|}t9DKO6=m+L=@Zp|+n9sq7s}4Re zpMwvV7V8Rm4nAC3^aJ{xEqox)!H4VP?(TE&;i}tp1wLGL>jQka>UMvC4_Do;EAZj^hz=jfbMWEP?mh<} zuDabH;KNn7{Qw`Xy4~mC!#%-=>lpfh`5b(>wD5uX9DKO6=m+L=@ZlPdc7ME(=itMo z#kxYCgAbP${Xm|B57+pHb%i_!A1*D{74jT>xU|?G$aC=F(qdg9&%uX#zA&GI4_6)f zf%zPKxU}d8=5z4j8k5lv%;zu6=itM2KKQ_V4nAC3_`rPrLY{*U*SL@Ufjoa9&%uZ5 zeAws6bMWEPVxJ?=!G{ZB4L@Zr*;AINj?;nJcX$aC=Fx`l#ug**ozE-m&s@*I4) zwAkm!bMWEP?mh<}u3JId5AfltTOZ)VRk!O3e7NeiAK=4P2Or3D@Zq|pwK@1ko`VmU z7CtbagAbQ>_XqfJPw?S7hJGN=!G}w``vZKq>ULd$4_6(0AkV>v>oy^LAkW{J&%uZ5 zeCP+}bMWEP!UyJa@Zq|(2_Klx!G}wWeqcTaA1*ES2j+9|;hx~bbqqd`=itMog%9L8 z_;6|A19=WUT(^t&x(hyBb=c>a&%uXFi*<$h9DKO6SXan%@Zq}cjea1{!G}wWejv}m zhf9loAkV>v>t|cg59B%caA}br$aC=F(&BoBJbxq4!H4Us1o%LnzcHVK57+t756tJ_ z!=*((FrR}D*ViBG1AMsZc7K2mSKaymAFjIX2l#N+?fw8CuCHw11M~R@c@92Y=YtRA zIrwmCw;$lcRkxo@z=wN+57#mD1M@lfaB25?1wLGL@PRxBAFi*)&=2G}_;6`=pMwuq z9eg0q!G}wWb%i_!AFi+X_PPr`Ty^k)JO>{xE%pcU9DKO6SXY?O!H4Uotgx<{EQ_;7vIi~WH-2Olmi))n#` ze7Lk&SIBel;nHGVAuYSRE95!&aA~owkmn!dIrwm$4?d9R;KMz^hwB*nfjkEv zE-m_jJO>{x?fL*8u15oQe}E5H-TD9@uDb09_;A(j{s14YI`}}IgAdmu4!f?vhpTS) zIrwnZZ9l+=t8TAX;KMz^hwB*nfjkEvE-ic@&%uXFi+&)_!H4S+k-c7l4_6)ffjkEv zE-ls-^8AbY?cl?8KCCO;ZwDW)$6w$Bc@92YTKGVogAbP$>k4`PMV^BX_XHoVW7y}I z&%uXFi~WK59DKO6=m+L=@ZoyQ2>rl(4nAC3^aJxb_;6{_56tJ_!}S;x_BrNr@Zr*8 zpJP4;A1*ESIp*^(@*I4)C-`t3LqCw`U(Dy=!*xEaE95!&aA~owkmumT^#~e#AkV>v zON(`dJO>{xE!NfMd5^=*b+==)t~xe8IyU>fW3#S0HafmGZygK;U`Mf&#*gWr%RQTBY z?bX4@=6QASvGaL#@UeMb9eiw__ZTgF?0jAwd~BXq2Opc~)xpQk=heZ-=6R3)!pG)$ zb?~wCd3Eryd0riSY@SyKADibrt_&Z0zr8y6*gUTeK6XB@4n8)|tAmft^B%E=kGYXJO>}Hy3KR&;i}s_2OqAw&2#YKs@psVAFjvS z;RAUNK3v-E2l#N+Z9l+=t8V)NK3qS~zUvBnxaxLYfe%+5d?3%khf9loAkV>v>y-ic zK%RpSmlo>^c@92YTJ!^X4nAC3tSjU>_;9@rfqo#*!G}wW{ee6OA1*D{74jT>xL()5 z{y?6C50@6}3V9AbTw1Iv_;A&2Kfs6UH81!; zo`VmUcCT09!&SHY1AMsZwjbcb^%~mlbMWD++jRv#Ty^k)JO>{xE&72x2Oq9i=imc* z4nAC3tSjU>_;6{_59B%caA~owkmumT^;#hMfjs}gd=5Tb=YtQ-=itMog%8Z<;KTia z57#mD19=WUTw3@*o`VmU7Cw;Y;KTL$CHjFp2Olmiu2;x&@Zr*8pJP4;AFkI!alOKP z{)0RRAFlJk2l5}{?+5ca_;A%>U12^4A1*D{74jT>xU^VT$aC=FdNmj8 z3VHs6`TPfY4nACe1J_;TIrwnBCcM{O@ZqXkAHT?R@Zr+#x&j}ry7d7*Ty@)zU)*m8 zAFfxR;RE;E!G}u=AINj?;nME@_{IHp@Zowzd-wS-@*I4)w43L@$aC=F(xM;8bMWE* zz=!J?eBgfjFY+9GxXy=uAkTl1=fAk$4nAD3y<>miemnSZY4>{di#!J(F6~~gev#+k z!==UkK%RpS*DL+lAINj?;nJcX$aC=F(qexg&%uZL`^9_?K3sL^2j+9|;nJcXn9sq7 zON)MBJ_jEzbOQQ;JpaXf-Ve?H&o1hG@PYZf9}|ZbJ}{qy4;StMK9J|&!=;4}~$A>xa!si_;A&& z5Aflt+kSu#R~>vH&-)RS`F{XDTzC-pzll0>&x4Zh zzYlpH7#nr)fjoaA&!71I9DKO&D)50k2Olo&el7_dx;~KSPvklHaQzLeE95!&aA9J0 zpMwuq9em(^d+@RKhCBx!uD<~v$nzja`!|s1!FNyxAIS4yD$rt|BhLeCtQPZmAP3Z; zAIS4w)`u4B3V9AbTo@qibL4q1-R|GTeBKM9s6#)H=e-yRE&72x?}adE(GTQ#FYc@s zdEQGVs6#)H=itNr^#DH32Or4u96#AkV>v`vV`YWAK6J;lPJW3m>@O z-p%^;fjsYqG3w9{Q90+;0aTu0!Yt?ze*vmlpj% zo`Vn9pG7~A=YPm^@ZmZid|*BYA1*C?AkV>v`vV`YW9SF+9DKO6@PRxBA1*C?AkV>v ztG(z4@*I4)wAde*&%uXFi~WH-2OqBGhy8&(2OlmiuDi%{@Zr+px{EvqAMOu)xQ?w4 z@ZqZ4bp<|Lb=wc{;i_97;KNn7>k53hwmE#@emnSZX}2HX!&SHY1AMsZc3puF*JWsP z5PZ1mc7ME(=itMoML+O-JNR&E;REwI_;BGi(GSe$;KQXwKQNzz50@6}3isQ=hwE~W ze&BvP_;6{lKQNzz50@6}3iCPmaA~nWFrR}DSCnC0A{xE!GwC9DKN< z7V8Rm4nAC3tSfwf4nAC3tSijt;KTia57#mHz}vUrNur+o`VmU7W*7|4nADk-RI!L{echH zvEAq3!&SHa03WWp^#MLyb-S*>hwG#5_5*yl>fi(OIrwmC_j>h4o`VmU7CtbagAdn7 z^xYqCn`|k)nQ#>J_jEzE!Gw0bMWE9sAF9r&%uXFi+&)_!G}wWejv}mhii;SKal6( z!=*((kmumTrA2-q&%uXFi|ZBg{Ea*ZAFkUL@PRykV?GBTuJfTEn9sq73#Y&R03WWp zz3ze!SKY2F@ZqZ4et-{G-R=+Y;kv~GADGX<`T6;KQZGKF53xK3qS| zf&GE`9DKO6xLzU8!G}wWeU3Z_AFf-&*dNGq@Zr*8e<07nhf9lfg**ozE-ls-@*I4) zZhK>0A{xE!GwC{DV9PAFiKrfe+;Q2YC)YT<1eSkmumTrQLpj57$=- zyFb8(t8Uj7_;A&2Kfs5pZubZHaMi&F@*I4)z7pAffDc#Q?sM?rs@r~m4_Do;EAZj| zz=!J?`hocze7Lmmf%zPKxU}d8@*I4)zEaxj75H$~p&!U|@Zr*8T_MlGhf9loAkV+Z zbMWE%x(q&$=itMog%9L8_;6|A19=WU+#mRG9fJ?#`4{s!_;8&M`vdbi_;6{l&oQ5a z57*a{@PYXpe7Lme2j+9|;nJcXn9sq7>uXc&bIj-9!==SO$9xVxTw3gN%;(_4{echH zG5A29f05_l!*xFN19|?%d=5Tb=fk=}o`Vn9SJqfp$aC=F(!vMw9DKO6SXZ0peSJRH z-HuH^IyOE!HhJE$Syvq!A03;0-mzI%9UC7Vn|}0_KYZ+bULAbwd|n-V?0jAweC&K) z9enJ3-eU^zv3Xt{eC&K)9eiw_R|g-P=heZ--f!>G3i#OhygK;UJg*KuHqWbrkDbq} zgOAPg9tVMsz29CPd~BXq2Opc~)xpQk=heZ-=6R2>z{lQiuMR#o&#QxvozJU-kInPy z;A8W=$8O+b=kw~|WAnT^_}DzJ4nB51uMR#o&wEq|J~q#*gO8ohtAmft^XlMZ^SnCv z*!jH2o8V*fygK;UJg*KuHqWbrkInPy;A8W=N3!5!@3&V6ADidZ!N=x#b?~wCd3ErC zJO>}HN6R+P!H27E^BjD*>Nd~8hpTS$9DKOyHqXI_>v1^vK%RpSmv;LBK3sL%5Aflt z+kSu#*U!1`x&j}rx?NY`!&L_#$aC=F(xM;8bMWDM#1KA^=itMo#kxYCgAbP${Xm|B z50@6}3V9AbT#rwpAINj?;nHG%AkV>vON(`dJO>}H$2+kULd$4_Dp#03WWp-RI!LRk!O3e7GJ9hY#dA_;6|WdIdgQb-O>nhpTS; z0X|%ht?%^;e7Nd%U4ai*9eg0q!G}wWejv}mhwD*$_&}b650@6}3V9AbTw3%4c@92Y zTC6MNIrwnBMu2`G&%uXFi~WH-|G|6?K3wO656tJ_!}aO|d|*ERL7syT*ZI&7lN}Ge7M&S@*I4)>d+75IrwmC(GTP~_;6{_59B%c zaJ_1@{Qw`Xy4@e(!&SFFz=x}D`vE>&b-O>nhwJqy_&}cj;(j~$aGei6kmumTrQLpj z5BCBeu4C|lJO>{x?d}io;i}u~75H$~!3XZQgAdnhXz+pi?cl?ug%8|s|3#jI57+tN z19=WUT(8c-2l5{xE%pcIbMWC_zsPg&;i}u~)i3fKe7LmOAINj?;nJcX z$aC=FdPNca!2Ndc;nJcXxZe&wTw3%4_uIjT>lMoVybC^Db?6839DKO6=m+xr7xOvz zaGej=UCig;!@alpF_c@92YT3oM?=fB8v@Zow@75%{dcJSfS!UyiRgAbP$K5)Ms ze7LmR5Afl7<#zW6_;A&&5Aflt+jRv#Ty?uYz=x|2KJfiH_;4@q;W`E%n9sq7OS}C5 zAFjH+UV#tSYs|Z@z=x}D_c{1*)$R2Pe7Nf11M@lfaB0yG%;(_4^@=upU_J*QE-ls- z@*I4)wCD%&{E7J-e7G0*a2>_;6{_ z59B%caB0yGs|?sM?rs)G;QZwDVPEqvg9JNR(nU(gTa zIrwmC(GTP~_;6{_59B%caIaue+YjV<;3L$bADGXvOA8;!bMWEPq94ffUP{{k zSGeEa%QC1#KXAVte7G0*a2>-wN1pev`21UX7#qiSfAo+r>efdOucB`I(Ld+75Irwm|zU0IC&=2H! zU+%0Hc@92Y$S(N6d=5TbTJ!^X-i<>1`_K>Mc{hVri#+cp1?tcb%;(_4g)KurFrR}D zmlplNeBKAj{Wl}e`!Iz%>~rLKVFoSwfjsXbwp!#l_;BIe&=1V#;KQZGx(Z=itMo#s0v24nADk-5=n?wbZsB;KNn7KEQ{oZubZHaMf);z=x|2 zK9J|&!?k60pTCjk;KQYb59B%caA|j+zmezQ!@all1sJ_jEzEqox)!G}u=AIS4J z@*I4)E=}-(JO>{xEqox)!G}u=AINj?;ktBUe<07nhfBNHt2gFz@Zr*8e_%cbAMOP{ zT*u%8c@92YTKGVogAbP$K9J|&!xcw+-F;&|2Olmiu2-1P!G}w`*In@8s>8ZMo`Vlp ztfC*tbMWEPq94d}@Zr*;AINj?;ljeAAINj?;nJcX$aC=F(xM;8bMWEPB0rGl;KTKi z2G=X(`5So-K3wO659Ik9^Evo%eZ1O!fDc#Q`T!rUx?NY`!&SFFz=x}D_XqfJeI$er z%;(_4rQLM}K3sL1AK=4PxBCNpxaxLYfe-frAFgBQ2lD)b`5b(>&WC>BemnSZY2gET z{=xlr@ZtK{j(*^NJNR&E;REwI_;6|A1M@lfaE%q{2ky6n50@6}3iJ5~c@92Y=YtQ- z=itM=z=!J?`hh$LA1*EWfjkEvE-ic@&%uXld_zBw=itMoML&?|;KQZG^$K|oK3wDF z<~jIq)uA8AbMWEPq94d}@Zr*;AINj?;a=dwbqqd`=itMog%9L8_;6|A19=WUT%$eK z74jT>xU^VT$ny{K9DKOWw?4p!>(;}rEAZi}+kSu#SKaymAFjI1LGajz=x}D_c{1*-Okz1CE&wVx9bXgxa#)v)fe+Q_;6{_56tJ_!*vS^ zK9J|&!=*((kmumTrA0rG=itMo#kxYCgAextAFgBYf%zPKxU}$rJO>{xEqox)!H4UX zAl4P~9DKO6*yqUeFY+9GxXuS3$aC=Fx{V1R$aC=F(!vMw9DKO6*yqS|@ZnzI!*vWk zkmumTrG*dVIrwmC;RAUNK3unkksr9<4nAC3T(5Ay{fj&YAFlJk2lD)jJO>}HTioae z@*I4)wCD%&9DKO6@UeN`?e@9uc5M35vGLKdxn6Z_`q8oR(XqK+b!_sZW8fmGZygK;UJg*Kuc0TW` z82H#cuMR#o&#Qxvz29CPd~BXq2Opc~eSHKUd%wLp_}DzJ4nB51uMR#o&#Qxv&GWwU zf{(r5ULAaFo>vDSo9ETR$L4u;@UeN`*L3i)_uH$3kInPy;A8W=I{4V<;i`j=&GWum zgpZxitAmft^XlMZ^SnCv*!jFV_}Dz}>rnXEJg*Kuc0R8TJ~q#*gO8ohtAmft^S;7` zkNy6xU^VT$aC=F`Z+_aE95!&aA~owkmumTrNz2Jo`VmU7V8Rm z4nACu;$U4N&mYKh@ZmZid?3%khf50|$aC=FdVB~zkmumTrN#b0o`VmU7W)Hv4nACu zH(`Gu&mYKh@ZmZid?3%khf50|$aC=FdL(OofDc#Q?ho+cs#_o6!&SHY9DKOyc3puF z*JEVxfjkEvF6~~gz=x}D_XqfJ)onk(hwCx7yvON(`dJO>{xE&72x2Olmi))n#`e7GJvL_d({;KQZG{y?6C50@6}3VHs6 z`5b(>9+iX-%;(_4rG*d7=Re4E@ZmZi`hh$LAFiMOg%9NU5Aqy*xXy=lg**ozE-ic@ z&%uZ5kyQ9Vo`VmU7X3h;gAbP$>k4@eK3tE?;<}4G2Olmiu2;x&@Zr+pdWAd(AFiK# z#`Ow$4nAC3T(2;ngAbP$>k9KZ_;6`=U4akRqsiM3@ZqXkAK=4Px9bXgxazha;KNl1 zAGqHRK3tDj@BRQEuDV@U;KNn7{Qw`Xy4@e(!}YlLt}F22s)G;QZwDVPE&74`?cl?u zg%8|s2OsVYK3vD(19=WUTw3@*o`VmU7Cw;Y;KTK(J@yCk9DKO6SXan%@Zr*8e<07n zhwD`UtSijt;KQZGKF53xK3rPt59B%caA~p6k>}vUy?>GC;KNmie&BvP_;6{_58Q7D zAFfv}&=1^i2Olmi`hocze7Lme2j+9|;nJcXn9sq7>va&%uXF z3m?eyU*tLXaBuM8I)-(H`5b(>v{+Y|&%uZ5b(~#S;KNn7{Qw`Xy7d7*Ty@(I@ZqZ4 z>n`|ky+Q;Zn9sq7OS}8yi981%E-ifE`*ZN&((bwfAMOo4T*uH4yza4zIwD5sE2Olmi`hh$L zA1*ES2l5}vUbw2n&o`VmU7Cw;Y;KRMahwB*nfjkEvE-ic@&!3pj z!H4S=Ppm8CIrwmC;RAUNK3rP(K%RpSmv;LBK3uP=?)3_Mxa!si_;A(jbr*cN>UN)l z4_6(0AkV>v>y_KxAAiVm@Zr+J2l5vH&%uXF3m=%z|B&b4 z!*xFN19=WUT(3662l5{xE&72x2Oq9iudzQcpMwvVc0cce4_DppbMWD+ zgAd$q2OsVYK3vDp59B%caB0yG%;(_4rG*d7=itNjiaYv&`TP%g{)apVAFjWFejv}m zhf9n7fjkEvu2=QZ59B%caB0yGNw2fjZCA1*C?;QMp%;nJcX`2M^fblCq_$aC=F-of}+ zi#!h!k2>@N_uIjT>+hl;$aC=FLZqM{n9lxU^VT$aC=F-n|69|7OhRy~K+;^aFVgK3snn{Xm|B50`fP(aT@+ z@9X6%99ti~^n<$XM=ztGZhiEU1nPEO_3-}IA{xd=q>i&%uXF3m?ey z9`@URGxEHL)li3i;CVRk;od#8gY%&u$nze|SS|9rhX_yyAINj?;lgC0AIS5*_`}~t zKal5r;j>!gd0#r94*kG<4nADCFZ2U>-i=56UGxKa4nEwwn=N}jbGT_MlGhf9lfg**ozE-ls-@*I4) zw7agrhpR=~5AfltTOZ)VRk!O3e7NeiAK=4P2Or4u5Aqy*xRxJ$;QMp%;nHqDz=x}D z_XqfJVG(y-fe%;R?(+}kbMWEPq94ff59V|5;W{7sfjkEvt}P88$ny{8bMWChANqkj z2Olmid?3%khwCx~ADGXvON(`d`|Tg(Irwm)HQ@t!{z0CD57+t756tJ_ z!=*((kmumTb-9NR}Hj{@+4JO>{xE!GwC9DKO6SXan% z@ZtKXvg-fZ#1Q_Uhnc^SnCv*gUTeK6XB@4n8)|yLAH}o9ETR$Ij=~!N=x#b?~uy zULAbweBSLQ_}DzJ4n8)|tAmf7&#Qxv&GYKuWAnUQWbm=ypH~MTo9ETR$L4u;@UioG zb?~uy-fcbj*!%6(!N=x#b?~uyULAbw{r2kMWAnUQk?^ted3Eryd0riSY@SyKA3L8{ z2Opc~-9Ckn&GYKuW9Reg;A8W=I{4T;uMR#o&%5OdADidZ!N=x#b?~uyULAbw{r2kM z19=WUTt98Hc@92Yb(`nl!&SF=4nACUo9E!eRkwK#K3uok;RAUNK3v-E2l#N+Z9l+= zt8V)NK3rc1?79LUuDV@U;KNl1AINj?;nJcX$aC=F`U(R+kmumTrNz2Jo`VmU7X3h; zgAbP$>k4@eK3qTFgMJ{-!G}wW{ee6OA1*D{74jT>xV}EZ{y?6C50@6}3V9AbTw1Iv zrhBAkV>vOA8;!bMWEPVt*jd!H4VXQ0x!nIrwmCu|JUK59B%caGei6 zkmumT^%d^=03WWp-5=n?Rk!^BAFjIH=itLtx9bXgxW0CV59B%caA~(6;KNn7`y70@ z>b4)?!}YcJUa!E1t8VuP_;A(12l5oE%K59Ij|=5z4jIv;#sJ_jEz zEqq`;|3RLE57*BHq94d}@Zr+J2lD&}c@92Y=fk=}o`Vn9BP{TNJO>{xEqox)!G}wW zejv}mhwBj=tSjU>_;6`)y+WRY50@6#E95!&a6JNq>lN}Ge7Ll@ULnuHhf9m=73OpB z;nME90w3-JK3vCkU4ai*-Sz`~xa!si_;A(jx&j}rN3FIW;KNl1AGqHRK3v+}AK=4P zx9bXgxa!akvH z&%uXF3m?dH@Zowi4?d9R;KQZG{y?6C50@6}3V9AbT#pW7e<07nhf9loU_J*QE-m&s z=5z4j(qexg&%uZ5u}JI>jQka>h^jCK3sLXuE2+@Zhe3c*CWS!y?SCk2Olo&?ho+cs@r~m z4_Dn@cfp6NZr2s~a6LM``2jv$b?|}t9DKO6=m+L=@Zr+J2j+9|;XdHQbqqc*pMwvV z7CtbagAbP$J}{qy57%Ss*dLhBpU89Y;W{6DAkV>vOA8;!^C$8ge7GLJM?a9~;KQYb z59Ik1^Evo%AMoKihW&v&2Olmiu2;x&@Zr*8pCiw~hwD`ZT(6Ml;KQXwKal6(!=*(( zkmumTrNz2Jo`Vn9YZ%xc$nz)WbMWChAABIs!G}u=AIS43=5z4jKH$T34C@Mc4nAC3 ztSjU>_;9_(vg-l0;KTLm4SXQa!G}w``vZKq>Nd~+ zaK9aVxU}$rJO>}HSBUm{1wLGL@PRxBA1*EWfjkEvF757*Kjb<1a3ApDItCxebMWEP z!Uyske7LmmfjkEvuGhD)Kal6(!==T#LY{*Umlo>^c@92Yua{w6;ePuc@*I4)&IcdJ zbMWEP!UyJa@ZowT4nC0Q;KQZG^$K|oK3v+p?t%|j9o7}{9DKMB_;4M={y?6C50@7E z19=WUTw3@*o`Vn9>xkGN$aC=F(qdg9&%uXFi*{x?d}io;i}ty zfDc#Q?sM?rs@whX!u@ve;d;Fm{Xm|-kmoPlZwDW)zX2b(-wr<92Yk4W?fw8Ct~&Gs zc@92YTC6MNIrwmC(GTP~_;9_(jD8@`UzpEd$aC=F`Wxs6@*I4)Ua7|ZK%RpSmlplN zeEve7zmVtP!}T|?&ynZg!+pSq>lpfh`|aSvrNutS{dVx-(!vMw9DKN5XUG1)_vbI< z`3rdtK3snT`vZ9nK3rPt59B%caJ`m~ejv}mhf9loAkV>vON)LW&%uZLypZSM!&Qg< zf%zPKxU}d8=5z4j(r!P%hYNME>*|d>2Olo&<~jIq)vXWk;i}tyfDadnVXs%d?3&Jabsxrx(hyBe*^tMp7&#``!|s1{op6+-~)LMKHR4tO~m=o56tKN z2;ORu=lx(C>fi%;4nAC{4fF$f-j6Kd@1h^b^L|KYwaD{+^aXY32l5}2lBih zYS_PvJO>{x1PS_qJO>{x?Ou0-m*d|8AIS4S)~m($=Yf+^2Or4uAiB`P2lD)l`5b(> z5H9e6`5b(>5BP8$!@5GAgAbP${Xm|B50@4`kmumTg{MJ3kmumTrA0rG=K*iFm&kMQ z;X>u$dWAd>z_EV=c^(7;b?|{a@8y4JalJyG_cHfrds!OC)<-Y#qHcZkaw+O|UG>r< z>efdu<82-CyqCmK2Or4uUIc;`K9J|&!-Y(O59E0d@9*D5p7-!M>d+6&=itMIZ$dwi z=itMoML&?|Jpj1>X5@JftDz44!1Hk6!+m;?2j@dSFrW7T$7+%1Jw$*y_`rM)K3teA z^aFVgK3rP#19{$;K>Ke-p7%ur>d+75c{iJ(ML&?|;KPLlLqCw`;KQYb59B%caB1NK zc@92YTJ!^X-Us~se}(xRe7Fzza2><-3VB{ok4@eK3rO?E95!&aA|j4fe)9pU02}4RkuFChpTS;0X|%H z+Yj*Js)G;YIrwlP{B~V|4_Dn@ufT_^Zu^^Evo%VH?p8_;6{lu8`;8!==T#!h8-sT$ewNHmJO>{x zEqox)!G{a;2_MMwFXnUb;W{6DAkV>vOA8;!bMWDc9{50>gAbP$`y6==K3rPtbL2Vr za782bIr99A`5b(>&Icd({``wP2OqBUp&y&)#rgQ?*z}`gv(Gy=*Q<_=kB-f{>eyVb zIyU|2*!bw!T(9~F0v|h{R|g+EpH~MTd%wLp_}K5ytAmf7&->T}A3L8{2Opc~)xpQ+ zd3Ery^Lcgfv3cG{J^0u>uMR$TKCccwHqWbrkInPy;A7|WKAytI=6QASv3Xt{eC+-9 z>fmGZygK;UJnthleC&K)9eiw_R|g-P=heZ-KHpv)d~BXK2EfPWd3Eryd0riSY@SyK zA3L8{2Opc~jV|!9d0riSY@SyKADidZ!N<<$)xpQ+dE*v*Y@SyKA3L8{2Opc~)xpQ+ zd3Ery-=8-k!pG)$b?~wCd3Eryd0riS?0jAwd?3%khYN+ic@92Yb(`nl!&SF=4nACU zo9E!eRkwK#K3wBDd?3%khfBNt03WWp?Faa9)onk(hwJvit}F22s@ru1K3sM1fjkEv zE-m_jJO>}HTORO%JO>{xE!GwC9DKO6=m+u~e7Lk&SIBel;kuoJejv}mhf9n7fjkEv zE-ls-@*I4)ZZ~0nAkV>vON(`dJO>{xE!GwC9DKNLhhbeI&%uXFi*xU^VT$nyvC9DKNLPr?WC9DKO6@PRxBA1*C? zAkV>v>-H)32l5}HuQ~U61wLGLyRN{8t8RUO4_Dn@ufT_^Zr2s~ zaD6okAINj?;nMDP7ks$tc7K2mSKamle7NfNy8DYf2OsVWK3vD(19=WUTw3%4c@92Y zTKK?x4nAC8m1A9DJ_jEzE&74^9DKO6SXY?O!H4Us{N3ljn9sq7ON;%1`5b(>v{+Y| z&%uZLf)Cd*_&}b650@4`kmumTrG*dVIrwlr9)W$1`5b(>wAde*&%uXFi~WK59DKO6 z*dNGq@Zoy&1N#Gc{)_wV;KOx3_`v;k@Zr+J2j+9|;lAL*bqxJLo`VmU7Cw;Y;KQYb z58Q7DAFfAi&=1^i2Olmiu2;C<4nAC3T(2;ngAdmuK)cVuhpTS;0X|%H>jQka>UN)l z4_Dpx1AMqI_;4NDet-{G-CnQ2hpTSa75H$~Z9l+=>#?f6UV#r+9eg0qpU89Y;W{6D zAkV>vON)LW&%uZ5kumr{o{xEqox) z!G}u=ADGX{xE&72x2Olmi`hh$LAFjtX(GTP~_;6{_59Ik1c@92Y z=YtRAIrwlrY6>67bMWEP!Uyske7Lk&SIBel;lAL*b!>fr4_DphAoy_A?YaUVuDbOB zK3tFLZVvuoJ_jEz?d}io;i}tyfDc#Qel7tYuDV@U;KTLE@qWGnAFew1K%RpSmlpj% zo`VmU7Cw;Y;KO~vhwB)8AkV>vOA8;!bMWEP!Uyske7GL>#{NK_gAbP$>k4@eK3rPt z59B%ca6OKWb%i_!A1*ESIp*^}{xE&72x z2OsVWK3vD(19=WUTw3@*o`VmU7Cw;Y;KTJw$nJCS;i}u~F8FZOtq<_ws@og{AFjGx zSK!0-8Vh`2J_jEz?Ow0IhpTS)2l#N+Z9l+=`+^VGG5ElI{z9IE57+t759B%caB1NK zc@92YuM5Ek=5z4j(xM-@-wr-pTC6MFZwDW)*O~TnBKUCC?LL1Y&%uXFi+&)_!G}wW zejv}mhwHU0^aFVgK3rP#19=WUTw3%4dHzD4gAexwAFgBQ2l5*%@ZtI! z@PRykBhSHy>$O>|E9Chb^Z6Tj4nACeWB11!c@92YTC6MNIrwnB{)>Jf&)>M;{zjgI z57*y7Kal6(!}TiiUU$KVs}4SJza4zIwAkmE&)>-NH}V{OxbGYH+rfvc4nC0Q;KQYb z59B%caA`Ns!H4UWZ}bCs4nAC3Tz8S@;KQZG{y?6C50@7E19=WUT(7gEAINj?;nJcX z$aC=F(xM;8bMWE5Z#)kNK3sL^2lD)l`TUJM2OqA#0UyY7@ZmxP>~;5p`|aSvrQI9^ zAFjGxSKz}{w?4p!3t_PP1AMsZc3pjNza4zIw7af8n9sq7OA8;k-wr<9w;xacpL^6X z_&}cb1KH5R2j=sB1Q}ZRK%VzQx2r{-_XDh`+x^jxg`y5VkmumTg|dJT4eSr(IrwmC_qy8;8|}XZ^Lan6gF5)YeBO_$Knowp^L{u3TKGVo z_d^J)MV^BX7nTI;3V9AbTw3f8v z`+^VGG5A29gAbP$K9J|&!=;4}<{EQ_;8_Zus<-LgAbQ>_eXG+ z`S%4s!Ljublmm6UKY~S|ZhZtXK;8DEm+Q9d+6&=itMIWx~2bo`VmU7V8Rm z-ouysZ$_T?P$25i59B%caN(uU59B%caB0yGcOWB>1uJNEy&x?}(QxMTnCk2?k*ljqe< zp5HO}m^{Ba_?Y?p>fmGY{OaIi^1Qmq^E-xqOrBpI`Z4qQ)uA7g=U0b*OrBpI`Z0N4 z-Q@WlLq8_ZuMYi~Jij{hWA3+K9r`hOUftyR9Ya4R&#w;sm^{Ba^kee;>d=q5-+p!I z$K-i+ljnB~{g^zzI`m`m{OZt;na{5d{g^zjZu0z&p&v7!Umf}}d46^1$K?6dp&ygy zSBHK~o>w<{e#g*{na{5d{h0au>d=qL^Q%KYCeN#zJilY;$K?6dp&ygySBHMge13K4 z$K?6dp&v7!S2uZn$Iy?t-+p!I$K?6dp&ygySBHKe&zBDuO$K?se7LLIek>pE>b4)t zhr7D%$MWH>Zu_x(xayGS59Ims;ZD2#SU%jx z7W)HvzI?dTVqGE6mk*Z~dHz72FCXr-SXapN<-?s8>k4_ke7Lm8^9S;L`EaMjxt&ioyUETI$`Eb=C&wr5T%ZEGd_G9^QSGVhG`EXaa`(ycV)gjN94|jE& z=gWt?I`}}IFCXr-=m+wA`EY5G=gWt?I`}}IFCXr-SXapN<-?s8{Xm{CA1*EC^X0=` z9rg$2^X0>x7V8T0`SRgTi~WK5eED!`k>@{{&zBE(TJ!_+`SRgTi+*4}Up`z~159Ims;ZBQwAkUW% zmlk=xe7LJaKal6khdV9y2l9ORaHqxoK%OrjE-mu>7kR#XxYME^$n#&^Z(ly#oew^6 zzkT^|X_4p4hr2pluaM`<{Gm^5IU4ejv}64|iJZ59Ims z;hM0K=gWt?y4@ekhr7D zWBG8^Ax7X3h;FCQ)~^8AVW?aPNdE&74`?aPNdE&74`?N8+S^5Hrk^8ATBUq0Mv z;RAWTe7MuX2l9ORaNQk8o-ZHn>ULc%AMWbb$MWH>Zu5Nka96kMYWZ;0A(MV>Do z?&{zJdA@wO(_&p=K3_guTIBii;jRw-z|^YyE^#5{r2Ux7Cw;Y%ZE#g`TUJMUq0Mvv96Hk z%ZEEH))n%6`EY45pD!Qo>d+75`SRgTi+&)_mk)Q^?Z@)rdZHZj`SRheZhb5t?&`K5 z%ZIzVz3wg_?&{zJdA@wOw8-=2!(H9x$MWH>Zu_x(xU1WB^}+k+%ZE#g_s^FPcXj9o z=JOBo{DVASKHU8c_&}a7A1*EOeED!!2Or4u5Aytj@6VSHcYgyu@csGn;nL!HxDWDt z`EaMjxx7X3h;FCXr-=m+wA`EaL2Kal6khf9k* z{~*to4|iJR2l9ORaHqvSN1iVqE-mtW`EXZb4)thpP^GzI?c=+d1ls`F#0sr`>h6e7LLIeZG9St3y99 zpD!OSE#~v(!(AQvfjnP6+-czhdA@wOwD|sf`EXZx7V8T0`SRh?BF~o(cXe1-$n)jHofhi~dA@wO z(_&pA&zBFE7J0sWxU0juLY^-l?zC7}$n)jHrN#aB<-=Va))n%6`EaMjx9QfGh;i`j=&GYKu zWAnT^_}DzJ4n8)|!}h?(&ga#^$Ij=~!N=x#b?~uyULAbwd>(2DK6XB@4n8)|tAmft z^XlMZ@3&V6ADidlk>F$VygK;UJg*Kuc0R8TJ~q#*gOAPgkWTQi^LcgfvGaL#@UeMb z9eiw_R|g+EpNFA>kGfmGZygK;UJg*Ku zc0R8TK9J{y_;6{lu8`;8!==T#LY{*U*QEsO3V9AbTw1Iv_;8^*v96Hk;KQZGxwCD%s zbMWE%D2jeyJ_jEzE&74^9DKO6=m+L=@ZtKXjO#AubMWEP;(CSo9DKO6xL#pC2Olmi zu2-1P!H0W*57#mHK%V~~&%uZ5eCP-A9DKM&67&Ok4nAC3_&}b650@7GK%RpSmv;LB zK3t>K?ho+cs#_o6!&SHY9DKOywjbcbRRlu@ZqZ4eGWccb=wc{;i}u~ z75H$CtGlkihpP@gkmumTrA0rG=f9ZG!H4U7=m+L=@ZlQ8;RAUNK3rP(K%RpSmlpj% zo`Vnf03WVn@PYaK7kLgoT<62OLZ1I3&%uZ5RtDA;=5z4j(qf-uJ_jEzEqq`;2Olmi z))nS+@Zq{mgMMH>|3#jI57+tN19=WUTw3@*o`Vnf03WVn=m+u~e7LmmfjkEvE-ic@ z&%uZ5b{P7BJO>{xE%rI?w}TIt7W*9c+rfwHb{%pM_uGGw=itM2KKMYMgAbP$K9J|& z!#%)<>)7@Ke7Nd12f>G{Zr2s~aMi63@Zq`zy4Nf4;i`iV%;!(!Irwm$4?ZxTgAbQ> z_XqfJ-OAl{1wLGLyU)Rgt8UlT6L}6kTw3%4dHzJ6gAdnFmY^TVbMWEP!Uyske7Lmm zfjocWemnSZ-A0EGvON)JuJO>{xE&72x2OqAlSkMpT`4f2#K3wO659B%caB1NK zc@92YUkkwp@*I4)v{+ZjbMWEPVqGE6!H0W*57#mHK%RpSmli&d=itMog%9L8_;7vI zw)p`*Ty?uYz=x}DeSi;F-OlIW!&SHI3VgV}9)u6%IrwmC_j3vOaMkVp03WWp?Faa9 z{k+wFE&(5|x?NY`!&L_#$aC=F(xM;8bMWE%$`w9vza4zIv{+a8{`?Pl4nADxgAe36 z_;7tq3?I1P4nAC3_`rM)K3rO?E95!&aA~nWkmumTJ-~lpfh`|aSvrA0q*za4zIwCD%!w}TJYBOT}m^863?+rfwHeDHz$?cl?u zT_51X^~lNQAoy_AZ9l+=t8Uj7_;A(jJ_jGJI{3hR4nABzt+@RFAFjI1LGak4@eKHLL*xQ@XG=JOZw9DKOWhkhW>!G}wWejv}mhwHH~_`rM)K3rP#19=WUTw3%4 zc@92YkELOMAkV>vON;9j@*I4)wAkm!bMWEP;(CQV2OsVMK3vD(1M~R{c@92Y=R-e` z=itNj_#gU#=i$JIOA8;!bMWEPq94d}@Zr*;AINj?;d-edJNa6KBj>k53h>fi(S+rfuRyZrzkuDabH z;KNn7>k53h9&z34F8FZO?fw8Ct~&TYo`VmU7X3h;gAdowHp2(<9DKO6SXan%@Zr*; zAINj?;d*Qs>k4@eK3rP#1M@lfaA~nWFrR}Dmlo>^^Evo%Jra%mf%zPKxU^VTxZe&w zTw1Iv+;0aT?g2hr$KV5b{zjgI57+t759B%caB0yG59B%caA~owkmumTrNz2Jo`Vnf03WVn@PRykV?GBTuJfTEn9sq7 zOS}C5AFfvr_PPr`Ty=ZB0w1or?Faa9)$Mf`e7Nf119=WUT(44WKfs5pZu0|txazha z;KNn7>k53h2l#LuLq9N|gAbP$K9J|&!=*((kmn!dIrwnBo&q1pbMWEP!Uyske7Lmm zfjs}<`*ZN&dZh+FFrR}Dmli%SpMwvV7CtbagAexrAFgBYfjkEvE-ic@&%uXF3m?dH z@Zow*X+K|q4_6)bIr1EQxU{%lA}H*R9YGvs}B7@o`VmU7X3h;gAbP${Xm|B57%pL=m+u~e7Lme2j+9|;nJcXn9sq7 z>$SVxAK=4PxBUPguDbOBK3sL1gW$texBUPg?g2hr$F?8f!&SGROTdS#Zr2s~aMf); zz=x}DKbL%Qza4zIUV}tGFrR}Dmli%SpMwvV7X3h;gAdnhn&=1e{EP3;!H4U7@PX&y zz=ulfmGZygK;U zJg*KuHqWbrkInO5^M{X}&#Qxv&GYKuWAnT^_}KZpI{4T;4^03co9ETR$L4u;@UeMb z9enJ3ULAaFo`+L_kDbq}gOAPg>fmGZygK;UJg*KuHqZNUMflkHygK;UJg*KuHqWbr zkDbq}gOAPguodvJd0riSY@SyKADidZ!N=ZjuMR#o&-*bA_}DzJ4nFpNdv)-!d0riS zY@SyKAA7$&JP3U3_vh8Y$L4u;@UeMb9enKf=heZ-=6OI>_}DzJ4n8)|tAmft^XlMZ z=kw~|19=WUTxgcfbMWD++dL0I`9J@qy3O;zh^X5<57>vg&GP_uTZcRcA1>?+d?3%k zhf50|$aC=F(!vMwJn+nVL!N^V7d{95K%RpSmlpj%o(DGAe;@L^m+(=y`vZKqkU#K& zJO>{xEqox)!H4_lg~|OlBhP!04|P~q$aC=F`ny3tNe7Mj` z=m+w=hr97N&=2G}_;BHy&=2H!4{q+?{a4)mv`Uj@*BPG|)OVLJ52~9)W>H?2! zS`&luK!a`&*lH*h!uZqsIc{NmbN#?W&!p(R;=Zf)Ik9p_Mm&i;?}0+p;d+HU??EzX zalJyG_h8U!k>@?If;y}#HzUu%hYJgaejv}mhf9loAkVwefPdfiqhWXI8YXdU`_Yhty4@dr_(t9O z=tCju)<+*!whnm?K3u3Z_&}a_QN-VX59E2923q()o?npX;KPN7gAdH-;KL<_56tJ_ z!=;4}pv;>2l5T8@2=JO>{xE%rI`9DKO6*yotf!G}wWeU3Z_AMSENo`Vlp9r}U!9DKO6=m+L= z@Zs88=m+u~e7Lme2l5apMwvV7V8T0IrwmCv96Hk;KOy<-E{>%Ty@(I@ZqXkAK=4PxBUPguDZSM zf)7_zzz61Y@Zr+#{s14Yy3G&p;i}tyfDc#Q?ho+cio9J{;KNl1ADGX_;6|A19=WU+y#8Nj==}=9DKO6@PRxBA1*C? zAkV>v>!T?42lD)iJO>}H^T7x59DKO6@PRxBAFhwj@PRxBA1*ES2l5nhpTRVfDc#Q<{vOS}6Ve7Nd%UEPr9 z;KMbpq94ff8}b}{xXy=uAkV>vOA8;!bMWCBvEc)GenXyv57+tN19=WUTw3@*p5Kt? z;KNxU^VT$aC=F(qexg&%uZ5_Qqa!!H27E=MV7Vs)G;YIrwmC;RAUN zK3unC-~)LMK3rO?E9ChNc@92Y=YtRAIrwlF@Zma!b%psHe7Lme2j+9|;nKnf?ze*v z*R3z~19=WUTw3%4c@92YTI_S=Irwnhn%nCY_;A&2Kfs5pZhe3cSKa10_;A&2Kfs6U z=O*9-c@92Y+TG{i!&SHI3VgWgwjbcbb-Q!#Gk_0Q-L5O};i`iV+;0aTE-m_jJO>}H zTeR?jJO>{xE!GvjKL;N!E&74)&+o`{@ZtK|5%@r!gAbP$K5)Mse7Lmmf%zPKxU|?G z$aC=Fx@C@ag*?9_&%uZ5eDHxhzvKIJ@Zq|BkAC3$bMWEPq94d}@Zr+J2l5q+mo`Vn9S0}jcVm=2SE-kKCn9sq7ON;9j=5z4j z`f3O33isQ=hf9lfh5PN`!==T#!u@ve;nME90w1oQFxq~A4_Dp#03WWpU02}4Rk!^B zAFew1!2Ndc;rgm=_XqfJ)$O_hAFjIX2l#N+?fw8CuCM)eU4ai*9eiLu2Olmi`hocz ze7Lmmf%zPKxW2x`y25-8K3rP#1M@lfaA~owkmumT_4O+Hfjoa;J_jGJ^T7w^^9S-A ze7Mesejv}mhr56e*D{xE&72x2Olmi`hh$LA1>|YAoy@SswdzTy=Zh1s|@u-5=n? zRR^c@92YTKK^IcJSePybkLM_uIjTON)Ns zemnSZX|b+wza4zI9{FwjbcbRk!&8 zK3sLXuE2+@ZudU56tJ_ z!=;4}-0|*@7xEl@xU^VT$aC=F(xM;8bMWDM+!pH!dH%wD4nADx zgAdH-;KQYb56tJ_!}W+TeBgPw7xEl@xXuS3$aC=F(!vMw9DKMQYlaWxIrwmCHwVFo zs}B1Ec@92YTI>(xIrwn>d^h$7?ze*vmlplN{dVx-(xM-j&%uZ5@p1G6^Evo%Y0(eN z=itMoMSfsD2OlmiuDh7e!H4V7cwBdp=itMo#kxYCgAbP$>k4@eK3tFP@45mXuDb09 z_;A&&5Aflt+jRv#Ty@(I@Zoyh06viC;KQZe{Q*8)b-S*>hpTS;0Y2OXe7KIm2lD)l zJO>}H^PwNebMWEP!Uyske7IigfDhz3_;6{_59Ik9^Evo%oew@RpMwwAt0?e+Jbz<8 z2OqBUp&yvf!G}u=ADGYI$aC=FF5ts;4Er2;4nAC3><{EQ_;6{l&ynZg!}S`_UU$KV zs}Ac5dHzP8gAdpF&=2G}_;9_Zgmr~H2Olmid?3%khf9m=F7h0FxC{7j9fJ?d=WpaW z_;8&M`vZ9nK3rP#19=WUT(5({2l5ADidZ!N=ZjuMR#o&#Qxv&GYKuWAC^3Ix&1~ zo>vDSo9ETR$L4u;@UioGb?~uy-Yd}Xv3Xt{eC&K)9eiw_R|g+^zr8y6K%RpS*Q?x{ z=itLtw|NdeTy>l0;KNn7c@92Yb(`nl!(G3S=itLt2Or3D@Zr*KKfaLX;KQYb59B%c zaJ@#q>k53h>ULdyAxU^VT$aC=F(qdg9&%uWav4DOc&%uXFi+&)_`*H10-cnlh19=WU zTnGqUuaM{caPIzHvON)LW&%uWa4}yLm&%uXFi+&)_!G}wWejv|- zy3c=8@Zmz5tdGFm(C)elD2=-9N1$WWt&ae_sDls8=itMIW`PgnIrwmC;RAUNK3rP( zK%RpS7di(0K%NIZ+y7R`^T1oELqCw`;KTLrLqCw`0d)57BF}@ppbqN_c^q7FWg=Y4?$Eqox) z`{DrF-5=e&p1N)hrX}ijpLa72b?c*>Jg8eA-F(fi%;-jD+=d?3%k zhYO7cAINj?;X{xE&74^9DKOz6?qOmTy^LN@*I4)wCD%&9DKO6 z=m+u~e7OE8=m+u~e7Lme2lD)i`5b(>&Iccu&#%aH@ZtJTihf`|zar1UhwFUU=a|pI zhf9lnjywk+?g~C!$8f#Ed=5TbTKK?x4nAC3_&}b657*K~KQNzz50@7E1NYmn$aC=F zIv;!>&%uXlyTJ$Y9DKO6@PRxBA1*ES2l5_;A&2 zKfs5(-f+Jie7Nd%U4ai*9eg0q!G}wWejv}mhbzkVb0YX~)xihy9DKO6SXan%@Zr*; zAINj?;fiFeE95!&aB0yG(xIrwmCv96Hk zH{?0^aDD8A59Ij`^Evo%oe%xMd=5TbTJ!_+Irwm)l;Hz;4nAC3^aFVgK3rP#19=WU zTp#6kpMwuq-R=+Y;i_97;KNn7`y70@>b4)?!!>@u2l5vOA8;!bMWD=;KOwcK5)Mse7Lmmf%zPKxU}$r zJO>}H+b>vG$aC=F(qdg9&%uXFi|a1(9DKNL4UMvC4_Do; zEAZjEO}IG-K3sM1f$z`3hf9lo;Q4m&;nKnfzCQ;auG^hhSD4Sihf9loU_J*QE-ls- z=5z4juHeIU3_dWQgAbP$J}{qy50@4`FrPn==itM2TNyr(=MUsL_;8&M>k4@eK3rO? zE95!&aNP=r4?GVCK3rP#1K*#650@7G!1w3i!(G9L>ll1sJ_jEzEqq`;2Olmid|*BY zAFi(#aJ|C!=MUsL_;8&MK9J|&!=;4};KQZGy25-8K3rP#1M@lfa6K-7b%psHe7Lk&SD4SA$aC=F zIv;!>&%uYgf)CfR?Faa9)vXWk;i}tp1wLGL>jQka9>Lf=2Oq9F_&}b650`e=75H$~ zZ4QDDSKaQ97xEl@xE?Qo59B%caB1NK^Evo%Y0(elIrwl_@ZmZJAINj?;nKnf@*I4) zwD5sE2Oq9Sc6OhG4_DphIrwnZ!3Xjje7LmmfjkEvuE&hv19=WUTw3gN!H4T{F8Dy6gAbP$J}{qy50@7Gz|s z03WVL{dQe}4_Dp#03WWpynhpTS;0X|%H zyU)Rg>+#9mAK=4P2Or3D@Zr*;AINj?;nKnf@*I4)EBJ67gAe36_;6|A19=WUTw3@* zo`Vn9qpR2-xZe&wTw1Iv z$J?hL9h-I4vGLKd$@7j)KRPx(IyO1ju~}Cg8y_8;JnxZw_}J&+s)LW6&#QxvozJU- zkDbq}gO8ohdyN1-_IYR|g-P=e@20ADidZ!N<<$)xpQ+d3Ery_uH$3kInO5F@cZG^XlMZ@3&V6ADidZ z!N=x#b?~wG+j}hrK6XB@4n8)|tAmft^XlMZzdx@IJ~q#Ll?OgH&#Qxvz29CPd~BXq z2Opc~)xpQ!Z}0UZ_}DzJ4nB51uMR#o&#QxvozJU-kInO5nSzhK-(DSjY@SyKADidZ z!N<<$)xihy9DKN5{n|VSAFjI1bMWD++dKy!uDZ>0@ZqZ4JO>}H*VW(yc@92Y+U*DU zaMf);z=x}D`vE@O?F)GhK3sLXuE2+@4nC0Q;KQXwKal6(!}SW_?ho+cs)G;YIrwmC zv96Hk;KQXwKal6(!}Tg7))n#`e7Lme2l5~rKf_;9^OigkrN|3aRF57+tN19=WUTw3@*o`Vn9tFQ2ZJpV$Te<9Do zhwE=(T_MlGhwC+5tSjU>_;6{lu8`;8!=*((kmumTrA0rG=itNjiZS|uJO>{xEv{F{ zbMWEP;(CQV2Oq9ip!a$OK3sL%5AfltTOZ)VRk!O3e7Nei9~aE$;KTJQ_x9t0`5b(> zwD5sE2Olo&_Tz&29DKN5HAg>?=itMo-TVL_uDabH7vwqkaB0yG0{VgZ{DM5cAkV>v>u+G6BhSHyON)JuJO>{x+ynMG^1L7W z{bXIGML&?|;KQXwKal6(!`;A#>ll1sJ_jEzEqq`;2Olmid|*EB$IAAe zIr6+8N`e;a3VGfSZ6=!ZDwZ-5V%c71>kSKVH(z=x}DeSi-as$};$ z_;A(12l5lb+r zKHLp_xQ?M8$aC=F(xM-j&%uXF3m=%zgBPt|%;&*(P`B4z@Zmz`zz6aie7Lmmfjke| zu>U^H=RpTh2Or3D@Zm!KV1FRb!G}wW{ee91WzhXMBhSHyyY&(vwCD%&ycfNoML&?| zy|}Yl<{EQ_;6{lu8`;8!==T#LY{*Umlo>^ zc@92YEyudTd=5TbTC6MNIrwmCv96Hk;KQ{fv96HkH{?0^aGei6kmond=itM2KJ){5 z4nEuse7KHbU12^4A1*D{74jT>xU}m7e7Ls$_5*yl>edJNaMf);z=x}D_c{1*)xihy z9DKMgVY@%ThpTR{SKz}{xBUPguDabH;KSX(hwB*nfjkEvE-ic@&%uXFi+&)_!G|jX z_PTpVo`VmU7V8T4+rfuRi+_;7s$-uwU`uDb09_;A&&5Aflt+x!3@uDb09_;5Gy z;X1bc03WWp%|YetghpP@g@O(S?aB0yGe18r;Tw3_R{dVx- z8jrB9FrR}DmlplNd=5TbTC6L~=itNLz=!J?d?3%khf50|n9sq7OA8;E&%uXlULd$4_Dp#03WWp-RI!Lb*pOo z0X|%H@PYg7;KQZe90VV(x?NY`!&QfVAkV>v>oy#GAkV>vOA8;!bMWEPq94ffC+2hT z;cno=b!_(s_;A(12j+9|;nKnf=5z4jy0y92UGU+mgAe36_;6{lKal6(!==T#LY{*U z*DYGCE6nHM!=*((kmumTrA0rG=itNLz=!J?d|*BYA1*C?U_J*QE-iduJ_jGJ+um4L z$nz)WbMWChAADdwelOHL)vXWk;i}sl1Rt)tU02}4^)(KB zAkSaObMWChAADdw2Olo&_5*yleuij2mw*pf-L9(_@*I4)wD5sE2Olmid?3%khwJMy z^aJzx3waJcT<3!ivON)JuJO>}HpVh+tzvOS}02K3sLXKfs5p4*fu$gAdnZ8SsHT2Olmid?3%khf9loAkV>v>#>o& zUV#r+-R^Vn;i`iVk9Mv8+i^sT#uW< z2lD)lJO>}H^PwNebMWEPq92>*Jq|bfqhsTvW3#S0Hv6Mv(~pjgkB-g$=-Bk5W8fmGZygK;UJg*Ku_WSed;A8W=$2;L;^SnCv*!%6(!N=x#b?~uyULAaF zp7%&9d~BXq2OoRCy*l{VJg*KuHqWbrkGvH&%uXFi+&)_ z!H4UW0r)_kgAbP$>k4@eK3rP#19=WUTw1IvvON;%1JO>{xE!GwC z9DKN5*TDWjo`VmU7V8Rm4nAC3tSjU>_;9^Wf^~&F2Olmi))n#`e7Lk&SIBel;nHGV zAs1-7E95!&aA~owkmumTrNz2Jo`Vn9t2|g&$aC=F(qdg9&%uXFi*k4@eK3v*eSK!0-%GCA)e7Ne?2l#N+?YaUVuDb09_;A(1 z2j+9|;d=FJ_XqfJ)$O_hAFjIX2l#N+?fw8C?hZa&$IuVtIrwmC;RAUNK3rP#19=WU zT(8dU{s14YI`jj14nAC3tSjU>_;6{_59B%caJ>SEejv{;$aC=FIv;!>&o7wI!H4U7 z*dLhB!H2tp57#m5bL9C2c@92Y=fk=}o`Vn9Yn516$aC=F(!vMw9DKO6*yqS|@Zr*; zAINj?;d*5h`vZ9nK3rO?E95!&aA~nWkmumT-NA?J7<^zp2Olmid|*BYA1*C?U_QSf z&%uZ5)m->Mo`VmU7Cw;Y;KQYb59B%caJ@Rb*DLVhs@wemK3sL{1AMsZcAtX}SKaOp z@Zoyh89tEbSKMz0AFlJk2lD)i`|aSvbw2pOd=5TbuWj$T0w1or&GRer9DKO6=m+xr ziu>*0!}VG@`hh&ZBG18x>wM@3@*I4)w7Wm9$aC=F?pNeF_;A%>f8c&Q_;6`AKfs5p z4nC0Q;KTL$KKgu8a%{dVx-(xM-@-wr-pTJ!_=+rftm_keyN&-(%3Po`5^^aFX` z55Gc-ejv~L(azOkKJN!6QHOqDJ_jEzwA&Bx;qKtWb!>fr4_Dpx1AMsZ z)(7}-)onk(hYRts{Qw`XI`}}IgAbQ>*Hu5ZF#QD|E-ic@&%uWaRkGJz@ZqZ4brsBe z|9!~wz|*MP{Q*8)e;4Zt^Evo%_n@--cai6TO;Lw_AkPC;LW_PN&u_Tj4nAC%82CV* zgAbP$K9J|&!=;4}HRAkVwu2`&18`Meug(4rs6bMWCpkHH7>yg_vTF6MLa;rbg`SD4Sihr9QIa{n&o zbMWEPq92&g!G}wWe&BvP_;6{_59B%ca3S8%56tKNk^S$2JO>}Hzkz-r&%uZ5bm#~2 z9DKO6=m+u~e7Lme2l5wD5sE2Oq8_2_MLF@Zr*;AINj?;nL!|i#!J(t}U}U2tHhO zyFb8(t8RUO4_DppbMWD++kSu#7X}hOFrR}Dmv*mL;KNn7>k53h>b4)?!*vlOHL z)$O`^U_J*QE-m_j`5b(>wD5uX9DKMgr|1Xr9DKO6=m+u~e7Lk&SIBel;lhEUAIS3u z=5z4jIv;#sJ_jEzEqq`;2OqA8f)C8+;KQZGK1ZHEkmumTbw2n&oll0>&%uXF3m?dH@Zr+J2fjZCAFhutSXX!+4t%(@ zSXan%@Zr+px{Ex2U_J*Qu8&;sf%zPKxU}$r`5b(>wD5uX9DKO6n}guP-NA?J*yacL zaMkU)0w1or^#MLyb(&b?|}t9DKO6n}guPRk!;Ce7Ne+59B%caD8lt z59B%caB1NKc@92YTJ!^X4nEu+e7KIm2j+9|;nKnf?ze*vmli&7za4zIMxnj#f)7{S z?(-+|9DKO6*dNGq@Zr*8T_MlGhijxmKal6(!=*((@clXXaB0yG z_;6{_59B%caB1NK^Evo%-Ht#%FrPn>=itM2KKMYMgAbP$K9J|&!`;D$>)7@Ke7Nd% zU4ai*-CnQ2hpTRVfDhL#p3QUc;i`iVCK9J|&!==T#LY}{n=itM2KKMYMgAdm&LHNLY4nAC3 z_`rM)K3v-UoCrQ#b(`nl!*v@IK9J|&!=;4}rpMwwAt$O4K@*I4)w7Bjf&tI6&!H4U7>jQkaJNR%NTOZ)VRk!O3 ze7NeiAK=4Px7S_p;rgm$*A@71)xihy9DKO6+Yj*Js@wemK3sL^2j+9|;rbc}K9J|& z!=;4}lpfh`5b(>wD5sE z2Olmid?3%khwCd+^aFVgK3v+(LGa<`T6;KTJ*FZzM`9DKO6=m+L= z@Zr*;ADGXu$$pU3F}H zbZpjD$0pA^HvQ<>_~_W=U|;#e$9{ia9eiw_R|g-P=heZ-=6QASv3cHO3h=S>d3Ery zd0riSY@SyKANxF9b?~uy-lG-pvGaL#@UeMb9eiw_R|g;a{dslpv3cI(An>tyULAbw z{r2kMWAnT^_}DzJ4nB51?-3UG*gUTeKK6clb?~uyULAaFo>vDSd%wNMZs23{ygK;U z`Mf&#*gUTeJ~q#*gO9!6-lIbBv3Xt{d~BXq2Opc~)xpQk=heZ-=6R1d!N=x#b?~wC zd3Eryd0riSY@SyKA3LA-NEUo-o>vDSJD*nvADidZ!N<<$)xihy9DKMQE!#W?AFjI1 zbMWD++dKy!uDZ>0@ZqZ4JO>}H$Kl`uc@92Y+U*DUaMf);z=x}D`vE>&Kj*sZ3VgWg zc3puFR~>vH&%uXFi+&)_!H4S+L-;_RgAbP$>k4@eK3rP#19=WUTw1IvvON;%1JO>{xE!GwC9DKMQ@5KH_;5XbigkrN2Olmi z))n#`e7Lk&SIBel;nHGVA(N@QE95!&aA~owkmumTrNz2Jo`Vn9qrX^J$aC=F z(qdg9&%uXFi*k4@eK3v*eSK!0-i1qdZe7Ne? z2l#N+?YaUVuDb09_;A(12j+9|;d)ej_XqfJ)$O_hAFjIX2l#N+?fw8CuE*AQU4ai* z9eiLu2Olmi`hocze7Lmmf%zPKxE{a9y25;ZL7syT*ZJTBc@92YTKGVogAdm$1Mq=7 z2Olmi))n&nf;L14nADk-RI!LRk!;Ce7NeiAK=41uE=xn z;i}tp1wLGL@PRxBA1*EWfjkEvu2;_XdIdgQb?|{a2Olmi))n#`e7Lme2l5W1&n!H4VB zX7mGj4nADk-RC#tIrwmC(GTP~_;9^?y?G8kTy?w8Z^(1-;nHGVA{_gd49wFcJSdkAADdw2Olmid?3%khkM*`za4zI>aagBpMwvV7W)Hv4nAC3>~rKf z_;9_xk9CDS2Olmi`hh$LA1*EWfjqxqJ_jEztuF{~@xZ@(eW!H4U7xLzU8!G{akfa?|V9DKO6@PRxBA1*ES2l5#83XMBVnIAG|{yd?3%khkNv+VS7I0IrwmC;RAUNK3rP( zK%RpS7vcl`K%Vy_BkK)$4nACe1N}grgAbP${Xm|B4;QKg{Xm|B50@7GK%RpSmlpj% zo`Vnf2;RH@oss9@!==UkK%RpSmlpd2c@92YsF%H7fe%+5`hh$LA1*EWfjkEvE-m_j zJP#(d|Lt+VJ@66gus?9W9elX3IM^S!-wr-pTI>(xc|eN&HzUu3C!h}N3VGfO^3Y;k zAlN}Ge7Ll@ULnsP$aC=F!vDbs=5z4j(!vMk zbMWEPt`G3xT57wlz=x}DeSi;F-R=+Y;i}tp1wLGL@PRxBAFeI4`}~PK2Olmid?3%k zhfBNr9DKOP6L}6kTy^k)JO>{xEqox)!G}u=AINj?;kpcAT_Mk($aC=FIv;#sJ_jEz zEqq`;2Oq9WCwyQ&2Olo&UU$KVt8VxC6Z1LvaA~nWFrR}D_W&QRW7y}&bMWEP!Uysk ze7LmmfjkEvuGqr^c@92YTC6MNIrwnJD%KV99DKO6SXan%@Zr+px{Ex2 z;(j~$a1Zd|I);8A&%uXFi+&)_!G}wWejv}mhwI}D`hocze7Lme2j=r9@*I4)&IcdJ zbMWE%$hAJehpTS)IrwnZZ9l+=t8Uj7_;A(jJ_jG}0X|&Ec3r)Y=itMog%9L8_;6{r zA1}=3;KTLN7X3h;gAbQ>*A@71)$Mf`e7Nf119=WUTp!2b19=WUTw3@*o`VmU7V8Rm z{z9IE5BC5cu47nNn9sq7ON(`dJO>{xE&72x2OqAn2mQc&4nAC3^aJxb_;6{_56tJ_ z!!?%eJov(V4nAC3T(5Ay9elX7*dMsx{z9IE5BC5cu4Cv2@*I4)wCD%&9DKO6=m+u~ ze7MG6^aJxb_;6{_56tJ_!=*((FrR}DmlpYf`5b(>MtkgY%;(_4rNur+o`VmU7W*7| z4nACH`dwGx!&SHa03WWp^#MLyb-S*>hpTS;0X|%}OW*@}{zjgI57+tN19=WUT-xmi z_;B6M+5G`NTy?vy-k8t9hf50|$aC=F(!vMw9DKNLOQ9dg^Ec*m@ZmZid|*BYA1*C? zAkV>vdw>tuG4um@4nAC3_&}b650@4`kmumTb^8zfK%RpSmv-~xjXVb*E-m&s@*I4) zZck!=AkW{J&%uZ5eDHz!9DKO6@PRxBAMOD@T*uH4Jy`;KOx3tSijt z;KOxm7(OtcgAbP$J}{qy50@7GzVt}vg!k>}vUbw2n&o`VmU7Cw;Y@6GdW zw~vpGO+Pv|*Q<_Ao_B0~bZo9y9h=Wr9UC7Vn|0N($@9JfmGZygK;UJg*Ku zmJe4QeC&MQ*BbD#^Lcgfv3Xt{d~BXq2OsvDSJD*nvADidZ!N=x#b?~wG+xuz}J~q#*gO7b4t~&VGJg*Ku zc0R8TJ~q$$Iut%O&#QxvozJU-kInPy;A8W=I{4W6ysvQKWAnT^_}KZpI{4T;uMR#o z&#QwE&b=wc{;re=i*A@71)$O_hAFew1K%RpSmlpj%o`Vn9BMI<{xE!GwC9DKO6 z=m+u~e7Lk&SIBel;dk4@eK3tFDU|k{4!G}wWb%i_! zA1*D{74jT>xE>Y4xvOA8;! zbMWEP!Uyske7GJl#Qs2@gAbP$>k4@eK3rPt59Ij;c@92Yk43@<^8AAN9DKOWhkjr_ zzaY=ShwFUU=g4#L;hq=F=itLthkjr_2Olmi`hocze7GJp#XiS;4nAC3Tz4^_gAbP$ z*DK8D;KQXwKQNzz57%R~*yotf!G}wWb%psHe7LmO=a|pIhkJq#*D?4&o`VmU7Cw;Y z;KQYb59B%ca6Ov5`y70@>ULd$4_Dp#03WWp-5=n?Rk!O3e7GK`h7aU9_;6`=pMwuq z-R=+Y;i}tyfDhNtf$u&CAFjGxSKz}{2Or3D@Zr*;AINj?;d(?JJ}{qy50@6}3iCPm zaB0yG%;(_4rNz3!d=5TbkKdyon9sq7ON;%1`5b(>v{+ZjbMWDMJplUyd45HngAdpF z-~)LMK3rP(K%QTb=itLV!H4S@))n#`e7Lk&SIBel;nHGVA(vabE95!&aB0yG zvdx8(wG4um@4nAC3_&}at zF`t7E*ZFo`fe+U!I@=HM;i}vH0X|%H>jQka>NY>XhpP@gFrR}D*Q-X`5Aflt+Z+TR zuDadl;KNn7>k53hC-`t3LqCw`;KQYb59B%caB0yGv zON(`dJO>}H*Z8omaK9aVxU{%lA{xEv{F{bMWDMMG^Z0c@92YTI>(x zIrwmCv96Hk;KTI_CDs-49DKO6SXan%@Zr*8T_MlGhwBwjtSj7a2Olmi))nrzgAbP$ z>k4@eK3v*eSKz}v!H4VEt}F22s@s0tk>}vUrQLpj4_6(0AkV>v>y=yh!1Hk6!=>H* zaYvqm50`fL#~shZfe+U!!Mi{1$aC=F(xM;8bMWEPq94d}@Zox8dG`nSaMht7$aC=F z(xM;8bMWEPq94d}@Zp}|!*vWkFrR}Dmli&d=itMog%9L8_;9^0j&+4RzhgcJAFlJk z2j+9|;nKnf=5z4jdc_?+aKHVIJijB)!H4T_>~;5!JO>{xEv{F{bMWDwcjP(vaMfX- zBhSHyON)JuJO>{xYykE-@*I4)w3~x>{SElQ_vihf68;8!;QRA_ zG-tKA-`{xE&72x2OsYFK%RpSR~^<`T6 z;KMz833~s{n9qA*7j@_d@*I4){x14~JO>{x?e?RWzvkc9%T+kGK6>c~b=!|#MnT>B z=p_l%?YipW{jEcu_fR?N-~;nH_;BHy-~;nH_;6|A1M_(g`|ZCOdESF*s6#(6pMwwg z?BO1q5B{xEqox)!G}wWejv}mhYQ_?b%p!w;KQZG{=ofq@Zmaye&BvP_;5+F&ynX(%;(_4 zbw2pOd=5TbTKK?x4nABsJorGKgAbP$If(fje7Ll@?qWWFBG18xt3~Sre7Nd%e}E5H z-Sz`~xa!si_;A(j{s14YWd$FY&%uXFyZrzkuDadl;KNn7>k53hu!wuT0w1or-RI!L zRR3;KaP2Olmi_6PDD ze7Lk&SIBel;nHG%AkV>v>(YsJg**ozE-m&s@*I4)wAdfWbMWDw;KOwcK9J`xjQka z>b4)?!&SHY1AMqXUcm?Q9DKO6yRN{8t8Vu>_;A&2Kfs53f)Cd*_&}b650@4`kmqmA z=itM2KKMYMgAdooSolDmgAbP$K9J{c%;(_4bw2pOd=5TbAHCrN^Z6Tj4nADx!~Q^? zgAbP$K9J|&!#%-=>)2kez=x|2{Xm|B50@7E9C;2tT;t4szItOm2Olmiu2;zOH{MqR zAFlJk2ky6n57!6=AGqKCMxKKY*ZI&7Y^W*&%uXFi*<$h{Ea*ZAFlJk2l5vDSJD*nvADidhB7={89vDSJD+ze5vDSd%wLp z_}DzJ4n8)|tAmfd-`*`>_}DzJ4n8)|tAmft^XlMZ^SnCv*!jHM)awI$xa!si_;A&& z5AfltTOZ)VRkuFChwIild?3%ikmumTbw2n&o`VmUc0ZSZ4_DoOE&(5|pOD$lSKz}{ zx1X=ThpTQsUx5!-9eg0q!H4TB4DvON)LW&%uXFi~WH-2OqAlkFc(g=itMo#r{B^gAbP$>k4@eK3rdKVO=55!G}wW zb%i_!A1*D{74jT>xU^VT$aC=F`sxnr3V9AbTw1Ivv>nHWFu8`*!Y4x+vi2K%RpSmv;9D_;A(jx&j}ry6p$}a4+!TItCxe zbMWEP!Uyske7Lme2l5k9KZ_;6{_56tJ_!==T#!h8-sT#xJR zKEGl<2Olmi_6O#3@Zr*8U12^4AMOP{T*u%8_uIjTOA8;!bMWEP!Uyske7GKg#Qs2@ zgAbP$`vZ9nK3rPt59B%ca6O`l{ee6OA1*ES2l5}H^I=^f&%uZ5@mQ=Yn>lOHL)$O_hAFjIHAK=4PxBUPguE(Tz zpMwuq9eiLu2Olmi`hocze7Lmmf%zPKxE}Y$y25;ZL!N^V*ZJTBc@92YTKGVogAdnF zn8OG19DKO6SXan%@Zr*8e<06q$aC=FdaNEkkmumTrG*dVIrwmC;RAUNK3tFeV}Bse z!G}wW>lN}Ge7LmO=g4#L;nL!Ig**ozuAjWeK1ZH|50@7E19=WUTw3f8fwd zg**ozE-ls-@*I4)v{+ZjbMWDMB?RjVc@92YTC6MFZwDVPE!Gw8w}TItcGng7a4+!T zI=1Tye7NeiAK=4Pw?4p!t8Uj7_;9^?v;6=ct~&U@^Kjt9rQQ7jK3sLXuE2+@4*fu$ zgAdnhMeu<<2Olmid?3%khf9loAkV>vdw~zvG5A29gAbP$K9J|&!=;4} zEAZi}+kFl`Ty^k)`5b(>wD5sE2OqB2%isff4nAC3>~rM#9rHQ(aGei6FrR}D_W~cT zV^~+nbMWEPq94d}@Zr+J2lD)mJO>}HSNq@tc@92YTKGVogAbP$K9J|&!}aPR))n#` ze7Lk&SIBel;nL!|i#!J(?sZ3=gAZ37`hh$LA1*EWfjkEvE-m_jJO>}HS3I{L;KNn7 z*DLVhs#_o6!&SHa03WWp%|Yb4)?!}Z$ielB_7 zemnSZY0(edZwDVPEqvg9`vZCYK%RpS_j+JH2Oq9F_`v;k@Zr+J2ky6n50@6}3isQ= zhwC-w-RI!LRflzjJO>{xE%pcU9DKN5sm8iOo`VmU7X3h;gAbP${lI($ejv{un9sq7>wNHm`5b(>wD5sEf8c&Q_;9ZW^8A7O?cl?ug%8|s2OlmieBgdN z_;9_JkAC3$bMWEPB0q4y9elX7xbEV9JNR&61CSrc^9S<$f%zPKxc&zEf%zPKxU}03 z@ZnzI!*y)?0X|%Hd%Xf5uDbOBK3sL%5AfkaG3@mUe7Nf11M@lfaA|j4_2b5$ysGN< zx(hyBb?683ydPWLzk&I@9|1)j`hocze7H~+@PRxBAMVwU;O)N!dESq>p$QHOruetTbPLW_RjetTbBtrmF> zKHRG>C!mE7+;8s&G_>%6`|aIiTrKjvn_s9yKQNzz4;Ok2{Xm{Ku;TBcAIS3tmDOTC z2OlmB8v23xybnb98|Vk-bMWE%yXXh<9DKOf3waJcTyvH&%uWa z;kWx7e7Nd%U4ai*-Sz`~xaxMFgAdno*>wdzTy^k)`5b(>wCD%!w}TIt7Cvyl9elW! zJ=PWS9DKO6=m+u~e7Lk&SIF}>=5z4jLOH?*@*I4)wD5uX{Ea*ZAFlJEAINj?;kvxQ z2fjZCA1*C?AkV>vON)LW&%uZ5@`wF_JO>{xEv{FX&%uXFi+zqff8+ae@Zmyw!Uysk ze7LmmfjoaB&%uZ5eCP+}bMWDc8Ti0_{zjgI57+syu8`;8!=;4}fmGZygK;U`MfazJ~q#*gOAPg>fmGN^XlMZ^SnCv*!jHC1wJ;< ztAmft^XlMZ^SnCv*gUTeK6XBD+=7qI^XlMZzdx@IJ~q#*gOAPg>fmGVw>Kif$L4u; z@UeMb9enKl_Uhnc^SnCv*!eu{`T77KuDbOBK3sL{1AMsZ)(7}-)vXWk;Tpx^19=WU zT-yCy0zO=I`?&;sxa#(E3HWf;?dKBk;ku=;pRd4&s}4Sp=itMoML&?|U&wRt;kxC4 zejv}mhf50|$aC=F(!vMw9DKO6=m+u~e7J7sV1FRb!G}wWb%i_!A1*ES2l5{xE!GwC9DKO6SXan%@Zq}E zhjoQK2Olmi))n#`e7Lk&SIBel;kp%xb%i_!A1*D{74jT>xU^VT$aC=Fx>bsGg**oz zE-ls-@*I4)v{+ZjbMWEP?z#dWu3Ns_5AfltTOZ)VRk!O3e7NeiAK=4P2Or3D@Zq|3 zz54@vxaxLYfe%;R_5*yl>UMvC57%w{xEqox)!G}wW{ee6OAFi)hu&$8j z;KQZGK1ZHkkmumTbw2n&o?kGZgAdnF385dD&o9Vx@ZmZi_6PDDe7Lk&SIBel;re_;7FV z;W`E%$aC=F(!vMw9DKO6>jQkazWUsC1wLGL>jQka>UMvC4_Do;EAZi}gAe36_;7uN zyEzCxTy?uYz=x}D`vE>&b-T~OhkJt$*D>@1c@92YTKGVogAbP${Xm|B57$@VyU)Rg zs}B9Ze11iqgAdpF&=1V#;KQZGy25-8K3re#!w2Sb@Zr*8e_%cbA1*D{73OpB;ojiG zbqqd`=itMog%8|s2Olmid?3%khwG6E><{EQ_;6{lKal6(!==UkK%RpS*CQR+AINj? z;nL!|i#!J(E-m&4@*I4)wAdfWbMWE%IYX=~<{EQ_;CFs>*fde zaMkT~7ks$t-~)LMK3rP(K%RpS*JFb4fjkEvE-kKC$aC=F(qf+@&%uXFi|ZBg9DKMQ zfkZ!$=itMo#Xd)#gAbP$`vZ9nK3tDzVt*jd!G}wWb%i_!A1*D{74jT>xHtH49fJ?# zIrwmC;RAUNK3rP(K%RpS*JH1{Kfs5pZr2s~aMi63@ZqZ4{Q*8)b-S*>hwD*Y_&}b6 z50`fLIrwnZ?fw8CuDb09_;A(jKELCBJNR(@Of~v}JO>{xEqox)!G}wWejv}mhwCxv z-5=n?Rfm2c&%uXFi*<$h9DKO6=m+L=@Zoyg8~wn14nAC3^aJxb_;6{_56tJ_!@a?W z>ll1sJ_jEzEqq`;2Olmid|*BYAFfB}v92(m-;w9w!*xFRK%RpSmli&d=itNj*gt$A z&+o`{@ZmZid?3%khf50|$aC=F-r&P^4C@N>IrwmC;REwI_;6|A1M@lfaJ^oEejv~9 zxZe&wT<3!i%;(_4rG*d7=itNjO33;EAFjH+?t%|j-TD9@uDZ=Z@ZqZ4>n`|kZ}8zd zw(AOfxa#(E3HWf;ZGM0cSKamle7Ih-+0P~5!&L_#$nyv8w}TJY`QQWh+rfuRi+}H z*9?(^$aC=F(jq^Q=itMo#Xd)#gAdnhkh{;phpTS;0X|%H>jQka>ULd$4_Dpx1AMqQ z_;4NDet-{G-R=+Y;i}tp1wLGL+Yj*Js@whXM4p2W*K4Wh2lD)hJbz+72OqA#0Uwyp z!H4S=S*$C}=itMoML&?|;KQZGx<{EQ_;6{_59B%c zaJ`C*ejv}mhf9loAkV>vON)LW&%uXFi+&)_!H4TLYwQo?IrwmCvCom`;KQZG^$L0Z zM4p2W*Q??1fjkEvE-ic@&%uXF3m?dH@ZsK1+;0aTt~#tM+;0aTE-ls-?ze*vmlo>^ z&%=Qa*DLtw2j+9|;nJcXn9sq7ON)MBJ_jEzM8M|Y3waJcT-v=}fe%;R_5*yl>edJN zaPJrHw}TH?-S*>!JO>{x?e^n^`5b(>wD5sE2OlmJ1NwnH??=5qc~EK559E12+zjpJ z2l#OPjolypsO_E)dESq*q7FWg=l#egwD5sE?}rqjg%9L;KbE&zw})gsUPK_JwjAIS552nJg819{$$eL#zTAkX{phSlPJdp}5kI`jkIpMwt< zz6AZid>$|ye;55go(F(lE%F?ExKJwS2l71lEdB=ifjkEv?)}1i4nACU=m+u~e7Lk& zSIBel;nJcX$nzj&``-ogc|a}HVO?Q92Olo94f=uk9DKO6yRL$>%)c-A368Cgpd6^% zbrmcEb?YOD0qV9Ny`Md{n@prMVFrWAEm zs6#)H=iTUs7X3h;gAW%14E;c!cf)S~F7mt^NvOjq>d|*C*BhSHy>wMVf$aC=FLao6E@*I4)wD5sE2Olmi))n#`e7Llq>#DcaCeP2Y z&vkW^8D1n$IR!a z4n8K&PaS+ro>w<{evY9Zljo-n{h0au)S(}f=cf++m^?pq=*Q%Fb(81k82T}Je(KPV z$@5c(eoUU9I`m`myt>Kra}52MJU?~l$K?5`LqBFdKXvHG%;%>L{g^zjZu0ybLq8_Z zPaXO(d4B59kD1R;9r`hOUftyRIfi~ro}W7OWAgmep&v7!pE~qo=JQjBeoUTMH+g=J zp&ygyrw;v?JU?~l$9#W&>d=qL^Xewg&oT64=JQjBeoUU9I`m`a^HYa@OrD=Q^kee8 zy2lqKXvHG+;2a1=*Q&wsY5@I=gWud?Q`V$^5IV1_G9^Qr*8YPe7IA${a8NS zsoQ=mAFev&`SRgT9eg0qmk)Qe+mGeLox1JE^5LpOo-ZHn)a|-jKHRC>b+vrBQwJZ& z^X0=GE&72x|3aQGAFlHu&%co8%ZEE!_&}a7AMR-319`rDxU|UgFXZ|1;f@yj19`rD zxTD3oLY^-lE-mu>3wgeLxTD3oLY^-l?r5>kk>|^YON%`JLY^-l?r5>kk>|^YJ6fzO zek2d;ZEJI ztL4L;y6wmE;Z7ZVU_M_yTw2WM%ZEF4yRMcGcj~qu%ZEF4yFZo>R~_(#eBYexKoFIU_M_y+|i;Rn9r9F7vT-}+e`kB z??g`B?vLfeox1h0e7IA${a8NSsoVXre7Ne6=gWsXb?|}teED!kyZe0kaHnqjv3$5w zx9e*8aMj^{`xSYDo z?wk+(z(#e9B6o-ZHnXtA!4=gWsXTC6MN`SRh?Vm`kj&zBE(v{+Zj^X0=G zE!GwC{EGQ}`EVsN@_hMlr*7BP^5IV1_G9^Qr*3^LAMVucx>`P5b-3StL!K`m?r66k z%ZEF4yFZo>cj|UsEg!Br%;(F8J9V3b%ZEF4@PRzPVLo3z+&Le7U_M_yTw2WMH{|*9 z;f@wQkmt*XJ6fzO%;z`c`SRg9ALjEL@_hMlM++aw^X0=GEqox)mk*Z~^ZD}OP94@2 z@_hMlM~i)qJYPQC(PCX8&zBFE7J0sWxKoGg74m%fa7T-MjyzvJ+|lBCg*;zATw2WM zH{|*9;f@ylK%Orj?r6~u|^YJ9Y4ZJijB)mk)Q&hjoQKUp`z~|^YJ9X#>^8AiGUq0M9ANqkjUp`!S!jb38hdXuKkLAOiy1ia4AMVs` zo-ZHn)NMbO4_6)XeED#v4nC0Q%ZEGKU02J8J9XQS<-=8nJYPQCsoOk%AkUW%ceLmS z^8A7O?aPNd=R-emzkT^|X)&Kakmt*XJ6iZaoUN(m zAMVs)U12_dAkUW%*ZDA?Kal6khdWyA59Ims;f@wQkmt*XJ6iMudA@wOw8--Z=JVyl z9WB-s@_hMlM~i)qJbxh1mk-zZkmt*XJ9SuB$n)jH9WAcA$n)jHrN#aB<-?siT(6Ml z%ZEE!^aFXme7K`UKal6khf9n5?GNPn^5Kpa{Xm{CAMR+;59Ims;rhlJ-=8lZ?$m8R zmJfI8*2nVUPTlVF<-?u2?Z@)rs>Ao^%ZEF4@PRyEKHSmnx>`QmsoQ=mAMVuc^=kQW z)#3Z|<-?u2z3wg_?$p5t@_hMlM~i+S&zBFE7W4V?;Z7ZVU_M_y+|goPA}kuQ@87C`Eb=?K3_iEse=#9=gWsX+T9<^ zhdXuKj~DWM`EY5G=P%6X%ZEGK-5)RH`SRh87X3h;FCQ)~=JOZweED!ki+&)_mk)Qe z=m+wA`EW;zb%i`%K3rPl`SRgT9r}ShUq0N?q94ff<-?^#o-ZHn)a~`^g*;zA+|gp6 zBhQx)ceL0a$n)jHrN#H>%ZEF4SXa2;zI?c&#k#`%_T|GJE!Gw0^X0>(#eBYexKoF9 zh53B>a7T-Eh53B>aA}d}%ZEF4SXY?Omk)QeSXY?Omk)QeSXY?Omk*Z~^ZD}OP94@2 z=JVyl9WB-s=JVyl9qq2G<-_&#IP(0B`F#0sN4x84`EaLheJmgD)NMbO4_6)L^X0>x zx?NXq#^mN`GSw7s+Vt*jdmk)Qe zSXapN<-?^#p7+CZ`)|g4zI?cIKKQ_VzI?c&g%8Z<{n*j|`!JvPgFC20KQN#7qbks1 ze_%deK3v|A=gWsXb=V)6&x8B#zYlr7e7N&B-~)LcM121S@;taT>fi%;{>FU1e7OG2 z$n)jHojUAu@Ui#XtAmft^XlMZ=kw~|WAnT^_}DxTLj@n3=heZ- z=6QASv3Xt{eC&K)9enJ39y$v?_I`VH@UeMb9eiw_R|g-P=heZ-=6Sd;_}DzJ4n8)| ztAmf7&#Qxvz29CPd~BYFD1(p9^XlMZ^SnCv*!%6(!N=x#b?|{aFC0HVONCn79PC1l zy3O-0FsR!+Z{eeE^Sp+jZu1;`xbSfBfjkEvE-8E<&%uXF3m?dH@ZrMOp&!U|@Zr*; zAINj?;nJcX$aC=F(xM;8bMWE%PmgtlJO>{xE!GwC{0n&wK3wO659B%ca4i@3K%RpS zmli&d=itMo#r{B^gAW((5c>mp4nAC3><{EQ_;6{lKal6(!?oS8Kal6(!==UkK%RpS zmlpd2c@92YTC6MNIrwm0O0cew=itMo#kxYCgAbP$>k4@eK3phFtSjU>_;6{lu8`;8 z!==T#LY{*U*QFTi3V9AbTw1Iv%T#>T<03WWp^#MLyb-S*> zhpTS;0X|%H@PYXpe7Ml5yFb8(t8Uj7_;A&2Kfs5pZubZHaK-elEAZi}gAe36_;6{_ z59B%caB1NKc@92YA2+bBkmumTrA0rG=itMo#k#_L4nADCT=WC;IrwmCu|F`MUy$eE z!*xFRK%RpS*GD+`K%RpSmli&d=itMo#r{B^gAbP$`y6==K3pG9u|JUK;KQZG{y?6C z50@7E19=WU+!y$89fJ?#IrwmC;RAUNK3rP(K%RpS*GGQrbL2VraA~p6k>}vUrN#b0 zo`Vn9NP_)=JO>{xE%pcU{DS!$e7MdBADGX{xE!GwC9DKMh@ZmbPKEQ{oZr2s~aMf); zz=x}DeSi;F-L5O};kqpfAINj?;nHqDz=x}D_XqfJ)$O_hAFkWByU)Rgt8VuP_;A(1 z2l5+3=IK%RpSmv+|`_;A(jJ_jGJy6p$}aQ(d1UU$KVt8Vu>_;A(1 z2lD)m`|aSvbw2n&o`Vn9*RbdZ@*I4)wD5sE2Olmi))n#`e7L?QMn90};KQZG{y?6C z50@6}3V9AbTw3f8vON;9j z^8AiG2OqBU!3Xjje7GJpfDhz3_;6|A19=WUTw3gN_;6{lKal6(!}TZ_`hh%uAkV>v>wNHmJO>{xEqox)!H4VdHTXcDgAbP$ z>k4@eK3rO?E95!&a9`lVbqqd`=itMog%9L8_;6|A19=WUT#p3ex{Ex2AkV>v>wNHm zJO>{xEqox)!H4THM)*LUgAbP$*Inc}_;6{FgUEC6;l99!>)84LAFjH+UV#r+-Sz`~ zxa!si_;A(jJ_jGJ$3@`-dH%%r=itM2KKMYMgAbQ>*A@71Jfi%;4nABz+l+o7&%uXF3m?dH@Zr*8T_MlGhwHIn^aJxb_;6{lKal57 z+;0aTuJgeM?ze*v*Q3txf&1;?!=;4}Ret-{G-R=+Y;i`iVwL%$&b^E#GjrkmWxL$)q zKk&X9_;6|A1M@lfaB0yG%;(_4^_nL7fjocXemnSZoew^6za4zIwD5uZ?cl?Gfe+U) z^aFVgK3rP(!2R|&@*I4)&WCk{`5b(>UXg_l%;#_9Irwm$5BnVR`SRf+U42}eE(O4& z{{HQM`R5;h=>OuH;2b;Ok$%*5d-DD5SY*v^9e)2C=h%7P z=l|B8V<+Q3j`flM<9toJ=l;RBx+cjU+?-?QnYPcm^E}eGW0!lkMZf#FcI-TV^{uX# zPOg1M`aE_%Uws_=-_Nvt9vg2xsC)Q1-|9Mcp5^>JcJ3d19P9PukH6bPujiTa?{&Qq z(&zEdW9K`9@5j2^K7aR7G=BbDx;y@{UV2xf#|1wA+xGy=;ahzB8y!2(%zhp__iaCp zb=!ODx()YH*I$@^bnM*E`F6g({Otw8Id+~$|5n$H&2#_d^Vpf4zaQ({&~oPU*m>9J z`?2my_4(!V*tysDaje_zAARel%DEr$y{=E~U0*(q^)>s)8fsv_bba|&*Rk{6*!N?- zDbw8edF=h!%Pt$2&t7(H`q3rg@aF!{`F{KLAOGpU{rT4)fB4<+e*TAl`k#OPskhI* z9zXx-uYdjRr|kapr=S1BKmX;gKlP$t|AEi{_xJzhcfb7d?=Qdn;q~|b?(6Z(^ABB{ z{_uy(*B>8$_+wYcdrwsT{{LO^Uw``j?|=N^Uw-??Uw``_zyA3zKmKs-Q$a6k{P@G) z{oNn`<1at{@VBEG|M7?aZ~w%f|I@F3{@0)W?O*oufBw^-|MCyN{r8`)fBR4P@$c`U M=ySRJw}1ct0tQ4BoB#j- literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/i18n/account_bank_statement_import_camt.pot b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/i18n/account_bank_statement_import_camt.pot new file mode 100644 index 0000000..9bcaad7 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/i18n/account_bank_statement_import_camt.pot @@ -0,0 +1,1920 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_bank_statement_import_camt +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:26+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Concentration" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Corporate Trade" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Credit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Debit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Pre-Authorised" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Return" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Reversal" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Settlement" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Transaction" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ARP Debit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Account Balancing" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Account Closing" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Account Management" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Account Opening" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Account Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "Additional Info: %s" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Additional Miscellaneous Credit Operations" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Additional Miscellaneous Debit Operations" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "" +"Address:\n" +"%s" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Adjustments" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Automatic Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Back Value" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Bank Cheque" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Bank Fees" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Blocked Transactions" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Bonus Issue/Capitalisation Issue" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Borrowing fee" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Branch Account Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Branch Deposit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Branch Withdrawal" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Brokerage fee" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Buy Sell Back" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "CSD Blocked Transactions" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Call on intermediate securities" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Capital Gains Distribution" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash Deposit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash Dividend" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash Letter" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash Letter Adjustment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash Management" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash Pooling" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash Withdrawal" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash in lieu" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Certified Customer Cheque" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Charge/fees" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Charges" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "Check Number: %s" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cheque" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cheque Deposit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cheque Reversal" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cheque Under Reserve" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Circular Cheque" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Clean Collection" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Client Owned Collateral" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Collateral Management" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Commission" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Commission excluding taxes" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Commission including taxes" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Commodities" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Compensation/Claims" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Consumer Loans" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Controlled Disbursement" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Conversion" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Corporate Action" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Corporate Own Account Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Corporate Rebate" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Corporate mark broker owned" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Corporate mark client owned" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "Counter Party: %(partner)s" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Counter Transactions" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Credit Adjustment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Credit Adjustments" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Credit Card Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Credit Transfer with agreed Commercial Information" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross Trade" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border Cash Withdrawal" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border Credit Card Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border Credit Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border Direct Debit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border Intra Company Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border Payroll/Salary Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border Standing Order" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Crossed Cheque" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Custody" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Custody Collection" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Customer Card Transactions" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Debit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Debit Adjustments" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Decrease in Value" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Delivery" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Deposit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Deposit/Contribution" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Depositary Receipt Issue" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Derivatives" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Direct Debit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Direct Debit Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Direct Debit under reserve" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Discounted Draft" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Dishonoured/Unpaid Draft" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Dividend Option" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Dividend Reinvestment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Documentary Collection" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Documentary Credit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Domestic Credit Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Draft Maturity Change" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Drafts/BillOfOrders" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Drawdown" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Drawing" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Dutch Auction" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "End to end ID: %s" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "Entry Info: %s" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Equity Premium Reserve" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Equity mark broker owned" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Equity mark client owned" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Exchange" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Exchange Rate Adjustment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Exchange Traded" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Exchange Traded CCP" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Exchange Traded Non-CCP" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Extended Domain" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "External Account Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Factor Update" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Fees" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Fees, Commission , Taxes, Charges and Interest" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Final Maturity" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Final Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Financial Institution Credit Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Financial Institution Direct Debit Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Financial Institution Own Account Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Fixed Deposit Interest Amount" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Fixed Term Deposits" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Fixed Term Loans" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Float adjustment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Foreign Cheque" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Foreign Cheque Under Reserve" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Foreign Currency Deposit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Foreign Currency Withdrawal" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Foreign Exchange" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Forwards" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Forwards broker owned collateral" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Forwards client owned collateral" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Freeze of funds" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Full Call / Early Redemption" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Future Variation Margin" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Futures" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Futures Commission" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Futures Residual Amount" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Guarantees" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Inspeci/Share Exchange" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "Instruction ID: %s" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Interest" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Interest Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Interest Payment with Principle" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Internal Account Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Internal Book Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Intra Company Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Invoice Accepted with Differed Due Date" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Issued Cash Concentration Transactions" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Issued Cheques" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Issued Credit Transfers" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Issued Direct Debits" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Issued Real Time Credit Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#: model:ir.model,name:odex30_account_bank_statement_import_camt.model_account_journal +msgid "Journal" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Lack" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Lending Broker Owned Cash Collateral" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Lending Client Owned Cash Collateral" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Lending income" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Liquidation Dividend / Liquidation Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Listed Derivatives – Futures" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Listed Derivatives – Options" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Loans, Deposits & Syndications" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Lockbox Transactions" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Management Fees" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "Mandate ID: %s" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Margin Payments" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Margin client owned cash collateral" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Merchant Card Transactions" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Merger" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Miscellaneous Credit Operations" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Miscellaneous Debit Operations" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Miscellaneous Deposit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Miscellaneous Securities Operations" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Mixed Deposit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Mortgage Loans" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Netting" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "" +"No exchange rate was found to convert an amount into the currency of the " +"journal" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Non Deliverable" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Non Settled" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Non Syndicated" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Non Taxable commissions" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Non-Presented Circular Cheque" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Not available" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Notice Deposits" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Notice Loans" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC CCP" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC Derivatives – Bonds" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC Derivatives – Credit Derivatives" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC Derivatives – Equity" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC Derivatives – Interest Rates" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC Derivatives – Structured Exotic Derivatives" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC Derivatives – Swaps" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC Non-CCP" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Odd Lot Sale/Purchase" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "One-Off Direct Debit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Open Cheque" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Opening & Closing" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Option broker owned collateral" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Option client owned collateral" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Options" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Order Cheque" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Other" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Overdraft" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Overdraft Charge" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Pair-Off" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Partial Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Partial Redemption Without Reduction of Nominal Value" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Partial Redemption with reduction of nominal value" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Payments" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Payroll/Salary Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Placement" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "" +"Please check the currency on your bank journal.\n" +"No statements in currency %s were found in this CAMT file." +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "" +"Please set the IBAN account on your bank journal.\n" +"\n" +"This CAMT file is targeting several IBAN accounts but none match the current journal." +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Point-of-Sale (POS) Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Point-of-Sale (POS) Payment - Debit Card" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Portfolio Move" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Posting Error" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Pre-Authorised Direct Debit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Precious Metal" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Principal Pay-down/pay-up" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Principal Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Priority Credit Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Priority Issue" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Put Redemption" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Received Cash Concentration Transactions" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Received Cheques" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Received Credit Transfers" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Received Direct Debits" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Received Real Time Credit Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Redemption" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Redemption Asset Allocation" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Redemption Withdrawing Plan" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reimbursements" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Renewal" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Repayment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Repo" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Repurchase offer/Issuer Bid/Reverse Rights." +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reset Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reversal due to Payment Cancellation Request" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reversal due to Payment Return/reimbursement of a Credit Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reversal due to Payment Reversal" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reversal due to Return/Unpaid Direct Debit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reversal due to a Payment Cancellation Request" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reverse Repo" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Rights Issue/Subscription Rights/Rights Offer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "SEPA B2B Direct Debit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "SEPA Core Direct Debit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "SEPA Credit Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Same Day Value Credit Transfer" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Securities" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Securities Borrowing" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Securities Lending" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Sell Buy Back" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Settlement" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Settlement after collection" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Settlement against bank guarantee" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Settlement at Maturity" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Settlement of Sight Export document" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Settlement of Sight Import document" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Settlement under reserve" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Smart-Card Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Spots" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Stamp duty" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Stand-By Letter Of Credit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Standing Order" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Subscription" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Subscription Asset Allocation" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Subscription Savings Plan" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Swap Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Swap broker owned collateral" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Swaps" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Sweep" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Sweeping" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Switch" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Syndicated" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Syndications" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "TBA closing" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Tax Reclaim" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Taxes" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Tender" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Topping" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Trade" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Trade Services" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Trade, Clearing and Settlement" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Transaction Fees" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "Transaction ID: %s" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Transfer In" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Transfer Out" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Travellers Cheques Deposit" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Travellers Cheques Withdrawal" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Treasury Tax And Loan Service" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Triparty Repo" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Triparty Reverse Repo" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Turnaround" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Underwriting Commission" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Unpaid Card Transaction" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Unpaid Cheque" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Unpaid Foreign Cheque" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Upfront Payment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Value Date" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Warrant Exercise/Warrant Conversion" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Withdrawal/distribution" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Withholding Tax" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "YTD Adjustment" +msgstr "" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Zero Balancing" +msgstr "" diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/i18n/ar.po b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/i18n/ar.po new file mode 100644 index 0000000..05dd499 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/i18n/ar.po @@ -0,0 +1,1932 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_bank_statement_import_camt +# +# Translators: +# Wil Odoo, 2024 +# Malaz Abuidris , 2025 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:43+0000\n" +"Last-Translator: Malaz Abuidris , 2025\n" +"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Concentration" +msgstr "تركيز غرفة المقاصة الآلية (ACH) " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Corporate Trade" +msgstr "تجارة الشركات عن طريق غرفة المقاصة الآلية (ACH) " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Credit" +msgstr "رصيد غرفة المقاصة الآلية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Debit" +msgstr "خصم غرفة المقاصة الآلية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Pre-Authorised" +msgstr "تفويض مسبق لغرفة المقاصة الآلية (ACH)" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Return" +msgstr "عائد غرفة المقاصة الآلية (ACH) " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Reversal" +msgstr "عكس معاملة في غرفة المقاصة الآلية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Settlement" +msgstr "تسوية غرفة المقاصة الآلية (ACH) " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ACH Transaction" +msgstr "معاملة غرفة المقاصة الآلية (ACH) " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "ARP Debit" +msgstr "خصم النسبة المئوية السنوية" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Account Balancing" +msgstr "موازنة الحساب" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Account Closing" +msgstr "إغلاق الحساب" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Account Management" +msgstr "إدارة الحساب" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Account Opening" +msgstr "فتح الحساب" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Account Transfer" +msgstr "تحويل لحساب" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "Additional Info: %s" +msgstr "معلومات إضافية:%s" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Additional Miscellaneous Credit Operations" +msgstr "عمليات الائتمان المتنوعة الإضافية" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Additional Miscellaneous Debit Operations" +msgstr "عمليات الخصم المتنوعة الإضافية" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "" +"Address:\n" +"%s" +msgstr "" +"العنوان:\n" +"%s " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Adjustments" +msgstr "التعديلات" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Automatic Transfer" +msgstr "التحويل التلقائي" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Back Value" +msgstr "استحقاق سابق " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Bank Cheque" +msgstr "شيك بنكي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Bank Fees" +msgstr "رسوم بنكية" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Blocked Transactions" +msgstr "المعاملات المحظورة" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Bonus Issue/Capitalisation Issue" +msgstr "إصدار المكافأة / قضية الرسملة" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Borrowing fee" +msgstr "رسوم الاقتراض" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Branch Account Transfer" +msgstr "تحويل الحساب إلى الفرع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Branch Deposit" +msgstr "إيداع في الفرع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Branch Withdrawal" +msgstr "السحب من الفرع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Brokerage fee" +msgstr "رسوم سمسرة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Buy Sell Back" +msgstr "إعادة الشراء/ البيع" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "CSD Blocked Transactions" +msgstr "المعاملات المحظورة للإيداع المركزي للأوراق المالية (CSD) " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Call on intermediate securities" +msgstr "استدعاء الأوراق المالية الوسيطة" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Capital Gains Distribution" +msgstr "توزيع أرباح رأس المال" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash Deposit" +msgstr "الإيداع النقدي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash Dividend" +msgstr "توزيعات الأرباح المالية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash Letter" +msgstr "خطاب نقدي" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash Letter Adjustment" +msgstr "تعديل خطاب نقدي" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash Management" +msgstr "إدارة النقد " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash Pooling" +msgstr "تجميع النقد" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash Withdrawal" +msgstr "السحب النقدي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cash in lieu" +msgstr "نقد بالمقابل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Certified Customer Cheque" +msgstr "شيك عميل معتمَد " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Charge/fees" +msgstr "الرسوم " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Charges" +msgstr "الرسوم " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "Check Number: %s" +msgstr "رقم الشيك: %s" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cheque" +msgstr "الشيك " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cheque Deposit" +msgstr "إيداع الشيك " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cheque Reversal" +msgstr "شيك معكوس" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cheque Under Reserve" +msgstr "شيك قيد الحجز" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Circular Cheque" +msgstr "شيك مدوّر" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Clean Collection" +msgstr "مجموعة نظيفة" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Client Owned Collateral" +msgstr "الضمانات التي يمتلكها العميل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Collateral Management" +msgstr "إدارة الضمانات " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Commission" +msgstr "العمولة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Commission excluding taxes" +msgstr "العمولة غير الشاملة للضريبة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Commission including taxes" +msgstr "العمولة الشاملة للضريبة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Commodities" +msgstr "السلع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Compensation/Claims" +msgstr "التعويضات/المطالبات " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Consumer Loans" +msgstr "قروض المستهلك " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Controlled Disbursement" +msgstr "الصرف الخاضع للرقابة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Conversion" +msgstr "التحويل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Corporate Action" +msgstr "إجراء مؤسسي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Corporate Own Account Transfer" +msgstr "تحويل الحساب الخاص بالمؤسسة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Corporate Rebate" +msgstr "خصم المؤسسة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Corporate mark broker owned" +msgstr "علامة تجارية مملوكة للسمسار " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Corporate mark client owned" +msgstr "علامة تجارية مملوكة للعميل" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "Counter Party: %(partner)s" +msgstr "الطرف المقابل: %(partner)s" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Counter Transactions" +msgstr "المعاملات المقابلة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Credit Adjustment" +msgstr "تسوية الائتمان " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Credit Adjustments" +msgstr "تسويات الائتمان " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Credit Card Payment" +msgstr "الدفع عن طريق بطاقة الائتمان " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Credit Transfer with agreed Commercial Information" +msgstr "تحويل الرصيد مع معلومات تجارية متفق عليها " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross Trade" +msgstr "التجارة العابرة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border" +msgstr "عبر الحدود " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border Cash Withdrawal" +msgstr "السحب النقدي عبر الحدود " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border Credit Card Payment" +msgstr "الدفع عن طريق البطاقة الائتمانية عبر الحدود " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border Credit Transfer" +msgstr "تحويل الرصيد عبر الحدود " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border Direct Debit" +msgstr "الخصم المباشر عبر الحدود " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border Intra Company Transfer" +msgstr "التحويل ما بين الشركات عبر الحدود " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border Payroll/Salary Payment" +msgstr "كشوفات المرتبات/دفع الراتب عبر الحدود " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Cross-Border Standing Order" +msgstr "أمر دائم عبر الحدود " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Crossed Cheque" +msgstr "شيك مشطوب " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Custody" +msgstr "عهدة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Custody Collection" +msgstr "تحصيل العهدة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Customer Card Transactions" +msgstr "معاملات بطاقة العميل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Debit" +msgstr "المدين" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Debit Adjustments" +msgstr "تعديلات الخصم " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Decrease in Value" +msgstr "انخفاض القيمة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Delivery" +msgstr "التوصيل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Deposit" +msgstr "إيداع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Deposit/Contribution" +msgstr "إيداع/مساهمة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Depositary Receipt Issue" +msgstr "إصدار إيصال إيداع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Derivatives" +msgstr "المشتقات " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Direct Debit" +msgstr "الخصم المباشر " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Direct Debit Payment" +msgstr "دفع الخصم المباشر " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Direct Debit under reserve" +msgstr "الخصم المباشر تحت الحجز " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Discounted Draft" +msgstr "مسودة الخصم " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Dishonoured/Unpaid Draft" +msgstr "كمبيالة مرفوضة / غير مدفوعة" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Dividend Option" +msgstr "خيار الأرباح " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Dividend Reinvestment" +msgstr "إعادة استثمار الأرباح " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Documentary Collection" +msgstr "المجموعة المستندية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Documentary Credit" +msgstr "الاعتمادات المستندية" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Domestic Credit Transfer" +msgstr "تحويل الرصيد المحلي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Draft Maturity Change" +msgstr "مسودة تغيير النضج" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Drafts/BillOfOrders" +msgstr "مسودات/فواتير الطلبات " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Drawdown" +msgstr "السحب" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Drawing" +msgstr "سحب" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Dutch Auction" +msgstr "Dutch Auction" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "End to end ID: %s" +msgstr "معرف طرف إلى طرف: %s " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "Entry Info: %s" +msgstr "معلومات القيد: %s " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Equity Premium Reserve" +msgstr "احتياطي أقساط حقوق الملكية" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Equity mark broker owned" +msgstr "علامة سهم مملوكة للسمسار " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Equity mark client owned" +msgstr "علامة سهم مملوكة للعميل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Exchange" +msgstr "تبادل" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Exchange Rate Adjustment" +msgstr "تعديل سعر الصرف" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Exchange Traded" +msgstr "متداولة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Exchange Traded CCP" +msgstr "CCP المؤشرات المتداولة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Exchange Traded Non-CCP" +msgstr "المؤشرات المتداولة لغير CCP " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Extended Domain" +msgstr "نطاق موسّع" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "External Account Transfer" +msgstr "تحويل حساب خارجي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Factor Update" +msgstr "تحديث العامل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Fees" +msgstr "رسوم" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Fees, Commission , Taxes, Charges and Interest" +msgstr "الرسوم والعمولات والضرائب والتكاليف والفوائد " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Final Maturity" +msgstr "تاريخ الاستحقاق النهائي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Final Payment" +msgstr "الدفع النهائي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Financial Institution Credit Transfer" +msgstr "تحويل الرصيد للمنشأة المالية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Financial Institution Direct Debit Payment" +msgstr "دفع الخصم المباشر للمنشأة المالية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Financial Institution Own Account Transfer" +msgstr "التحويل للحساب الشخصي للمنشأة المالية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Fixed Deposit Interest Amount" +msgstr "إجمالي نسبة الفائدة الثابتة من الإيداع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Fixed Term Deposits" +msgstr "الإيداعات بسعر فائدة ثابت " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Fixed Term Loans" +msgstr "قروض بسعر فائدة ثابت " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Float adjustment" +msgstr "تعديل الفاصلة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Foreign Cheque" +msgstr "شيك أجنبي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Foreign Cheque Under Reserve" +msgstr "شيك أجنبي تحت الحجز " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Foreign Currency Deposit" +msgstr "إيداع العملة الأجنبية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Foreign Currency Withdrawal" +msgstr "سحب العملة الأجنبية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Foreign Exchange" +msgstr "تحويل العملة الأجنبية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Forwards" +msgstr "العقود الآجلة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Forwards broker owned collateral" +msgstr "ضمانات العقود الآجلة المملوكة للسمسار " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Forwards client owned collateral" +msgstr "ضمانات العقود الآجلة المملوكة للعميل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Freeze of funds" +msgstr "تجميد الأموال" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Full Call / Early Redemption" +msgstr "الدفع قبل تاريخ الاستحقاق / التحصيل قبل تاريخ الاستحقاق " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Future Variation Margin" +msgstr "هامش الاختلاف المستقبلي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Futures" +msgstr "العقود الآجلة" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Futures Commission" +msgstr "عمولة العقود الآجلة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Futures Residual Amount" +msgstr "المبالغ المتبقية من العقود الآجلة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Guarantees" +msgstr "ضمانات" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Inspeci/Share Exchange" +msgstr "Inspeci/Share Exchange" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "Instruction ID: %s" +msgstr "معرف التعليمات: %s" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Interest" +msgstr "الفائدة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Interest Payment" +msgstr "دفع الفوائد " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Interest Payment with Principle" +msgstr "دفع الفوائد مع المبلغ المتفق عليه " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Internal Account Transfer" +msgstr "تحويل الحساب الداخلي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Internal Book Transfer" +msgstr "تحويل داخلي من حساب إلى آخر " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Intra Company Transfer" +msgstr "التحويل داخل الشركة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Invoice Accepted with Differed Due Date" +msgstr "تم قبول الفاتورة بتاريخ استحقاق مختلف " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Issued Cash Concentration Transactions" +msgstr "معاملات التركيز النقدي التي تم إصدارها " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Issued Cheques" +msgstr "الشيكات المصدرة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Issued Credit Transfers" +msgstr "تحويلات الرصيد المصدرة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Issued Direct Debits" +msgstr "الخصومات المباشرة المصدرة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Issued Real Time Credit Transfer" +msgstr "عملية تحويل الرصيد في الوقت الفعلي المصدرة " + +#. module: odex30_account_bank_statement_import_camt +#: model:ir.model,name:odex30_account_bank_statement_import_camt.model_account_journal +msgid "Journal" +msgstr "دفتر اليومية" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Lack" +msgstr "قلة" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Lending Broker Owned Cash Collateral" +msgstr "إقراض الضمانات النقدية المملوكة للسمسار " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Lending Client Owned Cash Collateral" +msgstr "إقراض الضمانات النقدية المملوكة للعميل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Lending income" +msgstr "دخل الإقراض " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Liquidation Dividend / Liquidation Payment" +msgstr "توزيعات أرباح التصفية / مدفوعات التصفية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Listed Derivatives – Futures" +msgstr "المشتقات المسجلة – العقود الآجلة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Listed Derivatives – Options" +msgstr "المشتقات المسجلة – الخيارات " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Loans, Deposits & Syndications" +msgstr "القروض، الإيداعات والقروض المشتركة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Lockbox Transactions" +msgstr "معاملات صندوق الأمانات " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Management Fees" +msgstr "رسوم إدارية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "Mandate ID: %s" +msgstr "معرف التوكيل: %s " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Margin Payments" +msgstr "مدفوعات الهوامش " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Margin client owned cash collateral" +msgstr "الضمانات النقدية للهامش المملوكة للعميل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Merchant Card Transactions" +msgstr "معاملات بطاقة التاجر " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Merger" +msgstr "اندماج " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Miscellaneous Credit Operations" +msgstr "العمليات الائتمانية المتنوعة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Miscellaneous Debit Operations" +msgstr "عمليات الخصم المتنوعة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Miscellaneous Deposit" +msgstr "إيداع متنوعات " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Miscellaneous Securities Operations" +msgstr "عمليات الأوراق المالية المتنوعة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Mixed Deposit" +msgstr "إيداع مختلط " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Mortgage Loans" +msgstr "قروض التمويل العقاري " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Netting" +msgstr "حساب الصافي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "" +"No exchange rate was found to convert an amount into the currency of the " +"journal" +msgstr "لم يتم العثور على سعر صرف لتحويل مبلغ إلى عملة دفتر اليومية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Non Deliverable" +msgstr "غير قابل للتوصيل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Non Settled" +msgstr "غير مسوى " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Non Syndicated" +msgstr "غير مشتركة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Non Taxable commissions" +msgstr "العمولات غير الخاضعة للضريبة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Non-Presented Circular Cheque" +msgstr "شيك دائري " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Not available" +msgstr "غير متاح" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Notice Deposits" +msgstr "إيداعات الإخطار" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Notice Loans" +msgstr "القروض التي تتطلب إخطاراً " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC" +msgstr "التداول خارج البورصة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC CCP" +msgstr "OTC CCP" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC Derivatives – Bonds" +msgstr "مشتقات التداول خارج البورصة - الصكوك " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC Derivatives – Credit Derivatives" +msgstr "الصكوك الاشتقاقية الخارجة عن البورصة – المشتقات الائتمانية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC Derivatives – Equity" +msgstr "مشتقات التداول خارج البورصة - رأس المال " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC Derivatives – Interest Rates" +msgstr "الصكوك الاشتقاقية الخارجة عن البورصة – نسبة الفوائد " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC Derivatives – Structured Exotic Derivatives" +msgstr "الصكوك الاشتقاقية الخارجة عن البورصة – المشتقات الغريبة المنظمة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC Derivatives – Swaps" +msgstr "مشتقات التداول خارج البورصة - السواب " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "OTC Non-CCP" +msgstr "التداول خارج البورصة للطرف المقابل غير المركزي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Odd Lot Sale/Purchase" +msgstr "مجموعة بيع/شراء شاذة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "One-Off Direct Debit" +msgstr "الخصم المباشر على دفعة واحدة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Open Cheque" +msgstr "شيك مفتوح " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Opening & Closing" +msgstr "الفتح والإقفال " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Option broker owned collateral" +msgstr "ضمانات العقود الآجلة المملوكة لوسيط الخيارات " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Option client owned collateral" +msgstr "ضمانات العقود الآجلة المملوكة لعميل الخيارات " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Options" +msgstr "الخيارات" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Order Cheque" +msgstr "شيك الطلب " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Other" +msgstr "غير ذلك" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Overdraft" +msgstr "السحب الزائد " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Overdraft Charge" +msgstr "رسوم السحب الزائد " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Pair-Off" +msgstr "إقران " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Partial Payment" +msgstr "الدفع الجزئي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Partial Redemption Without Reduction of Nominal Value" +msgstr "الاسترداد الجزئي دون تخفيض القيمة الاسمية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Partial Redemption with reduction of nominal value" +msgstr "الاسترداد الجزئي مع تخفيض القيمة الاسمية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Payments" +msgstr "الدفعات" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Payroll/Salary Payment" +msgstr "كشوف المرتبات/دفع المرتبات " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Placement" +msgstr "تحديد مستوى" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "" +"Please check the currency on your bank journal.\n" +"No statements in currency %s were found in this CAMT file." +msgstr "" +"يرجى التحقق من العملة في دفتر يومية بنكك. \n" +"لم يتم العثور على كشوفات حساب بالعملة %s في ملف CAMT هذا. " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "" +"Please set the IBAN account on your bank journal.\n" +"\n" +"This CAMT file is targeting several IBAN accounts but none match the current journal." +msgstr "" +"يرجى تعيين حساب IBAN في دفتر يومية بنكك. \n" +"\n" +"يستهدف ملف CAMT عدة حسابات IBAN ولكن لا يطابق أي منها دفتر اليومية الحالي. " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Point-of-Sale (POS) Payment" +msgstr "مدفوعات نقطة البيع (POS) " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Point-of-Sale (POS) Payment - Debit Card" +msgstr "مدفوعات نقطة البيع (POS) - بطاقة الخصم " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Portfolio Move" +msgstr "حركة المحفظة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Posting Error" +msgstr "خطأ في الترحيل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Pre-Authorised Direct Debit" +msgstr "الخصم المباشر المصرح له مسبقاً " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Precious Metal" +msgstr "المعادن الثمينة" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Principal Pay-down/pay-up" +msgstr "Principal Pay-down/pay-up" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Principal Payment" +msgstr "مدفوعات أصل الدين " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Priority Credit Transfer" +msgstr "تحويل رصيد ذو أولوية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Priority Issue" +msgstr "مشكلة في الأولوية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Put Redemption" +msgstr "الاستبدال " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Received Cash Concentration Transactions" +msgstr "معاملات التركيز النقدي التي تم استلامها " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Received Cheques" +msgstr "الشيكات المستلمة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Received Credit Transfers" +msgstr "تحويلات الرصيد المستلمة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Received Direct Debits" +msgstr "الخصم المباشر الذي تم استلامه " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Received Real Time Credit Transfer" +msgstr "عملية تحويل الرصيد في الوقت الفعلي التي تم استلامها " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Redemption" +msgstr "استبدال " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Redemption Asset Allocation" +msgstr "Redemption Asset Allocation" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Redemption Withdrawing Plan" +msgstr "Redemption Withdrawing Plan" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reimbursements" +msgstr "إعادة الأموال " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Renewal" +msgstr "التجديد" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Repayment" +msgstr "إعادة الدفع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Repo" +msgstr "تقرير " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Repurchase offer/Issuer Bid/Reverse Rights." +msgstr "عرض إعادة الشراء/عطاء المُصدِر/ الحقوق المعكوسة. " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reset Payment" +msgstr "إعادة الدفع" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reversal due to Payment Cancellation Request" +msgstr "العكس نظراً لطلب إلغاء الدفع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reversal due to Payment Return/reimbursement of a Credit Transfer" +msgstr "العكس بسبب إرجاع المدفوعات/تعويض الأموال لتحويل الرصيد " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reversal due to Payment Reversal" +msgstr "العكس بسبب عكس الدفع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reversal due to Return/Unpaid Direct Debit" +msgstr "العكس بسبب الإرجاع/الخصم المباشر غير المدفوع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reversal due to a Payment Cancellation Request" +msgstr "العكس نظراً لطلب إلغاء الدفع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Reverse Repo" +msgstr "عكس التقرير " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Rights Issue/Subscription Rights/Rights Offer" +msgstr "إصدار الحقوق/حقوق الاشتراك/عرض الحقوق " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "SEPA B2B Direct Debit" +msgstr "خصم SEPA المباشر بين الشركات " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "SEPA Core Direct Debit" +msgstr "خصم SEPA المباشر الأساسي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "SEPA Credit Transfer" +msgstr "تحويل الرصيد من خلال SEPA " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Same Day Value Credit Transfer" +msgstr "تحويل الرصيد بقيمة نفس اليوم " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Securities" +msgstr "ضمانات" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Securities Borrowing" +msgstr "اقتراض الأوراق المالية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Securities Lending" +msgstr "إقراض الأوراق المالية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Sell Buy Back" +msgstr "بيع الشراء مجدداً " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Settlement" +msgstr "التسوية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Settlement after collection" +msgstr "التسوية بعد التحصيل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Settlement against bank guarantee" +msgstr "التسوية مقابل ضمان البنك " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Settlement at Maturity" +msgstr "التسوية عند الوصول لتاريخ الاستحقاق " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Settlement of Sight Export document" +msgstr "تسوية وثيقة التصدير فورياً " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Settlement of Sight Import document" +msgstr "تسوية وثيقة الاستيراد فورياً " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Settlement under reserve" +msgstr "التسوية تحت الحجز " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Smart-Card Payment" +msgstr "الدفع عن طريق البطاقة الذكية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Spots" +msgstr "Spots" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Stamp duty" +msgstr "رسوم الطابع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Stand-By Letter Of Credit" +msgstr "رسالة الاعتماد الاحتياطية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Standing Order" +msgstr "أمر دائم " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Subscription" +msgstr "الاشتراك" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Subscription Asset Allocation" +msgstr "تخصيص أصول الاشتراك " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Subscription Savings Plan" +msgstr "خطة التوفير في الاشتراك " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Swap Payment" +msgstr "الدفع عن طريق Swap " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Swap broker owned collateral" +msgstr "ضمانات Swap المملوكة للسمسار " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Swaps" +msgstr "Swaps" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Sweep" +msgstr "مسح " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Sweeping" +msgstr "المسح " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Switch" +msgstr "تبديل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Syndicated" +msgstr "قرض مشترك " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Syndications" +msgstr "القروض المشتركة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "TBA closing" +msgstr "إغلاق TBA " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Tax Reclaim" +msgstr "استرداد الضريبة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Taxes" +msgstr "الضرائب" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Tender" +msgstr "مناقصة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Topping" +msgstr "Topping" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Trade" +msgstr "تداول " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Trade Services" +msgstr "الخدمات التجارية " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Trade, Clearing and Settlement" +msgstr "التجارة والمقاصة والتسوية" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Transaction Fees" +msgstr "رسوم المعاملة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/models/account_journal.py:0 +msgid "Transaction ID: %s" +msgstr "معرف المعاملة: %s " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Transfer In" +msgstr "التحويل إلى الداخل " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Transfer Out" +msgstr "التحويل إلى الخارج " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Travellers Cheques Deposit" +msgstr "إيداع شيكات المسافرين " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Travellers Cheques Withdrawal" +msgstr "سحب شيكات المسافرين " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Treasury Tax And Loan Service" +msgstr "ضريبة الخزينة وخدمات القروض " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Triparty Repo" +msgstr "تقرير ثلاثي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Triparty Reverse Repo" +msgstr "تقرير ثلاثي عكسي " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Turnaround" +msgstr "تحول " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Underwriting Commission" +msgstr "عمولة الاكتتاب " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Unpaid Card Transaction" +msgstr "معاملة البطاقة غير المدفوعة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Unpaid Cheque" +msgstr "شيك غير مدفوع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Unpaid Foreign Cheque" +msgstr "شيك أجنبي غير مدفوع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Upfront Payment" +msgstr "دفع مقدم " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Value Date" +msgstr "تاريخ القيمة " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Warrant Exercise/Warrant Conversion" +msgstr "Warrant Exercise/Warrant Conversion" + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Withdrawal/distribution" +msgstr "السحب/التوزيع " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Withholding Tax" +msgstr "ضريبة الاحتجاز " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "YTD Adjustment" +msgstr "تعديل العام حتى تاريخه " + +#. module: odex30_account_bank_statement_import_camt +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_camt/lib/camt.py:0 +msgid "Zero Balancing" +msgstr "Zero Balancing" diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/lib/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/lib/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/lib/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..451ebc96a9cc699968633d7dd958c42fe16863f9 GIT binary patch literal 260 zcmZ3^%ge<81lK2oW`gL)AOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4Tnuj%?3`MIh3 zi8!+la#Y5C0i=v9eCne@(#}}6*mZavU=9R=}<`(1^mBc3}=9cK^WG3my$7kkc smc+;F6;%G>u*uC&Da}c>D`Ew@6XcU(ejxFInURt40|SgGVg`x<06M2jSO5S3 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/lib/__pycache__/camt.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/lib/__pycache__/camt.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b204f0a8d8869a3dee0e4faef67ada22d6c1e448 GIT binary patch literal 52512 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 Dgd#`t literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/lib/camt.py b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/lib/camt.py new file mode 100644 index 0000000..a829cd4 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/lib/camt.py @@ -0,0 +1,806 @@ + +import math +import re +from functools import partial + +from odoo.exceptions import ValidationError +from odoo.tools import float_compare + +# keep code as-is but do not translate, +# the language is not known in this context +_lt = lambda x: x # noqa: E731 + + +# Codes from the updated document of 30 june 2017 +# pylint: disable=duplicate-key +codes = { + # ExternalBankTransactionDomain1Code ####################################### + 'PMNT': _lt('Payments'), + 'CAMT': _lt('Cash Management'), + 'DERV': _lt('Derivatives'), + 'LDAS': _lt('Loans, Deposits & Syndications'), + 'FORX': _lt('Foreign Exchange'), + 'PMET': _lt('Precious Metal'), + 'CMDT': _lt('Commodities'), + 'TRAD': _lt('Trade Services'), + 'SECU': _lt('Securities'), + 'ACMT': _lt('Account Management'), + 'XTND': _lt('Extended Domain'), + # ExternalBankTransactionFamily1Code ####################################### + 'RCDT': _lt('Received Credit Transfers'), # Payments + 'ICDT': _lt('Issued Credit Transfers'), + 'RCCN': _lt('Received Cash Concentration Transactions'), + 'ICCN': _lt('Issued Cash Concentration Transactions'), + 'RDDT': _lt('Received Direct Debits'), + 'IDDT': _lt('Issued Direct Debits'), + 'RCHQ': _lt('Received Cheques'), + 'ICHQ': _lt('Issued Cheques'), + 'CCRD': _lt('Customer Card Transactions'), + 'MCRD': _lt('Merchant Card Transactions'), + 'LBOX': _lt('Lockbox Transactions'), + 'CNTR': _lt('Counter Transactions'), + 'DRFT': _lt('Drafts/BillOfOrders'), + 'RRCT': _lt('Received Real Time Credit Transfer'), + 'IRCT': _lt('Issued Real Time Credit Transfer'), + 'CAPL': _lt('Cash Pooling'), # Cash Management + 'ACCB': _lt('Account Balancing'), + 'OCRD': _lt('OTC Derivatives – Credit Derivatives'), # Derivatives + 'OIRT': _lt('OTC Derivatives – Interest Rates'), + 'OEQT': _lt('OTC Derivatives – Equity'), + 'OBND': _lt('OTC Derivatives – Bonds'), + 'OSED': _lt('OTC Derivatives – Structured Exotic Derivatives'), + 'OSWP': _lt('OTC Derivatives – Swaps'), + 'LFUT': _lt('Listed Derivatives – Futures'), + 'LOPT': _lt('Listed Derivatives – Options'), + 'FTLN': _lt('Fixed Term Loans'), # Loans, Deposits & Syndications + 'NTLN': _lt('Notice Loans'), + 'FTDP': _lt('Fixed Term Deposits'), + 'NTDP': _lt('Notice Deposits'), + 'MGLN': _lt('Mortgage Loans'), + 'CSLN': _lt('Consumer Loans'), + 'SYDN': _lt('Syndications'), + 'SPOT': _lt('Spots'), # Foreign Exchange + 'FWRD': _lt('Forwards'), + 'SWAP': _lt('Swaps'), + 'FTUR': _lt('Futures'), + 'NDFX': _lt('Non Deliverable'), + 'SPOT': _lt('Spots'), # Precious Metal + 'FTUR': _lt('Futures'), + 'OPTN': _lt('Options'), + 'DLVR': _lt('Delivery'), + 'SPOT': _lt('Spots'), # Commodities + 'FTUR': _lt('Futures'), + 'OPTN': _lt('Options'), + 'DLVR': _lt('Delivery'), + 'LOCT': _lt('Stand-By Letter Of Credit'), # Trade Services + 'DCCT': _lt('Documentary Credit'), + 'CLNC': _lt('Clean Collection'), + 'DOCC': _lt('Documentary Collection'), + 'GUAR': _lt('Guarantees'), + 'SETT': _lt('Trade, Clearing and Settlement'), # Securities + 'NSET': _lt('Non Settled'), + 'BLOC': _lt('Blocked Transactions'), + 'OTHB': _lt('CSD Blocked Transactions'), + 'COLL': _lt('Collateral Management'), + 'CORP': _lt('Corporate Action'), + 'CUST': _lt('Custody'), + 'COLC': _lt('Custody Collection'), + 'LACK': _lt('Lack'), + 'CASH': _lt('Miscellaneous Securities Operations'), + 'OPCL': _lt('Opening & Closing'), # Account Management + 'ACOP': _lt('Additional Miscellaneous Credit Operations'), + 'ADOP': _lt('Additional Miscellaneous Debit Operations'), + # ExternalBankTransactionSubFamily1Code #################################### + # Generic Sub-Families + 'FEES': _lt('Fees'), # Miscellaneous Credit Operations + 'COMM': _lt('Commission'), + 'COME': _lt('Commission excluding taxes'), + 'COMI': _lt('Commission including taxes'), + 'COMT': _lt('Non Taxable commissions'), + 'TAXE': _lt('Taxes'), + 'CHRG': _lt('Charges'), + 'INTR': _lt('Interest'), + 'RIMB': _lt('Reimbursements'), + 'ADJT': _lt('Adjustments'), + 'FEES': _lt('Fees'), # Miscellaneous Debit Operations + 'COMM': _lt('Commission'), + 'COME': _lt('Commission excluding taxes'), + 'COMI': _lt('Commission including taxes'), + 'COMT': _lt('Non Taxable commissions'), + 'TAXE': _lt('Taxes'), + 'CHRG': _lt('Charges'), + 'INTR': _lt('Interest'), + 'RIMB': _lt('Reimbursements'), + 'ADJT': _lt('Adjustments'), + 'IADD': _lt('Invoice Accepted with Differed Due Date'), + 'FEES': _lt('Fees'), # Generic Sub-Families + 'COMM': _lt('Commission'), + 'COME': _lt('Commission excluding taxes'), + 'COMI': _lt('Commission including taxes'), + 'COMT': _lt('Non Taxable commissions'), + 'TAXE': _lt('Taxes'), + 'CHRG': _lt('Charges'), + 'INTR': _lt('Interest'), + 'RIMB': _lt('Reimbursements'), + 'DAJT': _lt('Credit Adjustments'), + 'CAJT': _lt('Debit Adjustments'), + # Payments Sub-Families + 'BOOK': _lt('Internal Book Transfer'), # Received Credit Transfer + 'STDO': _lt('Standing Order'), + 'XBST': _lt('Cross-Border Standing Order'), + 'ESCT': _lt('SEPA Credit Transfer'), + 'DMCT': _lt('Domestic Credit Transfer'), + 'XBCT': _lt('Cross-Border Credit Transfer'), + 'VCOM': _lt('Credit Transfer with agreed Commercial Information'), + 'FICT': _lt('Financial Institution Credit Transfer'), + 'PRCT': _lt('Priority Credit Transfer'), + 'SALA': _lt('Payroll/Salary Payment'), + 'XBSA': _lt('Cross-Border Payroll/Salary Payment'), + 'SDVA': _lt('Same Day Value Credit Transfer'), + 'RPCR': _lt('Reversal due to Payment Cancellation Request'), + 'RRTN': _lt('Reversal due to Payment Return/reimbursement of a Credit Transfer'), + 'AUTT': _lt('Automatic Transfer'), + 'ATXN': _lt('ACH Transaction'), + 'ACOR': _lt('ACH Corporate Trade'), + 'APAC': _lt('ACH Pre-Authorised'), + 'ASET': _lt('ACH Settlement'), + 'ARET': _lt('ACH Return'), + 'AREV': _lt('ACH Reversal'), + 'ACDT': _lt('ACH Credit'), + 'ADBT': _lt('ACH Debit'), + 'TTLS': _lt('Treasury Tax And Loan Service'), + 'BOOK': _lt('Internal Book Transfer'), # Issued Credit Transfer + 'STDO': _lt('Standing Order'), + 'XBST': _lt('Cross-Border Standing Order'), + 'ESCT': _lt('SEPA Credit Transfer'), + 'DMCT': _lt('Domestic Credit Transfer'), + 'XBCT': _lt('Cross-Border Credit Transfer'), + 'FICT': _lt('Financial Institution Credit Transfer'), + 'PRCT': _lt('Priority Credit Transfer'), + 'VCOM': _lt('Credit Transfer with agreed Commercial Information'), + 'SALA': _lt('Payroll/Salary Payment'), + 'XBSA': _lt('Cross-Border Payroll/Salary Payment'), + 'RPCR': _lt('Reversal due to Payment Cancellation Request'), + 'RRTN': _lt('Reversal due to Payment Return/reimbursement of a Credit Transfer'), + 'SDVA': _lt('Same Day Value Credit Transfer'), + 'AUTT': _lt('Automatic Transfer'), + 'ATXN': _lt('ACH Transaction'), + 'ACOR': _lt('ACH Corporate Trade'), + 'APAC': _lt('ACH Pre-Authorised'), + 'ASET': _lt('ACH Settlement'), + 'ARET': _lt('ACH Return'), + 'AREV': _lt('ACH Reversal'), + 'ACDT': _lt('ACH Credit'), + 'ADBT': _lt('ACH Debit'), + 'TTLS': _lt('Treasury Tax And Loan Service'), + 'COAT': _lt('Corporate Own Account Transfer'), # Received Cash Concentration + 'ICCT': _lt('Intra Company Transfer'), + 'XICT': _lt('Cross-Border Intra Company Transfer'), + 'FIOA': _lt('Financial Institution Own Account Transfer'), + 'BACT': _lt('Branch Account Transfer'), + 'ACON': _lt('ACH Concentration'), + 'COAT': _lt('Corporate Own Account Transfer'), # Issued Cash Concentration + 'ICCT': _lt('Intra Company Transfer'), + 'XICT': _lt('Cross-Border Intra Company Transfer'), + 'FIOA': _lt('Financial Institution Own Account Transfer'), + 'BACT': _lt('Branch Account Transfer'), + 'ACON': _lt('ACH Concentration'), + 'PMDD': _lt('Direct Debit'), # Received Direct Debit + 'URDD': _lt('Direct Debit under reserve'), + 'ESDD': _lt('SEPA Core Direct Debit'), + 'BBDD': _lt('SEPA B2B Direct Debit'), + 'XBDD': _lt('Cross-Border Direct Debit'), + 'OODD': _lt('One-Off Direct Debit'), + 'PADD': _lt('Pre-Authorised Direct Debit'), + 'FIDD': _lt('Financial Institution Direct Debit Payment'), + 'RCDD': _lt('Reversal due to a Payment Cancellation Request'), + 'UPDD': _lt('Reversal due to Return/Unpaid Direct Debit'), + 'PRDD': _lt('Reversal due to Payment Reversal'), + 'PMDD': _lt('Direct Debit Payment'), # Issued Direct Debit + 'URDD': _lt('Direct Debit under reserve'), + 'ESDD': _lt('SEPA Core Direct Debit'), + 'BBDD': _lt('SEPA B2B Direct Debit'), + 'OODD': _lt('One-Off Direct Debit'), + 'XBDD': _lt('Cross-Border Direct Debit'), + 'PADD': _lt('Pre-Authorised Direct Debit'), + 'FIDD': _lt('Financial Institution Direct Debit Payment'), + 'RCDD': _lt('Reversal due to a Payment Cancellation Request'), + 'UPDD': _lt('Reversal due to Return/Unpaid Direct Debit'), + 'PRDD': _lt('Reversal due to Payment Reversal'), + 'CCHQ': _lt('Cheque'), # Received Cheque + 'URCQ': _lt('Cheque Under Reserve'), + 'UPCQ': _lt('Unpaid Cheque'), + 'CQRV': _lt('Cheque Reversal'), + 'CCCH': _lt('Certified Customer Cheque'), + 'CLCQ': _lt('Circular Cheque'), + 'NPCC': _lt('Non-Presented Circular Cheque'), + 'CRCQ': _lt('Crossed Cheque'), + 'ORCQ': _lt('Order Cheque'), + 'OPCQ': _lt('Open Cheque'), + 'BCHQ': _lt('Bank Cheque'), + 'XBCQ': _lt('Foreign Cheque'), + 'XRCQ': _lt('Foreign Cheque Under Reserve'), + 'XPCQ': _lt('Unpaid Foreign Cheque'), + 'CDIS': _lt('Controlled Disbursement'), + 'ARPD': _lt('ARP Debit'), + 'CASH': _lt('Cash Letter'), + 'CSHA': _lt('Cash Letter Adjustment'), + 'CCHQ': _lt('Cheque'), # Issued Cheque + 'URCQ': _lt('Cheque Under Reserve'), + 'UPCQ': _lt('Unpaid Cheque'), + 'CQRV': _lt('Cheque Reversal'), + 'CCCH': _lt('Certified Customer Cheque'), + 'CLCQ': _lt('Circular Cheque'), + 'NPCC': _lt('Non-Presented Circular Cheque'), + 'CRCQ': _lt('Crossed Cheque'), + 'ORCQ': _lt('Order Cheque'), + 'OPCQ': _lt('Open Cheque'), + 'BCHQ': _lt('Bank Cheque'), + 'XBCQ': _lt('Foreign Cheque'), + 'XRCQ': _lt('Foreign Cheque Under Reserve'), + 'XPCQ': _lt('Unpaid Foreign Cheque'), + 'CDIS': _lt('Controlled Disbursement'), + 'ARPD': _lt('ARP Debit'), + 'CASH': _lt('Cash Letter'), + 'CSHA': _lt('Cash Letter Adjustment'), + 'CWDL': _lt('Cash Withdrawal'), # Customer Card Transaction + 'CDPT': _lt('Cash Deposit'), + 'XBCW': _lt('Cross-Border Cash Withdrawal'), + 'POSD': _lt('Point-of-Sale (POS) Payment - Debit Card'), + 'POSC': _lt('Credit Card Payment'), + 'XBCP': _lt('Cross-Border Credit Card Payment'), + 'SMRT': _lt('Smart-Card Payment'), + 'POSP': _lt('Point-of-Sale (POS) Payment'), # Merchant Card Transaction + 'POSC': _lt('Credit Card Payment'), + 'SMCD': _lt('Smart-Card Payment'), + 'UPCT': _lt('Unpaid Card Transaction'), + 'CDPT': _lt('Cash Deposit'), # Counter Transaction + 'CWDL': _lt('Cash Withdrawal'), + 'BCDP': _lt('Branch Deposit'), + 'BCWD': _lt('Branch Withdrawal'), + 'CHKD': _lt('Cheque Deposit'), + 'MIXD': _lt('Mixed Deposit'), + 'MSCD': _lt('Miscellaneous Deposit'), + 'FCDP': _lt('Foreign Currency Deposit'), + 'FCWD': _lt('Foreign Currency Withdrawal'), + 'TCDP': _lt('Travellers Cheques Deposit'), + 'TCWD': _lt('Travellers Cheques Withdrawal'), + 'LBCA': _lt('Credit Adjustment'), # Lockbox + 'LBDB': _lt('Debit'), + 'LBDP': _lt('Deposit'), + 'STAM': _lt('Settlement at Maturity'), # Drafts / Bill to Order + 'STLR': _lt('Settlement under reserve'), + 'DDFT': _lt('Discounted Draft'), + 'UDFT': _lt('Dishonoured/Unpaid Draft'), + 'DMCG': _lt('Draft Maturity Change'), + 'BOOK': _lt('Internal Book Transfer'), # Received Real-Time Credit Transfer + 'STDO': _lt('Standing Order'), + 'XBST': _lt('Cross-Border Standing Order'), + 'ESCT': _lt('SEPA Credit Transfer'), + 'DMCT': _lt('Domestic Credit Transfer'), + 'XBCT': _lt('Cross-Border Credit Transfer'), + 'VCOM': _lt('Credit Transfer with agreed Commercial Information'), + 'FICT': _lt('Financial Institution Credit Transfer'), + 'PRCT': _lt('Priority Credit Transfer'), + 'SALA': _lt('Payroll/Salary Payment'), + 'XBSA': _lt('Cross-Border Payroll/Salary Payment'), + 'SDVA': _lt('Same Day Value Credit Transfer'), + 'RPCR': _lt('Reversal due to Payment Cancellation Request'), + 'RRTN': _lt('Reversal due to Payment Return/reimbursement of a Credit Transfer'), + 'AUTT': _lt('Automatic Transfer'), + 'ATXN': _lt('ACH Transaction'), + 'ACOR': _lt('ACH Corporate Trade'), + 'APAC': _lt('ACH Pre-Authorised'), + 'ASET': _lt('ACH Settlement'), + 'ARET': _lt('ACH Return'), + 'AREV': _lt('ACH Reversal'), + 'ACDT': _lt('ACH Credit'), + 'ADBT': _lt('ACH Debit'), + 'TTLS': _lt('Treasury Tax And Loan Service'), + 'BOOK': _lt('Internal Book Transfer'), # Issued Real-Time Credit Transfer + 'STDO': _lt('Standing Order'), + 'XBST': _lt('Cross-Border Standing Order'), + 'ESCT': _lt('SEPA Credit Transfer'), + 'DMCT': _lt('Domestic Credit Transfer'), + 'XBCT': _lt('Cross-Border Credit Transfer'), + 'FICT': _lt('Financial Institution Credit Transfer'), + 'PRCT': _lt('Priority Credit Transfer'), + 'VCOM': _lt('Credit Transfer with agreed Commercial Information'), + 'SALA': _lt('Payroll/Salary Payment'), + 'XBSA': _lt('Cross-Border Payroll/Salary Payment'), + 'RPCR': _lt('Reversal due to Payment Cancellation Request'), + 'RRTN': _lt('Reversal due to Payment Return/reimbursement of a Credit Transfer'), + 'SDVA': _lt('Same Day Value Credit Transfer'), + 'AUTT': _lt('Automatic Transfer'), + 'ATXN': _lt('ACH Transaction'), + 'ACOR': _lt('ACH Corporate Trade'), + 'APAC': _lt('ACH Pre-Authorised'), + 'ASET': _lt('ACH Settlement'), + 'ARET': _lt('ACH Return'), + 'AREV': _lt('ACH Reversal'), + 'ACDT': _lt('ACH Credit'), + 'ADBT': _lt('ACH Debit'), + 'TTLS': _lt('Treasury Tax And Loan Service'), + # Cash Management Sub-Families + 'XBRD': _lt('Cross-Border'), # Cash Pooling + 'ZABA': _lt('Zero Balancing'), # Account Balancing + 'SWEP': _lt('Sweeping'), + 'TOPG': _lt('Topping'), + 'DSBR': _lt('Controlled Disbursement'), + 'ODFT': _lt('Overdraft'), + 'XBRD': _lt('Cross-Border'), + # Derivatives Sub-Families + 'SWUF': _lt('Upfront Payment'), + 'SWRS': _lt('Reset Payment'), + 'SWPP': _lt('Partial Payment'), + 'SWFP': _lt('Final Payment'), + 'SWCC': _lt('Client Owned Collateral'), + # Loans, Deposits & Syndications Sub-Families + 'DDWN': _lt('Drawdown'), + 'RNEW': _lt('Renewal'), + 'PPAY': _lt('Principal Payment'), + 'DPST': _lt('Deposit'), + 'RPMT': _lt('Repayment'), + # Trade Services Sub-Families + 'FRZF': _lt('Freeze of funds'), + 'SOSI': _lt('Settlement of Sight Import document'), + 'SOSE': _lt('Settlement of Sight Export document'), + 'SABG': _lt('Settlement against bank guarantee'), + 'STLR': _lt('Settlement under reserve'), + 'STLR': _lt('Settlement under reserve'), + 'STAC': _lt('Settlement after collection'), + 'STLM': _lt('Settlement'), + # Securities Sub-Families + 'PAIR': _lt('Pair-Off'), # Trade, Clearing and Settlement & Non Settled + 'TRAD': _lt('Trade'), + 'NETT': _lt('Netting'), + 'TRPO': _lt('Triparty Repo'), + 'TRVO': _lt('Triparty Reverse Repo'), + 'RVPO': _lt('Reverse Repo'), + 'REPU': _lt('Repo'), + 'SECB': _lt('Securities Borrowing'), + 'SECL': _lt('Securities Lending'), + 'BSBO': _lt('Buy Sell Back'), + 'BSBC': _lt('Sell Buy Back'), + 'FCTA': _lt('Factor Update'), + 'ISSU': _lt('Depositary Receipt Issue'), + 'INSP': _lt('Inspeci/Share Exchange'), + 'OWNE': _lt('External Account Transfer'), + 'OWNI': _lt('Internal Account Transfer'), + 'NSYN': _lt('Non Syndicated'), + 'PLAC': _lt('Placement'), + 'PORT': _lt('Portfolio Move'), + 'SYND': _lt('Syndicated'), + 'TBAC': _lt('TBA closing'), + 'TURN': _lt('Turnaround'), + 'REDM': _lt('Redemption'), + 'SUBS': _lt('Subscription'), + 'CROS': _lt('Cross Trade'), + 'SWIC': _lt('Switch'), + 'REAA': _lt('Redemption Asset Allocation'), + 'SUAA': _lt('Subscription Asset Allocation'), + 'PRUD': _lt('Principal Pay-down/pay-up'), + 'TOUT': _lt('Transfer Out'), + 'TRIN': _lt('Transfer In'), + 'XCHC': _lt('Exchange Traded CCP'), + 'XCHG': _lt('Exchange Traded'), + 'XCHN': _lt('Exchange Traded Non-CCP'), + 'OTCC': _lt('OTC CCP'), + 'OTCG': _lt('OTC'), + 'OTCN': _lt('OTC Non-CCP'), + 'XCHC': _lt('Exchange Traded CCP'), # Blocked Transactions & CSD Blocked Transactions + 'XCHG': _lt('Exchange Traded'), + 'XCHN': _lt('Exchange Traded Non-CCP'), + 'OTCC': _lt('OTC CCP'), + 'OTCG': _lt('OTC'), + 'OTCN': _lt('OTC Non-CCP'), + 'MARG': _lt('Margin Payments'), # Collateral Management + 'TRPO': _lt('Triparty Repo'), + 'REPU': _lt('Repo'), + 'SECB': _lt('Securities Borrowing'), + 'SECL': _lt('Securities Lending'), + 'OPBC': _lt('Option broker owned collateral'), + 'OPCC': _lt('Option client owned collateral'), + 'FWBC': _lt('Forwards broker owned collateral'), + 'FWCC': _lt('Forwards client owned collateral'), + 'MGCC': _lt('Margin client owned cash collateral'), + 'SWBC': _lt('Swap broker owned collateral'), + 'EQCO': _lt('Equity mark client owned'), + 'EQBO': _lt('Equity mark broker owned'), + 'CMCO': _lt('Corporate mark client owned'), + 'CMBO': _lt('Corporate mark broker owned'), + 'SLBC': _lt('Lending Broker Owned Cash Collateral'), + 'SLCC': _lt('Lending Client Owned Cash Collateral'), + 'CPRB': _lt('Corporate Rebate'), + 'BIDS': _lt('Repurchase offer/Issuer Bid/Reverse Rights.'), # Corporate Action & Custody + 'BONU': _lt('Bonus Issue/Capitalisation Issue'), + 'BPUT': _lt('Put Redemption'), + 'CAPG': _lt('Capital Gains Distribution'), + 'CONV': _lt('Conversion'), + 'DECR': _lt('Decrease in Value'), + 'DRAW': _lt('Drawing'), + 'DRIP': _lt('Dividend Reinvestment'), + 'DTCH': _lt('Dutch Auction'), + 'DVCA': _lt('Cash Dividend'), + 'DVOP': _lt('Dividend Option'), + 'EXOF': _lt('Exchange'), + 'EXRI': _lt('Call on intermediate securities'), + 'EXWA': _lt('Warrant Exercise/Warrant Conversion'), + 'INTR': _lt('Interest Payment'), + 'LIQU': _lt('Liquidation Dividend / Liquidation Payment'), + 'MCAL': _lt('Full Call / Early Redemption'), + 'MRGR': _lt('Merger'), + 'ODLT': _lt('Odd Lot Sale/Purchase'), + 'PCAL': _lt('Partial Redemption with reduction of nominal value'), + 'PRED': _lt('Partial Redemption Without Reduction of Nominal Value'), + 'PRII': _lt('Interest Payment with Principle'), + 'PRIO': _lt('Priority Issue'), + 'REDM': _lt('Final Maturity'), + 'RHTS': _lt('Rights Issue/Subscription Rights/Rights Offer'), + 'SHPR': _lt('Equity Premium Reserve'), + 'TEND': _lt('Tender'), + 'TREC': _lt('Tax Reclaim'), + 'RWPL': _lt('Redemption Withdrawing Plan'), + 'SSPL': _lt('Subscription Savings Plan'), + 'CSLI': _lt('Cash in lieu'), + 'CHAR': _lt('Charge/fees'), # Miscellaneous Securities Operations + 'BKFE': _lt('Bank Fees'), + 'CLAI': _lt('Compensation/Claims'), + 'MNFE': _lt('Management Fees'), + 'OVCH': _lt('Overdraft Charge'), + 'TRFE': _lt('Transaction Fees'), + 'UNCO': _lt('Underwriting Commission'), + 'STAM': _lt('Stamp duty'), + 'WITH': _lt('Withholding Tax'), + 'BROK': _lt('Brokerage fee'), + 'PRIN': _lt('Interest Payment with Principle'), + 'TREC': _lt('Tax Reclaim'), + 'GEN1': _lt('Withdrawal/distribution'), + 'GEN2': _lt('Deposit/Contribution'), + 'ERWI': _lt('Borrowing fee'), + 'ERWA': _lt('Lending income'), + 'SWEP': _lt('Sweep'), + 'SWAP': _lt('Swap Payment'), + 'FUTU': _lt('Future Variation Margin'), + 'RESI': _lt('Futures Residual Amount'), + 'FUCO': _lt('Futures Commission'), + 'INFD': _lt('Fixed Deposit Interest Amount'), + # Account Management Sub-Families + 'ACCO': _lt('Account Opening'), + 'ACCC': _lt('Account Closing'), + 'ACCT': _lt('Account Transfer'), + 'VALD': _lt('Value Date'), + 'BCKV': _lt('Back Value'), + 'YTDA': _lt('YTD Adjustment'), + 'FLTA': _lt('Float adjustment'), + 'ERTA': _lt('Exchange Rate Adjustment'), + 'PSTE': _lt('Posting Error'), + # General + 'NTAV': _lt('Not available'), + 'OTHR': _lt('Other'), + 'MCOP': _lt('Miscellaneous Credit Operations'), + 'MDOP': _lt('Miscellaneous Debit Operations'), + 'FCTI': _lt('Fees, Commission , Taxes, Charges and Interest'), +} + + +def _generic_get(*nodes, xpath, namespaces, placeholder=None): + if placeholder is not None: + xpath = xpath.format(placeholder=placeholder) + for node in nodes: + item = node.xpath(xpath, namespaces=namespaces) + if item: + return item[0] + return False + +class CAMT: + # These are pair of getters: (getter for the amount, getter for the amount's currency) + _amount_getters = [ + (partial(_generic_get, xpath='ns:AmtDtls/ns:TxAmt/ns:Amt/text()'), partial(_generic_get, xpath='ns:AmtDtls/ns:TxAmt/ns:Amt/@Ccy')), + (partial(_generic_get, xpath='ns:AmtDtls/ns:CntrValAmt/ns:Amt/text()'), partial(_generic_get, xpath='ns:AmtDtls/ns:CntrValAmt/ns:Amt/@Ccy')), + (partial(_generic_get, xpath='ns:AmtDtls/ns:InstdAmt/ns:Amt/text()'), partial(_generic_get, xpath='ns:AmtDtls/ns:InstdAmt/ns:Amt/@Ccy')), + (partial(_generic_get, xpath='ns:Amt/text()'), partial(_generic_get, xpath='ns:Amt/@Ccy')), + ] + + _charges_getters = [ + (partial(_generic_get, xpath='ns:Chrgs/ns:Rcrd/ns:Amt/text()'), partial(_generic_get, xpath='ns:Chrgs/ns:Rcrd/ns:Amt/@Ccy')), + (partial(_generic_get, xpath='ns:Chrgs/ns:Amt/text()'), partial(_generic_get, xpath='ns:Chrgs/ns:Amt/@Ccy')), + ] + + _amount_charges_getters = [ + (partial(_generic_get, xpath='ns:Amt/text()'), partial(_generic_get, xpath='ns:Amt/@Ccy')), + ] + + # These are pair of getters: (getter for the exchange rate, getter for the target currency) + _target_rate_getters = [ + (partial(_generic_get, xpath='ns:AmtDtls/ns:CntrValAmt/ns:CcyXchg/ns:XchgRate/text()'), partial(_generic_get, xpath='ns:AmtDtls/ns:CntrValAmt/ns:CcyXchg/ns:TrgtCcy/text()')), + (partial(_generic_get, xpath='ns:AmtDtls/ns:CntrValAmt/ns:CcyXchg/ns:XchgRate/text()'), partial(_generic_get, xpath='ns:AmtDtls/ns:CntrValAmt/ns:CcyXchg/ns:SrcCcy/text()')), + ] + + # These are pair of getters: (getter for the exchange rate, getter for the source currency) + _source_rate_getters = [ + (partial(_generic_get, xpath='ns:AmtDtls/ns:TxAmt/ns:CcyXchg/ns:XchgRate/text()'), partial(_generic_get, xpath='ns:AmtDtls/ns:TxAmt/ns:CcyXchg/ns:SrcCcy/text()')), + (partial(_generic_get, xpath='ns:AmtDtls/ns:InstdAmt/ns:CcyXchg/ns:XchgRate/text()'), partial(_generic_get, xpath='ns:AmtDtls/ns:InstdAmt/ns:CcyXchg/ns:SrcCcy/text()')), + (partial(_generic_get, xpath='ns:AmtDtls/ns:TxAmt/ns:CcyXchg/ns:XchgRate/text()'), partial(_generic_get, xpath='ns:AmtDtls/ns:TxAmt/ns:CcyXchg/ns:TrgtCcy/text()')), + (partial(_generic_get, xpath='ns:AmtDtls/ns:InstdAmt/ns:CcyXchg/ns:XchgRate/text()'), partial(_generic_get, xpath='ns:AmtDtls/ns:InstdAmt/ns:CcyXchg/ns:TrgtCcy/text()')), + ] + + # These are pair of getters: (getter for the amount, getter for the amount's currency) + _currency_amount_getters = [ + (partial(_generic_get, xpath='ns:AmtDtls/ns:InstdAmt/ns:Amt/text()'), partial(_generic_get, xpath='ns:AmtDtls/ns:InstdAmt/ns:Amt/@Ccy')), + (partial(_generic_get, xpath='ns:NtryDtls/ns:TxDtls/ns:AmtDtls/ns:InstdAmt/ns:Amt/text()'), partial(_generic_get, xpath='ns:NtryDtls/ns:TxDtls/ns:AmtDtls/ns:InstdAmt/ns:Amt/@Ccy')), + (partial(_generic_get, xpath='ns:AmtDtls/ns:TxAmt/ns:Amt/text()'), partial(_generic_get, xpath='ns:AmtDtls/ns:TxAmt/ns:Amt/@Ccy')), + (partial(_generic_get, xpath='ns:NtryDtls/ns:TxDtls/ns:AmtDtls/ns:TxAmt/ns:Amt/text()'), partial(_generic_get, xpath='ns:NtryDtls/ns:TxDtls/ns:AmtDtls/ns:TxAmt/ns:Amt/@Ccy')), + (partial(_generic_get, xpath='ns:Amt/text()'), partial(_generic_get, xpath='ns:Amt/@Ccy')), + ] + _total_amount_getters = [ + (partial(_generic_get, xpath='ns:NtryDtls/ns:Btch/ns:TtlAmt/text()'), partial(_generic_get, xpath='ns:NtryDtls/ns:Btch/ns:TtlAmt/@Ccy')) + ] + + # Start Balance + # OPBD : Opening Booked + # PRCD : Previous Closing Balance + # OPAV : Opening Available + # ITBD : Interim Booked (in the case of preceeding pagination) + # These are pair of getters: (getter for the amount, getter for the sign) + _start_balance_getters = [ + (partial(_generic_get, xpath="ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='OPBD']/../../ns:Amt/text()"), + partial(_generic_get, xpath="ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='OPBD']/../../ns:CdtDbtInd/text()")), + (partial(_generic_get, xpath="ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='PRCD']/../../ns:Amt/text()"), + partial(_generic_get, xpath="ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='PRCD']/../../ns:CdtDbtInd/text()")), + (partial(_generic_get, xpath="ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='OPAV']/../../ns:Amt/text()"), + partial(_generic_get, xpath="ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='OPAV']/../../ns:CdtDbtInd/text()")), + (partial(_generic_get, xpath="ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='ITBD']/../../ns:Amt/text()"), + partial(_generic_get, xpath="ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='ITBD']/../../ns:CdtDbtInd/text()")), + ] + + # Ending Balance + # CLBD : Closing Booked + # CLAV : Closing Available + # ITBD : Interim Booked + # These are pair of getters: (getter for the amount, getter for the sign) + _end_balance_getters = [ + (partial(_generic_get, xpath="ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='CLBD']/../../ns:Amt/text()"), + partial(_generic_get, xpath="ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='CLBD']/../../ns:CdtDbtInd/text()")), + (partial(_generic_get, xpath="ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='CLAV']/../../ns:Amt/text()"), + partial(_generic_get, xpath="ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='CLAV']/../../ns:CdtDbtInd/text()")), + (partial(_generic_get, xpath="ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='ITBD']/../../ns:Amt/text()"), + partial(_generic_get, xpath="ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='ITBD']/../../ns:CdtDbtInd/text()")), + ] + + _get_credit_debit_indicator = partial(_generic_get, + xpath='ns:CdtDbtInd/text()') + + _get_charges_credit_debit_indicator = partial(_generic_get, + xpath='ns:Chrgs/ns:Rcrd/ns:CdtDbtInd/text()') + + _get_transaction_date = partial(_generic_get, + xpath=('ns:ValDt/ns:Dt/text()' + '| ns:BookgDt/ns:Dt/text()' + '| ns:BookgDt/ns:DtTm/text()')) + + _get_statement_date = partial(_generic_get, + xpath=("ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='CLBD']/../../ns:Dt/ns:Dt/text()" + " | ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='CLBD']/../../ns:Dt/ns:DtTm/text()" + " | ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='CLAV']/../../ns:Dt/ns:Dt/text()" + " | ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='CLAV']/../../ns:Dt/ns:DtTm/text()" + " | ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='ITBD']/../../ns:Dt/ns:Dt/text()" + " | ns:Bal/ns:Tp/ns:CdOrPrtry[ns:Cd='ITBD']/../../ns:Dt/ns:DtTm/text()" + )) + + _get_partner_name = partial(_generic_get, + xpath=('.//ns:RltdPties/ns:Ultmt{placeholder}/ns:Nm/text()' + ' | .//ns:RltdPties/ns:Ultmt{placeholder}/ns:Pty/ns:Nm/text()' + ' | .//ns:RltdPties/ns:{placeholder}/ns:Nm/text()' + ' | .//ns:RltdPties/ns:{placeholder}/ns:Pty/ns:Nm/text()' + )) + + _get_account_number = partial(_generic_get, + xpath=('.//ns:RltdPties/ns:{placeholder}Acct/ns:Id/ns:IBAN/text()' + '| (.//ns:{placeholder}Acct/ns:Id/ns:Othr/ns:Id)[1]/text()')) + + _get_main_ref = partial(_generic_get, + xpath='.//ns:RmtInf/ns:Strd/ns:{placeholder}RefInf/ns:Ref/text()') + + _get_other_ref = partial(_generic_get, + xpath=('ns:AcctSvcrRef/text()' + '| {placeholder}ns:Refs/ns:TxId/text()' + '| {placeholder}ns:Refs/ns:InstrId/text()' + '| {placeholder}ns:Refs/ns:EndToEndId/text()' + '| {placeholder}ns:Refs/ns:MndtId/text()' + '| {placeholder}ns:Refs/ns:ChqNb/text()')) + + _get_additional_entry_info = partial(_generic_get, xpath='ns:AddtlNtryInf/text()') + _get_additional_text_info = partial(_generic_get, xpath='ns:AddtlTxInf/text()') + _get_transaction_id = partial(_generic_get, xpath='ns:Refs/ns:TxId/text()') + _get_instruction_id = partial(_generic_get, xpath='ns:Refs/ns:InstrId/text()') + _get_end_to_end_id = partial(_generic_get, xpath='ns:Refs/ns:EndToEndId/text()') + _get_mandate_id = partial(_generic_get, xpath='ns:Refs/ns:MndtId/text()') + _get_check_number = partial(_generic_get, xpath='ns:Refs/ns:ChqNb/text()') + + @staticmethod + def _get_signed_balance(node, namespaces, getters): + for balance_getter, sign_getter in getters: + balance = balance_getter(node, namespaces=namespaces) + sign = sign_getter(node, namespaces=namespaces) + if balance and sign: + return -float(balance) if sign == 'DBIT' else float(balance) + return None + + @staticmethod + def _get_signed_amount(*nodes, namespaces, journal_currency=None): + def get_value_and_currency_name(node, getters, target_currency=None): + for value_getter, currency_getter in getters: + value = value_getter(node, namespaces=namespaces) + currency_name = currency_getter(node, namespaces=namespaces) + if value and (target_currency is None or currency_name == target_currency): + return float(value), currency_name + return None, None + + def get_rate(*entries, target_currency, source_currency=None): + for entry in entries: + source_rate = get_value_and_currency_name(entry, CAMT._source_rate_getters)[0] + target_rate = get_value_and_currency_name(entry, CAMT._target_rate_getters)[0] + + rate = source_rate or target_rate + if rate: + # According to the camt.053 Swiss Payment Standards, the exchange rate should be divided by 100 if the + # currency is in YEN, SEK, DKK or NOK. + if target_currency == 'CHF' and source_currency in ('SEK', 'DKK', 'YEN', 'NOK'): + rate /= 100 + elif not source_rate: + rate = 1 / rate + return rate + return None + + def get_charges(*entries, target_currency=None): + for entry in entries: + charges = get_value_and_currency_name(entry, CAMT._charges_getters, target_currency=target_currency)[0] + if charges: + sign = -1 if CAMT._get_charges_credit_debit_indicator(entry, namespaces=namespaces) == "DBIT" else 1 + return sign * charges + return None + + entry_details = nodes[0] + entry = nodes[1] if len(nodes) > 1 else nodes[0] + journal_currency_name = journal_currency.name if journal_currency else None + entry_amount = get_value_and_currency_name(entry, CAMT._amount_charges_getters, target_currency=journal_currency_name)[0] + entry_details_amount = get_value_and_currency_name(entry_details, CAMT._amount_charges_getters, target_currency=journal_currency_name)[0] + + charges = get_charges(entry_details, entry) + getters = CAMT._amount_charges_getters if charges else CAMT._amount_getters + amount, amount_currency_name = get_value_and_currency_name(entry_details, getters) + + if not amount or (charges and journal_currency and journal_currency.compare_amounts(amount + charges, entry_amount) == 0): + amount, amount_currency_name = get_value_and_currency_name(entry, getters) + + entry_amount_in_currency = get_value_and_currency_name(entry, getters, target_currency=amount_currency_name)[0] + entry_details_amount_in_currency = get_value_and_currency_name(entry_details, getters, target_currency=amount_currency_name)[0] + + if not journal_currency or amount_currency_name == journal_currency_name: + rate = 1.0 + else: + rate = get_rate(entry_details, entry, target_currency=journal_currency_name, source_currency=amount_currency_name) + entry_amount = entry_details_amount or entry_amount + if entry_details_amount: + entry_amount_in_currency = entry_details_amount_in_currency + elif not entry_amount_in_currency: + entry_amount_in_currency = amount + computed_rate = entry_amount / entry_amount_in_currency + if rate: + if float_compare(rate, computed_rate, precision_digits=4) == 0: + rate = computed_rate + elif float_compare(rate, 1 / computed_rate, precision_digits=4) == 0: + rate = 1 / computed_rate + else: + amount, amount_currency_name = get_value_and_currency_name(entry_details, CAMT._amount_getters, target_currency=journal_currency_name) + if not amount: + amount, amount_currency_name = get_value_and_currency_name(entry, CAMT._amount_getters, target_currency=journal_currency_name) + if amount_currency_name == journal_currency_name: + rate = 1.0 + if not rate: + raise ValidationError(_lt("No exchange rate was found to convert an amount into the currency of the journal")) + + sign = 1 if CAMT._get_credit_debit_indicator(*nodes, namespaces=namespaces) == "CRDT" else -1 + total_amount, total_amount_currency = get_value_and_currency_name(entry, CAMT._total_amount_getters) + result_amount = sign * amount * rate + if not total_amount or total_amount_currency != journal_currency_name and journal_currency: + entry_amount = entry_details_amount or entry_amount + total_amount = total_amount or amount + if journal_currency.compare_amounts(total_amount * rate, entry_amount) == 0: + result_amount = sign * amount * rate + elif journal_currency.compare_amounts(total_amount / rate, entry_amount) == 0: + result_amount = sign * amount / rate + + if journal_currency: + result_amount = journal_currency.round(result_amount) + return result_amount + + @staticmethod + def _get_counter_party(*nodes, namespaces): + ind = CAMT._get_credit_debit_indicator(*nodes, namespaces=namespaces) + return 'Dbtr' if ind == 'CRDT' else 'Cdtr' + + @staticmethod + def _set_amount_in_currency(node, getters, entry_vals, currency, curr_cache, has_multi_currency, namespaces): + for value_getter, currency_getter in getters: + instruc_amount = value_getter(node, namespaces=namespaces) + instruc_curr = currency_getter(node, namespaces=namespaces) + if (has_multi_currency and instruc_amount and instruc_curr and + instruc_curr != currency and instruc_curr in curr_cache): + entry_vals['amount_currency'] = math.copysign(abs(float(instruc_amount)), entry_vals['amount']) + entry_vals['foreign_currency_id'] = curr_cache[instruc_curr] + break + + @staticmethod + def _get_transaction_name(node, namespaces, entry=None): + xpaths = ( + './/ns:RmtInf/ns:Ustrd/text()', + './/ns:RmtInf/ns:Strd/ns:CdtrRefInf/ns:Ref/text()', + './/ns:AddtlNtryInf/text()', + './/ns:RmtInf/ns:Strd/ns:AddtlRmtInf/text()', + ) + for xpath in xpaths: + if entry is not None and 'AddtlNtryInf' in xpath: + transaction_name = entry.xpath(xpath, namespaces=namespaces) + else: + transaction_name = node.xpath(xpath, namespaces=namespaces) + if transaction_name: + return ' '.join(transaction_name) + return '/' + + @staticmethod + def _get_ref(node, counter_party, prefix, namespaces): + ref = CAMT._get_main_ref(node, placeholder=counter_party, namespaces=namespaces) + if ref is False: # Explicitely match False, not a falsy value + ref = CAMT._get_other_ref(node, placeholder=prefix, namespaces=namespaces) + return ref + + @staticmethod + def _get_unique_import_id(entry, sequence, name, date, unique_import_set, namespaces): + unique_import_ref = entry.xpath('ns:AcctSvcrRef/text()', namespaces=namespaces) + if unique_import_ref and not CAMT._is_full_of_zeros(unique_import_ref[0]) and unique_import_ref[0] != 'NOTPROVIDED': + entry_ref = entry.xpath('ns:NtryRef/text()', namespaces=namespaces) + if entry_ref: + return '{}-{}-{}'.format(name, unique_import_ref[0], entry_ref[0]) + elif not entry_ref and unique_import_ref[0] not in unique_import_set: + return unique_import_ref[0] + else: + return '{}-{}-{}'.format(name, unique_import_ref[0], sequence) + else: + return '{}-{}-{}'.format(name, date, sequence) + + @staticmethod + def _get_transaction_type(node, namespaces): + code = node.xpath('ns:Domn/ns:Cd/text()', namespaces=namespaces) + family = node.xpath('ns:Domn/ns:Fmly/ns:Cd/text()', namespaces=namespaces) + subfamily = node.xpath('ns:Domn/ns:Fmly/ns:SubFmlyCd/text()', namespaces=namespaces) + if code: + return {'transaction_type': "{code}: {family} ({subfamily})".format( + code=codes.get(code[0].upper(), code[0]), + family=family and codes.get(family[0].upper(), family[0]) or '', + subfamily=subfamily and codes.get(subfamily[0].upper(), subfamily[0]) or '', + )} + return {} + + @staticmethod + def _get_partner_address(node, ns, ph): + StrtNm = node.xpath('ns:RltdPties/ns:{}/ns:PstlAdr/ns:StrtNm/text()'.format(ph), namespaces=ns) + BldgNb = node.xpath('ns:RltdPties/ns:{}/ns:PstlAdr/ns:BldgNb/text()'.format(ph), namespaces=ns) + PstCd = node.xpath('ns:RltdPties/ns:{}/ns:PstlAdr/ns:PstCd/text()'.format(ph), namespaces=ns) + TwnNm = node.xpath('ns:RltdPties/ns:{}/ns:PstlAdr/ns:TwnNm/text()'.format(ph), namespaces=ns) + Ctry = node.xpath('ns:RltdPties/ns:{}/ns:PstlAdr/ns:Ctry/text()'.format(ph), namespaces=ns) + AdrLine = node.xpath('ns:RltdPties/ns:{}/ns:PstlAdr/ns:AdrLine/text()'.format(ph), namespaces=ns) + address = "\n".join(AdrLine) + if StrtNm: + address = "\n".join([address, ", ".join(StrtNm + BldgNb)]) + if PstCd or TwnNm: + address = "\n".join([address, " ".join(PstCd + TwnNm)]) + if Ctry: + address = "\n".join([address, Ctry[0]]) + return address + + @staticmethod + def _is_full_of_zeros(strg): + pattern_zero = re.compile('^0+$') + return bool(pattern_zero.match(strg)) diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/models/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/models/__init__.py new file mode 100644 index 0000000..dfddd98 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import account_journal \ No newline at end of file diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c26b1843357775a0f36f4c58fce637c2ce5879f GIT binary patch literal 319 zcmZ3^%ge<81lK2oW;O!p#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@8G#a- zjJNm`laupH^Gf2g@=J^I5_9}CnQk!@F#{!6GJFOZ@@tlUMt*Lpeqv5`Mq*V_R;GSH zWpYMhQEos{epYI7NwI!@N@|6%0g%ei*EO`zgRsD&Mh5Xv<1_Qp^;1&I;vs60MNviK zlM?f?fD$Oa@kB`sH%PfhH*DI*}#bE;!EX_%^ iE8+k;738I2c_8tDnURt40|x`6+yw?%OjN`MR09C$bzVgP literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/models/__pycache__/account_journal.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/models/__pycache__/account_journal.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c3e40a767e2156d98443e0e6a911398f4e751d5 GIT binary patch literal 11664 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 would have. + account_no = sanitize_account_number(statement.xpath('ns:Acct/ns:Id/ns:IBAN/text() | ns:Acct/ns:Id/ns:Othr/ns:Id/text()', + namespaces=ns)[0]) + + # Currency 0..1 + currency = statement.xpath('ns:Acct/ns:Ccy/text() | ns:Bal/ns:Amt/@Ccy', namespaces=ns)[0] + + if currency and journal_currency and currency != journal_currency.name: + continue + + for entry in statement.findall('ns:Ntry', ns): + # Date 0..1 + date = CAMT._get_transaction_date(entry, namespaces=ns) or statement_date + + transaction_details = entry.xpath('.//ns:TxDtls', namespaces=ns) + entry_details_sum = 0 + largest_entry_vals = {'amount': 0} + for entry_details in transaction_details or [entry]: + sequence += 1 + counter_party = CAMT._get_counter_party(entry_details, entry, namespaces=ns) + partner_name = CAMT._get_partner_name(entry_details, placeholder=counter_party, namespaces=ns) + entry_vals = { + 'sequence': sequence, + 'date': date, + 'amount': CAMT._get_signed_amount(entry_details, entry, namespaces=ns, journal_currency=journal_currency), + 'payment_ref': CAMT._get_transaction_name(entry_details, namespaces=ns, entry=entry), + 'partner_name': partner_name, + 'account_number': CAMT._get_account_number(entry_details, placeholder=counter_party, namespaces=ns), + 'ref': CAMT._get_ref(entry_details, counter_party=counter_party, prefix='', namespaces=ns), + } + + entry_vals['unique_import_id'] = CAMT._get_unique_import_id( + entry=entry_details, + sequence=sequence, + name=statement_vals['name'], + date=entry_vals['date'], + unique_import_set=unique_import_set, + namespaces=ns) + + CAMT._set_amount_in_currency( + node=entry_details, + getters=CAMT._currency_amount_getters, + entry_vals=entry_vals, + currency=currency, + curr_cache=curr_cache, + has_multi_currency=has_multi_currency, + namespaces=ns) + + BkTxCd = entry.xpath('ns:BkTxCd', namespaces=ns)[0] + entry_vals.update(CAMT._get_transaction_type(BkTxCd, namespaces=ns)) + notes = [] + entry_info = CAMT._get_additional_entry_info(entry, namespaces=ns) + if entry_info: + notes.append(_('Entry Info: %s', entry_info)) + text_info = CAMT._get_additional_text_info(entry_details, namespaces=ns) + if text_info: + notes.append(_('Additional Info: %s', text_info)) + if partner_name: + notes.append(_('Counter Party: %(partner)s', partner=partner_name)) + partner_address = CAMT._get_partner_address(entry_details, ns, counter_party) + if partner_address: + notes.append(_('Address:\n%s', partner_address)) + transaction_id = CAMT._get_transaction_id(entry_details, namespaces=ns) + if transaction_id: + notes.append(_('Transaction ID: %s', transaction_id)) + instruction_id = CAMT._get_instruction_id(entry_details, namespaces=ns) + if instruction_id: + notes.append(_('Instruction ID: %s', instruction_id)) + end_to_end_id = CAMT._get_end_to_end_id(entry_details, namespaces=ns) + if end_to_end_id: + notes.append(_('End to end ID: %s', end_to_end_id)) + mandate_id = CAMT._get_mandate_id(entry_details, namespaces=ns) + if mandate_id: + notes.append(_('Mandate ID: %s', mandate_id)) + check_number = CAMT._get_check_number(entry_details, namespaces=ns) + if check_number: + notes.append(_('Check Number: %s', check_number)) + entry_vals['narration'] = "\n".join(notes) + + unique_import_set.add(entry_vals['unique_import_id']) + transactions.append(entry_vals) + + entry_details_sum += entry_vals['amount'] + if abs(entry_vals['amount']) >= abs(largest_entry_vals['amount']): + largest_entry_vals = entry_vals + + # In a multi-currency entry (Ntry) with multiple entry details, we might have some rounding differences when applying the currency rate. + # We add this difference back on the largest amount. + transaction_amount = float(entry.find('ns:Amt', namespaces=ns).text) + transaction_amount = -transaction_amount if entry.find('ns:CdtDbtInd', namespaces=ns).text == 'DBIT' else transaction_amount + largest_entry_vals['amount'] += transaction_amount - entry_details_sum + + statement_vals['transactions'] = transactions + statement_vals['balance_start'] = CAMT._get_signed_balance(node=statement, namespaces=ns, getters=CAMT._start_balance_getters) + statement_vals['balance_end_real'] = CAMT._get_signed_balance(node=statement, namespaces=ns, getters=CAMT._end_balance_getters) + + # Save statements and currency + statements_per_iban.setdefault(account_no, []).append(statement_vals) + currency_per_iban[account_no] = currency + + # If statements target multiple journals, returns thoses targeting the current journal + if len(statements_per_iban) > 1: + account_no = sanitize_account_number(self.bank_acc_number) + _logger.warning("The following statements will not be imported because they are targeting another journal (current journal id: %s):\n- %s", + account_no, "\n- ".join("{}: {} statement(s)".format(iban, len(statements)) for iban, statements in statements_per_iban.items() if iban != account_no)) + if not account_no: + raise UserError(_("Please set the IBAN account on your bank journal.\n\nThis CAMT file is targeting several IBAN accounts but none match the current journal.")) + + # Otherwise, returns those from only account_no + statement_list = statements_per_iban.get(account_no, []) + currency = currency_per_iban.get(account_no) + + if not currency and not statement_list: + raise UserError(_("Please check the currency on your bank journal.\n" + "No statements in currency %s were found in this CAMT file.", journal_currency.name)) + return currency, account_no, statement_list diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_additional_entry_info.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_additional_entry_info.xml new file mode 100644 index 0000000..8dbdd8a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_additional_entry_info.xml @@ -0,0 +1,72 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +

        +
        2019-02-12
        + + + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + + MSGSALA0001 + CustRefForSalaBatch + 1 + 500.0 + CRDT + + + + + 500 + + + + + entry info + + + + diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_custom_codes.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_custom_codes.xml new file mode 100644 index 0000000..23d9f29 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_custom_codes.xml @@ -0,0 +1,62 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + custom_code + + custom_family + custom_subfamily + + + + ABCD + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_exchange_fees.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_exchange_fees.xml new file mode 100644 index 0000000..3343fc1 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_exchange_fees.xml @@ -0,0 +1,71 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 2672.98 + CRDT +
        +
        2019-02-13
        + +
        + + 1672.98 + CRDT + BOOK + + + ABCD + + + + + + + 1672.98 + + CAD + 1.4595 + + + + 1639.98 + + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal.xml new file mode 100644 index 0000000..7e4a51c --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal.xml @@ -0,0 +1,55 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + +
        +
        +
        \ No newline at end of file diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_EUR.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_EUR.xml new file mode 100644 index 0000000..564ed87 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_EUR.xml @@ -0,0 +1,55 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency.xml new file mode 100644 index 0000000..4d96a15 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency.xml @@ -0,0 +1,78 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + PMNT + + RCDT + ESCT + + + + + + 250.00 + + + 500.00000 + + EUR + USD + 0.5 + + + + + + 250.00000 + CRDT + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_02.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_02.xml new file mode 100644 index 0000000..ed8304c --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_02.xml @@ -0,0 +1,71 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + + 500 + CRDT + + + 250 + + USD + EUR + 2 + + + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_03.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_03.xml new file mode 100644 index 0000000..46307d5 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_03.xml @@ -0,0 +1,73 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + PMNT + + RCDT + ESCT + + + + + + 250.00 + + + 500.00000 + + + + + 250.00000 + CRDT + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_04.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_04.xml new file mode 100644 index 0000000..c410bea --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_04.xml @@ -0,0 +1,71 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + + 500 + CRDT + + + 250 + + EUR + USD + 2 + + + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_05.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_05.xml new file mode 100644 index 0000000..b7e88e9 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_05.xml @@ -0,0 +1,71 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + + 500 + CRDT + + + 250 + + EUR + USD + 0.5 + + + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_06.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_06.xml new file mode 100644 index 0000000..45ee941 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_06.xml @@ -0,0 +1,71 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + + 500 + CRDT + + + 245 + + USD + EUR + 2.040817 + + + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_07.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_07.xml new file mode 100644 index 0000000..5b9369a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_and_multicurrency_07.xml @@ -0,0 +1,78 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + PMNT + + RCDT + ESCT + + + + + + 252.00 + + + 500.00 + + EUR + USD + 1.9841 + + + + + + 252.00 + CRDT + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_charges.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_charges.xml new file mode 100644 index 0000000..6345a00 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_charges.xml @@ -0,0 +1,77 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + 4 + + 4 + CRDT + true + + + + + 500 + CRDT + + + 496 + + + 496 + + + + + +
        +
        +
        \ No newline at end of file diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_charges_02.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_charges_02.xml new file mode 100644 index 0000000..a11851a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_charges_02.xml @@ -0,0 +1,69 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + + 496 + CRDT + + + 496 + + + + 4 + + + + +
        +
        +
        \ No newline at end of file diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_charges_03.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_charges_03.xml new file mode 100644 index 0000000..22b14a7 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_charges_03.xml @@ -0,0 +1,73 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + + 505.00 + CRDT + + + 505.00 + + + + + 5.00 + DBIT + true + + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_datetime.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_datetime.xml new file mode 100644 index 0000000..bed9bb8 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_datetime.xml @@ -0,0 +1,55 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        + 2019-02-13T21:00:00Z +
        +
        + + + + CLBD + + + 1500.00 + CRDT +
        + 2019-02-13T21:00:00Z +
        +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + +
        +
        +
        \ No newline at end of file diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_intraday.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_intraday.xml new file mode 100644 index 0000000..cf5828f --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_minimal_intraday.xml @@ -0,0 +1,79 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988304.2019-02-13 + 2019-02-13T13:31:05.668+02:00 + + + + + 445566 + + + + + + + ITBD + + + 0 + CRDT +
        +
        2019-02-13
        + +
        +
        + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-13
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + +
        +
        +
        \ No newline at end of file diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_namespace.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_namespace.xml new file mode 100644 index 0000000..b14cc0c --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_namespace.xml @@ -0,0 +1,55 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT + + 2019-02-12 + + + + + + CLBD + + + 1500.00 + CRDT + + 2019-02-13 + + + + 500.00 + CRDT + BOOK + + + ABCD + + + + + + diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_sample.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_sample.xml new file mode 100644 index 0000000..be4fe9c --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_sample.xml @@ -0,0 +1,948 @@ + + + + + + + BANKFILEID00001 + 2009-10-30T03:30:47+02:00 + + + + + BANKSTMTID0972009 + + 120 + + + + 97 + 2009-10-30T02:00:00+02:00 + + + + + 2009-10-29T02:00:00+02:00 + 2009-10-29T21:00:00+02:00 + + + + + + + + FI7433010001222090 + + + + CACC + + + EUR + + + BANK ACCOUNT OWNER + + HELSINGINKATU + 31 + 00100 + HELSINKI + FI + + + + + + 12345678901 + + + BANK + + + + + + + + + ESSEFIHX + + + + + + + + FI1533010001911270 + + EUR + + + + + + + INDY + + + + Business agreement + + + + + + 0.00 + true + + + 1000000.00 + true + + + + CRDT + EUR + + + + + + + + + + + OPBD + + + + + false + 10000.00 + + 10000.00 + CRDT + +
        +
        2009-10-29
        + +
        + + + + + PRCD + + + + false + 10000.00 + + 10000.00 + CRDT + +
        +
        2009-10-28
        + +
        + + + + + CLBD + + + + + false + 10000.00 + + 23644.83 + CRDT + +
        +
        2009-10-29
        + +
        + + + + + + CLAV + + + 33644.83 + CRDT +
        +
        2009-10-29
        + +
        + + + + + 10 + + + + 6 + 23075.00 + + + + 4 + 9430.17 + + + + + + + + + 1000.12 + DBIT + BOOK + +
        2009-10-29
        +
        + +
        2009-10-29
        +
        + + 091029ACCTSTMTARCH01 + + + + PMNT + + ICDT + SALA + + + + + NTRF+701TransactionCodeText + + + + + + + MSGSALA0001 + + CustRefForSalaBatch + + 4 + + + + + SALA + + + +
        + + + + 4000.00 + DBIT + BOOK + +
        2009-10-29
        +
        + +
        2009-10-29
        +
        + + 091029ACCTSTMTARCH02 + + + + PMNT + + ICDT + DMCT + + + + + NTRF+702TransactionCodeText + + + + + + + MSGSCT0099 + CustRefForPmtBatch + + 3 + + +
        + + + 4230.05 + DBIT + BOOK + + +
        2009-10-29
        +
        + + +
        2009-10-29
        +
        + 091029ACCTSTMTARCH03 + + + PMNT + + ICDT + DMCT + + + + + NTRF+702TransactionCodeText + + + + + MSGSCT0100 + CustRefForPmtBatch9 + 3 + + + + + + + + 091029ARCH03001 + + TITOT1106ID01 + + + + 2000.02 + + + + + Creditor Company + + + FI + Mannerheimintie 123 + 00100 Helsinki + + FI + + + + + + 29501800020582 + + BBAN + + + + + + + + + + + SCOR + + + 3900 + + + + + + + + 091029ARCH03002 + TITOT1106ID02 + + + + 1000.01 + + + + + Creditor Company + + FI + Mannerheimintie 123 + 00100 Helsinki + + FI + + + + + 29501800020582 + + BBAN + + + + + + ACWC + + + + + Invoices 123 and 321 + + + + + + + 091029ARCH03003 + TITOT1106ID03 + + + + 1230.02 + + + + + Creditor Company + + FI + Mannerheimintie 123 + 00100 Helsinki + + FI + + + + + 29501800020574 + + BBAN + + + + + + + + + + + CINV + + + 217827182718 + + + + + + 9102910 + + + + + + + + +
        + + + + 2000.00 + CRDT + BOOK + +
        2009-10-29
        +
        + +
        2009-10-29
        +
        + + 091029ACCTSTMTARCH04 + + + PMNT + + RCDT + DMCT + + + + NTRF+705TransactionCodeText + + + + + BANKFILEID998765 + + 2 + + + + + 2000.00 + + + + +
        + + + 500.00 + CRDT + BOOK + +
        2009-10-29
        +
        + +
        2009-10-29
        +
        + + 091029ACCTSTMTARCH21 + + + PMNT + + RDDT + PMDD + + + + NTRF+705TransactionCodeText + + + + + BANKFILEID998799 + + 2 + + + + + 500.00 + + + + +
        + + + 3000.00 + CRDT + BOOK + +
        2009-10-29
        +
        + +
        2009-10-29
        +
        + 091029ACCTSTMTARCH05 + + + PMNT + + RCDT + ESCT + + + + + + BANKFILEID998765 + + 2 + + + + + 3000.00 + + + + +
        + + + 2120.00 + CRDT + BOOK + +
        2009-10-29
        +
        + + +
        2009-10-30
        +
        + 091029ACCTSTMTARCH06 + + + PMNT + + RCDT + XBCT + + + + + + + + ISSRBKREF12345678 + ISSRBKREF12345678 + + + + + + 3200.00 + + USD + EUR + + EUR + 0.666667 + FX12345 + 2009-10-29T10:00:00+02:00 + + + + 2120.00 + + + + 2120.00 + + USD + EUR + EUR + 0.666667 + FX12345 + 2009-10-29T10:00:00+02:00 + + + + + + 20.00 + + COMM + + + + + DEBTOR NAME + + + + + 123456789 + + DUNS + + + + + + + + + + BOFAUS6H + + + + + INVOICE US20291092 + + + +
        + + + + 5455.00 + CRDT + BOOK + +
        2009-10-29
        +
        + +
        2009-10-29
        +
        + 091029ACCTSTMTARCH07 + + + PMNT + + RCDT + + PRCT + + + + + + + + BKREFDBT0101010 + BKREFDBT0101010 + + + + + 5500.00 + + + 5455.00 + + + + 45.00 + + COMM + + + + + PAYERS NAME2 + + GOVERN STREET + 22 + 291092 + LONDON + UK + + + + + 123456789 + + EANG + + + + + + + + + + BOFSGB22 + + + + + + + 5500.00 + + + + + SCOR + + ISO + + RF98123456789012 + + + + + +
        + + + 10000.00 + CRDT + BOOK + +
        2009-10-29
        +
        + +
        2009-10-29
        +
        + 091029ACCTSTMTARCH08 + + + PMNT + + RCDT + ESCT + + + + + + + EndToEndIdSCT01 + + + + + 10000.00 + + + + + DEBTOR + + + ULTIMATE DEBTOR + + + + 987654321 + + TXID + + + + + + + + + + NDEAFIHH + + + + + TREA + + + + + + + SCOR + + ISO + + RF98123456789012 + + + + + 2009-10-28T03:00:00+02:00 + + + +
        + + + + 200.00 + DBIT + BOOK + +
        2009-10-29
        +
        + +
        2009-10-29
        +
        + 091029ACCTSTMTARCH09 + + + + PMNT + + RCDT + CHRG + + + + + + + + + 091029ARCH09001 + + + + 100.00 + + + + + PMNT + + RCDT + DMCT + + + + + + SEB Merchant Banking Finland + + + + + 10000 + + + + + + + 091029ARCH09001 + + + + 100.00 + + + + + PMNT + + RCDT + ESCT + + + + + + SEB Merchant Banking Finland + + + + + 150000 + + + + +
        +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_ibans.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_ibans.xml new file mode 100644 index 0000000..a2ce288 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_ibans.xml @@ -0,0 +1,96 @@ + + + + + 2514988305.2019-05-23 + 2019-05-23T15:27:15.66+02:00 + + + 2514988305.2019-05-23 + 2019-05-23T15:27:15.66+02:00 + + + BE86 6635 9439 7150 + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-05-22
        + +
        + + + + CLBD + + + 1600.00 + CRDT +
        +
        2019-05-23
        + +
        + + 600.00 + CRDT + BOOK + + + ABCD + + + +
        + + + 2514988305.2019-05-23 + 2019-05-23T15:27:15.66+02:00 + + + BE79 5390 0754 6933 + + + + + + OPBD + + + 100.00 + CRDT +
        +
        2019-05-22
        + +
        + + + + CLBD + + + 150.00 + CRDT +
        +
        2019-05-23
        + +
        + + 50.00 + CRDT + BOOK + + + ABCD + + + +
        +
        +
        \ No newline at end of file diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_minimal_stmt_different_currency.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_minimal_stmt_different_currency.xml new file mode 100644 index 0000000..6628923 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_minimal_stmt_different_currency.xml @@ -0,0 +1,103 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + USD + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + +
        + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + EUR + + + + + OPBD + + + 2000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 3000.00 + CRDT +
        +
        2019-02-13
        + +
        + + 1000.00 + CRDT + BOOK + + + ABCD + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details.xml new file mode 100644 index 0000000..9f732b2 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details.xml @@ -0,0 +1,94 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + + MSGSALA0001 + CustRefForSalaBatch + 3 + 500.0 + CRDT + + + + + 100 + + + + label01 + + + + + + 150 + + + + label02 + + + + + + 250 + + + + label03 + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_charges.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_charges.xml new file mode 100644 index 0000000..b45cdb0 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_charges.xml @@ -0,0 +1,108 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + 15 + + 15 + CRDT + false + + + + + MSGSALA0001 + CustRefForSalaBatch + 3 + 500.0 + CRDT + + + 100 + CRDT + + + 6 + + + + label01 + + + + 150 + CRDT + + + 5 + + + + label02 + + + + 250 + CRDT + + + 4 + + + + label03 + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_instructed_amount.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_instructed_amount.xml new file mode 100644 index 0000000..a3e87ee --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_instructed_amount.xml @@ -0,0 +1,94 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + + MSGSALA0001 + CustRefForSalaBatch + 3 + 500.0 + CRDT + + + + + 100 + + + + label01 + + + + + + 150 + + + + label02 + + + + + + 250 + + + + label03 + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_instructed_amount_02.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_instructed_amount_02.xml new file mode 100644 index 0000000..266c1cb --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_instructed_amount_02.xml @@ -0,0 +1,90 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + + 3 + + + + + 100 + + + + label01 + + + + + + 150 + + + + label02 + + + + + + 250 + + + + label03 + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_01.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_01.xml new file mode 100644 index 0000000..f53a131 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_01.xml @@ -0,0 +1,104 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + + 500 + + EUR + USD + 0.5 + + + + + + MSGSALA0001 + CustRefForSalaBatch + 3 + 500.0 + CRDT + + + + + 50 + + + + label01 + + + + + + 75 + + + + label02 + + + + + + 125 + + + + label03 + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_02.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_02.xml new file mode 100644 index 0000000..9fc8fa9 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_02.xml @@ -0,0 +1,104 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + + 500 + + EUR + USD + 0.5 + + + + + + MSGSALA0001 + CustRefForSalaBatch + 3 + 250.0 + CRDT + + + + + 50 + + + + label01 + + + + + + 75 + + + + label02 + + + + + + 125 + + + + label03 + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_03.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_03.xml new file mode 100644 index 0000000..5959dd0 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_03.xml @@ -0,0 +1,97 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + + 500 + + EUR + USD + 0.5 + + + + + + + + 50 + + + + label01 + + + + + + 75 + + + + label02 + + + + + + 125 + + + + label03 + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_04.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_04.xml new file mode 100644 index 0000000..0293518 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_04.xml @@ -0,0 +1,100 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 100000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 150000.00 + CRDT +
        +
        2019-02-13
        + +
        + + 50000.00 + CRDT + BOOK + + + ABCD + + + + + 47824.94 + + USD + EUR + 1.0455 + + + + + + 3 + + + + + 9564.99 + + + + label01 + + + + + + 14347.48 + + + + label02 + + + + + + 23912.47 + + + + label03 + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_05.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_05.xml new file mode 100644 index 0000000..987b845 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_and_multicurrency_05.xml @@ -0,0 +1,103 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988306.2019-02-13 + 2019-02-12T21:17:26+01:00 + + + + + 112233 + + + + + + + OPBD + + + 100000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 150000.00 + CRDT +
        +
        2019-02-13
        + +
        + + 50000.00 + DBIT + BOOK + +
        2024-11-25
        +
        + +
        2024-11-25
        +
        + + + ABCD + + + + + 52759.31 + + + 52759.31 + + EUR + 0.9477 + + + + + + 4 + + + 19962.03 + DBIT + + label01 + + + + 24806 + DBIT + + label02 + + + + + A6Z0001086376914 + 8052-2410138 + + 7991.28 + DBIT + + label03 + + + +
        +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_nordic.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_nordic.xml new file mode 100644 index 0000000..15a189e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_tx_details_nordic.xml @@ -0,0 +1,104 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + OPBD + + + 1000.00 + CRDT +
        +
        2019-02-12
        + +
        + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + + + MSGSALA0001 + CustRefForSalaBatch + 3 + 500.0 + CRDT + + + + + 100 + + + + label01 + + + + + + 150 + + + + label02 + + + + + + 250 + + + + + Ultimate Debtor Name + + + DEBTOR NAME + + + + + Transaction 03 name + + + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/test_camt.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/test_camt.xml new file mode 100644 index 0000000..45074eb --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/test_camt.xml @@ -0,0 +1,249 @@ + + + + + 0574908765.2015-12-05 + 2015-12-05T10:55:08.66+02:00 + + 1 + true + + + + 0574908765.2015-12-05 + 0070 + 2015-12-05T10:55:08.66+02:00 + + + + + 123456 + + + Norbert Brant + + + ABNANL2A + + + + + + + OPBD + + + 8998.20 + CRDT +
        +
        2015-12-05
        + +
        + + + + CLAV + + + 2661.49 + CRDT +
        +
        2015-12-05
        + +
        + + 7379.54 + DBIT + BOOK + +
        2015-12-01
        +
        + +
        2015-12-01
        +
        + + + PMNT + + RDDT + ESDD + + + + EI + + + + + + INNDNL2U20141231000142300002844 + 435005714488-ABNO33052620 + 1880000341866 + + + + 7379.54 + + + + + ASUSTeK + + TEST STREET 20 + 1234 AB TESTCITY + NL + + + + + NL46ABNA0499998748 + + + + + + + ABNANL2A + + + + + BILL 2015 0002 + + MKB 859239PERIOD 31.12.2015 + + +
        + + 564.05 + DBIT + true + BOOK + +
        2015-11-29
        +
        + +
        2015-11-29
        +
        + + + PMNT + + IDDT + UPDD + + + + EIST + + + + + + TESTBANK/NL/20151129/01206408 + TESTBANK/NL/20151129/01206408 + NL22ZZZ524885430000-C0125.1 + + + + 564.05 + + + + + China Export + + NL + + + + + + 10987654323 + + + + + + + + ABNANL2A + + + + + Direct Debit S14 0410 + + + + AC06 + + + Direct debit S14 0410 AC07 Rek.nummer blokkade TESTBANK/NL/20141229/01206408 + + +
        + + 1636.88 + CRDT + BOOK + +
        2015-01-05
        +
        + +
        2015-01-05
        +
        + + + PMNT + + RCDT + ESCT + + + + ET + + + + + + INNDNL2U20150105000217200000708 + 115 + + + + 1636.88 + + + + + Norbert Brant + + SOMESTREET 570-A + 1276 ML HOUSCITY + NL + + + + + + BE93999574162167 + + + + + + + + ABNANL2A + + + + #RD INV/2015/0002 INV/2015/0003 + + +
        +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/test_camt_no_opening_balance.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/test_camt_no_opening_balance.xml new file mode 100644 index 0000000..d7baa7b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/test_camt_file/test_camt_no_opening_balance.xml @@ -0,0 +1,43 @@ + + + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + 2514988305.2019-02-13 + 2019-02-13T15:27:15.66+02:00 + + + + + 112233 + + + + + + + CLBD + + + 1500.00 + CRDT +
        +
        2019-02-13
        + +
        + + 500.00 + CRDT + BOOK + + + ABCD + + + +
        +
        +
        diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/tests/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/tests/__init__.py new file mode 100644 index 0000000..5102391 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import test_account_bank_statement_import_camt diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_camt/tests/test_account_bank_statement_import_camt.py b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/tests/test_account_bank_statement_import_camt.py new file mode 100644 index 0000000..2e1deb3 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_camt/tests/test_account_bank_statement_import_camt.py @@ -0,0 +1,473 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from odoo.addons.account.tests.common import AccountTestInvoicingCommon +from odoo.tests import tagged +from odoo.tools import file_open +from odoo.exceptions import UserError +from odoo.addons.odex30_account_bank_statement_import_camt.models.account_journal import _logger as camt_wizard_logger + +NORMAL_AMOUNTS = [100, 150, 250] +LARGE_AMOUNTS = [10000, 15000, 25000] + +@tagged('post_install', '-at_install') +class TestAccountBankStatementImportCamt(AccountTestInvoicingCommon): + + def test_camt_file_import(self): + bank_journal = self.env['account.journal'].create({ + 'name': 'Bank 123456', + 'code': 'BNK67', + 'type': 'bank', + 'bank_acc_number': '123456', + 'currency_id': self.env.ref('base.USD').id, + }) + + partner_norbert = self.env['res.partner'].create({ + 'name': 'Norbert Brant', + 'is_company': True, + }) + bank_norbert = self.env['res.bank'].create({'name': 'test'}) + + self.env['res.partner.bank'].create({ + 'acc_number': 'BE93999574162167', + 'partner_id': partner_norbert.id, + 'bank_id': bank_norbert.id, + }) + self.env['res.partner.bank'].create({ + 'acc_number': '10987654323', + 'partner_id': self.partner_a.id, + 'bank_id': bank_norbert.id, + }) + + # Get CAMT file content + camt_file_path = 'odex30_account_bank_statement_import_camt/test_camt_file/test_camt.xml' + with file_open(camt_file_path, 'rb') as camt_file: + bank_journal.create_document_from_attachment(self.env['ir.attachment'].create({ + 'mimetype': 'application/xml', + 'name': 'test_camt.xml', + 'raw': camt_file.read(), + }).ids) + + # Check the imported bank statement + imported_statement = self.env['account.bank.statement'].search([('company_id', '=', self.env.company.id)]) + self.assertRecordValues(imported_statement, [{ + 'name': '0574908765.2015-12-05', + 'balance_start': 8998.20, + 'balance_end_real': 2661.49, + }]) + self.assertRecordValues(imported_statement.line_ids.sorted('ref'), [ + { + 'ref': 'INNDNL2U20141231000142300002844', + 'partner_name': 'ASUSTeK', + 'amount': -7379.54, + 'partner_id': False, + }, + { + 'ref': 'INNDNL2U20150105000217200000708', + 'partner_name': partner_norbert.name, + 'amount': 1636.88, + 'partner_id': partner_norbert.id, + }, + { + 'ref': 'TESTBANK/NL/20151129/01206408', + 'partner_name': 'China Export', + 'amount': -564.05, + 'partner_id': self.partner_a.id, + }, + ]) + + def test_minimal_camt_file_import(self): + """ + This basic test aims at importing a file with amounts expressed in USD + while the company's currency is USD too and the journal has not any currency + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_minimal.xml', usd_currency) + + def test_minimal_and_multicurrency_camt_file_import(self): + """ + This test aims at importing a file with amounts expressed in EUR and USD. + The company's currency is USD. + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_minimal_and_multicurrency.xml', usd_currency) + + def test_minimal_and_multicurrency_camt_file_import_02(self): + """ + This test aims at importing a file with amounts expressed in EUR and USD. + The company's currency is USD. + The exchange rate is provided and the company's currency is set in the source currency. + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_minimal_and_multicurrency_02.xml', usd_currency) + + def test_minimal_and_multicurrency_camt_file_import_03(self): + """ + This test aims at importing a file with amounts expressed in EUR and USD but with no rate provided. + The company's currency is USD. + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_minimal_and_multicurrency_03.xml', usd_currency) + + def test_minimal_and_multicurrency_camt_file_import_04(self): + """ + This test aims at importing a file with amounts expressed in EUR and USD. + The company's currency is USD. + This is the same test than test_minimal_and_multicurrency_camt_file_import_02, + except that the company's currency is set in the target currency. + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_minimal_and_multicurrency_04.xml', usd_currency) + + def test_minimal_and_multicurrency_camt_file_import_05(self): + """ + This test aims at importing a file with amounts expressed in EUR and USD. + The company's currency is USD. + This is the same test than test_minimal_and_multicurrency_camt_file_import_04, + except that the exchange rate is inverted. + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_minimal_and_multicurrency_05.xml', usd_currency) + + def test_minimal_and_multicurrency_camt_file_import_06(self): + """ + This test aims at importing a file with amounts expressed in EUR and USD. + The company's currency is USD. + This is the same test than test_minimal_and_multicurrency_camt_file_import_02, + except that the exchange rate is leading to a rounding difference. + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_minimal_and_multicurrency_06.xml', usd_currency) + + def test_minimal_and_multicurrency_camt_file_import_07(self): + """ + This test aims at importing a file with amounts expressed in EUR and USD. + The company's currency is USD. + This is the same test than test_minimal_and_multicurrency_camt_file_import, + except that the exchange rate is rounded to 4 digits. + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_minimal_and_multicurrency_07.xml', usd_currency) + + def test_several_minimal_stmt_different_currency(self): + """ + Two different journals with the same bank account. The first one is in USD, the second one in EUR + Test to import a CAMT file with two statements: one in USD, another in EUR + """ + usd_currency = self.env.ref('base.USD') + eur_currency = self.env.ref('base.EUR') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + # USD Statement + self._test_minimal_camt_file_import('camt_053_several_minimal_stmt_different_currency.xml', usd_currency) + # EUR Statement + eur_currency.active = True + self._test_minimal_camt_file_import('camt_053_several_minimal_stmt_different_currency.xml', eur_currency, + start_balance=2000, end_balance=3000) + + def test_journal_with_other_currency(self): + """ + This test aims at importing a file with amounts expressed in EUR into a journal + that also uses EUR while the company's currency is USD. + """ + self.assertEqual(self.env.company.currency_id.id, self.env.ref('base.USD').id) + self.env.ref('base.EUR').active = True + self._test_minimal_camt_file_import('camt_053_minimal_EUR.xml', self.env.ref('base.EUR')) + + def _import_camt_file(self, camt_file_name, currency): + # Create a bank account and journal corresponding to the CAMT + # file (same currency and account number) + BankAccount = self.env['res.partner.bank'] + partner = self.env.user.company_id.partner_id + bank_account = BankAccount.search([('acc_number', '=', '112233'), ('partner_id', '=', partner.id)]) \ + or BankAccount.create({'acc_number': '112233', 'partner_id': partner.id}) + bank_journal = self.env['account.journal'].create( + { + 'name': "Bank 112233 %s" % currency.name, + 'code': "B-%s" % currency.name, + 'type': 'bank', + 'bank_account_id': bank_account.id, + 'currency_id': currency.id, + } + ) + + # Use an import wizard to process the file + camt_file_path = f'odex30_account_bank_statement_import_camt/test_camt_file/{camt_file_name}' + with file_open(camt_file_path, 'rb') as camt_file: + bank_journal.create_document_from_attachment(self.env['ir.attachment'].create({ + 'mimetype': 'application/xml', + 'name': 'test_camt.xml', + 'raw': camt_file.read(), + }).ids) + + def _test_minimal_camt_file_import(self, camt_file_name, currency, start_balance=1000, end_balance=1500): + # Create a bank account and journal corresponding to the CAMT + # file (same currency and account number) + self._import_camt_file(camt_file_name, currency) + # Check the imported bank statement + bank_st_record = self.env['account.bank.statement'].search( + [('name', '=', '2514988305.2019-02-13')] + ).filtered(lambda bk_stmt: bk_stmt.currency_id == currency).ensure_one() + self.assertEqual( + bank_st_record.balance_start, start_balance, "Start balance not matched" + ) + self.assertEqual( + bank_st_record.balance_end_real, end_balance, "End balance not matched" + ) + + # Check the imported bank statement line + line = bank_st_record.line_ids.ensure_one() + self.assertEqual(line.amount, end_balance - start_balance, "Transaction not matched") + + def _test_camt_with_several_tx_details(self, filename, expected_amounts=None): + if expected_amounts is None: + expected_amounts = NORMAL_AMOUNTS + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._import_camt_file(filename, usd_currency) + imported_statement = self.env['account.bank.statement'].search([('company_id', '=', self.env.company.id)], order='id desc', limit=1) + self.assertEqual(len(imported_statement.line_ids), 3) + self.assertEqual(imported_statement.line_ids[0].payment_ref, 'label01') + self.assertEqual(usd_currency.round(imported_statement.line_ids[0].amount), expected_amounts[0]) + self.assertEqual(imported_statement.line_ids[1].payment_ref, 'label02') + self.assertEqual(usd_currency.round(imported_statement.line_ids[1].amount), expected_amounts[1]) + self.assertEqual(imported_statement.line_ids[2].payment_ref, 'label03') + self.assertEqual(usd_currency.round(imported_statement.line_ids[2].amount), expected_amounts[2]) + + def test_camt_with_several_tx_details(self): + self._test_camt_with_several_tx_details('camt_053_several_tx_details.xml') + + def test_camt_with_several_tx_details_and_instructed_amount(self): + self._test_camt_with_several_tx_details('camt_053_several_tx_details_and_instructed_amount.xml') + + def test_camt_with_several_tx_details_and_instructed_amount_02(self): + self._test_camt_with_several_tx_details('camt_053_several_tx_details_and_instructed_amount_02.xml') + + def test_camt_with_several_tx_details_and_multicurrency_01(self): + self._test_camt_with_several_tx_details('camt_053_several_tx_details_and_multicurrency_01.xml') + + def test_camt_with_several_tx_details_and_multicurrency_02(self): + self._test_camt_with_several_tx_details('camt_053_several_tx_details_and_multicurrency_02.xml') + + def test_camt_with_several_tx_details_and_multicurrency_03(self): + self._test_camt_with_several_tx_details('camt_053_several_tx_details_and_multicurrency_03.xml') + + def test_camt_with_several_tx_details_and_multicurrency_04(self): + self._test_camt_with_several_tx_details('camt_053_several_tx_details_and_multicurrency_04.xml', + expected_amounts=LARGE_AMOUNTS) + + def test_camt_with_several_tx_details_and_multicurrency_05(self): + # Tests when the rounded sum is different by one cent from the sum of the rounded amounts after applying the currency rate. + # The difference is put on the largest amount (positive or negative) + self._test_camt_with_several_tx_details('camt_053_several_tx_details_and_multicurrency_05.xml', + expected_amounts=[-18918.02, -23508.64, -7573.34]) + + def test_camt_with_several_tx_details_and_charges(self): + self._test_camt_with_several_tx_details('camt_053_several_tx_details_and_charges.xml') + + def test_several_ibans_match_journal_camt_file_import(self): + # Create a bank account and journal corresponding to the CAMT + # file (same currency and account number) + bank_journal = self.env['account.journal'].create({ + 'name': "Bank BE86 6635 9439 7150", + 'code': 'BNK69', + 'type': 'bank', + 'bank_acc_number': 'BE86 6635 9439 7150', + 'currency_id': self.env.ref('base.USD').id, + }) + + # Use an import wizard to process the file + camt_file_path = 'odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_ibans.xml' + with file_open(camt_file_path, 'rb') as camt_file: + with self.assertLogs(level="WARNING") as log_catcher: + bank_journal.create_document_from_attachment(self.env['ir.attachment'].create({ + 'mimetype': 'application/xml', + 'name': 'test_camt.xml', + 'raw': camt_file.read(), + }).ids) + self.assertEqual(len(log_catcher.output), 1, "Exactly one warning should be logged") + self.assertIn( + "The following statements will not be imported", + log_catcher.output[0], + "The logged warning warns about non-imported statements", + ) + + # Check the imported bank statement + imported_statement = self.env['account.bank.statement'].search([('company_id', '=', self.env.company.id)]) + self.assertRecordValues(imported_statement, [{ + 'name': '2514988305.2019-05-23', + 'balance_start': 1000.00, + 'balance_end_real': 1600.00, + }]) + self.assertRecordValues(imported_statement.line_ids.sorted('ref'), [{'amount': 600.00}]) + + def test_several_ibans_missing_journal_id_camt_file_import(self): + # Create a bank account and journal corresponding to the CAMT + # file (same currency and account number) + bank_journal = self.env['account.journal'].create({ + 'name': "Bank BE43 9787 8497 9701", + 'code': 'BNK69', + 'type': 'bank', + 'currency_id': self.env.ref('base.USD').id, + # missing bank account number + }) + + # Use an import wizard to process the file + camt_file_path = 'odex30_account_bank_statement_import_camt/test_camt_file/camt_053_several_ibans.xml' + with file_open(camt_file_path, 'rb') as camt_file: + with self.assertLogs(camt_wizard_logger, level="WARNING") as log_catcher: + with self.assertRaises(UserError) as error_catcher: + bank_journal.create_document_from_attachment(self.env['ir.attachment'].create({ + 'mimetype': 'application/xml', + 'name': 'test_camt.xml', + 'raw': camt_file.read(), + }).ids) + + self.assertEqual(len(log_catcher.output), 1, "Exactly one warning should be logged") + self.assertIn( + "The following statements will not be imported", + log_catcher.output[0], + "The logged warning warns about non-imported statements", + ) + + self.assertEqual(error_catcher.exception.args[0], ( + "The following files could not be imported:\n" + "- test_camt.xml: Please set the IBAN account on your bank journal.\n\n" + "This CAMT file is targeting several IBAN accounts but none match the current journal." + )) + + def test_date_and_time_format_camt_file_import(self): + """ + This test aims to import a statement having dates specified in datetime format. + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_minimal_datetime.xml', usd_currency) + + def test_intraday_camt_file_import(self): + """ + This test aims to import a statement having only an ITBD balance, where we have + only one date, corresponding to the same opening and closing amount. + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_minimal_intraday.xml', usd_currency) + + def test_charges_camt_file_import(self): + """ + This test aims to import a statement having transactions including charges in their + total amount. In that case, we need to check that the retrieved amount is correct. + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_minimal_charges.xml', usd_currency) + + def test_charges_camt_file_import_02(self): + """ + This test aims to import a statement having transactions including charges in their + total amount. In that case, we need to check that the retrieved amount is correct. + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_minimal_charges_02.xml', usd_currency) + + def test_charges_camt_file_import_03(self): + """ + This test aims to import a statement having transactions including charges in their + total amount. In that case, we need to check that the retrieved amount is correct. + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_minimal_charges_03.xml', usd_currency) + + def test_import_already_fully_imported_catm_without_opening_balance(self): + """ + Test the scenario when you have a CAMT file where one statement does not + have an opening balance, and you try to import it twice + """ + bank_journal = self.env['account.journal'].create({ + 'name': 'Bank 123456', + 'code': 'BNK67', + 'type': 'bank', + 'bank_acc_number': '112233', + 'currency_id': self.env.ref('base.USD').id, + }) + + camt_file_path = 'odex30_account_bank_statement_import_camt/test_camt_file/test_camt_no_opening_balance.xml' + + def import_file(): + with file_open(camt_file_path, 'rb') as camt_file: + bank_journal.create_document_from_attachment(self.env['ir.attachment'].create({ + 'mimetype': 'application/xml', + 'name': 'test_camt_no_opening_balance.xml', + 'raw': camt_file.read(), + }).ids) + + import_file() + with self.assertRaises(UserError, msg='You already have imported that file.'): + import_file() + + def test_import_camt_with_nordic_tags(self): + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._import_camt_file('camt_053_several_tx_details_nordic.xml', usd_currency) + imported_statement = self.env['account.bank.statement'].search([('company_id', '=', self.env.company.id)], order='id desc', limit=1) + self.assertEqual(len(imported_statement.line_ids), 3) + third_line = imported_statement.line_ids[2] + self.assertEqual(third_line.payment_ref, 'Transaction 03 name') + self.assertEqual(third_line.partner_name, 'Ultimate Debtor Name') + + def test_import_camt_additional_entry_info(self): + """ + Ensures that '' is used as a fallback for the payment reference + """ + usd_currency = self.env.ref("base.USD") + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._import_camt_file("camt_053_additional_entry_info.xml", usd_currency) + imported_statement = self.env["account.bank.statement"].search( + [("company_id", "=", self.env.company.id)], order="id desc", limit=1 + ) + self.assertEqual(len(imported_statement.line_ids), 1) + self.assertEqual(imported_statement.line_ids.payment_ref, "entry info") + + def test_import_camt_amounts_with_fees(self): + """ + Ensures that '' is used as a fallback for the payment reference + """ + usd_currency = self.env.ref("base.USD") + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._import_camt_file("camt_053_exchange_fees.xml", usd_currency) + imported_statement = self.env["account.bank.statement"].search( + [("company_id", "=", self.env.company.id)], order="id desc", limit=1 + ) + self.assertEqual(len(imported_statement.line_ids), 1) + self.assertRecordValues(imported_statement.line_ids, [{ + 'amount': 1672.98, + }]) + + def test_camt_file_import_namespace(self): + """ + Ensures that CAMT files using namespaces can be imported. + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_namespace.xml', usd_currency) + + def test_camt_file_import_custom_code(self): + """ + Ensures that CAMT files with custom codes can be imported. + """ + usd_currency = self.env.ref('base.USD') + self.assertEqual(self.env.company.currency_id.id, usd_currency.id) + self._test_minimal_camt_file_import('camt_053_custom_codes.xml', usd_currency) + bank_st_record = self.env['account.bank.statement'].search( + [('name', '=', '2514988305.2019-02-13')] + ).filtered(lambda bk_stmt: bk_stmt.currency_id == usd_currency).ensure_one() + line = bank_st_record.line_ids.ensure_one() + self.assertEqual(line.transaction_type, "custom_code: custom_family (custom_subfamily)") diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/__init__.py new file mode 100644 index 0000000..35e7c96 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import models +from . import wizard diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/__manifest__.py b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/__manifest__.py new file mode 100644 index 0000000..1808e41 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/__manifest__.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'Import CSV Bank Statement', + 'category': 'Odex30-Accounting/Odex30-Accounting', + 'author': "Expert Co. Ltd.", + 'website': "http://www.exp-sa.com", + 'version': '1.0', + 'description': r''' +Module to import CSV bank statements. +====================================== + +This module allows you to import CSV Files in Odoo: they are parsed and stored in human readable format in +Accounting \ Bank and Cash \ Bank Statements. + +Important Note +--------------------------------------------- +Because of the CSV format limitation, we cannot ensure the same transactions aren't imported several times or handle multicurrency. +Whenever possible, you should use a more appropriate file format like OFX. +''', + 'depends': ['odex30_account_bank_statement_import', 'base_import'], + 'installable': True, + 'auto_install': True, + 'assets': { + 'web.assets_backend': [ + 'odex30_account_bank_statement_import_csv/static/src/**/*', + ], + } +} diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..295270879bdc4c02ae6b2bd75d153d6d57055124 GIT binary patch literal 347 zcmZ3^%ge<81RKsqWjX`t#~=<2FhLog<$#Ro3@HpLj5!Rsj8Tk?AT|?_%@oB1WHSdd zXtKOy1S-;Gyv3HApOTtW3}TgMRwWjt_-QiVVklw;$`-KziIohWfh5DPN%|T2xvBbz zIoTPBRYh5u`T>>68Hq)?0Y&*)smUe9`aokUj17QPe!i}ug&u?j7Bw=6PfSkEFU>2- z%uCl#NiB, 2025 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-12-19 09:52+0000\n" +"PO-Revision-Date: 2024-09-25 09:43+0000\n" +"Last-Translator: Malaz Abuidris , 2025\n" +"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#. module: odex30_account_bank_statement_import_csv +#: model:ir.model,name:odex30_account_bank_statement_import_csv.model_base_import_import +msgid "Base Import" +msgstr "الاستيراد الأساسي" + +#. module: odex30_account_bank_statement_import_csv +#. odoo-javascript +#: code:addons/odex30_account_bank_statement_import_csv/static/src/bank_statement_csv_import_action.js:0 +msgid "Import Bank Statement" +msgstr "استيراد كشف حساب بنكي" + +#. module: odex30_account_bank_statement_import_csv +#: model:ir.model,name:odex30_account_bank_statement_import_csv.model_account_journal +msgid "Journal" +msgstr "دفتر اليومية" + +#. module: odex30_account_bank_statement_import_csv +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_csv/wizard/account_bank_statement_import_csv.py:0 +msgid "Make sure that an Amount or Debit and Credit is in the file." +msgstr "تأكد من وجود مبلغ أو رصيد مدين ومخصوم في الملف. " + +#. module: odex30_account_bank_statement_import_csv +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_csv/models/account_journal.py:0 +msgid "Mixing CSV files with other file types is not allowed." +msgstr "" +"لا يسمح بخلط ملفات القيم المفصولة بفواصل (CSV) مع أنواع الملفات الأخرى. " + +#. module: odex30_account_bank_statement_import_csv +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_csv/models/account_journal.py:0 +msgid "Only one CSV file can be selected." +msgstr "يمكنك تحديد ملف قيم مفصولة بفواصل (CSV) واحد فقط. " + +#. module: odex30_account_bank_statement_import_csv +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_csv/wizard/account_bank_statement_import_csv.py:0 +msgid "Rows must be sorted by date." +msgstr "يجب أن يتم فرز الصفوف حسب التاريخ. " diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/models/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/models/__init__.py new file mode 100644 index 0000000..5cd061d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import account_journal \ No newline at end of file diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5459258147355560c44fc5cae58e79c0660c2cfb GIT binary patch literal 318 zcmZ3^%ge<81XX9FGR=VWV-N=hn4pZ$LO{lJh7^Vr#vF!R#wbQch7_h?22JLdj6exZ z##{V}$;tVpc_r~#`K3j9i8+3nOt%<{n1PZj89svy`888NBR@A)KQSjeBeAL|D^ow9 zGC3o$C^w)eKPxr4q*y;cCAGrX07&KM>l#|BZGLT@tJw)`YEYp@esAhqNpPA zNr`#c@x>*HC8@coKv!kv7UUO|#3vV*>E{Af<`nD4$7kkcmc+;F6;%G>umK8|=A_yc haR6Nk@=>uokodsN$jJDCje$|_0)s3jDq;hw0RRYXU4sAs literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/models/__pycache__/account_journal.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/models/__pycache__/account_journal.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e3ed62e39472b22c8c118d68cc09382fa2ae00b GIT binary patch literal 3465 zcmbtW-ESMm5#ReDbrdC?OsWc1G1b|z<1mUz+jVU@kd+p3ZJ}+Hz-m*KaeF=8oureF zJaz9RQ8bMRL4eYMfjET?3x$CSMeDZkOCI{r$NmEac*FrB7BFC-=tJHZC=Y?3I(tV_ zJlX+VbV&|(W|Q(*Hf zLwVNZ3Vfbt5R0xNjr$mByw0w+*P(|TLXY4Vw0u;H%%e>73(96#!pJ0Aur%GYGYpCS z%+~P_F}ASUn(qIxE#}}Xbbbp)=qS%t4o~xoIMq@t~@;p_YkN7+fe6)&6Oui44 zMaa+(RMpxjIzO^Da8WVKq7v}g)j*&!UHW+FQ+p3Kf!t&6Bd2ThA;=!VFKByRBW)Q% z;W;;%3bWTf!r>(7ErT!r$UKBS9(DF%P=x`L*|`iyxVPuuC)~nM<_QmE0VEN7V_nDO zl)S7v@}g2)lWj+F^nzY=Y+2b<3{zP&b=fGaTiB78EL>0=n?&`JqZc(;&)d4WM0jkQ z4vERKYAUuZ%Qii&B<(!i%dJ=iJ*Sv!D@qx!8oBqj)fEL7-ow_at~z!OE~@n1)9`0m zr_M}egPt!vds=S!)F>|JG<{PJ=5|ZNk{L5Hk|dm<(uAz8=<1qG2U|EQAMJJf zGgIh>HVx7p)DT~)i3_{4f0+CIoSS~bOTV$7K3h+pb<^j(^tt`?rF!~OZRY20dcjLC z)Px0`gk>SWLLv(M`a3Y}9z)~4I}j^9KG2vo8n_5o+Zmz4T<#4;R^uw{Cc=`&`~PW& z-dw9Wos@-;772%CnEQySuzOuA+dIHIE%7Tz&(iwFI?MOsoo-i0 z6Ttp~wxIhg(5Gp_Z(8gD-=l}G@T)`Z@d~H)PXhzGyJc}I(+0Fb(86`^tqnckH1Pok z5jQ;d1<#8t%?KBj?6hgAifPY4 zr@i!Bpv^u51QKX1aV_}%!@hTJm)}q2>Z#o4+}{N^bbYs$*D1JFA)oRAe$7_G!VP**H+tr&>h^$}&!Y zBk4u@DmX`3Ced{TD+N0v5)KkGra_Krt|1Zs34q-B-yPS|%D)f;gZ?QCIxO1mU2P0C7rWuyu;y_?U*ZP4mgG zC1^W7vM_~1`NRuBik25!fynt9@bjPeQ1ylzANS(pyGlJiQHxJB+K>X+{BsS6o4DpB zu2tWL@_Waw-l*Q#-S{iFTiLBV9-a6zQ#+P-r4Kym19$YgH+sD`e7zwiKHdIgdw1m4 zhqpi6J5m>q)x=}1xmR52swZ7_M`yj!+1l{z<7Dcy3wJN+)gy=II|AiI6h+ZlgY`qdy-85x6!vyzF6W{lP ztEVXsQ$m0C3J|#0_NO6AJF`umi;OhUb4WiE`2_=hJ*3f>BXEKjBmVh()pMCX!qZ2o zA1Ii<1BgiZtX@*}bw4QmKq8TM;1O#2i}1@ZE!cx%@~JQ#_+|!Q29}=CUIx 1: + csv = [bool(self._check_file_format(att.name)) for att in attachments] + if True in csv and False in csv: + raise UserError(_('Mixing CSV files with other file types is not allowed.')) + if csv.count(True) > 1: + raise UserError(_('Only one CSV file can be selected.')) + return super()._import_bank_statement(attachments) + + if not self._check_file_format(attachments.name): + return super()._import_bank_statement(attachments) + ctx = dict(self.env.context) + import_wizard = self.env['base_import.import'].create({ + 'res_model': 'account.bank.statement.line', + 'file': attachments.raw, + 'file_name': attachments.name, + 'file_type': attachments.mimetype, + }) + ctx['wizard_id'] = import_wizard.id + ctx['default_journal_id'] = self.id + return { + 'type': 'ir.actions.client', + 'tag': 'import_bank_stmt', + 'params': { + 'model': 'account.bank.statement.line', + 'context': ctx, + 'filename': attachments.name, + } + } diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/static/csv/account.bank.statement.csv b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/static/csv/account.bank.statement.csv new file mode 100644 index 0000000..b27f721 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/static/csv/account.bank.statement.csv @@ -0,0 +1,6 @@ +Date,Reference,Partner,Label,Amount,Amount Currency,Currency,Cumulative Balance +2017-05-10,INV/2017/0001,,#01,4610,,,4710 +2017-05-11,Payment bill 20170521,,#02,-100,,,4610 +2017-05-15,INV/2017/0003 discount 2% early payment,,#03,514.5,,,5124.5 +2017-05-30,INV/2017/0002 + INV/2017/0004,,#04,5260,,,10384.5 +2017-05-31,Payment bill EUR 001234565,,#05,-537.15,-500,EUR,9847.35 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/static/src/bank_statement_csv_import_action.js b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/static/src/bank_statement_csv_import_action.js new file mode 100644 index 0000000..e2dd13b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/static/src/bank_statement_csv_import_action.js @@ -0,0 +1,47 @@ +/** @odoo-module **/ + +import { onWillStart } from "@odoo/owl"; +import { registry } from "@web/core/registry"; +import { useService } from "@web/core/utils/hooks"; +import { _t } from "@web/core/l10n/translation"; +import { ImportAction } from "@base_import/import_action/import_action"; +import { useBankStatementCSVImportModel } from "./bank_statement_csv_import_model"; + +export class BankStatementImportAction extends ImportAction { + setup() { + super.setup(); + + this.action = useService("action"); + + this.model = useBankStatementCSVImportModel({ + env: this.env, + resModel: this.resModel, + context: this.props.action.params.context || {}, + orm: this.orm, + }); + + this.env.config.setDisplayName(_t("Import Bank Statement")); // Displayed in the breadcrumbs + this.state.filename = this.props.action.params.filename || undefined; + + onWillStart(async () => { + if (this.props.action.params.context) { + this.model.id = this.props.action.params.context.wizard_id; + await super.handleFilesUpload([{ name: this.state.filename }]) + } + }); + } + + async exit() { + if (this.model.statement_id) { + const res = await this.orm.call( + "account.bank.statement", + "action_open_bank_reconcile_widget", + [this.model.statement_id] + ); + return this.action.doAction(res); + } + super.exit(); + } +} + +registry.category("actions").add("import_bank_stmt", BankStatementImportAction); diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/static/src/bank_statement_csv_import_model.js b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/static/src/bank_statement_csv_import_model.js new file mode 100644 index 0000000..d990721 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/static/src/bank_statement_csv_import_model.js @@ -0,0 +1,37 @@ +/** @odoo-module **/ + +import { useState } from "@odoo/owl"; +import { BaseImportModel } from "@base_import/import_model"; + +class BankStatementCSVImportModel extends BaseImportModel { + async init() { + this.importOptionsValues.bank_stmt_import = { + value: true, + }; + return Promise.resolve(); + } + + async _onLoadSuccess(res) { + super._onLoadSuccess(res); + + if (!res.messages || res.messages.length === 0 || res.messages.length > 1) { + return; + } + + const message = res.messages[0]; + if (message.ids) { + this.statement_line_ids = message.ids + } + + if (message.messages && message.messages.length > 0) { + this.statement_id = message.messages[0].statement_id + } + } +} + +/** + * @returns {BankStatementCSVImportModel} + */ +export function useBankStatementCSVImportModel({ env, resModel, context, orm }) { + return useState(new BankStatementCSVImportModel({ env, resModel, context, orm })); +} diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv.csv b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv.csv new file mode 100644 index 0000000..8e8bfea --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv.csv @@ -0,0 +1,20 @@ +02 01 15;;LAST STATEMENT;; $21,699.55 +02 02 15;;"DEBIT CARD 6906 EFF 02-01""01/31 MAILCHIMP MAILCHIMP.COMGA";($240.00); $21,459.55 +02 02 15;;"DEBIT CARD 6906 EFF 02-01""01/31 INDEED 203-564-2400 CT";($500.08); $20,959.46 +02 02 15;;"ACH CREDIT""AMERICAN EXPRESS-SETTLEMENT";$3,728.87 ; $24,688.34 +02 02 15;;"DEBIT CARD 6906""BAYSIDE MARKET/1 SAN FRANCISCO CA";($41.64); $24,646.70 +02 02 15;;"DEBIT CARD 6906""02/02 COMFORT INNS SAN FRANCISCOCA";($2,064.82); $22,581.88 +02 03 15;;"ACH CREDIT""CHECKFLUID INC -013015";$2,500.00 ; $25,081.88 +02 03 15;;"DEBIT CARD 6906""02/02 DISTRICT SF SAN FRANCISCOCA";($45.86); $25,036.02 +02 03 15;;"DEPOSIT-WIRED FUNDS""TVET OPERATING PLLC";$8,366.00 ; $33,402.02 +02 03 15;;"DEBIT CARD 6906""02/03 IBM USED PC 888S 188-874-6742 NY";($4,344.66); $29,057.36 +02 03 15;;"DEBIT CARD 6906""02/02 VIR ATL 9327 180-08628621 CT";($1,284.33); $27,773.03 +02 03 15;;"DEBIT CARD 6906""02/02 VIR ATL 9327 180-08628621 CT";($1,284.33); $26,488.70 +02 03 15;;"DEBIT CARD 6906""02/02 VIR ATL 9327 180-08628621 CT";($1,284.33); $25,204.37 +02 03 15;;"DEBIT CARD 6906""02/02 VIR ATL 9327 180-08628621 CT";($1,123.33); $24,081.04 +02 03 15;;"DEBIT CARD 6906""02/02 VIR ATL 9327 180-08628621 CT";($1,123.33); $22,957.71 +02 03 15;;"ACH DEBIT""AUTHNET GATEWAY -BILLING";($25.00); $22,932.71 +02 03 15;;"ACH DEBIT""WW 222 BROADWAY -ACH";($7,500.00); $15,432.71 +02 04 15;;"DEBIT CARD 6906""02/03 VIR ATL 9327 180-08628621 CT";($1,284.33); $14,148.38 +02 04 15;;"DEBIT CARD 6906""02/04 GROUPON INC 877-788-7858 IL";($204.23); $13,944.15 +02 05 15;;"ACH CREDIT""MERCHE-SOLUTIONS-MERCH DEP";$9,518.40 ; $23,462.55 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_empty_date.csv b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_empty_date.csv new file mode 100644 index 0000000..e1769a4 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_empty_date.csv @@ -0,0 +1,5 @@ +02 01 15;;LAST STATEMENT;; $21,699.55 +02 02 15;;"DEBIT CARD 6906 EFF 02-01""01/31 MAILCHIMP MAILCHIMP.COMGA"; ($240.00); $21,459.55 +04 02 15;;"DEBIT CARD 6906 EFF 02-01""01/31 INDEED 203-564-2400 CT"; ($500.08); $20,959.46 +02 02 15;;"ACH CREDIT""AMERICAN EXPRESS-SETTLEMENT"; $3,728.87; $24,688.34 +;;"DEBIT CARD 6906""BAYSIDE MARKET/1 SAN FRANCISCO CA"; ($41.64); $24,646.70 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_missing_values.csv b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_missing_values.csv new file mode 100644 index 0000000..b930490 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_missing_values.csv @@ -0,0 +1,2 @@ +TRANSFER;bank_ref_1;bank_statement_line_1;;1000 +TRANSFER;;bank_statement_line_2;;3500 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_non_sorted.csv b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_non_sorted.csv new file mode 100644 index 0000000..98d6a30 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_non_sorted.csv @@ -0,0 +1,4 @@ +02 01 15;;LAST STATEMENT;; $21,699.55 +02 02 15;;"DEBIT CARD 6906 EFF 02-01""01/31 MAILCHIMP MAILCHIMP.COMGA";($240.00); $21,459.55 +04 02 15;;"DEBIT CARD 6906 EFF 02-01""01/31 INDEED 203-564-2400 CT";($500.08); $20,959.46 +02 02 15;;"ACH CREDIT""AMERICAN EXPRESS-SETTLEMENT";$3,728.87 ; $24,688.34 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_without_amount.csv b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_without_amount.csv new file mode 100644 index 0000000..3d1973e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/test_csv_file/test_csv_without_amount.csv @@ -0,0 +1,3 @@ +02 01 15;;LAST STATEMENT; +02 02 15;;"DEBIT CARD 6906 EFF 02-01""01/31 MAILCHIMP MAILCHIMP.COMGA"; + diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/tests/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/tests/__init__.py new file mode 100644 index 0000000..3eb2e34 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import test_import_bank_statement diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/tests/test_import_bank_statement.py b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/tests/test_import_bank_statement.py new file mode 100644 index 0000000..57e3386 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/tests/test_import_bank_statement.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from odoo.addons.account.tests.common import AccountTestInvoicingCommon +from odoo import fields +from odoo.exceptions import UserError, ValidationError +from odoo.tests import tagged +from odoo.tools import file_open + + +@tagged('post_install', '-at_install') +class TestAccountBankStatementImportCSV(AccountTestInvoicingCommon): + + def _import_file(self, csv_file_path, csv_fields=False): + # Create a bank account and journal corresponding to the CSV file (same currency and account number) + bank_journal = self.env['account.journal'].create({ + 'name': 'Bank 123456', + 'code': 'BNK67', + 'type': 'bank', + 'bank_acc_number': '123456', + 'currency_id': self.env.ref("base.USD").id, + }) + + # Use an import wizard to process the file + with file_open(csv_file_path, 'rb') as csv_file: + action = bank_journal.create_document_from_attachment(self.env['ir.attachment'].create({ + 'mimetype': 'text/csv', + 'name': 'test_csv.csv', + 'raw': csv_file.read(), + }).ids) + import_wizard = self.env['base_import.import'].browse( + action['params']['context']['wizard_id'] + ).with_context(action['params']['context']) + + import_wizard_options = { + 'date_format': '%m %d %y', + 'keep_matches': False, + 'encoding': 'utf-8', + 'fields': [], + 'quoting': '"', + 'bank_stmt_import': True, + 'headers': True, + 'limit': 10, + 'skip': 0, + 'separator': ';', + 'float_thousand_separator': ',', + 'float_decimal_separator': '.', + 'advanced': False, + } + import_wizard_fields = csv_fields or ['date', False, 'payment_ref', 'amount', 'balance'] + res = import_wizard.execute_import(import_wizard_fields, [], import_wizard_options, dryrun=False) + while not res['messages'] and res['nextrow'] != 0: # no error and there is a next row + import_wizard_options['skip'] = res['nextrow'] + 1 + res = import_wizard.execute_import(import_wizard_fields, [], import_wizard_options, dryrun=False) + + def test_csv_file_import(self): + self._import_file('odex30_account_bank_statement_import_csv/test_csv_file/test_csv.csv') + + # Check the imported bank statement + imported_statement = self.env['account.bank.statement'].search([('company_id', '=', self.env.company.id)]) + self.assertRecordValues(imported_statement, [ + { + 'reference': 'test_csv.csv', + 'balance_start': 27773.03, + 'balance_end_real': 23462.55, + }, + { + 'reference': 'test_csv.csv', + 'balance_start': 21699.55, + 'balance_end_real': 23462.55, + } + ]) + self.assertRecordValues(imported_statement.line_ids.sorted(lambda line: (line.date, line.payment_ref)), [ + {'date': fields.Date.from_string('2015-02-02'), 'amount': 3728.87, 'payment_ref': 'ACH CREDIT"AMERICAN EXPRESS-SETTLEMENT'}, + {'date': fields.Date.from_string('2015-02-02'), 'amount': -500.08, 'payment_ref': 'DEBIT CARD 6906 EFF 02-01"01/31 INDEED 203-564-2400 CT'}, + {'date': fields.Date.from_string('2015-02-02'), 'amount': -240.00, 'payment_ref': 'DEBIT CARD 6906 EFF 02-01"01/31 MAILCHIMP MAILCHIMP.COMGA'}, + {'date': fields.Date.from_string('2015-02-02'), 'amount': -2064.82, 'payment_ref': 'DEBIT CARD 6906"02/02 COMFORT INNS SAN FRANCISCOCA'}, + {'date': fields.Date.from_string('2015-02-02'), 'amount': -41.64, 'payment_ref': 'DEBIT CARD 6906"BAYSIDE MARKET/1 SAN FRANCISCO CA'}, + {'date': fields.Date.from_string('2015-02-03'), 'amount': 2500.00, 'payment_ref': 'ACH CREDIT"CHECKFLUID INC -013015'}, + {'date': fields.Date.from_string('2015-02-03'), 'amount': -25.00, 'payment_ref': 'ACH DEBIT"AUTHNET GATEWAY -BILLING'}, + {'date': fields.Date.from_string('2015-02-03'), 'amount': -7500.00, 'payment_ref': 'ACH DEBIT"WW 222 BROADWAY -ACH'}, + {'date': fields.Date.from_string('2015-02-03'), 'amount': -45.86, 'payment_ref': 'DEBIT CARD 6906"02/02 DISTRICT SF SAN FRANCISCOCA'}, + {'date': fields.Date.from_string('2015-02-03'), 'amount': -1284.33, 'payment_ref': 'DEBIT CARD 6906"02/02 VIR ATL 9327 180-08628621 CT'}, + {'date': fields.Date.from_string('2015-02-03'), 'amount': -1284.33, 'payment_ref': 'DEBIT CARD 6906"02/02 VIR ATL 9327 180-08628621 CT'}, + {'date': fields.Date.from_string('2015-02-03'), 'amount': -1123.33, 'payment_ref': 'DEBIT CARD 6906"02/02 VIR ATL 9327 180-08628621 CT'}, + {'date': fields.Date.from_string('2015-02-03'), 'amount': -1123.33, 'payment_ref': 'DEBIT CARD 6906"02/02 VIR ATL 9327 180-08628621 CT'}, + {'date': fields.Date.from_string('2015-02-03'), 'amount': -1284.33, 'payment_ref': 'DEBIT CARD 6906"02/02 VIR ATL 9327 180-08628621 CT'}, + {'date': fields.Date.from_string('2015-02-03'), 'amount': -4344.66, 'payment_ref': 'DEBIT CARD 6906"02/03 IBM USED PC 888S 188-874-6742 NY'}, + {'date': fields.Date.from_string('2015-02-03'), 'amount': 8366.00, 'payment_ref': 'DEPOSIT-WIRED FUNDS"TVET OPERATING PLLC'}, + {'date': fields.Date.from_string('2015-02-04'), 'amount': -1284.33, 'payment_ref': 'DEBIT CARD 6906"02/03 VIR ATL 9327 180-08628621 CT'}, + {'date': fields.Date.from_string('2015-02-04'), 'amount': -204.23, 'payment_ref': 'DEBIT CARD 6906"02/04 GROUPON INC 877-788-7858 IL'}, + {'date': fields.Date.from_string('2015-02-05'), 'amount': 9518.40, 'payment_ref': 'ACH CREDIT"MERCHE-SOLUTIONS-MERCH DEP'}, + ]) + + def test_csv_file_import_with_missing_values(self): + self._import_file('odex30_account_bank_statement_import_csv/test_csv_file/test_csv_missing_values.csv', ['transaction_type', 'ref', 'payment_ref', 'debit', 'credit']) + + imported_statement = self.env['account.bank.statement'].search([('company_id', '=', self.env.company.id)]) + + self.assertEqual(len(imported_statement.line_ids), 2) + + self.assertRecordValues(imported_statement.line_ids.sorted(lambda line: line.amount), [ + {'transaction_type': 'TRANSFER', 'ref': 'bank_ref_1', 'payment_ref': 'bank_statement_line_1', 'sequence': 0, 'amount': 1000.0}, + {'transaction_type': 'TRANSFER', 'ref': False, 'payment_ref': 'bank_statement_line_2', 'sequence': 1, 'amount': 3500.0}, + ]) + + def test_csv_file_import_non_ordered(self): + with self.assertRaises(UserError): + self._import_file('odex30_account_bank_statement_import_csv/test_csv_file/test_csv_non_sorted.csv') + + def test_csv_file_empty_date(self): + with self.assertRaises(UserError): + self._import_file('odex30_account_bank_statement_import_csv/test_csv_file/test_csv_empty_date.csv') + + def test_csv_file_import_without_amount(self): + csv_fields = ['date', False, 'payment_ref', 'balance'] + with self.assertRaisesRegex(ValidationError, "Make sure that an Amount or Debit and Credit is in the file."): + self._import_file('odex30_account_bank_statement_import_csv/test_csv_file/test_csv_without_amount.csv', csv_fields) diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/wizard/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/wizard/__init__.py new file mode 100644 index 0000000..da76434 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/wizard/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import account_bank_statement_import_csv diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/wizard/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/wizard/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8809bff5dbb2b6327c78a8c77dd5f83da8bb296 GIT binary patch literal 336 zcmZ3^%ge<81lK2oW=;Xpk3k$5V1hC}3jrC^8B!Qh7;_kM8KW2(8B&;n88n$+G6E$u z8E+{jCMV~Y=9R=JCFW(v7ndZKq~@jqxtX~I`9&r1$;D-UnoPGCikN}QS2BDC8T)Id zenx(7s(xZlc1B`VQC6mYKxJ}9Vo`2DQGQlxa!Ij%eoAVEu>p|E&(}4y(1WnRqDBVs zPzy8j()CkP%iTZlX-=wL5eLwv dAU_t%1BnmJjEsyQI2afWE->h0q9Qh+8UXtOW+wmu literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_csv/wizard/__pycache__/account_bank_statement_import_csv.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import_csv/wizard/__pycache__/account_bank_statement_import_csv.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15d20b706b57fdcdbd485901490300cd7138a8e1 GIT binary patch literal 8774 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 XU}j`w{J_S*D0+cG1QQjp0o4Ei6gpOU literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/i18n/account_bank_statement_import_ofx.pot b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/i18n/account_bank_statement_import_ofx.pot new file mode 100644 index 0000000..82ad174 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/i18n/account_bank_statement_import_ofx.pot @@ -0,0 +1,33 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_bank_statement_import_ofx +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-05-07 20:46+0000\n" +"PO-Revision-Date: 2025-05-07 20:46+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: odex30_account_bank_statement_import_ofx +#: model:ir.model,name:odex30_account_bank_statement_import_ofx.model_account_journal +msgid "Journal" +msgstr "" + +#. module: odex30_account_bank_statement_import_ofx +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_ofx/models/account_journal.py:0 +msgid "The library 'ofxparse' is missing, OFX import cannot proceed." +msgstr "" + +#. module: odex30_account_bank_statement_import_ofx +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_ofx/models/account_journal.py:0 +msgid "There was an issue decoding the file. Please check the file encoding." +msgstr "" diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/i18n/ar.po b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/i18n/ar.po new file mode 100644 index 0000000..8e021c2 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/i18n/ar.po @@ -0,0 +1,38 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_bank_statement_import_ofx +# +# Translators: +# Wil Odoo, 2024 +# Malaz Abuidris , 2025 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-05-07 20:46+0000\n" +"PO-Revision-Date: 2024-09-25 09:43+0000\n" +"Last-Translator: Malaz Abuidris , 2025\n" +"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#. module: odex30_account_bank_statement_import_ofx +#: model:ir.model,name:odex30_account_bank_statement_import_ofx.model_account_journal +msgid "Journal" +msgstr "دفتر اليومية" + +#. module: odex30_account_bank_statement_import_ofx +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_ofx/models/account_journal.py:0 +msgid "The library 'ofxparse' is missing, OFX import cannot proceed." +msgstr "المكتبة 'ofxparse' غير مثبتة، لن يمكن استيراد ملفات OFX بدونها." + +#. module: odex30_account_bank_statement_import_ofx +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_ofx/models/account_journal.py:0 +msgid "There was an issue decoding the file. Please check the file encoding." +msgstr "حدثت مشكلة أثناء فك تشفير الملف. يرجى التحقق من ترميز الملف. " diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/models/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/models/__init__.py new file mode 100644 index 0000000..5cd061d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import account_journal \ No newline at end of file diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..354cec5699142f0052264d4c56d7e6d11c4455f6 GIT binary patch literal 318 zcmZ3^%ge<81V_$AWtsu$#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@8G#a- zjJNm`laupH^Gf2g@=J^I5_9}CnQk!@F#{!6GJFOZ@@uAkMt*Lpeqv5`Mq*V_R;GSH zWpYMhQEos{epYI7NwI!@N@|6%0g%ei*EO`zgRsD&Mh5Xv<1_Qp^;1&I;vs60MNviK zlM?f?`%qiB7kI&4@EQycTE2#X%VFMH_%}KQ@ h;sCl7%4l*p1}I}h23oo>Q7VJXf?qQr-C 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 z z(mkdA>TA+oi%nB^Zzc7Q!L`(kSk14)C7QL=lGX&+p&HJXF?r|xh9jRX`mR1{Kod2b zFx1inTLP8`wnH!IN^fc0>TCT90R8wbc*Yp~t6;+bKV#CEG$i#4;7WQA%q1rA0ek8E zw;%j3l7J(pyV0;H!kOYQ2i{-lR2>d)@sax~iiZS&_lek^;lo@W5GM~0_y(Wy9wvSS zIT1}5)})1z)0%$nndfFTLr@Hb!gqzaUMoS0=EvQ!f?_HW334s92^o-g_CDE z6ZUae;FJ-L{)rPwIIHsp$8hC1?||+Xh|-@o2xXOhm$>6pBYz zrxKI({srN2UEG766u~z^vMS;f+>{=F2h+X?V3W#I`a|Ftl)wXLTdw=4+C8RrPv%Xf zR>)Bt=*%0argqiVm1oM$<;M#CM0Lo4_b=#N{nxs?PRQWC3CQ5s z&%;I2d4_6otF~U%Hn20C zXG%Q;hrD#c3Hd8u(N*+eS25uzIgVl8hu;A_(irybNbxdAgd431pDuz6ix16_q&Z7f z2u8s@hJ(x_$Pajh6RM8DW5tUwqY?IX5O$(So&fv95GKL6am{q@7G%>dT}CfMuh#r> zEDXy*n8k~t5Jw@LKhRA0&=mghqA}nKYgTZ_F#>q)LCp+H3;ux-PCycnEGD>;^$EE< zQNU-fg#-fp{XmG_Ku=qNLeMiM? zQ!}XjeDu`T z%`|=Q_SWrBe~`KeQF0TE)-|AZ9p63q>6u?oWzSy8oV_By_^NW&ub%ZQU9YKKuVuUD zGhOp?XjzU(O4pj&wYFv1YdxB69nQ24|MI0z{GVEskr{PlMroZ@TW7bJE#}dl3rE&K zy&CSdc7H(2hrx$aCB0EV^`x*mC#pEp|1Mq-5@;)nj&#K%+mYd0N zGr0qY)3fs6gzTKmGrIG%{UN36aX^l@$B{R{QxCCK`5FUE$40e#?j`fo0kh*F2B`}< zTie^0-@3eg;r^Ur8&YjUvTZ15YtPy`Gq%p{AE;eEwd<5(JFVJI%eK=wPgm;sTzhBg zQpH+R`leAZwF;LEPdsqx0|xdIp0F03ZV%j)7|t zme3X4Ml3TiTzGw>XEAsVfQWa%V(uDeBS}i~I_|)m7_8~iC+FZcFXr`(p#^808-R^9 zK=!B%S}X?GmCB&~tYIooeK$b%C^8Li8^SIO`Vj!l6p1e`!mdP&Ke~gP%r~PE9~fmp zD5TohlH*2p7|njU^asir{LdH7dWrlelBD7^Gg$NIfg+^oFyl1SdJx5cyk?Bg<3F2e zdi*algp*BVm(m=#?h{G}Lt-=ER<%L8vJdZg-+tVcO#%jTurK@TRdIhQxV zu1aBt2hO_dl!i(=@2a{&4Hh?p=RK`o4Y) V2FXv}XZxrRhNoMY&s{XY{{##FJ#hd4 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/models/account_journal.py b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/models/account_journal.py new file mode 100644 index 0000000..dd8c842 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/models/account_journal.py @@ -0,0 +1,182 @@ + +# -*- coding: utf-8 -*- + +import datetime +import io +import logging +import re +import unicodedata +from xml.etree import ElementTree + +try: + from ofxparse import OfxParser + OfxParserClass = OfxParser +except ImportError: + logging.getLogger(__name__).warning("The ofxparse python library is not installed, ofx import will not work.") + OfxParser = None + OfxParserClass = object + +from odoo import models, _ +from odoo.exceptions import UserError + + +class PatchedOfxParser(OfxParserClass): + """ This class monkey-patches the ofxparse library in order to fix the following known bug: ',' is a valid + decimal separator for amounts, as we can encounter in ofx files made by european banks. + """ + + @classmethod + def decimal_separator_cleanup(cls, tag): + if hasattr(tag, "contents"): + tag.string = tag.contents[0].replace(',', '.') + + @classmethod + def parseStatement(cls, stmt_ofx): + ledger_bal_tag = stmt_ofx.find('ledgerbal') + if hasattr(ledger_bal_tag, "contents"): + balamt_tag = ledger_bal_tag.find('balamt') + cls.decimal_separator_cleanup(balamt_tag) + avail_bal_tag = stmt_ofx.find('availbal') + if hasattr(avail_bal_tag, "contents"): + balamt_tag = avail_bal_tag.find('balamt') + cls.decimal_separator_cleanup(balamt_tag) + return super().parseStatement(stmt_ofx) + + @classmethod + def parseTransaction(cls, txn_ofx): + amt_tag = txn_ofx.find('trnamt') + cls.decimal_separator_cleanup(amt_tag) + return super().parseTransaction(txn_ofx) + + @classmethod + def parseInvestmentPosition(cls, ofx): + tag = ofx.find('units') + cls.decimal_separator_cleanup(tag) + tag = ofx.find('unitprice') + cls.decimal_separator_cleanup(tag) + return super().parseInvestmentPosition(ofx) + + @classmethod + def parseInvestmentTransaction(cls, ofx): + tag = ofx.find('units') + cls.decimal_separator_cleanup(tag) + tag = ofx.find('unitprice') + cls.decimal_separator_cleanup(tag) + return super().parseInvestmentTransaction(ofx) + + @classmethod + def parseOfxDateTime(cls, ofxDateTime): + res = re.search(r"^[0-9]*\.([0-9]{0,5})", ofxDateTime) + if res: + msec = datetime.timedelta(seconds=float("0." + res.group(1))) + else: + msec = datetime.timedelta(seconds=0) + + # Some banks seem to return some OFX dates as YYYY-MM-DD; so we remove + # the '-' characters to support them as well + ofxDateTime = ofxDateTime.replace('-', '') + + try: + local_date = datetime.datetime.strptime( + ofxDateTime[:14], '%Y%m%d%H%M%S' + ) + return local_date + msec + except Exception: + if not ofxDateTime or ofxDateTime[:8] == "00000000": + return None + + return datetime.datetime.strptime( + ofxDateTime[:8], '%Y%m%d') + msec + + +class AccountJournal(models.Model): + _inherit = 'account.journal' + + def _get_bank_statements_available_import_formats(self): + rslt = super(AccountJournal, self)._get_bank_statements_available_import_formats() + rslt.append('OFX') + return rslt + + + def _check_ofx(self, attachment): + if (attachment.raw or b'').startswith(b"OFXHEADER"): + #v1 OFX + return True + try: + #v2 OFX + return b"" in (attachment.raw or b'').lower() + except ElementTree.ParseError: + return False + + def _fill_transaction_vals_line_ofx(self, transaction, length_transactions, partner_bank): + return { + 'date': transaction.date, + 'payment_ref': transaction.payee + (transaction.memo and ': ' + transaction.memo or ''), + 'ref': transaction.id, + 'amount': float(transaction.amount), + 'unique_import_id': transaction.id, + 'account_number': partner_bank.acc_number, + 'partner_id': partner_bank.partner_id.id, + 'sequence': length_transactions + 1, + } + + def _parse_bank_statement_file(self, attachment): + if not self._check_ofx(attachment): + return super()._parse_bank_statement_file(attachment) + if OfxParser is None: + raise UserError(_("The library 'ofxparse' is missing, OFX import cannot proceed.")) + + try: + ofx = PatchedOfxParser.parse(io.BytesIO(attachment.raw)) + except UnicodeDecodeError: + # Replacing utf-8 chars with ascii equivalent + encoding = re.findall(b'encoding="(.*?)"', attachment.raw) + encoding = encoding[0] if len(encoding) > 1 else 'utf-8' + try: + attachment = unicodedata.normalize('NFKD', attachment.raw.decode(encoding)).encode('ascii', 'ignore') + ofx = PatchedOfxParser.parse(io.BytesIO(attachment)) + except UnicodeDecodeError: + raise UserError(_("There was an issue decoding the file. Please check the file encoding.")) + vals_bank_statement = [] + account_lst = set() + currency_lst = set() + # Since ofxparse doesn't provide account numbers, we'll have to find res.partner and res.partner.bank here + # (normal behaviour is to provide 'account_number', which the generic module uses to find partner/bank) + transaction_payees = [ + transaction.payee + for account in ofx.accounts + for transaction in account.statement.transactions + ] + partner_banks_dict = { + partner_bank.partner_id.name: partner_bank + for partner_bank in self.env['res.partner.bank'].search([ + ('partner_id.name', 'in', transaction_payees) + ]) + } + for account in ofx.accounts: + account_lst.add(account.number) + currency_lst.add(account.statement.currency) + transactions = [] + total_amt = 0.00 + for transaction in account.statement.transactions: + partner_bank = partner_banks_dict.get(transaction.payee, self.env['res.partner.bank']) + vals_line = self._fill_transaction_vals_line_ofx(transaction, len(transactions), partner_bank) + total_amt += float(transaction.amount) + transactions.append(vals_line) + + vals_bank_statement.append({ + 'transactions': transactions, + # WARNING: the provided ledger balance is not necessarily the ending balance of the statement + # see https://github.com/odoo/odoo/issues/3003 + 'balance_start': float(account.statement.balance) - total_amt, + 'balance_end_real': account.statement.balance, + }) + + if account_lst and len(account_lst) == 1: + account_lst = account_lst.pop() + currency_lst = currency_lst.pop() + else: + account_lst = None + currency_lst = None + + return currency_lst, account_lst, vals_bank_statement diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/description/icon.png b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2002d99d4e8e9173053bc5af3a9200fef847af6a GIT binary patch literal 1007 zcmV-|rwGpTA&l z5Wc|P&#!+#L6Gkt5U+qwA%H-ik8ob^-;XekU{SEIVNs3j(7ylx0_aIZK~!ko?U~7T zqc9LfO9+qvGua8AVrS@d(nIn8zt`?$p|s`jBw=m(;XXZ;5`5 zBgNowcpQHomM6)EXaOYQEdFLVNfvZF#+EF`<;&wDvSjnLSsbEEHjm>nx@0*%QFIAC z9lRu|?sAn#J|Pp;cCQ&-m$GOjTO_T{u4hpEDe5YoekFODJe#X9A!2FLH5(#n3dzoh zeOQc!y{NPKF)*?qPrh*g-~C2IaS%-z){a<>NfYMSmeM%lRZQ_LD(`g_X^j;;7g4~b zOSX|Ktqb=m-k|0uY_l#s7hOY>>@PXM()KM_$`>%<`>PZzXPZ1^b+?{DG#Q@R5pm}g zgtzp8)$EZ>86}}X`bEJ(Oiv8=?8wn42;Y?Sk(MFmF&oY75M@Y0W(BX$yP(sia;cU< zQHVv9F4ZzT$Y=^U_!Z^?l{g7|Czlj3}Q zi#U?*zmc>+A{mW5W+(Y066}u_&jA;L#`jioong#pZz~EMC~$);=n`dLy-lst`@%FBpJwytA+1sIgX1TGxYd$Pm{nP1_e)&JSYf`qRFu1pdfha zS7d0ygBVgddBfDfLEsHq`Hl#SjwY!tS$6LoGY&u<@==Z3La!9NA~OQqNBlf!I5Gk^ z1XIobWQ!RZo_;}h{h;xC=fgwP&?b@o5;)JZLywe$d d@x>R{;}6RV0I{A$KmGs!002ovPDHLkV1nPE<*fh! literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/description/icon.svg b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/description/icon.svg new file mode 100644 index 0000000..07c6969 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/description/icon.svg @@ -0,0 +1 @@ + diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/ofx/test_ofx.ofx b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/ofx/test_ofx.ofx new file mode 100644 index 0000000..e23d0fe --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/ofx/test_ofx.ofx @@ -0,0 +1,100 @@ + + + + + + + 0 + INFO + + 20130831165153.000[-8:PST] + ENG + + + + + 0 + + 0 + INFO + + + USD + + 000000123 + 123456 + CHECKING + + + 20130801 + 20130831165153.000[-8:PST] + + POS + 20130824080000 + -80 + 219378 + Norbert Brant + + + + 20130801 + 20130831165153.000[-8:PST] + + POS + 20130824080000 + -90 + 219379 + China Export + + + + 20130801 + 20130831165153.000[-8:PST] + + POS + 20130824080000 + -100 + 219380 + Axelor Scuba + + + + 20130801 + 20130831165153.000[-8:PST] + + POS + 20130824080000 + -90 + 219381 + China Scuba + + + + 2156.56 + 20130831165153 + + + + + + + 0 + + 0 + INFO + + + USD + + 123456 + + + + + -562.00 + 20130831165153 + + + + + diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/ofx/test_ofx_unicode_error.ofx b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/ofx/test_ofx_unicode_error.ofx new file mode 100644 index 0000000..9744131 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/static/ofx/test_ofx_unicode_error.ofx @@ -0,0 +1,56 @@ + +OFXHEADER:100 +DATA:OFXSGML +VERSION:102 +SECURITY:NONE +ENCODING:USASCII +CHARSET:1252 +COMPRESSION:NONE +OLDFILEUID:NONE +NEWFILEUID:NONE + + + + + + 0 + INFO + + 00000000000000 + POR + + + + + 0 + + 0< + INFO + + + BRL + + 000000123123456 + CHECKING + + + 20250116120000 + 20250116120000 + + DEBIT + 20241205120000 + -630,00 + 219378 + 123456 + All les dab! + + + + 630,00 + 00000000 + + + + + diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/tests/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/tests/__init__.py new file mode 100644 index 0000000..f68c22d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/tests/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import test_import_bank_statement diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/tests/test_import_bank_statement.py b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/tests/test_import_bank_statement.py new file mode 100644 index 0000000..2d6233a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_ofx/tests/test_import_bank_statement.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +from odoo.addons.account.tests.common import AccountTestInvoicingCommon +from odoo.exceptions import UserError +from odoo.tests import tagged +from odoo.tools import file_open + + +@tagged('post_install', '-at_install') +class TestAccountBankStatementImportOFX(AccountTestInvoicingCommon): + + def test_ofx_file_import(self): + bank_journal = self.env['account.journal'].create({ + 'name': 'Bank 123456', + 'code': 'BNK67', + 'type': 'bank', + 'bank_acc_number': '123456', + 'currency_id': self.env.ref('base.USD').id, + }) + + partner_norbert = self.env['res.partner'].create({ + 'name': 'Norbert Brant', + 'is_company': True, + }) + bank_norbert = self.env['res.bank'].create({'name': 'test'}) + partner_bank_norbert = self.env['res.partner.bank'].create({ + 'acc_number': 'BE93999574162167', + 'partner_id': partner_norbert.id, + 'bank_id': bank_norbert.id, + }) + + # Get OFX file content + ofx_file_path = 'account_bank_statement_import_ofx/static/ofx/test_ofx.ofx' + with file_open(ofx_file_path, 'rb') as ofx_file: + bank_journal.create_document_from_attachment(self.env['ir.attachment'].create({ + 'mimetype': 'application/xml', + 'name': 'test_ofx.ofx', + 'raw': ofx_file.read(), + }).ids) + + # Check the imported bank statement + imported_statement = self.env['account.bank.statement'].search([('company_id', '=', self.env.company.id)]) + self.assertRecordValues(imported_statement, [{ + 'reference': 'test_ofx.ofx', + 'balance_start': 2516.56, + 'balance_end_real': 2156.56, + }]) + self.assertRecordValues(imported_statement.line_ids.sorted('payment_ref'), [ + { + 'payment_ref': 'Axelor Scuba', + 'amount': -100.0, + 'partner_id': False, + 'account_number': False, + }, + { + 'payment_ref': 'China Export', + 'amount': -90.0, + 'partner_id': False, + 'account_number': False, + }, + { + 'payment_ref': 'China Scuba', + 'amount': -90.0, + 'partner_id': False, + 'account_number': False, + }, + { + 'payment_ref': partner_norbert.name, + 'amount': -80.0, + 'partner_id': partner_norbert.id, + 'account_number': partner_bank_norbert.acc_number, + }, + ]) + + def test_ofx_file_import_error(self): + """ + Check if a UserError is triggered when importing a file that contains characters that cannot be decoded with the default encoding + """ + bank_journal = self.env['account.journal'].create({ + 'name': 'Bank 123456', + 'code': 'BNK67', + 'type': 'bank', + 'bank_acc_number': '123456', + 'currency_id': self.env.ref('base.USD').id, + }) + + # Get OFX file content + # This file contains characters that cannot be decoded with the default encoding - PLEASE DO NOT UPDATE THIS FILE + ofx_file_path = 'account_bank_statement_import_ofx/static/ofx/test_ofx_unicode_error.ofx' + with self.assertRaises(UserError, msg="There was an issue decoding the file. Please check the file encoding."): + with file_open(ofx_file_path, 'rb') as ofx_file: + bank_journal.create_document_from_attachment(self.env['ir.attachment'].create({ + 'mimetype': 'application/xml', + 'name': 'test_ofx.ofx', + 'raw': ofx_file.read(), + }).ids) diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_qif/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/__init__.py new file mode 100644 index 0000000..cde864b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_qif/__manifest__.py b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/__manifest__.py new file mode 100644 index 0000000..288188e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/__manifest__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +{ + 'name': 'Import QIF Bank Statement', + 'category': 'Odex30-Accounting/Odex30-Accounting', + 'author': "Expert Co. Ltd.", + 'website': "http://www.exp-sa.com", + 'version': '1.0', + 'description': r''' +Module to import QIF bank statements. +====================================== + +This module allows you to import the machine readable QIF Files in Odoo: they are parsed and stored in human readable format in +Accounting \ Bank and Cash \ Bank Statements. + +Important Note +--------------------------------------------- +Because of the QIF format limitation, we cannot ensure the same transactions aren't imported several times or handle multicurrency. +Whenever possible, you should use a more appropriate file format like OFX. +''', + 'depends': ['odex30_account_bank_statement_import'], + 'data': [ + 'views/account_journal_views.xml', + ], + 'installable': True, + 'license': 'OEEL-1', +} diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_qif/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07e5fdbf303ba0e93681f64ec856e21f71448eea GIT binary patch literal 302 zcmZ3^%ge<81pm%QW$FRx#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@8G#a- zjJMcw^HWlDiv2X1ZZQ-w1I1P{db>KSRbgb!q@;v<>%`fTIfMoU{NE3_{8Mo{L;LV%)E5{l+?0#h+1S(RFU|k#JueI z;*!LY)ZEm(lK9Nrg8ZVA_`=LI{rLFIyv&mLc)fzkUmP|-*Oum_+7)pCoe1(lu{@CY Xz|6?V_<@aqQS<_X2qr3G1F8W4=T28A literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_qif/i18n/account_bank_statement_import_qif.pot b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/i18n/account_bank_statement_import_qif.pot new file mode 100644 index 0000000..df6d53b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/i18n/account_bank_statement_import_qif.pot @@ -0,0 +1,66 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_bank_statement_import_qif +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:26+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: odex30_account_bank_statement_import_qif +#: model:ir.model.fields,help:odex30_account_bank_statement_import_qif.field_account_journal__qif_date_format +msgid "" +"Although the historic QIF date format is month-first (mm/dd/yy), many " +"financial institutions use the local format.Therefore, it is frequent " +"outside the US to have QIF date formatted day-first (dd/mm/yy)." +msgstr "" + +#. module: odex30_account_bank_statement_import_qif +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_qif/models/account_journal.py:0 +msgid "Could not decipher the QIF file." +msgstr "" + +#. module: odex30_account_bank_statement_import_qif +#: model:ir.model.fields,help:odex30_account_bank_statement_import_qif.field_account_journal__qif_decimal_point +msgid "Field used to avoid conversion issues." +msgstr "" + +#. module: odex30_account_bank_statement_import_qif +#: model:ir.model,name:odex30_account_bank_statement_import_qif.model_account_journal +msgid "Journal" +msgstr "" + +#. module: odex30_account_bank_statement_import_qif +#: model:ir.model.fields,field_description:odex30_account_bank_statement_import_qif.field_account_journal__qif_date_format +msgid "QIF Dates format" +msgstr "" + +#. module: odex30_account_bank_statement_import_qif +#: model:ir.model.fields,field_description:odex30_account_bank_statement_import_qif.field_account_journal__qif_decimal_point +msgid "QIF Decimal Separator" +msgstr "" + +#. module: odex30_account_bank_statement_import_qif +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_qif/models/account_journal.py:0 +msgid "This file is either not a bank statement or is not correctly formed." +msgstr "" + +#. module: odex30_account_bank_statement_import_qif +#: model:ir.model.fields.selection,name:odex30_account_bank_statement_import_qif.selection__account_journal__qif_date_format__day_first +msgid "dd/mm/yy" +msgstr "" + +#. module: odex30_account_bank_statement_import_qif +#: model:ir.model.fields.selection,name:odex30_account_bank_statement_import_qif.selection__account_journal__qif_date_format__month_first +msgid "mm/dd/yy" +msgstr "" diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_qif/i18n/ar.po b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/i18n/ar.po new file mode 100644 index 0000000..9f99879 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/i18n/ar.po @@ -0,0 +1,74 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_bank_statement_import_qif +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-25 09:26+0000\n" +"PO-Revision-Date: 2024-09-25 09:43+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#. module: odex30_account_bank_statement_import_qif +#: model:ir.model.fields,help:odex30_account_bank_statement_import_qif.field_account_journal__qif_date_format +msgid "" +"Although the historic QIF date format is month-first (mm/dd/yy), many " +"financial institutions use the local format.Therefore, it is frequent " +"outside the US to have QIF date formatted day-first (dd/mm/yy)." +msgstr "" +"بالرغم من أن نظام تنسيق التواريخ المعتاد بملفات QIF هو البدء بالشهر " +"(شهر/يوم/سنة)، إلا أن مؤسسات مالية عديدة تستخدم التنسيق المتعارف عليه " +"محلياً. لذا، كثيرًا ما يُضبط تنسيق التواريخ بملفات QIF خارج الولايات المتحدة" +" الأمريكية ليكون بنظام البدء باليوم (يوم/شهر/سنة)." + +#. module: odex30_account_bank_statement_import_qif +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_qif/models/account_journal.py:0 +msgid "Could not decipher the QIF file." +msgstr "تعذّر فهم محتويات ملف QIF." + +#. module: odex30_account_bank_statement_import_qif +#: model:ir.model.fields,help:odex30_account_bank_statement_import_qif.field_account_journal__qif_decimal_point +msgid "Field used to avoid conversion issues." +msgstr "حقل يُستَخدم لتجنب مشاكل التحويل " + +#. module: odex30_account_bank_statement_import_qif +#: model:ir.model,name:odex30_account_bank_statement_import_qif.model_account_journal +msgid "Journal" +msgstr "دفتر اليومية" + +#. module: odex30_account_bank_statement_import_qif +#: model:ir.model.fields,field_description:odex30_account_bank_statement_import_qif.field_account_journal__qif_date_format +msgid "QIF Dates format" +msgstr "تنسيق التواريخ بملفات QIF " + +#. module: odex30_account_bank_statement_import_qif +#: model:ir.model.fields,field_description:odex30_account_bank_statement_import_qif.field_account_journal__qif_decimal_point +msgid "QIF Decimal Separator" +msgstr "الفاصلة العشرية لـ QIF " + +#. module: odex30_account_bank_statement_import_qif +#. odoo-python +#: code:addons/odex30_account_bank_statement_import_qif/models/account_journal.py:0 +msgid "This file is either not a bank statement or is not correctly formed." +msgstr "إما أن هذا الملف ليس كشف حساب أو لم يتم تكوينه بشكل صحيح." + +#. module: odex30_account_bank_statement_import_qif +#: model:ir.model.fields.selection,name:odex30_account_bank_statement_import_qif.selection__account_journal__qif_date_format__day_first +msgid "dd/mm/yy" +msgstr "يوم/شهر/سنة" + +#. module: odex30_account_bank_statement_import_qif +#: model:ir.model.fields.selection,name:odex30_account_bank_statement_import_qif.selection__account_journal__qif_date_format__month_first +msgid "mm/dd/yy" +msgstr "شهر/يوم/ سنة" diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_qif/models/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/models/__init__.py new file mode 100644 index 0000000..5cd061d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import account_journal \ No newline at end of file diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_qif/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d33f0e594b063967b5e98cb2148fba2d301bf6f1 GIT binary patch literal 318 zcmZ3^%ge<81pm%QWtsu$#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@8G#a- zjJNm`laupH^Gf2g@=J^I5_9}CnQk!@F#{!6GJFOZ@@uAkMt*Lpeqv5`Mq*V_R;GSH zWpYMhQEos{epYI7NwI!@N@|6%0g%ei*EO`zgRsD&Mh5Xv<1_Qp^;1&I;vs60MNviK zlM?f?gDYsU#36srW%pQuP@a372 zV=)vWEPOa2FfR1M3-b;>9B+|x_K+R02gR zUn)WwZBxVyUsJ-8v_`B+Tf~-ZiZoGVj5%RXIwB4VnGi><8LJR_oa+gN&^Pd_l!zN! zBF)$uX~DLL2RB7pu|0AEJ0fi+^kamb_Yih*wl!~U{1Y?GhF^8I4^uZ$$o*&1Tnd?W zTa4!tSk!IFH0BbbPB9@$cf2cd!ki$ah3915Sp%*ZaLIu07;w>mA4e;sE6`SLJiiB( zzXK_7i0nLK!c@czJF~3Sqy$pHW^DP^dWb`tF{-IX6x(pqstMb%13SNUJ+Z)U;8!UT z`!zo)S zf)pizPp#@rn2WLN2}!raxkM&p(p|}PN{TZvUJ#|MJ((QBcxYn-IvkkYsG$J|JsTT> z4|bMqHTYpAPNZXLA<0VF-%ll^czS&`PD^o)j`Je$$46;04#T+WFkpu^R=Z%VMhEMw z4bn+AwL!=D6q}0juuDEAO1!i#!6rnqJ%er{9fhvSlHrv&CvZ^b25DX*lw$&Sd!0*3 zbb4J9d0d(D?oA?>ID3aX%!~vggB{jbsqHWn4q0@E$R)TaSzG`kLP9G6Z2+QmJ%@o&Bgpp&{JyCpHmMv{tlLE$4HZl^S{#LP z#AZxOx*6mR+*`%<3?~RJFjl|7ta1`_i%osPh!UJc5(FeN>>ZX*u(uK%!zVLoL1HR0 z1v6ta87_rEUo0Skm~Ih7P!$KmL=&tiGK@$#qUo)d#i4jQ$qliIPvUG=SmTG@*@(tj zA^DDwUIWRALtw6VM~C5)PG7iqC0wZ)*pXqTs^FlHLzuh6RK^~}HewF(Ut{_<9~-J% z3qw_cOx0q-nGK;6IL%&dG_COeOBx}dAYKCSVhcU<_WOSyG`sst*B7q*oMP`%?On3HOY?ZQUC&`6iXJ>^B0EE0K8DI8IJGr0#3&gGQ^fNLnfgc zhUrdLlGte6P!Ym6O$(tT!B+FuOpdIn3L zLB$hRJ>gx?SjjW?G^BWDRnM$!pEWpakdPgw8xr~j@J%c#hl+qYT5^YMKs+mvdDYTr zNyp3VFom07SND)qzt<63tKZ{rQgyFTBoaMR8dq#QjoHJNZE~QT37d$5R?6$pEFR#j zHV^IsbK_drvQKr>oH`po6q3jlRxMK9@4{SbWpSIO6o zEg1dn0cmYI0Ee*UAWk~DPwx}M=7gCXT65R1*jd4DI;E}}4o;X{kwz(cYPEykoCCXZ z&Trj~5kQf6gCnI;1AzNx!u|a(kKwgLi4T+UHEa7z1l+yXly{?{njQ=MzV zttkqhX!J0R65Vv=Y&lo986h}77x30*@b>H&-p<$PBUGi|3H%(8?tcG~9eWAYJazxL z^C7oGwN&W}uSa*&4gA{nwYu0*qjT_^b2si7d?H$_Pr|->6%`Mh|2_rm$0u{{n0b|g zh_Ag-mYdDFW}!3JyhbibqX0)8hHf^m_0(_;y`5D_{QWT!9c6<pS05MUt|eCqKbPika7DA%+~#mwMUPcJnD zfW#>fQ+<8~z$3H@O82vNBXEQE(SlJUGY?GnJAf!9k_)TZ35ksjVsLQI5PX}$!@4EG zr#Pdt>WN=EuO=Y0j;52D$?U{oPYh{+$Q=%qVtj%NUo`?}aS|%E=_ITX-vF?M%E;_@ z?t{HnU)hYBPked(i|d6Z#Z9Yjx@>M3VmNMraBXB*<9{ZROO~EVuR|`9N=r0`TqOhX zxe>LKB*0)pcV*ZO5?wG5xUa$#qlC;NakSGAq8gPMR*Z{8vNJQRfOWfQMD$C;g7fo#XvAIU*D2&Z7%LXK5RmFO9Gn`StAV*LuUoz zA_Q{#>0Qh#&ssO}X}xKB19G#4W#KHDLfj2ReVGI=2_$$Ch;Vgtf=lV%*{PK|W_g}j z`N`DM&8eA{h2SBQn7??Gu9P!Yvnsa2)S35SEg<-Q;W;*F0H`f zB+{&;Hwj!O!A3d#gh8y5x-ywG4~OBNxi&X*omqN!aeD42x(##%qJ7=^&eR8Ua{{@Y zbu*W`0|_g~3eh-h2n%l#tYvX-aaniGEzJ^+7gpvLb;}x1)NSh-!ePi`gt0;&84Ss* z#4<$Pbz7WcG2}y&2L2A45CNZp6{WNUV)hysh1@hDw$aA44Gf0%B;7_sh?}_`Hyv-N5Bi;Ia}JQv+j4$GF-tUbe!Z z?}@ShK)|-6Y&Sb*D9wMmaQop$yZ(Wae?akvRDWpKKUDG$?N}85CDngvhgJPow&%C! zUzAN0OnBDT{ZCW!>9>`hDYa)xX`5Etre*i^ix)5U+B>)1n!mR=E&B$x9a^h*+gi3G zcbn|LD7!8yu8Uf4pX@%Pb(}4u-sW@P6OgxP?cI;EzsNqwJRRhTYJKfDXWz3l~4;Y7jo@X8<0jFh}1vUfx~6Hw2L z?tE4{Go8QoEI9nFXE!)e3Qj!5-}T8KuySxh3EonJw|0Z8rQoU(nyzYU^zdhogW6Wam6vdzoE4U%E;tjq_oR3zx}-6 zkb6g!jyJTCNp)mF9l23(6bF@#p}!pD$5-`JOWRQ+4#Gu;c}$V_5DO-s|Zv zCgq+tG#|a|8z}h(e(g|vBdTvi_Kj#~!#gIK9?dU2SU9jsu_mlQfBwc_%5xN`*8g0i zkhg~@D^_|qwTDyMVrpAVcE|SY-MjYQlD$`>`?a1Rm_{FQfqle294@dAhYOkj?5Ne3 zUy*x;7PEz$HvFRoyZJ&n3bQQgz&{zc$T5+jzOC-1g-D(3`8TFHtU$VBq<)a_112 z`*!7)Az6&^+C##0@jn2-{ZaeVJoMJJy^cV^_SmI)&Vfy8&6mnemQLIE2*3{n$QFOu ziP{J9G4udb5UOHa)e5l0S>z`{J~wvbmQL#zS`B`OZi zLy%$aZj{RyuZV{4(;e^}b_0mPREA8o5z5e*CG!>tSR`PXfSUxY0MM0bOi>irBjwz3kUtHzY#D!h=%ifx-$T9ftN%6BFE{=J zJ!kiJyXxpFTu~f-s-thqws*2iMqY3gTkZ<5ySJ=blWWVOwX|)y%C-naf!L3S`S%`v O^u5vd!z)G@JN-ZIaqa{F literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_qif/models/account_journal.py b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/models/account_journal.py new file mode 100644 index 0000000..9c78038 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/models/account_journal.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- + +import io +import logging + +import dateutil.parser + +from odoo import fields, models, _ +from odoo.exceptions import UserError + + +logger = logging.getLogger(__name__) + +DATE_OF_TRANSACTION = b'D' +TOTAL_AMOUNT = b'T' +CHECK_NUMBER = b'N' +PAYEE = b'P' +MEMO = b'M' +END_OF_ITEM = b'^' + + +class AccountJournal(models.Model): + _inherit = 'account.journal' + + qif_decimal_point = fields.Char( + string="QIF Decimal Separator", + default='.', + help="Field used to avoid conversion issues.", + ) + qif_date_format = fields.Selection( + selection=[ + ('month_first', "mm/dd/yy"), + ('day_first', "dd/mm/yy"), + ], + default='day_first', + string='QIF Dates format', + help="Although the historic QIF date format is month-first (mm/dd/yy), many financial institutions use the local format." + "Therefore, it is frequent outside the US to have QIF date formatted day-first (dd/mm/yy).", + ) + + def _get_bank_statements_available_import_formats(self): + rslt = super(AccountJournal, self)._get_bank_statements_available_import_formats() + rslt.append('QIF') + return rslt + + def _check_qif(self, attachment): + return (attachment.raw or b'').strip().startswith(b'!Type:') + + def _parse_bank_statement_file(self, attachment): + if not self._check_qif(attachment): + return super()._parse_bank_statement_file(attachment) + + data_list = [ + line.rstrip(b'\r\n') + for line in io.BytesIO(attachment.raw.strip()) + ] + try: + header = data_list[0].strip().split(b':')[1] + except: + raise UserError(_('Could not decipher the QIF file.')) + + transactions = [] + vals_line = {'payment_ref': []} + total = 0.0 + # Identified header types of the QIF format that we support. + # Other types might need to be added. Here are the possible values + # according to the QIF spec: Cash, Bank, CCard, Invst, Oth A, Oth L, Invoice. + if header in [b'Bank', b'Cash', b'CCard']: + vals_bank_statement = {} + for line in data_list: + line = line.strip() + if not line: + continue + vals_line['sequence'] = len(transactions) + 1 + data = line[1:] + if line[:1] == DATE_OF_TRANSACTION: + dayfirst = self.qif_date_format == 'day_first' + vals_line['date'] = dateutil.parser.parse(data, fuzzy=True, dayfirst=dayfirst).date() + elif line[:1] == TOTAL_AMOUNT: + amount = float(data.replace(b',', b'.' if self.qif_decimal_point == ',' else b'')) + total += amount + vals_line['amount'] = amount + elif line[:1] == CHECK_NUMBER: + vals_line['ref'] = data.decode() + elif line[:1] == PAYEE: + name = data.decode() + vals_line['payment_ref'].append(name) + # Since QIF doesn't provide account numbers, we'll have to find res.partner and res.partner.bank here + # (normal behavious is to provide 'account_number', which the generic module uses to find partner/bank) + partner_bank = self.env['res.partner.bank'].search([('partner_id.name', '=', name)], limit=1) + if partner_bank: + vals_line['partner_bank_id'] = partner_bank.id + vals_line['partner_id'] = partner_bank.partner_id.id + elif line[:1] == MEMO: + vals_line['payment_ref'].append(data.decode()) + elif line[:1] == END_OF_ITEM: + if vals_line['payment_ref']: + vals_line['payment_ref'] = u': '.join(vals_line['payment_ref']) + else: + del vals_line['payment_ref'] + transactions.append(vals_line) + vals_line = {'payment_ref': []} + elif line[:1] == b'\n': + transactions = [] + else: + raise UserError(_('This file is either not a bank statement or is not correctly formed.')) + + vals_bank_statement.update({ + 'balance_end_real': total, + 'transactions': transactions + }) + return None, None, [vals_bank_statement] diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_qif/static/description/icon.png b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5a05c285530fa3f2b26b3886f9988af3158a6ce3 GIT binary patch literal 1814 zcmV+x2kH2UP)B?r8903@3?jrIo~sc;H}+9JKy9dC+J~ z)RvGEwZT+lt38MoyBsW5ld`gf?Vp`_{(f(FOQpLzZ)Rs^-cu27|$1Fc=I5gCSa&+X4C4yErr%jI%Lr@iADi``i1n8Hf-g#EoR~y|$b4$5~%C z3lU&}p*BlPM;DSU7kFQ1Cq#e|A^~T7&tm7=cOe3d5J{X{`Db&dJNH4z7$NeoR9otK z2pJ>91J07Y4?@NW@kTF%ObawQER_OiZwF{?1=gAZmPi25&*&>X=otLnZH6FBnnws; zTt*kZqXVoC{JM7S9T!>+;wz*ifZg3${F+XK4#Z0cN$BbVt8<;G1XdbybV7e2Dtj(3mC!>7imIgvr)|SnC$>vi zKQv5;sfx-(FNBt|n>K-kOIgEeq7_0z)Xp7EyMmG-G9e=Jp!vcKQ8kG~h!~=9zA(5G zx)5vgW;0)SAXFh%PY+o4bjcl@-iB3l09f~4yu-Ia{D|kS0G}QNXJ!Ooe#ZSAZ5tr5 z>s5fewgb%m1op(60EL^N6XEps;yfWHZ@Pyqfwk?3cvOSuXTZ7qHt@eks-J{pJa%ST zrg&a%6710vK}zAtr-wrA)CvCN0m~rhA}1c{!y8f$S3aPE4Dr15cKrDpI1a1hMt&jb#x2D}?UwVK(KP z!W{6~aR`+BUs}r`{0S*9Z|e*Sohu(fUGv5D_}RK8{j8gu01|48pSz z(MKC#SV%(Zk`f~sgf}6j&XAxXA%$;_fP+CI_p)b*nGC{HxR}`SP&5q*GW!gKV`#`q zQ3@>(oav$BLSa5ML7|6>(#u}al%S9dg00B4XxE>>2gj;$#`>_*{s0}3vyDR)i{g%- z2N~61xRa-Zm!%&B9gz}ZMbWO)wy|y*%e17y!nj_i*u9La5Vmd|SY6(7D$lf){;PwK zQGzPPy8j^PhN}?kfh`a!A;>6G^@f(hxK~J+JybF>Fq^U`&VVocCdv(@aqr|%y1g1| zYFqG^C^wSE^!Aoz)S7fx$ngCRYPbZ}jp!=`hY>F_ir>%pNQOB$wYpRkC2}E&oiBNl zQNp?UDR=^_gHN9a-H2R>J@%UDm#RpOIfMT*A}@vRrQ_@9Nc2M%PPF#u$<rYSG0Y~uBLEhM*UnAkBDXoy8B3N zr?Wp7t0=to(a^)i#tG3A4O>YKbzy`kh7qC|Mu=h5UU1iI=_~@f= zkk;1105piqkuQjW!qA1Fj7L2ht3be#oF(j$zt5HXi9IE)*`(8dyy@x=$%AU^OZ9IBr3@(fSmV(Q?~7}nqZ zFr<)-!H;KRG*k&0`(=l!GQNVc{Fl%4CM^2`K6xtyK)EtvB7>JJ!>bI!SNz_7=&OwF zB=&QM4?vxHEKT5_ocl9AG8jMGk+dK6BZH_bN+v|LK;aa#*bB1fT)_Rs@8dc6<@+0P z5W(?3GRruB-*W7;enph2TS%Fr82a#D{sgmNH=el{!vgVPAS57{T@u;UbY>o|;tqU4 z<4qqgrnVV|*%U=f>6HE1QHf2T!C){L3 diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_qif/static/qif/test_qif.qif b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/static/qif/test_qif.qif new file mode 100644 index 0000000..c18c9ac --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/static/qif/test_qif.qif @@ -0,0 +1,25 @@ +!Type:Bank +D8/12/13 +T-1,000.00 +PDelta PC +^ +D8/15/13 +T-75.46 +PWalts Drugs +^ +D3/3/13 +T-379.00 +PEpic Technologies +^ +D3/4/13 +T-20.28 +PYOUR LOCAL SUPERMARKET +^ +D3/3/13 +T-421.35 +PSPRINGFIELD WATER UTILITY +^ +D27/02/25 +T0.00 +PZero amount transaction +^ diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_qif/tests/__init__.py b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/tests/__init__.py new file mode 100644 index 0000000..f68c22d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/tests/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import test_import_bank_statement diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_qif/tests/test_import_bank_statement.py b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/tests/test_import_bank_statement.py new file mode 100644 index 0000000..df52bcf --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/tests/test_import_bank_statement.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +from odoo.addons.account.tests.common import AccountTestInvoicingCommon +from odoo.tests import tagged +from odoo.tools import file_open + +import base64 + + +@tagged('post_install', '-at_install') +class TestAccountBankStatementImportQIF(AccountTestInvoicingCommon): + + def test_qif_file_import(self): + bank_journal = self.env['account.journal'].create({ + 'name': 'bank QIF', + 'code': 'BNK67', + 'type': 'bank', + 'bank_acc_number': '123456', + 'currency_id': self.env.ref('base.USD').id, + }) + + qif_file_path = 'odex30_account_bank_statement_import_qif/static/qif/test_qif.qif' + with file_open(qif_file_path, 'rb') as qif_file: + bank_journal.create_document_from_attachment(self.env['ir.attachment'].create({ + 'mimetype': 'application/text', + 'name': 'test_qif.qif', + 'raw': qif_file.read(), + }).ids) + + imported_statement = self.env['account.bank.statement'].search([('company_id', '=', self.env.company.id)]) + self.assertRecordValues(imported_statement, [{ + 'balance_start': 0.0, + 'balance_end_real': -1896.09, + }]) + self.assertRecordValues(imported_statement.line_ids.sorted('payment_ref'), [ + {'amount': -1000.00, 'payment_ref': 'Delta PC'}, + {'amount': -379.00, 'payment_ref': 'Epic Technologies'}, + {'amount': -421.35, 'payment_ref': 'SPRINGFIELD WATER UTILITY'}, + {'amount': -75.46, 'payment_ref': 'Walts Drugs'}, + {'amount': -20.28, 'payment_ref': 'YOUR LOCAL SUPERMARKET'}, + ]) diff --git a/dev_odex30_accounting/odex30_account_bank_statement_import_qif/views/account_journal_views.xml b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/views/account_journal_views.xml new file mode 100644 index 0000000..befd69b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_bank_statement_import_qif/views/account_journal_views.xml @@ -0,0 +1,16 @@ + + + + account.journal.form.inherited + account.journal + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_batch_payment/__init__.py b/dev_odex30_accounting/odex30_account_batch_payment/__init__.py new file mode 100644 index 0000000..de9509a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +from . import models +from . import report +from . import wizard diff --git a/dev_odex30_accounting/odex30_account_batch_payment/__manifest__.py b/dev_odex30_accounting/odex30_account_batch_payment/__manifest__.py new file mode 100644 index 0000000..0f9c490 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/__manifest__.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +{ + 'name': 'Batch Payment', + 'version': '1.0', + 'category': 'Odex30-Accounting/Odex30-Accounting', + 'author': "Expert Co. Ltd.", + 'website': "http://www.exp-sa.com", + 'description': """ +Batch Payments +======================================= +Batch payments allow grouping payments. + +They are used namely, but not only, to group several cheques before depositing them in a single batch to the bank. +The total amount deposited will then appear as a single transaction on your bank statement. +When you reconcile, simply select the corresponding batch payment to reconcile all the payments in the batch. + """, + 'depends': ['account'], + 'data': [ + 'security/account_batch_payment_security.xml', + 'security/ir.model.access.csv', + 'data/account_batch_payment_data.xml', + 'report/account_batch_payment_reports.xml', + 'report/account_batch_payment_report_templates.xml', + 'views/account_batch_payment_views.xml', + 'views/account_payment_views.xml', + 'views/account_journal_views.xml', + 'wizard/batch_error_views.xml', + ], + 'installable': True, + 'assets': { + 'web.report_assets_common': [ + 'odex30_account_batch_payment/static/src/scss/**/*', + ], + } +} diff --git a/dev_odex30_accounting/odex30_account_batch_payment/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_batch_payment/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eed61411d8f7dc40ef80b260cbad2cab595f911c GIT binary patch literal 380 zcmZ3^%ge<81OgYMG9!TWV-N=hn4pZ$T0q8hh7^Vr#vF!R#wbQc5St0eW{P40vzdWx z<|t+$nJJ5UVJ)Ait;t#469MN-Rq8(`32DP{a&WSHuD$ zSb@Y!hR;Bf;a8h}Mt*Lpeqv5`Mq*V_R;GSHWpYMhQEos{epYI7NwGfA)Cyw*AeEo5 zYiOYdVSz=B4B``$lk-dSN;31(^;1&I;vs60MNviKlM+jkGvW&pD|1uxO7!F7GxIV_ z;^XxSDt~d<0Nr1jlWJE43L}u8ik*SP2WCb_#t&=^jG`A9M3B)9R4z~oQv{;Ehy!R2 E0K}GPiU0rr literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_batch_payment/data/account_batch_payment_data.xml b/dev_odex30_accounting/odex30_account_batch_payment/data/account_batch_payment_data.xml new file mode 100644 index 0000000..058b59b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/data/account_batch_payment_data.xml @@ -0,0 +1,18 @@ + + + + + + + + Batch Deposit + batch_payment + inbound + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_batch_payment/i18n/account_batch_payment.pot b/dev_odex30_accounting/odex30_account_batch_payment/i18n/account_batch_payment.pot new file mode 100644 index 0000000..c4d0bdb --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/i18n/account_batch_payment.pot @@ -0,0 +1,922 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_batch_payment +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-10-31 18:47+0000\n" +"PO-Revision-Date: 2025-10-31 18:47+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "$1000.0" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "2023-08-14" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "2023-08-15" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "3956012345678" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_account_move_kanban +msgid "" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_account_payment_form_inherit_account_batch_payment +msgid "Batch Payment" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_form +msgid "" +"The following warnings were also " +"raised; they do not impeach validation" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_form +msgid "Please first consider the following warnings" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_form +msgid "The following errors occurred" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "ABC Holder Name" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "ABC Suppliers" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Account Holder Name" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_ids +msgid "Activities" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_state +msgid "Activity State" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "All payments in the batch must share the same payment method." +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__amount +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Amount" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__amount_residual +msgid "Amount Residual" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__amount_residual_currency +msgid "Amount Residual Currency" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_payment__amount_signed +msgid "Amount Signed" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__available_payment_method_ids +msgid "Available Payment Method" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__journal_id +msgid "Bank" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_search +msgid "Bank Journal" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Bank Transfer" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Batch Content" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:account.payment.method,name:odex30_account_batch_payment.account_payment_method_batch_deposit +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.account_journal_dashboard_kanban_view_inherited +msgid "Batch Deposit" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model,name:odex30_account_batch_payment.model_report_account_batch_payment_print_batch_payment +msgid "Batch Deposit Report" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_payment.py:0 +#: model:ir.model,name:odex30_account_batch_payment.model_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__batch_payment_id +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_payment__batch_payment_id +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_search +msgid "Batch Payment" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.ui.menu,name:odex30_account_batch_payment.menu_batch_payment_purchases +#: model:ir.ui.menu,name:odex30_account_batch_payment.menu_batch_payment_sales +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_account_payment_search_inherit_account_batch_payment +msgid "Batch Payments" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__batch_type +msgid "Batch Type" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.actions.act_window,help:odex30_account_batch_payment.action_batch_payment_in +#: model_terms:ir.actions.act_window,help:odex30_account_batch_payment.action_batch_payment_out +msgid "" +"Batch payments allow you grouping different payments to ease\n" +" reconciliation. They are also useful when depositing checks\n" +" to the bank." +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model,name:odex30_account_batch_payment.model_account_batch_error_wizard +msgid "Batch payments error reporting wizard" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model,name:odex30_account_batch_payment.model_account_batch_error_wizard_line +msgid "Batch payments error reporting wizard line" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "Cannot validate an empty batch. Please add some payments to it first." +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "Check Payments" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_form +msgid "Close" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__payment_method_code +msgid "Code" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__company_id +msgid "Company" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__company_currency_id +msgid "Company Currency" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__company_id +msgid "Company related to this journal" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_account_payment_tree_inherit_account_batch_payment +msgid "Create Batch" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_journal.py:0 +msgid "Create Batch Payment" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.actions.act_window,help:odex30_account_batch_payment.action_batch_payment_in +msgid "Create a new customer batch payment" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.actions.act_window,help:odex30_account_batch_payment.action_batch_payment_out +msgid "Create a new vendor batch payment" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.actions.server,name:odex30_account_batch_payment.action_account_create_batch_payment +msgid "Create batch payment" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__create_uid +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__create_uid +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__create_uid +msgid "Created by" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__create_date +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__create_date +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__create_date +msgid "Created on" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__export_file_create_date +msgid "Creation date of the related export file." +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__currency_id +msgid "Currency" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Customer" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.actions.act_window,name:odex30_account_batch_payment.action_batch_payment_in +msgid "Customer Batch Payments" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__date +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Date" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Demo Ref" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__description +msgid "Description" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__display_name +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__display_name +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__display_name +msgid "Display Name" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__error_line_ids +msgid "Error Line" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__error_wizard_id +msgid "Error Wizard" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_line_tree +msgid "Exclude Payments" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__export_file +msgid "Export file related to this batch" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__export_file +msgid "File" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__file_generation_enabled +msgid "File Generation Enabled" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__export_filename +msgid "File Name" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__export_file_create_date +msgid "Generation Date" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_search +msgid "Group By" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__has_message +msgid "Has Message" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__help_message +msgid "Help" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__id +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__id +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__id +msgid "ID" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__message_has_error +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields.selection,name:odex30_account_batch_payment.selection__account_batch_payment__batch_type__inbound +msgid "Inbound" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_journal.py:0 +msgid "Inbound Batch Payments Sequence" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "Invalid Partners" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__invalid_sct_partners_ids +msgid "Invalid Sct Partners" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Issuing bank account :" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model,name:odex30_account_batch_payment.model_account_journal +msgid "Journal" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__write_uid +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__write_uid +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__write_date +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__write_date +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__write_date +msgid "Last Updated on" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Leave empty to generate automatically..." +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Memo" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_ids +msgid "Messages" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Monthly Payment" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_payment__payment_method_name +msgid "Name" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__export_filename +msgid "Name of the export file generated for this batch" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_payment__amount_signed +msgid "Negative value of amount field if payment_type is outbound" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields.selection,name:odex30_account_batch_payment.selection__account_batch_payment__state__draft +msgid "New" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_calendar_event_id +msgid "Next Activity Calendar Event" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_account_payment_search_inherit_account_batch_payment +msgid "Not Batch Payments" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_account_payment_search_inherit_account_batch_payment +msgid "Not reconciled" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Odoo Payments LLC" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields.selection,name:odex30_account_batch_payment.selection__account_batch_payment__batch_type__outbound +msgid "Outbound" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_journal.py:0 +msgid "Outbound Batch Payments Sequence" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_account_payment_tree_inherit_account_batch_payment +msgid "Partner" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__payment_ids_domain +msgid "Payment Ids Domain" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__payment_method_id +msgid "Payment Method" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model,name:odex30_account_batch_payment.model_account_payment_method +msgid "Payment Methods" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_payment.py:0 +msgid "Payment added in batch %s" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Payment method" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +#: code:addons/odex30_account_batch_payment/models/account_payment.py:0 +msgid "Payment removed from batch %s" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model,name:odex30_account_batch_payment.model_account_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__payment_ids +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__payment_ids +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Payments" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +#: code:addons/odex30_account_batch_payment/wizard/batch_error.py:0 +msgid "Payments in Error" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Print" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.actions.report,name:odex30_account_batch_payment.action_print_batch_payment +msgid "Print Batch Payment" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_form +msgid "Proceed with validation" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__rating_ids +msgid "Ratings" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Re-generate Export File" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Recipient Bank Account" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields.selection,name:odex30_account_batch_payment.selection__account_batch_payment__state__reconciled +msgid "Reconciled" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__name +msgid "Reference" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "Remove the payments from the batch or change their state." +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_has_sms_error +msgid "SMS Delivery error" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields.selection,name:odex30_account_batch_payment.selection__account_batch_payment__state__sent +msgid "Sent" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_line_tree +msgid "Show" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__show_remove_button +msgid "Show Remove Button" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__show_remove_options +msgid "Show Remove Options" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "Some payments have already been sent." +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "Some recipient accounts do not allow out payments." +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__state +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_search +msgid "State" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "TOTAL" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "" +"Target another recipient account or allow sending money to the current one." +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_form +msgid "The batch cannot be validated." +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_form +msgid "The batch could not be validated" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "" +"The batch must have the same payment method as the payments it contains." +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "The batch must have the same type as the payments it contains." +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_error_wizard__batch_payment_id +msgid "" +"The batch payment generating the errors and warnings displayed in this " +"wizard." +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "The country or city of" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "" +"The journal of the batch payment and of the payments it contains must be the" +" same." +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__payment_method_id +msgid "The payment method used by the payments in this batch." +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "" +"To validate the batch, payments must be in process. But some are already " +"matched with a bank statement." +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Total" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_error_wizard__show_remove_options +msgid "" +"True if and only if the options to remove the payments causing the errors or" +" warnings from the batch should be shown" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_search +msgid "Unreconciled" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Validate" +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Vendor" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.actions.act_window,name:odex30_account_batch_payment.action_batch_payment_out +msgid "Vendor Batch Payments" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__warning_line_ids +msgid "Warning Line" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__warning_wizard_id +msgid "Warning Wizard" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__file_generation_enabled +msgid "" +"Whether or not this batch payment should display the 'Generate File' button " +"instead of 'Print' in form view." +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "You cannot add payments with zero amount in a Batch Payment." +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "You cannot add the same payment to multiple batches." +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "" +"You cannot create a batch with payments that are already in another batch." +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "You cannot create batches with overlapping payments." +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "is not set, which could cause the file to be refused by the bank." +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "these partners" +msgstr "" diff --git a/dev_odex30_accounting/odex30_account_batch_payment/i18n/ar.po b/dev_odex30_accounting/odex30_account_batch_payment/i18n/ar.po new file mode 100644 index 0000000..fc6e21b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/i18n/ar.po @@ -0,0 +1,953 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_batch_payment +# +# Translators: +# Wil Odoo, 2024 +# Mustafa J. Kadhem , 2024 +# Malaz Abuidris , 2025 +# Weblate , 2025. +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-10-31 18:47+0000\n" +"PO-Revision-Date: 2025-11-17 14:06+0000\n" +"Last-Translator: Weblate \n" +"Language-Team: Arabic \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" +"X-Generator: Weblate 5.12.2\n" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "$1000.0" +msgstr "$1000.0" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "2023-08-14" +msgstr "2023-08-14" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "2023-08-15" +msgstr "2023-08-15" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "3956012345678" +msgstr "3956012345678" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_account_move_kanban +msgid "" +"" +msgstr "" +"" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_account_payment_form_inherit_account_batch_payment +msgid "Batch Payment" +msgstr "دفعة مجمعة" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_form +msgid "" +"The following warnings were also " +"raised; they do not impeach validation" +msgstr "" +"تم أيضاً رفع التحذيرات التالية؛ " +"إنهم لا يشككون في التحقق من الصحة " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_form +msgid "Please first consider the following warnings" +msgstr "الرجاء اعتبار التحذيرات التالية أولاً" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_form +msgid "The following errors occurred" +msgstr "لقد حدثت الأخطاء التالية" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "ABC Holder Name" +msgstr "اسم المالك ABC " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "ABC Suppliers" +msgstr "مزودوا ABC " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Account Holder Name" +msgstr "اسم مالك الحساب" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_needaction +msgid "Action Needed" +msgstr "إجراء مطلوب" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_ids +msgid "Activities" +msgstr "الأنشطة" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "زخرفة استثناء النشاط" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_state +msgid "Activity State" +msgstr "حالة النشاط" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_type_icon +msgid "Activity Type Icon" +msgstr "أيقونة نوع النشاط" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "All payments in the batch must share the same payment method." +msgstr "يجب أن يكون لكافة عمليات السداد في هذه الدفعة طريقة السداد ذاتها. " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__amount +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Amount" +msgstr "مبلغ" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__amount_residual +msgid "Amount Residual" +msgstr "المبلغ المتبقي" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__amount_residual_currency +msgid "Amount Residual Currency" +msgstr "عملة المبلغ المتبقي " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_payment__amount_signed +msgid "Amount Signed" +msgstr "المبلغ الموقع عليه" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_attachment_count +msgid "Attachment Count" +msgstr "عدد المرفقات" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__available_payment_method_ids +msgid "Available Payment Method" +msgstr "طريقة الدفع المتاحة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__journal_id +msgid "Bank" +msgstr "البنك" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_search +msgid "Bank Journal" +msgstr "دفتر يومية البنك" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Bank Transfer" +msgstr "تحويل بنكي " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Batch Content" +msgstr "محتويات الدفعة" + +#. module: odex30_account_batch_payment +#: model:account.payment.method,name:odex30_account_batch_payment.account_payment_method_batch_deposit +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.account_journal_dashboard_kanban_view_inherited +msgid "Batch Deposit" +msgstr "إيداع مجمع " + +#. module: odex30_account_batch_payment +#: model:ir.model,name:odex30_account_batch_payment.model_report_account_batch_payment_print_batch_payment +msgid "Batch Deposit Report" +msgstr "تقرير الإيداع المجمع " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_payment.py:0 +#: model:ir.model,name:odex30_account_batch_payment.model_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__batch_payment_id +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_payment__batch_payment_id +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_search +msgid "Batch Payment" +msgstr "دفعة مجمعة " + +#. module: odex30_account_batch_payment +#: model:ir.ui.menu,name:odex30_account_batch_payment.menu_batch_payment_purchases +#: model:ir.ui.menu,name:odex30_account_batch_payment.menu_batch_payment_sales +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_account_payment_search_inherit_account_batch_payment +msgid "Batch Payments" +msgstr "الدفعات المجمعة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__batch_type +msgid "Batch Type" +msgstr "نوع الدفعة" + +#. module: odex30_account_batch_payment +#: model_terms:ir.actions.act_window,help:odex30_account_batch_payment.action_batch_payment_in +#: model_terms:ir.actions.act_window,help:odex30_account_batch_payment.action_batch_payment_out +msgid "" +"Batch payments allow you grouping different payments to ease\n" +" reconciliation. They are also useful when depositing " +"checks\n" +" to the bank." +msgstr "" +"تسمح لك الدفعات المجمعة بتجميع مدفوعات مختلفة مما \n" +" يُسهل من عملية التسوية. وهي مفيدة أيضاً عند إيداع شيكات\n" +" في البنك. " + +#. module: odex30_account_batch_payment +#: model:ir.model,name:odex30_account_batch_payment.model_account_batch_error_wizard +msgid "Batch payments error reporting wizard" +msgstr "مُعالج الإبلاغ عن وقوع خطأ في الدفعات المجمعة " + +#. module: odex30_account_batch_payment +#: model:ir.model,name:odex30_account_batch_payment.model_account_batch_error_wizard_line +msgid "Batch payments error reporting wizard line" +msgstr "بند مُعالج الإبلاغ عن وقوع خطأ في الدفعات المجمعة " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "Cannot validate an empty batch. Please add some payments to it first." +msgstr "لا يمكن تصديق دفعة فارغة. الرجاء إضافة بعض المدفوعات لها أولاً. " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "Check Payments" +msgstr "التحقق من المدفوعات " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_form +msgid "Close" +msgstr "إغلاق" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__payment_method_code +msgid "Code" +msgstr "رمز " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__company_id +msgid "Company" +msgstr "الشركة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__company_currency_id +msgid "Company Currency" +msgstr "عملة الشركة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__company_id +msgid "Company related to this journal" +msgstr "الشركة المتعلقة بهذه اليومية " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_account_payment_tree_inherit_account_batch_payment +msgid "Create Batch" +msgstr "إنشاء الدفعة" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_journal.py:0 +msgid "Create Batch Payment" +msgstr "إنشاء دفعة مجمعة " + +#. module: odex30_account_batch_payment +#: model_terms:ir.actions.act_window,help:odex30_account_batch_payment.action_batch_payment_in +msgid "Create a new customer batch payment" +msgstr "إنشاء دفعة مجمعة جديدة لعميل " + +#. module: odex30_account_batch_payment +#: model_terms:ir.actions.act_window,help:odex30_account_batch_payment.action_batch_payment_out +msgid "Create a new vendor batch payment" +msgstr "إنشاء دفعة مجمعة جديدة لمورد " + +#. module: odex30_account_batch_payment +#: model:ir.actions.server,name:odex30_account_batch_payment.action_account_create_batch_payment +msgid "Create batch payment" +msgstr "إنشاء دفعة مجمعة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__create_uid +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__create_uid +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__create_uid +msgid "Created by" +msgstr "أنشئ بواسطة" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__create_date +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__create_date +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__create_date +msgid "Created on" +msgstr "أنشئ في" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__export_file_create_date +msgid "Creation date of the related export file." +msgstr "تاريخ الإنشاء لملف التصدير ذي الصلة. " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__currency_id +msgid "Currency" +msgstr "العملة" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Customer" +msgstr "العميل" + +#. module: odex30_account_batch_payment +#: model:ir.actions.act_window,name:odex30_account_batch_payment.action_batch_payment_in +msgid "Customer Batch Payments" +msgstr "مدفوعات العميل المجمعة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__date +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Date" +msgstr "التاريخ" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Demo Ref" +msgstr "المرجع التجريبي " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__description +msgid "Description" +msgstr "الوصف" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__display_name +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__display_name +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__display_name +msgid "Display Name" +msgstr "اسم العرض " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__error_line_ids +msgid "Error Line" +msgstr "بند الخطأ " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__error_wizard_id +msgid "Error Wizard" +msgstr "مُعالج الخطأ " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_line_tree +msgid "Exclude Payments" +msgstr "استثناء الدفعات " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__export_file +msgid "Export file related to this batch" +msgstr "تصدير الملف المتعلق بهذه الدفعة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__export_file +msgid "File" +msgstr "الملف" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__file_generation_enabled +msgid "File Generation Enabled" +msgstr "تم تفعيل خيار إنشاء الملفات " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__export_filename +msgid "File Name" +msgstr "اسم الملف" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_follower_ids +msgid "Followers" +msgstr "المتابعين" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_partner_ids +msgid "Followers (Partners)" +msgstr "المتابعين (الشركاء) " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "أيقونة من Font awesome مثال: fa-tasks " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__export_file_create_date +msgid "Generation Date" +msgstr "تاريخ الإنشاء" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_search +msgid "Group By" +msgstr "تجميع حسب" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__has_message +msgid "Has Message" +msgstr "يحتوي على رسالة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__help_message +msgid "Help" +msgstr "المساعدة" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__id +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__id +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__id +msgid "ID" +msgstr "المُعرف" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_exception_icon +msgid "Icon" +msgstr "الأيقونة" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "الأيقونة للإشارة إلى النشاط المستثنى. " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__message_needaction +msgid "If checked, new messages require your attention." +msgstr "إذا كان محددًا، فهناك رسائل جديدة عليك رؤيتها. " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__message_has_error +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "إذا كان محددًا، فقد حدث خطأ في تسليم بعض الرسائل." + +#. module: odex30_account_batch_payment +#: model:ir.model.fields.selection,name:odex30_account_batch_payment.selection__account_batch_payment__batch_type__inbound +msgid "Inbound" +msgstr "واردة" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_journal.py:0 +msgid "Inbound Batch Payments Sequence" +msgstr "تسلسل الدفعات المجمعة الواردة " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "Invalid Partners" +msgstr "الشركاء غير صالحين" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__invalid_sct_partners_ids +msgid "Invalid Sct Partners" +msgstr "" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_is_follower +msgid "Is Follower" +msgstr "متابع" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Issuing bank account :" +msgstr "إصدار حساب بنكي:" + +#. module: odex30_account_batch_payment +#: model:ir.model,name:odex30_account_batch_payment.model_account_journal +msgid "Journal" +msgstr "دفتر اليومية" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__write_uid +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__write_uid +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__write_uid +msgid "Last Updated by" +msgstr "آخر تحديث بواسطة" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__write_date +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__write_date +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Leave empty to generate automatically..." +msgstr "اتركه فارغًا ليتم إنشاؤه تلقائيًا ..." + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Memo" +msgstr "بيان" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_has_error +msgid "Message Delivery error" +msgstr "خطأ في تسليم الرسائل" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_ids +msgid "Messages" +msgstr "الرسائل" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Monthly Payment" +msgstr "دفع شهري " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "الموعد النهائي لنشاطاتي " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_payment__payment_method_name +msgid "Name" +msgstr "الاسم" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__export_filename +msgid "Name of the export file generated for this batch" +msgstr "اسم الملف المُصدر الذي تم إنشاؤه لهذه الدفعة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_payment__amount_signed +msgid "Negative value of amount field if payment_type is outbound" +msgstr "القيمة السالبة لحقل المبلغ إذا كان payment_type صادراً " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields.selection,name:odex30_account_batch_payment.selection__account_batch_payment__state__draft +msgid "New" +msgstr "جديد" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_calendar_event_id +msgid "Next Activity Calendar Event" +msgstr "الفعالية التالية في تقويم الأنشطة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "الموعد النهائي للنشاط التالي" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_summary +msgid "Next Activity Summary" +msgstr "ملخص النشاط التالي" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_type_id +msgid "Next Activity Type" +msgstr "نوع النشاط التالي" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_account_payment_search_inherit_account_batch_payment +msgid "Not Batch Payments" +msgstr "مدفوعات غير مجمعة " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_account_payment_search_inherit_account_batch_payment +msgid "Not reconciled" +msgstr "غير مسوى " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_needaction_counter +msgid "Number of Actions" +msgstr "عدد الإجراءات" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_has_error_counter +msgid "Number of errors" +msgstr "عدد الأخطاء " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "عدد الرسائل التي تتطلب اتخاذ إجراء" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "عدد الرسائل الحادث بها خطأ في التسليم" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Odoo Payments LLC" +msgstr "مدفوعات أودو المحدودة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields.selection,name:odex30_account_batch_payment.selection__account_batch_payment__batch_type__outbound +msgid "Outbound" +msgstr "صادرة" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_journal.py:0 +msgid "Outbound Batch Payments Sequence" +msgstr "تسلسل الدفعات المجمعة الصادرة " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_account_payment_tree_inherit_account_batch_payment +msgid "Partner" +msgstr "الشريك" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__payment_ids_domain +msgid "Payment Ids Domain" +msgstr "نطاق معرّفات الدفع " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__payment_method_id +msgid "Payment Method" +msgstr "طريقة الدفع " + +#. module: odex30_account_batch_payment +#: model:ir.model,name:odex30_account_batch_payment.model_account_payment_method +msgid "Payment Methods" +msgstr "طرق الدفع " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_payment.py:0 +msgid "Payment added in batch %s" +msgstr "تمت إضافة المدفوعات إلى الدفعة %s " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Payment method" +msgstr "طريقة الدفع " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +#: code:addons/odex30_account_batch_payment/models/account_payment.py:0 +msgid "Payment removed from batch %s" +msgstr "تمت إزالة المدفوعات من الدفعة %s " + +#. module: odex30_account_batch_payment +#: model:ir.model,name:odex30_account_batch_payment.model_account_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__payment_ids +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__payment_ids +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Payments" +msgstr "الدفعات" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +#: code:addons/odex30_account_batch_payment/wizard/batch_error.py:0 +msgid "Payments in Error" +msgstr "المدفوعات التي بها خطأ " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Print" +msgstr "طباعة" + +#. module: odex30_account_batch_payment +#: model:ir.actions.report,name:odex30_account_batch_payment.action_print_batch_payment +msgid "Print Batch Payment" +msgstr "طباعة الدفعة المجمعة " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_form +msgid "Proceed with validation" +msgstr "الاستمرار بالتصديق " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__rating_ids +msgid "Ratings" +msgstr "التقييمات " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Re-generate Export File" +msgstr "إعادة إنشاء ملف تصدير " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Recipient Bank Account" +msgstr "الحساب البنكي المستلم" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields.selection,name:odex30_account_batch_payment.selection__account_batch_payment__state__reconciled +msgid "Reconciled" +msgstr "تمت التسوية" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__name +msgid "Reference" +msgstr "الرقم المرجعي " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "Remove the payments from the batch or change their state." +msgstr "قم بإزالة المدفوعات من الدفعة أو تغيير حالتها." + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__activity_user_id +msgid "Responsible User" +msgstr "المستخدم المسؤول" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__message_has_sms_error +msgid "SMS Delivery error" +msgstr "خطأ في تسليم الرسائل النصية القصيرة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields.selection,name:odex30_account_batch_payment.selection__account_batch_payment__state__sent +msgid "Sent" +msgstr "تم الإرسال" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_line_tree +msgid "Show" +msgstr "إظهار " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__show_remove_button +msgid "Show Remove Button" +msgstr "إظهار زر الإزالة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__show_remove_options +msgid "Show Remove Options" +msgstr "إظهار خيارات الإزالة " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "Some payments have already been sent." +msgstr "لقد تم إرسال بعض المدفوعات بالفعل. " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "Some recipient accounts do not allow out payments." +msgstr "لا تسمح بعض حسابات المستلمين بالدفع." + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__state +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_search +msgid "State" +msgstr "الحالة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"الأنشطة المعتمدة على الحالة\n" +"المتأخرة: تاريخ الاستحقاق مر\n" +"اليوم: تاريخ النشاط هو اليوم\n" +"المخطط: الأنشطة المستقبلية." + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "TOTAL" +msgstr "الإجمالي" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "" +"Target another recipient account or allow sending money to the current one." +msgstr "استهدف حساب مستلم آخر أو اسمح بإرسال الأموال إلى الحساب الحالي." + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_form +msgid "The batch cannot be validated." +msgstr "لا يمكن تصديق الدفعة " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.batch_error_wizard_form +msgid "The batch could not be validated" +msgstr "تعذر تصديق الدفعة " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "" +"The batch must have the same payment method as the payments it contains." +msgstr "يجب أن يكون للدفعة نفس طريقة السداد ككافة عمليات السداد التي تحتويها. " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "The batch must have the same type as the payments it contains." +msgstr "يجب أن يكون للدفعة نفس نوع عمليات السداد التي تحتويها." + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_error_wizard__batch_payment_id +msgid "" +"The batch payment generating the errors and warnings displayed in this " +"wizard." +msgstr "" +"الدفعة المجمعة التي تتسبب في الأخطاء والتحذيرات المعروضة على هذا المُعالج. " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "The country or city of" +msgstr "" + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "" +"The journal of the batch payment and of the payments it contains must be the " +"same." +msgstr "" +"يجب أن يكون دفتر اليومية للدفعة المجمعة مطابقاً لدفتر اليومية لكافة عمليات " +"السداد التي يحتويها. " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__payment_method_id +msgid "The payment method used by the payments in this batch." +msgstr "طريقة السداد المستخدمة في عمليات السداد في هذه الدفعة." + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "" +"To validate the batch, payments must be in process. But some are already " +"matched with a bank statement." +msgstr "" +"للتحقق من صحة الدفعة، يجب أن تكون المدفوعات قيد المعالجة. ولكن بعضها مطابق " +"بالفعل مع كشف حساب بنكي. " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Total" +msgstr "الإجمالي" + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_error_wizard__show_remove_options +msgid "" +"True if and only if the options to remove the payments causing the errors or " +"warnings from the batch should be shown" +msgstr "" +"تكون القيمة صحيحة فقط عندما يكون من الواجب إظهار الخيارات لإزالة المدفوعات " +"المتسببة بالأخطاء أو التحذيرات " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "نوع النشاط المستثنى في السجل. " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_search +msgid "Unreconciled" +msgstr "غير المسواة" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "Validate" +msgstr "تصديق " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.print_batch_payment +msgid "Vendor" +msgstr "المورّد " + +#. module: odex30_account_batch_payment +#: model:ir.actions.act_window,name:odex30_account_batch_payment.action_batch_payment_out +msgid "Vendor Batch Payments" +msgstr "مدفوعات المورّد المجمعة " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard__warning_line_ids +msgid "Warning Line" +msgstr "بند التحذير " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_error_wizard_line__warning_wizard_id +msgid "Warning Wizard" +msgstr "مُعالج التحذير " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,field_description:odex30_account_batch_payment.field_account_batch_payment__website_message_ids +msgid "Website Messages" +msgstr "رسائل الموقع الإلكتروني " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__website_message_ids +msgid "Website communication history" +msgstr "سجل تواصل الموقع الإلكتروني " + +#. module: odex30_account_batch_payment +#: model:ir.model.fields,help:odex30_account_batch_payment.field_account_batch_payment__file_generation_enabled +msgid "" +"Whether or not this batch payment should display the 'Generate File' button " +"instead of 'Print' in form view." +msgstr "" +"إذا ما كان ينبغي عرض زر 'إنشاء ملف' في واجهة الدفعة المجمعة عوضاً عن زر " +"'طباعة' أم لا. " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "You cannot add payments with zero amount in a Batch Payment." +msgstr "لا يمكنك إضافة مدفوعات قيمتها صفر في دفعة مجمعة " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "You cannot add the same payment to multiple batches." +msgstr "لا يمكنك إضافة عدة مدفوعات إلى عدة دفعات. " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "" +"You cannot create a batch with payments that are already in another batch." +msgstr "لا يمكنك إنشاء دفعة بها مدفوعات موجودة بالفعل في دفعة أخرى. " + +#. module: odex30_account_batch_payment +#. odoo-python +#: code:addons/odex30_account_batch_payment/models/account_batch_payment.py:0 +msgid "You cannot create batches with overlapping payments." +msgstr "لا يمكنك إنشاء دفعات بها مدفوعات متداخلة. " + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "is not set, which could cause the file to be refused by the bank." +msgstr "" + +#. module: odex30_account_batch_payment +#: model_terms:ir.ui.view,arch_db:odex30_account_batch_payment.view_batch_payment_form +msgid "these partners" +msgstr "" diff --git a/dev_odex30_accounting/odex30_account_batch_payment/models/__init__.py b/dev_odex30_accounting/odex30_account_batch_payment/models/__init__.py new file mode 100644 index 0000000..593ad7f --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/models/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- + +from . import account_batch_payment +from . import account_journal +from . import account_payment +from . import account_payment_method diff --git a/dev_odex30_accounting/odex30_account_batch_payment/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_batch_payment/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf70b63faee0c8d10f374c4633aeb323cf9258cf GIT binary patch literal 481 zcmZvYyH3L}6o&2G#6=Y>ura}sfx3W%7!Z$uDj^mxmPss<5XY6{Ai_H^v$0mZP1#Ua zCbml5I&qRFB9Uqx{pa(4j<3_fU@Dor(Ns6>#*%= zEGC7CRCw#VbEIuJLOYeXm3SbZXbFl|ZzNJu5S~6o{8cA08J9uCwH#}eh`{7Th2rI6 z1WBpWv#a5nYWIA^nnUC4k%Z!zt$Vv}-|4@NNT{YcVJyyK!`N_AuC}hhEK+f!cj0!` h*W~vg3map+@DM(kq2q3RqoY|rHaW0rL+EYT`48HUjKcr` literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_batch_payment/models/__pycache__/account_batch_payment.cpython-311.pyc b/dev_odex30_accounting/odex30_account_batch_payment/models/__pycache__/account_batch_payment.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..188b13824140897da60af582963e03111f712425 GIT binary patch literal 30626 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 E3mdTW00000 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_batch_payment/models/__pycache__/account_journal.cpython-311.pyc b/dev_odex30_accounting/odex30_account_batch_payment/models/__pycache__/account_journal.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91df6d6a8ade158db91d70478346919c43d64cb1 GIT binary patch literal 3393 zcmd^B&2Jk;6rc5a9ow7OC3YH8`mv-yFm3EYOG%{`(N-#Lq=t$F1g7n3yE92P*t=$S z-6mF0bBG{RNFY>H4n0H&6{7Z!;J}HK9a+k1q)L?#hu&P31Imdv>s>dSrY)RV+s|*_ zy!m)?WvV}>>W};Rxn4s#uoA(#-8xN;J`4Sc- zs3>4mj9{TCE}=;Q7K<07M4E{O!?3uBZb9RAU_iyLP=EBX{y3HvQ8BTEW`$xBwiaWl z|NX*Mjq+}96617Qbk~eIYP*uI8*|w_MJaR=@SifGFw#uZS zl|G%;YIMdZoSW09HCjGLtr?;_cA*^={8`rU>m&ICp5|HK=)`K6Qw2;etKkfAYuFOb zNuiD2LXa9CAo zqARD@K5?ADNi5%thx-B2-DB&rLGw2GtV&FsaOmjp{+MuVeYgLP z@>bRH@R;||o%hjvpP#E0fk`E!Y&bRLJ>N??!B2>Cu6;smW!#_oK0j^rc@Pt|%!%U@ zCr=mN`(UE*@~d-1qdB{9Y9-F1rdB4btD<2HK%(2hnaO6ge2GxiB(o0N<~Iyer-YwC zma5uB#hOD@s+m)S#VT+Dj9He{t#U;(=Trl)NVJE~)NR8`aCkkcf+JGJ7K_0=Fqm?( zUWw2&_e-9k!KQ8grWA$ta{G|lb`B$24br0qNvs{-4B~$`jxTO6fLK8H`Ub9l^h3GX zw|^<=%6)6{;Ho@We`&nFccOm&LR}tg$QPUPMULf++ugf#%1sY^bM@NQMp|j6m9_NH zYI^8ywy(Z@q>(++%pP(3pLer|+!uDb%8TyqL3jJUdpq{DGRa)Bg+M$&$!+pqTtG7+ z(+q6le*%Bn2eIZv4{Nj^^z~fgFi}%0GMGiy=Yp-mLwV*O|p!Vj!g4*U`3SVvk#1oPBetqwF{gd+^(k?XR3(rQ{ zTaD~UGdtoT?cfHaz4qUb7K2@RMEfHsVWQodSi>aAEA`f7y0P+a)Uj}LQ^gm;q`IjW z=roF@c>%|6NdaLLOI$X{6_r<1mVi?4X(iUBTc!hK2{(&4aGj@fRlGl>UFa0$1YxcMPdgcs#8}ZR*e6$`P{gZRo{zi7VnH_es``m#& z?!W=Je@9D>Z3D_`i$u~Rs++z%Qw7pGFL6gU7e*&T<3WCszAwj95Jx}_!Vuu9S+2i8d53iqp M!0mr+(djMz4{nHKRR910 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_batch_payment/models/__pycache__/account_payment.cpython-311.pyc b/dev_odex30_accounting/odex30_account_batch_payment/models/__pycache__/account_payment.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f1aa052b4dde1e17eb9e6d1962a0f7f76870a62 GIT binary patch literal 4624 zcmbtXO>7&-6`o!0@=vBn%91Ebk-bjzW7-ZSr)aDgieopfoIfj0Y$Pb1U_*0;(#p$S zWp*h=1ceBN&L!Q}J@%Mmj!R(y6AJ_|&`Z-34ZA?#Q{U`zDN>P( z03DKVXWqP-dHd#jKm1!P7Ddn!wVd+TE`VXRg@9GW5bN#1WP(5s^J8S3Q@7)1oDfD z!^wrFxcl(8dh~A?{u&e@D92%x<1v>D@Q4U|hhZKEuy9Y@f2b=J@;Ajn9Kzvyk$qBO zS1Qtyir(wG%YpLn^I9$n5?u?2{4qX+V|RIwfS=cJ_d2=@-LHHG%Ee$sw?D-3AI!&b zVjblY8>ql&Dtn8XnZ`r?YyRVY(Rw8Dz4V5eU$=%vN7N#uNqog^E|oJMfv z>@1nfo5~WAmhx(uNP1E71SI#OB&8@db&$=KMItGNq?gSbum#QpobJ{UuCx5`AbX0oY%3eDjET0vRb}GGMp2lM9rH7J3;SA=a4VYjw-aS1B}XW#eR=+KyITd zx`;j;U*)RY0*t+exts3w&~D(i)^?#PC%3Nc)=>Lg$INkz;41i8Fk|ce=waBJ_5g8W z9cBY-3kFe(PN=D|!H$rmCtDNqdWlTr)tmGA3SCepuB;U1^R#q@>I8Y&ObGa`}%FRnww7CgPmSj)1o!iNgT`;YT8bg*!rLY*^*6h&dKn=J+`Vz`e7>cUZ`a%u*IwDATUv)!C*D zP>-GkavRNoq8}cD?Espeg8hU{mxG4^XL~Bt!GZR zxO5PtAeu)P^fJ}*DvK;#zSAlY)|39A>G3ch^-#)O`bnQcv-yIl=$gTv^0J~~eR;+a ziaIU9z51pu^avv(j4fNmtf592CHuC*R(jG-oW7r!+D%N=2ajxjd}rJqJY^3~)LjF9 z-3unG4b9j?GxcMmJNeI3_OY|}v6ow-*+xV>8*LyU50RMcdd$d%*hrwhQ}y&@J@w3X zaZ|VY#_Ih;Tk{~CV8SkmMBQ8HfL6<^G*FUx)eby=*gCy}LuL!R2vU6~&bkOXg{n18eQaNI2UgQi&v8C zl1}3o&r`@r^8Nv56g1`ro#{(*ynk2@%O zuJUGEH15REQ{wbKEUgAGU*(oK%2xwdA>8e>YXM4l4fCA{TotMUl>mD!l;Xf%^xqNu zb?wjUzG$sMcwH6Ua^cUb!Kz4KsRnmi(Y<}8$&zHVVWBGSw5mv-%brznA?%N#`UJb| zRgL>9#NfS9Cx=6~Uaj&6zk4;p8!P!pm z2Gy4hvbWu$ZkS$x>6SrCo;OP>E0k~2(;%M-d+AJo>fCU8bQO0-6fZTFRnvVvC)N?8 z+-kvz$Z|o=8-^?!47$xgyXM9!dLB5H-hENY)p-hLj1K_d->;#%Yuj&3uxM@gnhm4y z;J3;C&r(~d+rz&b-ZpE=5j#1u5v+F&?_9IGGVrY*PH$YU4;}r})E}p;kr!)2XY8Rf zR(PQPUeOv@+!pSHtz%R6z)SZB&hHMKw=TR>8+g|qc-Mljy0{Umv*I%v>2V1wKA&lz zNUW!xNZn72>?TIOO%GZ_Fa9HTf9l%q)HUn+ynVf7OOY3%8uOBa&@U zBd~vSlw~RRYACa?=hEV3_{XNYHli$6dFxofeiEMc?)e;jABHT!8aIJ70vyM|dvnJv eH2%N8jo?L&1Cv>{W7&-bq5BOlc8geO%XY8|jnQOJgcdjJOyrmC*r}2(PcZ6H zqt3XPA{7>AFiGhXH&_X|Z^v#JKu>*IaBmRh#>ZJghM%j!fXNc5?={FuZpCPASzA^u`S7_RkF}CS@;4>f4VFB4nTn zGo88Fz2rm{rFxSWfMn~|S)(icr|w~hj7$)JH_)%b_?ybx%J;(T*TU?6VeVUDuB{$i zHNRZmn|c6mTWvqtHzp27$J!%D5Q2(^FbD~3pAjNP2mziAPwM9gdC{=FuEl^xR~dI> zE}IGSgJQjev&eTF?J&Yk&)VK4B@-enzRQBy?<)(<<-sNjOTT(K8So i6=U4VAw0Q 1: + raise ValidationError(_("All payments in the batch must share the same payment method.")) + if all_payment_methods and record.payment_method_id not in all_payment_methods: + raise ValidationError(_("The batch must have the same payment method as the payments it contains.")) + payment_null = record.payment_ids.filtered(lambda p: p.amount == 0) + if payment_null: + raise ValidationError(_('You cannot add payments with zero amount in a Batch Payment.')) + + @api.model_create_multi + def create(self, vals_list): + today = fields.Date.context_today(self) + all_payment_ids = [] + for vals in vals_list: + vals['name'] = self._get_batch_name( + vals.get('batch_type'), + vals.get('date', today), + vals) + if 'payment_ids' in vals: + payments = self.new({'payment_ids': vals['payment_ids']}).payment_ids + if payments._origin.batch_payment_id: + raise ValidationError(_('You cannot create a batch with payments that are already in another batch.')) + # Collect all payment IDs + all_payment_ids.extend(payments.ids) + + if len(all_payment_ids) != len(set(all_payment_ids)): + raise ValidationError(_('You cannot create batches with overlapping payments.')) + return super().create(vals_list) + + def write(self, vals): + if 'batch_type' in vals: + vals['name'] = self.with_context(default_journal_id=self.journal_id.id)._get_batch_name(vals['batch_type'], self.date, vals) + if 'payment_ids' in vals: + if len(self) > 1: + raise ValidationError(_('You cannot add the same payment to multiple batches.')) + original_payments = self.new({'payment_ids': vals['payment_ids']}).payment_ids._origin + if original_payments.batch_payment_id - self: + raise ValidationError(_('You cannot create a batch with payments that are already in another batch.')) + + rslt = super(AccountBatchPayment, self).write(vals) + + return rslt + + def unlink(self): + for batch in self: + for payment in batch.payment_ids: + payment.message_post( + body=_('Payment removed from batch %s', batch._get_html_link(title=batch.name)), + message_type='comment', + ) + return super().unlink() + + @api.model + def _get_batch_name(self, batch_type, sequence_date, vals): + if not vals.get('name'): + sequence_code = 'account.inbound.batch.payment' + if batch_type == 'outbound': + sequence_code = 'account.outbound.batch.payment' + return self.env['ir.sequence'].with_context(sequence_date=sequence_date).next_by_code(sequence_code) + return vals['name'] + + @api.depends('state') + def _compute_display_name(self): + state_values = dict(self._fields['state'].selection) + for batch in self: + batch.display_name = f'{batch.name} ({state_values.get(batch.state)})' + + @api.depends('payment_method_id', 'payment_ids.partner_id.country_id', 'payment_ids.partner_id.city') + def _compute_invalid_sct_partners_ids(self): + sepa_batches = self.filtered(lambda b: b.payment_method_id.code == 'sepa_ct') + for batch in sepa_batches: + batch.invalid_sct_partners_ids = batch.payment_ids.partner_id.filtered( + lambda partner: not (partner.city and partner.country_id) + ) + (self - sepa_batches).invalid_sct_partners_ids = self.env['res.partner'] + + def action_invalid_partners_from_sct(self): + return self.invalid_sct_partners_ids._get_records_action(name=_("Invalid Partners")) + + def validate_batch(self): + """ Verifies the content of a batch and proceeds to its sending if possible. + If not, opens a wizard listing the errors and/or warnings encountered. + """ + validate_action = self._check_batch_validity() + if validate_action: + return validate_action + return self._send_after_validation() + + def _check_batch_validity(self): + self.ensure_one() + if not self.payment_ids: + raise UserError(_("Cannot validate an empty batch. Please add some payments to it first.")) + + errors = not self.export_file and self.check_payments_for_errors() or [] # We don't re-check for errors if we are regenerating the file (we know there aren't any) + warnings = self.check_payments_for_warnings() + if errors or warnings: + if len(errors) == 1 and not warnings: + raise RedirectWarning( + message=errors[0]['title'] + '\n' + errors[0].get('help', ''), + action=errors[0].get('records', self.env['account.payment'])._get_records_action(name=_('Payments in Error')), + button_text=_('Check Payments') + ) + return { + 'type': 'ir.actions.act_window', + 'view_mode': 'form', + 'res_model': 'account.batch.error.wizard', + 'target': 'new', + 'res_id': self.env['account.batch.error.wizard'].create_from_errors_list(self, errors, warnings).id, + } + + def validate_batch_button(self): + return self.validate_batch() + + def _send_after_validation(self): + """ Sends the payments of a batch (possibly generating an export file) + once the batch has been validated. + """ + + self.ensure_one() + if self.payment_ids: + self.payment_ids.mark_as_sent() + + if self.file_generation_enabled: + return self.export_batch_payment() + + def check_payments_for_warnings(self): + """ Checks the payments of this batch and returns (if relevant) some + warnings about them. These warnings are not to be confused with errors, + they are only messgaes displayed to make sure the user is aware of some + specificities in the payments he's put in the batch. He will be able to + ignore them. + + :return: A list of dictionaries, each one corresponding to a distinct + warning and containing the following keys: + - 'title': A short name for the warning (mandatory) + - 'records': The recordset of payments concerned by this warning (mandatory) + - 'help': A help text to give the user further information + on the reason this warning exists (optional) + """ + return [] + + def check_payments_for_errors(self): + """ Goes through all the payments of the batches contained in this + record set, and returns the ones that would impeach batch validation, + in such a way that the payments impeaching validation for the same reason + are grouped under a common error message. This function is a hook for + extension for modules making a specific use of batch payments, such as SEPA + ones. + + :return: A list of dictionaries, each one corresponding to a distinct + error and containing the following keys: + - 'title': A short name for the error (mandatory) + - 'records': The recordset of payments facing this error (mandatory) + - 'help': A help text to give the user further information + on how to solve the error (optional) + """ + self.ensure_one() + #We first try to post all the draft batch payments + rslt = self._check_and_post_draft_payments(self.payment_ids.filtered(lambda x: x.state == 'draft')) + + valid_payment_states = self._valid_payment_states() + wrong_state_payments = self.payment_ids.filtered(lambda x: x.state not in valid_payment_states) + + if wrong_state_payments: + rslt.append({ + 'title': _("To validate the batch, payments must be in process. But some are already matched with a bank statement."), + 'records': wrong_state_payments, + 'help': _("Remove the payments from the batch or change their state.") + }) + + if self.batch_type == 'outbound': + not_allowed_payments = self.payment_ids.filtered(lambda x: x.partner_bank_id and not x.partner_bank_id.allow_out_payment) + if not_allowed_payments: + rslt.append({ + 'code': 'out_payment_not_allowed', + 'title': _("Some recipient accounts do not allow out payments."), + 'records': not_allowed_payments, + 'help': _("Target another recipient account or allow sending money to the current one.") + }) + + sent_payments = self.payment_ids.filtered(lambda x: x.is_sent) + if sent_payments: + rslt.append({ + 'title': _("Some payments have already been sent."), + 'records': sent_payments, + }) + + return rslt + + def _check_and_post_draft_payments(self, draft_payments): + """ Tries posting each of the draft payments contained in this batch. + If it fails and raise a UserError, it is catched and the process continues + on the following payments. All the encountered errors are then returned + withing a dictionary, in the same fashion as check_payments_for_errors. + """ + exceptions_mapping = {} + for payment in draft_payments: + try: + payment.action_post() + except UserError as e: + name = e.args[0] + if name in exceptions_mapping: + exceptions_mapping[name] += payment + else: + exceptions_mapping[name] = payment + + return [{'title': error, 'records': pmts} for error, pmts in exceptions_mapping.items()] + + def export_batch_payment(self): + #export and save the file for each batch payment + self.check_access('write') + for record in self.sudo(): + record = record.with_company(record.journal_id.company_id) + export_file_data = record._generate_export_file() + record.export_file = export_file_data['file'] + record.export_filename = export_file_data['filename'] + record.export_file_create_date = fields.Date.today() + record.message_post( + attachments=[ + (record.export_filename, base64.decodebytes(record.export_file)), + ] + ) + + def print_batch_payment(self): + return self.env.ref('odex30_account_batch_payment.action_print_batch_payment').report_action(self, config=False) + + def _generate_export_file(self): + """ To be overridden by modules adding support for different export format. + This function returns False if no export file could be generated + for this batch. Otherwise, it returns a dictionary containing the following keys: + - file: the content of the generated export file, in base 64. + - filename: the name of the generated file + - warning: (optional) the warning message to display + + """ + self.ensure_one() + return False diff --git a/dev_odex30_accounting/odex30_account_batch_payment/models/account_journal.py b/dev_odex30_accounting/odex30_account_batch_payment/models/account_journal.py new file mode 100644 index 0000000..49afcdd --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/models/account_journal.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- + +from odoo import models, api, _ + + +class AccountJournal(models.Model): + _inherit = "account.journal" + + def _default_inbound_payment_methods(self): + res = super()._default_inbound_payment_methods() + if self._is_payment_method_available('batch_payment'): + res |= self.env.ref('odex30_account_batch_payment.account_payment_method_batch_deposit') + return res + + @api.model + def _create_batch_payment_outbound_sequence(self): + IrSequence = self.env['ir.sequence'] + if IrSequence.search_count([('code', '=', 'account.outbound.batch.payment')], limit=1): + return + return IrSequence.sudo().create({ + 'name': _("Outbound Batch Payments Sequence"), + 'padding': 4, + 'code': 'account.outbound.batch.payment', + 'number_next': 1, + 'number_increment': 1, + 'use_date_range': True, + 'prefix': 'BATCH/OUT/%(year)s/', + #by default, share the sequence for all companies + 'company_id': False, + }) + + @api.model + def _create_batch_payment_inbound_sequence(self): + IrSequence = self.env['ir.sequence'] + if IrSequence.search_count([('code', '=', 'account.inbound.batch.payment')], limit=1): + return + return IrSequence.sudo().create({ + 'name': _("Inbound Batch Payments Sequence"), + 'padding': 4, + 'code': 'account.inbound.batch.payment', + 'number_next': 1, + 'number_increment': 1, + 'use_date_range': True, + 'prefix': 'BATCH/IN/%(year)s/', + #by default, share the sequence for all companies + 'company_id': False, + }) + + def open_action_batch_payment(self): + ctx = self._context.copy() + ctx.update({'journal_id': self.id, 'default_journal_id': self.id}) + return { + 'name': _('Create Batch Payment'), + 'type': 'ir.actions.act_window', + 'view_mode': 'form', + 'res_model': 'account.batch.payment', + 'context': ctx, + } diff --git a/dev_odex30_accounting/odex30_account_batch_payment/models/account_payment.py b/dev_odex30_accounting/odex30_account_batch_payment/models/account_payment.py new file mode 100644 index 0000000..5a24563 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/models/account_payment.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api, _ + + +class AccountPayment(models.Model): + _inherit = "account.payment" + + batch_payment_id = fields.Many2one('account.batch.payment', ondelete='set null', copy=False) + amount_signed = fields.Monetary( + currency_field='currency_id', compute='_compute_amount_signed', + help='Negative value of amount field if payment_type is outbound') + payment_method_name = fields.Char(related='payment_method_line_id.name') + + @api.depends('amount', 'payment_type') + def _compute_amount_signed(self): + for payment in self: + if payment.payment_type == 'outbound': + payment.amount_signed = -payment.amount + else: + payment.amount_signed = payment.amount + + @api.model + def create_batch_payment(self): + # We use self[0] to create the batch; the constrains on the model ensure + # the consistency of the generated data (same journal, same payment method, ...) + batch = self.env['account.batch.payment'].create({ + 'journal_id': self[0].journal_id.id, + 'payment_ids': [(4, payment.id, None) for payment in self], + 'payment_method_id': self[0].payment_method_id.id, + 'batch_type': self[0].payment_type, + }) + + return { + "type": "ir.actions.act_window", + "res_model": "account.batch.payment", + "views": [[False, "form"]], + "res_id": batch.id, + } + + def button_open_batch_payment(self): + ''' Redirect the user to the batch payments containing this payment. + :return: An action on account.batch.payment. + ''' + self.ensure_one() + + return { + 'name': _("Batch Payment"), + 'type': 'ir.actions.act_window', + 'res_model': 'account.batch.payment', + 'context': {'create': False}, + 'view_mode': 'form', + 'res_id': self.batch_payment_id.id, + } + + def write(self, vals): + old_batch_payments = {payment: payment.batch_payment_id for payment in self} + result = super().write(vals) + if 'batch_payment_id' not in vals: + return result + batch_payment_id = vals.get('batch_payment_id') + batch_payment = self.env['account.batch.payment'].browse(batch_payment_id) if batch_payment_id else None + for payment in self: + if batch_payment: + payment.message_post( + body=_('Payment added in batch %s', batch_payment._get_html_link(title=batch_payment.name)), + message_type='comment', + ) + elif old_batch_payments.get(payment): + payment.message_post( + body=_('Payment removed from batch %s', old_batch_payments[payment]._get_html_link(title=old_batch_payments[payment].name)), + message_type='comment', + ) + return result diff --git a/dev_odex30_accounting/odex30_account_batch_payment/models/account_payment_method.py b/dev_odex30_accounting/odex30_account_batch_payment/models/account_payment_method.py new file mode 100644 index 0000000..9ea5a88 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/models/account_payment_method.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from odoo import api, models + + +class AccountPaymentMethod(models.Model): + _inherit = 'account.payment.method' + + @api.model + def _get_payment_method_information(self): + res = super()._get_payment_method_information() + res['batch_payment'] = {'mode': 'multi', 'type': ('bank',)} + return res diff --git a/dev_odex30_accounting/odex30_account_batch_payment/models/sepa_mapping.py b/dev_odex30_accounting/odex30_account_batch_payment/models/sepa_mapping.py new file mode 100644 index 0000000..a49d3c5 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/models/sepa_mapping.py @@ -0,0 +1,175 @@ +import re +from xml.sax.saxutils import escape + + +def sanitize_communication(communication, size=140): + """ Returns a sanitized version of the communication given in parameter, + so that: + - it contains only latin characters + - it does not contain any // + - it does not start or end with / + - it is maximum 140 characters long + (these are the SEPA compliance criteria) + """ + # This function must be called before replacing the '/', as the + # character replacement could result in a non-compliant string. + communication = _replace_characters_SEPA(communication, size) + while '//' in communication: + communication = communication.replace('//', '/') + if communication.startswith('/'): + communication = communication[1:] + if communication.endswith('/'): + communication = communication[:-1] + return communication + + +def _replace_characters_SEPA(string, size=None): + """ + Replace non-latin characters according to the official SEPA mapping. + See https://www.europeanpaymentscouncil.eu/document-library/guidance-documents/sepa-requirements-extended-character-set-unicode-subset-best + """ + string_array = [character for character in string] + for match in re.finditer('[^-A-Za-z0-9/?:().,\'&<>+ ]', string): + match_index = match.start() + string_array[match_index] = sepa_mapping.get(string_array[match_index], '') + string = ''.join(string_array) + + if size: + string = string[:size] + i = 0 + while len(escape(string)) > size: + i += 1 + string = string[:size - i] + + return string + +sepa_mapping = { + "\u0021": "\u002E", "\u0023": "\u002E", "\u0024": "\u002E", "\u0025": "\u002E", "\u002A": "\u002E", "\u003B": "\u002C", "\u003C": "\u002E", "\u003D": "\u002E", + "\u003E": "\u002E", "\u0040": "\u002E", "\u005B": "\u0028", "\u005C": "\u002F", "\u005D": "\u0029", "\u005E": "\u002E", "\u005F": "\u002D", "\u0060": "\u0027", + "\u007B": "\u0028", "\u007C": "\u002F", "\u007D": "\u0029", "\u007E": "\u002D", "\u007F": "\u002E", "\u0080": "\u002E", "\u0081": "\u002E", "\u0082": "\u002E", + "\u0083": "\u002E", "\u0084": "\u002E", "\u0085": "\u002E", "\u0086": "\u002E", "\u0087": "\u002E", "\u0088": "\u002E", "\u0089": "\u002E", "\u008A": "\u002E", + "\u008B": "\u002E", "\u008C": "\u002E", "\u008D": "\u002E", "\u008E": "\u002E", "\u008F": "\u002E", "\u0090": "\u002E", "\u0091": "\u002E", "\u0092": "\u002E", + "\u0093": "\u002E", "\u0094": "\u002E", "\u0095": "\u002E", "\u0096": "\u002E", "\u0097": "\u002E", "\u0098": "\u002E", "\u0099": "\u002E", "\u009A": "\u002E", + "\u009B": "\u002E", "\u009C": "\u002E", "\u009D": "\u002E", "\u009E": "\u002E", "\u009F": "\u002E", "\u00A0": "\u0020", "\u00A1": "\u002E", "\u00A2": "\u002E", + "\u00A3": "\u002E", "\u00A4": "\u002E", "\u00A5": "\u002E", "\u00A6": "\u002E", "\u00A7": "\u002E", "\u045E": "\u002E", "\u045F": "\u002E", "\u20AC": "\u0045", + "\u00A8": "\u002E", "\u00A9": "\u002E", "\u00AA": "\u002E", "\u00AB": "\u002E", "\u00AC": "\u002E", "\u00AD": "\u002E", "\u00AE": "\u002E", "\u00AF": "\u002E", + "\u00B0": "\u002E", "\u00B1": "\u002E", "\u00B2": "\u002E", "\u00B3": "\u002E", "\u00B4": "\u002E", "\u00B5": "\u002E", "\u00B6": "\u002E", "\u00B7": "\u002E", + "\u00B8": "\u002E", "\u00B9": "\u002E", "\u00BA": "\u002E", "\u00BB": "\u002E", "\u00BC": "\u002E", "\u00BD": "\u002E", "\u00BE": "\u002E", "\u00BF": "\u003F", + "\u00C0": "\u0041", "\u00C1": "\u0041", "\u00C2": "\u0041", "\u00C3": "\u0041", "\u00C4": "\u0041", "\u00C5": "\u0041", "\u00C6": "\u0041", "\u00C7": "\u0043", + "\u00C8": "\u0045", "\u00C9": "\u0045", "\u00CA": "\u0045", "\u00CB": "\u0045", "\u00CC": "\u0049", "\u00CD": "\u0049", "\u00CE": "\u0049", "\u00CF": "\u0049", + "\u00D0": "\u002E", "\u00D1": "\u004E", "\u00D2": "\u004F", "\u00D3": "\u004F", "\u00D4": "\u004F", "\u00D5": "\u004F", "\u00D6": "\u004F", "\u00D7": "\u002E", + "\u00D8": "\u004F", "\u00D9": "\u0055", "\u00DA": "\u0055", "\u00DB": "\u0055", "\u00DC": "\u0055", "\u00DD": "\u0059", "\u00DE": "\u0054\u0048", "\u00DF": "\u0073", + "\u00E0": "\u0061", "\u00E1": "\u0061", "\u00E2": "\u0061", "\u00E3": "\u0061", "\u00E4": "\u0061", "\u00E5": "\u0061", "\u00E6": "\u0061", "\u00E7": "\u0063", + "\u00E8": "\u0065", "\u00E9": "\u0065", "\u00EA": "\u0065", "\u00EB": "\u0065", "\u00EC": "\u0069", "\u00ED": "\u0069", "\u00EE": "\u0069", "\u00EF": "\u0069", + "\u00F0": "\u002E", "\u00F1": "\u006E", "\u00F2": "\u006F", "\u00F3": "\u006F", "\u00F4": "\u006F", "\u00F5": "\u006F", "\u00F6": "\u006F", "\u00F7": "\u002E", + "\u00F8": "\u006F", "\u00F9": "\u0075", "\u00FA": "\u0075", "\u00FB": "\u0075", "\u00FC": "\u0075", "\u00FD": "\u0079", "\u00FE": "\u0074", "\u00FF": "\u0079", + "\u0100": "\u0041", "\u0101": "\u0061", "\u0102": "\u0041", "\u0103": "\u0061", "\u0104": "\u0041", "\u0105": "\u0061", "\u0106": "\u0043", "\u0107": "\u0063", + "\u0108": "\u0043", "\u0109": "\u0063", "\u010A": "\u0043", "\u010B": "\u0063", "\u010C": "\u0043", "\u010D": "\u0063", "\u010E": "\u0044", "\u010F": "\u0064", + "\u0110": "\u0044", "\u0111": "\u0064", "\u0112": "\u0045", "\u0113": "\u0065", "\u0114": "\u0045", "\u0115": "\u0065", "\u0116": "\u0045", "\u0117": "\u0065", + "\u0118": "\u0045", "\u0119": "\u0065", "\u011A": "\u0045", "\u011B": "\u0065", "\u011C": "\u0047", "\u011D": "\u0067", "\u011E": "\u0047", "\u011F": "\u0067", + "\u0120": "\u0047", "\u0121": "\u0067", "\u0122": "\u0047", "\u0123": "\u0067", "\u0124": "\u0048", "\u0125": "\u0069", "\u0126": "\u0048", "\u0127": "\u0069", + "\u0128": "\u0049", "\u0129": "\u0069", "\u012A": "\u0049", "\u012B": "\u0069", "\u012C": "\u0049", "\u012D": "\u0069", "\u012E": "\u0049", "\u012F": "\u0069", + "\u0130": "\u0049", "\u0131": "\u0069", "\u0132": "\u0049", "\u0133": "\u0069", "\u0134": "\u004A", "\u0135": "\u006A", "\u0136": "\u004B", "\u0137": "\u006B", + "\u0138": "\u002E", "\u0139": "\u004C", "\u013A": "\u006C", "\u013B": "\u004C", "\u013C": "\u006C", "\u013D": "\u004C", "\u013E": "\u006C", "\u013F": "\u004C", + "\u0140": "\u006C", "\u0141": "\u004C", "\u0142": "\u006C", "\u0143": "\u004E", "\u0144": "\u006E", "\u0145": "\u004E", "\u0146": "\u006E", "\u0147": "\u004E", + "\u0148": "\u006E", "\u0149": "\u002E", "\u014A": "\u002E", "\u014B": "\u002E", "\u014C": "\u002E", "\u014D": "\u002E", "\u014E": "\u002E", "\u014F": "\u002E", + "\u0150": "\u004F", "\u0151": "\u006F", "\u0152": "\u004F", "\u0153": "\u006F", "\u0154": "\u0052", "\u0155": "\u0072", "\u0156": "\u0052", "\u0157": "\u0072", + "\u0158": "\u0052", "\u0159": "\u0072", "\u015A": "\u0053", "\u015B": "\u0073", "\u015C": "\u0053", "\u015D": "\u0073", "\u015E": "\u0053", "\u015F": "\u0073", + "\u0160": "\u0053", "\u0161": "\u0073", "\u0162": "\u0054", "\u0163": "\u0074", "\u0164": "\u0054", "\u0165": "\u0074", "\u0166": "\u0054", "\u0167": "\u0074", + "\u0168": "\u0055", "\u0169": "\u0075", "\u016A": "\u0055", "\u016B": "\u0075", "\u016C": "\u0055", "\u016D": "\u0075", "\u016E": "\u0055", "\u016F": "\u0075", + "\u0170": "\u0055", "\u0171": "\u0075", "\u0172": "\u0055", "\u0173": "\u0075", "\u0174": "\u0057", "\u0175": "\u0077", "\u0176": "\u0059", "\u0177": "\u0079", + "\u0178": "\u0059", "\u0179": "\u005A", "\u017A": "\u007A", "\u017B": "\u005A", "\u017C": "\u007A", "\u017D": "\u005A", "\u017E": "\u007A", "\u017F": "\u002E", + "\u0180": "\u002E", "\u0181": "\u002E", "\u0182": "\u002E", "\u0183": "\u002E", "\u0184": "\u002E", "\u0185": "\u002E", "\u0186": "\u002E", "\u0187": "\u002E", + "\u0188": "\u002E", "\u0189": "\u002E", "\u018A": "\u002E", "\u018B": "\u002E", "\u018C": "\u002E", "\u018D": "\u002E", "\u018E": "\u002E", "\u018F": "\u002E", + "\u0190": "\u002E", "\u0191": "\u002E", "\u0192": "\u002E", "\u0193": "\u002E", "\u0194": "\u002E", "\u0195": "\u002E", "\u0196": "\u002E", "\u0197": "\u002E", + "\u0198": "\u002E", "\u0199": "\u002E", "\u019A": "\u002E", "\u019B": "\u002E", "\u019C": "\u002E", "\u019D": "\u002E", "\u019E": "\u002E", "\u019F": "\u002E", + "\u01A0": "\u002E", "\u01A1": "\u002E", "\u01A2": "\u002E", "\u01A3": "\u002E", "\u01A4": "\u002E", "\u01A5": "\u002E", "\u01A6": "\u002E", "\u01A7": "\u002E", + "\u01A8": "\u002E", "\u01A9": "\u002E", "\u01AA": "\u002E", "\u01AB": "\u002E", "\u01AC": "\u002E", "\u01AD": "\u002E", "\u01AE": "\u002E", "\u01AF": "\u002E", + "\u01B0": "\u002E", "\u01B1": "\u002E", "\u01B2": "\u002E", "\u01B3": "\u002E", "\u01B4": "\u002E", "\u01B5": "\u002E", "\u01B6": "\u002E", "\u01B7": "\u002E", + "\u01B8": "\u002E", "\u01B9": "\u002E", "\u01BA": "\u002E", "\u01BB": "\u002E", "\u01BC": "\u002E", "\u01BD": "\u002E", "\u01BE": "\u002E", "\u01BF": "\u002E", + "\u01C0": "\u002E", "\u01C1": "\u002E", "\u01C2": "\u002E", "\u01C3": "\u002E", "\u01C4": "\u002E", "\u01C5": "\u002E", "\u01C6": "\u002E", "\u01C7": "\u002E", + "\u01C8": "\u002E", "\u01C9": "\u002E", "\u01CA": "\u002E", "\u01CB": "\u002E", "\u01CC": "\u002E", "\u01CD": "\u002E", "\u01CE": "\u002E", "\u01CF": "\u002E", + "\u01D0": "\u002E", "\u01D1": "\u002E", "\u01D2": "\u002E", "\u01D3": "\u002E", "\u01D4": "\u002E", "\u01D5": "\u002E", "\u01D6": "\u002E", "\u01D7": "\u002E", + "\u01D8": "\u002E", "\u01D9": "\u002E", "\u01DA": "\u002E", "\u01DB": "\u002E", "\u01DC": "\u002E", "\u01DD": "\u002E", "\u01DE": "\u002E", "\u01DF": "\u002E", + "\u01E0": "\u002E", "\u01E1": "\u002E", "\u01E2": "\u002E", "\u01E3": "\u002E", "\u01E4": "\u002E", "\u01E5": "\u002E", "\u01E6": "\u002E", "\u01E7": "\u002E", + "\u01E8": "\u002E", "\u01E9": "\u002E", "\u01EA": "\u002E", "\u01EB": "\u002E", "\u01EC": "\u002E", "\u01ED": "\u002E", "\u01EE": "\u002E", "\u01EF": "\u002E", + "\u01F0": "\u002E", "\u01F1": "\u002E", "\u01F2": "\u002E", "\u01F3": "\u002E", "\u01F4": "\u002E", "\u01F5": "\u002E", "\u01F6": "\u002E", "\u01F7": "\u002E", + "\u01F8": "\u002E", "\u01F9": "\u002E", "\u01FA": "\u002E", "\u01FB": "\u002E", "\u01FC": "\u002E", "\u01FD": "\u002E", "\u01FE": "\u002E", "\u01FF": "\u002E", + "\u0200": "\u002E", "\u0201": "\u002E", "\u0202": "\u002E", "\u0203": "\u002E", "\u0204": "\u002E", "\u0205": "\u002E", "\u0206": "\u002E", "\u0207": "\u002E", + "\u0208": "\u002E", "\u0209": "\u002E", "\u020A": "\u002E", "\u020B": "\u002E", "\u020C": "\u002E", "\u020D": "\u002E", "\u020E": "\u002E", "\u020F": "\u002E", + "\u0210": "\u002E", "\u0211": "\u002E", "\u0212": "\u002E", "\u0213": "\u002E", "\u0214": "\u002E", "\u0215": "\u002E", "\u0216": "\u002E", "\u0217": "\u002E", + "\u0218": "\u0053", "\u0219": "\u0073", "\u021A": "\u0054", "\u021B": "\u0074", "\u021C": "\u002E", "\u021D": "\u002E", "\u021E": "\u002E", "\u021F": "\u002E", + "\u0220": "\u002E", "\u0221": "\u002E", "\u0222": "\u002E", "\u0223": "\u002E", "\u0224": "\u002E", "\u0225": "\u002E", "\u0226": "\u002E", "\u0227": "\u002E", + "\u0228": "\u002E", "\u0229": "\u002E", "\u022A": "\u002E", "\u022B": "\u002E", "\u022C": "\u002E", "\u022D": "\u002E", "\u022E": "\u002E", "\u022F": "\u002E", + "\u0230": "\u002E", "\u0231": "\u002E", "\u0232": "\u002E", "\u0233": "\u002E", "\u0234": "\u002E", "\u0235": "\u002E", "\u0236": "\u002E", "\u0237": "\u002E", + "\u0238": "\u002E", "\u0239": "\u002E", "\u023A": "\u002E", "\u023B": "\u002E", "\u023C": "\u002E", "\u023D": "\u002E", "\u023E": "\u002E", "\u023F": "\u002E", + "\u0240": "\u002E", "\u0241": "\u002E", "\u0242": "\u002E", "\u0243": "\u002E", "\u0244": "\u002E", "\u0245": "\u002E", "\u0246": "\u002E", "\u0247": "\u002E", + "\u0248": "\u002E", "\u0249": "\u002E", "\u024A": "\u002E", "\u024B": "\u002E", "\u024C": "\u002E", "\u024D": "\u002E", "\u024E": "\u002E", "\u024F": "\u002E", + "\u0250": "\u002E", "\u0251": "\u002E", "\u0252": "\u002E", "\u0253": "\u002E", "\u0254": "\u002E", "\u0255": "\u002E", "\u0256": "\u002E", "\u0257": "\u002E", + "\u0258": "\u002E", "\u0259": "\u002E", "\u025A": "\u002E", "\u025B": "\u002E", "\u025C": "\u002E", "\u025D": "\u002E", "\u025E": "\u002E", "\u025F": "\u002E", + "\u0260": "\u002E", "\u0261": "\u002E", "\u0262": "\u002E", "\u0263": "\u002E", "\u0264": "\u002E", "\u0265": "\u002E", "\u0266": "\u002E", "\u0267": "\u002E", + "\u0268": "\u002E", "\u0269": "\u002E", "\u026A": "\u002E", "\u026B": "\u002E", "\u026C": "\u002E", "\u026D": "\u002E", "\u026E": "\u002E", "\u026F": "\u002E", + "\u0270": "\u002E", "\u0271": "\u002E", "\u0272": "\u002E", "\u0273": "\u002E", "\u0274": "\u002E", "\u0275": "\u002E", "\u0276": "\u002E", "\u0277": "\u002E", + "\u0278": "\u002E", "\u0279": "\u002E", "\u027A": "\u002E", "\u027B": "\u002E", "\u027C": "\u002E", "\u027D": "\u002E", "\u027E": "\u002E", "\u027F": "\u002E", + "\u0280": "\u002E", "\u0281": "\u002E", "\u0282": "\u002E", "\u0283": "\u002E", "\u0284": "\u002E", "\u0285": "\u002E", "\u0286": "\u002E", "\u0287": "\u002E", + "\u0288": "\u002E", "\u0289": "\u002E", "\u028A": "\u002E", "\u028B": "\u002E", "\u028C": "\u002E", "\u028D": "\u002E", "\u028E": "\u002E", "\u028F": "\u002E", + "\u0290": "\u002E", "\u0291": "\u002E", "\u0292": "\u002E", "\u0293": "\u002E", "\u0294": "\u002E", "\u0295": "\u002E", "\u0296": "\u002E", "\u0297": "\u002E", + "\u0298": "\u002E", "\u0299": "\u002E", "\u029A": "\u002E", "\u029B": "\u002E", "\u029C": "\u002E", "\u029D": "\u002E", "\u029E": "\u002E", "\u029F": "\u002E", + "\u02A0": "\u002E", "\u02A1": "\u002E", "\u02A2": "\u002E", "\u02A3": "\u002E", "\u02A4": "\u002E", "\u02A5": "\u002E", "\u02A6": "\u002E", "\u02A7": "\u002E", + "\u02A8": "\u002E", "\u02A9": "\u002E", "\u02AA": "\u002E", "\u02AB": "\u002E", "\u02AC": "\u002E", "\u02AD": "\u002E", "\u02AE": "\u002E", "\u02AF": "\u002E", + "\u02B0": "\u002E", "\u02B1": "\u002E", "\u02B2": "\u002E", "\u02B3": "\u002E", "\u02B4": "\u002E", "\u02B5": "\u002E", "\u02B6": "\u002E", "\u02B7": "\u002E", + "\u02B8": "\u002E", "\u02B9": "\u002E", "\u02BA": "\u002E", "\u02BB": "\u002E", "\u02BC": "\u002E", "\u02BD": "\u002E", "\u02BE": "\u002E", "\u02BF": "\u002E", + "\u02C0": "\u002E", "\u02C1": "\u002E", "\u02C2": "\u002E", "\u02C3": "\u002E", "\u02C4": "\u002E", "\u02C5": "\u002E", "\u02C6": "\u002E", "\u02C7": "\u002E", + "\u02C8": "\u002E", "\u02C9": "\u002E", "\u02CA": "\u002E", "\u02CB": "\u002E", "\u02CC": "\u002E", "\u02CD": "\u002E", "\u02CE": "\u002E", "\u02CF": "\u002E", + "\u02D0": "\u002E", "\u02D1": "\u002E", "\u02D2": "\u002E", "\u02D3": "\u002E", "\u02D4": "\u002E", "\u02D5": "\u002E", "\u02D6": "\u002E", "\u02D7": "\u002E", + "\u02D8": "\u002E", "\u02D9": "\u002E", "\u02DA": "\u002E", "\u02DB": "\u002E", "\u02DC": "\u002E", "\u02DD": "\u002E", "\u02DE": "\u002E", "\u02DF": "\u002E", + "\u02E0": "\u002E", "\u02E1": "\u002E", "\u02E2": "\u002E", "\u02E3": "\u002E", "\u02E4": "\u002E", "\u02E5": "\u002E", "\u02E6": "\u002E", "\u02E7": "\u002E", + "\u02E8": "\u002E", "\u02E9": "\u002E", "\u02EA": "\u002E", "\u02EB": "\u002E", "\u02EC": "\u002E", "\u02ED": "\u002E", "\u02EE": "\u002E", "\u02EF": "\u002E", + "\u02F0": "\u002E", "\u02F1": "\u002E", "\u02F2": "\u002E", "\u02F3": "\u002E", "\u02F4": "\u002E", "\u02F5": "\u002E", "\u02F6": "\u002E", "\u02F7": "\u002E", + "\u02F8": "\u002E", "\u02F9": "\u002E", "\u02FA": "\u002E", "\u02FB": "\u002E", "\u02FC": "\u002E", "\u02FD": "\u002E", "\u02FE": "\u002E", "\u02FF": "\u002E", + "\u0300": "\u002E", "\u0301": "\u002E", "\u0302": "\u002E", "\u0303": "\u002E", "\u0304": "\u002E", "\u0305": "\u002E", "\u0306": "\u002E", "\u0307": "\u002E", + "\u0308": "\u002E", "\u0309": "\u002E", "\u030A": "\u002E", "\u030B": "\u002E", "\u030C": "\u002E", "\u030D": "\u002E", "\u030E": "\u002E", "\u030F": "\u002E", + "\u0310": "\u002E", "\u0311": "\u002E", "\u0312": "\u002E", "\u0313": "\u002E", "\u0314": "\u002E", "\u0315": "\u002E", "\u0316": "\u002E", "\u0317": "\u002E", + "\u0318": "\u002E", "\u0319": "\u002E", "\u031A": "\u002E", "\u031B": "\u002E", "\u031C": "\u002E", "\u031D": "\u002E", "\u031E": "\u002E", "\u031F": "\u002E", + "\u0320": "\u002E", "\u0321": "\u002E", "\u0322": "\u002E", "\u0323": "\u002E", "\u0324": "\u002E", "\u0325": "\u002E", "\u0326": "\u002E", "\u0327": "\u002E", + "\u0328": "\u002E", "\u0329": "\u002E", "\u032A": "\u002E", "\u032B": "\u002E", "\u032C": "\u002E", "\u032D": "\u002E", "\u032E": "\u002E", "\u032F": "\u002E", + "\u0330": "\u002E", "\u0331": "\u002E", "\u0332": "\u002E", "\u0333": "\u002E", "\u0334": "\u002E", "\u0335": "\u002E", "\u0336": "\u002E", "\u0337": "\u002E", + "\u0338": "\u002E", "\u0339": "\u002E", "\u033A": "\u002E", "\u033B": "\u002E", "\u033C": "\u002E", "\u033D": "\u002E", "\u033E": "\u002E", "\u033F": "\u002E", + "\u0340": "\u002E", "\u0341": "\u002E", "\u0342": "\u002E", "\u0343": "\u002E", "\u0344": "\u002E", "\u0345": "\u002E", "\u0346": "\u002E", "\u0347": "\u002E", + "\u0348": "\u002E", "\u0349": "\u002E", "\u034A": "\u002E", "\u034B": "\u002E", "\u034C": "\u002E", "\u034D": "\u002E", "\u034E": "\u002E", "\u034F": "\u002E", + "\u0350": "\u002E", "\u0351": "\u002E", "\u0352": "\u002E", "\u0353": "\u002E", "\u0354": "\u002E", "\u0355": "\u002E", "\u0356": "\u002E", "\u0357": "\u002E", + "\u0358": "\u002E", "\u0359": "\u002E", "\u035A": "\u002E", "\u035B": "\u002E", "\u035C": "\u002E", "\u035D": "\u002E", "\u035E": "\u002E", "\u035F": "\u002E", + "\u0360": "\u002E", "\u0361": "\u002E", "\u0362": "\u002E", "\u0363": "\u002E", "\u0364": "\u002E", "\u0365": "\u002E", "\u0366": "\u002E", "\u0367": "\u002E", + "\u0368": "\u002E", "\u0369": "\u002E", "\u036A": "\u002E", "\u036B": "\u002E", "\u036C": "\u002E", "\u036D": "\u002E", "\u036E": "\u002E", "\u036F": "\u002E", + "\u0370": "\u002E", "\u0371": "\u002E", "\u0372": "\u002E", "\u0373": "\u002E", "\u0374": "\u002E", "\u0375": "\u002E", "\u0376": "\u002E", "\u0377": "\u002E", + "\u0378": "\u002E", "\u0379": "\u002E", "\u037A": "\u002E", "\u037B": "\u002E", "\u037C": "\u002E", "\u037D": "\u002E", "\u037E": "\u002E", "\u037F": "\u002E", + "\u0380": "\u002E", "\u0381": "\u002E", "\u0382": "\u002E", "\u0383": "\u002E", "\u0384": "\u002E", "\u0385": "\u002E", "\u0386": "\u0041", "\u0387": "\u002E", + "\u0388": "\u0045", "\u0389": "\u0049", "\u038A": "\u0049", "\u038B": "\u002E", "\u038C": "\u004F", "\u038D": "\u002E", "\u038E": "\u0059", "\u038F": "\u004F", + "\u0390": "\u0069", "\u0391": "\u0041", "\u0392": "\u0056", "\u0393": "\u0047", "\u0394": "\u0044", "\u0395": "\u0045", "\u0396": "\u005A", "\u0397": "\u0049", + "\u0398": "\u0054\u0048", "\u0399": "\u0049", "\u039A": "\u004B", "\u039B": "\u004C", "\u039C": "\u004D", "\u039D": "\u004E", "\u039E": "\u0058", "\u039F": "\u004F", + "\u03A0": "\u0050", "\u03A1": "\u0052", "\u03A2": "\u002E", "\u03A3": "\u0053", "\u03A4": "\u0054", "\u03A5": "\u0059", "\u03A6": "\u0046", "\u03A7": "\u0043\u0048", + "\u03A8": "\u0050\u0053", "\u03A9": "\u004F", "\u03AA": "\u0049", "\u03AB": "\u0059", "\u03AC": "\u0061", "\u03AD": "\u0065", "\u03AE": "\u0069", "\u03AF": "\u0069", + "\u03B0": "\u0079", "\u03B1": "\u0061", "\u03B2": "\u0076", "\u03B3": "\u0067", "\u03B4": "\u0064", "\u03B5": "\u0065", "\u03B6": "\u007A", "\u03B7": "\u0069", + "\u03B8": "\u0074\u0068", "\u03B9": "\u0069", "\u03BA": "\u006B", "\u03BB": "\u006C", "\u03BC": "\u006D", "\u03BD": "\u006E", "\u03BE": "\u0078", "\u03BF": "\u006F", + "\u03C0": "\u0070", "\u03C1": "\u0072", "\u03C2": "\u0073", "\u03C3": "\u0073", "\u03C4": "\u0074", "\u03C5": "\u0079", "\u03C6": "\u0066", "\u03C7": "\u0063\u0068", + "\u03C8": "\u0070\u0073", "\u03C9": "\u006F", "\u03CA": "\u0069", "\u03CB": "\u0079", "\u03CC": "\u006F", "\u03CD": "\u0079", "\u03CE": "\u006F", "\u03CF": "\u002E", + "\u03D0": "\u002E", "\u03D1": "\u002E", "\u03D2": "\u002E", "\u03D3": "\u002E", "\u03D4": "\u002E", "\u03D5": "\u002E", "\u03D6": "\u002E", "\u03D7": "\u002E", + "\u03D8": "\u002E", "\u03D9": "\u002E", "\u03DA": "\u002E", "\u03DB": "\u002E", "\u03DC": "\u002E", "\u03DD": "\u002E", "\u03DE": "\u002E", "\u03DF": "\u002E", + "\u03E0": "\u002E", "\u03E1": "\u002E", "\u03E2": "\u002E", "\u03E3": "\u002E", "\u03E4": "\u002E", "\u03E5": "\u002E", "\u03E6": "\u002E", "\u03E7": "\u002E", + "\u03E8": "\u002E", "\u03E9": "\u002E", "\u03EA": "\u002E", "\u03EB": "\u002E", "\u03EC": "\u002E", "\u03ED": "\u002E", "\u03EE": "\u002E", "\u03EF": "\u002E", + "\u03F0": "\u002E", "\u03F1": "\u002E", "\u03F2": "\u002E", "\u03F3": "\u002E", "\u03F4": "\u002E", "\u03F5": "\u002E", "\u03F6": "\u002E", "\u03F7": "\u002E", + "\u03F8": "\u002E", "\u03F9": "\u002E", "\u03FA": "\u002E", "\u03FB": "\u002E", "\u03FC": "\u002E", "\u03FD": "\u002E", "\u03FE": "\u002E", "\u03FF": "\u002E", + "\u0400": "\u002E", "\u0401": "\u002E", "\u0402": "\u002E", "\u0403": "\u002E", "\u0404": "\u002E", "\u0405": "\u002E", "\u0406": "\u002E", "\u0407": "\u002E", + "\u0408": "\u002E", "\u0409": "\u002E", "\u040A": "\u002E", "\u040B": "\u002E", "\u040C": "\u002E", "\u040D": "\u002E", "\u040E": "\u002E", "\u040F": "\u002E", + "\u0410": "\u0041", "\u0411": "\u0042", "\u0412": "\u0056", "\u0413": "\u0047", "\u0414": "\u0044", "\u0415": "\u0045", "\u0416": "\u005A\u0048", "\u0417": "\u005A", + "\u0418": "\u0049", "\u0419": "\u0059", "\u041A": "\u004B", "\u041B": "\u004C", "\u041C": "\u004D", "\u041D": "\u004E", "\u041E": "\u004F", "\u041F": "\u0050", + "\u0420": "\u0052", "\u0421": "\u0053", "\u0422": "\u0054", "\u0423": "\u0055", "\u0424": "\u0046", "\u0425": "\u0048", "\u0426": "\u0054\u0053", + "\u0427": "\u0043\u0048", "\u0428": "\u0053\u0048", "\u0429": "\u0053\u0048\u0054", "\u042A": "\u0041", "\u042B": "\u002E", "\u042C": "\u0059", "\u042D": "\u002E", + "\u042E": "\u0059\u0055", "\u042F": "\u0059\u0041", "\u0430": "\u0061", "\u0431": "\u0062", "\u0432": "\u0076", "\u0433": "\u0067", "\u0434": "\u0064", + "\u0435": "\u0065", "\u0436": "\u007A\u0068", "\u0437": "\u007A", "\u0438": "\u0069", "\u0439": "\u0079", "\u043A": "\u006B", "\u043B": "\u006C", "\u043C": "\u006D", + "\u043D": "\u006E", "\u043E": "\u006F", "\u043F": "\u0070", "\u0440": "\u0072", "\u0441": "\u0073", "\u0442": "\u0074", "\u0443": "\u0075", "\u0444": "\u0066", + "\u0445": "\u0068", "\u0446": "\u0074\u0073", "\u0447": "\u0063\u0068", "\u0448": "\u0073\u0068", "\u0449": "\u0073\u0068\u0074", "\u044A": "\u0061", + "\u044B": "\u002E", "\u044C": "\u0079", "\u044D": "\u002E", "\u044E": "\u0079\u0075", "\u044F": "\u0079\u0061", "\u0450": "\u002E", "\u0451": "\u002E", + "\u0452": "\u002E", "\u0453": "\u002E", "\u0454": "\u002E", "\u0455": "\u002E", "\u0456": "\u002E", "\u0457": "\u002E", "\u0458": "\u002E", "\u0459": "\u002E", + "\u045A": "\u002E", "\u045B": "\u002E", "\u045C": "\u002E", "\u045D": "\u002E", +} diff --git a/dev_odex30_accounting/odex30_account_batch_payment/report/__init__.py b/dev_odex30_accounting/odex30_account_batch_payment/report/__init__.py new file mode 100644 index 0000000..9ac3f1a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/report/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import account_batch_payment_report diff --git a/dev_odex30_accounting/odex30_account_batch_payment/report/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_batch_payment/report/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76984a86cc4eafcb49cb97add3f572a3cd3feb94 GIT binary patch literal 319 zcmZ3^%ge<81OgYMGF^c5V-N=hn4pZ$LO{lJh7^Vr#vF!R#wbQch7_h?22JLdj6exZ z##=Ip$;tVpc_r~li6zMy@db&Mxv4;2QEEYcQHh@>(=CP~W}wQI44*+J{_54w$j?pH zPt3{ANUSQ#%G3|2OwLFw$_*&W&q_@$Db~+VNv$w808;t+x`q~d5EfX}$RHkSS7u(i zeoAUtJVY(BD5?mmoAe=W(vOeN%*!l^kJl@x{Ka9Do1apelWJGQ0dyV6OU3d);sY}y UBjX1)21e}*3|g3|hz+O)0B-nQ^#A|> literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_batch_payment/report/__pycache__/account_batch_payment_report.cpython-311.pyc b/dev_odex30_accounting/odex30_account_batch_payment/report/__pycache__/account_batch_payment_report.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c9d28d6d1ac7e31c543d23560c91843a6141e3b GIT binary patch literal 1378 zcma)5OHUI~6ux&}EsrYI@-m>97?T=lK{t{hiHH#sZ9ozdN0Z4g_d=)6bn482(v+kN z7VO-R$byBsz!*0E1b+gMCN#4mapkTASFAjDrc>LLg}2S=ch0%zanE=9Ef(uUa2_7Y z`bQ3-UrY&)SO;g506rmt2sV(3Wo&XXhY^RKBEoGV!c#8Che3OQ_8Xck5Mco&#ox@G zR+gc^<(hOpl-qF#$4851OP1j{_(APX;xRLVud5F!zA6Yqh#ADWOH^=n1E z_?)fh-D%a;vUBRXN%L-T%%%m)c2laRS*v+hSz=D55O`AscE8njJ_bF0xId=+cSJGa zR~(svN{;T1y!0z(wD4uDPc~7epM3=Z6U7^R3FQC>hj4=-M4xd3Hh~hq2loAjZ$l{I zl8^)Dg43L>+1`}5xt}l$m2hib!te6Hn~<^D$cu5^hS9mYm3LCXB$K=sA(p1-#PK>9 z@HzDafKF2Ic$#1HdX*LGD#3ka*|tn2ubR{ogR9b#ZM}DBQuG9e8q1ypp)8v~R9E%7 z>S2C_6etcG-v~SBU(#92q-oW7n^lW;PEXIRYgyGc=WHuSHP=Z8?7@#^jgCJ^jrqv8 z-fM8G=U38%t|_fdGi$4*bu-dIGwBN#qyE}dVcomZ{Q5Q3Sfx(!R@-K#+HZBiE1d-p zWpvUvyVX^V_ihgyTpO*#Q^)a{qxj6v*N5@>N_>7xI_V#-4&K-uswM`uXLlBN-&7KJ zjuYcYiSZw|4-*rW#6&G3^mNuxAUZnFAT3JbOtQm^Dn1>G;&m#Fy;Xw(?pBm{tE$1q z4w@J+)}gr6EEuXw!B428*?NI3gUxoyzQjZyi0{bmXSkOMDHIGik3p0hpKAA1`AM~B zy8NtqHCcXsB1Sh~)wqZVjfUcsN7CgsYmlF1%&@&->;^puVDe&*mK@iHJ$(WE89@iv z!SS!F^XO#o(kc5UIN0CFSp-qzF~&6s;o$=`)c&nWF$}%6iyf&laQBos{#@Yo>;46t CEN<)o literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_batch_payment/report/account_batch_payment_report.py b/dev_odex30_accounting/odex30_account_batch_payment/report/account_batch_payment_report.py new file mode 100644 index 0000000..5a7f866 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/report/account_batch_payment_report.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +from odoo import api, models + + +class PrintBatchPayment(models.AbstractModel): + _name = 'report.account_batch_payment.print_batch_payment' + _template = 'odex30_account_batch_payment.print_batch_payment' + _description = 'Batch Deposit Report' + + @api.model + def _get_report_values(self, docids, data=None): + report_name = 'odex30_account_batch_payment.print_batch_payment' + report = self.env['ir.actions.report']._get_report_from_name(report_name) + return { + 'doc_ids': docids, + 'doc_model': report.model, + 'docs': self.env[report.model].browse(docids), + } diff --git a/dev_odex30_accounting/odex30_account_batch_payment/report/account_batch_payment_report_templates.xml b/dev_odex30_accounting/odex30_account_batch_payment/report/account_batch_payment_report_templates.xml new file mode 100644 index 0000000..48bbccb --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/report/account_batch_payment_report_templates.xml @@ -0,0 +1,56 @@ + + + + + diff --git a/dev_odex30_accounting/odex30_account_batch_payment/report/account_batch_payment_reports.xml b/dev_odex30_accounting/odex30_account_batch_payment/report/account_batch_payment_reports.xml new file mode 100644 index 0000000..204b849 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/report/account_batch_payment_reports.xml @@ -0,0 +1,13 @@ + + + + Print Batch Payment + account.batch.payment + qweb-pdf + odex30_account_batch_payment.print_batch_payment + odex30_account_batch_payment.print_batch_payment + + + report + + \ No newline at end of file diff --git a/dev_odex30_accounting/odex30_account_batch_payment/security/account_batch_payment_security.xml b/dev_odex30_accounting/odex30_account_batch_payment/security/account_batch_payment_security.xml new file mode 100644 index 0000000..2d4e997 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/security/account_batch_payment_security.xml @@ -0,0 +1,10 @@ + + + + + Account batch payment company rule + + ['|',('journal_id.company_id','=',False),('journal_id.company_id','parent_of', company_ids)] + + + diff --git a/dev_odex30_accounting/odex30_account_batch_payment/security/ir.model.access.csv b/dev_odex30_accounting/odex30_account_batch_payment/security/ir.model.access.csv new file mode 100644 index 0000000..ce0d688 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_batch_payment_readonly,account.batch.payment,model_account_batch_payment,account.group_account_readonly,1,0,0,0 +access_account_batch_payment,account.batch.payment,model_account_batch_payment,account.group_account_invoice,1,1,1,1 +access_account_batch_error_wizard,access.account.batch.error.wizard,model_account_batch_error_wizard,account.group_account_invoice,1,1,1,0 +access_account_batch_error_wizard_line,access.account.batch.error.wizard.line,model_account_batch_error_wizard_line,account.group_account_invoice,1,1,1,0 diff --git a/dev_odex30_accounting/odex30_account_batch_payment/static/description/icon.png b/dev_odex30_accounting/odex30_account_batch_payment/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2ee605722819c2c08494b11a171b164e9c85bf4f GIT binary patch literal 3092 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 iq@<*zq@<*zyu?qan!s*pXHN+L0000 diff --git a/dev_odex30_accounting/odex30_account_batch_payment/static/src/scss/report_batch_payment.scss b/dev_odex30_accounting/odex30_account_batch_payment/static/src/scss/report_batch_payment.scss new file mode 100644 index 0000000..ba8f328 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/static/src/scss/report_batch_payment.scss @@ -0,0 +1,7 @@ +.page_batch_payment { + page-break-after: always; + .batch_details { + margin: 0.2in 0; + font-size: 1.5em; + } +} diff --git a/dev_odex30_accounting/odex30_account_batch_payment/tests/__init__.py b/dev_odex30_accounting/odex30_account_batch_payment/tests/__init__.py new file mode 100644 index 0000000..a0cf368 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import test_account_batch_payment +from . import test_sepa_mapping diff --git a/dev_odex30_accounting/odex30_account_batch_payment/tests/test_account_batch_payment.py b/dev_odex30_accounting/odex30_account_batch_payment/tests/test_account_batch_payment.py new file mode 100644 index 0000000..e534525 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/tests/test_account_batch_payment.py @@ -0,0 +1,464 @@ +# -*- coding: utf-8 -*- +from odoo import Command +from odoo.addons.account.tests.common import AccountTestInvoicingCommon +from odoo.tests import tagged +from odoo.exceptions import RedirectWarning, ValidationError + +@tagged('post_install', '-at_install') +class TestAccountBatchPayment(AccountTestInvoicingCommon): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env.user.groups_id |= cls.env.ref('account.group_validate_bank_account') + cls.other_currency = cls.setup_other_currency('EUR') + cls.other_currency_2 = cls.setup_other_currency('CHF') + + cls.payment_debit_account_id = cls.copy_account(cls.inbound_payment_method_line.payment_account_id) + cls.payment_credit_account_id = cls.copy_account(cls.outbound_payment_method_line.payment_account_id) + + cls.partner_bank_account = cls.env['res.partner.bank'].create({ + 'acc_number': 'BE32707171912447', + 'partner_id': cls.partner_a.id, + 'allow_out_payment': True, + 'acc_type': 'bank', + }) + + def _create_multi_company_payments_and_context(self, companies_dict, add_company_context=None): + payments = self.env['account.payment'] + companies_context = self.env['res.company'] + field_record = self.env['ir.model.fields']._get('res.partner', 'property_account_receivable_id') + property_account_receivable = self.env['ir.default'].search( + [('field_id', '=', field_record.id), ('company_id', '=', self.company_data['company'].id)], limit=1 + ) + + for company, create_property_account_receivable in companies_dict.items(): + if create_property_account_receivable: + # needed for computation of payment.destination_account_id + property_account_receivable.copy({'company_id': company.id}) + payment = self.env['account.payment'].with_company(company).create({ + 'amount': 100.0, + 'payment_type': 'inbound', + 'partner_type': 'customer', + 'partner_id': self.partner_a.id, + }) + payment.action_post() + payments += payment + companies_context += company + + if add_company_context: + companies_context += add_company_context + + context = { + **self.env.context, + 'allowed_company_ids': companies_context.ids, + 'active_ids': payments.ids, + 'active_model': 'account.payment', + } + + return payments, context + + def test_create_batch_payment_from_payment(self): + payments = self.env['account.payment'] + for dummy in range(2): + payments += self.env['account.payment'].create({ + 'amount': 100.0, + 'payment_type': 'outbound', + 'partner_type': 'supplier', + 'partner_id': self.partner_a.id, + 'destination_account_id': self.partner_a.property_account_payable_id.id, + 'currency_id': self.other_currency.id, + 'partner_bank_id': self.partner_bank_account.id, + }) + + payments.action_post() + batch_payment_action = payments.create_batch_payment() + batch_payment_id = self.env['account.batch.payment'].browse(batch_payment_action.get('res_id')) + self.assertEqual(len(batch_payment_id.payment_ids), 2) + + def test_change_payment_state(self): + """ + Check if the amount is well computed when we change a payment state + """ + payments = self.env['account.payment'] + for _ in range(2): + payments += self.env['account.payment'].create({ + 'amount': 100.0, + 'payment_type': 'inbound', + 'partner_type': 'supplier', + 'partner_id': self.partner_a.id, + 'destination_account_id': self.partner_a.property_account_payable_id.id, + 'partner_bank_id': self.partner_bank_account.id, + }) + payments.action_post() + + batch_payment = self.env['account.batch.payment'].create( + { + 'journal_id': payments.journal_id.id, + 'payment_method_id': payments.payment_method_id.id, + 'payment_ids': [ + (6, 0, payments.ids) + ], + } + ) + + self.assertRecordValues(batch_payment, [{ + 'amount': 200.0, + 'amount_residual': 200.0, + 'amount_residual_currency': 200.0, + }]) + + payments[0].move_id.button_draft() + + # Check that we still keep it + self.assertRecordValues(batch_payment, [{ + 'amount': 200.0, + 'amount_residual': 200.0, + 'amount_residual_currency': 200.0, + }]) + + def test_change_payment_state_valid(self): + """ + Check if the amount is well computed when we change a payment state into a non valid payment status + """ + if self.env['account.move']._get_invoice_in_payment_state() != 'in_payment': + self.skipTest('Accounting not installed') + payments = self.env['account.payment'] + bank_journal_2 = self.company_data['default_journal_bank'].copy() + for _ in range(2): + payments += self.env['account.payment'].create({ + 'amount': 100.0, + 'payment_type': 'inbound', + 'partner_type': 'supplier', + 'partner_id': self.partner_a.id, + 'journal_id': bank_journal_2.id, + }) + payments.action_post() + + batch_payment = self.env['account.batch.payment'].create( + { + 'journal_id': payments.journal_id.id, + 'payment_method_id': payments.payment_method_id.id, + 'payment_ids': [ + (6, 0, payments.ids) + ], + } + ) + + self.assertRecordValues(batch_payment, [{ + 'amount': 200.0, + 'amount_residual': 200.0, + 'amount_residual_currency': 200.0, + }]) + + # Change move state to 'paid', if accounting is installed it won't be a valid payment state for batches + payments[0].action_validate() + + self.assertRecordValues(batch_payment, [{ + 'amount': 200.0, + 'amount_residual': 100.0, + 'amount_residual_currency': 100.0, + }]) + + def test_validate_batch(self): + """ + Check that we can only validate a batch if all the payments are in progress + """ + payments = self.env['account.payment'] + for _ in range(2): + payments += self.env['account.payment'].create({ + 'amount': 100.0, + 'payment_type': 'inbound', + 'partner_type': 'supplier', + 'partner_id': self.partner_a.id, + 'destination_account_id': self.partner_a.property_account_payable_id.id, + 'partner_bank_id': self.partner_bank_account.id, + }) + payments.action_post() + + batch_payment = self.env['account.batch.payment'].create( + { + 'journal_id': payments.journal_id.id, + 'payment_method_id': payments.payment_method_id.id, + 'payment_ids': [Command.set(payments.ids)] + } + ) + payments[0].action_validate() + + # In accounting, we can only validate a batch if all the payments are in process + # While in enterprise invoicing, we can validate a batch even if some payments are paid + is_accounting_installed = self.env['account.move']._get_invoice_in_payment_state() == 'in_payment' + if is_accounting_installed: + with self.assertRaisesRegex(RedirectWarning, "To validate the batch, payments must be in process"): + batch_payment.validate_batch() + # Set payment to in process state + payments[0].action_draft() + payments[0].action_post() + action = batch_payment.validate_batch() + self.assertFalse(action) + + def test_batch_payment_sub_company(self): + """Test the creation of a batch payment from a sub company""" + self.company_data['company'].write({'child_ids': [Command.create({'name': 'Good Company'})]}) + child_comp = self.company_data['company'].child_ids[0] + + payment, context = self._create_multi_company_payments_and_context({child_comp: True}) + + batch = self.env['account.batch.payment'].with_context(context).create({ + 'journal_id': payment.journal_id.id, + }) + self.assertTrue(batch) + + def test_batch_payment_branches(self): + """ + Test the creation of a batch payment with branches. When all payments are branches of + a common head office, a batch payment should be allowed to be created. + """ + main_company = self.company_data['company'] + main_company.vat = '123' + branch_1 = self.env['res.company'].create({'name': "Branch 1", 'parent_id': main_company.id}) + branch_2 = self.env['res.company'].create({'name': "Branch 2", 'parent_id': main_company.id, 'vat': '456'}) + branch_2_1 = self.env['res.company'].create({'name': "Branch 2 sub-branch 1", 'parent_id': branch_2.id}) + + payments, context = self._create_multi_company_payments_and_context({branch_1: True, branch_2: True, branch_2_1: True}) + + batch = self.env['account.batch.payment'].with_context(context).create({ + 'journal_id': payments[0].journal_id.id, + 'payment_ids': payments.ids, + }) + self.assertTrue(batch) + + def test_batch_payment_different_companies(self): + """ Payments from different companies not belonging to the same head company should raise an error. """ + main_company = self.company_data['company'] + company_b = self.setup_other_company()['company'] + + payments, context = self._create_multi_company_payments_and_context({main_company: False, company_b: False}, main_company) + + with self.assertRaisesRegex(ValidationError, "The journal of the batch payment and of the payments it contains must be the same."): + self.env['account.batch.payment'].with_context(context).create({ + 'journal_id': payments[0].journal_id.id, + 'payment_ids': payments.ids, + }) + + def test_batch_payment_foreign_currency(self): + """ + Make sure that payments in foreign currency are converted for the total amount to be displayed + currency rate = 1$:10€ + amount_company_currency = 100$ + amount_foreign_currency = 100€ -> 10$ + => batch.amount = 110$ + """ + payments = self.env['account.payment'] + company_currency = self.env.company.currency_id + foreign_currency = self.other_currency + + self.env['res.currency.rate'].create({ + 'name': '2024-05-14', + 'rate': 10, + 'currency_id': foreign_currency.id, + 'company_id': self.env.company.id, + }) + + for currency in (company_currency, foreign_currency): + payments += self.env['account.payment'].create({ + 'amount': 100.0, + 'payment_type': 'inbound', + 'partner_type': 'supplier', + 'partner_id': self.partner_a.id, + 'currency_id': currency.id, + 'date': '2024-05-14', + }) + + payments.action_post() + batch_payment_action = payments.create_batch_payment() + batch_payment = self.env['account.batch.payment'].browse(batch_payment_action.get('res_id')) + self.assertRecordValues(batch_payment, [{ + 'amount': 110.0, + 'amount_residual': 110.0, + 'amount_residual_currency': 110.0, + }]) + + def test_batch_payment_move_different_currencies(self): + """ + Make sure that payments linked to a move in foreign currency 1 are converted correctly when + the batch is in foreign currency 2 + """ + payments = self.env['account.payment'] + bank_journal_2 = self.company_data['default_journal_bank'].copy({'currency_id': self.other_currency_2.id}) + + outstanding_payment_B = self.inbound_payment_method_line.payment_account_id.copy() + bank_journal_2.inbound_payment_method_line_ids.payment_account_id = outstanding_payment_B + + for currency, rate in [(self.other_currency, 10), (self.other_currency_2, 20)]: + self.env['res.currency.rate'].create({ + 'name': '2024-05-14', + 'rate': rate, + 'currency_id': currency.id, + 'company_id': self.env.company.id, + }) + + for amount in (100.0, 15.0): + payments += self.env['account.payment'].create({ + 'amount': amount, + 'payment_type': 'inbound', + 'partner_type': 'supplier', + 'partner_id': self.partner_a.id, + 'currency_id': self.other_currency.id, + 'journal_id': bank_journal_2.id, + 'date': '2024-05-14', + }) + + payments.action_post() + batch_payment_action = payments.create_batch_payment() + batch_payment = self.env['account.batch.payment'].browse(batch_payment_action.get('res_id')) + self.assertRecordValues(batch_payment, [{ + 'amount': 230.0, + 'amount_residual': 11.5, + 'amount_residual_currency': 230.0, + }]) + + def test_foreign_currency_batch_payment(self): + """ + Make sure that payments in company_currency are converted when the batch is in + foreign currency + """ + payments = self.env['account.payment'] + foreign_currency = self.other_currency + + bank_journal_2 = self.company_data['default_journal_bank'].copy() + + self.env['res.currency.rate'].create({ + 'name': '2024-05-14', + 'rate': 10, + 'currency_id': foreign_currency.id, + 'company_id': self.env.company.id, + }) + + for amount in (100, 15): + payments += self.env['account.payment'].create({ + 'amount': amount, + 'payment_type': 'inbound', + 'partner_type': 'supplier', + 'partner_id': self.partner_a.id, + 'currency_id': self.other_currency.id, + 'date': '2024-05-14', + 'journal_id': bank_journal_2.id, + }) + + payments.action_post() + batch_payment_action = payments.create_batch_payment() + batch_payment = self.env['account.batch.payment'].browse(batch_payment_action.get('res_id')) + self.assertRecordValues(batch_payment, [{ + 'amount': 11.5, + 'amount_residual': 11.5, + 'amount_residual_currency': 11.5, + }]) + + def test_batch_payment_journal_foreign_currency(self): + """ + Test that, if a bank journal is set in a foreign currency, the batch payment will be correctly converted + currency rate = 1$:10€ + payment of 100€ -> 100☺ + payment of 100$ -> 1000☺ + Total -> 1100 + """ + payments = self.env['account.payment'] + company_currency = self.env.company.currency_id + foreign_currency = self.other_currency + + self.env['res.currency.rate'].create({ + 'name': '2024-05-14', + 'rate': 10, + 'currency_id': foreign_currency.id, + 'company_id': self.env.company.id, + }) + bank_journal_foreign = self.env['account.journal'].create({ + 'name': 'Bank2', + 'type': 'bank', + 'code': 'BNK2', + 'currency_id': foreign_currency.id, + }) + + for currency in (company_currency, foreign_currency): + payments += self.env['account.payment'].create({ + 'amount': 100.0, + 'payment_type': 'inbound', + 'partner_type': 'supplier', + 'partner_id': self.partner_a.id, + 'currency_id': currency.id, + 'date': '2024-05-14', + 'journal_id': bank_journal_foreign.id + }) + + payments.action_post() + batch_payment_action = payments.create_batch_payment() + batch_payment = self.env['account.batch.payment'].browse(batch_payment_action.get('res_id')) + self.assertRecordValues(batch_payment, [{ + 'amount': 1100.0, + 'amount_residual': 110.0, + 'amount_residual_currency': 1100.0, + }]) + + def test_create_batch_from_payment_already_in_batch(self): + payment = self.env['account.payment'].create({ + 'amount': 100.0, + 'payment_type': 'outbound', + 'partner_type': 'supplier', + 'partner_id': self.partner_a.id, + 'destination_account_id': self.partner_a.property_account_payable_id.id, + 'currency_id': self.other_currency.id, + 'partner_bank_id': self.partner_bank_account.id, + }) + payment.action_post() + batch_payment_action = payment.create_batch_payment() + batch_payment_id = self.env['account.batch.payment'].browse(batch_payment_action.get('res_id')) + batch_payment_id.validate_batch() + with self.assertRaises(ValidationError): + payment.create_batch_payment() + + def test_amount_in_paid_state(self): + """ + Verify that the batch payment amount is correctly computed when the payment state is 'paid'. + """ + payments = self.env['account.payment'] + + # Create two inbound payments of 100€ each + for _ in range(2): + payments += self.env['account.payment'].create({ + 'amount': 100.0, + 'payment_type': 'inbound', + 'partner_type': 'supplier', + 'partner_id': self.partner_a.id, + 'destination_account_id': self.partner_a.property_account_payable_id.id, + 'partner_bank_id': self.partner_bank_account.id, + }) + # Post the payments to validate them + payments.action_post() + + # Update payment states to 'paid' + payments.write({'state': 'paid'}) + + # Ensure all payments are now in the 'paid' state + self.assertTrue(all(payment.state == 'paid' for payment in payments), "Payments should be in 'paid' state") + + # Create a batch payment including the two payments + batch_payment = self.env['account.batch.payment'].create( + { + 'journal_id': payments.journal_id.id, + 'payment_method_id': payments.payment_method_id.id, + 'payment_ids': [Command.set(payments.ids)], + } + ) + + # Ensure the amount remains correct after recomputation + # When accountant is not installed, payments with paid state + # should be counted when recomputing amount_residual + if self.env['ir.module.module']._get('accountant').state == 'installed': + self.assertEqual(batch_payment.amount_residual, 0) + self.assertEqual(batch_payment.amount_residual_currency, 0) + else: + self.assertEqual(batch_payment.amount_residual, 200) + self.assertEqual(batch_payment.amount_residual_currency, 200) + self.assertEqual(batch_payment.amount, 200) + diff --git a/dev_odex30_accounting/odex30_account_batch_payment/tests/test_sepa_mapping.py b/dev_odex30_accounting/odex30_account_batch_payment/tests/test_sepa_mapping.py new file mode 100644 index 0000000..0bf1d54 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/tests/test_sepa_mapping.py @@ -0,0 +1,15 @@ +from odoo.addons.odex30_account_batch_payment.models.sepa_mapping import sanitize_communication +from odoo.tests.common import TransactionCase + + +class TestSepaMapping(TransactionCase): + def test_sepa_mapping(self): + self.assertEqual(sanitize_communication("Hello/world", 5), "Hello") + self.assertEqual(sanitize_communication("Hello / World"), "Hello / World") + self.assertEqual(sanitize_communication("Hello // World"), "Hello / World") + self.assertEqual(sanitize_communication("Hello //// W//orld"), "Hello / W/orld") + self.assertEqual(sanitize_communication("/Hello / World/"), "Hello / World") + self.assertEqual(sanitize_communication("Hello / World /"), "Hello / World ") + self.assertEqual(sanitize_communication("\u1F9E/Hello"), "Hello") + self.assertEqual(sanitize_communication("Hello/\u1F9E"), "Hello") + self.assertEqual(sanitize_communication("Hello/\u1F9E/ World"), "Hello/ World") diff --git a/dev_odex30_accounting/odex30_account_batch_payment/views/account_batch_payment_views.xml b/dev_odex30_accounting/odex30_account_batch_payment/views/account_batch_payment_views.xml new file mode 100644 index 0000000..79021b1 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/views/account_batch_payment_views.xml @@ -0,0 +1,180 @@ + + + + + Create batch payment + + + list + code + +if records: + action = records.create_batch_payment() + + + + + account.batch.payment.form + account.batch.payment + +
        +
        + + +
        + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + account.batch.payment.search + account.batch.payment + + + + + + + + + + + + + + + + + account.batch.payment.list + account.batch.payment + + + + + + + + + + + + + + + Customer Batch Payments + account.batch.payment + list,form,kanban,activity + + + [('batch_type', '=', 'inbound')] + {'search_default_open': 1, 'default_batch_type': 'inbound'} + +

        + Create a new customer batch payment +

        + Batch payments allow you grouping different payments to ease + reconciliation. They are also useful when depositing checks + to the bank. +

        +
        +
        + + + Vendor Batch Payments + account.batch.payment + list,form,kanban,activity + + + [('batch_type', '=', 'outbound')] + {'search_default_open': 1, 'default_batch_type': 'outbound'} + +

        + Create a new vendor batch payment +

        + Batch payments allow you grouping different payments to ease + reconciliation. They are also useful when depositing checks + to the bank. +

        +
        +
        + + + account.batch.payment.move.kanban + account.batch.payment + + + + + +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        +
        +
        +
        +
        + + + + + diff --git a/dev_odex30_accounting/odex30_account_batch_payment/views/account_journal_views.xml b/dev_odex30_accounting/odex30_account_batch_payment/views/account_journal_views.xml new file mode 100644 index 0000000..c8bc579 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/views/account_journal_views.xml @@ -0,0 +1,16 @@ + + + + + account.journal.dashboard.kanban.inherited + account.journal + + + + + + + + \ No newline at end of file diff --git a/dev_odex30_accounting/odex30_account_batch_payment/views/account_payment_views.xml b/dev_odex30_accounting/odex30_account_batch_payment/views/account_payment_views.xml new file mode 100644 index 0000000..0669d99 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/views/account_payment_views.xml @@ -0,0 +1,97 @@ + + + + + + + + account.payment.search.inherit.account_batch_payment + account.payment + + + + + + + + + + + + + + + + + + + + + + + + account.payment.list.inherit.account_batch_payment + account.payment + + +
        +
        + + + + + + + +
        + + + account.payment.form.inherit.account_batch_payment + account.payment + + + +
        + + + +
        + +
        +
        + + + account.payment.list.popup.inherit.account_batch_payment + account.payment + + primary + 10 + + + 1 + + + hide + + + hide + + + hide + + + + +
        +
        diff --git a/dev_odex30_accounting/odex30_account_batch_payment/wizard/__init__.py b/dev_odex30_accounting/odex30_account_batch_payment/wizard/__init__.py new file mode 100644 index 0000000..0a172cf --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/wizard/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import batch_error diff --git a/dev_odex30_accounting/odex30_account_batch_payment/wizard/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_batch_payment/wizard/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96204e8d5055a6729af13f8fe7fff9c3df608a95 GIT binary patch literal 302 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 UM)Bylv+K|soOrv#EZ_Ej0aFO=jsO4v literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_batch_payment/wizard/batch_error.py b/dev_odex30_accounting/odex30_account_batch_payment/wizard/batch_error.py new file mode 100644 index 0000000..5791cf2 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/wizard/batch_error.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- + +from odoo import api, models, fields, _ + + +class BatchErrorWizard(models.TransientModel): + _name = 'account.batch.error.wizard' + _description = "Batch payments error reporting wizard" + + batch_payment_id = fields.Many2one(comodel_name='account.batch.payment', required=True, help="The batch payment generating the errors and warnings displayed in this wizard.") + error_line_ids = fields.One2many(comodel_name='account.batch.error.wizard.line', inverse_name='error_wizard_id') + warning_line_ids = fields.One2many(comodel_name='account.batch.error.wizard.line', inverse_name='warning_wizard_id') + show_remove_options = fields.Boolean(required=True, help="True if and only if the options to remove the payments causing the errors or warnings from the batch should be shown") + + @api.model + def create_from_errors_list(self, batch, errors_list, warnings_list): + rslt = self.create({'batch_payment_id': batch.id, 'show_remove_options': batch.export_file}) + self._create_error_wizard_lines(rslt.id, 'error_wizard_id', errors_list) + self._create_error_wizard_lines(rslt.id, 'warning_wizard_id', warnings_list) + return rslt + + @api.model + def _create_error_wizard_lines(self, wizard_id, wizard_link_field, entries): + wizard_line = self.env['account.batch.error.wizard.line'] + for entry in entries: + wizard_line.create({ + wizard_link_field: wizard_id, + 'description': entry['title'], + 'help_message': entry.get('help', None), + 'payment_ids': [(6, False, entry['records'].ids)], + }) + + def proceed_with_validation(self): + self.ensure_one() + return self.batch_payment_id._send_after_validation() + +class BatchErrorWizardLine(models.TransientModel): + _name = 'account.batch.error.wizard.line' + _description = "Batch payments error reporting wizard line" + + description = fields.Char(string="Description", required=True) + help_message = fields.Char(string="Help") + payment_ids = fields.Many2many(string='Payments', comodel_name='account.payment', required=True) + error_wizard_id = fields.Many2one(comodel_name='account.batch.error.wizard') + warning_wizard_id = fields.Many2one(comodel_name='account.batch.error.wizard') + # Whether or not this line should display a button allowing to remove its related payments from the batch + show_remove_button = fields.Boolean(compute="_compute_show_remove_button") + + def _compute_show_remove_button(self): + for record in self: + record.show_remove_button = record.error_wizard_id.show_remove_options or record.warning_wizard_id.show_remove_options + + def open_payments(self): + return self.payment_ids._get_records_action(name=_('Payments in Error')) + + def remove_payments_from_batch(self): + for payment in self.payment_ids: + payment.batch_payment_id = None + + # We try revalidating the batch if we still have payments for it (we hence do nothing for empty batches) + batch = (self.error_wizard_id or self.warning_wizard_id).batch_payment_id + if batch.payment_ids: + return batch.validate_batch() diff --git a/dev_odex30_accounting/odex30_account_batch_payment/wizard/batch_error_views.xml b/dev_odex30_accounting/odex30_account_batch_payment/wizard/batch_error_views.xml new file mode 100644 index 0000000..71c88d1 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_batch_payment/wizard/batch_error_views.xml @@ -0,0 +1,56 @@ + + + + + + account.batch.error.wizard.form + account.batch.error.wizard + +
        + +
        + + + The following errors occurred + + + + The following warnings were also raised; they do not impeach validation +
        + +
        + + + Please first consider the following warnings +
        + + +
        +
        +
        +
        +
        +
        + + + account.batch.error.wizard.line.list + account.batch.error.wizard.line + + + + + + +

        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

    {62W!5Lz}(am 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

    + +

    + Preferred address for follow-up reports. Selected by default when you send reminders about overdue invoices. +

    +
    + + + + + res.partner.property.form.followup + res.partner + + + + + +
    + +
    +
    +
    +
    +
    + + diff --git a/dev_odex30_accounting/odex30_account_followup/views/report_followup.xml b/dev_odex30_accounting/odex30_account_followup/views/report_followup.xml new file mode 100644 index 0000000..4e4db59 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_followup/views/report_followup.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + Print Follow-up Letter + res.partner + qweb-pdf + odex30_account_followup.report_followup_print_all + odex30_account_followup.report_followup_print_all + 'Follow-up ' + object.display_name + + + + + diff --git a/dev_odex30_accounting/odex30_account_followup/wizard/__init__.py b/dev_odex30_accounting/odex30_account_followup/wizard/__init__.py new file mode 100644 index 0000000..6e3f9fc --- /dev/null +++ b/dev_odex30_accounting/odex30_account_followup/wizard/__init__.py @@ -0,0 +1,2 @@ +from . import followup_manual_reminder +from . import followup_missing_information diff --git a/dev_odex30_accounting/odex30_account_followup/wizard/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_followup/wizard/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30384a40128c5b8e72df57ecffc3700482048928 GIT binary patch literal 375 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 T^yzJF=;TZK@`poM=xY83sCSru literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_followup/wizard/__pycache__/followup_missing_information.cpython-311.pyc b/dev_odex30_accounting/odex30_account_followup/wizard/__pycache__/followup_missing_information.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51ff027906dfe083eab0df07c89d72e2b3849161 GIT binary patch literal 1548 zcmZ`(&2Jk;6rcU@IyMQaNa8e6MHkhAMoHHNT9ir^Cq5+_MNL|yy^K~n<9N+}nAvgM ztP0AZ2hIp79D48p1)<#eJ2uD&Yp$HQ83isq@n%1aqo(8ao44=1dGF2dH?u!4EYuN< zZ-2MF1r4D;rr$lw(8?QG66Awi2kesvs48iir9Q5sfNcSeuU%&`zgswode2 zv|jm3I@eWU1QDTrEEMb(@!6ylFXz`lIYt!O3PH9?6k8)IrRy7oS4$lMiWlREM)ao&(c9|2LMp_V zt<=@ab;FXM(vZ!hx{pqv&gryPTZ1ffr1snZCh7?{A5z|DVQf04@5S6a@aVvFqmVmZ z2zZ)~@0+|s&7Q+}NLdU}@XjkR0*4HZdJ=weo5e`(0`E`Wzl~o- z5T3yv%Z@N-lqQP>$+OfXuQ3{1MR!7%dl0He;2(-bLfcN?=eTfVkHpEc$1KN{9maCT z11}`eVBHXU=mb>MARW%mrKn|^(7Ie`Qmx269u&8_+NFLgmt~v&Y|0JSg^yQE_Hd_$`OJo zif+BTW!=uS%=+FGH{hp5=mEZnrnFwPOfNtyKgX@|Lg3=8&*E+M4#iT|ZAm%Ml-;LR zc|{5uX6~AG*@8LPYTN^HgeC@BT>0VV@#goN>Gj8FZ+tnDkNsWsUjr>S(#FQw(&lJs zbG-WYc=h^t<;|gyHr`2>Z;r2C`;iPk`suS#^Ufd5t>2nk>AmfA=iym%chuZXSN77z zqw&(lWTAScK0&#t)z6_O+6I2+FqWiZEb3U2+V`bCkMY-i$1gmUECh^%#xC=+v&&W? z!7qrd!NjggVU$909Nz+QH2sa|?;U+SUfeqRVxrGippTbDo=GOzUatsUvdZMgBR?{) z?=dHgJsR={K%Ac!Go^dlz>B&2dH)}>8{m*1k$4ZpL{k)HjMmc2o{4cqfp%UN!^Y^X O5B`>pe=hN6RsRD}lDSg= literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_followup/wizard/followup_manual_reminder.py b/dev_odex30_accounting/odex30_account_followup/wizard/followup_manual_reminder.py new file mode 100644 index 0000000..c939ce6 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_followup/wizard/followup_manual_reminder.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, Command + + +class FollowupManualReminder(models.TransientModel): + _name = 'account_followup.manual_reminder' + _inherit = 'mail.composer.mixin' + _description = "Wizard for sending manual reminders to clients" + + def default_get(self, fields_list): + defaults = super().default_get(fields_list) + assert self.env.context['active_model'] == 'res.partner' + partner = self.env['res.partner'].browse(self.env.context['active_ids']) + partner.ensure_one() + followup_line = partner.followup_line_id + if followup_line: + defaults.update(self._get_defaults_from_followup_line(followup_line)) + defaults.update( + partner_id=partner.id, + attachment_ids=[Command.set(partner.unreconciled_aml_ids.move_id.message_main_attachment_id.ids)], + render_model='res.partner' + ) + return defaults + + partner_id = fields.Many2one(comodel_name='res.partner') + + # email fields + email = fields.Boolean() + email_recipient_ids = fields.Many2many(string="Extra Recipients", comodel_name='res.partner', + compute='_compute_email_recipient_ids', store=True, readonly=False, + relation='rel_followup_manual_reminder_res_partner') # override + + # sms fields + sms = fields.Boolean() + sms_body = fields.Char(compute='_compute_sms_body', readonly=False, store=True) + sms_template_id = fields.Many2one(comodel_name='sms.template', domain=[('model', '=', 'res.partner')]) + + # print fields + print = fields.Boolean(default=True) + join_invoices = fields.Boolean(string="Attach Invoices") + + # attachments fields + attachment_ids = fields.Many2many(comodel_name='ir.attachment') + + def _compute_render_model(self): + # OVERRIDES mail.renderer.mixin + self.render_model = 'res.partner' + + def _get_defaults_from_followup_line(self, followup_line): + return { + 'email': followup_line.send_email, + 'sms': followup_line.send_sms, + 'template_id': followup_line.mail_template_id.id, + 'sms_template_id': followup_line.sms_template_id.id, + 'join_invoices': followup_line.join_invoices, + } + + @api.depends('template_id') + def _compute_subject(self): + for wizard in self: + options = { + 'partner_id': wizard.partner_id.id, + 'mail_template': wizard.template_id, + } + wizard.subject = self.env['account.followup.report']._get_email_subject(options) + + @api.depends('template_id') + def _compute_body(self): + # OVERRIDES mail.composer.mixin + for wizard in self: + options = { + 'partner_id': wizard.partner_id.id, + 'mail_template': wizard.template_id, + } + wizard.body = self.env['account.followup.report']._get_main_body(options) + + @api.depends('template_id') + def _compute_email_recipient_ids(self): + for wizard in self: + partner = wizard.partner_id + template = wizard.template_id + wizard.email_recipient_ids = partner._get_all_followup_contacts() or partner + if template: + rendered_values = template._generate_template_recipients( + [partner.id], + {'partner_to', 'email_cc', 'email_to'}, + True + )[partner.id] + if rendered_values.get('partner_ids'): + wizard.email_recipient_ids = [Command.link(partner_id) for partner_id in rendered_values['partner_ids']] + + @api.depends('sms_template_id') + def _compute_sms_body(self): + for wizard in self: + options = { + 'partner_id': wizard.partner_id.id, + 'sms_template': wizard.sms_template_id, + } + wizard.sms_body = self.env['account.followup.report']._get_sms_body(options) + + def _get_wizard_options(self): + """ Returns a dictionary of options, containing values from this wizard that are needed to process the followup + """ + return { + 'partner_id': self.partner_id, + 'email': self.email, + 'email_from': self.template_id.email_from, + 'email_subject': self.subject, + 'email_recipient_ids': self.email_recipient_ids, + 'body': self.body, + 'attachment_ids': self.attachment_ids.ids, + 'sms': self.sms, + 'sms_body': self.sms_body, + 'print': self.print, + 'join_invoices': self.join_invoices, + 'manual_followup': True, + 'template_id': self.template_id, + } + + def process_followup(self): + """ Method run by pressing the 'Send and Print' button in the wizard. + It will process the followup for the active partner, taking into account the fields from the wizard. + Send email/sms and print the followup letter (pdf) depending on which is activated. + Once the followup has been processed, we simply close the wizard. + """ + options = self._get_wizard_options() + options['author_id'] = self.env.user.partner_id.id + action = self.partner_id.execute_followup(options) + return action or { + 'type': 'ir.actions.act_window_close', + } diff --git a/dev_odex30_accounting/odex30_account_followup/wizard/followup_manual_reminder_views.xml b/dev_odex30_accounting/odex30_account_followup/wizard/followup_manual_reminder_views.xml new file mode 100644 index 0000000..ad4d673 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_followup/wizard/followup_manual_reminder_views.xml @@ -0,0 +1,98 @@ + + + + account.followup.manual_reminder.view.form + account_followup.manual_reminder + +
    + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + Send and Print + account_followup.manual_reminder + form + new + +
    diff --git a/dev_odex30_accounting/odex30_account_followup/wizard/followup_missing_information.py b/dev_odex30_accounting/odex30_account_followup/wizard/followup_missing_information.py new file mode 100644 index 0000000..75c7d5f --- /dev/null +++ b/dev_odex30_accounting/odex30_account_followup/wizard/followup_missing_information.py @@ -0,0 +1,20 @@ +from odoo import models, _ + + +class FollowupMissingInformation(models.TransientModel): + _name = "account_followup.missing.information.wizard" + _description = "Followup missing information wizard" + + def view_partners_action(self): + """ Returns a list view containing all the partners with missing information with the option to edit in place. + """ + view_id = self.env.ref('odex30_account_followup.missing_information_view_tree').id + + return { + 'name': _('Missing information'), + 'res_model': 'res.partner', + 'view_mode': 'list', + 'views': [(view_id, 'list')], + 'domain': [('id', 'in', self.env.context.get('default_partner_ids', []))], + 'type': 'ir.actions.act_window', + } diff --git a/dev_odex30_accounting/odex30_account_followup/wizard/followup_missing_information.xml b/dev_odex30_accounting/odex30_account_followup/wizard/followup_missing_information.xml new file mode 100644 index 0000000..1ef9dc3 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_followup/wizard/followup_missing_information.xml @@ -0,0 +1,33 @@ + + + + missing.information.view.form + account_followup.missing.information.wizard + +
    +

    We were not able to process some of the automated follow-up actions due to missing information on the partners.

    +
    +
    +
    +
    +
    + + + missing.information.view.list + res.partner + + + + + + + + + + + + + +
    diff --git a/dev_odex30_accounting/odex30_account_online_sync/__init__.py b/dev_odex30_accounting/odex30_account_online_sync/__init__.py new file mode 100644 index 0000000..bbc5580 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +from . import controllers +from . import models +from . import wizard diff --git a/dev_odex30_accounting/odex30_account_online_sync/__manifest__.py b/dev_odex30_accounting/odex30_account_online_sync/__manifest__.py new file mode 100644 index 0000000..5946b4a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/__manifest__.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +{ + 'name': "Online Bank Statement Synchronization", + 'summary': """ + This module is used for Online bank synchronization.""", + + 'description': """ + This module is used for Online bank synchronization. It provides basic methods to synchronize bank statement. + """, + 'author': "Expert Co. Ltd.", + 'website': "http://www.exp-sa.com", + 'category': 'Odex30-Accounting/Odex30-Accounting', + 'version': '2.0', + 'depends': ['odex30_account_accountant'], + + 'data': [ + 'data/config_parameter.xml', + 'data/ir_cron.xml', + 'data/mail_activity_type_data.xml', + 'data/sync_reminder_email_template.xml', + + 'security/ir.model.access.csv', + 'security/account_online_sync_security.xml', + + 'views/account_online_sync_views.xml', + 'views/account_bank_statement_view.xml', + 'views/account_journal_view.xml', + 'views/account_online_sync_portal_templates.xml', + 'views/account_journal_dashboard_view.xml', + + 'wizard/account_bank_selection_wizard.xml', + 'wizard/account_journal_missing_transactions.xml', + 'wizard/account_journal_duplicate_transactions.xml', + 'wizard/account_bank_statement_line.xml', + ], + 'license': 'OEEL-1', + 'auto_install': True, + 'assets': { + 'web.assets_backend': [ + 'odex30_account_online_sync/static/src/components/**/*', + 'odex30_account_online_sync/static/src/js/odoo_fin_connector.js', + ], + 'web.assets_frontend': [ + 'odex30_account_online_sync/static/src/js/online_sync_portal.js', + ], + 'web.qunit_suite_tests': [ + 'odex30_account_online_sync/static/tests/helpers/*.js', + 'odex30_account_online_sync/static/tests/*.js', + ], + } +} diff --git a/dev_odex30_accounting/odex30_account_online_sync/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_online_sync/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e37619d868650a8758440e24b60d06f77f6efb43 GIT binary patch literal 383 zcmZ3^%ge<81lK2oX2t^P#~=<2FhLogwSbK23@HpLj5!Rsj8Tk?AT|?_%@oB1W-|lX z%u&ohHcK#rChJQ^paxCGTinU{c_l^pIXS6C#Xv4wZhlH?4wzM*S(R9n;-|@Si=l`a zsJMs)M6d#hl?!qO45)fXd{I#G>4QqWrAXKVB8#Gm#OLSbWag#D7gy#b>&M4u z=4F<|$LkeT{^GC!y16tb)vgE>OdxL+I|GRi%#4hTAJ`Zer7kc?BBL7&A{S5*rU*nq I5eLv508r>^jsO4v literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_online_sync/controllers/__init__.py b/dev_odex30_accounting/odex30_account_online_sync/controllers/__init__.py new file mode 100644 index 0000000..8c3feb6 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/controllers/__init__.py @@ -0,0 +1 @@ +from . import portal diff --git a/dev_odex30_accounting/odex30_account_online_sync/controllers/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_online_sync/controllers/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6439cb3207fd5d40dc0dbf311a2f20b4adee7579 GIT binary patch literal 298 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 Ys#p_-8S3EO>FUsPf9B;I=KU}GCmn@5$N&HU literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_online_sync/controllers/portal.py b/dev_odex30_accounting/odex30_account_online_sync/controllers/portal.py new file mode 100644 index 0000000..9556ea4 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/controllers/portal.py @@ -0,0 +1,58 @@ +import json + +from odoo import http +from odoo.http import request +from odoo.addons.portal.controllers.portal import CustomerPortal +from odoo.tools import format_amount, format_date +from odoo.exceptions import AccessError, MissingError, UserError + + +class OnlineSynchronizationPortal(CustomerPortal): + + @http.route(['/renew_consent/'], type='http', auth="public", website=True, sitemap=False) + def portal_online_sync_renew_consent(self, journal_id, access_token=None, **kw): + # Display a page to the user allowing to renew the consent for his bank sync. + # Requires the same rights as the button in odoo. + try: + journal_sudo = self._document_check_access('account.journal', journal_id, access_token) + except (AccessError, MissingError): + return request.redirect('/my') + values = self._prepare_portal_layout_values() + # Ignore the route if the journal isn't one using bank sync. + if not journal_sudo.account_online_account_id: + raise request.not_found() + + balance = journal_sudo.account_online_account_id.balance + if journal_sudo.account_online_account_id.currency_id: + formatted_balance = format_amount(request.env, balance, journal_sudo.account_online_account_id.currency_id) + else: + formatted_balance = format_amount(request.env, balance, journal_sudo.currency_id or journal_sudo.company_id.currency_id) + + values.update({ + 'bank': journal_sudo.bank_account_id.bank_name or journal_sudo.account_online_account_id.name, + 'bank_account': journal_sudo.bank_account_id.acc_number, + 'journal': journal_sudo.name, + 'latest_balance_formatted': formatted_balance, + 'latest_balance': balance, + 'latest_sync': format_date(request.env, journal_sudo.account_online_account_id.last_sync, date_format="MMM dd, YYYY"), + 'iframe_params': json.dumps(journal_sudo.action_extend_consent()), + }) + return request.render("account_online_synchronization.portal_renew_consent", values) + + + @http.route(['/renew_consent//complete'], type='http', auth="public", methods=['POST'], website=True) + def portal_online_sync_action_complete(self, journal_id, access_token=None, **kw): + # Complete the consent renewal process + try: + journal_sudo = self._document_check_access('account.journal', journal_id, access_token) + except (AccessError, MissingError): + return request.redirect('/my') + # Ignore the route if the journal isn't one using bank sync. + if not journal_sudo.account_online_link_id: + raise request.not_found() + try: + journal_sudo.account_online_link_id._update_connection_status() + journal_sudo.manual_sync() + except UserError: + pass + return request.make_response(json.dumps({'status': 'done'})) diff --git a/dev_odex30_accounting/odex30_account_online_sync/data/config_parameter.xml b/dev_odex30_accounting/odex30_account_online_sync/data/config_parameter.xml new file mode 100644 index 0000000..5a8a8fa --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/data/config_parameter.xml @@ -0,0 +1,13 @@ + + + + + odex30_account_online_sync.proxy_mode + production + + + odex30_account_online_sync.request_timeout + 60 + + + diff --git a/dev_odex30_accounting/odex30_account_online_sync/data/ir_cron.xml b/dev_odex30_accounting/odex30_account_online_sync/data/ir_cron.xml new file mode 100644 index 0000000..5ed932b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/data/ir_cron.xml @@ -0,0 +1,48 @@ + + + + + + Account: Journal online sync + + code + model._cron_fetch_online_transactions() + + + 12 + hours + + + Account: Journal online Waiting Synchronization + + code + model._cron_fetch_waiting_online_transactions() + + + 5 + minutes + + + + Account: Journal online sync reminder + + code + model._cron_send_reminder_email() + + + 1 + days + + + + Account: Journal online sync cleanup unused connections + + code + model._cron_delete_unused_connection() + + + 1 + days + + + diff --git a/dev_odex30_accounting/odex30_account_online_sync/data/mail_activity_type_data.xml b/dev_odex30_accounting/odex30_account_online_sync/data/mail_activity_type_data.xml new file mode 100644 index 0000000..0a96bcc --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/data/mail_activity_type_data.xml @@ -0,0 +1,21 @@ + + + + + Bank Synchronization: Update consent + fa-university + warning + account.journal + 0 + + + + Consent Renewal + + + account.journal + + + + + diff --git a/dev_odex30_accounting/odex30_account_online_sync/data/neutralize.sql b/dev_odex30_accounting/odex30_account_online_sync/data/neutralize.sql new file mode 100644 index 0000000..465aaa7 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/data/neutralize.sql @@ -0,0 +1,4 @@ +-- disable bank synchronisation links +UPDATE account_online_link + SET provider_data = '', + client_id = 'duplicate'; diff --git a/dev_odex30_accounting/odex30_account_online_sync/data/sync_reminder_email_template.xml b/dev_odex30_accounting/odex30_account_online_sync/data/sync_reminder_email_template.xml new file mode 100644 index 0000000..abf2b28 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/data/sync_reminder_email_template.xml @@ -0,0 +1,71 @@ + + + + + Bank connection expiration reminder + Your bank connection is expiring soon + {{ object.company_id.email_formatted or user.email_formatted }} + {{ object.renewal_contact_email }} + + + + + + + + + + + +
    + + + + + + + +
    + + + + + + + +
    +
    + Hello,

    + The connection between https://yourcompany.odoo.com and Belfius expired.expires in 10 days.
    + + Security Tip: Check that the domain name you are redirected to is: https://yourcompany.odoo.com +
    +
    +
    +
    +
    +
    + + + + +
    + Powered by Odoo +
    + + + + +
    + PS: This is an automated email sent by Odoo Accounting to remind you before a bank sync consent expiration. +
    +
    +
    +
    +
    +
    diff --git a/dev_odex30_accounting/odex30_account_online_sync/i18n/account_online_synchronization.pot b/dev_odex30_accounting/odex30_account_online_sync/i18n/account_online_synchronization.pot new file mode 100644 index 0000000..b437820 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/i18n/account_online_synchronization.pot @@ -0,0 +1,1322 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_online_sync +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-11 18:50+0000\n" +"PO-Revision-Date: 2025-07-11 18:50+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "" +"\n" +"\n" +"If you've already opened a ticket for this issue, don't report it again: a support agent will contact you shortly." +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/wizard/account_journal_duplicate_transactions.py:0 +msgid "%s duplicate transactions" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml:0 +msgid "" +").\n" +" This might cause duplicate entries." +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml:0 +msgid "0 transaction fetched" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_duplicate_transaction_wizard_view_form +msgid " Delete Selected" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_journal_form +msgid " Send Now" +msgstr "" + +#. module: odex30_account_online_sync +#: model:mail.template,body_html:account_online_synchronization.email_template_sync_reminder +msgid "" +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +"
    \n" +" Hello,

    \n" +" The connection between https://yourcompany.odoo.com and Belfius expired.expires in 10 days.
    \n" +" \n" +" Security Tip: Check that the domain name you are redirected to is: https://yourcompany.odoo.com\n" +"
    \n" +"
    \n" +"
    \n" +"
    \n" +"
    \n" +"
    \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +" Powered by Odoo\n" +"
    \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +" PS: This is an automated email sent by Odoo Accounting to remind you before a bank sync consent expiration.\n" +"
    \n" +"
    \n" +" " +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__access_token +msgid "Access Token" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__account_data +msgid "Account Data" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__name +msgid "Account Name" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_account__name +msgid "Account Name as provided by third party provider" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__account_number +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__account_number +msgid "Account Number" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_selection__account_online_account_ids +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__online_account_id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_journal__account_online_account_id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__account_online_account_ids +msgid "Account Online Account" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_selection__account_online_link_id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line__online_link_id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_journal__account_online_link_id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__account_online_link_id +msgid "Account Online Link" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.actions.server,name:account_online_synchronization.online_sync_cron_waiting_synchronization_ir_actions_server +msgid "Account: Journal online Waiting Synchronization" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.actions.server,name:account_online_synchronization.online_sync_cron_ir_actions_server +msgid "Account: Journal online sync" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.actions.server,name:account_online_synchronization.online_sync_unused_connection_cron_ir_actions_server +msgid "Account: Journal online sync cleanup unused connections" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.actions.server,name:account_online_synchronization.online_sync_mail_cron_ir_actions_server +msgid "Account: Journal online sync reminder" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__activity_ids +msgid "Activities" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__activity_state +msgid "Activity State" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model,name:account_online_synchronization.model_mail_activity_type +msgid "Activity Type" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__amount +msgid "Amount" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__amount_currency +msgid "Amount in Currency" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__auto_sync +msgid "Automatic synchronization" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__balance +msgid "Balance" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_account__balance +msgid "Balance of the account sent by the third party provider" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.portal_renew_consent +msgid "Bank" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model,name:account_online_synchronization.model_account_online_link +msgid "Bank Connection" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model,name:account_online_synchronization.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "" + +#. module: odex30_account_online_sync +#: model:mail.activity.type,name:account_online_synchronization.bank_sync_activity_update_consent +msgid "Bank Synchronization: Update consent" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Bank Synchronization: Update your consent" +msgstr "" + +#. module: odex30_account_online_sync +#: model:mail.template,name:account_online_synchronization.email_template_sync_reminder +msgid "Bank connection expiration reminder" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model,name:account_online_synchronization.model_bank_rec_widget +msgid "Bank reconciliation widget for a single statement line" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_missing_transaction_wizard_view_form +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.view_account_bank_selection_form_wizard +msgid "Cancel" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Check the documentation" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_duplicate_transaction_wizard_view_form +msgid "" +"Choose a date and a journal from which you want to check the transactions." +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_missing_transaction_wizard_view_form +msgid "Choose a date and a journal from which you want to fetch transactions" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__client_id +msgid "Client" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_online_link_view_form +msgid "Client id" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_journal__renewal_contact_email +msgid "" +"Comma separated list of email addresses to send consent renewal " +"notifications 15, 3 and 1 days before expiry" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model,name:account_online_synchronization.model_res_company +msgid "Companies" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__company_id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__company_id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__company_id +msgid "Company" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_online_link_view_form +msgid "Connect" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.view_account_bank_selection_form_wizard +msgid "Connect Bank" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_journal_dashboard_inherit_online_sync +msgid "Connect bank" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.portal_renew_consent +msgid "Connect my Bank" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.portal_renew_consent +msgid "Connect your bank account to Odoo" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:account_online_synchronization.selection__account_online_link__state__connected +msgid "Connected" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/connected_until_widget/connected_until_widget.xml:0 +msgid "Connected until" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_journal__renewal_contact_email +msgid "Connection Requests" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__connection_state_details +msgid "Connection State Details" +msgstr "" + +#. module: odex30_account_online_sync +#: model:mail.message.subtype,name:account_online_synchronization.bank_sync_consent_renewal +msgid "Consent Renewal" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model,name:account_online_synchronization.model_res_partner +msgid "Contact" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_selection__create_uid +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__create_uid +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_duplicate_transaction_wizard__create_uid +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_missing_transaction_wizard__create_uid +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__create_uid +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__create_uid +msgid "Created by" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_selection__create_date +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__create_date +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_duplicate_transaction_wizard__create_date +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_missing_transaction_wizard__create_date +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__create_date +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__create_date +msgid "Created on" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__currency_id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__currency_id +msgid "Currency" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__date +msgid "Date" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_journal__expiring_synchronization_date +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__expiring_synchronization_date +msgid "Date when the consent for this connection expires" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_selection__display_name +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__display_name +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_duplicate_transaction_wizard__display_name +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_missing_transaction_wizard__display_name +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__display_name +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__display_name +msgid "Display Name" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:account_online_synchronization.selection__account_online_account__fetching_status__done +msgid "Done" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_bank_statement.py:0 +#: model:ir.model.fields.selection,name:account_online_synchronization.selection__account_online_link__state__error +msgid "Error" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_journal__expiring_synchronization_date +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__expiring_synchronization_date +msgid "Expiring Synchronization Date" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_journal__expiring_synchronization_due_day +msgid "Expiring Synchronization Due Day" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/connected_until_widget/connected_until_widget.xml:0 +msgid "Extend Connection" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_account__account_data +msgid "Extra information needed by third party provider" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_missing_transaction_wizard_view_form +msgid "Fetch" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_duplicate_transaction_wizard_view_form +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_missing_transaction_wizard_view_form +msgid "Fetch Missing Bank Statements Wizard" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml:0 +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_online_link_view_form +msgid "Fetch Transactions" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Fetched Transactions" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_journal__online_sync_fetching_status +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__fetching_status +msgid "Fetching Status" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml:0 +msgid "Fetching..." +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_journal.py:0 +#: code:addons/odex30_account_online_sync/static/src/components/bank_reconciliation/find_duplicate_transactions_cog_menu.xml:0 +msgid "Find Duplicate Transactions" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_journal.py:0 +#: code:addons/odex30_account_online_sync/static/src/components/bank_reconciliation/fetch_missing_transactions_cog_menu.xml:0 +msgid "Find Missing Transactions" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_duplicate_transaction_wizard__first_ids_in_group +msgid "First Ids In Group" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__foreign_currency_id +msgid "Foreign Currency" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__has_message +msgid "Has Message" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__has_unlinked_accounts +msgid "Has Unlinked Accounts" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Here" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_selection__id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_duplicate_transaction_wizard__id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_missing_transaction_wizard__id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__id +msgid "ID" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_account__online_identifier +msgid "Id used to identify account by third party provider" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__message_has_error +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_account__inverse_balance_sign +msgid "If checked, the balance sign will be inverted" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_account__inverse_transaction_sign +msgid "If checked, the transaction sign will be inverted" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__auto_sync +msgid "" +"If possible, we will try to automatically fetch new transactions for this record\n" +" \n" +"If the automatic sync is disabled. that will be due to security policy on the bank's end. So, they have to launch the sync manually" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml:0 +msgid "Import Transactions" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__provider_data +msgid "Information needed to interact with third party provider" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_bank_selection__institution_name +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__name +msgid "Institution Name" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Internal Error" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Invalid URL" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Invalid value for proxy_mode config parameter." +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__inverse_balance_sign +msgid "Inverse Balance Sign" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__inverse_transaction_sign +msgid "Inverse Transaction Sign" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model,name:account_online_synchronization.model_account_journal +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__journal_id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_duplicate_transaction_wizard__journal_id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_missing_transaction_wizard__journal_id +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__journal_ids +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__journal_ids +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.portal_renew_consent +msgid "Journal" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "" +"Journal %(journal_name)s has been set up with a different currency and " +"already has existing entries. You can't link selected bank account in " +"%(currency_name)s to it" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__last_refresh +msgid "Last Refresh" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_selection__write_uid +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__write_uid +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_duplicate_transaction_wizard__write_uid +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_missing_transaction_wizard__write_uid +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__write_uid +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_selection__write_date +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__write_date +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_duplicate_transaction_wizard__write_date +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_missing_transaction_wizard__write_date +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__write_date +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__write_date +msgid "Last Updated on" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_online_link_view_form +msgid "Last refresh" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__last_sync +msgid "Last synchronization" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.portal_renew_consent +msgid "Latest Balance" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model,name:account_online_synchronization.model_account_bank_selection +msgid "Link a bank account to the selected journal" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/wizard/account_journal_missing_transactions.py:0 +msgid "Manual Bank Statement Lines" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Message" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__message_ids +msgid "Messages" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/wizard/account_journal_missing_transactions.py:0 +msgid "Missing and Pending Transactions" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_selection__institution_name +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__name +msgid "Name" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__activity_calendar_event_id +msgid "Next Activity Calendar Event" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__next_refresh +msgid "Next synchronization" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:account_online_synchronization.selection__account_online_link__state__disconnected +msgid "Not Connected" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.portal_renew_consent +msgid "Odoo" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line__online_account_id +msgid "Online Account" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_online_link_view_form +msgid "Online Accounts" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_account__online_identifier +msgid "Online Identifier" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_journal__next_link_synchronization +msgid "Online Link Next synchronization" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line__online_partner_information +#: model:ir.model.fields,field_description:account_online_synchronization.field_res_partner__online_partner_information +#: model:ir.model.fields,field_description:account_online_synchronization.field_res_users__online_partner_information +msgid "Online Partner Information" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_journal.py:0 +#: model:ir.actions.act_window,name:account_online_synchronization.action_account_online_link_form +#: model:ir.ui.menu,name:account_online_synchronization.menu_action_online_link_account +#: model_terms:ir.actions.act_window,help:account_online_synchronization.action_account_online_link_form +msgid "Online Synchronization" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line__online_transaction_identifier +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__online_transaction_identifier +msgid "Online Transaction Identifier" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_bank_statement.py:0 +msgid "Opening statement: first synchronization" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__partner_name +msgid "Partner Name" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__payment_ref +msgid "Payment Ref" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:account_online_synchronization.selection__account_bank_statement_line_transient__state__pending +msgid "Pending" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:account_online_synchronization.selection__account_online_account__fetching_status__planned +msgid "Planned" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/wizard/account_journal_missing_transactions.py:0 +msgid "Please enter a valid Starting Date to continue." +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Please reconnect your online account." +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/wizard/account_bank_statement_line.py:0 +msgid "Please select first the transactions you wish to import." +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:account_online_synchronization.selection__account_bank_statement_line_transient__state__posted +msgid "Posted" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.missing_bank_statement_line_search +msgid "Posted Transactions" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:account_online_synchronization.selection__account_online_account__fetching_status__processing +msgid "Processing" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__provider_data +msgid "Provider Data" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__provider_type +msgid "Provider Type" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__rating_ids +msgid "Ratings" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_online_link_view_form +msgid "Reconnect" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/connected_until_widget/connected_until_widget.xml:0 +#: code:addons/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml:0 +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_journal_dashboard_inherit_online_sync +msgid "Reconnect Bank" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Redirect" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml:0 +msgid "Refresh" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__refresh_token +msgid "Refresh Token" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_journal.py:0 +msgid "Report Issue" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Report issue" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__client_id +msgid "Represent a link for a given user towards a banking institution" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_online_link_view_form +msgid "Reset" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__message_has_sms_error +msgid "SMS Delivery error" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.xml:0 +msgid "Search over" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.portal_renew_consent +msgid "" +"Security Tip: always check the domain name of this page, before clicking on " +"the button." +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml:0 +msgid "See error" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.view_account_bank_selection_form_wizard +msgid "Select a Bank Account" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.view_account_bank_selection_form_wizard +msgid "Select the" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_selection__selected_account +msgid "Selected Account" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__sequence +msgid "Sequence" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_account__account_number +msgid "Set if third party provider has the full account number" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.xml:0 +msgid "Setup Bank" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Setup Bank Account" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__show_sync_actions +msgid "Show Sync Actions" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/views/account_online_authorization_kanban_controller.xml:0 +msgid "Some transactions" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_duplicate_transaction_wizard__date +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_missing_transaction_wizard__date +msgid "Starting Date" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__state +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_journal__account_online_link_state +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__state +msgid "State" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.portal_renew_consent +msgid "Thank You!" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "The consent for the selected account has expired." +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "" +"The online synchronization service is not available at the moment. Please " +"try again later." +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__provider_type +msgid "Third Party Provider" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_duplicate_transaction_wizard_view_form +msgid "" +"This action will delete all selected transactions. Are you sure you want to " +"proceed?" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_online_link_view_form +msgid "This button will reset the fetching status" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "" +"This version of Odoo appears to be outdated and does not support the '%s' " +"sync mode. Installing the latest update might solve this." +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.actions.act_window,help:account_online_synchronization.action_account_online_link_form +msgid "" +"To create a synchronization with your banking institution,
    \n" +" please click on Add a Bank Account." +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__access_token +msgid "Token used to access API." +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__refresh_token +msgid "Token used to sign API request, Never disclose it" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_duplicate_transaction_wizard__transaction_ids +msgid "Transaction" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_bank_statement_line_transient__transaction_details +msgid "Transaction Details" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_duplicate_transaction_wizard_view_form +msgid "Transactions" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model,name:account_online_synchronization.model_account_bank_statement_line_transient +msgid "Transient model for bank statement line" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__has_unlinked_accounts +msgid "" +"True if that connection still has accounts that are not linked to an Odoo " +"journal" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.account_online_link_view_form +msgid "Update Credentials" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:account_online_synchronization.selection__account_online_account__fetching_status__waiting +msgid "Waiting" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:account_online_synchronization.field_account_online_link__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:account_online_synchronization.field_account_online_link__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model,name:account_online_synchronization.model_account_duplicate_transaction_wizard +msgid "Wizard for duplicate transactions" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model,name:account_online_synchronization.model_account_missing_transaction_wizard +msgid "Wizard for missing transactions" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml:0 +msgid "" +"You are importing transactions before the creation of your online synchronization\n" +" (" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "You can contact Odoo support" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_journal.py:0 +msgid "You can only execute this action for bank-synchronized journals." +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_journal.py:0 +#: code:addons/odex30_account_online_sync/wizard/account_journal_missing_transactions.py:0 +msgid "" +"You can't find missing transactions for a journal that isn't connected." +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_journal.py:0 +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "You cannot have two journals associated with the same Online Account." +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/wizard/account_bank_statement_line.py:0 +msgid "You cannot import pending transactions." +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml:0 +msgid "You have" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/wizard/account_journal_missing_transactions.py:0 +msgid "You have to select one journal to continue." +msgstr "" + +#. module: odex30_account_online_sync +#: model:mail.template,subject:account_online_synchronization.email_template_sync_reminder +msgid "Your bank connection is expiring soon" +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.view_account_bank_selection_form_wizard +msgid "account to connect:" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.xml:0 +msgid "banks" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml:0 +msgid "entries" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.xml:0 +msgid "loading..." +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/views/account_online_authorization_kanban_controller.xml:0 +msgid "may be duplicates." +msgstr "" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:account_online_synchronization.portal_renew_consent +msgid "on" +msgstr "" + +#. module: odex30_account_online_sync +#: model:ir.model,name:account_online_synchronization.model_account_online_account +msgid "representation of an online bank account" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml:0 +msgid "transactions fetched" +msgstr "" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml:0 +msgid "" +"within this period that were not created using the online synchronization. " +"This might cause duplicate entries." +msgstr "" diff --git a/dev_odex30_accounting/odex30_account_online_sync/i18n/ar.po b/dev_odex30_accounting/odex30_account_online_sync/i18n/ar.po new file mode 100644 index 0000000..61d8a10 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/i18n/ar.po @@ -0,0 +1,1418 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_online_sync +# +# Translators: +# Mustafa J. Kadhem , 2024 +# Malaz Abuidris , 2025 +# Wil Odoo, 2025 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-11 18:50+0000\n" +"PO-Revision-Date: 2024-09-25 09:44+0000\n" +"Last-Translator: Wil Odoo, 2025\n" +"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "" +"\n" +"\n" +"If you've already opened a ticket for this issue, don't report it again: a support agent will contact you shortly." +msgstr "" +"\n" +"\n" +"إذا قمت بفتح تذكرة دعم لهذه المشكلة بالفعل، لا تقم بالإبلاغ عنها مجدداً: سيتواصل معك أحد موظفي الدعم عما قريب. " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/wizard/account_journal_duplicate_transactions.py:0 +msgid "%s duplicate transactions" +msgstr "%s معاملات مكررة " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml:0 +msgid "" +").\n" +" This might cause duplicate entries." +msgstr "" +").\n" +" قد يتسبب هذا في تكرار القيود. " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml:0 +msgid "0 transaction fetched" +msgstr "تم جلب 0 معاملات " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_duplicate_transaction_wizard_view_form +msgid " Delete Selected" +msgstr " حذف العناصر المحددة " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_journal_form +msgid " Send Now" +msgstr " إرسال الآن " + +#. module: odex30_account_online_sync +#: model:mail.template,body_html:odex30_account_online_sync.email_template_sync_reminder +msgid "" +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +"
    \n" +" Hello,

    \n" +" The connection between https://yourcompany.odoo.com and Belfius expired.expires in 10 days.
    \n" +" \n" +" Security Tip: Check that the domain name you are redirected to is: https://yourcompany.odoo.com\n" +"
    \n" +"
    \n" +"
    \n" +"
    \n" +"
    \n" +"
    \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +" Powered by Odoo\n" +"
    \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +" PS: This is an automated email sent by Odoo Accounting to remind you before a bank sync consent expiration.\n" +"
    \n" +"
    \n" +" " +msgstr "" +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +"
    \n" +" مرحباً،

    \n" +" الاتصال بين https://yourcompany.odoo.com و Belfius قد انتهت صلاحيته.تنتهي صلاحيته في 10 أيام.
    \n" +" \n" +" نصيحة للأمان: تحقق من أن اسم النطاق الذي تمت إعادة توجيهك إليه هو: https://yourcompany.odoo.com\n" +"
    \n" +"
    \n" +"
    \n" +"
    \n" +"
    \n" +"
    \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +" مشغل بواسطة أودو\n" +"
    \n" +" \n" +" \n" +" \n" +" \n" +"
    \n" +" ملاحظة: هذا البريد الإلكتروني التلقائي مرسل بواسطة محاسبة أودو لتذكيرك قبل انتهاء صلاحية إذن مزامنة البنك.\n" +"
    \n" +"
    \n" +" " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__access_token +msgid "Access Token" +msgstr "رمز الوصول " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__account_data +msgid "Account Data" +msgstr "بيانات الحساب " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__name +msgid "Account Name" +msgstr "اسم الحساب" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_account__name +msgid "Account Name as provided by third party provider" +msgstr "اسم الحساب حسب مزود الطرف الثالث " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__account_number +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__account_number +msgid "Account Number" +msgstr "رقم الحساب" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_selection__account_online_account_ids +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__online_account_id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_journal__account_online_account_id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__account_online_account_ids +msgid "Account Online Account" +msgstr "حساب عبر الإنترنت " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_selection__account_online_link_id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line__online_link_id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_journal__account_online_link_id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__account_online_link_id +msgid "Account Online Link" +msgstr "ربط الحساب عبر الإنترنت " + +#. module: odex30_account_online_sync +#: model:ir.actions.server,name:odex30_account_online_sync.online_sync_cron_waiting_synchronization_ir_actions_server +msgid "Account: Journal online Waiting Synchronization" +msgstr "الحساب: دفتر اليومية أونلاين بانتظار المزامنة " + +#. module: odex30_account_online_sync +#: model:ir.actions.server,name:odex30_account_online_sync.online_sync_cron_ir_actions_server +msgid "Account: Journal online sync" +msgstr "الحساب: مزامنة دفتر اليومية عبر الإنترنت " + +#. module: odex30_account_online_sync +#: model:ir.actions.server,name:odex30_account_online_sync.online_sync_unused_connection_cron_ir_actions_server +msgid "Account: Journal online sync cleanup unused connections" +msgstr "الحساب: مسح الاتصالات غير المستخدمة عند مزامنة دفتر اليومية أونلاين " + +#. module: odex30_account_online_sync +#: model:ir.actions.server,name:odex30_account_online_sync.online_sync_mail_cron_ir_actions_server +msgid "Account: Journal online sync reminder" +msgstr "الحساب: تذكير مزامنة دفتر اليومية أونلاين " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__message_needaction +msgid "Action Needed" +msgstr "إجراء مطلوب" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__activity_ids +msgid "Activities" +msgstr "الأنشطة" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "زخرفة استثناء النشاط" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__activity_state +msgid "Activity State" +msgstr "حالة النشاط" + +#. module: odex30_account_online_sync +#: model:ir.model,name:odex30_account_online_sync.model_mail_activity_type +msgid "Activity Type" +msgstr "نوع النشاط" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__activity_type_icon +msgid "Activity Type Icon" +msgstr "أيقونة نوع النشاط" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__amount +msgid "Amount" +msgstr "مبلغ" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__amount_currency +msgid "Amount in Currency" +msgstr "المبلغ بالعملة" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__message_attachment_count +msgid "Attachment Count" +msgstr "عدد المرفقات" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__auto_sync +msgid "Automatic synchronization" +msgstr "المزامنة الآلية " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__balance +msgid "Balance" +msgstr "الرصيد" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_account__balance +msgid "Balance of the account sent by the third party provider" +msgstr "رصيد الحساب الذي أرسله مزود الطرف الثالث " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.portal_renew_consent +msgid "Bank" +msgstr "البنك" + +#. module: odex30_account_online_sync +#: model:ir.model,name:odex30_account_online_sync.model_account_online_link +msgid "Bank Connection" +msgstr "اتصال البنك" + +#. module: odex30_account_online_sync +#: model:ir.model,name:odex30_account_online_sync.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "بند كشف الحساب البنكي" + +#. module: odex30_account_online_sync +#: model:mail.activity.type,name:odex30_account_online_sync.bank_sync_activity_update_consent +msgid "Bank Synchronization: Update consent" +msgstr "مزامنة البنك: تحديث الإذن " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Bank Synchronization: Update your consent" +msgstr "مزامنة البنك: قم بتحديث الإذن " + +#. module: odex30_account_online_sync +#: model:mail.template,name:odex30_account_online_sync.email_template_sync_reminder +msgid "Bank connection expiration reminder" +msgstr "تذكير انتهاء صلاحية اتصال البنك " + +#. module: odex30_account_online_sync +#: model:ir.model,name:odex30_account_online_sync.model_bank_rec_widget +msgid "Bank reconciliation widget for a single statement line" +msgstr "أداة التسوية البنكية لبند كشف حساب واحد " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_missing_transaction_wizard_view_form +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.view_account_bank_selection_form_wizard +msgid "Cancel" +msgstr "إلغاء" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Check the documentation" +msgstr "ألقِ نظرة على الوثائق " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_duplicate_transaction_wizard_view_form +msgid "" +"Choose a date and a journal from which you want to check the transactions." +msgstr "اختر التاريخ ودفتر اليومية الذي ترغب في التحقق من المعاملات فيه " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_missing_transaction_wizard_view_form +msgid "Choose a date and a journal from which you want to fetch transactions" +msgstr "اختر التاريخ ودفتر اليومية الذي ترغب في جلب المعاملات منه " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__client_id +msgid "Client" +msgstr "العميل" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_online_link_view_form +msgid "Client id" +msgstr "معرف العميل " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_journal__renewal_contact_email +msgid "" +"Comma separated list of email addresses to send consent renewal " +"notifications 15, 3 and 1 days before expiry" +msgstr "" +"قائمة مفصولة بفواصل بعناوين البريد الإلكترونية لإرسال إشعارات تجديد الإذن " +"قبل 15، 3، و1 يوم من تاريخ انتهاء الصلاحية " + +#. module: odex30_account_online_sync +#: model:ir.model,name:odex30_account_online_sync.model_res_company +msgid "Companies" +msgstr "الشركات" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__company_id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__company_id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__company_id +msgid "Company" +msgstr "الشركة " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_online_link_view_form +msgid "Connect" +msgstr "اتصل" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.view_account_bank_selection_form_wizard +msgid "Connect Bank" +msgstr "توصيل البنك " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_journal_dashboard_inherit_online_sync +msgid "Connect bank" +msgstr "توصيل البنك " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.portal_renew_consent +msgid "Connect my Bank" +msgstr "توصيل بنكي " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.portal_renew_consent +msgid "Connect your bank account to Odoo" +msgstr "قم بتوصيل حسابك البنكي بأودو " + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:odex30_account_online_sync.selection__account_online_link__state__connected +msgid "Connected" +msgstr "متصل " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/connected_until_widget/connected_until_widget.xml:0 +msgid "Connected until" +msgstr "متصل حتى " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_journal__renewal_contact_email +msgid "Connection Requests" +msgstr "طلبات الاتصال " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__connection_state_details +msgid "Connection State Details" +msgstr "تفاصيل حالة الاتصال " + +#. module: odex30_account_online_sync +#: model:mail.message.subtype,name:odex30_account_online_sync.bank_sync_consent_renewal +msgid "Consent Renewal" +msgstr "تجديد الإذن " + +#. module: odex30_account_online_sync +#: model:ir.model,name:odex30_account_online_sync.model_res_partner +msgid "Contact" +msgstr "جهة الاتصال" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_selection__create_uid +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__create_uid +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_duplicate_transaction_wizard__create_uid +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_missing_transaction_wizard__create_uid +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__create_uid +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__create_uid +msgid "Created by" +msgstr "أنشئ بواسطة" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_selection__create_date +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__create_date +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_duplicate_transaction_wizard__create_date +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_missing_transaction_wizard__create_date +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__create_date +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__create_date +msgid "Created on" +msgstr "أنشئ في" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__currency_id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__currency_id +msgid "Currency" +msgstr "العملة" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__date +msgid "Date" +msgstr "التاريخ" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_journal__expiring_synchronization_date +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__expiring_synchronization_date +msgid "Date when the consent for this connection expires" +msgstr "تاريخ انتهاء صلاحية إذن هذا الاتصال " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_selection__display_name +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__display_name +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_duplicate_transaction_wizard__display_name +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_missing_transaction_wizard__display_name +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__display_name +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__display_name +msgid "Display Name" +msgstr "اسم العرض " + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:odex30_account_online_sync.selection__account_online_account__fetching_status__done +msgid "Done" +msgstr "منتهي " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_bank_statement.py:0 +#: model:ir.model.fields.selection,name:odex30_account_online_sync.selection__account_online_link__state__error +msgid "Error" +msgstr "خطأ" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_journal__expiring_synchronization_date +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__expiring_synchronization_date +msgid "Expiring Synchronization Date" +msgstr "تاريخ انتهاء صلاحية المزامنة " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_journal__expiring_synchronization_due_day +msgid "Expiring Synchronization Due Day" +msgstr "التاريخ الذي ستنتهي فيه صلاحية المزامنة " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/connected_until_widget/connected_until_widget.xml:0 +msgid "Extend Connection" +msgstr "تمديد الإذن " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_account__account_data +msgid "Extra information needed by third party provider" +msgstr "معلومات إضافية مطلوبة من قِبَل مزود الطرف الثالث " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_missing_transaction_wizard_view_form +msgid "Fetch" +msgstr "جلب " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_duplicate_transaction_wizard_view_form +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_missing_transaction_wizard_view_form +msgid "Fetch Missing Bank Statements Wizard" +msgstr "معالج جلب كشوفات الحسابات المفقودة " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_online_link_view_form +msgid "Fetch Transactions" +msgstr "جلب المعاملات " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Fetched Transactions" +msgstr "المعاملات التي تم جلبها " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_journal__online_sync_fetching_status +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__fetching_status +msgid "Fetching Status" +msgstr "حالة الجلب " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml:0 +msgid "Fetching..." +msgstr "جري جلب... " + +#. module: odex30_account_online_sync +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_journal.py:0 +#: code:addons/odex30_account_online_sync/static/src/components/bank_reconciliation/find_duplicate_transactions_cog_menu.xml:0 +msgid "Find Duplicate Transactions" +msgstr "العثور على المعاملات المكررة " + +#. module: odex30_account_online_sync +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_journal.py:0 +#: code:addons/odex30_account_online_sync/static/src/components/bank_reconciliation/fetch_missing_transactions_cog_menu.xml:0 +msgid "Find Missing Transactions" +msgstr "العثور على المعاملات المفقودة " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_duplicate_transaction_wizard__first_ids_in_group +msgid "First Ids In Group" +msgstr "المُعرّفات الأولى في المجموعة " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__message_follower_ids +msgid "Followers" +msgstr "المتابعين" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__message_partner_ids +msgid "Followers (Partners)" +msgstr "المتابعين (الشركاء) " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "أيقونة من Font awesome مثال: fa-tasks " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__foreign_currency_id +msgid "Foreign Currency" +msgstr "عملة أجنبية " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__has_message +msgid "Has Message" +msgstr "يحتوي على رسالة " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__has_unlinked_accounts +msgid "Has Unlinked Accounts" +msgstr "يحتوي على حسابات غير مرتبطة " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Here" +msgstr "هنا " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_selection__id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_duplicate_transaction_wizard__id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_missing_transaction_wizard__id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__id +msgid "ID" +msgstr "المُعرف" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__activity_exception_icon +msgid "Icon" +msgstr "الأيقونة" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "الأيقونة للإشارة إلى النشاط المستثنى. " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_account__online_identifier +msgid "Id used to identify account by third party provider" +msgstr "المعرف المستخدَم لتعرف الحساب من قِبَل مزود الطرف الثالث " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__message_needaction +msgid "If checked, new messages require your attention." +msgstr "إذا كان محددًا، فهناك رسائل جديدة عليك رؤيتها. " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__message_has_error +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "إذا كان محددًا، فقد حدث خطأ في تسليم بعض الرسائل." + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_account__inverse_balance_sign +msgid "If checked, the balance sign will be inverted" +msgstr "إذا كان محدداً، سيتم عكس علامة الرصيد " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_account__inverse_transaction_sign +msgid "If checked, the transaction sign will be inverted" +msgstr "إذا كان محدداً، سيتم عكس علامة المعاملة " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__auto_sync +msgid "" +"If possible, we will try to automatically fetch new transactions for this record\n" +" \n" +"If the automatic sync is disabled. that will be due to security policy on the bank's end. So, they have to launch the sync manually" +msgstr "" +"إذا أمكن، سنحاول جلب المعاملات الجديدة تلقائياً لهذا السجل\n" +" \n" +"إذا كانت خاصية المزامنة التلقائية معطلة. سيكون ذلك بسبب سياسة الأمن التي يفرضها البنك. لذلك، سيتوجب عليهم تشغيل عملية المزامنة يدوياً " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml:0 +msgid "Import Transactions" +msgstr "استيراد المعاملات " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__provider_data +msgid "Information needed to interact with third party provider" +msgstr "المعلومات المطلوبة للتفاعل مع مزود الطرف الثالث " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_bank_selection__institution_name +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__name +msgid "Institution Name" +msgstr "اسم المنشأة " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Internal Error" +msgstr "خطأ داخلي " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Invalid URL" +msgstr "رابط URL غير صحيح " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Invalid value for proxy_mode config parameter." +msgstr "قيمة غير صالحة لمعيار تهيئة proxy_mode " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__inverse_balance_sign +msgid "Inverse Balance Sign" +msgstr "علامة عكس الرصيد " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__inverse_transaction_sign +msgid "Inverse Transaction Sign" +msgstr "عكس علامة المعاملة " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__message_is_follower +msgid "Is Follower" +msgstr "متابع" + +#. module: odex30_account_online_sync +#: model:ir.model,name:odex30_account_online_sync.model_account_journal +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__journal_id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_duplicate_transaction_wizard__journal_id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_missing_transaction_wizard__journal_id +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__journal_ids +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__journal_ids +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.portal_renew_consent +msgid "Journal" +msgstr "دفتر اليومية" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "" +"Journal %(journal_name)s has been set up with a different currency and " +"already has existing entries. You can't link selected bank account in " +"%(currency_name)s to it" +msgstr "" +"تم إعداد دفتر اليومية %(journal_name)s بعملة مختلفة ويحتوي بالفعل على قيود " +"موجودة. لا يمكنك ربط الحساب البنكي المحدد %(currency_name)s به " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__last_refresh +msgid "Last Refresh" +msgstr "التحديث الأخير" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_selection__write_uid +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__write_uid +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_duplicate_transaction_wizard__write_uid +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_missing_transaction_wizard__write_uid +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__write_uid +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__write_uid +msgid "Last Updated by" +msgstr "آخر تحديث بواسطة" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_selection__write_date +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__write_date +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_duplicate_transaction_wizard__write_date +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_missing_transaction_wizard__write_date +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__write_date +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_online_link_view_form +msgid "Last refresh" +msgstr "آخر تحديث " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__last_sync +msgid "Last synchronization" +msgstr "آخر مزامنة" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.portal_renew_consent +msgid "Latest Balance" +msgstr "آخر رصيد " + +#. module: odex30_account_online_sync +#: model:ir.model,name:odex30_account_online_sync.model_account_bank_selection +msgid "Link a bank account to the selected journal" +msgstr " قم بربط حساب بنكي واحد بدفتر اليومية المحدد " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/wizard/account_journal_missing_transactions.py:0 +msgid "Manual Bank Statement Lines" +msgstr "بنود كشف الحساب البنكي اليدوية " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Message" +msgstr "الرسالة" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__message_has_error +msgid "Message Delivery error" +msgstr "خطأ في تسليم الرسائل" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__message_ids +msgid "Messages" +msgstr "الرسائل" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/wizard/account_journal_missing_transactions.py:0 +msgid "Missing and Pending Transactions" +msgstr "المعاملات المفقودة وقيد الانتظار " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "الموعد النهائي لنشاطاتي " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_selection__institution_name +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__name +msgid "Name" +msgstr "الاسم" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__activity_calendar_event_id +msgid "Next Activity Calendar Event" +msgstr "الفعالية التالية في تقويم الأنشطة " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "الموعد النهائي للنشاط التالي" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__activity_summary +msgid "Next Activity Summary" +msgstr "ملخص النشاط التالي" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__activity_type_id +msgid "Next Activity Type" +msgstr "نوع النشاط التالي" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__next_refresh +msgid "Next synchronization" +msgstr "المزامنة التالية" + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:odex30_account_online_sync.selection__account_online_link__state__disconnected +msgid "Not Connected" +msgstr "غير متصل " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__message_needaction_counter +msgid "Number of Actions" +msgstr "عدد الإجراءات" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__message_has_error_counter +msgid "Number of errors" +msgstr "عدد الأخطاء " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "عدد الرسائل التي تتطلب اتخاذ إجراء" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "عدد الرسائل الحادث بها خطأ في التسليم" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.portal_renew_consent +msgid "Odoo" +msgstr "أودو" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line__online_account_id +msgid "Online Account" +msgstr "حساب عبر الإنترنت " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_online_link_view_form +msgid "Online Accounts" +msgstr "حسابات عبر الإنترنت " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_account__online_identifier +msgid "Online Identifier" +msgstr "معرف عبر الإنترنت " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_journal__next_link_synchronization +msgid "Online Link Next synchronization" +msgstr "ربط المزامنة التالية عبر الإنترنت " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line__online_partner_information +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_res_partner__online_partner_information +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_res_users__online_partner_information +msgid "Online Partner Information" +msgstr "معلومات الشريك عبر الإنترنت " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_journal.py:0 +#: model:ir.actions.act_window,name:odex30_account_online_sync.action_account_online_link_form +#: model:ir.ui.menu,name:odex30_account_online_sync.menu_action_online_link_account +#: model_terms:ir.actions.act_window,help:odex30_account_online_sync.action_account_online_link_form +msgid "Online Synchronization" +msgstr "المزامنة عبر الإنترنت " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line__online_transaction_identifier +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__online_transaction_identifier +msgid "Online Transaction Identifier" +msgstr "معرف المعاملات عبر الإنترنت " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_bank_statement.py:0 +msgid "Opening statement: first synchronization" +msgstr "البيان الافتتاحي: المزامنة الأولى" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__partner_name +msgid "Partner Name" +msgstr "اسم الشريك" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__payment_ref +msgid "Payment Ref" +msgstr "مرجع الدفع " + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:odex30_account_online_sync.selection__account_bank_statement_line_transient__state__pending +msgid "Pending" +msgstr "قيد الانتظار " + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:odex30_account_online_sync.selection__account_online_account__fetching_status__planned +msgid "Planned" +msgstr "المخطط له " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/wizard/account_journal_missing_transactions.py:0 +msgid "Please enter a valid Starting Date to continue." +msgstr "يرجى إدخال تاريخ بدء صالح للمتابعة. " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Please reconnect your online account." +msgstr "الرجاء إعادة توصيل حسابك عبر الإنترنت. " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/wizard/account_bank_statement_line.py:0 +msgid "Please select first the transactions you wish to import." +msgstr "يرجى أولاً تحديد المعاملات التي ترغب في استيرادها. " + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:odex30_account_online_sync.selection__account_bank_statement_line_transient__state__posted +msgid "Posted" +msgstr "مُرحّل " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.missing_bank_statement_line_search +msgid "Posted Transactions" +msgstr "المعاملات التي تم ترحيلها " + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:odex30_account_online_sync.selection__account_online_account__fetching_status__processing +msgid "Processing" +msgstr "معالجة " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__provider_data +msgid "Provider Data" +msgstr "بيانات المزود " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__provider_type +msgid "Provider Type" +msgstr "نوع Plaid" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__rating_ids +msgid "Ratings" +msgstr "التقييمات" + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_online_link_view_form +msgid "Reconnect" +msgstr "إعادة توصيل " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/connected_until_widget/connected_until_widget.xml:0 +#: code:addons/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_journal_dashboard_inherit_online_sync +msgid "Reconnect Bank" +msgstr "إعادة توصيل البنك " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Redirect" +msgstr "إعادة توجيه" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml:0 +msgid "Refresh" +msgstr "تحديث " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__refresh_token +msgid "Refresh Token" +msgstr "تحديث الرمز" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_journal.py:0 +msgid "Report Issue" +msgstr "إبلاغ عن إساءة " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Report issue" +msgstr "إبلاغ عن مشكلة " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__client_id +msgid "Represent a link for a given user towards a banking institution" +msgstr "تقديم رابط لمستخدم معين إلى منشأة بنكية " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_online_link_view_form +msgid "Reset" +msgstr "إعادة الضبط " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__activity_user_id +msgid "Responsible User" +msgstr "المستخدم المسؤول" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__message_has_sms_error +msgid "SMS Delivery error" +msgstr "خطأ في تسليم الرسائل النصية القصيرة " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.xml:0 +msgid "Search over" +msgstr "البحث " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.portal_renew_consent +msgid "" +"Security Tip: always check the domain name of this page, before clicking on " +"the button." +msgstr "" +"نصيحة للأمان: تحقق دائماً من اسم النطاق لهذه الصفحة، عن طريق الضغط على الزر." +" " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml:0 +msgid "See error" +msgstr "انظر إلى الخطأ " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.view_account_bank_selection_form_wizard +msgid "Select a Bank Account" +msgstr "تحديد حساب بنكي " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.view_account_bank_selection_form_wizard +msgid "Select the" +msgstr "قم بتحديد " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_selection__selected_account +msgid "Selected Account" +msgstr "الحساب المحدد " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__sequence +msgid "Sequence" +msgstr "تسلسل " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_account__account_number +msgid "Set if third party provider has the full account number" +msgstr "التعيين إذا كان لدى مزود الطرف الثالث رقم الحساب الكامل " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.xml:0 +msgid "Setup Bank" +msgstr "إعداد البنك " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "Setup Bank Account" +msgstr "إعداد الحساب البنكي " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__show_sync_actions +msgid "Show Sync Actions" +msgstr "عرض إجراءات المزامنة " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/views/account_online_authorization_kanban_controller.xml:0 +msgid "Some transactions" +msgstr "بعض المعاملات " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_duplicate_transaction_wizard__date +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_missing_transaction_wizard__date +msgid "Starting Date" +msgstr "تاريخ البدء" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__state +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_journal__account_online_link_state +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__state +msgid "State" +msgstr "الحالة " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"الأنشطة المعتمدة على الحالة\n" +"المتأخرة: تاريخ الاستحقاق مر\n" +"اليوم: تاريخ النشاط هو اليوم\n" +"المخطط: الأنشطة المستقبلية." + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.portal_renew_consent +msgid "Thank You!" +msgstr "شكرا لك! " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "The consent for the selected account has expired." +msgstr "انتهت صلاحية الإذن للحساب المحدد. " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "" +"The online synchronization service is not available at the moment. Please " +"try again later." +msgstr "" +"خدمة المزامنة عبر الإنترنت غير متوفرة في الوقت الحالي. الرجاء المحاولة " +"مجدداً لاحقاً " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__provider_type +msgid "Third Party Provider" +msgstr "مزود الطرف الثالث " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_duplicate_transaction_wizard_view_form +msgid "" +"This action will delete all selected transactions. Are you sure you want to " +"proceed?" +msgstr "" +"سيؤدي هذا الإجراء إلى حذف كافة المعاملات المحددة. هل أنت متأكد أنك ترغب في " +"المتابعة؟ " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_online_link_view_form +msgid "This button will reset the fetching status" +msgstr "سيؤدي هذا الزر إلى إعادة ضبط حالة عملية البحث " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "" +"This version of Odoo appears to be outdated and does not support the '%s' " +"sync mode. Installing the latest update might solve this." +msgstr "" +"يبدو أن هذه النسخة من أودو قديمة ولا تدعم وضع المزامنة '%s'. قد يحل تثبيت " +"آخر تحديث هذه المشكلة. " + +#. module: odex30_account_online_sync +#: model_terms:ir.actions.act_window,help:odex30_account_online_sync.action_account_online_link_form +msgid "" +"To create a synchronization with your banking institution,
    \n" +" please click on Add a Bank Account." +msgstr "" +"لإنشاء مزامنة مع المنشأة البنكية،
    \n" +" يرجى الضغط على إضافة حساب بنكي. " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__access_token +msgid "Token used to access API." +msgstr "الرمز المستخدَم للوصول إلى الواجهة البرمجية للتطبيق. " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__refresh_token +msgid "Token used to sign API request, Never disclose it" +msgstr "" +"الرمز المستخدَم للتوقيع على طلب الواجهة البرمجية للتطبيق، لا تقم بالإفصاح " +"عنه أبداً " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_duplicate_transaction_wizard__transaction_ids +msgid "Transaction" +msgstr "معاملة" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_bank_statement_line_transient__transaction_details +msgid "Transaction Details" +msgstr "تفاصيل المعاملة " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_duplicate_transaction_wizard_view_form +msgid "Transactions" +msgstr "المعاملات " + +#. module: odex30_account_online_sync +#: model:ir.model,name:odex30_account_online_sync.model_account_bank_statement_line_transient +msgid "Transient model for bank statement line" +msgstr "Transient model for bank statement line" + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__has_unlinked_accounts +msgid "" +"True if that connection still has accounts that are not linked to an Odoo " +"journal" +msgstr "" +"تكون القيمة صحيحة إذا كان الاتصال لا يزال يحتوي على حسابات غير مرتبطة بدفتر " +"يومية أودو " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "نوع النشاط المستثنى في السجل. " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.account_online_link_view_form +msgid "Update Credentials" +msgstr "تحديث بيانات الاعتماد" + +#. module: odex30_account_online_sync +#: model:ir.model.fields.selection,name:odex30_account_online_sync.selection__account_online_account__fetching_status__waiting +msgid "Waiting" +msgstr "قيد الانتظار " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,field_description:odex30_account_online_sync.field_account_online_link__website_message_ids +msgid "Website Messages" +msgstr "رسائل الموقع الإلكتروني " + +#. module: odex30_account_online_sync +#: model:ir.model.fields,help:odex30_account_online_sync.field_account_online_link__website_message_ids +msgid "Website communication history" +msgstr "سجل تواصل الموقع الإلكتروني " + +#. module: odex30_account_online_sync +#: model:ir.model,name:odex30_account_online_sync.model_account_duplicate_transaction_wizard +msgid "Wizard for duplicate transactions" +msgstr "معالج للمعاملات المكررة " + +#. module: odex30_account_online_sync +#: model:ir.model,name:odex30_account_online_sync.model_account_missing_transaction_wizard +msgid "Wizard for missing transactions" +msgstr "معالج للمعاملات المفقودة " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml:0 +msgid "" +"You are importing transactions before the creation of your online synchronization\n" +" (" +msgstr "" +"أنت تقوم باستيراد المعاملات قبل إنشاء المزامنة عبر الإنترنت\n" +" (" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "You can contact Odoo support" +msgstr "يمكنك التواصل مع فريق الدعم لدى أودو " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_journal.py:0 +msgid "You can only execute this action for bank-synchronized journals." +msgstr "لا يمكنك تنفيذ هذا الإجراء إلا لدفاتر اليومية المتزامنة مع البنك. " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_journal.py:0 +#: code:addons/odex30_account_online_sync/wizard/account_journal_missing_transactions.py:0 +msgid "" +"You can't find missing transactions for a journal that isn't connected." +msgstr "لا يمكنك العثور على المعاملات المفقودة لدفتر يومية غير متصل. " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/models/account_journal.py:0 +#: code:addons/odex30_account_online_sync/models/account_online.py:0 +msgid "You cannot have two journals associated with the same Online Account." +msgstr "لا يمكن أن يكون لديك حسابان مرتبطان بنفس الحساب عبر الإنترنت. " + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/wizard/account_bank_statement_line.py:0 +msgid "You cannot import pending transactions." +msgstr "لا يمكنك استيراد المعاملات المعلقة. " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml:0 +msgid "You have" +msgstr "لديك" + +#. module: odex30_account_online_sync +#. odoo-python +#: code:addons/odex30_account_online_sync/wizard/account_journal_missing_transactions.py:0 +msgid "You have to select one journal to continue." +msgstr "عليك تحديد دفتر يومية واحد للاستمرار. " + +#. module: odex30_account_online_sync +#: model:mail.template,subject:odex30_account_online_sync.email_template_sync_reminder +msgid "Your bank connection is expiring soon" +msgstr "سوف ينتهي اتصال البنك الخاص بك قريباً " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.view_account_bank_selection_form_wizard +msgid "account to connect:" +msgstr "الحساب لربطه: " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.xml:0 +msgid "banks" +msgstr "البنوك " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml:0 +msgid "entries" +msgstr "القيود" + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.xml:0 +msgid "loading..." +msgstr "جاري التحميل..." + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/views/account_online_authorization_kanban_controller.xml:0 +msgid "may be duplicates." +msgstr "قد تكون عناك نُسخ مكررة " + +#. module: odex30_account_online_sync +#: model_terms:ir.ui.view,arch_db:odex30_account_online_sync.portal_renew_consent +msgid "on" +msgstr "في" + +#. module: odex30_account_online_sync +#: model:ir.model,name:odex30_account_online_sync.model_account_online_account +msgid "representation of an online bank account" +msgstr "تمثيل لحساب بنكي عبر الإنترنت " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml:0 +msgid "transactions fetched" +msgstr "تم جلب المعاملات " + +#. module: odex30_account_online_sync +#. odoo-javascript +#: code:addons/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml:0 +msgid "" +"within this period that were not created using the online synchronization. " +"This might cause duplicate entries." +msgstr "" +"خلال هذه الفترة والتي لم يتم إنشاؤها باستخدام المزامنة عبر الإنترنت. قد " +"يتسبب هذا في استنساخ القيود. " diff --git a/dev_odex30_accounting/odex30_account_online_sync/models/__init__.py b/dev_odex30_accounting/odex30_account_online_sync/models/__init__.py new file mode 100644 index 0000000..fa59fc5 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/models/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +from . import account_bank_statement +from . import account_journal +from . import account_online +from . import company +from . import mail_activity_type +from . import partner +from . import bank_rec_widget diff --git a/dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..807c97008dcaff1314dc2fce1c21682189b3c56f GIT binary patch literal 621 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
    |L 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 QQ?Kv;@N7T-;o&9z4M46s0{{R3 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/company.cpython-311.pyc b/dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/company.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9dba055d4f7b0e73cf6d5ae738a743d609e5c3a2 GIT binary patch literal 1153 zcmah{%}>-o6rbtGx-5{IV2Bzt4Y!SP3vvfq;&7UId>pLOFW%VV3lCoe2?8W~M$f zCli*Y0bd~j4^pz^@>Sw`Ufkv>$TW!gq#1CtG(nshG2R}Oayd0U-{mVsvE?w{FqdOd zRK8EC>6)@+l|Pwhn?cGVS(UnpzZAQIT7!b!v9gsF^DyAd0=6o*!T5T1wLnBT+aO7Y zd%lQy&~+usCeE~kh0BS&4)f%V?Z*+b-Eh@+yP_4?iyeR|qD2w6n3pCttabC&G>AB! zx_R3wwA?x~U0nc7Yg4vPir7D`XDy_FnnSXS2V<8TwbnYBdEO0oZ=Ajd>%8D0m@l~w zYzy^9(8Wt{HxDjP9U9h=G56J&`(n%=8uJJB`M!J#3(X5zoe=IujF7BB2!LycQXe7Y zRoe|qPaT%;GZCahKDbQJXAmQxe?npugcz2rRxzn0cYtjTzHi3F)}!xwefwok(e=l; zha^8%QO!7ODjY>sS!bcCXPR6?-dkv3%Je62!C}#F3=F3jPU^G840pviIOMVu0<5QE ijC(bNuN|O?zyDrs2un==<~!r>CXRF8um42k0Dc3Qx-K^W literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/mail_activity_type.cpython-311.pyc b/dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/mail_activity_type.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2aabcb1570606bc9f4fed21c910f4dff068433ad GIT binary patch literal 1161 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 DbfJYj literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/partner.cpython-311.pyc b/dev_odex30_accounting/odex30_account_online_sync/models/__pycache__/partner.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a501c7f51477735953aacdcc2509074dded1b8b8 GIT binary patch literal 709 zcmZuuy>HYo6t|OHdO9dYs??#aKsN@#rF;xXck04GmsTeVOBTzDT`osr7bjQsI(1;` z)S*%r28OCt1p|M|At6zDLSkY&bWELiJ|`83zBteC)4!je&t_*E2;|%0tK>cGKa5jJ ztu!VbFpd#J45ui=5zd^*!N@_+5p&)l=5pM3tEN-1K3;i|$GlAx)P9NPg~ZSMjx#Z8pm=VibT8)8Q&qc_V4Jw5mNHWhawK`biJF7Axc|LSnzX!)0k|Gp+U1^ojWe7k%A literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_online_sync/models/account_bank_statement.py b/dev_odex30_accounting/odex30_account_online_sync/models/account_bank_statement.py new file mode 100644 index 0000000..bade26e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/models/account_bank_statement.py @@ -0,0 +1,114 @@ +# -*- coding: utf-8 -*- +import threading +import time +import json + +from odoo import api, fields, models, SUPERUSER_ID, tools, _ +from odoo.tools import date_utils +from odoo.exceptions import UserError, ValidationError + +STATEMENT_LINE_CREATION_BATCH_SIZE = 500 # When importing transactions, batch the process to commit after importing batch_size + + +class AccountBankStatementLine(models.Model): + _inherit = 'account.bank.statement.line' + + online_transaction_identifier = fields.Char("Online Transaction Identifier", readonly=True) + online_partner_information = fields.Char(readonly=True) + online_account_id = fields.Many2one(comodel_name='account.online.account', readonly=True) + online_link_id = fields.Many2one( + comodel_name='account.online.link', + related='online_account_id.account_online_link_id', + store=True, + readonly=True, + ) + + @api.model_create_multi + def create(self, vals_list): + """ + Some transactions can be marked as "Zero Balancing", + which is a transaction used at the end of the day to summarize all the transactions + of the day. As we already manage the details of all the transactions, this one is not + useful and moreover create duplicates. To deal with that, we cancel the move and so + the bank statement line. + """ + # EXTEND account + bank_statement_lines = super().create(vals_list) + moves_to_cancel = self.env['account.move'] + for bank_statement_line in bank_statement_lines: + transaction_details = json.loads(bank_statement_line.transaction_details) if bank_statement_line.transaction_details else {} + if not transaction_details.get('is_zero_balancing'): + continue + moves_to_cancel |= bank_statement_line.move_id + moves_to_cancel.button_cancel() + + return bank_statement_lines + + @api.model + def _online_sync_bank_statement(self, transactions, online_account): + """ + build bank statement lines from a list of transaction and post messages is also post in the online_account of the journal. + :param transactions: A list of transactions that will be created. + The format is : [{ + 'id': online id, (unique ID for the transaction) + 'date': transaction date, (The date of the transaction) + 'name': transaction description, (The description) + 'amount': transaction amount, (The amount of the transaction. Negative for debit, positive for credit) + }, ...] + :param online_account: The online account for this statement + Return: The number of imported transaction for the journal + """ + start_time = time.time() + lines_to_reconcile = self.env['account.bank.statement.line'] + try: + for journal in online_account.journal_ids: + # Since the synchronization succeeded, set it as the bank_statements_source of the journal + journal.sudo().write({'bank_statements_source': 'online_sync'}) + if not transactions: + continue + + sorted_transactions = sorted(transactions, key=lambda transaction: transaction['date']) + total = self.env.context.get('transactions_total') or sum([transaction['amount'] for transaction in transactions]) + + # For first synchronization, an opening line is created to fill the missing bank statement data + any_st_line = self.search_count([('journal_id', '=', journal.id)], limit=1) + journal_currency = journal.currency_id or journal.company_id.currency_id + # If there are neither statement and the ending balance != 0, we create an opening bank statement at the day of the oldest transaction. + # We set the sequence to >1 to ensure the computed internal_index will force its display before any other statement with the same date. + if not any_st_line and not journal_currency.is_zero(online_account.balance - total): + opening_st_line = self.with_context(skip_statement_line_cron_trigger=True).create({ + 'date': sorted_transactions[0]['date'], + 'journal_id': journal.id, + 'payment_ref': _("Opening statement: first synchronization"), + 'amount': online_account.balance - total, + 'sequence': 2, + }) + lines_to_reconcile += opening_st_line + + filtered_transactions = online_account._get_filtered_transactions(sorted_transactions) + + do_commit = not (hasattr(threading.current_thread(), 'testing') and threading.current_thread().testing) + if filtered_transactions: + # split transactions import in batch and commit after each batch except in testing mode + for index in range(0, len(filtered_transactions), STATEMENT_LINE_CREATION_BATCH_SIZE): + lines_to_reconcile += self.with_user(SUPERUSER_ID).with_company(journal.company_id).with_context(skip_statement_line_cron_trigger=True).create(filtered_transactions[index:index + STATEMENT_LINE_CREATION_BATCH_SIZE]) + if do_commit: + self.env.cr.commit() + # Set last sync date as the last transaction date + journal.account_online_account_id.sudo().write({'last_sync': filtered_transactions[-1]['date']}) + + if lines_to_reconcile: + # 'limit_time_real_cron' defaults to -1. + # Manual fallback applied for non-POSIX systems where this key is disabled (set to None). + cron_limit_time = tools.config['limit_time_real_cron'] or -1 + limit_time = (cron_limit_time if cron_limit_time > 0 else 180) - (time.time() - start_time) + if limit_time > 0: + lines_to_reconcile._cron_try_auto_reconcile_statement_lines(limit_time=limit_time) + # Catch any configuration error that would prevent creating the entries, reset fetching_status flag and re-raise the error + # Otherwise flag is never reset and user is under the impression that we are still fetching transactions + except (UserError, ValidationError) as e: + self.env.cr.rollback() + online_account.account_online_link_id._log_information('error', subject=_("Error"), message=str(e)) + self.env.cr.commit() + raise + return lines_to_reconcile diff --git a/dev_odex30_accounting/odex30_account_online_sync/models/account_journal.py b/dev_odex30_accounting/odex30_account_online_sync/models/account_journal.py new file mode 100644 index 0000000..afb0777 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/models/account_journal.py @@ -0,0 +1,380 @@ +# -*- coding: utf-8 -*- + +import logging +import requests +from dateutil.relativedelta import relativedelta +from requests.exceptions import RequestException, Timeout + +from odoo import api, fields, models, tools, _ +from odoo.exceptions import UserError, ValidationError, RedirectWarning +from odoo.tools import SQL + +_logger = logging.getLogger(__name__) + + +class AccountJournal(models.Model): + _inherit = "account.journal" + + def __get_bank_statements_available_sources(self): + rslt = super(AccountJournal, self).__get_bank_statements_available_sources() + rslt.append(("online_sync", _("Online Synchronization"))) + return rslt + + next_link_synchronization = fields.Datetime("Online Link Next synchronization", related='account_online_link_id.next_refresh') + expiring_synchronization_date = fields.Date(related='account_online_link_id.expiring_synchronization_date') + expiring_synchronization_due_day = fields.Integer(compute='_compute_expiring_synchronization_due_day') + account_online_account_id = fields.Many2one('account.online.account', copy=False, ondelete='set null') + account_online_link_id = fields.Many2one('account.online.link', related='account_online_account_id.account_online_link_id', readonly=True, store=True) + account_online_link_state = fields.Selection(related="account_online_link_id.state", readonly=True) + renewal_contact_email = fields.Char( + string='Connection Requests', + help='Comma separated list of email addresses to send consent renewal notifications 15, 3 and 1 days before expiry', + default=lambda self: self.env.user.email, + ) + online_sync_fetching_status = fields.Selection(related="account_online_account_id.fetching_status", readonly=True) + + def write(self, vals): + # When changing the bank_statement_source, unlink the connection if there is any + if 'bank_statements_source' in vals and vals.get('bank_statements_source') != 'online_sync': + for journal in self: + if journal.bank_statements_source == 'online_sync': + # unlink current connection + vals['account_online_account_id'] = False + journal.account_online_link_id.has_unlinked_accounts = True + return super().write(vals) + + @api.depends('expiring_synchronization_date') + def _compute_expiring_synchronization_due_day(self): + for record in self: + if record.expiring_synchronization_date: + due_day_delta = record.expiring_synchronization_date - fields.Date.context_today(record) + record.expiring_synchronization_due_day = due_day_delta.days + else: + record.expiring_synchronization_due_day = 0 + + def _fill_bank_cash_dashboard_data(self, dashboard_data): + super()._fill_bank_cash_dashboard_data(dashboard_data) + # Caching data to avoid one call per journal + self.browse(list(dashboard_data.keys())).fetch(['type', 'account_online_account_id']) + for journal_id, journal_data in dashboard_data.items(): + journal = self.browse(journal_id) + journal_data['display_connect_bank_in_dashboard'] = journal.type in ('bank', 'credit') \ + and not journal.account_online_account_id \ + and journal.company_id.id == self.env.company.id + + @api.constrains('account_online_account_id') + def _check_account_online_account_id(self): + for journal in self: + if len(journal.account_online_account_id.journal_ids) > 1: + raise ValidationError(_('You cannot have two journals associated with the same Online Account.')) + + def _fetch_online_transactions(self): + for journal in self: + try: + journal.account_online_link_id._pop_connection_state_details(journal=journal) + journal.manual_sync() + # for cron jobs it is usually recommended committing after each iteration, + # so that a later error or job timeout doesn't discard previous work + self.env.cr.commit() + except (UserError, RedirectWarning): + # We need to rollback here otherwise the next iteration will still have the error when trying to commit + self.env.cr.rollback() + + def fetch_online_sync_favorite_institutions(self): + self.ensure_one() + timeout = int(self.env['ir.config_parameter'].sudo().get_param('odex30_account_online_sync.request_timeout')) or 60 + endpoint_url = self.env['account.online.link']._get_odoofin_url('/proxy/v1/get_dashboard_institutions') + params = {'country': self.sudo().company_id.account_fiscal_country_id.code, 'limit': 28} + try: + resp = requests.post(endpoint_url, json=params, timeout=timeout) + resp_dict = resp.json()['result'] + for institution in resp_dict: + if institution['picture'].startswith('/'): + institution['picture'] = self.env['account.online.link']._get_odoofin_url(institution['picture']) + return resp_dict + except (Timeout, ConnectionError, RequestException, ValueError) as e: + _logger.warning(e) + return [] + + @api.model + def _cron_fetch_waiting_online_transactions(self): + """ This method is only called when the user fetch transactions asynchronously. + We only fetch transactions on synchronizations that are in "waiting" status. + Once the synchronization is done, the status is changed for "done". + We have to that to avoid having too much logic in the same cron function to do + 2 different things. This cron should only be used for asynchronous fetchs. + """ + + # 'limit_time_real_cron' and 'limit_time_real' default respectively to -1 and 120. + # Manual fallbacks applied for non-POSIX systems where this key is disabled (set to None). + limit_time = tools.config['limit_time_real_cron'] or -1 + if limit_time <= 0: + limit_time = tools.config['limit_time_real'] or 120 + journals = self.search([ + '|', + ('online_sync_fetching_status', 'in', ('planned', 'waiting')), + '&', + ('online_sync_fetching_status', '=', 'processing'), + ('account_online_link_id.last_refresh', '<', fields.Datetime.now() - relativedelta(seconds=limit_time)), + ]) + journals.with_context(cron=True)._fetch_online_transactions() + + @api.model + def _cron_fetch_online_transactions(self): + """ This method is called by the cron (by default twice a day) to fetch (for all journals) + the new transactions. + """ + journals = self.search([('account_online_account_id', '!=', False)]) + journals.with_context(cron=True)._fetch_online_transactions() + + @api.model + def _cron_send_reminder_email(self): + for journal in self.search([('account_online_account_id', '!=', False)]): + if journal.expiring_synchronization_due_day in {1, 3, 15}: + journal.action_send_reminder() + + def manual_sync(self): + self.ensure_one() + if self.account_online_link_id: + account = self.account_online_account_id + return self.account_online_link_id._fetch_transactions(accounts=account) + + def unlink(self): + """ + Override of the unlink method. + That's useful to unlink account.online.account too. + """ + if self.account_online_account_id: + self.account_online_account_id.unlink() + return super(AccountJournal, self).unlink() + + def action_configure_bank_journal(self): + """ + Override the "action_configure_bank_journal" and change the flow for the + "Configure" button in dashboard. + """ + self.ensure_one() + return self.env['account.online.link'].action_new_synchronization() + + def action_open_account_online_link(self): + self.ensure_one() + return { + 'type': 'ir.actions.act_window', + 'name': self.account_online_link_id.name, + 'res_model': 'account.online.link', + 'target': 'main', + 'view_mode': 'form', + 'views': [[False, 'form']], + 'res_id': self.account_online_link_id.id, + } + + def action_extend_consent(self): + """ + Extend the consent of the user by redirecting him to update his credentials + """ + self.ensure_one() + return self.account_online_link_id._open_iframe( + mode='updateCredentials', + include_param={ + 'account_online_identifier': self.account_online_account_id.online_identifier, + }, + ) + + def action_reconnect_online_account(self): + self.ensure_one() + return self.account_online_link_id.action_reconnect_account() + + def action_send_reminder(self): + self.ensure_one() + self._portal_ensure_token() + template = self.env.ref('odex30_account_online_sync.email_template_sync_reminder') + subtype = self.env.ref('odex30_account_online_sync.bank_sync_consent_renewal') + self.message_post_with_source(source_ref=template, subtype_id=subtype.id) + + def action_open_missing_transaction_wizard(self): + """ This method allows to open the wizard to fetch the missing + transactions and the pending ones. + Depending on where the function is called, we'll receive + one journal or none of them. + If we receive more or less than one journal, we do not set + it on the wizard, the user should select it by himself. + + :return: An action opening the wizard. + """ + journal_id = None + if len(self) == 1: + if not self.account_online_account_id or self.account_online_link_state != 'connected': + raise UserError(_("You can't find missing transactions for a journal that isn't connected.")) + + journal_id = self.id + + wizard = self.env['account.missing.transaction.wizard'].create({'journal_id': journal_id}) + return { + 'name': _("Find Missing Transactions"), + 'type': 'ir.actions.act_window', + 'res_model': 'account.missing.transaction.wizard', + 'res_id': wizard.id, + 'views': [(False, 'form')], + 'target': 'new', + } + + def action_open_duplicate_transaction_wizard(self, from_date=None): + """ This method allows to open the wizard to find duplicate transactions. + :param from_date: date from with we must check for duplicates. + + :return: An action opening the wizard. + """ + wizard = self.env['account.duplicate.transaction.wizard'].create({ + 'journal_id': self.id if len(self) == 1 else None, + **({'date': from_date} if from_date else {}), + }) + return wizard._get_records_action(name=_("Find Duplicate Transactions")) + + def _has_duplicate_transactions(self, date_from): + """ Has any transaction with + - same amount & + - same date & + - same account number + We do not check on online_transaction_identifier because this is called after the fetch + where transitions would already have been filtered on existing online_transaction_identifier. + + :param from_date: date from with we must check for duplicates. + """ + self.env.cr.execute(SQL.join(SQL(''), [ + self._get_duplicate_amount_date_account_transactions_query(date_from), + SQL('LIMIT 1'), + ])) + return bool(self.env.cr.rowcount) + + def _get_duplicate_transactions(self, date_from): + """Find all transaction with + - same amount & + - same date & + - same account number + or + - same transaction id + + :param from_date: date from with we must check for duplicates. + """ + query = SQL.join(SQL(''), [ + self._get_duplicate_amount_date_account_transactions_query(date_from), + SQL('UNION'), + self._get_duplicate_online_transaction_identifier_transactions_query(date_from), + SQL('ORDER BY ids'), + ]) + return [res[0] for res in self.env.execute_query(query)] + + def _get_duplicate_amount_date_account_transactions_query(self, date_from): + self.ensure_one() + return SQL(''' + SELECT ARRAY_AGG(st_line.id ORDER BY st_line.id) AS ids + FROM account_bank_statement_line st_line + JOIN account_move move ON move.id = st_line.move_id + WHERE st_line.journal_id = %(journal_id)s AND move.date >= %(date_from)s + GROUP BY st_line.currency_id, st_line.amount, st_line.account_number, move.date + HAVING count(st_line.id) > 1 + ''', + journal_id=self.id, + date_from=date_from, + ) + + def _get_duplicate_online_transaction_identifier_transactions_query(self, date_from): + return SQL(''' + SELECT ARRAY_AGG(st_line.id ORDER BY st_line.id) AS ids + FROM account_bank_statement_line st_line + JOIN account_move move ON move.id = st_line.move_id + WHERE st_line.journal_id = %(journal_id)s AND + move.date >= %(prior_date)s AND + st_line.online_transaction_identifier IS NOT NULL + GROUP BY st_line.online_transaction_identifier + HAVING count(st_line.id) > 1 AND BOOL_OR(move.date >= %(date_from)s) -- at least one date is > date_from + ''', + journal_id=self.id, + date_from=date_from, + prior_date=date_from - relativedelta(months=3), # allow 1 of duplicate statements to be older than "from" date + ) + + def action_open_dashboard_asynchronous_action(self): + """ This method allows to open action asynchronously + during the fetching process. + When a user clicks on the Fetch Transactions button in + the dashboard, we fetch the transactions asynchronously + and save connection state details on the synchronization. + This action allows the user to open the action saved in + the connection state details. + """ + self.ensure_one() + + if not self.account_online_account_id: + raise UserError(_("You can only execute this action for bank-synchronized journals.")) + + connection_state_details = self.account_online_link_id._pop_connection_state_details(journal=self) + if connection_state_details and connection_state_details.get('action'): + if connection_state_details.get('error_type') == 'redirect_warning': + self.env.cr.commit() + raise RedirectWarning(connection_state_details['error_message'], connection_state_details['action'], _('Report Issue')) + else: + return connection_state_details['action'] + + return {'type': 'ir.actions.client', 'tag': 'soft_reload'} + + def _get_journal_dashboard_data_batched(self): + dashboard_data = super()._get_journal_dashboard_data_batched() + for journal in self.filtered(lambda j: j.type in ('bank', 'credit')): + if journal.account_online_account_id: + if journal.company_id.id not in self.env.companies.ids: + continue + connection_state_details = journal.account_online_link_id._get_connection_state_details(journal=journal) + if not connection_state_details and journal.account_online_account_id.fetching_status in ('waiting', 'processing'): + connection_state_details = {'status': 'fetching'} + dashboard_data[journal.id]['connection_state_details'] = connection_state_details + dashboard_data[journal.id]['show_sync_actions'] = journal.account_online_link_id.show_sync_actions + return dashboard_data + + def get_related_connection_state_details(self): + """ This method allows JS widget to get the last connection state details + It's useful if the user wasn't on the dashboard when we send the message + by websocket that the asynchronous flow is finished. + In case we don't have a connection state details and if the fetching + status is set on "waiting" or "processing". We're returning that the sync + is currently fetching. + """ + self.ensure_one() + connection_state_details = self.account_online_link_id._get_connection_state_details(journal=self) + if not connection_state_details and self.account_online_account_id.fetching_status in ('waiting', 'processing'): + connection_state_details = {'status': 'fetching'} + return connection_state_details + + def _consume_connection_state_details(self): + self.ensure_one() + if self.account_online_link_id and self.env.user.has_group('account.group_account_manager'): + # In case we have a bank synchronization connected to the journal + # we want to remove the last connection state because it means that we + # have "mark as read" this state, and we don't want to display it again to + # the user. + self.account_online_link_id._pop_connection_state_details(journal=self) + + def open_action(self): + # Extends 'account_accountant' + if not self._context.get('action_name') and self.type == 'bank' and self.bank_statements_source == 'online_sync': + self._consume_connection_state_details() + return self.env['account.bank.statement.line']._action_open_bank_reconciliation_widget( + default_context={'search_default_journal_id': self.id}, + ) + return super().open_action() + + def action_open_reconcile(self): + # Extends 'account_accountant' + self._consume_connection_state_details() + return super().action_open_reconcile() + + def action_open_bank_transactions(self): + # Extends 'account_accountant' + self._consume_connection_state_details() + return super().action_open_bank_transactions() + + @api.model + def _toggle_asynchronous_fetching_cron(self): + cron = self.env.ref('odex30_account_online_sync.online_sync_cron_waiting_synchronization', raise_if_not_found=False) + if cron: + cron.sudo().toggle(model=self._name, domain=[('account_online_account_id', '!=', False)]) diff --git a/dev_odex30_accounting/odex30_account_online_sync/models/account_online.py b/dev_odex30_accounting/odex30_account_online_sync/models/account_online.py new file mode 100644 index 0000000..63554d4 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/models/account_online.py @@ -0,0 +1,1170 @@ +# -*- coding: utf-8 -*- + +import base64 +import datetime +import requests +import logging +import re +import uuid +import urllib.parse +import odoo +import odoo.release +from dateutil.relativedelta import relativedelta +from markupsafe import Markup + +from requests.exceptions import RequestException, Timeout, ConnectionError +from odoo import api, fields, models, modules, tools +from odoo.exceptions import UserError, CacheMiss, MissingError, ValidationError, RedirectWarning +from odoo.http import request +from odoo.addons.odex30_account_online_sync.models.odoofin_auth import OdooFinAuth +from odoo.tools.misc import format_amount, format_date, get_lang +from odoo.tools import _, LazyTranslate + +_lt = LazyTranslate(__name__) +_logger = logging.getLogger(__name__) +pattern = re.compile("^[a-z0-9-_]+$") +runbot_pattern = re.compile(r"^https:\/\/[a-z0-9-_]+\.[a-z0-9-_]+\.odoo\.com$") + +class OdooFinRedirectException(UserError): + """ When we need to open the iframe in a given mode. """ + + def __init__(self, message=_lt('Redirect'), mode='link'): + self.mode = mode + super().__init__(message) + +class AccountOnlineAccount(models.Model): + _name = 'account.online.account' + _description = 'representation of an online bank account' + + name = fields.Char(string="Account Name", help="Account Name as provided by third party provider") + online_identifier = fields.Char(help='Id used to identify account by third party provider', readonly=True) + balance = fields.Float(readonly=True, help='Balance of the account sent by the third party provider') + account_number = fields.Char(help='Set if third party provider has the full account number') + account_data = fields.Char(help='Extra information needed by third party provider', readonly=True) + + account_online_link_id = fields.Many2one('account.online.link', readonly=True, ondelete='cascade') + journal_ids = fields.One2many('account.journal', 'account_online_account_id', string='Journal', domain="[('type', 'in', ('bank', 'credit')), ('company_id', '=', company_id)]") + last_sync = fields.Date("Last synchronization") + company_id = fields.Many2one('res.company', related='account_online_link_id.company_id') + currency_id = fields.Many2one('res.currency') + fetching_status = fields.Selection( + selection=[ + ('planned', 'Planned'), # When all the transactions couldn't be imported in one go and is waiting for next batch + ('waiting', 'Waiting'), # When waiting for the provider to fetch the transactions + ('processing', 'Processing'), # When currently importing in odoo + ('done', 'Done'), # When every transaction have been imported in odoo + ] + ) + + inverse_balance_sign = fields.Boolean( + string="Inverse Balance Sign", + help="If checked, the balance sign will be inverted", + ) + inverse_transaction_sign = fields.Boolean( + string="Inverse Transaction Sign", + help="If checked, the transaction sign will be inverted", + ) + + @api.constrains('journal_ids') + def _check_journal_ids(self): + for online_account in self: + if len(online_account.journal_ids) > 1: + raise ValidationError(_('You cannot have two journals associated with the same Online Account.')) + + @api.model_create_multi + def create(self, vals): + result = super().create(vals) + if any(data.get('fetching_status') in {'waiting', 'processing', 'planned'} for data in vals): + self.env['account.journal']._toggle_asynchronous_fetching_cron() + return result + + def write(self, vals): + result = super().write(vals) + if vals.get('fetching_status') in {'waiting', 'processing', 'planned'}: + self.env['account.journal']._toggle_asynchronous_fetching_cron() + return result + + def unlink(self): + result = super().unlink() + self.env['account.journal']._toggle_asynchronous_fetching_cron() + return result + + def _assign_journal(self, swift_code=False): + """ + This method allows to link an online account to a journal with the following heuristics + Also, Create and assign bank & swift/bic code if odoofin returns one + If a journal is present in the context (active_model = account.journal and active_id), we assume that + We started the journey from a journal and we assign the online_account to that particular journal. + Otherwise we will create a new journal on the fly and assign the online_account to it. + If an online_account was previously set on the journal, it will be removed and deleted. + This will also set the 'online_sync' source on the journal and create an activity for the consent renewal + The date to fetch transaction will also be set and have the following value: + date of the latest statement line on the journal + or date of the fiscalyear lock date + or False (we fetch transactions as far as possible) + """ + currency_id = self.currency_id.id if not self.currency_id.is_current_company_currency else False + existing_journal = self.env['account.journal'].search([ + ('bank_acc_number', '=', self.account_number), + ('currency_id', '=', currency_id), + ('type', '=', 'bank'), + ('account_online_account_id', '=', False), + ], limit=1) + + self.ensure_one() + if (active_id := self.env.context.get('active_id')) and self.env.context.get('active_model') == 'account.journal': + journal = self.env['account.journal'].browse(active_id) + # If we already have a linked account on that journal, it means we are in the process of relinking + # it is due to an error that occured which require to redo the connection (can't fix it). + # Hence we delete the previously linked account.online.link to prevent showing multiple + # duplicate existing connections when opening the iframe + if journal.account_online_link_id: + journal.account_online_link_id.unlink() + + # Ensure the journal's currency matches the bank account's currency. + if self.currency_id.id != journal.currency_id.id: + # If the journal already has entries in a different currency, raise an error. + statement_lines_in_other_currency = self.env['account.bank.statement.line'].search_count([ + ('journal_id', '=', journal.id), + ('currency_id', 'not in', (False, self.currency_id.id)), + ], limit=1) + if statement_lines_in_other_currency: + raise UserError(_("Journal %(journal_name)s has been set up with a different currency and already has existing entries. " + "You can't link selected bank account in %(currency_name)s to it", + journal_name=journal.name, currency_name=self.currency_id.name)) + else: + # If the journal's default bank account has entries in a differente currency, silently do nothing to avoid an error. + move_lines_in_other_currency = self.env['account.move.line'].search_count([ + ('account_id', '=', journal.default_account_id.id), + ('currency_id', '!=', self.currency_id.id), + ], limit=1) + if not move_lines_in_other_currency: + # If not set yet and there are no conflicting entries, set it. + journal.sudo().currency_id = self.currency_id.id + elif existing_journal: + journal = existing_journal + else: + journal = self.env['account.journal'].create({ + 'name': self.account_number or self.display_name, + 'code': self.env['account.journal'].get_next_bank_cash_default_code('bank', self.env.company), + 'type': 'bank', + 'company_id': self.env.company.id, + 'currency_id': currency_id, + }) + + self.sudo().journal_ids = journal + + journal_vals = { + 'bank_statements_source': 'online_sync', + } + if self.account_number and not self.journal_ids.bank_acc_number: + journal_vals['bank_acc_number'] = self.account_number + self.journal_ids.sudo().write(journal_vals) + # Update connection status and get consent expiration date and create an activity on related journal + self.account_online_link_id._update_connection_status() + + # Set last_sync date (date of latest statement or one day after accounting lock date or False) + lock_date = self.env.company._get_user_fiscal_lock_date(journal) + last_sync = lock_date + relativedelta(days=1) if lock_date and lock_date > datetime.date.min else None + bnk_stmt_line = self.env['account.bank.statement.line'].search([('journal_id', 'in', self.journal_ids.ids)], order="date desc", limit=1) + if bnk_stmt_line: + last_sync = bnk_stmt_line.date + self.last_sync = last_sync + + if swift_code: + if self.journal_ids.bank_account_id.bank_id: + if not self.journal_ids.bank_account_id.bank_id.bic: + self.journal_ids.bank_account_id.bank_id.bic = swift_code + else: + bank_rec = self.env['res.bank'].search([('bic', '=', swift_code)], limit=1) + if not bank_rec: + bank_rec = self.env['res.bank'].create({'name': self.account_online_link_id.display_name, 'bic': swift_code}) + self.journal_ids.bank_account_id.bank_id = bank_rec.id + + def _refresh(self): + """ + This method is called on an online_account in order to check the current refresh status of the + account. If we are in manual mode and if the provider allows it, this will also trigger a + manual refresh on the provider side. Call to /proxy/v1/refresh will return a boolean + telling us if the refresh was successful or not. When not successful, we should avoid + trying to fetch transactions. Cases where we can receive an unsuccessful response are as follow + (non exhaustive list) + - Another refresh was made too early and provider/bank limit the number of refresh allowed + - Provider is in the process of importing the transactions so we should wait until he has + finished before fetching them in Odoo + :return: True if provider has refreshed the account and we can start fetching transactions + """ + data = {'account_id': self.online_identifier} + while True: + # While this is kind of a bad practice to do, it can happen that provider_data/account_data change between + # 2 calls, the reason is that those field contains the encrypted information needed to access the provider + # and first call can result in an error due to the encrypted token inside provider_data being expired for example. + # In such a case, we renew the token with the provider and send back the newly encrypted token inside provider_data + # which result in the information having changed, henceforth why those fields are passed at every loop. + data.update({ + 'provider_data': self.account_online_link_id.provider_data, + 'account_data': self.account_data, + 'fetching_status': self.fetching_status, + }) + resp_json = self.account_online_link_id._fetch_odoo_fin('/proxy/v1/refresh', data=data) + if resp_json.get('account_data'): + self.account_data = resp_json['account_data'] + currently_fetching = resp_json.get('currently_fetching') + success = resp_json.get('success', True) + if currently_fetching: + # Provider has not finished fetching transactions, set status to waiting + self.fetching_status = 'waiting' + if not resp_json.get('next_data'): + break + data['next_data'] = resp_json.get('next_data') or {} + return {'success': not currently_fetching and success, 'data': resp_json.get('data', {})} + + def _retrieve_transactions(self, date=None, include_pendings=False): + last_stmt_line = self.env['account.bank.statement.line'].search([ + ('date', '<=', self.last_sync or fields.Date().today()), + ('online_transaction_identifier', '!=', False), + ('journal_id', 'in', self.journal_ids.ids), + ('online_account_id', '=', self.id) + ], order="date desc", limit=1) + transactions = [] + + start_date = date or last_stmt_line.date or self.last_sync + data = { + # If we are in a new sync, we do not give a start date; We will fetch as much as possible. Otherwise, the last sync is the start date. + 'start_date': start_date and format_date(self.env, start_date, date_format='yyyy-MM-dd'), + 'account_id': self.online_identifier, + 'last_transaction_identifier': last_stmt_line.online_transaction_identifier if not include_pendings else None, + 'currency_code': self.currency_id.name or self.journal_ids[0].currency_id.name or self.company_id.currency_id.name, + 'include_pendings': include_pendings, + 'include_foreign_currency': True, + } + pendings = [] + while True: + # While this is kind of a bad practice to do, it can happen that provider_data/account_data change between + # 2 calls, the reason is that those field contains the encrypted information needed to access the provider + # and first call can result in an error due to the encrypted token inside provider_data being expired for example. + # In such a case, we renew the token with the provider and send back the newly encrypted token inside provider_data + # which result in the information having changed, henceforth why those fields are passed at every loop. + data.update({ + 'provider_data': self.account_online_link_id.provider_data, + 'account_data': self.account_data, + }) + resp_json = self.account_online_link_id._fetch_odoo_fin('/proxy/v1/transactions', data=data) + if resp_json.get('balance'): + sign = -1 if self.inverse_balance_sign else 1 + self.balance = sign * resp_json['balance'] + if resp_json.get('account_data'): + self.account_data = resp_json['account_data'] + transactions += resp_json.get('transactions', []) + pendings += resp_json.get('pendings', []) + if not resp_json.get('next_data'): + break + data['next_data'] = resp_json.get('next_data') or {} + + return { + 'transactions': self._format_transactions(transactions), + 'pendings': self._format_transactions(pendings), + } + + def get_formatted_balances(self): + balances = {} + for account in self: + if account.currency_id: + formatted_balance = format_amount(self.env, account.balance, account.currency_id) + else: + formatted_balance = '%.2f' % account.balance + balances[account.id] = [formatted_balance, account.balance] + return balances + + ########### + # HELPERS # + ########### + + def _get_filtered_transactions(self, new_transactions): + """ This function will filter transaction to avoid duplicate transactions. + To do that, we're comparing the received online_transaction_identifier with + those in the database. If there is a match, the new transaction is ignored. + """ + self.ensure_one() + + journal_id = self.journal_ids[0] + existing_bank_statement_lines = self.env['account.bank.statement.line'].search_fetch( + [ + ('journal_id', '=', journal_id.id), + ('online_transaction_identifier', 'in', [ + transaction['online_transaction_identifier'] + for transaction in new_transactions + if transaction.get('online_transaction_identifier') + ]), + ], + ['online_transaction_identifier'] + ) + existing_online_transaction_identifier = set(existing_bank_statement_lines.mapped('online_transaction_identifier')) + + filtered_transactions = [] + # Remove transactions already imported in Odoo + for transaction in new_transactions: + if transaction_identifier := transaction['online_transaction_identifier']: + if transaction_identifier in existing_online_transaction_identifier: + continue + existing_online_transaction_identifier.add(transaction_identifier) + + filtered_transactions.append(transaction) + return filtered_transactions + + def _format_transactions(self, new_transactions): + """ This function format transactions: + It will: + - Replace the foreign currency code with the corresponding currency id and activating the currencies that are not active + - Change inverse the transaction sign if the setting is activated + - Parsing the date + - Setting the account online account and the account journal + """ + self.ensure_one() + transaction_sign = -1 if self.inverse_transaction_sign else 1 + currencies = self.env['res.currency'].with_context(active_test=False).search([]) + currency_code_mapping = {currency.name: currency for currency in currencies} + + formatted_transactions = [] + for transaction in new_transactions: + if transaction.get('foreign_currency_code'): + currency = currency_code_mapping.get(transaction.pop('foreign_currency_code')) + if currency: + transaction.update({'foreign_currency_id': currency.id}) + if not currency.active: + currency.active = True + + formatted_transactions.append({ + **transaction, + 'amount': transaction['amount'] * transaction_sign, + 'date': fields.Date.from_string(transaction['date']), + 'online_account_id': self.id, + 'journal_id': self.journal_ids[0].id, + 'company_id': self.company_id.id, + }) + return formatted_transactions + + def action_reset_fetching_status(self): + """ + This action will reset the fetching status to avoid the problem when there is an error during the + synchronisation that would block the customer with his connection since we block the fetch due that value. + With this he has a button that can reset the fetching status. + """ + self.fetching_status = None + + +class AccountOnlineLink(models.Model): + _name = 'account.online.link' + _description = 'Bank Connection' + _inherit = ['mail.thread', 'mail.activity.mixin'] + + def _compute_next_synchronization(self): + for rec in self: + rec.next_refresh = self.env['ir.cron'].sudo().search([('id', '=', self.env.ref('odex30_account_online_sync.online_sync_cron').id)], limit=1).nextcall + + account_online_account_ids = fields.One2many('account.online.account', 'account_online_link_id') + last_refresh = fields.Datetime(readonly=True, default=fields.Datetime.now) + next_refresh = fields.Datetime("Next synchronization", compute='_compute_next_synchronization') + state = fields.Selection([('connected', 'Connected'), ('error', 'Error'), ('disconnected', 'Not Connected')], + default='disconnected', tracking=True, required=True, readonly=True) + connection_state_details = fields.Json() + auto_sync = fields.Boolean( + default=True, + string="Automatic synchronization", + help="""If possible, we will try to automatically fetch new transactions for this record + \nIf the automatic sync is disabled. that will be due to security policy on the bank's end. So, they have to launch the sync manually""", + ) + company_id = fields.Many2one('res.company', required=True, default=lambda self: self.env.company) + has_unlinked_accounts = fields.Boolean(default=True, help="True if that connection still has accounts that are not linked to an Odoo journal") + show_sync_actions = fields.Boolean(compute='_compute_show_sync_actions') + + # Information received from OdooFin, should not be tampered with + name = fields.Char(help="Institution Name", readonly=True) + client_id = fields.Char(help="Represent a link for a given user towards a banking institution", readonly=True) + refresh_token = fields.Char(help="Token used to sign API request, Never disclose it", + readonly=True, groups="base.group_system") + access_token = fields.Char(help="Token used to access API.", readonly=True, groups="account.group_account_basic") + provider_data = fields.Char(help="Information needed to interact with third party provider", readonly=True) + expiring_synchronization_date = fields.Date(help="Date when the consent for this connection expires", + readonly=True) + journal_ids = fields.One2many('account.journal', compute='_compute_journal_ids') + provider_type = fields.Char(help="Third Party Provider", readonly=True) + + ################### + # Compute methods # + ################### + + @api.depends('account_online_account_ids') + def _compute_journal_ids(self): + for online_link in self: + online_link.journal_ids = online_link.account_online_account_ids.journal_ids + + @api.depends('company_id') + @api.depends_context('allowed_company_ids') + def _compute_show_sync_actions(self): + for online_link in self: + online_link.show_sync_actions = online_link.company_id in self.env.companies + + ########################## + # Wizard opening actions # + ########################## + def create_new_bank_account_action(self, data=None): + self.ensure_one() + # We do return the bank account setup wizard if we don't have minimum info + if not data or not data.get('account_number'): + ctx = self.env.context + # if this was called from kanban box, active_model is in context + if ctx.get('active_model') == 'account.journal': + ctx = {**ctx, 'default_linked_journal_id': ctx.get('active_id', False), 'dialog_size': 'medium'} + return { + 'type': 'ir.actions.act_window', + 'name': _('Setup Bank Account'), + 'res_model': 'account.setup.bank.manual.config', + 'target': 'new', + 'view_mode': 'form', + 'context': ctx, + 'views': [(False, 'form')], + } + + bank = self.env['res.bank'] + if data.get('name'): + bank = self.env['res.bank'].sudo().create({ + 'name': data['name'], + 'bic': data.get('swift_code'), + }) + + bank_account = self.env['res.partner.bank'].sudo().create({ + 'acc_number': data.get('account_number'), + 'bank_id': bank.id, + 'partner_id': self.company_id.partner_id.id, + }) + + self.env['account.journal'].sudo().create({ + 'name': data.get('account_number'), + 'type': data.get('journal_type') or 'bank', + 'bank_account_id': bank_account.id, + }) + + return {'type': 'ir.actions.client', 'tag': 'soft_reload'} + + def _link_accounts_to_journals_action(self, swift_code): + """ + This method opens a wizard allowing the user to link + his bank accounts with new or existing journal. + :return: An action openning a wizard to link bank accounts with account journal. + """ + self.ensure_one() + account_bank_selection_wizard = self.env['account.bank.selection'].create({ + 'account_online_link_id': self.id, + }) + + return { + "name": _("Select a Bank Account"), + "type": "ir.actions.act_window", + "res_model": "account.bank.selection", + "views": [[False, "form"]], + "target": "new", + "res_id": account_bank_selection_wizard.id, + 'context': dict(self.env.context, swift_code=swift_code), + } + + @api.model + def _show_fetched_transactions_action(self, stmt_line_ids, duplicates_from_date): + return self.env['account.bank.statement.line']._action_open_bank_reconciliation_widget( + extra_domain=[('id', 'in', stmt_line_ids.ids)], + name=_('Fetched Transactions'), + **({'default_context': {'duplicates_from_date': duplicates_from_date}} if duplicates_from_date else {}), + ) + + def _get_connection_state_details(self, journal): + self.ensure_one() + if self.connection_state_details and self.connection_state_details.get(str(journal.id)): + # We have to check that we have a key and a right value for this journal + # Because if we have an empty dict, the JS part will handle it as a Proxy object. + # To avoid that, we checked if we have a key in the dict and if the value is truthy. + return self.connection_state_details[str(journal.id)] + return None + + def _pop_connection_state_details(self, journal): + self.ensure_one() + if journal_connection_state_details := self._get_connection_state_details(journal): + self._set_connection_state_details(journal, {}) + return journal_connection_state_details + return None + + def _set_connection_state_details(self, journal, connection_state_details): + self.ensure_one() + existing_connection_state_details = self.connection_state_details or {} + self.connection_state_details = { + **existing_connection_state_details, + str(journal.id): connection_state_details, + } + + def _notify_connection_update(self, journal, connection_state_details): + """ The aim of this function is saving the last connection state details + (like if the status is success or in error) on the account.online.link + object. At the same moment, we're sending a websocket message to + accounting dashboard where we return the status of the connection. + To make sure that we don't return sensitive information, we filtered + the connection state details to only send by websocket information + like the connection status, how many transactions we fetched, and + the error type. In case of an error, the function is calling rollback + on the cursor and is committing the save on the account online link. + It's also usefull to commit in case of error to send the websocket message. + The commit is only called if we aren't in test mode and if the connection is + in error. + + :param journal: The journal for which we want to save the connection state details. + :param connection_state_details: The information about the status of the connection (like how many transactions fetched, ...) + """ + self.ensure_one() + + connection_state_details_status = connection_state_details['status'] # We're always waiting for a status in the dict. + if connection_state_details_status == 'error': + # In case the connection status is in error, we roll back everything before saving the status. + self.env.cr.rollback() + if not (connection_state_details_status == 'success' and connection_state_details.get('nb_fetched_transactions', 0) == 0): + self._set_connection_state_details( + journal=journal, + connection_state_details=connection_state_details, + ) + self.env.ref('account.group_account_user').users._bus_send( + 'online_sync', + { + 'id': journal.id, + 'connection_state_details': { + key: value + for key, value in connection_state_details.items() + if key in ('status', 'error_type', 'nb_fetched_transactions') + }, + }, + ) + if connection_state_details_status == 'error' and not tools.config['test_enable'] and not modules.module.current_test: + # In case the status is in error, and we aren't in test mode, we commit to save the last connection state and to send the websocket message + self.env.cr.commit() + + def _handle_odoofin_redirect_exception(self, mode='link'): + if mode == 'link': + return self.with_context({'redirect_reconnection': True}).action_new_synchronization() + return self.with_context({'redirect_reconnection': True})._open_iframe(mode=mode) + + ####################################################### + # Generic methods to contact server and handle errors # + ####################################################### + + @api.model + def _get_odoofin_url(self, url): + proxy_mode = self.env['ir.config_parameter'].sudo().get_param('odex30_account_online_sync.proxy_mode') or 'production' + if not pattern.match(proxy_mode) and not runbot_pattern.match(proxy_mode): + raise UserError(_('Invalid value for proxy_mode config parameter.')) + endpoint_url = 'https://%s.odoofin.com%s' % (proxy_mode, url) + if runbot_pattern.match(proxy_mode): + endpoint_url = '%s%s' % (proxy_mode, url) + return endpoint_url + + def _fetch_odoo_fin(self, url, data=None, ignore_status=False): + """ + Method used to fetch data from the Odoo Fin proxy. + :param url: Proxy's URL end point. + :param data: HTTP data request. + :return: A dict containing all data. + """ + if not data: + data = {} + if self.state == 'disconnected' and not ignore_status: + raise UserError(_('Please reconnect your online account.')) + if not url.startswith('/'): + raise UserError(_('Invalid URL')) + + timeout = int(self.env['ir.config_parameter'].sudo().get_param('odex30_account_online_sync.request_timeout')) or 60 + endpoint_url = self._get_odoofin_url(url) + cron = self.env.context.get('cron', False) + data['utils'] = { + 'request_timeout': timeout, + 'lang': get_lang(self.env).code, + 'server_version': odoo.release.serie, + 'db_uuid': self.env['ir.config_parameter'].sudo().get_param('database.uuid'), + 'cron': cron, + } + if request: + # many banking institutions require the end-user IP/user_agent for traceability + # of client-initiated actions. It won't be stored on odoofin side. + data['utils']['psu_info'] = { + 'ip': request.httprequest.remote_addr, + 'user_agent': request.httprequest.user_agent.string, + } + + try: + # We have to use sudo to pass record as some fields are protected from read for common users. + resp = requests.post(url=endpoint_url, json=data, timeout=timeout, auth=OdooFinAuth(record=self.sudo())) + resp_json = resp.json() + return self._handle_response(resp_json, url, data, ignore_status) + except (Timeout, ConnectionError, RequestException, ValueError): + _logger.warning('synchronization error') + raise UserError( + _("The online synchronization service is not available at the moment. " + "Please try again later.")) + + def _handle_response(self, resp_json, url, data, ignore_status=False): + # Response is a json-rpc response, therefore data is encapsulated inside error in case of error + # and inside result in case of success. + if not resp_json.get('error'): + result = resp_json.get('result') + state = result.get('odoofin_state') or False + message = result.get('display_message') or False + subject = message and _('Message') or False + self._log_information(state=state, message=message, subject=subject) + if result.get('provider_data'): + # Provider_data is extremely important and must be saved as soon as we received it + # as it contains encrypted credentials from external provider and if we loose them we + # loose access to the bank account, As it is possible that provider_data + # are received during a transaction containing multiple calls to the proxy, we ensure + # that provider_data is committed in database as soon as we received it. + self.provider_data = result.get('provider_data') + self.env.cr.commit() + return result + else: + error = resp_json.get('error') + # Not considered as error + if error.get('code') == 101: # access token expired, not an error + self._get_access_token() + return self._fetch_odoo_fin(url, data, ignore_status) + elif error.get('code') == 102: # refresh token expired, not an error + self._get_refresh_token() + self._get_access_token() + # We need to commit here because if we got a new refresh token, and a new access token + # It means that the token is active on the proxy and any further call resulting in an + # error would lose the new refresh_token hence blocking the account ad vitam eternam + self.env.cr.commit() + if self.journal_ids: # We can't do it unless we already have a journal + self._update_connection_status() + return self._fetch_odoo_fin(url, data, ignore_status) + elif error.get('code') == 300: # redirect, not an error + raise OdooFinRedirectException(mode=error.get('data', {}).get('mode', 'link')) + # If we are in the process of deleting the record ignore code 100 (invalid signature), 104 (account deleted) + # 106 (provider_data corrupted) and allow user to delete his record from this side. + elif error.get('code') in (100, 104, 106) and self.env.context.get('delete_sync'): + return {'delete': True} + # Log and raise error + error_details = error.get('data') + subject = error.get('message') + message = error_details.get('message') + state = error_details.get('odoofin_state') or 'error' + ctx = self.env.context.copy() + ctx['error_reference'] = error_details.get('error_reference') + ctx['provider_type'] = error_details.get('provider_type') + ctx['redirect_warning_url'] = error_details.get('redirect_warning_url') + + self.with_context(ctx)._log_information(state=state, subject=subject, message=message, reset_tx=True) + + def _log_information(self, state, subject=None, message=None, reset_tx=False): + # If the reset_tx flag is passed, it means that we have an error, and we want to log it on the record + # and then raise the error to the end user. To do that we first roll back the current transaction, + # then we write the error on the record, we commit those changes, and finally we raise the error. + if reset_tx: + self.env.cr.rollback() + try: + # if state is disconnected, and new state is error: ignore it + if state == 'error' and self.state == 'disconnected': + state = 'disconnected' + if state and self.state != state: + self.write({'state': state}) + if state in ('error', 'disconnected'): + self.account_online_account_ids.fetching_status = 'done' + if reset_tx: + context = self.env.context + button_label = url = None + if subject and message: + message_post = message + error_reference = context.get('error_reference') + provider = context.get('provider_type') + odoo_help_description = f'''ClientID: {self.client_id}\nInstitution: {self.name}\nError Reference: {error_reference}\nError Message: {message_post}\n''' + odoo_help_summary = f'Bank sync error ref: {error_reference} - Provider: {provider} - Client ID: {self.client_id}' + if context.get('redirect_warning_url'): + if context['redirect_warning_url'] == 'odoo_support': + url_params = urllib.parse.urlencode({'stage': 'bank_sync', 'summary': odoo_help_summary, 'description': odoo_help_description[:1500]}) + url = f'https://www.odoo.com/help?{url_params}' + message += _("\n\nIf you've already opened a ticket for this issue, don't report it again: a support agent will contact you shortly.") + message_post = Markup('%s
    %s %s') % (message, _("You can contact Odoo support"), url, _("Here")) + button_label = _('Report issue') + else: + url = "https://www.odoo.com/documentation/18.0/applications/finance/accounting/bank/bank_synchronization.html#faq" + message_post = Markup('%s
    %s %s') % (message_post, _("Check the documentation"), url, _("Here")) + button_label = _('Check the documentation') + self.message_post(body=message_post, subject=subject) + # In case of reset_tx, we commit the changes in order to have the message post saved + self.env.cr.commit() + # and then raise either a redirectWarning error so that customer can easily open an issue with Odoo, + # or eventually bring the user to the documentation if there's no need to contact the support. + if url: + action_id = { + "type": "ir.actions.act_url", + "url": url, + } + raise RedirectWarning(message, action_id, button_label) #pylint: disable=E0601 + # either a userError if there's no need to bother the support, or link to the doc. + raise UserError(message) + except (CacheMiss, MissingError): + # This exception can happen if record was created and rollbacked due to error in same transaction + # Therefore it is not possible to log information on it, in this case we just ignore it. + pass + + ############### + # API methods # + ############### + + def _get_access_token(self): + for link in self: + resp_json = link._fetch_odoo_fin('/proxy/v1/get_access_token', ignore_status=True) + link.access_token = resp_json.get('access_token', False) + + def _get_refresh_token(self): + # Use sudo as refresh_token field is not accessible to most user + for link in self.sudo(): + resp_json = link._fetch_odoo_fin('/proxy/v1/renew_token', ignore_status=True) + link.refresh_token = resp_json.get('refresh_token', False) + + def unlink(self): + to_unlink = self.env['account.online.link'] + for link in self: + try: + resp_json = link.with_context(delete_sync=True)._fetch_odoo_fin('/proxy/v1/delete_user', data={'provider_data': link.provider_data}, ignore_status=True) # delete proxy user + if resp_json.get('delete', True) is True: + to_unlink += link + except OdooFinRedirectException: + # Can happen that this call returns a redirect in mode link, in which case we delete the record + to_unlink += link + continue + except (UserError, RedirectWarning): + to_unlink += link + continue + result = super(AccountOnlineLink, to_unlink).unlink() + self.env['account.journal']._toggle_asynchronous_fetching_cron() + return result + + def _fetch_accounts(self, online_identifier=False): + self.ensure_one() + if online_identifier: + matching_account = self.account_online_account_ids.filtered(lambda l: l.online_identifier == online_identifier) + # Ignore account that is already there and linked to a journal as there is no need to fetch information for that one + if matching_account and matching_account.journal_ids: + return matching_account + # If we have the account locally but didn't link it to a journal yet, delete it first. + # This way, we'll get the information back from the proxy with updated balances. Avoiding potential issues. + elif matching_account and not matching_account.journal_ids: + matching_account.unlink() + accounts = {} + data = { + 'currency_code': self.company_id.currency_id.name, + } + swift_code = False + while True: + # While this is kind of a bad practice to do, it can happen that provider_data changes between + # 2 calls, the reason is that that field contains the encrypted information needed to access the provider + # and first call can result in an error due to the encrypted token inside provider_data being expired for example. + # In such a case, we renew the token with the provider and send back the newly encrypted token inside provider_data + # which result in the information having changed, henceforth why that field is passed at every loop. + data['provider_data'] = self.provider_data + # Retrieve information about a specific account + if online_identifier: + data['online_identifier'] = online_identifier + + resp_json = self._fetch_odoo_fin('/proxy/v1/accounts', data) + for acc in resp_json.get('accounts', []): + acc['account_online_link_id'] = self.id + currency_id = self.env['res.currency'].with_context(active_test=False).search([('name', '=', acc.pop('currency_code', ''))], limit=1) + if currency_id: + if not currency_id.active: + currency_id.sudo().active = True + acc['currency_id'] = currency_id.id + accounts[str(acc.get('online_identifier'))] = acc + swift_code = resp_json.get('swift_code') + if not resp_json.get('next_data'): + break + data['next_data'] = resp_json.get('next_data') + + if accounts: + self.has_unlinked_accounts = True + return self.env['account.online.account'].create(accounts.values()), swift_code + return False, False + + def _pre_check_fetch_transactions(self): + self.ensure_one() + # 'limit_time_real_cron' and 'limit_time_real' default respectively to -1 and 120. + # Manual fallbacks applied for non-POSIX systems where this key is disabled (set to None). + limit_time = tools.config['limit_time_real_cron'] or -1 + if limit_time <= 0: + limit_time = tools.config['limit_time_real'] or 120 + limit_time += 20 # Add 20 seconds to be sure that the process will have been killed + # if any account is actually creating entries and last_refresh was made less than cron_limit_time ago, skip fetching + if (self.account_online_account_ids.filtered(lambda account: account.fetching_status == 'processing') and + self.last_refresh + relativedelta(seconds=limit_time) > fields.Datetime.now()): + return False + # If not in the process of importing and auto_sync is not set, skip fetching + if (self.env.context.get('cron') and + not self.auto_sync and + not self.account_online_account_ids.filtered(lambda acc: acc.fetching_status in ('planned', 'waiting', 'processing'))): + return False + return True + + def _fetch_transactions(self, refresh=True, accounts=False, check_duplicates=False): + self.ensure_one() + # return early if condition to fetch transactions are not met + if not self._pre_check_fetch_transactions(): + return + + is_cron_running = self.env.context.get('cron') + acc = (accounts or self.account_online_account_ids).filtered('journal_ids') + self.last_refresh = fields.Datetime.now() + try: + # When manually fetching, refresh must still be done in case a redirect occurs + # however since transactions are always fetched inside a cron, in case we are manually + # fetching, trigger the cron and redirect customer to accounting dashboard + accounts_to_synchronize = acc + if not is_cron_running: + accounts_not_to_synchronize = self.env['account.online.account'] + account_to_reauth = False + for online_account in acc: + # Only get transactions on account linked to a journal + if refresh and online_account.fetching_status not in ('planned', 'processing'): + refresh_res = online_account._refresh() + if not refresh_res['success']: + if refresh_res['data'].get('mode') == 'updateCredentials': + account_to_reauth = online_account + accounts_not_to_synchronize += online_account + continue + online_account.fetching_status = 'waiting' + if account_to_reauth: + return self._open_iframe( + mode='updateCredentials', + include_param={ + 'account_online_identifier': account_to_reauth.online_identifier, + }, + ) + accounts_to_synchronize = acc - accounts_not_to_synchronize + if not accounts_to_synchronize: + return + + def get_duplicates_from_date(statement_lines, journal): + if check_duplicates and statement_lines: + from_date = fields.Date.to_string(statement_lines.sorted('date')[0].date) + if journal._has_duplicate_transactions(from_date): + return from_date + + for online_account in accounts_to_synchronize: + journal = online_account.journal_ids[0] + online_account.fetching_status = 'processing' + # Committing here so that multiple thread calling this method won't execute in parallel and import duplicates transaction + self.env.cr.commit() + try: + transactions = online_account._retrieve_transactions().get('transactions', []) + except RedirectWarning as redirect_warning: + self._notify_connection_update( + journal=journal, + connection_state_details={ + 'status': 'error', + 'error_type': 'redirect_warning', + 'error_message': redirect_warning.args[0], + 'action': redirect_warning.args[1], + }, + ) + raise + except OdooFinRedirectException as redirect_exception: + self._notify_connection_update( + journal=journal, + connection_state_details={ + 'status': 'error', + 'error_type': 'odoofin_redirect', + 'action': self._handle_odoofin_redirect_exception(mode=redirect_exception.mode), + }, + ) + raise + + sorted_transactions = sorted(transactions, key=lambda transaction: transaction['date']) + if not is_cron_running: + # we want to import the first 100 transaction, show them to the user + # and import the rest asynchronously with the 'online_sync_cron_waiting_synchronization' cron + total = sum([transaction['amount'] for transaction in transactions]) + statement_lines = self.env['account.bank.statement.line'].with_context(transactions_total=total)._online_sync_bank_statement(sorted_transactions[:100], online_account) + online_account.fetching_status = 'planned' if len(transactions) > 100 else 'done' + domain = None + if statement_lines: + domain = [('id', 'in', statement_lines.ids)] + + duplicates_from_date = get_duplicates_from_date(statement_lines, journal) + return self.env['account.bank.statement.line']._action_open_bank_reconciliation_widget( + extra_domain=domain, + name=_('Fetched Transactions'), + default_context={**self.env.context, 'default_journal_id': journal.id, 'duplicates_from_date': duplicates_from_date}, + ) + else: + statement_lines = self.env['account.bank.statement.line']._online_sync_bank_statement(sorted_transactions, online_account) + online_account.fetching_status = 'done' + duplicates_from_date = get_duplicates_from_date(statement_lines, journal) + self._notify_connection_update( + journal=journal, + connection_state_details={ + 'status': 'success', + 'nb_fetched_transactions': len(statement_lines), + 'action': self._show_fetched_transactions_action(statement_lines, duplicates_from_date), + }, + ) + return + except OdooFinRedirectException as e: + return self._handle_odoofin_redirect_exception(mode=e.mode) + + def _get_consent_expiring_date(self, data=None): + self.ensure_one() + if not data: # Small hack to avoid breaking the stable policy + data = self._fetch_odoo_fin('/proxy/v1/consent_expiring_date', ignore_status=True) + + if data.get('consent_expiring_date'): + expiring_synchronization_date = fields.Date.to_date(data['consent_expiring_date']) + if expiring_synchronization_date != self.expiring_synchronization_date: + # TDE TODO: master: use generic activity mixin methods instead + bank_sync_activity_type_id = self.env.ref('odex30_account_online_sync.bank_sync_activity_update_consent') + account_journal_model_id = self.env['ir.model']._get_id('account.journal') + + # Remove old activities + self.env['mail.activity'].search([ + ('res_id', 'in', self.journal_ids.ids), + ('res_model_id', '=', account_journal_model_id), + ('activity_type_id', '=', bank_sync_activity_type_id.id), + ('date_deadline', '<=', self.expiring_synchronization_date), + ('user_id', '=', self.env.user.id), + ]).unlink() + + # Create a new activity for each journals for this synch + self.expiring_synchronization_date = expiring_synchronization_date + new_activity_vals = [] + for journal in self.journal_ids: + new_activity_vals.append({ + 'res_id': journal.id, + 'res_model_id': account_journal_model_id, + 'date_deadline': self.expiring_synchronization_date, + 'summary': _("Bank Synchronization: Update your consent"), + 'note': data.get('activity_message') or '', + 'activity_type_id': bank_sync_activity_type_id.id, + }) + self.env['mail.activity'].create(new_activity_vals) + elif self.expiring_synchronization_date and self.expiring_synchronization_date < fields.Date.context_today(self): + # Avoid an infinite "expired synchro" if the provider + # doesn't send us a new consent expiring date + self.expiring_synchronization_date = None + + def _update_connection_status(self): + self.ensure_one() + resp_json = self._fetch_odoo_fin('/proxy/v2/connection_status', ignore_status=True) + + self._get_consent_expiring_date(resp_json) + + # Returning what we receive from Odoo Fin to allow function extension + return resp_json + + def _authorize_access(self, data_access_token): + """ + This method is used to allow an existing connection to give temporary access + to a new connection in order to see the list of available unlinked accounts. + We pass as parameter the list of already linked account, so that if there are + no more accounts to link, we will receive a response telling us so and we won't + call authorize for that connection later on. + """ + self.ensure_one() + data = { + 'linked_accounts': self.account_online_account_ids.filtered('journal_ids').mapped('online_identifier'), + 'record_access_token': data_access_token, + } + try: + resp_json = self._fetch_odoo_fin('/proxy/v1/authorize_access', data) + self.has_unlinked_accounts = resp_json.get('has_unlinked_accounts') + except UserError: + # We don't want to throw an error to the customer so ignore error + pass + + @api.model + def _cron_delete_unused_connection(self): + account_online_links = self.search([ + ('write_date', '<=', fields.Datetime.now() - relativedelta(months=1)), + ]) + for link in account_online_links: + if not link.account_online_account_ids.filtered('journal_ids'): + link.unlink() + + @api.returns('mail.message', lambda value: value.id) + def message_post(self, **kwargs): + """Override to log all message to the linked journal as well.""" + for journal in self.journal_ids: + journal.message_post(**kwargs) + return super(AccountOnlineLink, self).message_post(**kwargs) + + ################################ + # Callback methods from iframe # + ################################ + + def success(self, mode, data): + if data: + self.write(data) + # Provider_data is extremely important and must be saved as soon as we received it + # as it contains encrypted credentials from external provider and if we loose them we + # loose access to the bank account, As it is possible that provider_data + # are received during a transaction containing multiple calls to the proxy, we ensure + # that provider_data is committed in database as soon as we received it. + if data.get('provider_data'): + self.env.cr.commit() + + self._update_connection_status() + # if for some reason we just have to update the record without doing anything else, the mode will be set to 'none' + if mode == 'none': + return {'type': 'ir.actions.client', 'tag': 'reload'} + try: + method_name = '_success_%s' % mode + method = getattr(self, method_name) + except AttributeError: + message = _("This version of Odoo appears to be outdated and does not support the '%s' sync mode. " + "Installing the latest update might solve this.", mode) + _logger.info('Online sync: %s' % (message,)) + self.env.cr.rollback() + self._log_information(state='error', subject=_('Internal Error'), message=message, reset_tx=True) + raise UserError(message) + action = method() + return action or self.env['ir.actions.act_window']._for_xml_id('account.open_account_journal_dashboard_kanban') + + @api.model + def connect_existing_account(self, data): + # extract client_id and online_identifier from data and retrieve the account detail from the connection. + # If we have a journal in context, assign to journal, otherwise create new journal then fetch transaction + client_id = data.get('client_id') + online_identifier = data.get('online_identifier') + if client_id and online_identifier: + online_link = self.search([('client_id', '=', client_id)], limit=1) + if not online_link: + return {'type': 'ir.actions.client', 'tag': 'reload'} + new_account, swift_code = online_link._fetch_accounts(online_identifier=online_identifier) + if new_account: + new_account._assign_journal(swift_code) + action = online_link._fetch_transactions(accounts=new_account, check_duplicates=True) + return action or self.env['ir.actions.act_window']._for_xml_id('account.open_account_journal_dashboard_kanban') + raise UserError(_("The consent for the selected account has expired.")) + return {'type': 'ir.actions.client', 'tag': 'reload'} + + def exchange_token(self, exchange_token): + self.ensure_one() + # Exchange token to retrieve client_id and refresh_token from proxy account + data = { + 'exchange_token': exchange_token, + 'company_id': self.env.company.id, + 'user_id': self.env.user.id + } + resp_json = self._fetch_odoo_fin('/proxy/v1/exchange_token', data=data, ignore_status=True) + # Write in sudo mode as those fields are protected from users + self.sudo().write({ + 'client_id': resp_json.get('client_id'), + 'refresh_token': resp_json.get('refresh_token'), + 'access_token': resp_json.get('access_token') + }) + return True + + def _success_link(self): + self.ensure_one() + self._log_information(state='connected') + account_online_accounts, swift_code = self._fetch_accounts() + if account_online_accounts and len(account_online_accounts) == 1: + account_online_accounts._assign_journal(swift_code) + return self._fetch_transactions(accounts=account_online_accounts, check_duplicates=True) + return self._link_accounts_to_journals_action(swift_code) + + def _success_updateCredentials(self): + self.ensure_one() + return self._fetch_transactions(refresh=False) + + def _success_refreshAccounts(self): + self.ensure_one() + return self._fetch_transactions(refresh=False) + + def _success_reconnect(self): + self.ensure_one() + self._log_information(state='connected') + return self._fetch_transactions(check_duplicates=True) + + ################## + # action buttons # + ################## + + def action_new_synchronization(self, preferred_inst=None, journal_id=False): + # Search for an existing link that was not fully connected + online_link = self + if not online_link or online_link.provider_data: + online_link = self.search([('account_online_account_ids', '=', False)], limit=1) + # If not found, create a new one + if not online_link or online_link.provider_data: + online_link = self.create({}) + return online_link._open_iframe('link', preferred_institution=preferred_inst, journal_id=journal_id) + + def action_update_credentials(self): + return self._open_iframe('updateCredentials') + + def action_fetch_transactions(self): + self.account_online_account_ids.fetching_status = None + action = self._fetch_transactions() + return action or self.env['ir.actions.act_window']._for_xml_id('account.open_account_journal_dashboard_kanban') + + def action_reconnect_account(self): + return self._open_iframe('reconnect') + + def _open_iframe(self, mode='link', include_param=None, preferred_institution=False, journal_id=False): + self.ensure_one() + if self.client_id and self.sudo().refresh_token: + try: + self._get_access_token() + except OdooFinRedirectException: + # Delete record and open iframe in a new one + self.unlink() + return self.create({})._open_iframe('link') + + proxy_mode = self.env['ir.config_parameter'].sudo().get_param('odex30_account_online_sync.proxy_mode') or 'production' + country = self.env['account.journal'].browse(journal_id).company_id.account_fiscal_country_id or self.env.company.country_id + action = { + 'type': 'ir.actions.client', + 'tag': 'odoo_fin_connector', + 'id': self.id, + 'params': { + 'proxyMode': proxy_mode, + 'clientId': self.client_id, + 'accessToken': self.access_token, + 'mode': mode, + 'includeParam': { + 'lang': get_lang(self.env).code, + 'countryCode': country.code, + 'countryName': country.display_name, + 'redirect_reconnection': self.env.context.get('redirect_reconnection'), + 'serverVersion': odoo.release.serie, + 'mfa_type': self.env.user._mfa_type(), + } + }, + 'context': { + 'dialog_size': 'medium', + }, + } + if self.provider_data: + action['params']['providerData'] = self.provider_data + if preferred_institution: + action['params']['includeParam']['clickedInstitution'] = preferred_institution + if journal_id: + action['context']['active_model'] = 'account.journal' + action['context']['active_id'] = journal_id + + if mode == 'link': + user_email = self.env.user.email or self.env.ref('base.user_admin').email or '' # Necessary for some providers onboarding + action['params']['includeParam']['dbUuid'] = self.env['ir.config_parameter'].sudo().get_param('database.uuid') + action['params']['includeParam']['userEmail'] = user_email + # Compute a hash of a random string for each connection in success + existing_link = self.search([('state', '!=', 'disconnected'), ('has_unlinked_accounts', '=', True)]) + if existing_link: + record_access_token = base64.b64encode(uuid.uuid4().bytes).decode('utf-8') + for link in existing_link: + link._authorize_access(record_access_token) + action['params']['includeParam']['recordAccessToken'] = record_access_token + + if include_param: + action['params']['includeParam'].update(include_param) + return action diff --git a/dev_odex30_accounting/odex30_account_online_sync/models/bank_rec_widget.py b/dev_odex30_accounting/odex30_account_online_sync/models/bank_rec_widget.py new file mode 100644 index 0000000..273c43f --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/models/bank_rec_widget.py @@ -0,0 +1,16 @@ +from odoo import models + + +class BankRecWidget(models.Model): + _inherit = 'bank.rec.widget' + + def _action_validate(self): + # EXTENDS account_accountant + super()._action_validate() + line = self.st_line_id + if line.partner_id and line.online_partner_information: + # write value for account and merchant on partner only if partner has no value, + # in case value are different write False + value_merchant = line.partner_id.online_partner_information or line.online_partner_information + value_merchant = value_merchant if value_merchant == line.online_partner_information else False + line.partner_id.online_partner_information = value_merchant diff --git a/dev_odex30_accounting/odex30_account_online_sync/models/company.py b/dev_odex30_accounting/odex30_account_online_sync/models/company.py new file mode 100644 index 0000000..84feee2 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/models/company.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from odoo import api, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + @api.model + def setting_init_bank_account_action(self): + """ + Override the "setting_init_bank_account_action" in accounting menu + and change the flow for the "Add a bank account" menu item in dashboard. + """ + return self.env['account.online.link'].action_new_synchronization() diff --git a/dev_odex30_accounting/odex30_account_online_sync/models/mail_activity_type.py b/dev_odex30_accounting/odex30_account_online_sync/models/mail_activity_type.py new file mode 100644 index 0000000..93e61bf --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/models/mail_activity_type.py @@ -0,0 +1,14 @@ +from odoo import api, models + + +class MailActivityType(models.Model): + _inherit = "mail.activity.type" + + @api.model + def _get_model_info_by_xmlid(self): + info = super()._get_model_info_by_xmlid() + info['odex30_account_online_sync.bank_sync_activity_update_consent'] = { + 'res_model': 'account.journal', + 'unlink': False, + } + return info diff --git a/dev_odex30_accounting/odex30_account_online_sync/models/odoofin_auth.py b/dev_odex30_accounting/odex30_account_online_sync/models/odoofin_auth.py new file mode 100644 index 0000000..19288f6 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/models/odoofin_auth.py @@ -0,0 +1,46 @@ +import base64 +import hashlib +import hmac +import json +import requests +import time +import werkzeug.urls + + +class OdooFinAuth(requests.auth.AuthBase): + + def __init__(self, record=None): + self.access_token = record and record.access_token or False + self.refresh_token = record and record.refresh_token or False + self.client_id = record and record.client_id or False + + def __call__(self, request): + # We don't sign request that still don't have a client_id/refresh_token + if not self.client_id or not self.refresh_token: + return request + # craft the message (timestamp|url path|client_id|access_token|query params|body content) + msg_timestamp = int(time.time()) + parsed_url = werkzeug.urls.url_parse(request.path_url) + + body = request.body + if isinstance(body, bytes): + body = body.decode('utf-8') + body = json.loads(body) + + message = '%s|%s|%s|%s|%s|%s' % ( + msg_timestamp, # timestamp + parsed_url.path, # url path + self.client_id, + self.access_token, + json.dumps(werkzeug.urls.url_decode(parsed_url.query), sort_keys=True), # url query params sorted by key + json.dumps(body, sort_keys=True)) # http request body + + h = hmac.new(base64.b64decode(self.refresh_token), message.encode('utf-8'), digestmod=hashlib.sha256) + + request.headers.update({ + 'odoofin-client-id': self.client_id, + 'odoofin-access-token': self.access_token, + 'odoofin-signature': base64.b64encode(h.digest()), + 'odoofin-timestamp': msg_timestamp, + }) + return request diff --git a/dev_odex30_accounting/odex30_account_online_sync/models/partner.py b/dev_odex30_accounting/odex30_account_online_sync/models/partner.py new file mode 100644 index 0000000..7cb6bc9 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/models/partner.py @@ -0,0 +1,7 @@ +from odoo import models, fields + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + online_partner_information = fields.Char(readonly=True) diff --git a/dev_odex30_accounting/odex30_account_online_sync/security/account_online_sync_security.xml b/dev_odex30_accounting/odex30_account_online_sync/security/account_online_sync_security.xml new file mode 100644 index 0000000..9a4c704 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/security/account_online_sync_security.xml @@ -0,0 +1,15 @@ + + + + Account online link company rule + + + [('company_id', 'parent_of', company_ids)] + + + Online account company rule + + + [('account_online_link_id.company_id','parent_of', company_ids)] + + diff --git a/dev_odex30_accounting/odex30_account_online_sync/security/ir.model.access.csv b/dev_odex30_accounting/odex30_account_online_sync/security/ir.model.access.csv new file mode 100644 index 0000000..adca78d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/security/ir.model.access.csv @@ -0,0 +1,12 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_online_link_id,access_account_online_link_id,model_account_online_link,account.group_account_basic,1,1,1,0 +access_account_online_link_id_readonly,access_account_online_link_id_readonly,model_account_online_link,account.group_account_readonly,1,0,0,0 +access_account_online_link_id_manager,access_account_online_link_id manager,model_account_online_link,account.group_account_manager,1,1,1,1 +access_account_online_account_id,access_account_online_account_id,model_account_online_account,account.group_account_basic,1,1,1,0 +access_account_online_account_id_readonly,access_account_online_account_id_readonly,model_account_online_account,account.group_account_readonly,1,0,0,0 +access_account_online_account_id_manager,access_account_online_account_id manager,model_account_online_account,account.group_account_manager,1,1,1,1 +access_account_bank_selection_manager,access.account.bank.selection manager,model_account_bank_selection,account.group_account_manager,1,1,1,1 +access_account_bank_selection,access.account.bank.selection basic,model_account_bank_selection,account.group_account_basic,1,1,1,0 +access_account_bank_statement_line_transient,access_account_bank_statement_line_transient,model_account_bank_statement_line_transient,account.group_account_manager,1,1,1,1 +access_account_missing_transaction_wizard,access_account_missing_transaction_wizard,model_account_missing_transaction_wizard,account.group_account_manager,1,1,1,1 +access_account_duplicate_transaction_wizard,access_account_duplicate_transaction_wizard,model_account_duplicate_transaction_wizard,account.group_account_user,1,1,1,0 diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transaction_form.js b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transaction_form.js new file mode 100644 index 0000000..403bbe4 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transaction_form.js @@ -0,0 +1,37 @@ +import { formView } from "@web/views/form/form_view"; +import { FormController } from "@web/views/form/form_controller"; +import { registry } from "@web/core/registry"; +import { useCheckDuplicateService } from "./account_duplicate_transaction_hook"; + +export class AccountDuplicateTransactionsFormController extends FormController { + setup() { + super.setup(); + this.duplicateCheckService = useCheckDuplicateService(); + } + + async beforeExecuteActionButton(clickParams) { + if (clickParams.name === "delete_selected_transactions") { + const selected = this.duplicateCheckService.selectedLines; + if (selected.size) { + await this.orm.call( + "account.bank.statement.line", + "unlink", + [Array.from(selected)], + ); + this.env.services.action.doAction({type: 'ir.actions.client', tag: 'reload'}); + } + return false; + } + return super.beforeExecuteActionButton(...arguments); + } + + get cogMenuProps() { + const props = super.cogMenuProps; + props.items.action = []; + return props; + } +} + +export const form = { ...formView, Controller: AccountDuplicateTransactionsFormController }; + +registry.category("views").add("account_duplicate_transactions_form", form); diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transaction_hook.js b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transaction_hook.js new file mode 100644 index 0000000..64b1604 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transaction_hook.js @@ -0,0 +1,6 @@ +import { useService } from "@web/core/utils/hooks"; +import { useState } from "@odoo/owl"; + +export function useCheckDuplicateService() { + return useState(useService("odex30_account_online_sync.duplicate_check_service")); +} diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transaction_service.js b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transaction_service.js new file mode 100644 index 0000000..b5571d2 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transaction_service.js @@ -0,0 +1,21 @@ +import { registry } from "@web/core/registry"; + +class AccountDuplicateTransactionsServiceModel { + constructor() { + this.selectedLines = new Set(); + } + + updateLIne(selected, id) { + this.selectedLines[selected ? "add" : "delete"](id); + } +} + +const duplicateCheckService = { + start(env, services) { + return new AccountDuplicateTransactionsServiceModel(); + }, +}; + +registry + .category("services") + .add("odex30_account_online_sync.duplicate_check_service", duplicateCheckService); diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transactions_x2many.js b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transactions_x2many.js new file mode 100644 index 0000000..d1d2a8e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transactions_x2many.js @@ -0,0 +1,50 @@ +import { onMounted } from "@odoo/owl"; +import { registry } from "@web/core/registry"; +import { ListRenderer } from "@web/views/list/list_renderer"; +import { X2ManyField, x2ManyField } from "@web/views/fields/x2many/x2many_field"; +import { useCheckDuplicateService } from "./account_duplicate_transaction_hook"; + +export class AccountDuplicateTransactionsListRenderer extends ListRenderer { + static template = "odex30_account_online_sync.AccountDuplicateTransactionsListRenderer"; + static recordRowTemplate = "odex30_account_online_sync.AccountDuplicateTransactionsRecordRow"; + + setup() { + super.setup(); + this.duplicateCheckService = useCheckDuplicateService(); + + onMounted(() => { + this.deleteButton = document.querySelector('button[name="delete_selected_transactions"]'); + this.deleteButton.disabled = true; + }); + } + + toggleRecordSelection(selected, record) { + this.duplicateCheckService.updateLIne(selected, record.data.id); + this.deleteButton.disabled = this.duplicateCheckService.selectedLines.size === 0; + } + + get hasSelectors() { + return true; + } + + getRowClass(record) { + let classes = super.getRowClass(record); + const firstIdsInGroup = this.env.model.root.data.first_ids_in_group; + if (firstIdsInGroup instanceof Array && firstIdsInGroup.includes(record.data.id)) { + classes += " account_duplicate_transactions_lines_list_x2many_group_line"; + } + return classes; + } +} + +export class AccountDuplicateTransactionsLinesListX2ManyField extends X2ManyField { + static components = { + ...X2ManyField.components, + ListRenderer: AccountDuplicateTransactionsListRenderer, + }; +} + +registry.category("fields").add("account_duplicate_transactions_lines_list_x2many", { + ...x2ManyField, + component: AccountDuplicateTransactionsLinesListX2ManyField, +}); diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transactions_x2many.scss b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transactions_x2many.scss new file mode 100644 index 0000000..4b147a5 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transactions_x2many.scss @@ -0,0 +1,3 @@ +.account_duplicate_transactions_lines_list_x2many_group_line { + border-top-width: thick; +} diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transactions_x2many.xml b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transactions_x2many.xml new file mode 100644 index 0000000..52f66ff --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/account_duplicate_transaction/account_duplicate_transactions_x2many.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.js b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.js new file mode 100644 index 0000000..0469a8d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.js @@ -0,0 +1,84 @@ +/** @odoo-module */ + +import { registry } from "@web/core/registry"; +import { standardWidgetProps } from "@web/views/widgets/standard_widget_props"; +import { useService, useBus } from "@web/core/utils/hooks"; +import { SIZES } from "@web/core/ui/ui_service"; +import { Component, useState, useRef, onWillStart } from "@odoo/owl"; + +class BankConfigureWidget extends Component { + static template = "account.BankConfigureWidget"; + static props = { + ...standardWidgetProps, + } + setup() { + this.container = useRef("container"); + this.allInstitutions = []; + this.state = useState({ + isLoading: true, + institutions: [], + gridStyle: "grid-template-columns: repeat(5, minmax(90px, 1fr));" + }); + this.orm = useService("orm"); + this.action = useService("action"); + this.ui = useService("ui"); + onWillStart(this.fetchInstitutions); + useBus(this.ui.bus, "resize", this.computeGrid); + } + + computeGrid() { + if (this.allInstitutions.length > 4) { + let containerWidth = this.container.el ? this.container.el.offsetWidth - 32 : 0; + // when the container width can't be computed, use the screen size and number of journals. + if (!containerWidth) { + if (this.ui.size >= SIZES.XXL) { + containerWidth = window.innerWidth / (this.props.record.model.root.count < 6 ? 2 : 3); + } else { + containerWidth = Math.max(this.ui.size * 100, 400); + } + } + const canFit = Math.floor(containerWidth / 100); + const numberOfRows = (Math.floor((this.allInstitutions.length + 1) / 2) >= canFit) + 1; + this.state.gridStyle = `grid-template-columns: repeat(${canFit}, minmax(90px, 1fr)); + grid-template-rows: repeat(${numberOfRows}, 1fr); + grid-auto-rows: 0px; + `; + } + this.state.institutions = this.allInstitutions; + } + + async fetchInstitutions() { + this.orm.silent.call(this.props.record.resModel, "fetch_online_sync_favorite_institutions", [this.props.record.resId]) + .then((response) => { + this.allInstitutions = response; + }) + .finally(() => { + this.state.isLoading = false; + this.computeGrid(); + }); + } + + async connectBank(institutionId=null) { + const action = await this.orm.call("account.online.link", "action_new_synchronization", [[]], { + preferred_inst: institutionId, + journal_id: this.props.record.resId, + }) + this.action.doAction(action); + } + + async fallbackConnectBank() { + const action = await this.orm.call('account.online.link', 'create_new_bank_account_action', [], { + context: { + active_model: 'account.journal', + active_id: this.props.record.resId, + } + }); + this.action.doAction(action); + } +} + +export const bankConfigureWidget = { + component: BankConfigureWidget, +} + +registry.category("view_widgets").add("bank_configure", bankConfigureWidget); diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.scss b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.scss new file mode 100644 index 0000000..3b96ed6 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.scss @@ -0,0 +1,15 @@ +.bank_configure_container { + .d-grid { + overflow: hidden; + column-gap: 0.25rem; + } + .dashboard_bank { + aspect-ratio: 1 / 1; + .align-self-center { + background-color: $gray-100; + border: 1px solid $gray-100; + } + margin-bottom: 0.25rem; + overflow: hidden; + } +} diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.xml b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.xml new file mode 100644 index 0000000..5068148 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_configure/bank_configure.xml @@ -0,0 +1,29 @@ + + diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/fetch_missing_transactions_cog_menu.js b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/fetch_missing_transactions_cog_menu.js new file mode 100644 index 0000000..6899842 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/fetch_missing_transactions_cog_menu.js @@ -0,0 +1,68 @@ +/** @odoo-module **/ + +import { Component } from "@odoo/owl"; +import { DropdownItem } from "@web/core/dropdown/dropdown_item"; +import { registry } from "@web/core/registry"; +import { useService } from "@web/core/utils/hooks"; + +const cogMenuRegistry = registry.category("cogMenu"); + +/** + * 'Fetch Missing Transactions' menu + * + * This component is used to open a wizard allowing the user to fetch their missing/pending + * transaction since a specific date. + * It's only available in the bank reconciliation widget. + * By default, if there is only one selected journal, this journal is directly selected. + * In case there is no selected journal or more than one, we let the user choose which + * journal he/she wants. This part is handled by the server. + * @extends Component + */ +export class FetchMissingTransactions extends Component { + static template = "odex30_account_online_sync.FetchMissingTransactions"; + static components = { DropdownItem }; + static props = {}; + + setup() { + this.action = useService("action"); + } + + //--------------------------------------------------------------------- + // Protected + //--------------------------------------------------------------------- + + async openFetchMissingTransactionsWizard() { + const { context } = this.env.searchModel; + const activeModel = context.active_model; + let activeIds = []; + if (activeModel === "account.journal") { + activeIds = context.active_ids; + } else if (!!context.default_journal_id) { + activeIds = context.default_journal_id; + } + // We have to use this.env.services.orm.call instead of using useService + // for a specific reason. useService implies that function calls with + // are "protected", it means that if the component is closed the + // response will be pending and the code stop their execution. + // By passing directly from the env, this protection is not activated. + const action = await this.env.services.orm.call( + "account.journal", + "action_open_missing_transaction_wizard", + [activeIds] + ); + return this.action.doAction(action); + } +} + +export const fetchMissingTransactionItem = { + Component: FetchMissingTransactions, + groupNumber: 5, + isDisplayed: ({ config, isSmall }) => { + return !isSmall && + config.actionType === "ir.actions.act_window" && + ["kanban", "list"].includes(config.viewType) && + ["bank_rec_widget_kanban", "bank_rec_list"].includes(config.viewSubType); + }, +}; + +cogMenuRegistry.add("fetch-missing-transaction-menu", fetchMissingTransactionItem, { sequence: 1 }); diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/fetch_missing_transactions_cog_menu.xml b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/fetch_missing_transactions_cog_menu.xml new file mode 100644 index 0000000..07256ff --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/fetch_missing_transactions_cog_menu.xml @@ -0,0 +1,8 @@ + + + + + Find Missing Transactions + + + diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/find_duplicate_transactions_cog_menu.js b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/find_duplicate_transactions_cog_menu.js new file mode 100644 index 0000000..dc2968e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/find_duplicate_transactions_cog_menu.js @@ -0,0 +1,64 @@ +import { Component } from "@odoo/owl"; +import { DropdownItem } from "@web/core/dropdown/dropdown_item"; +import { registry } from "@web/core/registry"; +import { useService } from "@web/core/utils/hooks"; + +/** + * 'Find Duplicate Transactions' menu + * + * This component is used to open a wizard allowing the user to find duplicate + * transactions since a specific date. + * It's only available in the bank reconciliation widget. + * By default, if there is only one selected journal, this journal is directly selected. + * In case there is no selected journal or more than one, we let the user choose. + * @extends Component + */ +export class FindDuplicateTransactions extends Component { + static template = "odex30_account_online_sync.FindDuplicateTransactions"; + static components = { DropdownItem }; + static props = {}; + + setup() { + this.action = useService("action"); + } + + //--------------------------------------------------------------------- + // Protected + //--------------------------------------------------------------------- + + async openFindDuplicateTransactionsWizard() { + const { context } = this.env.searchModel; + const activeModel = context.active_model; + let activeIds = []; + if (activeModel === "account.journal") { + activeIds = context.active_ids; + } else if (context.default_journal_id) { + activeIds = context.default_journal_id; + } + return this.action.doActionButton({ + type: "object", + resModel: "account.journal", + name:"action_open_duplicate_transaction_wizard", + resIds: activeIds, + }) + } +} + +export const findDuplicateTransactionItem = { + Component: FindDuplicateTransactions, + groupNumber: 5, // same group as fetch missing transactions + isDisplayed: ({ config, isSmall }) => { + return ( + !isSmall && + config.actionType === "ir.actions.act_window" && + ["kanban", "list"].includes(config.viewType) && + ["bank_rec_widget_kanban", "bank_rec_list"].includes(config.viewSubType) + ) + }, +}; + +registry.category("cogMenu").add( + "find-duplicate-transaction-menu", + findDuplicateTransactionItem, + { sequence: 3 }, // after fetch missing transactions +); diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/find_duplicate_transactions_cog_menu.xml b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/find_duplicate_transactions_cog_menu.xml new file mode 100644 index 0000000..1e75c99 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/bank_reconciliation/find_duplicate_transactions_cog_menu.xml @@ -0,0 +1,8 @@ + + + + + Find Duplicate Transactions + + + diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/connected_until_widget/connected_until_widget.js b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/connected_until_widget/connected_until_widget.js new file mode 100644 index 0000000..4792386 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/connected_until_widget/connected_until_widget.js @@ -0,0 +1,61 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { standardWidgetProps } from "@web/views/widgets/standard_widget_props"; +import { useService } from "@web/core/utils/hooks"; +import { Component, useState } from "@odoo/owl"; + +class ConnectedUntil extends Component { + static template = "odex30_account_online_sync.ConnectedUntil"; + static props = { ...standardWidgetProps }; + + setup() { + this.state = useState({ + isHovered: false, + displayReconnectButton: false, + }); + + if (this.isConnectionExpiredIn(0)) { + this.state.displayReconnectButton = true; + } + + this.action = useService("action"); + this.orm = useService("orm"); + } + + get cssClasses() { + let cssClasses = "text-nowrap w-100"; + if (this.isConnectionExpiredIn(7)) { + cssClasses += this.isConnectionExpiredIn(3) ? " text-danger" : " text-warning"; + } + return cssClasses; + } + + onMouseEnter() { + this.state.isHovered = true; + } + + onMouseLeave() { + this.state.isHovered = false; + } + + isConnectionExpiredIn(nbDays) { + return this.props.record.data.expiring_synchronization_due_day <= nbDays; + } + + async extendConnection() { + const action = await this.orm.call( + "account.journal", + "action_extend_consent", + [this.props.record.resId], + {} + ); + this.action.doAction(action); + } +} + +export const connectedUntil = { + component: ConnectedUntil, +}; + +registry.category("view_widgets").add("connected_until_widget", connectedUntil); diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/connected_until_widget/connected_until_widget.xml b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/connected_until_widget/connected_until_widget.xml new file mode 100644 index 0000000..18714c9 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/connected_until_widget/connected_until_widget.xml @@ -0,0 +1,23 @@ + + + +
    + + + + + + + Connected until + + + + Extend Connection + + + +
    +
    +
    diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/online_account_radio/online_account_radio.js b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/online_account_radio/online_account_radio.js new file mode 100644 index 0000000..a0e1aa0 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/online_account_radio/online_account_radio.js @@ -0,0 +1,41 @@ +/** @odoo-module **/ + +import { onMounted, useState } from "@odoo/owl"; +import { registry } from "@web/core/registry"; +import { RadioField, radioField } from "@web/views/fields/radio/radio_field"; +import { useService } from '@web/core/utils/hooks'; + + +class OnlineAccountRadio extends RadioField { + static template = "odex30_account_online_sync.OnlineAccountRadio"; + setup() { + super.setup(); + this.orm = useService("orm"); + this.state = useState({balances: {}}); + + onMounted(async () => { + this.state.balances = await this.loadData(); + // Make sure the first option is selected by default. + this.onChange(this.items[0]); + }); + } + + async loadData() { + const ids = this.items.map(i => i[0]); + return await this.orm.call("account.online.account", "get_formatted_balances", [ids]); + } + + getBalanceName(itemID) { + return this.state.balances?.[itemID]?.[0] ?? "Loading ..."; + } + + isNegativeAmount(itemID) { + // In case of the value is undefined, it will return false as intended. + return this.state.balances?.[itemID]?.[1] < 0; + } +} + +registry.category("fields").add("online_account_radio", { + ...radioField, + component: OnlineAccountRadio, +}); diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/online_account_radio/online_account_radio.xml b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/online_account_radio/online_account_radio.xml new file mode 100644 index 0000000..2407b88 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/online_account_radio/online_account_radio.xml @@ -0,0 +1,29 @@ + + + +
    + +
    + +
    +
    +
    +
    +
    diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.js b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.js new file mode 100644 index 0000000..8944dfc --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.js @@ -0,0 +1,99 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { standardWidgetProps } from "@web/views/widgets/standard_widget_props"; +import { useService } from "@web/core/utils/hooks"; +import { Component, useState, onWillStart, markup } from "@odoo/owl"; + +class RefreshSpin extends Component { + static template = "odex30_account_online_sync.RefreshSpin"; + static props = { ...standardWidgetProps }; + + setup() { + this.state = useState({ + isHovered: false, + fetchingStatus: false, + connectionStateDetails: null, + }); + + this.actionService = useService("action"); + this.busService = this.env.services.bus_service; + this.orm = useService("orm"); + this.state.fetchingStatus = this.props.record.data.online_sync_fetching_status; + + this.busService.subscribe("online_sync", (notification) => { + if (notification?.id === this.recordId && notification?.connection_state_details) { + this.state.connectionStateDetails = notification.connection_state_details; + } + }); + + onWillStart(() => { + this._initConnectionStateDetails(); + }); + } + + refresh() { + this.actionService.restore(this.actionService.currentController.jsId); + } + + onMouseEnter() { + this.state.isHovered = true; + } + + onMouseLeave() { + this.state.isHovered = false; + } + + async openAction() { + /** + * This function is used to open the action that the asynchronous process saved + * on the databsase. It allows users to call the action when they want and not when + * the process is over. + */ + const action = await this.orm.call( + "account.journal", + "action_open_dashboard_asynchronous_action", + [this.recordId], + ); + this.actionService.doAction(action); + this.state.connectionStateDetails = null; + } + + async fetchTransactions() { + /** + * This function call the function to fetch transactions. + * In the main case, we don't do anything after calling the function. + * The idea is that websockets will update the status by themselves. + * In one specific case, we have to return an action to the user to open + * the Odoo Fin iframe to refresh the connection. + */ + this.state.connectionStateDetails = { status: "fetching" }; + const action = await this.orm.call("account.journal", "manual_sync", [this.recordId]); + if (action) { + action.help = markup(action.help); + this.actionService.doAction(action); + } + } + + _initConnectionStateDetails() { + /** + * This function is used to get the last state of the connection (if there is one) + */ + const kanbanDashboardData = JSON.parse(this.props.record.data.kanban_dashboard); + this.state.connectionStateDetails = kanbanDashboardData?.connection_state_details; + } + + get recordId() { + return this.props.record.data.id; + } + + get connectionStatus() { + return this.state.connectionStateDetails?.status; + } +} + +export const refreshSpin = { + component: RefreshSpin, +}; + +registry.category("view_widgets").add("refresh_spin_widget", refreshSpin); diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml new file mode 100644 index 0000000..869292b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/refresh_spin_journal_widget/refresh_spin_journal_widget.xml @@ -0,0 +1,42 @@ + + + + +
    + + + transactions fetched + + + + 0 transaction fetched + +
    +
    + +
    + + See error + + +
    +
    + +
    + + Refresh + + + Fetching... + +
    +
    + + + Fetch Transactions + + +
    +
    diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.js b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.js new file mode 100644 index 0000000..6b9993e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.js @@ -0,0 +1,51 @@ +/** @odoo-module **/ + +import { ListRenderer } from "@web/views/list/list_renderer"; +import { ListController } from "@web/views/list/list_controller"; +import { registry } from "@web/core/registry"; +import { listView } from "@web/views/list/list_view"; +import { useService } from "@web/core/utils/hooks"; + +export class TransientBankStatementLineListController extends ListController { + + setup() { + super.setup(); + this.orm = useService("orm"); + this.action = useService("action"); + } + + async onClickImportTransactions() { + const resIds = await this.getSelectedResIds(); + const resultAction = await this.orm.call("account.bank.statement.line.transient", "action_import_transactions", [resIds]); + this.action.doAction(resultAction); + } +} + +export class TransientBankStatementLineListRenderer extends ListRenderer { + + static template = "odex30_account_online_sync.TransientBankStatementLineRenderer"; + + setup() { + super.setup(); + this.orm = useService("orm"); + this.action = useService("action"); + } + + async openManualEntries() { + if (this.env.searchModel.context.active_model === "account.missing.transaction.wizard" && this.env.searchModel.context.active_ids) { + const activeIds = this.env.searchModel.context.active_ids; + const action = await this.orm.call("account.missing.transaction.wizard", "action_open_manual_bank_statement_lines", activeIds); + this.action.doAction(action); + } + } + +} + +export const TransientBankStatementLineListView = { + ...listView, + Renderer: TransientBankStatementLineListRenderer, + Controller: TransientBankStatementLineListController, + buttonTemplate: "TransientBankStatementLineButtonTemplate", +} + +registry.category("views").add("transient_bank_statement_line_list_view", TransientBankStatementLineListView); diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml new file mode 100644 index 0000000..1e9c17c --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/transient_bank_statement_line_list_view/transient_bank_statement_line_list_view.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/views/account_online_authorization_kanban.js b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/views/account_online_authorization_kanban.js new file mode 100644 index 0000000..bd42d29 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/views/account_online_authorization_kanban.js @@ -0,0 +1,19 @@ +import { patch } from "@web/core/utils/patch"; +import { BankRecKanbanController } from "@odex30_account_accountant/components/bank_reconciliation/kanban"; + +patch(BankRecKanbanController.prototype, { + setup() { + super.setup(); + this.displayDuplicateWarning = !!this.props.context.duplicates_from_date; + }, + async onWarningClick () { + const { context } = this.env.searchModel; + return this.action.doActionButton({ + type: "object", + resModel: "account.journal", + name:"action_open_duplicate_transaction_wizard", + resId: this.state.journalId, + args: JSON.stringify([context.duplicates_from_date]), + }) + }, +}) diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/components/views/account_online_authorization_kanban_controller.xml b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/views/account_online_authorization_kanban_controller.xml new file mode 100644 index 0000000..6cdfe99 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/components/views/account_online_authorization_kanban_controller.xml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/js/odoo_fin_connector.js b/dev_odex30_accounting/odex30_account_online_sync/static/src/js/odoo_fin_connector.js new file mode 100644 index 0000000..b8d18ca --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/js/odoo_fin_connector.js @@ -0,0 +1,86 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { loadJS } from "@web/core/assets"; +import { cookie } from "@web/core/browser/cookie"; +import { markup } from "@odoo/owl"; +const actionRegistry = registry.category('actions'); +/* global OdooFin */ + +function OdooFinConnector(parent, action) { + const orm = parent.services.orm; + const actionService = parent.services.action; + const notificationService = parent.services.notification; + const debugMode = parent.debug; + + const id = action.id; + action.params.colorScheme = cookie.get("color_scheme"); + let mode = action.params.mode || 'link'; + // Ensure that the proxyMode is valid + const modeRegexp = /^[a-z0-9-_]+$/; + const runbotRegexp = /^https:\/\/[a-z0-9-_]+\.[a-z0-9-_]+\.odoo\.com$/; + if (!modeRegexp.test(action.params.proxyMode) && !runbotRegexp.test(action.params.proxyMode)) { + return; + } + let url = 'https://' + action.params.proxyMode + '.odoofin.com/proxy/v1/odoofin_link'; + if (runbotRegexp.test(action.params.proxyMode)) { + url = action.params.proxyMode + '/proxy/v1/odoofin_link'; + } + let actionResult = false; + + loadJS(url) + .then(function () { + // Create and open the iframe + const params = { + data: action.params, + proxyMode: action.params.proxyMode, + onEvent: async function (event, data) { + switch (event) { + case 'close': + return; + case 'reload': + return actionService.doAction({type: 'ir.actions.client', tag: 'reload'}); + case 'notification': + notificationService.add(data.message, data); + break; + case 'exchange_token': + await orm.call('account.online.link', 'exchange_token', + [[id], data], {context: action.context}); + break; + case 'success': + mode = data.mode || mode; + actionResult = await orm.call('account.online.link', 'success', [[id], mode, data], {context: action.context}); + actionResult.help = markup(actionResult.help) + return actionService.doAction(actionResult); + case 'connect_existing_account': + actionResult = await orm.call('account.online.link', 'connect_existing_account', [data], {context: action.context}); + actionResult.help = markup(actionResult.help) + return actionService.doAction(actionResult); + default: + return; + } + }, + onAddBank: async function (data) { + // If the user doesn't find his bank + actionResult = await orm.call( + "account.online.link", + "create_new_bank_account_action", + [[id], data], + { context: action.context } + ); + return actionService.doAction(actionResult); + } + }; + // propagate parent debug mode to iframe + if (typeof debugMode !== "undefined" && debugMode) { + params.data["debug"] = debugMode; + } + OdooFin.create(params); + OdooFin.open(); + }); + return; +} + +actionRegistry.add('odoo_fin_connector', OdooFinConnector); + +export default OdooFinConnector; diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/src/js/online_sync_portal.js b/dev_odex30_accounting/odex30_account_online_sync/static/src/js/online_sync_portal.js new file mode 100644 index 0000000..8dde787 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/src/js/online_sync_portal.js @@ -0,0 +1,57 @@ +/** @odoo-module **/ + + import publicWidget from "@web/legacy/js/public/public_widget"; + import { loadJS } from "@web/core/assets"; + /* global OdooFin */ + + publicWidget.registry.OnlineSyncPortal = publicWidget.Widget.extend({ + selector: '.oe_online_sync', + events: Object.assign({}, { + 'click #renew_consent_button': '_onRenewConsent', + }), + + OdooFinConnector: function (parent, action) { + // Ensure that the proxyMode is valid + const modeRegexp = /^[a-z0-9-_]+$/i; + if (!modeRegexp.test(action.params.proxyMode)) { + return; + } + const url = 'https://' + action.params.proxyMode + '.odoofin.com/proxy/v1/odoofin_link'; + + loadJS(url) + .then(() => { + // Create and open the iframe + const params = { + data: action.params, + proxyMode: action.params.proxyMode, + onEvent: function (event, data) { + switch (event) { + case 'success': + const processUrl = window.location.pathname + '/complete' + window.location.search; + $('.js_reconnect').toggleClass('d-none'); + $.post(processUrl, {csrf_token: odoo.csrf_token}); + default: + return; + } + }, + }; + OdooFin.create(params); + OdooFin.open(); + }); + return; + }, + + /** + * @private + * @param {Event} ev + */ + _onRenewConsent: async function (ev) { + ev.preventDefault(); + const action = JSON.parse($(ev.currentTarget).attr('iframe-params')); + return this.OdooFinConnector(this, action); + }, + }); + + export default { + OnlineSyncPortal: publicWidget.registry.OnlineSyncPortal, + }; diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/tests/helpers/model_definitions_setup.js b/dev_odex30_accounting/odex30_account_online_sync/static/tests/helpers/model_definitions_setup.js new file mode 100644 index 0000000..6434c51 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/tests/helpers/model_definitions_setup.js @@ -0,0 +1,5 @@ +/** @odoo-module **/ + +import { addModelNamesToFetch } from '@bus/../tests/helpers/model_definitions_helpers'; + +addModelNamesToFetch(["account.online.link", "account.online.account", "account.bank.selection"]); diff --git a/dev_odex30_accounting/odex30_account_online_sync/static/tests/online_account_radio_test.js b/dev_odex30_accounting/odex30_account_online_sync/static/tests/online_account_radio_test.js new file mode 100644 index 0000000..3be8ad5 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/static/tests/online_account_radio_test.js @@ -0,0 +1,83 @@ +/* @odoo-module */ + +import { startServer } from "@bus/../tests/helpers/mock_python_environment"; + +import { openFormView, start } from "@mail/../tests/helpers/test_utils"; + +import { click, contains } from "@web/../tests/utils"; + +QUnit.module("Views", {}, function () { + QUnit.module("AccountOnlineSynchronizationAccountRadio"); + + QUnit.test("can be rendered", async () => { + const pyEnv = await startServer(); + const onlineLink = pyEnv["account.online.link"].create([ + { + state: "connected", + name: "Fake Bank", + }, + ]); + pyEnv["account.online.account"].create([ + { + name: "account_1", + online_identifier: "abcd", + balance: 10.0, + account_number: "account_number_1", + account_online_link_id: onlineLink, + }, + { + name: "account_2", + online_identifier: "efgh", + balance: 20.0, + account_number: "account_number_2", + account_online_link_id: onlineLink, + }, + ]); + const bankSelection = pyEnv["account.bank.selection"].create([ + { + account_online_link_id: onlineLink, + }, + ]); + + const views = { + "account.bank.selection,false,form": `
    +
    + + +
    +
    `, + }; + await start({ + serverData: { views }, + mockRPC: function (route, args) { + if ( + route === "/web/dataset/call_kw/account.online.account/get_formatted_balances" + ) { + return { + 1: ["$ 10.0", 10.0], + 2: ["$ 20.0", 20.0], + }; + } + }, + }); + await openFormView("account.bank.selection", bankSelection); + await contains(".o_radio_item", { count: 2 }); + await contains(":nth-child(1 of .o_radio_item)", { + contains: [ + ["p", { text: "$ 10.0" }], + ["label", { text: "account_1" }], + [".o_radio_input:checked"], + ], + }); + await contains(":nth-child(2 of .o_radio_item)", { + contains: [ + ["p", { text: "$ 20.0" }], + ["label", { text: "account_2" }], + [".o_radio_input:not(:checked)"], + ], + }); + await click(":nth-child(2 of .o_radio_item) .o_radio_input"); + await contains(":nth-child(1 of .o_radio_item) .o_radio_input:not(:checked)"); + await contains(":nth-child(2 of .o_radio_item) .o_radio_input:checked"); + }); +}); diff --git a/dev_odex30_accounting/odex30_account_online_sync/tests/__init__.py b/dev_odex30_accounting/odex30_account_online_sync/tests/__init__.py new file mode 100644 index 0000000..eacefb9 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/tests/__init__.py @@ -0,0 +1,7 @@ +# -*- encoding: utf-8 -*- + +from . import common +from . import test_account_online_account +from . import test_online_sync_creation_statement +from . import test_account_missing_transactions_wizard +from . import test_online_sync_branch_companies diff --git a/dev_odex30_accounting/odex30_account_online_sync/tests/common.py b/dev_odex30_accounting/odex30_account_online_sync/tests/common.py new file mode 100644 index 0000000..ffcbc53 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/tests/common.py @@ -0,0 +1,110 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import Command, fields +from odoo.addons.account.tests.common import AccountTestInvoicingCommon +from odoo.tests import tagged +from unittest.mock import MagicMock + + +@tagged('post_install', '-at_install') +class AccountOnlineSynchronizationCommon(AccountTestInvoicingCommon): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.other_currency = cls.setup_other_currency('EUR') + + cls.euro_bank_journal = cls.env['account.journal'].create({ + 'name': 'Euro Bank Journal', + 'type': 'bank', + 'code': 'EURB', + 'currency_id': cls.other_currency.id, + }) + cls.account_online_link = cls.env['account.online.link'].create({ + 'name': 'Test Bank', + 'client_id': 'client_id_1', + 'refresh_token': 'refresh_token', + 'access_token': 'access_token', + }) + cls.account_online_account = cls.env['account.online.account'].create({ + 'name': 'MyBankAccount', + 'account_online_link_id': cls.account_online_link.id, + 'journal_ids': [Command.set(cls.euro_bank_journal.id)] + }) + cls.BankStatementLine = cls.env['account.bank.statement.line'] + + def setUp(self): + super().setUp() + self.transaction_id = 1 + self.account_online_account.balance = 0.0 + + def _create_one_online_transaction(self, transaction_identifier=None, date=None, payment_ref=None, amount=10.0, partner_name=None, foreign_currency_code=None, amount_currency=8.0): + """ This method allows to create an online transaction granularly + + :param transaction_identifier: Online identifier of the transaction, by default transaction_id from the + setUp. If used, transaction_id is not incremented. + :param date: Date of the transaction, by default the date of today + :param payment_ref: Label of the transaction + :param amount: Amount of the transaction, by default equals 10.0 + :param foreign_currency_code: Code of transaction's foreign currency + :param amount_currency: Amount of transaction in foreign currency, update transaction only if foreign_currency_code is given, by default equals 8.0 + :return: A dictionnary representing an online transaction (not formatted) + """ + transaction_identifier = transaction_identifier if transaction_identifier is not None else self.transaction_id + if date: + date = date if isinstance(date, str) else fields.Date.to_string(date) + else: + date = fields.Date.to_string(fields.Date.today()) + + payment_ref = payment_ref or f'transaction_{transaction_identifier}' + transaction = { + 'online_transaction_identifier': transaction_identifier, + 'date': date, + 'payment_ref': payment_ref, + 'amount': amount, + 'partner_name': partner_name, + } + if foreign_currency_code: + transaction.update({ + 'foreign_currency_code': foreign_currency_code, + 'amount_currency': amount_currency + }) + return transaction + + def _create_online_transactions(self, dates): + """ This method returns a list of transactions with the + given dates. + All amounts equals 10.0 + + :param dates: A list of dates, one transaction is created for each given date. + :return: A formatted list of transactions + """ + transactions = [] + for date in dates: + transactions.append(self._create_one_online_transaction(date=date)) + self.transaction_id += 1 + return self.account_online_account._format_transactions(transactions) + + def _mock_odoofin_response(self, data=None): + if not data: + data = {} + mock_response = MagicMock() + mock_response.status_code = 200 + mock_response.json.return_value = { + 'result': data, + } + return mock_response + + def _mock_odoofin_error_response(self, code=200, message='Default', data=None): + if not data: + data = {} + mock_response = MagicMock() + mock_response.status_code = 200 + mock_response.json.return_value = { + 'error': { + 'code': code, + 'message': message, + 'data': data, + }, + } + return mock_response diff --git a/dev_odex30_accounting/odex30_account_online_sync/tests/test_account_missing_transactions_wizard.py b/dev_odex30_accounting/odex30_account_online_sync/tests/test_account_missing_transactions_wizard.py new file mode 100644 index 0000000..1d9989f --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/tests/test_account_missing_transactions_wizard.py @@ -0,0 +1,45 @@ +from odoo import fields +from odoo.addons.odex30_account_online_sync.tests.common import AccountOnlineSynchronizationCommon +from odoo.tests import tagged +from unittest.mock import patch + + +@tagged('post_install', '-at_install') +class TestAccountMissingTransactionsWizard(AccountOnlineSynchronizationCommon): + """ Tests the account journal missing transactions wizard. """ + + @patch('odoo.addons.odex30_account_online_sync.models.account_online.AccountOnlineLink._fetch_odoo_fin') + def test_fetch_missing_transaction(self, patched_fetch_odoofin): + self.account_online_link.state = 'connected' + patched_fetch_odoofin.side_effect = [{ + 'transactions': [ + self._create_one_online_transaction(transaction_identifier='ABCD01', date='2023-07-06', foreign_currency_code='EGP', amount_currency=8.0), + ], + 'pendings': [ + self._create_one_online_transaction(transaction_identifier='ABCD02_pending', date='2023-07-25', foreign_currency_code='GBP', amount_currency=8.0), + ] + }] + start_date = fields.Date.from_string('2023-07-01') + wizard = self.env['account.missing.transaction.wizard'].new({ + 'date': start_date, + 'journal_id': self.euro_bank_journal.id, + }) + + action = wizard.action_fetch_missing_transaction() + transient_transactions = self.env['account.bank.statement.line.transient'].search(domain=action['domain']) + egp_currency = self.env['res.currency'].search([('name', '=', 'EGP')]) + gbp_currency = self.env['res.currency'].search([('name', '=', 'GBP')]) + + self.assertEqual(2, len(transient_transactions)) + # Posted Transaction + self.assertEqual(transient_transactions[0]['online_transaction_identifier'], 'ABCD01') + self.assertEqual(transient_transactions[0]['date'], fields.Date.from_string('2023-07-06')) + self.assertEqual(transient_transactions[0]['state'], 'posted') + self.assertEqual(transient_transactions[0]['foreign_currency_id'], egp_currency) + self.assertEqual(transient_transactions[0]['amount_currency'], 8.0) + # Pending Transaction + self.assertEqual(transient_transactions[1]['online_transaction_identifier'], 'ABCD02_pending') + self.assertEqual(transient_transactions[1]['date'], fields.Date.from_string('2023-07-25')) + self.assertEqual(transient_transactions[1]['state'], 'pending') + self.assertEqual(transient_transactions[1]['foreign_currency_id'], gbp_currency) + self.assertEqual(transient_transactions[1]['amount_currency'], 8.0) diff --git a/dev_odex30_accounting/odex30_account_online_sync/tests/test_account_online_account.py b/dev_odex30_accounting/odex30_account_online_sync/tests/test_account_online_account.py new file mode 100644 index 0000000..35c5bcd --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/tests/test_account_online_account.py @@ -0,0 +1,491 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import logging +from datetime import datetime, timedelta +from freezegun import freeze_time +from unittest.mock import patch + +from odoo import Command, fields, tools +from odoo.addons.odex30_account_online_sync.tests.common import AccountOnlineSynchronizationCommon +from odoo.tests import tagged + +_logger = logging.getLogger(__name__) + +@tagged('post_install', '-at_install') +class TestAccountOnlineAccount(AccountOnlineSynchronizationCommon): + + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.bank_account_id = cls.env['account.account'].create({ + 'name': 'Bank Account', + 'account_type': 'asset_cash', + 'code': cls.env['account.account']._search_new_account_code('BNK100'), + }) + cls.bank_journal = cls.env['account.journal'].create({ + 'name': 'A bank journal', + 'default_account_id': cls.bank_account_id.id, + 'type': 'bank', + 'code': cls.env['account.journal'].get_next_bank_cash_default_code('bank', cls.company_data['company']), + }) + + @freeze_time('2023-08-01') + def test_get_filtered_transactions(self): + """ This test verifies that duplicate transactions are filtered """ + self.BankStatementLine.with_context(skip_statement_line_cron_trigger=True).create({ + 'date': '2023-08-01', + 'journal_id': self.euro_bank_journal.id, + 'online_transaction_identifier': 'ABCD01', + 'payment_ref': 'transaction_ABCD01', + 'amount': 10.0, + }) + + transactions_to_filtered = [ + self._create_one_online_transaction(transaction_identifier='ABCD01'), + self._create_one_online_transaction(transaction_identifier='ABCD02'), + ] + + filtered_transactions = self.account_online_account._get_filtered_transactions(transactions_to_filtered) + + self.assertEqual( + filtered_transactions, + [ + { + 'payment_ref': 'transaction_ABCD02', + 'date': '2023-08-01', + 'online_transaction_identifier': 'ABCD02', + 'amount': 10.0, + 'partner_name': None, + } + ] + ) + + @freeze_time('2023-08-01') + def test_get_filtered_transactions_with_empty_transaction_identifier(self): + """ This test verifies that transactions without a transaction identifier + are not filtered due to their empty transaction identifier. + """ + self.BankStatementLine.with_context(skip_statement_line_cron_trigger=True).create({ + 'date': '2023-08-01', + 'journal_id': self.euro_bank_journal.id, + 'online_transaction_identifier': '', + 'payment_ref': 'transaction_ABCD01', + 'amount': 10.0, + }) + + transactions_to_filtered = [ + self._create_one_online_transaction(transaction_identifier=''), + self._create_one_online_transaction(transaction_identifier=''), + ] + + filtered_transactions = self.account_online_account._get_filtered_transactions(transactions_to_filtered) + + self.assertEqual( + filtered_transactions, + [ + { + 'payment_ref': 'transaction_', + 'date': '2023-08-01', + 'online_transaction_identifier': '', + 'amount': 10.0, + 'partner_name': None, + }, + { + 'payment_ref': 'transaction_', + 'date': '2023-08-01', + 'online_transaction_identifier': '', + 'amount': 10.0, + 'partner_name': None, + }, + ] + ) + + @freeze_time('2023-08-01') + def test_format_transactions(self): + transactions_to_format = [ + self._create_one_online_transaction(transaction_identifier='ABCD01'), + self._create_one_online_transaction(transaction_identifier='ABCD02'), + ] + formatted_transactions = self.account_online_account._format_transactions(transactions_to_format) + self.assertEqual( + formatted_transactions, + [ + { + 'payment_ref': 'transaction_ABCD01', + 'date': fields.Date.from_string('2023-08-01'), + 'online_transaction_identifier': 'ABCD01', + 'amount': 10.0, + 'online_account_id': self.account_online_account.id, + 'journal_id': self.euro_bank_journal.id, + 'company_id': self.euro_bank_journal.company_id.id, + 'partner_name': None, + }, + { + 'payment_ref': 'transaction_ABCD02', + 'date': fields.Date.from_string('2023-08-01'), + 'online_transaction_identifier': 'ABCD02', + 'amount': 10.0, + 'online_account_id': self.account_online_account.id, + 'journal_id': self.euro_bank_journal.id, + 'company_id': self.euro_bank_journal.company_id.id, + 'partner_name': None, + }, + ] + ) + + @freeze_time('2023-08-01') + def test_format_transactions_invert_sign(self): + transactions_to_format = [ + self._create_one_online_transaction(transaction_identifier='ABCD01', amount=25.0), + ] + self.account_online_account.inverse_transaction_sign = True + formatted_transactions = self.account_online_account._format_transactions(transactions_to_format) + self.assertEqual( + formatted_transactions, + [ + { + 'payment_ref': 'transaction_ABCD01', + 'date': fields.Date.from_string('2023-08-01'), + 'online_transaction_identifier': 'ABCD01', + 'amount': -25.0, + 'online_account_id': self.account_online_account.id, + 'journal_id': self.euro_bank_journal.id, + 'company_id': self.euro_bank_journal.company_id.id, + 'partner_name': None, + }, + ] + ) + + @freeze_time('2023-08-01') + def test_format_transactions_foreign_currency_code_to_id_with_activation(self): + """ This test ensures conversion of foreign currency code to foreign currency id and activates foreign currency if not already activate """ + gbp_currency = self.env['res.currency'].with_context(active_test=False).search([('name', '=', 'GBP')]) + egp_currency = self.env['res.currency'].with_context(active_test=False).search([('name', '=', 'EGP')]) + + transactions_to_format = [ + self._create_one_online_transaction(transaction_identifier='ABCD01', foreign_currency_code='GBP'), + self._create_one_online_transaction(transaction_identifier='ABCD02', foreign_currency_code='EGP', amount_currency=500.0), + ] + formatted_transactions = self.account_online_account._format_transactions(transactions_to_format) + + self.assertTrue(gbp_currency.active) + self.assertTrue(egp_currency.active) + + self.assertEqual( + formatted_transactions, + [ + { + 'payment_ref': 'transaction_ABCD01', + 'date': fields.Date.from_string('2023-08-01'), + 'online_transaction_identifier': 'ABCD01', + 'amount': 10.0, + 'online_account_id': self.account_online_account.id, + 'journal_id': self.euro_bank_journal.id, + 'company_id': self.euro_bank_journal.company_id.id, + 'partner_name': None, + 'foreign_currency_id': gbp_currency.id, + 'amount_currency': 8.0, + }, + { + 'payment_ref': 'transaction_ABCD02', + 'date': fields.Date.from_string('2023-08-01'), + 'online_transaction_identifier': 'ABCD02', + 'amount': 10.0, + 'online_account_id': self.account_online_account.id, + 'journal_id': self.euro_bank_journal.id, + 'company_id': self.euro_bank_journal.company_id.id, + 'partner_name': None, + 'foreign_currency_id': egp_currency.id, + 'amount_currency': 500.0, + }, + ] + ) + + @freeze_time('2023-07-25') + @patch('odoo.addons.odex30_account_online_sync.models.account_online.AccountOnlineLink._fetch_odoo_fin') + def test_retrieve_pending_transactions(self, patched_fetch_odoofin): + self.account_online_link.state = 'connected' + patched_fetch_odoofin.side_effect = [{ + 'transactions': [ + self._create_one_online_transaction(transaction_identifier='ABCD01', date='2023-07-06'), + self._create_one_online_transaction(transaction_identifier='ABCD02', date='2023-07-22'), + ], + 'pendings': [ + self._create_one_online_transaction(transaction_identifier='ABCD03_pending', date='2023-07-25'), + self._create_one_online_transaction(transaction_identifier='ABCD04_pending', date='2023-07-25'), + ] + }] + + start_date = fields.Date.from_string('2023-07-01') + result = self.account_online_account._retrieve_transactions(date=start_date, include_pendings=True) + self.assertEqual( + result, + { + 'transactions': [ + { + 'payment_ref': 'transaction_ABCD01', + 'date': fields.Date.from_string('2023-07-06'), + 'online_transaction_identifier': 'ABCD01', + 'amount': 10.0, + 'partner_name': None, + 'online_account_id': self.account_online_account.id, + 'journal_id': self.euro_bank_journal.id, + 'company_id': self.euro_bank_journal.company_id.id, + }, + { + 'payment_ref': 'transaction_ABCD02', + 'date': fields.Date.from_string('2023-07-22'), + 'online_transaction_identifier': 'ABCD02', + 'amount': 10.0, + 'partner_name': None, + 'online_account_id': self.account_online_account.id, + 'journal_id': self.euro_bank_journal.id, + 'company_id': self.euro_bank_journal.company_id.id, + } + ], + 'pendings': [ + { + 'payment_ref': 'transaction_ABCD03_pending', + 'date': fields.Date.from_string('2023-07-25'), + 'online_transaction_identifier': 'ABCD03_pending', + 'amount': 10.0, + 'partner_name': None, + 'online_account_id': self.account_online_account.id, + 'journal_id': self.euro_bank_journal.id, + 'company_id': self.euro_bank_journal.company_id.id, + }, + { + 'payment_ref': 'transaction_ABCD04_pending', + 'date': fields.Date.from_string('2023-07-25'), + 'online_transaction_identifier': 'ABCD04_pending', + 'amount': 10.0, + 'partner_name': None, + 'online_account_id': self.account_online_account.id, + 'journal_id': self.euro_bank_journal.id, + 'company_id': self.euro_bank_journal.company_id.id, + } + ] + } + ) + + @freeze_time('2023-01-01 01:10:15') + @patch('odoo.addons.odex30_account_online_sync.models.account_online.AccountOnlineAccount._retrieve_transactions', return_value={}) + @patch('odoo.addons.odex30_account_online_sync.models.account_online.AccountOnlineAccount._refresh', return_value={'success': True, 'data': {}}) + def test_basic_flow_manual_fetching_transactions(self, patched_refresh, patched_transactions): + self.addCleanup(self.env.registry.leave_test_mode) + # flush and clear everything for the new "transaction" + self.env.invalidate_all() + + self.env.registry.enter_test_mode(self.cr) + with self.env.registry.cursor() as test_cr: + test_env = self.env(cr=test_cr) + test_link_account = self.account_online_link.with_env(test_env) + test_link_account.state = 'connected' + # Call fetch_transaction in manual mode and check that a call was made to refresh and to transaction + test_link_account._fetch_transactions() + patched_refresh.assert_called_once() + patched_transactions.assert_called_once() + self.assertEqual(test_link_account.account_online_account_ids[0].fetching_status, 'done') + + @freeze_time('2023-01-01 01:10:15') + @patch('odoo.addons.odex30_account_online_sync.models.account_online.AccountOnlineAccount._retrieve_transactions', return_value={}) + @patch('odoo.addons.odex30_account_online_sync.models.account_online.AccountOnlineLink._fetch_odoo_fin') + def test_refresh_incomplete_fetching_transactions(self, patched_refresh, patched_transactions): + patched_refresh.return_value = {'success': False} + # Call fetch_transaction and if call result is false, don't call transaction + self.account_online_link._fetch_transactions() + patched_transactions.assert_not_called() + + patched_refresh.return_value = {'success': False, 'currently_fetching': True} + # Call fetch_transaction and if call result is false but in the process of fetching, don't call transaction + # and wait for the async cron to try again + self.account_online_link._fetch_transactions() + patched_transactions.assert_not_called() + self.assertEqual(self.account_online_account.fetching_status, 'waiting') + + @freeze_time('2023-01-01 01:10:15') + @patch('odoo.addons.odex30_account_online_sync.models.account_online.AccountOnlineAccount._retrieve_transactions', return_value={}) + @patch('odoo.addons.odex30_account_online_sync.models.account_online.AccountOnlineAccount._refresh', return_value={'success': True, 'data': {}}) + def test_currently_processing_fetching_transactions(self, patched_refresh, patched_transactions): + self.account_online_account.fetching_status = 'processing' # simulate the fact that we are currently creating entries in odoo + limit_time = tools.config['limit_time_real_cron'] if tools.config['limit_time_real_cron'] > 0 else tools.config['limit_time_real'] + self.account_online_link.last_refresh = datetime.now() + with freeze_time(datetime.now() + timedelta(seconds=(limit_time - 10))): + # Call to fetch_transaction should be skipped, and the cron should not try to fetch either + self.account_online_link._fetch_transactions() + self.euro_bank_journal._cron_fetch_waiting_online_transactions() + patched_refresh.assert_not_called() + patched_transactions.assert_not_called() + + self.addCleanup(self.env.registry.leave_test_mode) + # flush and clear everything for the new "transaction" + self.env.invalidate_all() + + self.env.registry.enter_test_mode(self.cr) + with self.env.registry.cursor() as test_cr: + test_env = self.env(cr=test_cr) + with freeze_time(datetime.now() + timedelta(seconds=(limit_time + 100))): + # Call to fetch_transaction should be started by the cron when the time limit is exceeded and still in processing + self.euro_bank_journal.with_env(test_env)._cron_fetch_waiting_online_transactions() + patched_refresh.assert_not_called() + patched_transactions.assert_called_once() + + @patch('odoo.addons.odex30_account_online_sync.models.account_online.requests') + def test_delete_with_redirect_error(self, patched_request): + # Use case being tested: call delete on a record, first call returns token expired exception + # Which trigger a call to get a new token, which result in a 104 user_deleted_error, since version 17, + # such error are returned as a OdooFinRedirectException with mode link to reopen the iframe and link with a new + # bank. In our case we don't want that and want to be able to delete the record instead. + # Such use case happen when db_uuid has changed as the check for db_uuid is done after the check for token_validity + account_online_link = self.env['account.online.link'].create({ + 'name': 'Test Delete', + 'client_id': 'client_id_test', + 'refresh_token': 'refresh_token', + 'access_token': 'access_token', + }) + first_call = self._mock_odoofin_error_response(code=102) + second_call = self._mock_odoofin_error_response(code=300, data={'mode': 'link'}) + patched_request.post.side_effect = [first_call, second_call] + nb_connections = len(self.env['account.online.link'].search([])) + # Try to delete record + account_online_link.unlink() + # Record should be deleted + self.assertEqual(len(self.env['account.online.link'].search([])), nb_connections - 1) + + @patch('odoo.addons.odex30_account_online_sync.models.account_online.requests') + def test_redirect_mode_link(self, patched_request): + # Use case being tested: Call to open the iframe which result in a OdoofinRedirectException in link mode + # This should not trigger a traceback but delete the current online.link and reopen the iframe + account_online_link = self.env['account.online.link'].create({ + 'name': 'Test Delete', + 'client_id': 'client_id_test', + 'refresh_token': 'refresh_token', + 'access_token': 'access_token', + }) + link_id = account_online_link.id + first_call = self._mock_odoofin_error_response(code=300, data={'mode': 'link'}) + second_call = self._mock_odoofin_response(data={'delete': True}) + patched_request.post.side_effect = [first_call, second_call] + # Try to open iframe with broken connection + action = account_online_link.action_new_synchronization() + # Iframe should open in mode link and with a different record (old one should have been deleted) + self.assertEqual(action['params']['mode'], 'link') + self.assertNotEqual(action['id'], link_id) + self.assertEqual(len(self.env['account.online.link'].search([('id', '=', link_id)])), 0) + + @patch("odoo.addons.odex30_account_online_sync.models.account_online.AccountOnlineLink._update_connection_status", return_value={}) + def test_assign_journal_with_currency_on_account_online_account(self, patched_update_connection_status): + self.env['account.move'].create([ + { + 'move_type': 'entry', + 'date': fields.Date.from_string('2025-06-25'), + 'journal_id': self.bank_journal.id, + 'invoice_line_ids': [ + Command.create({ + 'name': 'a line', + 'account_id': self.bank_account_id.id, + 'debit': 100, + 'currency_id': self.company_data['currency'].id, + }), + Command.create({ + 'name': 'another line', + 'account_id': self.company_data['default_account_expense'].id, + 'credit': 100, + 'currency_id': self.company_data['currency'].id, + }), + ], + }, + { + 'move_type': 'entry', + 'date': fields.Date.from_string('2025-06-26'), + 'journal_id': self.bank_journal.id, + 'invoice_line_ids': [ + Command.create({ + 'name': 'a line', + 'account_id': self.bank_account_id.id, + 'debit': 220, + 'currency_id': self.company_data['currency'].id, + }), + Command.create({ + 'name': 'another line', + 'account_id': self.company_data['default_account_expense'].id, + 'credit': 220, + 'currency_id': self.company_data['currency'].id, + }), + ], + }, + ]) + + self.account_online_account.currency_id = self.company_data['currency'].id + self.account_online_account.with_context(active_id=self.bank_journal.id, active_model='account.journal')._assign_journal() + self.assertEqual( + self.bank_journal.currency_id.id, + self.company_data['currency'].id, + ) + self.assertEqual( + self.bank_journal.default_account_id.currency_id.id, + self.company_data['currency'].id, + ) + + @patch("odoo.addons.odex30_account_online_sync.models.account_online.AccountOnlineLink._update_connection_status", return_value={}) + def test_set_currency_on_journal_when_existing_currencies_on_move_lines(self, patched_update_connection_status): + bank_account_id = self.env['account.account'].create({ + 'name': 'Bank Account', + 'account_type': 'asset_cash', + 'code': self.env['account.account']._search_new_account_code('BNK100'), + }) + bank_journal = self.env['account.journal'].create({ + 'name': 'A bank journal', + 'default_account_id': bank_account_id.id, + 'type': 'bank', + 'code': self.env['account.journal'].get_next_bank_cash_default_code('bank', self.company_data['company']), + }) + + self.env['account.move'].create([ + { + 'move_type': 'entry', + 'date': fields.Date.from_string('2025-06-25'), + 'journal_id': bank_journal.id, + 'invoice_line_ids': [ + Command.create({ + 'name': 'a line', + 'account_id': bank_account_id.id, + 'debit': 100, + 'currency_id': self.other_currency.id, + }), + Command.create({ + 'name': 'another line', + 'account_id': self.company_data['default_account_expense'].id, + 'credit': 100, + 'currency_id': self.other_currency.id, + }), + ], + }, + { + 'move_type': 'entry', + 'date': fields.Date.from_string('2025-06-26'), + 'journal_id': bank_journal.id, + 'invoice_line_ids': [ + Command.create({ + 'name': 'a line', + 'account_id': bank_account_id.id, + 'debit': 220, + 'currency_id': self.company_data['currency'].id, + }), + Command.create({ + 'name': 'another line', + 'account_id': self.company_data['default_account_expense'].id, + 'credit': 220, + 'currency_id': self.company_data['currency'].id, + }), + ], + }, + ]) + + self.account_online_account.currency_id = self.company_data['currency'].id + self.account_online_account.with_context(active_id=bank_journal.id, active_model='account.journal')._assign_journal() + + # Silently ignore the error and don't set currency on the journal and on the account + self.assertEqual(bank_journal.currency_id.id, False) + self.assertEqual(bank_journal.default_account_id.currency_id.id, False) diff --git a/dev_odex30_accounting/odex30_account_online_sync/tests/test_online_sync_branch_companies.py b/dev_odex30_accounting/odex30_account_online_sync/tests/test_online_sync_branch_companies.py new file mode 100644 index 0000000..16cb0ef --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/tests/test_online_sync_branch_companies.py @@ -0,0 +1,86 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.addons.odex30_account_online_sync.tests.common import AccountOnlineSynchronizationCommon +from odoo.tests import tagged + + +@tagged('post_install', '-at_install') +class TestSynchInBranches(AccountOnlineSynchronizationCommon): + + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.mother_company = cls.env['res.company'].create({'name': 'Mother company 2000'}) + cls.branch_company = cls.env['res.company'].create({'name': 'Branch company', 'parent_id': cls.mother_company.id}) + + cls.mother_bank_journal = cls.env['account.journal'].create({ + 'name': 'Mother Bank Journal', + 'type': 'bank', + 'code': 'MBJ', + 'company_id': cls.mother_company.id, + }) + cls.mother_account_online_link = cls.env['account.online.link'].create({ + 'name': 'Test Bank', + 'client_id': 'client_id_1', + 'refresh_token': 'refresh_token', + 'access_token': 'access_token', + 'company_id': cls.mother_company.id, + }) + + def test_show_sync_actions(self): + """We test if the sync actions are correctly displayed based on the selected and enabled companies. + + Let's have company A with an online link, and a branch of that company: company B. + + - If we only have company A enabled and selected, the sync actions should be shown. + - If company A and B are enabled, no matter which company is selected, the sync actions should be shown. + - If we only have company B enabled and selected, the sync actions should be hidden. + """ + self.assertTrue( + self.mother_account_online_link + .with_context(allowed_company_ids=(self.mother_company)._ids) + .with_company(self.mother_company) + .show_sync_actions + ) + + self.assertTrue( + self.mother_account_online_link + .with_context(allowed_company_ids=(self.branch_company + self.mother_company)._ids) + .with_company(self.mother_company) + .show_sync_actions + ) + + self.assertTrue( + self.mother_account_online_link + .with_context(allowed_company_ids=(self.branch_company + self.mother_company)._ids) + .with_company(self.branch_company) + .show_sync_actions + ) + + self.assertFalse( + self.mother_account_online_link + .with_context(allowed_company_ids=(self.branch_company)._ids) + .with_company(self.branch_company) + .show_sync_actions + ) + + def test_show_bank_connect(self): + """We test if the 'connect' bank button appears on the journal on the dashboard given the selected company. + + Let's have company A with an bank journal, and a branch of that company: company B. + + - On the dashboard of company A, the connect bank button should appear on the journal. + - On the dashboard of company B, the connect bank button should not appear on the journal, even with company A enabled. + """ + dashboard_data = self.mother_bank_journal\ + .with_context(allowed_company_ids=(self.mother_company)._ids)\ + .with_company(self.mother_company)\ + ._get_journal_dashboard_data_batched() + self.assertTrue(dashboard_data[self.mother_bank_journal.id].get('display_connect_bank_in_dashboard')) + + dashboard_data = self.mother_bank_journal\ + .with_context(allowed_company_ids=(self.branch_company + self.mother_company)._ids)\ + .with_company(self.branch_company)\ + ._get_journal_dashboard_data_batched() + self.assertFalse(dashboard_data[self.mother_bank_journal.id].get('display_connect_bank_in_dashboard')) diff --git a/dev_odex30_accounting/odex30_account_online_sync/tests/test_online_sync_creation_statement.py b/dev_odex30_accounting/odex30_account_online_sync/tests/test_online_sync_creation_statement.py new file mode 100644 index 0000000..a68e1da --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/tests/test_online_sync_creation_statement.py @@ -0,0 +1,374 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from unittest.mock import MagicMock, patch + +from odoo.addons.base.models.res_bank import sanitize_account_number +from odoo.addons.odex30_account_online_sync.tests.common import AccountOnlineSynchronizationCommon +from odoo.exceptions import RedirectWarning +from odoo.tests import tagged +from odoo import fields, Command + + +@tagged('post_install', '-at_install') +class TestSynchStatementCreation(AccountOnlineSynchronizationCommon): + + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.account = cls.env['account.account'].create({ + 'name': 'Fixed Asset Account', + 'code': 'AA', + 'account_type': 'asset_fixed', + }) + + def reconcile_st_lines(self, st_lines): + for line in st_lines: + wizard = self.env['bank.rec.widget'].with_context(default_st_line_id=line.id).new({}) + line = wizard.line_ids.filtered(lambda x: x.flag == 'auto_balance') + wizard._js_action_mount_line_in_edit(line.index) + line.name = "toto" + wizard._line_value_changed_name(line) + line.account_id = self.account + wizard._line_value_changed_account_id(line) + wizard._action_validate() + + # Tests + def test_creation_initial_sync_statement(self): + transactions = self._create_online_transactions(['2016-01-01', '2016-01-03']) + self.account_online_account.balance = 1000 + self.BankStatementLine._online_sync_bank_statement(transactions, self.account_online_account) + # Since ending balance is 1000$ and we only have 20$ of transactions and that it is the first statement + # it should create a statement before this one with the initial statement line + created_st_lines = self.BankStatementLine.search([('journal_id', '=', self.euro_bank_journal.id)], order='internal_index asc') + self.assertEqual(len(created_st_lines), 3, 'Should have created an initial bank statement line and two for the synchronization') + transactions = self._create_online_transactions(['2016-01-05']) + self.account_online_account.balance = 2000 + self.BankStatementLine._online_sync_bank_statement(transactions, self.account_online_account) + created_st_lines = self.BankStatementLine.search([('journal_id', '=', self.euro_bank_journal.id)], order='internal_index asc') + self.assertRecordValues( + created_st_lines, + [ + {'date': fields.Date.from_string('2016-01-01'), 'amount': 980.0}, + {'date': fields.Date.from_string('2016-01-01'), 'amount': 10.0}, + {'date': fields.Date.from_string('2016-01-03'), 'amount': 10.0}, + {'date': fields.Date.from_string('2016-01-05'), 'amount': 10.0}, + ] + ) + + def test_creation_initial_sync_statement_bis(self): + transactions = self._create_online_transactions(['2016-01-01', '2016-01-03']) + self.account_online_account.balance = 20 + self.BankStatementLine._online_sync_bank_statement(transactions, self.account_online_account) + # Since ending balance is 20$ and we only have 20$ of transactions and that it is the first statement + # it should NOT create a initial statement before this one + created_st_lines = self.BankStatementLine.search([('journal_id', '=', self.euro_bank_journal.id)], order='internal_index asc') + self.assertRecordValues( + created_st_lines, + [ + {'date': fields.Date.from_string('2016-01-01'), 'amount': 10.0}, + {'date': fields.Date.from_string('2016-01-03'), 'amount': 10.0}, + ] + ) + + def test_creation_initial_sync_statement_invert_sign(self): + self.account_online_account.balance = -20 + self.account_online_account.inverse_transaction_sign = True + self.account_online_account.inverse_balance_sign = True + transactions = self._create_online_transactions(['2016-01-01', '2016-01-03']) + self.BankStatementLine._online_sync_bank_statement(transactions, self.account_online_account) + # Since ending balance is 1000$ and we only have 20$ of transactions and that it is the first statement + # it should create a statement before this one with the initial statement line + created_st_lines = self.BankStatementLine.search([('journal_id', '=', self.euro_bank_journal.id)], order='internal_index asc') + self.assertEqual(len(created_st_lines), 2, 'Should have created two bank statement lines for the synchronization') + transactions = self._create_online_transactions(['2016-01-05']) + self.account_online_account.balance = -30 + self.BankStatementLine._online_sync_bank_statement(transactions, self.account_online_account) + created_st_lines = self.BankStatementLine.search([('journal_id', '=', self.euro_bank_journal.id)], order='internal_index asc') + self.assertRecordValues( + created_st_lines, + [ + {'date': fields.Date.from_string('2016-01-01'), 'amount': -10.0}, + {'date': fields.Date.from_string('2016-01-03'), 'amount': -10.0}, + {'date': fields.Date.from_string('2016-01-05'), 'amount': -10.0}, + ] + ) + + @patch('odoo.addons.odex30_account_online_sync.models.account_online.AccountOnlineLink._fetch_transactions') + @patch('odoo.addons.odex30_account_online_sync.models.account_online.AccountOnlineLink._update_connection_status') + def test_automatic_journal_assignment(self, patched_update_connection_status, patched_fetch_transactions): + def create_online_account(name, link_id, iban, currency_id): + return self.env['account.online.account'].create({ + 'name': name, + 'account_online_link_id': link_id, + 'account_number': iban, + 'currency_id' : currency_id, + }) + + def create_bank_account(account_number, partner_id): + return self.env['res.partner.bank'].create({ + 'acc_number': account_number, + 'partner_id': partner_id, + }) + + def create_journal(name, journal_type, code, currency_id=False, bank_account_id=False): + return self.env['account.journal'].create({ + 'name': name, + 'type': journal_type, + 'code': code, + 'currency_id': currency_id, + 'bank_account_id': bank_account_id, + }) + + bank_account_1 = create_bank_account('BE48485444456727', self.company_data['company'].partner_id.id) + bank_account_2 = create_bank_account('BE23798242487491', self.company_data['company'].partner_id.id) + + bank_journal_with_account_gol = create_journal('Bank with account', 'bank', 'BJWA1', self.other_currency.id) + bank_journal_with_account_usd = create_journal('Bank with account USD', 'bank', 'BJWA3', self.env.ref('base.USD').id, bank_account_2.id) + + online_account_1 = create_online_account('OnlineAccount1', self.account_online_link.id, 'BE48485444456727', self.other_currency.id) + online_account_2 = create_online_account('OnlineAccount2', self.account_online_link.id, 'BE61954856342317', self.other_currency.id) + online_account_3 = create_online_account('OnlineAccount3', self.account_online_link.id, 'BE23798242487495', self.other_currency.id) + + patched_fetch_transactions.return_value = True + patched_update_connection_status.return_value = { + 'consent_expiring_date': None, + 'is_payment_enabled': False, + 'is_payment_activated': False, + } + + account_link_journal_wizard = self.env['account.bank.selection'].create({'account_online_link_id': self.account_online_link.id}) + account_link_journal_wizard.with_context(active_model='account.journal', active_id=bank_journal_with_account_gol.id).sync_now() + self.assertEqual( + online_account_1.id, bank_journal_with_account_gol.account_online_account_id.id, + "The wizard should have linked the online account to the journal with the same account." + ) + self.assertEqual(bank_journal_with_account_gol.bank_account_id, bank_account_1, "Account should be set on the journal") + + # Test with no context present, should create a new journal + previous_number = self.env['account.journal'].search_count([]) + account_link_journal_wizard.selected_account = online_account_2 + account_link_journal_wizard.sync_now() + actual_number = self.env['account.journal'].search_count([]) + self.assertEqual(actual_number, previous_number+1, "should have created a new journal") + self.assertEqual(online_account_2.journal_ids.currency_id, self.other_currency) + self.assertEqual(online_account_2.journal_ids.bank_account_id.sanitized_acc_number, sanitize_account_number('BE61954856342317')) + + # Test assigning to a journal in another currency + account_link_journal_wizard.selected_account = online_account_3 + account_link_journal_wizard.with_context(active_model='account.journal', active_id=bank_journal_with_account_usd.id).sync_now() + self.assertEqual(online_account_3.id, bank_journal_with_account_usd.account_online_account_id.id) + self.assertEqual(bank_journal_with_account_usd.bank_account_id, bank_account_2, "Bank Account should not have changed") + self.assertEqual(bank_journal_with_account_usd.currency_id, self.other_currency, "Currency should have changed") + + @patch('odoo.addons.odex30_account_online_sync.models.account_online.AccountOnlineLink._fetch_odoo_fin') + def test_fetch_transaction_date_start(self, patched_fetch): + """ This test verifies that the start_date params used when fetching transaction is correct """ + patched_fetch.return_value = {'transactions': []} + # Since no transactions exists in db, we should fetch transactions without a starting_date + self.account_online_account._retrieve_transactions() + data = { + 'start_date': False, + 'account_id': False, + 'last_transaction_identifier': False, + 'currency_code': 'EUR', + 'provider_data': False, + 'account_data': False, + 'include_pendings': False, + 'include_foreign_currency': True, + } + patched_fetch.assert_called_with('/proxy/v1/transactions', data=data) + + # No transaction exists in db but we have a value for last_sync on the online_account, we should use that date + self.account_online_account.last_sync = '2020-03-04' + data['start_date'] = '2020-03-04' + self.account_online_account._retrieve_transactions() + patched_fetch.assert_called_with('/proxy/v1/transactions', data=data) + + # We have transactions, we should use the date of the latest one instead of the last_sync date + transactions = self._create_online_transactions(['2016-01-01', '2016-01-03']) + self.BankStatementLine._online_sync_bank_statement(transactions, self.account_online_account) + self.account_online_account.last_sync = '2020-03-04' + data['start_date'] = '2016-01-03' + data['last_transaction_identifier'] = '2' + self.account_online_account._retrieve_transactions() + patched_fetch.assert_called_with('/proxy/v1/transactions', data=data) + + def test_multiple_transaction_identifier_fetched(self): + # Ensure that if we receive twice the same transaction within the same call, it won't be created twice + transactions = self._create_online_transactions(['2016-01-01', '2016-01-03']) + # Add first transactions to the list again + transactions.append(transactions[0]) + self.BankStatementLine._online_sync_bank_statement(transactions, self.account_online_account) + bnk_stmt_lines = self.BankStatementLine.search([('online_transaction_identifier', '!=', False), ('journal_id', '=', self.euro_bank_journal.id)]) + self.assertEqual(len(bnk_stmt_lines), 2, 'Should only have created two lines') + + @patch('odoo.addons.odex30_account_online_sync.models.account_online.AccountOnlineLink._fetch_odoo_fin') + def test_fetch_transactions_reauth(self, patched_refresh): + patched_refresh.side_effect = [ + { + 'success': False, + 'code': 300, + 'data': {'mode': 'updateCredentials'}, + }, + { + 'access_token': 'open_sesame', + }, + ] + self.account_online_account.account_online_link_id.state = 'connected' + res = self.account_online_account.account_online_link_id._fetch_transactions() + self.assertTrue('account_online_identifier' in res.get('params', {}).get('includeParam', {})) + + def test_duplicate_transaction_date_amount_account(self): + """ This test verifies that the duplicate transaction wizard is detects transactions with + same date, amount, account_number and currency + """ + # Create 2 groups of respectively 2 and 3 duplicate transactions. We create one transaction the day before so the opening statement does not interfere with the test. + transactions = self._create_online_transactions([ + '2024-01-01', + '2024-01-02', '2024-01-02', + '2024-01-03', '2024-01-03', '2024-01-03', + ]) + bsls = self.BankStatementLine._online_sync_bank_statement(transactions, self.account_online_account) + self.env.flush_all() # _get_duplicate_transactions make sql request, must write to db + duplicate_transactions = self.euro_bank_journal._get_duplicate_transactions( + fields.Date.to_date('2000-01-01') + ) + group_1 = bsls.filtered(lambda bsl: bsl.date == fields.Date.from_string('2024-01-02')).ids + group_2 = bsls.filtered(lambda bsl: bsl.date == fields.Date.from_string('2024-01-03')).ids + + self.assertEqual(duplicate_transactions, [group_1, group_2]) + + # check has_duplicate_transactions + has_duplicate_transactions = self.euro_bank_journal._has_duplicate_transactions( + fields.Date.to_date('2000-01-01') + ) + self.assertTrue(has_duplicate_transactions is True) # explicit check on bool type + + def test_duplicate_transaction_online_transaction_identifier(self): + """ This test verifies that the duplicate transaction wizard is detects transactions with + same online_transaction_identifier + """ + # Create transactions + transactions = self._create_online_transactions([ + '2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05' + ]) + bsls = self.BankStatementLine._online_sync_bank_statement(transactions, self.account_online_account) + + group_1, group_2 = [], [] + for bsl in bsls: + # have to update the online_transaction_identifier after to force duplicates + if bsl.payment_ref in ('transaction_1', 'transaction_2'): + group_1.append(bsl.id) + bsl.online_transaction_identifier = 'same_oti_1' + if bsl.payment_ref in ('transaction_3, transaction_4, transaction_5'): + group_2.append(bsl.id) + bsl.online_transaction_identifier = 'same_oti_2' + + self.env.flush_all() # _get_duplicate_transactions make sql request, must write to db + duplicate_transactions = self.euro_bank_journal._get_duplicate_transactions( + fields.Date.to_date('2000-01-01') + ) + self.assertEqual(duplicate_transactions, [group_1, group_2]) + + @patch('odoo.addons.odex30_account_online_sync.models.account_online.requests') + def test_fetch_receive_error_message(self, patched_request): + # We want to test that when we receive an error, a redirectWarning with the correct parameter is thrown + # However the method _log_information that we need to test for that is performing a rollback as it needs + # to save the message error on the record as well (so it rollback, save message, commit, raise error). + # So in order to test the method, we need to use a "test cursor". + mock_response = MagicMock() + mock_response.status_code = 200 + mock_response.json.return_value = { + 'error': { + 'code': 400, + 'message': 'Shit Happened', + 'data': { + 'exception_type': 'random', + 'message': 'This kind of things can happen.', + 'error_reference': 'abc123', + 'provider_type': 'theonlyone', + 'redirect_warning_url': 'odoo_support', + }, + }, + } + patched_request.post.return_value = mock_response + + generated_url = 'https://www.odoo.com/help?stage=bank_sync&summary=Bank+sync+error+ref%3A+abc123+-+Provider%3A+theonlyone+-+Client+ID%3A+client_id_1&description=ClientID%3A+client_id_1%0AInstitution%3A+Test+Bank%0AError+Reference%3A+abc123%0AError+Message%3A+This+kind+of+things+can+happen.%0A' + return_act_url = { + 'type': 'ir.actions.act_url', + 'url': generated_url + } + body_generated_url = generated_url.replace('&', '&') #in post_message, & has been escaped to & + message_body = f"""

    This kind of things can happen. + +If you've already opened a ticket for this issue, don't report it again: a support agent will contact you shortly.
    You can contact Odoo support Here

    """ + + # flush and clear everything for the new "transaction" + self.env.invalidate_all() + try: + self.env.registry.enter_test_mode(self.cr) + with self.env.registry.cursor() as test_cr: + test_env = self.env(cr=test_cr) + test_link_account = self.account_online_link.with_env(test_env) + test_link_account.state = 'connected' + + # this hand-written self.assertRaises() does not roll back self.cr, + # which is necessary below to inspect the message being posted + try: + test_link_account._fetch_odoo_fin('/testthisurl') + except RedirectWarning as exception: + self.assertEqual(exception.args[0], "This kind of things can happen.\n\nIf you've already opened a ticket for this issue, don't report it again: a support agent will contact you shortly.") + self.assertEqual(exception.args[1], return_act_url) + self.assertEqual(exception.args[2], 'Report issue') + else: + self.fail("Expected RedirectWarning not raised") + self.assertEqual(test_link_account.message_ids[0].body, message_body) + finally: + self.env.registry.leave_test_mode() + + def test_account_online_link_having_journal_ids(self): + """ This test verifies that the account online link object + has all the journal in the field journal_ids. + It's important to handle these journals because we need + them to add the consent expiring date. + """ + # Create a bank sync connection having 2 online accounts (with one journal connected for each account) + online_link = self.env['account.online.link'].create({ + 'name': 'My New Bank connection', + }) + online_accounts = self.env['account.online.account'].create([ + { + 'name': 'Account 1', + 'account_online_link_id': online_link.id, + 'journal_ids': [Command.create({ + 'name': 'Account 1', + 'code': 'BK1', + 'type': 'bank', + })], + }, + { + 'name': 'Account 2', + 'account_online_link_id': online_link.id, + 'journal_ids': [Command.create({ + 'name': 'Account 2', + 'code': 'BK2', + 'type': 'bank', + })], + }, + ]) + self.assertEqual(online_link.account_online_account_ids, online_accounts) + self.assertEqual(len(online_link.journal_ids), 2) # Our online link connections should have 2 journals. + + def test_transaction_details_json_compatibility_from_html(self): + """ This test checks that, after being imported from the transient model + the records of account.bank.statement.line will have the + 'transaction_details' field able to be decoded to a JSON, + i.e. it is not encapsulated in

    tags. + """ + transaction = self._create_one_online_transaction() + transaction['transaction_details'] = '{\n "account_id": "1",\n "status": "posted"\n}' + transient_transaction = self.env['account.bank.statement.line.transient'].create(transaction) + transaction_details = transient_transaction.read(fields=['transaction_details'], load=None)[0]['transaction_details'] + self.assertFalse(transaction_details.startswith('

    '), 'Transient transaction details should not start with

    when read.') + self.assertFalse(transaction_details.endswith('

    '), 'Transient transaction details should not end with

    when read.') diff --git a/dev_odex30_accounting/odex30_account_online_sync/views/account_bank_statement_view.xml b/dev_odex30_accounting/odex30_account_online_sync/views/account_bank_statement_view.xml new file mode 100644 index 0000000..678dc78 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/views/account_bank_statement_view.xml @@ -0,0 +1,27 @@ + + + + + bank.statement.line.list.inherit + account.bank.statement.line + + + + + + + + + + + + account.bank.statement.line.form.bank_rec_widget.inherit + account.bank.statement.line + primary + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_online_sync/views/account_journal_dashboard_view.xml b/dev_odex30_accounting/odex30_account_online_sync/views/account_journal_dashboard_view.xml new file mode 100644 index 0000000..ebe51e5 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/views/account_journal_dashboard_view.xml @@ -0,0 +1,86 @@ + + + + + account.journal.dashboard.inherit.online.sync + account.journal + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + +
    +
    + + + + + + + account.group_account_manager + + dashboard.display_connect_bank_in_dashboard ? 'col-4' : 'col-6' + + + + account.group_account_manager + + dashboard.display_connect_bank_in_dashboard ? 'col-4' : 'col-6' + + + + + + + + + + + + + + + + + +
    +
    +
    +
    diff --git a/dev_odex30_accounting/odex30_account_online_sync/views/account_journal_view.xml b/dev_odex30_accounting/odex30_account_online_sync/views/account_journal_view.xml new file mode 100644 index 0000000..4e356f0 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/views/account_journal_view.xml @@ -0,0 +1,22 @@ + + + + + account.journal.form.online.sync + account.journal + + + + + + +
    + + + + + + diff --git a/dev_odex30_accounting/odex30_account_online_sync/views/account_online_sync_portal_templates.xml b/dev_odex30_accounting/odex30_account_online_sync/views/account_online_sync_portal_templates.xml new file mode 100644 index 0000000..c0cd687 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/views/account_online_sync_portal_templates.xml @@ -0,0 +1,59 @@ + + + + diff --git a/dev_odex30_accounting/odex30_account_online_sync/views/account_online_sync_views.xml b/dev_odex30_accounting/odex30_account_online_sync/views/account_online_sync_views.xml new file mode 100644 index 0000000..e43ecef --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/views/account_online_sync_views.xml @@ -0,0 +1,126 @@ + + + + + account.online.link.form + account.online.link + +
    +
    +
    + +
    +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    diff --git a/dev_odex30_accounting/odex30_account_online_sync/wizard/account_journal_missing_transactions.py b/dev_odex30_accounting/odex30_account_online_sync/wizard/account_journal_missing_transactions.py new file mode 100644 index 0000000..f6e0c2c --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/wizard/account_journal_missing_transactions.py @@ -0,0 +1,78 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from dateutil.relativedelta import relativedelta + +from odoo import fields, models, _ +from odoo.exceptions import UserError +from odoo.tools import format_date + + +class AccountMissingTransaction(models.TransientModel): + _name = 'account.missing.transaction.wizard' + _description = 'Wizard for missing transactions' + + date = fields.Date( + string="Starting Date", + default=lambda self: fields.Date.today() - relativedelta(months=1), + ) + journal_id = fields.Many2one( + comodel_name='account.journal', + domain="[('type', '=', 'bank'), ('account_online_account_id', '!=', 'False'), ('account_online_link_state', '=', 'connected')]" + ) + + def _get_manual_bank_statement_lines(self): + return self.env['account.bank.statement.line'].search( + domain=[ + ('date', '>=', self.date), + ('journal_id', '=', self.journal_id.id), + ('online_transaction_identifier', '=', False), + ], + ) + + def action_fetch_missing_transaction(self): + self.ensure_one() + + if not self.journal_id: + raise UserError(_("You have to select one journal to continue.")) + + if not self.date: + raise UserError(_("Please enter a valid Starting Date to continue.")) + + if self.journal_id.account_online_link_state != 'connected': + raise UserError(_("You can't find missing transactions for a journal that isn't connected.")) + + fetched_transactions = self.journal_id.account_online_account_id._retrieve_transactions(date=self.date, include_pendings=True) + transactions = fetched_transactions.get('transactions') or [] + pendings = fetched_transactions.get('pendings') or [] + + pendings = [{**pending, 'state': 'pending'} for pending in pendings] + filtered_transactions = self.journal_id.account_online_account_id._get_filtered_transactions(transactions + pendings) + + transient_transactions_ids = self.env['account.bank.statement.line.transient'].create(filtered_transactions) + + return { + 'name': _("Missing and Pending Transactions"), + 'type': 'ir.actions.act_window', + 'res_model': 'account.bank.statement.line.transient', + 'view_mode': 'list', + 'views': [(False, 'list')], + 'domain': [('id', 'in', transient_transactions_ids.ids)], + 'context': { + 'has_manual_entries': bool(self._get_manual_bank_statement_lines()), + 'is_fetch_before_creation': self.date < self.journal_id.account_online_link_id.create_date.date(), + 'account_online_link_create_date': format_date(self.env, self.journal_id.account_online_link_id.create_date), + 'search_default_filter_posted': bool([transaction for transaction in filtered_transactions if transaction.get('state') != 'pending']), # Activate this default filter only if we have posted transactions + }, + } + + def action_open_manual_bank_statement_lines(self): + self.ensure_one() + bank_statement_lines = self._get_manual_bank_statement_lines() + + return { + 'name': _("Manual Bank Statement Lines"), + 'type': 'ir.actions.act_window', + 'res_model': 'account.bank.statement.line', + 'views': [(False, 'list'), (False, 'form')], + 'domain': [('id', 'in', bank_statement_lines.ids)], + } diff --git a/dev_odex30_accounting/odex30_account_online_sync/wizard/account_journal_missing_transactions.xml b/dev_odex30_accounting/odex30_account_online_sync/wizard/account_journal_missing_transactions.xml new file mode 100644 index 0000000..5d85de2 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_online_sync/wizard/account_journal_missing_transactions.xml @@ -0,0 +1,22 @@ + + + + account.missing.transaction.wizard.form + account.missing.transaction.wizard + +
    +

    + Choose a date and a journal from which you want to fetch transactions +

    + + + + +
    +
    +
    +
    +
    +
    diff --git a/dev_odex30_accounting/odex30_account_reports/__init__.py b/dev_odex30_accounting/odex30_account_reports/__init__.py new file mode 100644 index 0000000..f0d2677 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/__init__.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- + +from . import models +from . import controllers +from . import wizard + + +def set_periodicity_journal_on_companies(env): + for company in env['res.company'].search([]): + company.account_tax_periodicity_journal_id = company._get_default_misc_journal() + company.account_tax_periodicity_journal_id.show_on_dashboard = True + company._initiate_account_onboardings() diff --git a/dev_odex30_accounting/odex30_account_reports/__manifest__.py b/dev_odex30_accounting/odex30_account_reports/__manifest__.py new file mode 100644 index 0000000..881f1d9 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/__manifest__.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +{ + 'name' : 'Accounting Reports', + 'summary': 'View and create reports', + 'category': 'Odex30-Accounting/Odex30-Accounting', + 'author': "Expert Co. Ltd.", + 'website': "http://www.exp-sa.com", + 'description': """ +Accounting Reports +================== + """, + 'depends': ['account'], + 'data': [ + 'security/ir.model.access.csv', + 'data/pdf_export_templates.xml', + 'data/customer_reports_pdf_export_templates.xml', + 'data/balance_sheet.xml', + 'data/cash_flow_report.xml', + 'data/executive_summary.xml', + 'data/profit_and_loss.xml', + 'data/bank_reconciliation_report.xml', + 'data/aged_partner_balance.xml', + 'data/general_ledger.xml', + 'data/trial_balance.xml', + 'data/sales_report.xml', + 'data/partner_ledger.xml', + 'data/customer_statement.xml', + 'data/followup_report.xml', + 'data/multicurrency_revaluation_report.xml', + 'data/deferred_reports.xml', + 'data/journal_report.xml', + 'data/generic_tax_report.xml', + 'views/account_report_view.xml', + 'data/account_report_actions.xml', + 'data/report_send_cron.xml', + 'data/menuitems.xml', + 'data/mail_activity_type_data.xml', + 'data/mail_templates.xml', + 'views/account_move_views.xml', + 'views/res_company_views.xml', + 'views/account_journal_dashboard_view.xml', + 'views/mail_activity_views.xml', + 'views/res_config_settings_views.xml', + 'views/res_partner_views.xml', + 'views/report_template.xml', + 'wizard/account_report_send.xml', + 'wizard/multicurrency_revaluation.xml', + 'wizard/report_export_wizard.xml', + 'wizard/account_report_file_download_error_wizard.xml', + 'wizard/fiscal_year.xml', + 'wizard/mail_activity_schedule_views.xml', + 'views/account_activity.xml', + 'views/account_account_views.xml', + 'views/account_tax_views.xml', + ], + 'auto_install': True, + 'installable': True, + 'post_init_hook': 'set_periodicity_journal_on_companies', + 'assets': { + 'odex30_account_reports.assets_pdf_export': [ + ('include', 'web._assets_helpers'), + 'web/static/src/scss/pre_variables.scss', + 'web/static/lib/bootstrap/scss/_variables.scss', + 'web/static/lib/bootstrap/scss/_variables-dark.scss', + 'web/static/lib/bootstrap/scss/_maps.scss', + ('include', 'web._assets_bootstrap_backend'), + 'web/static/fonts/fonts.scss', + 'odex30_account_reports/static/src/scss/**/*', + ], + 'web.report_assets_common': [ + 'odex30_account_reports/static/src/scss/account_pdf_export_template.scss', + ], + + 'web.assets_backend': [ + 'odex30_account_reports/static/src/components/account_report/account_report.xml', # أضف هذا أولاً + 'odex30_account_reports/static/src/components/account_report/account_report.js', + 'odex30_account_reports/static/src/components/**/*.xml', # أضف هذا + 'odex30_account_reports/static/src/components/**/*.js', + 'odex30_account_reports/static/src/js/**/*', + 'odex30_account_reports/static/src/widgets/**/*', + ], + + 'web.assets_web_dark': [ + 'odex30_account_reports/static/src/scss/*.dark.scss', + ], + 'web.qunit_suite_tests': [ + 'odex30_account_reports/static/tests/legacy/*.js', + ], + 'web.assets_unit_tests': [ + 'odex30_account_reports/static/tests/*.js', + 'odex30_account_reports/static/tests/account_report/**/*.js', + ], + 'web.assets_tests': [ + 'odex30_account_reports/static/tests/tours/**/*', + ], + } +} diff --git a/dev_odex30_accounting/odex30_account_reports/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97bbe6b9e95be2aa81d344050e000d0ee76607bd GIT binary patch literal 938 zcmZuvziZn-6uz@;Su~_+QCsj(2&EkivE`;13N@Vq9SR}zhY5yqDAF}PSJs(3If;z} z89HR>(4}O}l%{0u(*MFX0voNJx*5D>>N`0yHtpl|?tAZ^-h1D@`@Xt*3xWK)e9yjN zgnla{k<<;CmH?a~7rEF&O%NF|Z;u!bv z`P{P@eF4VR+|k1%VF`?SxG}eg>LM1%luq#CzMKi8FBKO7Z*9A~BB(4nyxFq-&bxdj z(j~QpQ;%|Fp9aLGAMLgmkS3E3Y4Eo2Z7+IcI}UIA0SW9Q(xQTKmpLrxBmsoE(Op^R zhlKmYwPk&e!_`F(3G-RN?0}La0r%r0=I_gVD$=Nb5M^(Ak&4~=`t^xb=S^za-lw|V z6%A(Xbey^^nmd9ws1ryF26ptU1RLjtr_YNs6ni&INg*g;x%7a{Vi'wKOq3rI@h zUI{6-I?-bZ7x6!uz;4zoqf)Fvy9Ru657Y@7n-9Johvt)!xiK_1F5e8yQfQVYNXyLB zX?9$$jLOwvxjHEChUMMUY-ntbU%ig^(AXLqYa^pDGztU53Jt3tuSqufe+pI5Hp~kN zHGH9_E;34~Mt&f1N8#I`u8j&j>b6H;3KLBA&}0?VM8g;478TJq-r literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/controllers/__init__.py b/dev_odex30_accounting/odex30_account_reports/controllers/__init__.py new file mode 100644 index 0000000..5d4b25d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/controllers/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import main diff --git a/dev_odex30_accounting/odex30_account_reports/controllers/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/controllers/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c52b633b4e5808a5ec1e91e3f7861560fff82ee GIT binary patch literal 294 zcmZ3^%ge<81lK2oW|jl##~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@8G#a- zjJH^F6EpMtG?{KO6fpxuRx*4B>HO8BpOK%Ns-KvXosn2ol$EI;P??;OSd<%3l%JKF zTvDu`pORW(YyhP4^K}g^^dKy-sF6W@VsdhRXaoYbOX{rLFIyv&mLc)fzkUmP~M`6;D2sdhyiK*xbxUMvqJJ}@&fGJfD- PU=+TMUgPl$ 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 M-S58#Ll^J=0IQQz!T', type='http', auth='user') + def download_report_attachments(self, attachments): + attachments.check_access('read') + assert all(attachment.res_id and attachment.res_model == 'res.partner' for attachment in attachments) + if len(attachments) == 1: + headers = _get_headers(attachments.name, attachments.mimetype, attachments.raw) + return request.make_response(attachments.raw, headers) + else: + content = attachments._build_zip_from_attachments() + headers = _get_headers('attachments.zip', 'zip', content) + return request.make_response(content, headers) diff --git a/dev_odex30_accounting/odex30_account_reports/data/account_report_actions.xml b/dev_odex30_accounting/odex30_account_reports/data/account_report_actions.xml new file mode 100644 index 0000000..e6de725 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/account_report_actions.xml @@ -0,0 +1,165 @@ + + + + + + Cash Flow Statement + account_report + + + + + Balance Sheet + account_report + balance-sheet + + + + + Executive Summary + account_report + executive-summary + + + + + Profit and Loss + account_report + profit-and-loss + + + + + Tax Return + account_report + tax-report + + + + + Journal Audit + account_report + journal-report + + + + + General Ledger + account_report + general-ledger + + + + + Unrealized Currency Gains/Losses + account_report + + + + + Aged Receivable + account_report + aged-receivable + + + + + Aged Payable + account_report + aged-payable + + + + + Trial Balance + account_report + trial-balance + + + + + Partner Ledger + account_report + partner-ledger + + + + + Customer Statement + account_report + + + + + EC Sales List + account_report + + + + + Deferred Expense + account_report + deferred-expense + + + + Deferred Revenue + account_report + deferred-revenue + + + + + + + + + + + + + + + + + Create Menu Item + + + code + form + +if records: + action = records._create_menu_item_for_report() + + + + + Accounting Reports + account.report + list,form + + + + + + Horizontal Groups + account.report.horizontal.group + list,form + + + + + Bank Reconciliation + account_report + + + + + Financial Budgets + account.report.budget + list,form + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/aged_partner_balance.xml b/dev_odex30_accounting/odex30_account_reports/data/aged_partner_balance.xml new file mode 100644 index 0000000..9989e42 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/aged_partner_balance.xml @@ -0,0 +1,326 @@ + + + + Aged Receivable + + + + + receivable + never + + selector + today + + + + Invoice Date + invoice_date + date + + + + Amount Currency + amount_currency + + + Currency + currency + string + + + Account + account_name + string + + + At Date + period0 + + + + Period 1 + period1 + + + + Period 2 + period2 + + + + Period 3 + period3 + + + + Period 4 + period4 + + + + Older + period5 + + + + Total + total + + + + + + Aged Receivable + partner_id, id + + + invoice_date + custom + _report_custom_engine_aged_receivable + invoice_date + + + + amount_currency + custom + _report_custom_engine_aged_receivable + amount_currency + + + + _currency_amount_currency + custom + _report_custom_engine_aged_receivable + currency_id + + + currency + custom + _report_custom_engine_aged_receivable + currency + + + + account_name + custom + _report_custom_engine_aged_receivable + account_name + + + + period0 + custom + _report_custom_engine_aged_receivable + period0 + + + + period1 + custom + _report_custom_engine_aged_receivable + period1 + + + + period2 + custom + _report_custom_engine_aged_receivable + period2 + + + + period3 + custom + _report_custom_engine_aged_receivable + period3 + + + + period4 + custom + _report_custom_engine_aged_receivable + period4 + + + + period5 + custom + _report_custom_engine_aged_receivable + period5 + + + + total + custom + _report_custom_engine_aged_receivable + total + + + + + + + + + Aged Payable + + + + + payable + never + + selector + today + + + + Invoice Date + invoice_date + date + + + + Amount Currency + amount_currency + + + Currency + currency + string + + + Account + account_name + string + + + At Date + period0 + + + + Period 1 + period1 + + + + Period 2 + period2 + + + + Period 3 + period3 + + + + Period 4 + period4 + + + + Older + period5 + + + + Total + total + + + + + + Aged Payable + partner_id, id + + + invoice_date + custom + _report_custom_engine_aged_payable + invoice_date + + + + amount_currency + custom + _report_custom_engine_aged_payable + amount_currency + + + + _currency_amount_currency + custom + _report_custom_engine_aged_payable + currency_id + + + currency + custom + _report_custom_engine_aged_payable + currency + + + + account_name + custom + _report_custom_engine_aged_payable + account_name + + + + period0 + custom + _report_custom_engine_aged_payable + period0 + + + + period1 + custom + _report_custom_engine_aged_payable + period1 + + + + period2 + custom + _report_custom_engine_aged_payable + period2 + + + + period3 + custom + _report_custom_engine_aged_payable + period3 + + + + period4 + custom + _report_custom_engine_aged_payable + period4 + + + + period5 + custom + _report_custom_engine_aged_payable + period5 + + + + total + custom + _report_custom_engine_aged_payable + total + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/balance_sheet.xml b/dev_odex30_accounting/odex30_account_reports/data/balance_sheet.xml new file mode 100644 index 0000000..fb5d771 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/balance_sheet.xml @@ -0,0 +1,285 @@ + + + + Balance Sheet + + + + + selector + today + + + + Balance + balance + + + + + ASSETS + 0 + TA + left + CA.balance + FA.balance + PNCA.balance + + + Current Assets + CA + BA.balance + REC.balance + CAS.balance + PRE.balance + + + Bank and Cash Accounts + BA + account_id + + sum([('account_id.account_type', '=', 'asset_cash')]) + + + Receivables + REC + account_id + + sum([('account_id.account_type', '=', 'asset_receivable'), ('account_id.non_trade', '=', False)]) + + + Current Assets + CAS + account_id + + sum(['|', ('account_id.account_type', '=', 'asset_current'), '&', ('account_id.account_type', '=', 'asset_receivable'), ('account_id.non_trade', '=', True)]) + + + Prepayments + PRE + account_id + + sum([('account_id.account_type', '=', 'asset_prepayments')]) + + + + + Plus Fixed Assets + FA + account_id + + sum([('account_id.account_type', '=', 'asset_fixed')]) + + + Plus Non-current Assets + PNCA + account_id + + sum([('account_id.account_type', '=', 'asset_non_current')]) + + + + + LIABILITIES + 0 + L + right + + + balance + aggregation + CL.balance + NL.balance + + + + + + Current Liabilities + CL + + + balance + aggregation + CL1.balance + CL2.balance + + + + + + Current Liabilities + CL1 + account_id + + + + balance + domain + + -sum + + + + + + Payables + CL2 + account_id + + + + balance + domain + + -sum + + + + + + + + Plus Non-current Liabilities + NL + account_id + + + + balance + domain + + -sum + + + + + + + + EQUITY + 0 + EQ + right + UNAFFECTED_EARNINGS.balance + RETAINED_EARNINGS.balance + + + Unallocated Earnings + UNAFFECTED_EARNINGS + CURR_YEAR_EARNINGS.balance + PREV_YEAR_EARNINGS.balance + + + Current Year Unallocated Earnings + CURR_YEAR_EARNINGS + + + + pnl + aggregation + NEP.balance + from_fiscalyear + cross_report + + + alloc + domain + + from_fiscalyear + -sum + + + balance + aggregation + CURR_YEAR_EARNINGS.pnl + CURR_YEAR_EARNINGS.alloc + + + + + Previous Years Unallocated Earnings + PREV_YEAR_EARNINGS + + + allocated_earnings + domain + + -sum + from_beginning + + + balance_domain + domain + + -sum + from_beginning + + + balance + aggregation + PREV_YEAR_EARNINGS.balance_domain + PREV_YEAR_EARNINGS.allocated_earnings - CURR_YEAR_EARNINGS.balance + + + + + + + Retained Earnings + RETAINED_EARNINGS + CURR_RETAINED_EARNINGS.balance + PREV_RETAINED_EARNINGS.balance + + + + + Current Year Retained Earnings + CURR_RETAINED_EARNINGS + account_id + + + + balance + domain + + -sum + from_fiscalyear + + + + + Previous Years Retained Earnings + PREV_RETAINED_EARNINGS + + + total + domain + + -sum + + + balance + aggregation + PREV_RETAINED_EARNINGS.total - CURR_RETAINED_EARNINGS.balance + + + + + + + + + LIABILITIES + EQUITY + 0 + LE + right + + + balance + aggregation + L.balance + EQ.balance + + + + + + OFF BALANCE SHEET ACCOUNTS + 0 + OS + account_id + + + -sum([('account_id.account_type', '=', 'off_balance')]) + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/bank_reconciliation_report.xml b/dev_odex30_accounting/odex30_account_reports/data/bank_reconciliation_report.xml new file mode 100644 index 0000000..bb25524 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/bank_reconciliation_report.xml @@ -0,0 +1,474 @@ + + + + Bank Reconciliation Report + + + + by_default + + today + + + + Date + date + date + + + Label + label + string + + + Amount Currency + amount_currency + monetary + + + Currency + currency + string + + + Amount + amount + monetary + + + + + Balance of Bank + balance_bank + 0 + + + amount + aggregation + last_statement_balance.amount + transaction_without_statement.amount + misc_operations.amount + + + + _currency_amount + custom + _report_custom_engine_forced_currency_amount + amount_currency_id + + + + + Last statement balance + last_statement_balance + + + amount + custom + _report_custom_engine_last_statement_balance_amount + amount + + + + _currency_amount + custom + _report_custom_engine_last_statement_balance_amount + amount_currency_id + + + + + Including Unreconciled Receipts + last_statement_receipts + id + + + + date + custom + _report_custom_engine_unreconciled_last_statement_receipts + date + + + + label + custom + _report_custom_engine_unreconciled_last_statement_receipts + label + + + + amount_currency + custom + _report_custom_engine_unreconciled_last_statement_receipts + amount_currency + + + + _currency_amount_currency + custom + _report_custom_engine_unreconciled_last_statement_receipts + amount_currency_currency_id + + + currency + custom + _report_custom_engine_unreconciled_last_statement_receipts + currency + + + + amount + custom + _report_custom_engine_unreconciled_last_statement_receipts + amount + + + + _currency_amount + custom + _report_custom_engine_unreconciled_last_statement_receipts + amount_currency_id + + + + + Including Unreconciled Payments + last_statement_payments + id + + + + date + custom + _report_custom_engine_unreconciled_last_statement_payments + date + + + + label + custom + _report_custom_engine_unreconciled_last_statement_payments + label + + + + amount_currency + custom + _report_custom_engine_unreconciled_last_statement_payments + amount_currency + + + + _currency_amount_currency + custom + _report_custom_engine_unreconciled_last_statement_payments + amount_currency_currency_id + + + currency + custom + _report_custom_engine_unreconciled_last_statement_payments + currency + + + + amount + custom + _report_custom_engine_unreconciled_last_statement_payments + amount + + + + _currency_amount + custom + _report_custom_engine_unreconciled_last_statement_payments + amount_currency_id + + + + + + + Transactions without statement + transaction_without_statement + + + amount + custom + _report_custom_engine_transaction_without_statement_amount + amount + + + + _currency_amount + custom + _report_custom_engine_transaction_without_statement_amount + amount_currency_id + + + + + Including Unreconciled Receipts + unreconciled_receipt + id + + + + date + custom + _report_custom_engine_unreconciled_receipts + date + + + + label + custom + _report_custom_engine_unreconciled_receipts + label + + + + amount_currency + custom + _report_custom_engine_unreconciled_receipts + amount_currency + + + + _currency_amount_currency + custom + _report_custom_engine_unreconciled_receipts + amount_currency_currency_id + + + currency + custom + _report_custom_engine_unreconciled_receipts + currency + + + + amount + custom + _report_custom_engine_unreconciled_receipts + amount + + + + _currency_amount + custom + _report_custom_engine_unreconciled_receipts + amount_currency_id + + + + + Including Unreconciled Payments + unreconciled_payments + id + + + + date + custom + _report_custom_engine_unreconciled_payments + date + + + + label + custom + _report_custom_engine_unreconciled_payments + label + + + + amount_currency + custom + _report_custom_engine_unreconciled_payments + amount_currency + + + + _currency_amount_currency + custom + _report_custom_engine_unreconciled_payments + amount_currency_currency_id + + + currency + custom + _report_custom_engine_unreconciled_payments + currency + + + + amount + custom + _report_custom_engine_unreconciled_payments + amount + + + + _currency_amount + custom + _report_custom_engine_unreconciled_payments + amount_currency_id + + + + + + + Misc. operations + misc_operations + + + amount + custom + _report_custom_engine_misc_operations + amount + + + + _currency_amount + custom + _report_custom_engine_misc_operations + amount_currency_id + + + + + + + Outstanding Receipts/Payments + 0 + + + amount + aggregation + outstanding_receipts.amount + outstanding_payments.amount + + + + _currency_amount + custom + _report_custom_engine_forced_currency_amount + amount_currency_id + + + + + (+) Outstanding Receipts + outstanding_receipts + id + + + + date + custom + _report_custom_engine_outstanding_receipts + date + + + + label + custom + _report_custom_engine_outstanding_receipts + label + + + + amount_currency + custom + _report_custom_engine_outstanding_receipts + amount_currency + + + + _currency_amount_currency + custom + _report_custom_engine_outstanding_receipts + amount_currency_currency_id + + + currency + custom + _report_custom_engine_outstanding_receipts + currency + + + + amount + custom + _report_custom_engine_outstanding_receipts + amount + + + + _currency_amount + custom + _report_custom_engine_outstanding_receipts + amount_currency_id + + + + + (-) Outstanding Payments + outstanding_payments + id + + + + date + custom + _report_custom_engine_outstanding_payments + date + + + + label + custom + _report_custom_engine_outstanding_payments + label + + + + amount_currency + custom + _report_custom_engine_outstanding_payments + amount_currency + + + + _currency_amount_currency + custom + _report_custom_engine_outstanding_payments + amount_currency_currency_id + + + currency + custom + _report_custom_engine_outstanding_payments + currency + + + + amount + custom + _report_custom_engine_outstanding_payments + amount + + + + _currency_amount + custom + _report_custom_engine_outstanding_payments + amount_currency_id + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/cash_flow_report.xml b/dev_odex30_accounting/odex30_account_reports/data/cash_flow_report.xml new file mode 100644 index 0000000..6179612 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/cash_flow_report.xml @@ -0,0 +1,19 @@ + + + + Cash Flow Statement + + + + + selector + current + + + + Balance + balance + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/customer_reports_pdf_export_templates.xml b/dev_odex30_accounting/odex30_account_reports/data/customer_reports_pdf_export_templates.xml new file mode 100644 index 0000000..31c2f27 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/customer_reports_pdf_export_templates.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/customer_statement.xml b/dev_odex30_accounting/odex30_account_reports/data/customer_statement.xml new file mode 100644 index 0000000..2ef481a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/customer_statement.xml @@ -0,0 +1,32 @@ + + + Customer Statement + + + + + + Invoice Date + invoice_date + date + + + Due Date + date_maturity + date + + + Amount + amount + + + Amount Currency + amount_currency + + + Balance + balance + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/deferred_reports.xml b/dev_odex30_accounting/odex30_account_reports/data/deferred_reports.xml new file mode 100644 index 0000000..437c872 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/deferred_reports.xml @@ -0,0 +1,43 @@ + + + + + Deferred Expense Report + + + + + selector + + by_default + previous_month + + + + + Current + current + + + + + + Deferred Revenue Report + + + + + selector + + by_default + previous_month + + + + + Current + current + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/executive_summary.xml b/dev_odex30_accounting/odex30_account_reports/data/executive_summary.xml new file mode 100644 index 0000000..a771e25 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/executive_summary.xml @@ -0,0 +1,395 @@ + + + + Executive Summary + selector + this_year + + + Balance + balance + + + + + Cash + 0 + + + Cash received + CR + + + balance + domain + + sum + + + + + + Cash spent + CS + + + balance + domain + + sum + + + + + + + Cash surplus + + + balance + aggregation + CR.balance + CS.balance + + + + + + Closing bank balance + + + balance + domain + + from_beginning + sum + + + + + + + + Profitability + 0 + + + Revenue + + + balance + aggregation + REV.balance + strict_range + cross_report + + + + + + Cost of Revenue + EXEC_COS + + + balance + aggregation + COS.balance + strict_range + cross_report + + + + + + + Gross profit + + + balance + aggregation + GRP.balance + strict_range + cross_report + + + + + + Expenses + + + balance + aggregation + EXP.balance + strict_range + cross_report + + + + + + + Net Profit + EXEC_NEP + + + balance + aggregation + NEP.balance + strict_range + cross_report + + + + + + + + Balance Sheet + 0 + + + Receivables + DEB + + + balance + domain + + from_beginning + sum + + + + + + Payables + CRE + + + balance + domain + + from_beginning + sum + + + + + + + Net assets + EXEC_SUMMARY_NA + + + balance + aggregation + TA.balance - L.balance + from_beginning + cross_report + + + + + + + + Performance + 0 + + + Gross profit margin (gross profit / operating income) + GPMARGIN0 + + + balance + aggregation + GPMARGIN0.grp / GPMARGIN0.opinc * 100 + ignore_zero_division + percentage + + + + grp + aggregation + GRP.balance + strict_range + cross_report + + + opinc + aggregation + REV.balance + strict_range + cross_report + + + + + Net profit margin (net profit / revenue) + NPMARGIN0 + + + balance + aggregation + NPMARGIN0.nep / NPMARGIN0.rev * 100 + ignore_zero_division + percentage + + + + nep + aggregation + NEP.balance + strict_range + cross_report + + + rev + aggregation + REV.balance + strict_range + cross_report + + + + + Return on investments (net profit / assets) + ROI + + + balance + aggregation + ROI.nep / ROI.ta * 100 + ignore_zero_division + percentage + + + + nep + aggregation + NEP.balance + strict_range + cross_report + + + ta + aggregation + TA.balance + from_beginning + cross_report + + + + + + + Position + 0 + + + Average debtors days + AVG_DEBT_DAYS + + + balance + aggregation + DEB.balance / AVG_DEBT_DAYS.opinc * AVG_DEBT_DAYS.NDays + ignore_zero_division + + float + + + + opinc + aggregation + REV.balance + strict_range + cross_report + + + NDays + custom + _report_custom_engine_executive_summary_ndays + + + + + + Average creditors days + AVG_CRED_DAYS + + + balance + aggregation + -CRE.balance / (AVG_CRED_DAYS.cos + AVG_CRED_DAYS.exp) * AVG_CRED_DAYS.NDays + ignore_zero_division + + float + + + + cos + aggregation + COS.balance + strict_range + cross_report + + + exp + aggregation + EXP.balance + strict_range + cross_report + + + NDays + custom + _report_custom_engine_executive_summary_ndays + + + + + + Short term cash forecast + + + balance + aggregation + DEB.balance + CRE.balance + + + + + + Current assets to liabilities + CATL + + + balance + aggregation + CATL.ca / CATL.cl + ignore_zero_division + float + + + + ca + aggregation + CA.balance + from_beginning + cross_report + + + cl + aggregation + CL.balance + from_beginning + cross_report + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/followup_report.xml b/dev_odex30_accounting/odex30_account_reports/data/followup_report.xml new file mode 100644 index 0000000..928be76 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/followup_report.xml @@ -0,0 +1,37 @@ + + + + Follow-Up Report + + today + + + + + receivable + + + Invoice Date + invoice_date + date + + + Due Date + date_maturity + date + + + Amount + amount + + + Amount Currency + amount_currency + + + Balance + balance + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/general_ledger.xml b/dev_odex30_accounting/odex30_account_reports/data/general_ledger.xml new file mode 100644 index 0000000..d48f428 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/general_ledger.xml @@ -0,0 +1,49 @@ + + + + General Ledger + + + + selector + + never + this_month + + + + + + Date + date + date + + + Communication + communication + string + + + Partner + partner_name + string + + + Currency + amount_currency + + + Debit + debit + + + Credit + credit + + + Balance + balance + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/generic_tax_report.xml b/dev_odex30_accounting/odex30_account_reports/data/generic_tax_report.xml new file mode 100644 index 0000000..3da471f --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/generic_tax_report.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/journal_report.xml b/dev_odex30_accounting/odex30_account_reports/data/journal_report.xml new file mode 100644 index 0000000..09da773 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/journal_report.xml @@ -0,0 +1,239 @@ + + + + + Journal Report + + + + never + + + never + this_year + + + + Code + code + string + + + Debit + debit + + + Credit + credit + + + Balance + balance + + + + + Name + journal_id, account_id + 0 + + + code + custom + _report_custom_engine_journal_report + code + + + debit + custom + _report_custom_engine_journal_report + debit + + + credit + custom + _report_custom_engine_journal_report + credit + + + balance + custom + _report_custom_engine_journal_report + balance + + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/mail_activity_type_data.xml b/dev_odex30_accounting/odex30_account_reports/data/mail_activity_type_data.xml new file mode 100644 index 0000000..4638127 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/mail_activity_type_data.xml @@ -0,0 +1,42 @@ + + + + + Tax Report + Tax Report + tax_report + account.journal + suggest + + + + Pay Tax + Tax is ready to be paid + tax_report + 0 + days + previous_activity + account.move + suggest + + + + Tax Report Ready + Tax report is ready to be sent to the administration + tax_report + 0 + days + current_date + account.move + suggest + + + + Tax Report - Error + Error sending Tax Report + tax_report + account.move + warning + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/mail_templates.xml b/dev_odex30_accounting/odex30_account_reports/data/mail_templates.xml new file mode 100644 index 0000000..b4af9e0 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/mail_templates.xml @@ -0,0 +1,26 @@ + + + Customer Statement + + {{ object._get_followup_responsible().email_formatted }} + {{ (object.company_id or object._get_followup_responsible().company_id).name }} Statement - {{ object.commercial_company_name }} + +
    +

    + Dear (), + Dear , +
    + Please find enclosed the statement of your account. +
    + Do not hesitate to contact us if you have any questions. +
    + Sincerely, +
    + +

    +
    +
    + {{ object.lang }} + +
    +
    diff --git a/dev_odex30_accounting/odex30_account_reports/data/menuitems.xml b/dev_odex30_accounting/odex30_account_reports/data/menuitems.xml new file mode 100644 index 0000000..fadfd37 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/menuitems.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/multicurrency_revaluation_report.xml b/dev_odex30_accounting/odex30_account_reports/data/multicurrency_revaluation_report.xml new file mode 100644 index 0000000..c18e4d6 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/multicurrency_revaluation_report.xml @@ -0,0 +1,107 @@ + + + + Unrealized Currency Gains/Losses + + + previous_month + + + + Balance in Foreign Currency + balance_currency + + + Balance at Operation Rate + balance_operation + + + Balance at Current Rate + balance_current + + + Adjustment + adjustment + + + + + Accounts To Adjust + multicurrency_included + currency_id, account_id, id + + + balance_currency + custom + _report_custom_engine_multi_currency_revaluation_to_adjust + balance_currency + + + _currency_balance_currency + custom + _report_custom_engine_multi_currency_revaluation_to_adjust + currency_id + + + balance_operation + custom + _report_custom_engine_multi_currency_revaluation_to_adjust + balance_operation + + + + balance_current + custom + _report_custom_engine_multi_currency_revaluation_to_adjust + balance_current + + + + adjustment + custom + _report_custom_engine_multi_currency_revaluation_to_adjust + adjustment + + + + + + + Excluded Accounts + currency_id, account_id, id + + + balance_currency + custom + _report_custom_engine_multi_currency_revaluation_excluded + balance_currency + + + _currency_balance_currency + custom + _report_custom_engine_multi_currency_revaluation_excluded + currency_id + + + balance_operation + custom + _report_custom_engine_multi_currency_revaluation_excluded + balance_operation + + + balance_current + custom + _report_custom_engine_multi_currency_revaluation_excluded + balance_current + + + adjustment + custom + _report_custom_engine_multi_currency_revaluation_excluded + adjustment + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/partner_ledger.xml b/dev_odex30_accounting/odex30_account_reports/data/partner_ledger.xml new file mode 100644 index 0000000..cd4ff52 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/partner_ledger.xml @@ -0,0 +1,61 @@ + + + + Partner Ledger + + both + + + + + selector + never + this_year + + + + + + Journal + journal_code + string + + + Account + account_code + string + + + Invoice Date + invoice_date + date + + + Due Date + date_maturity + date + + + Matching + matching_number + string + + + Debit + debit + + + Credit + credit + + + Amount Currency + amount_currency + + + Balance + balance + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/pdf_export_templates.xml b/dev_odex30_accounting/odex30_account_reports/data/pdf_export_templates.xml new file mode 100644 index 0000000..7adaefe --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/pdf_export_templates.xml @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/profit_and_loss.xml b/dev_odex30_accounting/odex30_account_reports/data/profit_and_loss.xml new file mode 100644 index 0000000..cc40bf8 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/profit_and_loss.xml @@ -0,0 +1,139 @@ + + + + Profit and Loss + + + + selector + + this_year + + + Balance + balance + + + + + Revenue + REV + 1 + account_id + + + + balance + domain + + -sum + + + + + Less Costs of Revenue + COS + + 1 + account_id + + + + balance + domain + + sum + + + + + + Gross Profit + GRP + + 0 + + + balance + aggregation + REV.balance - COS.balance + + + + + Less Operating Expenses + EXP + + 1 + account_id + + + + balance + domain + + sum + + + + + + Operating Income (or Loss) + 0 + INC + + + balance + aggregation + REV.balance - COS.balance - EXP.balance + + + + + Plus Other Income + OIN + + 1 + account_id + + + + balance + domain + + -sum + + + + + Less Other Expenses + OEXP + + 1 + account_id + + + + balance + domain + + sum + + + + + + Net Profit + 0 + NEP + + + balance + aggregation + REV.balance + OIN.balance - COS.balance - EXP.balance - OEXP.balance + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/report_send_cron.xml b/dev_odex30_accounting/odex30_account_reports/data/report_send_cron.xml new file mode 100644 index 0000000..3582846 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/report_send_cron.xml @@ -0,0 +1,11 @@ + + + Send account reports automatically + + code + model._cron_account_report_send(job_count=20) + + 1 + days + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/sales_report.xml b/dev_odex30_accounting/odex30_account_reports/data/sales_report.xml new file mode 100644 index 0000000..60e4aab --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/sales_report.xml @@ -0,0 +1,36 @@ + + + + Generic EC Sales List + + + + + + + selector + previous_month + + + + + + Country Code + country_code + string + + + + VAT Number + vat_number + string + + + + Amount + balance + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/data/trial_balance.xml b/dev_odex30_accounting/odex30_account_reports/data/trial_balance.xml new file mode 100644 index 0000000..da0c5f2 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/data/trial_balance.xml @@ -0,0 +1,26 @@ + + + + Trial Balance + + + + selector + + by_default + never + this_month + + + + + Debit + debit + + + Credit + credit + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/i18n/account_reports.pot b/dev_odex30_accounting/odex30_account_reports/i18n/account_reports.pot new file mode 100644 index 0000000..437d20a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/i18n/account_reports.pot @@ -0,0 +1,4482 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_reports +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-10-24 18:48+0000\n" +"PO-Revision-Date: 2025-10-24 18:48+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "\" account balance is affected by" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "%(journal)s - %(account)s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "%(names)s and %(remaining)s others" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "%(names)s and one other" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/res_company.py:0 +msgid "%(report_label)s: %(period)s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/budget.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "%s is not a numeric value" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "%s selected" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"'Open General Ledger' caret option is only available form report lines " +"targetting accounts." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"'View Bank Statement' caret option is only available for report lines " +"targeting bank statements." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "'external' engine does not support groupby, limit nor offset." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "(%s lines)" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.outstanding_receipts +msgid "(+) Outstanding Receipts" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.outstanding_payments +msgid "(-) Outstanding Payments" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "(1 line)" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "(No %s)" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "(No Group)" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid ", leading to an unexplained difference of" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_move_form_vat_return +msgid "-> Refresh" +msgstr "" + +#. module: odex30_account_reports +#: model:mail.template,body_html:account_reports.email_template_customer_statement +msgid "" +"
    \n" +"

    \n" +" Dear (),\n" +" Dear ,\n" +"
    \n" +" Please find enclosed the statement of your account.\n" +"
    \n" +" Do not hesitate to contact us if you have any questions.\n" +"
    \n" +" Sincerely,\n" +"
    \n" +"\t \n" +"

    \n" +"
    \n" +" " +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_send_form +msgid "" +"" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_account_report_file_download_error_wizard_form +msgid "" +"Errors marked with are critical and prevent " +"the file generation." +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_reports_journal_dashboard_kanban_view +msgid "Reconciliation" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_account_report_file_download_error_wizard_form +msgid "One or more error(s) occurred during file generation:" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.constraint,message:account_reports.constraint_account_report_horizontal_group_name_uniq +msgid "A horizontal group with the same name already exists." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/widgets/account_report_x2many/account_report_x2many.js:0 +msgid "A line with a 'Group By' value cannot have children." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_tax.py:0 +msgid "" +"A tax unit can only be created between companies sharing the same main " +"currency." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_tax.py:0 +msgid "" +"A tax unit must contain a minimum of two companies. You might want to delete" +" the unit." +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_total_assets0 +msgid "ASSETS" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/deferred_reports/groupby.xml:0 +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +#: model:account.report.column,name:account_reports.aged_payable_report_account_name +#: model:account.report.column,name:account_reports.aged_receivable_report_account_name +#: model:account.report.column,name:account_reports.partner_ledger_report_account_code +#: model:ir.model,name:account_reports.model_account_account +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget_item__account_id +msgid "Account" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_chart_template +msgid "Account Chart Template" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Account Code" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Account Code / Tag" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_res_company__account_display_representative_field +msgid "Account Display Representative Field" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Account Label" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Account Name" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_report_annotation +msgid "Account Report Annotation" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_report_custom_handler +msgid "Account Report Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_tax_report_handler +msgid "Account Report Handler for Tax Reports" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_report_send +msgid "Account Report Send" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_res_config_settings__account_reports_show_per_company_setting +msgid "Account Reports Show Per Company Setting" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_res_partner__account_represented_company_ids +#: model:ir.model.fields,field_description:account_reports.field_res_users__account_represented_company_ids +msgid "Account Represented Company" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_res_company__account_revaluation_journal_id +msgid "Account Revaluation Journal" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_account_type.xml:0 +msgid "Account:" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_res_company__account_representative_id +msgid "Accounting Firm" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_report +msgid "Accounting Report" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_report_budget +msgid "Accounting Report Budget" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_report_budget_item +msgid "Accounting Report Budget Item" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_report_expression +msgid "Accounting Report Expression" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_report_external_value +msgid "Accounting Report External Value" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_report_line +msgid "Accounting Report Line" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.actions.act_window,name:account_reports.action_account_report_tree +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_tree +#: model_terms:ir.ui.view,arch_db:account_reports.view_account_report_search +msgid "Accounting Reports" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_analytic.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_analytic_groupby.xml:0 +msgid "Accounts" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_form +msgid "Accounts Coverage Report" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.multicurrency_revaluation_to_adjust +msgid "Accounts To Adjust" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Accounts coverage" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_mail_activity_type__category +msgid "Action" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_file_download_error_wizard__actionable_errors +msgid "Actionable Errors" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_mail_activity_type__category +msgid "" +"Actions may trigger specific behavior like opening calendar view or " +"automatically mark as done when a document is uploaded" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_mail_activity +msgid "Activity" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_mail_activity_type +msgid "Activity Type" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_name/popover/annotations_popover.xml:0 +#: code:addons/odex30_account_reports/static/src/widgets/account_report_x2many/account_report_x2many.xml:0 +msgid "Add a line" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_send_form +msgid "Add contacts to notify..." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_res_company__totals_below_sections +#: model:ir.model.fields,field_description:account_reports.field_res_config_settings__totals_below_sections +msgid "Add totals below sections" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.multicurrency_revaluation_report_adjustment +msgid "Adjustment" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_multicurrency_revaluation_report.py:0 +msgid "Adjustment Entry" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Advance Payments received from customers" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Advance payments made to suppliers" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_form +msgid "Advanced" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_aged_partner_balance_report_handler +msgid "Aged Partner Balance Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.aged_payable_report +#: model:account.report.line,name:account_reports.aged_payable_line +#: model:ir.actions.client,name:account_reports.action_account_report_ap +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_aged_payable +msgid "Aged Payable" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_aged_payable_report_handler +msgid "Aged Payable Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_reports_journal_dashboard_kanban_view +msgid "Aged Payables" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.aged_receivable_report +#: model:account.report.line,name:account_reports.aged_receivable_line +#: model:ir.actions.client,name:account_reports.action_account_report_ar +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_aged_receivable +msgid "Aged Receivable" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_aged_receivable_report_handler +msgid "Aged Receivable Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_reports_journal_dashboard_kanban_view +msgid "Aged Receivables" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_fiscal_position.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +#: code:addons/odex30_account_reports/static/src/components/sales_report/filters/filters.js:0 +msgid "All" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "All Journals" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "All Payable" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "All Receivable" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "All Report Variants" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/tax_report/warnings.xml:0 +msgid "" +"All selected companies or branches do not share the same Tax ID. Please " +"check the Tax ID of the selected companies." +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.account_financial_report_ec_sales_amount +#: model:account.report.column,name:account_reports.bank_reconciliation_report_amount +#: model:account.report.column,name:account_reports.customer_statement_amount +#: model:account.report.column,name:account_reports.followup_report_amount +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget_item__amount +msgid "Amount" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: model:account.report.column,name:account_reports.aged_payable_report_amount_currency +#: model:account.report.column,name:account_reports.aged_receivable_report_amount_currency +#: model:account.report.column,name:account_reports.bank_reconciliation_report_amount_currency +#: model:account.report.column,name:account_reports.customer_statement_report_amount_currency +#: model:account.report.column,name:account_reports.followup_report_report_amount_currency +#: model:account.report.column,name:account_reports.partner_ledger_report_amount_currency +msgid "Amount Currency" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Amount in currency: %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Amounts in Lakhs" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Amounts in Millions" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Amounts in Thousands" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_analytic.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_analytic_groupby.xml:0 +msgid "Analytic" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report__filter_analytic_groupby +msgid "Analytic Group By" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +msgid "Analytic Simulations" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_name/line_name.xml:0 +msgid "Annotate" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_name/popover/annotations_popover.xml:0 +msgid "Annotation" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report__annotations_ids +msgid "Annotations" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "As of %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Ascending" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.aged_payable_report_period0 +#: model:account.report.column,name:account_reports.aged_receivable_report_period0 +msgid "At Date" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_send_form +msgid "Attach a file" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line_name.xml:0 +msgid "Audit" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.ui.menu,name:account_reports.account_reports_audit_reports_menu +msgid "Audit Reports" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_avgcre0 +msgid "Average creditors days" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_avdebt0 +msgid "Average debtors days" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "B: %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: model:account.report.column,name:account_reports.balance_sheet_balance +#: model:account.report.column,name:account_reports.cash_flow_report_balance +#: model:account.report.column,name:account_reports.customer_statement_report_balance +#: model:account.report.column,name:account_reports.executive_summary_column +#: model:account.report.column,name:account_reports.followup_report_report_balance +#: model:account.report.column,name:account_reports.general_ledger_report_balance +#: model:account.report.column,name:account_reports.journal_report_balance +#: model:account.report.column,name:account_reports.partner_ledger_report_balance +#: model:account.report.column,name:account_reports.profit_and_loss_column +#: model_terms:ir.ui.view,arch_db:account_reports.account_reports_journal_dashboard_kanban_view +msgid "Balance" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.balance_sheet +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_balancesheet0 +#: model:ir.actions.client,name:account_reports.action_account_report_bs +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_balance_sheet +msgid "Balance Sheet" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_balance_sheet_report_handler +msgid "Balance Sheet Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.multicurrency_revaluation_report_balance_current +msgid "Balance at Current Rate" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.multicurrency_revaluation_report_balance_operation +msgid "Balance at Operation Rate" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.multicurrency_revaluation_report_balance_currency +msgid "Balance in Foreign Currency" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/bank_reconciliation_report.py:0 +msgid "Balance of '%s'" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.balance_bank +msgid "Balance of Bank" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Balance tax advance payment account" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Balance tax current account (payable)" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Balance tax current account (receivable)" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.actions.client,name:account_reports.action_account_report_bank_reconciliation +msgid "Bank Reconciliation" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.bank_reconciliation_report +msgid "Bank Reconciliation Report" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_bank_reconciliation_report_handler +msgid "Bank Reconciliation Report Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_bank_view0 +msgid "Bank and Cash Accounts" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.bank_information_customer_report +msgid "Bank:" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_general_ledger.py:0 +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_journal_report_taxes_summary +msgid "Base Amount" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filter_aging.xml:0 +msgid "Based on" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Before" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_budgets.xml:0 +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget_item__budget_id +msgid "Budget" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_account__budget_item_ids +msgid "Budget Item" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_budget_form +msgid "Budget Items" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_budgets.xml:0 +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_budget_form +msgid "Budget Name" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Budget items can only be edited from account lines." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/redirectAction/redirectAction.xml:0 +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_send_form +#: model_terms:ir.ui.view,arch_db:account_reports.view_account_multicurrency_revaluation_wizard +#: model_terms:ir.ui.view,arch_db:account_reports.view_report_export_wizard +msgid "Cancel" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Cannot audit tax from another model than account.tax." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Cannot generate carryover values for all fiscal positions at once!" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/carryover_popover.xml:0 +msgid "Carryover" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Carryover adjustment for tax unit" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Carryover can only be generated for a single column group." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Carryover from %(date_from)s to %(date_to)s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Carryover lines for: %s" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_cash0 +msgid "Cash" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_cash_flow_report_handler +msgid "Cash Flow Report Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.cash_flow_report +#: model:ir.actions.client,name:account_reports.action_account_report_cs +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_cash_flow +msgid "Cash Flow Statement" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash and cash equivalents, beginning of period" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash and cash equivalents, closing balance" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash flows from financing activities" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash flows from investing & extraordinary activities" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash flows from operating activities" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash flows from unclassified activities" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash in" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash out" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash paid for operating activities" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_cash_received0 +msgid "Cash received" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash received from operating activities" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_cash_spent0 +msgid "Cash spent" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_cash_surplus0 +msgid "Cash surplus" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_change_lock_date +msgid "Change Lock Date" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/account_report_send.py:0 +msgid "Check Partner(s) Email(s)" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/tax_report/warnings.xml:0 +msgid "Check them" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_account_report_file_download_error_wizard_form +msgid "Close" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Closing Entry" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_closing_bank_balance0 +msgid "Closing bank balance" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: model:account.report.column,name:account_reports.journal_report_code +msgid "Code" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/filters/filter_code.xml:0 +msgid "Codes:" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_form +msgid "Columns" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.general_ledger_report_communication +msgid "Communication" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: model:ir.model,name:account_reports.model_res_company +#: model:ir.model.fields,field_description:account_reports.field_account_tax_unit__company_ids +msgid "Companies" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: model:ir.model.fields,field_description:account_reports.field_account_multicurrency_revaluation_wizard__company_id +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget__company_id +msgid "Company" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_tax.py:0 +msgid "" +"Company %(company)s already belongs to a tax unit in %(country)s. A company " +"can at most be part of one tax unit per country." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Company Currency" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_tax_unit.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Company Only" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Company Settings" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "Comparison" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.res_config_settings_view_form +msgid "Configure start dates" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Configure your TAX accounts - %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/res_config_settings.py:0 +msgid "Configure your start dates" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.res_config_settings_view_form +msgid "Configure your tax accounts" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_res_partner +msgid "Contact" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.duplicated_vat_partner_tree_view +msgid "Contacts" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__mail_body +msgid "Contents" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_direct_costs0 +msgid "Cost of Revenue" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Could not expand term %(term)s while evaluating formula " +"%(unexpanded_formula)s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Could not parse account_code formula from token '%s'" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model:ir.model.fields,field_description:account_reports.field_account_tax_unit__country_id +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_journal_report_taxes_summary +#: model_terms:ir.ui.view,arch_db:account_reports.view_account_report_search +msgid "Country" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.account_financial_report_ec_sales_country +msgid "Country Code" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_budgets.xml:0 +msgid "Create" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.actions.server,name:account_reports.action_create_composite_report_list +msgid "Create Composite Report" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_account_multicurrency_revaluation_wizard +msgid "Create Entry" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.actions.server,name:account_reports.action_create_report_menu +msgid "Create Menu Item" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_multicurrency_revaluation_wizard__create_uid +#: model:ir.model.fields,field_description:account_reports.field_account_report_annotation__create_uid +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget__create_uid +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget_item__create_uid +#: model:ir.model.fields,field_description:account_reports.field_account_report_file_download_error_wizard__create_uid +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group__create_uid +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group_rule__create_uid +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__create_uid +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard__create_uid +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard_format__create_uid +#: model:ir.model.fields,field_description:account_reports.field_account_tax_unit__create_uid +msgid "Created by" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_multicurrency_revaluation_wizard__create_date +#: model:ir.model.fields,field_description:account_reports.field_account_report_annotation__create_date +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget__create_date +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget_item__create_date +#: model:ir.model.fields,field_description:account_reports.field_account_report_file_download_error_wizard__create_date +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group__create_date +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group_rule__create_date +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__create_date +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard__create_date +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard_format__create_date +#: model:ir.model.fields,field_description:account_reports.field_account_tax_unit__create_date +msgid "Created on" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +#: model:account.report.column,name:account_reports.general_ledger_report_credit +#: model:account.report.column,name:account_reports.journal_report_credit +#: model:account.report.column,name:account_reports.partner_ledger_report_credit +#: model:account.report.column,name:account_reports.trial_balance_report_credit +msgid "Credit" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.aged_payable_report_currency +#: model:account.report.column,name:account_reports.aged_receivable_report_currency +#: model:account.report.column,name:account_reports.bank_reconciliation_report_currency +#: model:account.report.column,name:account_reports.general_ledger_report_amount_currency +msgid "Currency" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Currency Code" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_multicurrency_revaluation_report.py:0 +msgid "Currency Rates (%s)" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_export_filters +msgid "Currency:" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.deferred_expense_current +#: model:account.report.column,name:account_reports.deferred_revenue_current +msgid "Current" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_current_assets0 +#: model:account.report.line,name:account_reports.account_financial_report_current_assets_view0 +msgid "Current Assets" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_current_liabilities0 +#: model:account.report.line,name:account_reports.account_financial_report_current_liabilities1 +msgid "Current Liabilities" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_retained_earnings_line_1 +msgid "Current Year Retained Earnings" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_current_year_earnings0 +msgid "Current Year Unallocated Earnings" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_ca_to_l0 +msgid "Current assets to liabilities" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_date.xml:0 +msgid "Custom Dates" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report__custom_handler_model_id +msgid "Custom Handler Model" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report__custom_handler_model_name +msgid "Custom Handler Model Name" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/bank_reconciliation_report.py:0 +msgid "" +"Custom engine _report_custom_engine_last_statement_balance_amount does not " +"support groupby" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.customer_statement_report +#: model:ir.actions.client,name:account_reports.action_account_report_customer_statement +#: model:mail.template,name:account_reports.email_template_customer_statement +msgid "Customer Statement" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_customer_statement_report_handler +msgid "Customer Statement Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_name/popover/annotations_popover.xml:0 +#: model:account.report.column,name:account_reports.bank_reconciliation_report_date +#: model:account.report.column,name:account_reports.general_ledger_report_date +#: model:ir.model.fields,field_description:account_reports.field_account_multicurrency_revaluation_wizard__date +#: model:ir.model.fields,field_description:account_reports.field_account_report_annotation__date +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget_item__date +msgid "Date" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Date cannot be empty" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_account_report_annotation__date +msgid "Date considered as annotated by the annotation." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filter_aging.xml:0 +msgid "Days" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +#: model:account.report.column,name:account_reports.general_ledger_report_debit +#: model:account.report.column,name:account_reports.journal_report_debit +#: model:account.report.column,name:account_reports.partner_ledger_report_debit +#: model:account.report.column,name:account_reports.trial_balance_report_debit +msgid "Debit" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_journal_report_taxes_summary +msgid "Deductible" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/deferred_reports/warnings.xml:0 +msgid "Deferrals have not yet been completely generated for this period." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/deferred_reports/warnings.xml:0 +msgid "Deferrals have not yet been generated for this period." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Deferred Entries" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.actions.client,name:account_reports.action_account_report_deferred_expense +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_deferred_expense +msgid "Deferred Expense" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_deferred_expense_report_handler +msgid "Deferred Expense Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.deferred_expense_report +msgid "Deferred Expense Report" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_deferred_report_handler +msgid "Deferred Expense Report Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.actions.client,name:account_reports.action_account_report_deferred_revenue +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_deferred_revenue +msgid "Deferred Revenue" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_deferred_revenue_report_handler +msgid "Deferred Revenue Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.deferred_revenue_report +msgid "Deferred Revenue Report" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_expression_form +msgid "Definition" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_res_company__account_tax_periodicity +msgid "Delay units" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "Depending moves" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Descending" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Difference from rounding taxes" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_line__display_custom_groupby_warning +msgid "Display Custom Groupby Warning" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__display_mail_composer +msgid "Display Mail Composer" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_multicurrency_revaluation_wizard__display_name +#: model:ir.model.fields,field_description:account_reports.field_account_report_annotation__display_name +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget__display_name +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget_item__display_name +#: model:ir.model.fields,field_description:account_reports.field_account_report_file_download_error_wizard__display_name +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group__display_name +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group_rule__display_name +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__display_name +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard__display_name +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard_format__display_name +#: model:ir.model.fields,field_description:account_reports.field_account_tax_unit__display_name +msgid "Display Name" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Document" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard__doc_name +msgid "Documents Name" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group_rule__domain +msgid "Domain" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_fiscal_position.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Domestic" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__checkbox_download +msgid "Download" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_account_report_file_download_error_wizard_form +msgid "Download Anyway" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.res_config_settings_view_form +msgid "Download the Data Inalterability Check Report" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +msgid "Draft Entries" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_general_ledger.py:0 +msgid "Draft Entry" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_followup_report.py:0 +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_journal_report_taxes_summary +msgid "Due" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filter_aging.xml:0 +#: model:account.report.column,name:account_reports.customer_statement_report_date_maturity +#: model:account.report.column,name:account_reports.followup_report_date_maturity +#: model:account.report.column,name:account_reports.partner_ledger_report_date_maturity +msgid "Due Date" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.actions.client,name:account_reports.action_account_report_sales +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_sales +msgid "EC Sales List" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_ec_sales_report_handler +msgid "EC Sales Report Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "EC tax on non EC countries" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "EC tax on same country" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_equity0 +msgid "EQUITY" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Editing a manual report line is not allowed in multivat setup when " +"displaying data from all fiscal positions." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Editing a manual report line is not allowed when multiple companies are " +"selected." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__checkbox_send_mail +msgid "Email" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__mail_template_id +msgid "Email template" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__enable_download +msgid "Enable Download" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Enable Sections" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__enable_send_mail +msgid "Enable Send Mail" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_variant.xml:0 +msgid "Enable more ..." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_trial_balance_report.py:0 +msgid "End Balance" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "End of Month" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "End of Quarter" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "End of Year" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line/popover/debug_popover.xml:0 +msgid "Engine" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "Entries with partners with no VAT" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Error message" +msgstr "" + +#. module: odex30_account_reports +#: model:mail.activity.type,summary:account_reports.mail_activity_type_tax_report_error +msgid "Error sending Tax Report" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/multicurrency_revaluation_report/filters/filter_exchange_rate.xml:0 +msgid "Exchange Rates" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_move_line__exclude_bank_lines +msgid "Exclude Bank Lines" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_journal_report_audit_move_line_search +msgid "Exclude Bank lines" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_account__exclude_provision_currency_ids +msgid "Exclude Provision Currency" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.multicurrency_revaluation_excluded +msgid "Excluded Accounts" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.executive_summary +#: model:ir.actions.client,name:account_reports.action_account_report_exec_summary +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_exec_summary +msgid "Executive Summary" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_multicurrency_revaluation_wizard__expense_provision_account_id +msgid "Expense Account" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_res_company__account_revaluation_expense_provision_account_id +msgid "Expense Provision Account" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +msgid "Expense Provision for %s" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_expenses0 +msgid "Expenses" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_report_export_wizard +msgid "Export" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_reports_export_wizard_format +msgid "Export format for accounting's reports" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard__export_format_ids +msgid "Export to" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_reports_export_wizard +msgid "Export wizard for accounting's reports" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_expression_form +msgid "Expression" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Expression labelled '%(label)s' of line '%(line)s' is being overwritten when" +" computing the current report. Make sure the cross-report aggregations of " +"this report only reference terms belonging to other reports." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group_rule__field_name +msgid "Field" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Field %s does not exist on account.move.line, and is not supported by this " +"report's custom handler." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Field %s does not exist on account.move.line." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Field %s of account.move.line cannot be used in a groupby expression." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Field %s of account.move.line is not searchable and can therefore not be " +"used in a groupby expression." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Field 'Custom Handler Model' can only reference records inheriting from " +"[%s]." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_file_download_error_wizard__file_content +msgid "File Content" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_account_report_file_download_error_wizard_form +msgid "File Download Errors" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_file_download_error_wizard__file_name +msgid "File Name" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_form +msgid "Filters" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_aml_ir_filters.xml:0 +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_export_filters +msgid "Filters:" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.actions.act_window,name:account_reports.action_account_report_budget_tree +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_budget_tree +msgid "Financial Budgets" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_fiscal_position +#: model:ir.model.fields,field_description:account_reports.field_account_report_annotation__fiscal_position_id +msgid "Fiscal Position" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_fiscal_position.xml:0 +msgid "Fiscal Position:" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_tax_unit__fpos_synced +msgid "Fiscal Positions Synchronised" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_tax_unit_form +msgid "" +"Fiscal Positions should apply to all companies of the tax unit. You may want" +" to" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.followup_report +msgid "Follow-Up Report" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_followup_report_handler +msgid "Follow-Up Report Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +msgid "Foreign currencies adjustment entry as of %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line/popover/debug_popover.xml:0 +msgid "Formula" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"From %(date_from)s\n" +"to %(date_to)s" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard_format__fun_param +msgid "Function Parameter" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard_format__fun_to_call +msgid "Function to Call" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/models/account_trial_balance_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +#: code:addons/odex30_account_reports/static/src/components/multicurrency_revaluation_report/line_name.xml:0 +#: model:account.report,name:account_reports.general_ledger_report +#: model:ir.actions.client,name:account_reports.action_account_report_general_ledger +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_general_ledger +msgid "General Ledger" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_general_ledger_report_handler +msgid "General Ledger Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Generate entry" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/report_export_wizard.py:0 +msgid "Generated Documents" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.generic_ec_sales_report +msgid "Generic EC Sales List" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_generic_tax_report_handler +msgid "Generic Tax Report Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_generic_tax_report_handler_account_tax +msgid "Generic Tax Report Custom Handler (Account -> Tax)" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_generic_tax_report_handler_tax_account +msgid "Generic Tax Report Custom Handler (Tax -> Account)" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: model_terms:ir.ui.view,arch_db:account_reports.journal_report_pdf_export_main +msgid "Global Tax Summary" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "Goods" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_journal_report_taxes_summary +msgid "Grid" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_gross_profit0 +msgid "Gross Profit" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_gross_profit0 +msgid "Gross profit" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_gpmargin0 +msgid "Gross profit margin (gross profit / operating income)" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_line_form +#: model_terms:ir.ui.view,arch_db:account_reports.view_account_report_search +msgid "Group By" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_horizontal_group_form +msgid "Group Name" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/deferred_reports/groupby.xml:0 +msgid "Group by" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Grouped Deferral Entry of %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/partner_ledger/filter_extra_options.xml:0 +msgid "Hide Account" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/partner_ledger/filter_extra_options.xml:0 +msgid "Hide Debit/Credit" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +msgid "Hide lines at 0" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +msgid "Hierarchy and Subtotals" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group_rule__horizontal_group_id +msgid "Horizontal Group" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_horizontal_groups.xml:0 +msgid "Horizontal Group:" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.actions.act_window,name:account_reports.action_account_report_horizontal_groups +#: model:ir.model.fields,field_description:account_reports.field_account_report__horizontal_group_ids +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_horizontal_groups +msgid "Horizontal Groups" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_report_horizontal_group +msgid "Horizontal group for reports" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_report_horizontal_group_rule +msgid "Horizontal group rule for reports" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_export_filters +msgid "Horizontal:" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.res_config_settings_view_form +msgid "How often tax returns have to be made" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_multicurrency_revaluation_wizard__id +#: model:ir.model.fields,field_description:account_reports.field_account_report_annotation__id +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget__id +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget_item__id +#: model:ir.model.fields,field_description:account_reports.field_account_report_file_download_error_wizard__id +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group__id +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group_rule__id +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__id +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard__id +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard_format__id +#: model:ir.model.fields,field_description:account_reports.field_account_tax_unit__id +msgid "ID" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_journal_report_taxes_summary +msgid "Impact On Grid" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_journal_report_taxes_summary +msgid "Impacted Tax Grids" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "In %s" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_account_report_search +msgid "Inactive" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/journal_report/filter_extra_options.xml:0 +msgid "Include Payments" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_export_filter_extra_options_template +msgid "Including Analytic Simulations" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.no_statement_unreconciled_payments +#: model:account.report.line,name:account_reports.unreconciled_last_statement_payments +msgid "Including Unreconciled Payments" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.no_statement_unreconciled_receipt +#: model:account.report.line,name:account_reports.unreconciled_last_statement_receipts +msgid "Including Unreconciled Receipts" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_multicurrency_revaluation_wizard__income_provision_account_id +msgid "Income Account" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_res_company__account_revaluation_income_provision_account_id +msgid "Income Provision Account" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +msgid "Income Provision for %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/bank_reconciliation_report.py:0 +msgid "Inconsistent Statements" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Inconsistent data: more than one external value at the same date for a " +"'most_recent' external line." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Inconsistent report_id in options dictionary. Options says " +"%(options_report)s; report is %(report)s." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/models/account_trial_balance_report.py:0 +msgid "Initial Balance" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +msgid "Integer Rounding" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filters.js:0 +msgid "Intervals cannot be smaller than 1" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "Intra-community taxes are applied on" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Invalid domain formula in expression \"%(expression)s\" of line " +"\"%(line)s\": %(formula)s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Invalid method “%s”" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Invalid subformula in expression \"%(expression)s\" of line \"%(line)s\": " +"%(subformula)s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Invalid token '%(token)s' in account_codes formula '%(formula)s'" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filter_aging.xml:0 +#: model:account.report.column,name:account_reports.aged_payable_report_invoice_date +#: model:account.report.column,name:account_reports.aged_receivable_report_invoice_date +#: model:account.report.column,name:account_reports.customer_statement_report_invoicing_date +#: model:account.report.column,name:account_reports.followup_report_invoicing_date +#: model:account.report.column,name:account_reports.partner_ledger_report_invoicing_date +msgid "Invoice Date" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_journal_report_audit_move_line_search +msgid "Invoice lines" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report__is_account_coverage_report_available +msgid "Is Account Coverage Report Available" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "It seems there is some depending closing move to be posted" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "" +"It's not possible to select a budget with the horizontal group feature." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "" +"It's not possible to select a horizontal group with the budget feature." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget__item_ids +msgid "Items" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.partner_ledger_report_journal_code +#: model:ir.model,name:account_reports.model_account_journal +#: model:ir.model.fields,field_description:account_reports.field_account_financial_year_op__account_tax_periodicity_journal_id +#: model:ir.model.fields,field_description:account_reports.field_account_multicurrency_revaluation_wizard__journal_id +#: model:ir.model.fields,field_description:account_reports.field_res_company__account_tax_periodicity_journal_id +#: model:ir.model.fields,field_description:account_reports.field_res_config_settings__account_tax_periodicity_journal_id +#: model_terms:ir.ui.view,arch_db:account_reports.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:account_reports.setup_financial_year_opening_form +msgid "Journal" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.actions.client,name:account_reports.action_account_report_ja +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_ja +msgid "Journal Audit" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_move_line +msgid "Journal Item" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/models/account_trial_balance_report.py:0 +#: code:addons/odex30_account_reports/models/bank_reconciliation_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/general_ledger/line_name.xml:0 +#: code:addons/odex30_account_reports/static/src/components/partner_ledger/line_name.xml:0 +msgid "Journal Items" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Journal Items for Tax Audit" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.journal_report +msgid "Journal Report" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_journal_report_handler +msgid "Journal Report Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Journal items with archived tax tags" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Journals" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_export_filters +msgid "Journals:" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_liabilities_view0 +msgid "LIABILITIES" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_liabilities_and_equity_view0 +msgid "LIABILITIES + EQUITY" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/static/src/components/account_report/line/popover/debug_popover.xml:0 +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +#: model:account.report.column,name:account_reports.bank_reconciliation_report_label +msgid "Label" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__mail_lang +msgid "Lang" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_reports_journal_dashboard_kanban_view +msgid "Last Statement balance + Transactions since statement" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_multicurrency_revaluation_wizard__write_uid +#: model:ir.model.fields,field_description:account_reports.field_account_report_annotation__write_uid +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget__write_uid +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget_item__write_uid +#: model:ir.model.fields,field_description:account_reports.field_account_report_file_download_error_wizard__write_uid +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group__write_uid +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group_rule__write_uid +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__write_uid +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard__write_uid +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard_format__write_uid +#: model:ir.model.fields,field_description:account_reports.field_account_tax_unit__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_multicurrency_revaluation_wizard__write_date +#: model:ir.model.fields,field_description:account_reports.field_account_report_annotation__write_date +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget__write_date +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget_item__write_date +#: model:ir.model.fields,field_description:account_reports.field_account_report_file_download_error_wizard__write_date +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group__write_date +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group_rule__write_date +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__write_date +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard__write_date +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard_format__write_date +#: model:ir.model.fields,field_description:account_reports.field_account_tax_unit__write_date +msgid "Last Updated on" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.last_statement_balance +msgid "Last statement balance" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Later" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_cost_sales0 +msgid "Less Costs of Revenue" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_expense0 +msgid "Less Operating Expenses" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_depreciation0 +msgid "Less Other Expenses" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_annotation__line_id +msgid "Line" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Line '%(child)s' is configured to appear before its parent '%(parent)s'. " +"This is not allowed." +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_form +msgid "Lines" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Load more..." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__mail_attachments_widget +msgid "Mail Attachments Widget" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_tax_unit__main_company_id +msgid "Main Company" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_account_tax_unit__main_company_id +msgid "" +"Main company of this unit; the one actually reporting and paying the taxes." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_multicurrency_revaluation_report.py:0 +#: model_terms:ir.ui.view,arch_db:account_reports.view_account_multicurrency_revaluation_wizard +msgid "Make Adjustment Entry" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_report_file_download_error_wizard +msgid "Manage the file generation errors from report exports." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Manual value" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Manual values" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.partner_ledger_report_matching_number +msgid "Matching" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_account_tax_unit__company_ids +msgid "Members of this unit" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Method '%(method_name)s' must start with the '%(prefix)s' prefix." +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.misc_operations +msgid "Misc. operations" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__mode +msgid "Mode" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group_rule__res_model_name +msgid "Model" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Month" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_budget_form +msgid "Months" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_export_filters +msgid "Multi-Ledger:" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Multi-ledger" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_multicurrency_revaluation_report_handler +msgid "Multicurrency Revaluation Report Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_multicurrency_revaluation_wizard +msgid "Multicurrency Revaluation Wizard" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:account_reports.selection__account_report_send__mode__multi +msgid "Multiple Recipients" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/res_company.py:0 +msgid "" +"Multiple draft tax closing entries exist for fiscal position %(position)s after %(period_start)s. There should be at most one. \n" +" %(closing_entries)s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/res_company.py:0 +msgid "" +"Multiple draft tax closing entries exist for your domestic region after %(period_start)s. There should be at most one. \n" +" %(closing_entries)s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_general_ledger.py:0 +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model:account.report.line,name:account_reports.journal_report_line +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget__name +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group__name +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard_format__name +#: model:ir.model.fields,field_description:account_reports.field_account_tax_unit__name +#: model_terms:ir.ui.view,arch_db:account_reports.duplicated_vat_partner_tree_view +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_journal_report_taxes_summary +#: model_terms:ir.ui.view,arch_db:account_reports.view_tax_unit_form +msgid "Name" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_account_reports_export_wizard__doc_name +msgid "Name to give to the generated documents." +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_profit0 +#: model:account.report.line,name:account_reports.account_financial_report_net_profit0 +msgid "Net Profit" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_net_assets0 +msgid "Net assets" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Net increase in cash and cash equivalents" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_npmargin0 +msgid "Net profit margin (net profit / revenue)" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_reports_journal_dashboard_kanban_view +msgid "Never miss a tax deadline." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/edit_popover.xml:0 +msgid "No" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "No Comparison" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "No Journal" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "No VAT number associated with your company. Please define one." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +msgid "No adjustment needed" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/account_report.xml:0 +msgid "No data to display !" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/chart_template.py:0 +msgid "No default miscellaneous journal could be found for the active company" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "No entry to generate." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +msgid "No provision needed was found." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Non Trade Partners" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Non Trade Payable" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Non Trade Receivable" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_journal_report_taxes_summary +msgid "Non-Deductible" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_horizontal_groups.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +#: code:addons/odex30_account_reports/static/src/components/sales_report/filters/filters.js:0 +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_form +msgid "None" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Not Started" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Number of periods cannot be smaller than 1" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_off_sheet +msgid "OFF BALANCE SHEET ACCOUNTS" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filters.js:0 +msgid "Odoo Warning" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.aged_payable_report_period5 +#: model:account.report.column,name:account_reports.aged_receivable_report_period5 +msgid "Older" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/report_export_wizard.py:0 +msgid "One of the formats chosen can not be exported in the DMS" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "Only Billing Administrators are allowed to change lock dates!" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.actions.server,name:account_reports.action_account_reports_customer_statements +msgid "Open Customer Statements" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_financial_year_op +msgid "Opening Balance of Financial Year" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_operating_income0 +msgid "Operating Income (or Loss)" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_expression_form +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_form +msgid "Options" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_export_filter_extra_options_template +msgid "Options:" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.outstanding +msgid "Outstanding Receipts/Payments" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_followup_report.py:0 +msgid "Overdue" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "PDF" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard__report_id +msgid "Parent Report Id" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_reports_export_wizard_format__export_wizard_id +msgid "Parent Wizard" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/line_name/line_name.xml:0 +#: code:addons/odex30_account_reports/static/src/components/partner_ledger/line_name.xml:0 +#: model:account.report.column,name:account_reports.general_ledger_report_partner_name +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__partner_ids +msgid "Partner" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Partner Categories" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.partner_ledger_report +#: model:ir.actions.client,name:account_reports.action_account_report_partner_ledger +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_partner_ledger +msgid "Partner Ledger" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_partner_ledger_report_handler +msgid "Partner Ledger Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/line_name/line_name.xml:0 +#: code:addons/odex30_account_reports/static/src/components/partner_ledger/line_name.xml:0 +msgid "Partner is bad" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/line_name/line_name.xml:0 +#: code:addons/odex30_account_reports/static/src/components/partner_ledger/line_name.xml:0 +msgid "Partner is good" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/account_report_send.py:0 +msgid "Partner(s) should have an email address." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_partner.xml:0 +msgid "Partners" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_export_filters +msgid "Partners Categories:" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "Partners with duplicated VAT numbers" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_export_filters +msgid "Partners:" +msgstr "" + +#. module: odex30_account_reports +#: model:mail.activity.type,name:account_reports.mail_activity_type_tax_report_to_pay +msgid "Pay Tax" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "Pay tax: %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_aged_partner_balance.py:0 +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Payable" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Payable tax amount" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_current_liabilities_payable +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_creditors0 +msgid "Payables" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_performance0 +msgid "Performance" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Period" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.aged_payable_report_period1 +#: model:account.report.column,name:account_reports.aged_receivable_report_period1 +msgid "Period 1" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.aged_payable_report_period2 +#: model:account.report.column,name:account_reports.aged_receivable_report_period2 +msgid "Period 2" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.aged_payable_report_period3 +#: model:account.report.column,name:account_reports.aged_receivable_report_period3 +msgid "Period 3" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.aged_payable_report_period4 +#: model:account.report.column,name:account_reports.aged_receivable_report_period4 +msgid "Period 4" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "Period order" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_res_config_settings__account_tax_periodicity +#: model:ir.model.fields,help:account_reports.field_account_financial_year_op__account_tax_periodicity +#: model:ir.model.fields,help:account_reports.field_res_company__account_tax_periodicity +#: model:ir.model.fields,help:account_reports.field_res_config_settings__account_tax_periodicity +#: model_terms:ir.ui.view,arch_db:account_reports.res_config_settings_view_form +msgid "Periodicity" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_financial_year_op__account_tax_periodicity +msgid "Periodicity in month" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Periods" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_analytic_groupby.xml:0 +msgid "Plans" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/budget.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Please enter a valid budget name." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/multicurrency_revaluation_report/filters/filters.js:0 +msgid "Please enter a valid number." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/account_report_send.py:0 +msgid "Please select a mail template to send multiple statements." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Please select the main company and its branches in the company selector to " +"proceed." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Please set the deferred accounts in the accounting settings." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Please set the deferred journal in the accounting settings." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Please specify the accounts necessary for the Tax Closing Entry." +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_fixed_assets_view0 +msgid "Plus Fixed Assets" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_non_current_assets_view0 +msgid "Plus Non-current Assets" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_non_current_liabilities0 +msgid "Plus Non-current Liabilities" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_other_income0 +msgid "Plus Other Income" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_position0 +msgid "Position" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/edit_popover.xml:0 +msgid "Post" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Posted Entries" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_prepayements0 +msgid "Prepayments" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_multicurrency_revaluation_wizard__preview_data +msgid "Preview Data" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "Previous Period" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "Previous Periods" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "Previous Year" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "Previous Years" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_retained_earnings_line_2 +msgid "Previous Years Retained Earnings" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_previous_year_earnings0 +msgid "Previous Years Unallocated Earnings" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_send_form +msgid "Print & Send" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Proceed" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_account_multicurrency_revaluation_wizard +msgid "" +"Proceed with caution as there might be an existing adjustment for this " +"period (" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +#: code:addons/odex30_account_reports/static/src/components/deferred_reports/groupby.xml:0 +msgid "Product" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/deferred_reports/groupby.xml:0 +msgid "Product Category" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.profit_and_loss +#: model:ir.actions.client,name:account_reports.action_account_report_pl +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_profit_and_loss +msgid "Profit and Loss" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_profitability0 +msgid "Profitability" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_move_form_vat_return +msgid "Proposition of tax closing journal entry." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +msgid "Provision for %(for_cur)s (1 %(comp_cur)s = %(rate)s %(for_cur)s)" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Quarter" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/multicurrency_revaluation_report/line_name.xml:0 +msgid "Rates" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_aged_partner_balance.py:0 +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Receivable" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Receivable tax amount" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_debtors0 +#: model:account.report.line,name:account_reports.account_financial_report_receivable0 +msgid "Receivables" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__mail_partner_ids +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_send_form +msgid "Recipients" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_reports_journal_dashboard_kanban_view +msgid "Reconciliation Report" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_financial_year_op__account_tax_periodicity_reminder_day +#: model:ir.model.fields,field_description:account_reports.field_res_config_settings__account_tax_periodicity_reminder_day +#: model_terms:ir.ui.view,arch_db:account_reports.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:account_reports.setup_financial_year_opening_form +msgid "Reminder" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_annotation__report_id +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__account_report_id +msgid "Report" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_line_form +msgid "Report Line" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_form +msgid "Report Name" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__report_options +msgid "Report Options" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Report lines mentioning the account code" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_variant.xml:0 +msgid "Report:" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.res_config_settings_view_form +msgid "Reporting" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group__report_ids +msgid "Reports" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_line_form +msgid "Reset to Standard" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_retained_earnings0 +msgid "Retained Earnings" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_return_investment0 +msgid "Return on investments (net profit / assets)" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_income0 +#: model:account.report.line,name:account_reports.account_financial_report_revenue0 +msgid "Revenue" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_multicurrency_revaluation_wizard__reversal_date +msgid "Reversal Date" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Reversal of Grouped Deferral Entry of %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +msgid "Reversal of: %s" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_account_report_search +msgid "Root Report" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_horizontal_group__rule_ids +msgid "Rules" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "Same Period Last Year" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/search_bar/search_bar.xml:0 +msgid "Search..." +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_form +msgid "Sections" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_customer_statement.py:0 +#: code:addons/odex30_account_reports/models/account_partner_ledger.py:0 +msgid "Send" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_partner_ledger.py:0 +msgid "Send %s Statement" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report__send_and_print_values +msgid "Send And Print Values" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__send_mail_readonly +msgid "Send Mail Readonly" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_partner_ledger.py:0 +msgid "Send Partner Ledgers" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.actions.server,name:account_reports.ir_cron_account_report_send_ir_actions_server +msgid "Send account reports automatically" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "Send tax report: %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/account_report_send.py:0 +msgid "Sending statements" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_budget__sequence +msgid "Sequence" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "Services" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_journal_report_audit_move_line_tree +msgid "Set as Checked" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.duplicated_vat_partner_tree_view +msgid "Set as main" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_report_executivesummary_st_cash_forecast0 +msgid "Short term cash forecast" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filter_extra_options.xml:0 +msgid "Show Account" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_budgets.xml:0 +msgid "Show All Accounts" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filter_extra_options.xml:0 +msgid "Show Currency" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_multicurrency_revaluation_wizard__show_warning_move_id +msgid "Show Warning Move" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/deferred_reports/warnings.xml:0 +msgid "Show already generated deferrals." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:account_reports.selection__account_report_send__mode__single +msgid "Single Recipient" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "Some" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/tax_report/warnings.xml:0 +msgid "Some journal items appear to point to obsolete report lines." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "" +"Some lines in the report involve partners that share the same VAT number.\n" +"\n" +" Please review the" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_date.xml:0 +msgid "Specific Date" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_res_company__account_representative_id +msgid "" +"Specify an Accounting Firm that will act as a representative when exporting " +"reports." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +msgid "Split Horizontally" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report__tax_closing_start_date +msgid "Start Date" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_res_company__account_tax_periodicity_reminder_day +msgid "Start from" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Starting Balance" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/line_name/line_name.xml:0 +msgid "Statement" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/account_report_send.py:0 +msgid "Statements are being sent in the background." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line/popover/debug_popover.xml:0 +msgid "Subformula" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__mail_subject +msgid "Subject" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_send_form +msgid "Subject..." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "T: %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_partner.xml:0 +msgid "Tags" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_general_ledger.py:0 +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_journal_report_taxes_summary +msgid "Tax Amount" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_journal_report_taxes_summary +msgid "Tax Applied" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_bank_statement_line__tax_closing_alert +#: model:ir.model.fields,field_description:account_reports.field_account_move__tax_closing_alert +msgid "Tax Closing Alert" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_bank_statement_line__tax_closing_report_id +#: model:ir.model.fields,field_description:account_reports.field_account_move__tax_closing_report_id +msgid "Tax Closing Report" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_general_ledger.py:0 +msgid "Tax Declaration" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Tax Grids" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_tax_unit__vat +msgid "Tax ID" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.company_information +#: model_terms:ir.ui.view,arch_db:account_reports.tax_information_customer_report +msgid "Tax ID:" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Tax Paid Adjustment" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/tax_report/filters/filter_date.xml:0 +msgid "Tax Period" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Tax Received Adjustment" +msgstr "" + +#. module: odex30_account_reports +#: model:mail.activity.type,name:account_reports.tax_closing_activity_type +#: model:mail.activity.type,summary:account_reports.tax_closing_activity_type +#: model_terms:ir.ui.view,arch_db:account_reports.view_move_form_vat_return +msgid "Tax Report" +msgstr "" + +#. module: odex30_account_reports +#: model:mail.activity.type,name:account_reports.mail_activity_type_tax_report_error +msgid "Tax Report - Error" +msgstr "" + +#. module: odex30_account_reports +#: model:mail.activity.type,name:account_reports.mail_activity_type_tax_report_to_be_sent +msgid "Tax Report Ready" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.actions.client,name:account_reports.action_account_report_gt +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_gt +msgid "Tax Return" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.res_config_settings_view_form +msgid "Tax Return Periodicity" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_tax_unit +#: model_terms:ir.ui.view,arch_db:account_reports.view_tax_unit_form +msgid "Tax Unit" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_tax_unit.xml:0 +msgid "Tax Unit:" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.actions.act_window,name:account_reports.action_view_tax_units +#: model:ir.model.fields,field_description:account_reports.field_res_company__account_tax_unit_ids +#: model:ir.ui.menu,name:account_reports.menu_view_tax_units +msgid "Tax Units" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_mail_activity__account_tax_closing_params +msgid "Tax closing additional params" +msgstr "" + +#. module: odex30_account_reports +#: model:mail.activity.type,summary:account_reports.mail_activity_type_tax_report_to_pay +msgid "Tax is ready to be paid" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:account_reports.selection__mail_activity_type__category__tax_report +msgid "Tax report" +msgstr "" + +#. module: odex30_account_reports +#: model:mail.activity.type,summary:account_reports.mail_activity_type_tax_report_to_be_sent +msgid "Tax report is ready to be sent to the administration" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/res_company.py:0 +msgid "Tax return" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Taxes" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +msgid "Taxes Applied" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_account_tax_unit__fpos_synced +msgid "" +"Technical field indicating whether Fiscal Positions exist for all companies " +"in the unit" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_ir_actions_account_report_download +msgid "Technical model for accounting report downloads" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/ellipsis/ellipsis.js:0 +msgid "Text copied" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "The Accounts Coverage Report is not available for this report." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_name/popover_line/annotation_popover_line.js:0 +msgid "The annotation shouldn't have an empty value." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_annotation__text +msgid "The annotation's content." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "" +"The attachments of the tax report can be found on the %(link_start)sclosing " +"entry%(link_end)s of the representative company." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_partner_ledger.py:0 +msgid "The column '%s' is not available for this report." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_tax.py:0 +msgid "" +"The country detected for this VAT number does not match the one set on this " +"Tax Unit." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_account_tax_unit__country_id +msgid "" +"The country in which this tax unit is used to group your companies' tax " +"reports declaration." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_multicurrency_revaluation_report.py:0 +msgid "The currency rate cannot be equal to zero" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "The current balance in the" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "" +"The currently selected dates don't match a tax period. The closing entry " +"will be created for the closest-matching period according to your " +"periodicity setup." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_account_report_annotation__fiscal_position_id +msgid "The fiscal position used while annotating." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_account_report_annotation__line_id +msgid "The id of the annotated line." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_account_report_annotation__report_id +msgid "The id of the annotated report." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_account_tax_unit__vat +msgid "The identifier to be used when submitting a report for this unit." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_tax.py:0 +msgid "The main company of a tax unit has to be part of it." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_res_company__account_tax_unit_ids +msgid "The tax units this company belongs to." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "The used operator is not supported for this expression." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/warnings.xml:0 +msgid "There are" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/account_report_send.py:0 +msgid "" +"There are currently reports waiting to be sent, please try again later." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/account_report.xml:0 +msgid "There is no data to display for the given filters." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"This account exists in the Chart of Accounts but is not mentioned in any " +"line of the report" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"This account is reported in a line of the report but does not exist in the " +"Chart of Accounts" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "This account is reported in multiple lines of the report" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "This account is reported multiple times on the same line of the report" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.res_config_settings_view_form +msgid "" +"This allows you to choose the position of totals in your financial reports." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/warnings.xml:0 +msgid "" +"This company is part of a tax unit. You're currently not viewing the whole " +"unit." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/widgets/account_report_x2many/account_report_x2many.js:0 +msgid "" +"This line and all its children will be deleted. Are you sure you want to " +"proceed?" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/widgets/account_report_x2many/account_report_x2many.xml:0 +msgid "This line is out of sequence." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/widgets/account_report_x2many/account_report_x2many.xml:0 +msgid "" +"This line is placed before its parent, which is not allowed. You can fix it " +"by dragging it to the proper position." +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_line_form +msgid "This line uses a custom user-defined 'Group By' value." +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_form +msgid "This option hides lines with a value of 0" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "This report already has a menuitem." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/tax_report/warnings.xml:0 +msgid "" +"This report contains inconsistencies. The affected lines are marked with a " +"warning." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/multicurrency_revaluation_report/warnings.xml:0 +msgid "This report only displays the data of the active company." +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.account_report_form +msgid "" +"This report uses report-specific code.\n" +" You can customize it manually, but any change in the parameters used for its computation could lead to errors." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/warnings.xml:0 +msgid "" +"This report uses the CTA conversion method to consolidate multiple companies using different currencies,\n" +" which can lead the report to be unbalanced." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "This subformula references an unknown expression: %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"This tag is reported in a line of the report but is not linked to any " +"account of the Chart of Accounts" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_move_form_vat_return +msgid "" +"This tax closing entry is posted, but the tax lock date is earlier than the " +"covered period's last day. You might need to reset it to draft and refresh " +"its content, in case other entries using taxes have been posted in the " +"meantime." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_date.xml:0 +msgid "Today" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +#: code:addons/odex30_account_reports/models/account_general_ledger.py:0 +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/models/account_partner_ledger.py:0 +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +#: model:account.report.column,name:account_reports.aged_payable_report_total +#: model:account.report.column,name:account_reports.aged_receivable_report_total +msgid "Total" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Total %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Trade Partners" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.transaction_without_statement +msgid "Transactions without statement" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.trial_balance_report +#: model:ir.actions.client,name:account_reports.action_account_report_coa +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_coa +msgid "Trial Balance" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model,name:account_reports.model_account_trial_balance_report_handler +msgid "Trial Balance Custom Handler" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "Triangular" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Trying to dispatch an action on a report not compatible with the provided " +"options." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Trying to expand a group for a line which was not generated by a report " +"line: %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Trying to expand a line without an expansion function." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Trying to expand groupby results on lines without a groupby value." +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.line,name:account_reports.account_financial_unaffected_earnings0 +msgid "Unallocated Earnings" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Undefined" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +msgid "Unfold All" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Unknown" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_partner_ledger.py:0 +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "Unknown Partner" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Unknown bound criterium: %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Unknown date scope: %s" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report,name:account_reports.multicurrency_revaluation_report +#: model:ir.actions.client,name:account_reports.action_account_report_multicurrency_revaluation +#: model:ir.ui.menu,name:account_reports.menu_action_account_report_multicurrency_revaluation +msgid "Unrealized Currency Gains/Losses" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_export_filter_extra_options_template +msgid "Unreconciled Entries" +msgstr "" + +#. module: odex30_account_reports +#: model:account.report.column,name:account_reports.account_financial_report_ec_sales_vat +msgid "VAT Number" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.setup_financial_year_opening_form +msgid "VAT Periodicity" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line/popover/debug_popover.xml:0 +msgid "Value" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "Vat closing from %(date_from)s to %(date_to)s" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_journal_report_audit_move_line_tree +msgid "View" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "View Bank Statement" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/carryover_popover.xml:0 +msgid "View Carryover Lines" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "View Journal Entry" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +#: model_terms:ir.ui.view,arch_db:account_reports.view_journal_report_audit_move_line_tree +msgid "View Partner" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/account_report_send.py:0 +msgid "View Partner(s)" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "View Payment" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:account_reports.field_account_report_send__warnings +msgid "Warnings" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.res_config_settings_view_form +msgid "" +"When ticked, totals and subtotals appear below the sections of the report" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_res_company__totals_below_sections +#: model:ir.model.fields,help:account_reports.field_res_config_settings__totals_below_sections +msgid "" +"When ticked, totals and subtotals appear below the sections of the report." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:account_reports.field_account_account__exclude_provision_currency_ids +msgid "" +"Whether or not we have to make provisions for the selected foreign " +"currencies." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_export_filter_extra_options_template +msgid "With Draft Entries" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_general_ledger.py:0 +msgid "Wrong ID for general ledger line to expand: %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_partner_ledger.py:0 +msgid "Wrong ID for partner ledger line to expand: %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Wrong format for if_other_expr_above/if_other_expr_below formula: %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "XLSX" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Year" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/edit_popover.xml:0 +msgid "Yes" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/multicurrency_revaluation_report/warnings.xml:0 +msgid "You are using custom exchange rates." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "You can't open a tax report from a move without a VAT closing date." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move_line.py:0 +msgid "You cannot add taxes on a tax closing move line." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "" +"You cannot generate entries for a period that does not end at the end of the" +" month." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "You cannot generate entries for a period that is locked." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "" +"You cannot reset this closing entry to draft, as another closing entry has " +"been posted at a later date." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "" +"You cannot reset this closing entry to draft, as it would delete carryover " +"values impacting the tax report of a locked period. Please change the " +"following lock dates to proceed: %(lock_date_info)s." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "You cannot update this value as it's locked by: %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_multicurrency_revaluation_report.py:0 +msgid "You need to activate more than one currency to access this report." +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "" +"You're about the generate the closing entries of multiple companies at once." +" Each of them will be created in accordance with its company tax " +"periodicity." +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.journal_report_pdf_export_main +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_export_main +#: model_terms:ir.ui.view,arch_db:account_reports.pdf_export_main_customer_report +msgid "[Draft]" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "addressed to" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "affected partners" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/tax_report/warnings.xml:0 +msgid "and correct their tax tags if necessary." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:account_reports.selection__res_company__account_tax_periodicity__year +msgid "annually" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:account_reports.setup_financial_year_opening_form +msgid "days after period" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "doesn't match the balance of your" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:account_reports.selection__res_company__account_tax_periodicity__2_months +msgid "every 2 months" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:account_reports.selection__res_company__account_tax_periodicity__4_months +msgid "every 4 months" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "have a starting balance different from the previous ending balance." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/carryover_popover.xml:0 +msgid "in the next period." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "invoices" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "journal items" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "last bank statement" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:account_reports.selection__res_company__account_tax_periodicity__monthly +msgid "monthly" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "n/a" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "partners" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/warnings.xml:0 +msgid "prior or included in this period." +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:account_reports.selection__res_company__account_tax_periodicity__trimester +msgid "quarterly" +msgstr "" + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:account_reports.selection__res_company__account_tax_periodicity__semester +msgid "semi-annually" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "statements" +msgstr "" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:account_reports.view_tax_unit_form +msgid "synchronize fiscal positions" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_tax.py:0 +msgid "tax unit [%s]" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "that are not established abroad." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_date.xml:0 +msgid "to" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "to resolve the duplication." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/warnings.xml:0 +msgid "unposted Journal Entries" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/carryover_popover.xml:0 +msgid "were carried over to this line from previous period." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "which don't originate from a bank statement nor payment." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "who are not established in any of the EC countries." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/carryover_popover.xml:0 +msgid "will be carried over to" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/carryover_popover.xml:0 +msgid "will be carried over to this line in the next period." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "without a valid intra-community VAT number." +msgstr "" + +#. module: odex30_account_reports +#: model:mail.template,subject:account_reports.email_template_customer_statement +msgid "" +"{{ (object.company_id or object._get_followup_responsible().company_id).name" +" }} Statement - {{ object.commercial_company_name }}" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/multicurrency_revaluation_report/warnings.xml:0 +msgid "⇒ Reset to Odoo’s Rate" +msgstr "" diff --git a/dev_odex30_accounting/odex30_account_reports/i18n/ar_001.po b/dev_odex30_accounting/odex30_account_reports/i18n/ar_001.po new file mode 100644 index 0000000..2cddacb --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/i18n/ar_001.po @@ -0,0 +1,4608 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex30_account_reports +# +# Translators: +# Martin Trigaux, 2024 +# Wil Odoo, 2025 +# Malaz Abuidris , 2025 +# Weblate , 2025. +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-10-24 18:48+0000\n" +"PO-Revision-Date: 2025-11-12 14:22+0000\n" +"Last-Translator: Weblate \n" +"Language-Team: Arabic \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" +"X-Generator: Weblate 5.12.2\n" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "\" account balance is affected by" +msgstr "\" يتأثر رصيد الحساب بـ" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "%(journal)s - %(account)s" +msgstr "%(journal)s - %(account)s" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "%(names)s and %(remaining)s others" +msgstr "%(names)s و%(remaining)s آخرين " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "%(names)s and one other" +msgstr "%(names)s وشخص آخر " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/res_company.py:0 +msgid "%(report_label)s: %(period)s" +msgstr "%(report_label)s: %(period)s" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/budget.py:0 +msgid "%s (copy)" +msgstr "%s (نسخة)" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "%s is not a numeric value" +msgstr "%s ليست قيمة عددية " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "%s selected" +msgstr "تم تحديد %s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"'Open General Ledger' caret option is only available form report lines " +"targetting accounts." +msgstr "" +"خيار علامة إقحام 'فتح دفتر الأستاذ العام' متاح فقط من بنود التقرير التي " +"تستهدف الحسابات. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"'View Bank Statement' caret option is only available for report lines " +"targeting bank statements." +msgstr "" +"خيار علامة إقحام 'عرض كشف الحساب البنكي' متاح فقط من بنود التقرير التي " +"تستهدف كشوف الحسابت البنكية. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "'external' engine does not support groupby, limit nor offset." +msgstr "لا يدعم المحرك 'الخارجي' عمليات التجميع حسب، أو التقييد، أو الإزاحة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "(%s lines)" +msgstr "(%s بنود) " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.outstanding_receipts +msgid "(+) Outstanding Receipts" +msgstr "(+) الإيصالات المستحقة " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.outstanding_payments +msgid "(-) Outstanding Payments" +msgstr "(-) المدفوعات المستحقة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "(1 line)" +msgstr "(بند 1) " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "(No %s)" +msgstr "(لا %s) " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "(No Group)" +msgstr "(بلا تجميع)" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid ", leading to an unexplained difference of" +msgstr "، والذي يؤدي إلى فريق لا يمكن تفسيره في " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_move_form_vat_return +msgid "-> Refresh" +msgstr "-> تحديث" + +#. module: odex30_account_reports +#: model:mail.template,body_html:odex30_account_reports.email_template_customer_statement +msgid "" +"
    \n" +"

    \n" +" Dear (),\n" +" Dear ,\n" +"
    \n" +" Please find enclosed the statement of your account.\n" +"
    \n" +" Do not hesitate to contact us if you have any " +"questions.\n" +"
    \n" +" Sincerely,\n" +"
    \n" +"\t \n" +"

    \n" +"
    \n" +" " +msgstr "" +"
    \n" +"

    \n" +" عزيزنا " +"(\n" +" عزيزنا ،\n" +"
    \n" +" يُرجى الاطلاع على كشف حسابك في المرفقات.\n" +"
    \n" +" لا تتردد في التواصل معنا إذا كانت لديك أي أسئلة أو " +"استفسارات.\n" +"
    \n" +" مع وافر الشكر والتقدير،\n" +"
    \n" +"\t \n" +"

    \n" +"
    \n" +" " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_send_form +msgid "" +"" +msgstr "" +"" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_account_report_file_download_error_wizard_form +msgid "" +"Errors marked with are critical and prevent " +"the file generation." +msgstr "" +"تعتبر الأخطاء التي تم وضع علامة عليها خطيرة " +"وتمنع إنشاء الملف. " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_reports_journal_dashboard_kanban_view +msgid "Reconciliation" +msgstr "التسوية" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_account_report_file_download_error_wizard_form +msgid "One or more error(s) occurred during file generation:" +msgstr "وقع خطأ واحد أو أكثر أثناء عملية إنشاء الملف: " + +#. module: odex30_account_reports +#: model:ir.model.constraint,message:odex30_account_reports.constraint_account_report_horizontal_group_name_uniq +msgid "A horizontal group with the same name already exists." +msgstr "توجد مجموعة أفقية بنفس الاسم بالفعل. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/widgets/account_report_x2many/account_report_x2many.js:0 +msgid "A line with a 'Group By' value cannot have children." +msgstr "البند الذي به قيمة 'التجميع حسب' لا يمكن أن يكون له توابع. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_tax.py:0 +msgid "" +"A tax unit can only be created between companies sharing the same main " +"currency." +msgstr "يمكن إنشاء الوحدة الضريبية فقط بين الشركات التي تتشارك نفس العملة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_tax.py:0 +msgid "" +"A tax unit must contain a minimum of two companies. You might want to delete " +"the unit." +msgstr "يجب أن تحتوي وحدة الضريبة على شركتين كحد أدنى. قد ترغب في حذف الوحدة. " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_total_assets0 +msgid "ASSETS" +msgstr "الأصول" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/deferred_reports/groupby.xml:0 +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +#: model:account.report.column,name:odex30_account_reports.aged_payable_report_account_name +#: model:account.report.column,name:odex30_account_reports.aged_receivable_report_account_name +#: model:account.report.column,name:odex30_account_reports.partner_ledger_report_account_code +#: model:ir.model,name:odex30_account_reports.model_account_account +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget_item__account_id +msgid "Account" +msgstr "الحساب " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_chart_template +msgid "Account Chart Template" +msgstr "نموذج مخطط الحساب " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Account Code" +msgstr "كود الحساب " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Account Code / Tag" +msgstr "علامة تصنيف / كود الحساب " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_company__account_display_representative_field +msgid "Account Display Representative Field" +msgstr "حقل ممثل لعرض الحساب " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Account Label" +msgstr "عنوان الحساب " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Account Name" +msgstr "اسم الحساب" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_report_annotation +msgid "Account Report Annotation" +msgstr "شرح تقرير الحساب " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_report_custom_handler +msgid "Account Report Custom Handler" +msgstr "المعالج المخصص لتقارير الحساب " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_tax_report_handler +msgid "Account Report Handler for Tax Reports" +msgstr "معالج تقرير الحساب للتقارير الضريبية " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_report_send +msgid "Account Report Send" +msgstr "إرسال التقرير المحاسبي " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_config_settings__account_reports_show_per_company_setting +msgid "Account Reports Show Per Company Setting" +msgstr "عرض تقارير الحساب حسب إعدادات الشركة " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_partner__account_represented_company_ids +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_users__account_represented_company_ids +msgid "Account Represented Company" +msgstr "شركة ممثَّلة في الحساب " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_company__account_revaluation_journal_id +msgid "Account Revaluation Journal" +msgstr "يومية إعادة تقييم الحساب " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_account_type.xml:0 +msgid "Account:" +msgstr "الحساب: " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_company__account_representative_id +msgid "Accounting Firm" +msgstr "مؤسسة محاسبية " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_report +msgid "Accounting Report" +msgstr "تقرير المحاسبة " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_report_budget +msgid "Accounting Report Budget" +msgstr "ميزانية التقرير المحاسبي " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_report_budget_item +msgid "Accounting Report Budget Item" +msgstr "عنصر ميزانية التقرير المحاسبي " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_report_expression +msgid "Accounting Report Expression" +msgstr "تعبير التقرير المحاسبي " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_report_external_value +msgid "Accounting Report External Value" +msgstr "القيمة الخارجية للتقرير المحاسبي" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_report_line +msgid "Accounting Report Line" +msgstr "بند التقرير المحاسبي " + +#. module: odex30_account_reports +#: model:ir.actions.act_window,name:odex30_account_reports.action_account_report_tree +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_tree +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_account_report_search +msgid "Accounting Reports" +msgstr "التقارير المحاسبية" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_analytic.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_analytic_groupby.xml:0 +msgid "Accounts" +msgstr "الحسابات" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_form +msgid "Accounts Coverage Report" +msgstr "تقرير تغطية الحسابات " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.multicurrency_revaluation_to_adjust +msgid "Accounts To Adjust" +msgstr "الحسابات بانتظار التعديل " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Accounts coverage" +msgstr "تغطية الحسابات " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_mail_activity_type__category +msgid "Action" +msgstr "إجراء" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_file_download_error_wizard__actionable_errors +msgid "Actionable Errors" +msgstr "أخطاء قابلة للتنفيذ " + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_mail_activity_type__category +msgid "" +"Actions may trigger specific behavior like opening calendar view or " +"automatically mark as done when a document is uploaded" +msgstr "" +"قد تؤدي الإجراءات إلى سلوك معين مثل فتح طريقة عرض التقويم أو وضع علامة " +"\"تم\" تلقائياً عند تحميل مستند " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_mail_activity +msgid "Activity" +msgstr "النشاط" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_mail_activity_type +msgid "Activity Type" +msgstr "نوع النشاط" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_name/popover/annotations_popover.xml:0 +#: code:addons/odex30_account_reports/static/src/widgets/account_report_x2many/account_report_x2many.xml:0 +msgid "Add a line" +msgstr "إضافة بند" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_send_form +msgid "Add contacts to notify..." +msgstr "إضافة جهات اتصال لإشعارهم..." + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_company__totals_below_sections +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_config_settings__totals_below_sections +msgid "Add totals below sections" +msgstr "إضافة إجمالي تحت الأقسام" + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.multicurrency_revaluation_report_adjustment +msgid "Adjustment" +msgstr "التعديلات" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_multicurrency_revaluation_report.py:0 +msgid "Adjustment Entry" +msgstr "تعديل القيد" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Advance Payments received from customers" +msgstr "المدفوعات المدفوعة مقدماً من قِبَل العملاء " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Advance payments made to suppliers" +msgstr "المدفوعات المدفوعة مقدمًا للموردين" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_form +msgid "Advanced" +msgstr "متقدم" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_aged_partner_balance_report_handler +msgid "Aged Partner Balance Custom Handler" +msgstr "المعالج المخصص لأعمار ديون الشريك " + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.aged_payable_report +#: model:account.report.line,name:odex30_account_reports.aged_payable_line +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_ap +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_aged_payable +msgid "Aged Payable" +msgstr "حسابات دائنة مستحقة متأخرة " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_aged_payable_report_handler +msgid "Aged Payable Custom Handler" +msgstr "المعالج المخصص للحسابات الدائنة المستحقة " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_reports_journal_dashboard_kanban_view +msgid "Aged Payables" +msgstr "حساب دائن مستحق متأخر " + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.aged_receivable_report +#: model:account.report.line,name:odex30_account_reports.aged_receivable_line +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_ar +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_aged_receivable +msgid "Aged Receivable" +msgstr "المتأخر المدين" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_aged_receivable_report_handler +msgid "Aged Receivable Custom Handler" +msgstr "المعالج المخصص للحسابات المدينة المستحقة " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_reports_journal_dashboard_kanban_view +msgid "Aged Receivables" +msgstr "المتأخرات المدينة" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_fiscal_position.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +#: code:addons/odex30_account_reports/static/src/components/sales_report/filters/filters.js:0 +msgid "All" +msgstr "الكل" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "All Journals" +msgstr "كافة اليوميات " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "All Payable" +msgstr "جميع الذمم مستحقة الدفع " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "All Receivable" +msgstr "جميع الذمم المدينة" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "All Report Variants" +msgstr "كافة متغيرات التقرير " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/tax_report/warnings.xml:0 +msgid "" +"All selected companies or branches do not share the same Tax ID. Please " +"check the Tax ID of the selected companies." +msgstr "" +"لا تتشارك كل الشركات أو الفروع المحددة في نفس المُعرِّف الضريبي. يُرجى التحقق من " +"المُعرِّف الضريبي للشركات المحددة. " + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.account_financial_report_ec_sales_amount +#: model:account.report.column,name:odex30_account_reports.bank_reconciliation_report_amount +#: model:account.report.column,name:odex30_account_reports.customer_statement_amount +#: model:account.report.column,name:odex30_account_reports.followup_report_amount +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget_item__amount +msgid "Amount" +msgstr "مبلغ" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: model:account.report.column,name:odex30_account_reports.aged_payable_report_amount_currency +#: model:account.report.column,name:odex30_account_reports.aged_receivable_report_amount_currency +#: model:account.report.column,name:odex30_account_reports.bank_reconciliation_report_amount_currency +#: model:account.report.column,name:odex30_account_reports.customer_statement_report_amount_currency +#: model:account.report.column,name:odex30_account_reports.followup_report_report_amount_currency +#: model:account.report.column,name:odex30_account_reports.partner_ledger_report_amount_currency +msgid "Amount Currency" +msgstr "عملة المبلغ" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Amount in currency: %s" +msgstr "المبلغ بالعملة: %s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Amounts in Lakhs" +msgstr "المبلغ باللاكس " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Amounts in Millions" +msgstr "المبالغ بالملايين " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Amounts in Thousands" +msgstr "المبالغ بالآلاف " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_analytic.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_analytic_groupby.xml:0 +msgid "Analytic" +msgstr "تحليلي " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report__filter_analytic_groupby +msgid "Analytic Group By" +msgstr "التجميع التحليلي حسب " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +msgid "Analytic Simulations" +msgstr "عمليات المحاكاة التحليلية " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_name/line_name.xml:0 +msgid "Annotate" +msgstr "تعليق" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_name/popover/annotations_popover.xml:0 +msgid "Annotation" +msgstr "الشرح " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report__annotations_ids +msgid "Annotations" +msgstr "الشرح " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "As of %s" +msgstr "اعتبارًا من %s" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Ascending" +msgstr "تصاعدي " + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.aged_payable_report_period0 +#: model:account.report.column,name:odex30_account_reports.aged_receivable_report_period0 +msgid "At Date" +msgstr "بتاريخ" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_send_form +msgid "Attach a file" +msgstr "إرفاق ملف" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line_name.xml:0 +msgid "Audit" +msgstr "تدقيق" + +#. module: odex30_account_reports +#: model:ir.ui.menu,name:odex30_account_reports.account_reports_audit_reports_menu +msgid "Audit Reports" +msgstr "تقارير التدقيق" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_avgcre0 +msgid "Average creditors days" +msgstr "متوسط أيام الدائنين" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_avdebt0 +msgid "Average debtors days" +msgstr "متوسط أيام المدينين" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "B: %s" +msgstr "B: %s" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: model:account.report.column,name:odex30_account_reports.balance_sheet_balance +#: model:account.report.column,name:odex30_account_reports.cash_flow_report_balance +#: model:account.report.column,name:odex30_account_reports.customer_statement_report_balance +#: model:account.report.column,name:odex30_account_reports.executive_summary_column +#: model:account.report.column,name:odex30_account_reports.followup_report_report_balance +#: model:account.report.column,name:odex30_account_reports.general_ledger_report_balance +#: model:account.report.column,name:odex30_account_reports.journal_report_balance +#: model:account.report.column,name:odex30_account_reports.partner_ledger_report_balance +#: model:account.report.column,name:odex30_account_reports.profit_and_loss_column +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_reports_journal_dashboard_kanban_view +msgid "Balance" +msgstr "الرصيد" + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.balance_sheet +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_balancesheet0 +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_bs +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_balance_sheet +msgid "Balance Sheet" +msgstr "الميزانية العمومية" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_balance_sheet_report_handler +msgid "Balance Sheet Custom Handler" +msgstr "المعالج المخصص للميزانية العمومية " + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.multicurrency_revaluation_report_balance_current +msgid "Balance at Current Rate" +msgstr "الرصيد بسعر الصرف الحالي " + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.multicurrency_revaluation_report_balance_operation +msgid "Balance at Operation Rate" +msgstr "الرصيد بسعر العملية " + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.multicurrency_revaluation_report_balance_currency +msgid "Balance in Foreign Currency" +msgstr "الرصيد بالعملة الأجنبية " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/bank_reconciliation_report.py:0 +msgid "Balance of '%s'" +msgstr "رصيد '%s' " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.balance_bank +msgid "Balance of Bank" +msgstr "رصيد البنك " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Balance tax advance payment account" +msgstr "حساب رصيد الضريبة مسبقة الدفع " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Balance tax current account (payable)" +msgstr "حساب رصيد الضريبة مسبقة الدفع (الدائن)" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Balance tax current account (receivable)" +msgstr "حساب رصيد الضريبة مسبقة الدفع (المدين)" + +#. module: odex30_account_reports +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_bank_reconciliation +msgid "Bank Reconciliation" +msgstr "التسوية البنكية" + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.bank_reconciliation_report +msgid "Bank Reconciliation Report" +msgstr "تقرير التسوية البنكية" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_bank_reconciliation_report_handler +msgid "Bank Reconciliation Report Custom Handler" +msgstr "المعالج المخصص لتقارير تسوية البنك " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_bank_view0 +msgid "Bank and Cash Accounts" +msgstr "الحسابات البنكية والنقدية " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.bank_information_customer_report +msgid "Bank:" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_general_ledger.py:0 +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_journal_report_taxes_summary +msgid "Base Amount" +msgstr "المبلغ الأساسي" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filter_aging.xml:0 +msgid "Based on" +msgstr "بناءً على" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Before" +msgstr "قبل" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_budgets.xml:0 +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget_item__budget_id +msgid "Budget" +msgstr "الميزانية " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_account__budget_item_ids +msgid "Budget Item" +msgstr "عنصر الميزانية " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_budget_form +msgid "Budget Items" +msgstr "عناصر الميزانية " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_budgets.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_budget_form +msgid "Budget Name" +msgstr "اسم الميزانية " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Budget items can only be edited from account lines." +msgstr "يمكن تحرير عناصر الميزانية فقط من بنود الحساب. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/redirectAction/redirectAction.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_send_form +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_account_multicurrency_revaluation_wizard +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_report_export_wizard +msgid "Cancel" +msgstr "إلغاء" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Cannot audit tax from another model than account.tax." +msgstr "لا يمكن تدقيق الضريبة من نموذج آخر غير account.tax. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Cannot generate carryover values for all fiscal positions at once!" +msgstr "لا يمكن إنشاء قيم الترحيل لكافة الأوضاع المالية في آن واحد! " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/carryover_popover.xml:0 +msgid "Carryover" +msgstr "الترحيل" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Carryover adjustment for tax unit" +msgstr "تعديل الترحيل لوحدة الضريبة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Carryover can only be generated for a single column group." +msgstr "يمكن إنشاء الترحيل فقط لمجموعة عمود واحدة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Carryover from %(date_from)s to %(date_to)s" +msgstr "ترحيل من %(date_from)s إلى %(date_to)s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Carryover lines for: %s" +msgstr "ترحيل القيود لـ: %s " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_cash0 +msgid "Cash" +msgstr "نقدي" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_cash_flow_report_handler +msgid "Cash Flow Report Custom Handler" +msgstr "المعالج المخصص لتقارير التدفق النقدي " + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.cash_flow_report +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_cs +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_cash_flow +msgid "Cash Flow Statement" +msgstr "كشف التدفقات النقدية" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash and cash equivalents, beginning of period" +msgstr "النقد ومعادِلات النقد، بداية الفترة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash and cash equivalents, closing balance" +msgstr "النقد وومعادِلات النقد، رصيد الإقفال " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash flows from financing activities" +msgstr "التدفقات النقدية من الأنشطة المالية " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash flows from investing & extraordinary activities" +msgstr "التدفقات النقدية من الأنشطة الاستثمارية وغير العادية" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash flows from operating activities" +msgstr "التدفقات النقدية من الأنشطة التشغيلية" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash flows from unclassified activities" +msgstr "التدفقات النقدية من الأنشطة غير المصنفة" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash in" +msgstr "إيرادات" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash out" +msgstr "نفقات " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash paid for operating activities" +msgstr "نفقات الأنشطة التشغيلية " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_cash_received0 +msgid "Cash received" +msgstr "الأرباح النقدية " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Cash received from operating activities" +msgstr "أرباح الأنشطة التشغيلية" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_cash_spent0 +msgid "Cash spent" +msgstr "المبلغ المُنفَق " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_cash_surplus0 +msgid "Cash surplus" +msgstr "الفائض النقدي" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_change_lock_date +msgid "Change Lock Date" +msgstr "تغيير تاريخ الإقفال" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/account_report_send.py:0 +msgid "Check Partner(s) Email(s)" +msgstr "تحقق من عناوين البريد الإلكتروني للشركاء " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/tax_report/warnings.xml:0 +msgid "Check them" +msgstr "تفقدهم " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_account_report_file_download_error_wizard_form +msgid "Close" +msgstr "إغلاق" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Closing Entry" +msgstr "قيد الإقفال " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_closing_bank_balance0 +msgid "Closing bank balance" +msgstr "رصيد الإقفال البنكي " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: model:account.report.column,name:odex30_account_reports.journal_report_code +msgid "Code" +msgstr "رمز " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/filters/filter_code.xml:0 +msgid "Codes:" +msgstr "الأكواد: " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_form +msgid "Columns" +msgstr "الأعمدة" + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.general_ledger_report_communication +msgid "Communication" +msgstr "التواصل " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: model:ir.model,name:odex30_account_reports.model_res_company +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_tax_unit__company_ids +msgid "Companies" +msgstr "الشركات" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_multicurrency_revaluation_wizard__company_id +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget__company_id +msgid "Company" +msgstr "الشركة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_tax.py:0 +msgid "" +"Company %(company)s already belongs to a tax unit in %(country)s. A company " +"can at most be part of one tax unit per country." +msgstr "" +"الشركة %(company)s تنتمي بالفعل إلى وحدة ضريبية في %(country)s. يمكن أن تكون " +"الشركة الواحدة جزءاً من وحدة ضريبية واحدة كحد أقصى لكل دولة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Company Currency" +msgstr "عملة الشركة " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_tax_unit.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Company Only" +msgstr "الشركة فقط " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Company Settings" +msgstr "إعدادات الشركة " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "Comparison" +msgstr "مقارنة" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_res_config_settings +msgid "Config Settings" +msgstr "تهيئة الإعدادات " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.res_config_settings_view_form +msgid "Configure start dates" +msgstr "تهيئة تواريخ البدء " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Configure your TAX accounts - %s" +msgstr "قم بتهيئة حساباتك الضريبية - %s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/res_config_settings.py:0 +msgid "Configure your start dates" +msgstr "قم بتهيئة تواريخ البدء " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.res_config_settings_view_form +msgid "Configure your tax accounts" +msgstr "قم بتهيئة حساباتك الضريبية " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_res_partner +msgid "Contact" +msgstr "جهة الاتصال" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.duplicated_vat_partner_tree_view +msgid "Contacts" +msgstr "جهات الاتصال" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__mail_body +msgid "Contents" +msgstr "المحتويات" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_direct_costs0 +msgid "Cost of Revenue" +msgstr "تكاليف الإيرادات " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Could not expand term %(term)s while evaluating formula %" +"(unexpanded_formula)s" +msgstr "hello " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Could not parse account_code formula from token '%s'" +msgstr "تعذر تحليل صيغة account_code من الرمز '%s' " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_tax_unit__country_id +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_journal_report_taxes_summary +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_account_report_search +msgid "Country" +msgstr "الدولة" + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.account_financial_report_ec_sales_country +msgid "Country Code" +msgstr "رمز الدولة" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_budgets.xml:0 +msgid "Create" +msgstr "إنشاء " + +#. module: odex30_account_reports +#: model:ir.actions.server,name:odex30_account_reports.action_create_composite_report_list +msgid "Create Composite Report" +msgstr "إنشاء تقرير مُركّب " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_account_multicurrency_revaluation_wizard +msgid "Create Entry" +msgstr "إنشاء قيد " + +#. module: odex30_account_reports +#: model:ir.actions.server,name:odex30_account_reports.action_create_report_menu +msgid "Create Menu Item" +msgstr "إنشاء عنصر قائمة " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_multicurrency_revaluation_wizard__create_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_annotation__create_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget__create_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget_item__create_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_file_download_error_wizard__create_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group__create_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group_rule__create_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__create_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard__create_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard_format__create_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_tax_unit__create_uid +msgid "Created by" +msgstr "أنشئ بواسطة" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_multicurrency_revaluation_wizard__create_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_annotation__create_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget__create_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget_item__create_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_file_download_error_wizard__create_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group__create_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group_rule__create_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__create_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard__create_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard_format__create_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_tax_unit__create_date +msgid "Created on" +msgstr "أنشئ في" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +#: model:account.report.column,name:odex30_account_reports.general_ledger_report_credit +#: model:account.report.column,name:odex30_account_reports.journal_report_credit +#: model:account.report.column,name:odex30_account_reports.partner_ledger_report_credit +#: model:account.report.column,name:odex30_account_reports.trial_balance_report_credit +msgid "Credit" +msgstr "الدائن" + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.aged_payable_report_currency +#: model:account.report.column,name:odex30_account_reports.aged_receivable_report_currency +#: model:account.report.column,name:odex30_account_reports.bank_reconciliation_report_currency +#: model:account.report.column,name:odex30_account_reports.general_ledger_report_amount_currency +msgid "Currency" +msgstr "العملة" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Currency Code" +msgstr "كود العملة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_multicurrency_revaluation_report.py:0 +msgid "Currency Rates (%s)" +msgstr "أسعار صرف العملة (%s)" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_export_filters +msgid "Currency:" +msgstr "العملة: " + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.deferred_expense_current +#: model:account.report.column,name:odex30_account_reports.deferred_revenue_current +msgid "Current" +msgstr "الحالي " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_current_assets0 +#: model:account.report.line,name:odex30_account_reports.account_financial_report_current_assets_view0 +msgid "Current Assets" +msgstr "الأصول المتداولة" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_current_liabilities0 +#: model:account.report.line,name:odex30_account_reports.account_financial_report_current_liabilities1 +msgid "Current Liabilities" +msgstr "الالتزامات الجارية " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_retained_earnings_line_1 +msgid "Current Year Retained Earnings" +msgstr "الأرباح المحتجزة للسنة الجارية " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_current_year_earnings0 +msgid "Current Year Unallocated Earnings" +msgstr "الأرباح غير المخصصة للسنة الجارية " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_ca_to_l0 +msgid "Current assets to liabilities" +msgstr "نسبة الأصول المتداولة إلى الالتزامات" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_date.xml:0 +msgid "Custom Dates" +msgstr "التواريخ المخصصة " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report__custom_handler_model_id +msgid "Custom Handler Model" +msgstr "نموذج للمعالج المخصص " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report__custom_handler_model_name +msgid "Custom Handler Model Name" +msgstr "اسم نموذج المعالج المخصص " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/bank_reconciliation_report.py:0 +msgid "" +"Custom engine _report_custom_engine_last_statement_balance_amount does not " +"support groupby" +msgstr "" +"المحرك المخصص _report_custom_engine_last_statement_balance_amount لا يدعم " +"خاصية groupby " + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.customer_statement_report +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_customer_statement +#: model:mail.template,name:odex30_account_reports.email_template_customer_statement +msgid "Customer Statement" +msgstr "كشف حساب العميل " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_customer_statement_report_handler +msgid "Customer Statement Custom Handler" +msgstr "المعالج المخصص لكشف حساب العميل " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_name/popover/annotations_popover.xml:0 +#: model:account.report.column,name:odex30_account_reports.bank_reconciliation_report_date +#: model:account.report.column,name:odex30_account_reports.general_ledger_report_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_multicurrency_revaluation_wizard__date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_annotation__date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget_item__date +msgid "Date" +msgstr "التاريخ" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Date cannot be empty" +msgstr "لا يمكن ترك خانة التاريخ فارغة" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_account_report_annotation__date +msgid "Date considered as annotated by the annotation." +msgstr "يُعتَبَر التاريخ مشروحاً بواسطة الشرح. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filter_aging.xml:0 +msgid "Days" +msgstr "أيام " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +#: model:account.report.column,name:odex30_account_reports.general_ledger_report_debit +#: model:account.report.column,name:odex30_account_reports.journal_report_debit +#: model:account.report.column,name:odex30_account_reports.partner_ledger_report_debit +#: model:account.report.column,name:odex30_account_reports.trial_balance_report_debit +msgid "Debit" +msgstr "المدين" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_journal_report_taxes_summary +msgid "Deductible" +msgstr "قابل للاستقطاع " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/deferred_reports/warnings.xml:0 +msgid "Deferrals have not yet been completely generated for this period." +msgstr "لم يتم بعد إنشاء التأجيلات بالكامل لهذه الفترة. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/deferred_reports/warnings.xml:0 +msgid "Deferrals have not yet been generated for this period." +msgstr "لم يتم بعد إنشاء التأجيلات لهذه الفترة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Deferred Entries" +msgstr "القيم المؤجلة " + +#. module: odex30_account_reports +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_deferred_expense +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_deferred_expense +msgid "Deferred Expense" +msgstr "النفقات المؤجلة " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_deferred_expense_report_handler +msgid "Deferred Expense Custom Handler" +msgstr "أداة مخصصة لمعالجة النفقات المؤجلة " + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.deferred_expense_report +msgid "Deferred Expense Report" +msgstr "تقرير النفقات المؤجلة " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_deferred_report_handler +msgid "Deferred Expense Report Custom Handler" +msgstr "أداة مخصصة لمعالجة تقرير النفقات المؤجلة " + +#. module: odex30_account_reports +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_deferred_revenue +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_deferred_revenue +msgid "Deferred Revenue" +msgstr "الإيرادات المؤجلة " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_deferred_revenue_report_handler +msgid "Deferred Revenue Custom Handler" +msgstr "أداة مخصصة لمعالجة الإيرادات المؤجلة " + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.deferred_revenue_report +msgid "Deferred Revenue Report" +msgstr "تقرير الإيرادات المؤجلة " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_expression_form +msgid "Definition" +msgstr "تعريف" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_company__account_tax_periodicity +msgid "Delay units" +msgstr "وحدات التأخير" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "Depending moves" +msgstr "الحركات المعتمدة على غيرها " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Descending" +msgstr "تنازلي " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Difference from rounding taxes" +msgstr "الفرق من تقريب الضرائب " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_line__display_custom_groupby_warning +msgid "Display Custom Groupby Warning" +msgstr "عرض تحذير \"التجميع حسب\" المخصص " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__display_mail_composer +msgid "Display Mail Composer" +msgstr "عرض أداة إنشاء البريد الإلكتروني " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_multicurrency_revaluation_wizard__display_name +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_annotation__display_name +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget__display_name +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget_item__display_name +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_file_download_error_wizard__display_name +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group__display_name +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group_rule__display_name +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__display_name +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard__display_name +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard_format__display_name +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_tax_unit__display_name +msgid "Display Name" +msgstr "اسم العرض " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Document" +msgstr "المستند " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard__doc_name +msgid "Documents Name" +msgstr "اسم المستندات " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group_rule__domain +msgid "Domain" +msgstr "النطاق" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_fiscal_position.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Domestic" +msgstr "محلي" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__checkbox_download +msgid "Download" +msgstr "تنزيل " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_account_report_file_download_error_wizard_form +msgid "Download Anyway" +msgstr "التنزيل بأي حال " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.res_config_settings_view_form +msgid "Download the Data Inalterability Check Report" +msgstr "تحميل تقرير التحقق من بيانات عدم قابلية التغيير " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +msgid "Draft Entries" +msgstr "القيود في حالة المسودة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_general_ledger.py:0 +msgid "Draft Entry" +msgstr "مسودة قيد " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_followup_report.py:0 +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_journal_report_taxes_summary +msgid "Due" +msgstr "مستحق" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filter_aging.xml:0 +#: model:account.report.column,name:odex30_account_reports.customer_statement_report_date_maturity +#: model:account.report.column,name:odex30_account_reports.followup_report_date_maturity +#: model:account.report.column,name:odex30_account_reports.partner_ledger_report_date_maturity +msgid "Due Date" +msgstr "موعد إجراء المكالمة " + +#. module: odex30_account_reports +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_sales +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_sales +msgid "EC Sales List" +msgstr "قائمة مبيعات EC" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_ec_sales_report_handler +msgid "EC Sales Report Custom Handler" +msgstr "المعالج المخصص لتقارير مبيعات العمولة الأوروبية " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "EC tax on non EC countries" +msgstr "ضريبة الاتحاد الأوروبي للدول خارج الاتحاد الأوروبي " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "EC tax on same country" +msgstr "ضريبة الاتحاد الأوروبي في نفس الدولة " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_equity0 +msgid "EQUITY" +msgstr "رأس المال " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Editing a manual report line is not allowed in multivat setup when " +"displaying data from all fiscal positions." +msgstr "" +"لا يُسمح بتحرير تقرير يدوي في بيئة متعددة الضرائب عند عرض البيانات من كافة " +"الأوضاع المالية. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Editing a manual report line is not allowed when multiple companies are " +"selected." +msgstr "لا يُسمح بتحرير تقرير يدوي عندما يتم تحديد عدة شركات. " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__checkbox_send_mail +msgid "Email" +msgstr "البريد الإلكتروني" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__mail_template_id +msgid "Email template" +msgstr "قالب البريد الإلكتروني " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__enable_download +msgid "Enable Download" +msgstr "تمكين التنزيل " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Enable Sections" +msgstr "تمكين الأجزاء " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__enable_send_mail +msgid "Enable Send Mail" +msgstr "تمكين إرسال البريد الإلكتروني " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_variant.xml:0 +msgid "Enable more ..." +msgstr "تمكين المزيد... " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_trial_balance_report.py:0 +msgid "End Balance" +msgstr "الرصيد النهائي " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "End of Month" +msgstr "نهاية الشهر " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "End of Quarter" +msgstr "نهاية ربع السنة " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "End of Year" +msgstr "نهاية العام " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line/popover/debug_popover.xml:0 +msgid "Engine" +msgstr "المحرك " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "Entries with partners with no VAT" +msgstr "القيود التي بها شركاء بلا ضريبة القيمة المضافة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Error message" +msgstr "رسالة خطأ" + +#. module: odex30_account_reports +#: model:mail.activity.type,summary:odex30_account_reports.mail_activity_type_tax_report_error +msgid "Error sending Tax Report" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/multicurrency_revaluation_report/filters/filter_exchange_rate.xml:0 +msgid "Exchange Rates" +msgstr "أسعار الصرف " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_move_line__exclude_bank_lines +msgid "Exclude Bank Lines" +msgstr "استثناء بنود البنك " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_journal_report_audit_move_line_search +msgid "Exclude Bank lines" +msgstr "استثناء بنود البنك " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_account__exclude_provision_currency_ids +msgid "Exclude Provision Currency" +msgstr "استثناء عملة الحكم " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.multicurrency_revaluation_excluded +msgid "Excluded Accounts" +msgstr "الحسابات المستثناة " + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.executive_summary +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_exec_summary +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_exec_summary +msgid "Executive Summary" +msgstr "الملخص التنفيذي" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_multicurrency_revaluation_wizard__expense_provision_account_id +msgid "Expense Account" +msgstr "حساب النفقات " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_company__account_revaluation_expense_provision_account_id +msgid "Expense Provision Account" +msgstr "حساب أحكام النفقات " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +msgid "Expense Provision for %s" +msgstr "حكم النفقات لـ %s" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_expenses0 +msgid "Expenses" +msgstr "النفقات " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_report_export_wizard +msgid "Export" +msgstr "تصدير" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_reports_export_wizard_format +msgid "Export format for accounting's reports" +msgstr "صيغة التصدير للتقارير المحاسبية " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard__export_format_ids +msgid "Export to" +msgstr "التصدير إلى " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_reports_export_wizard +msgid "Export wizard for accounting's reports" +msgstr "مُعالِج التصدير للتقارير المحاسبية " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_expression_form +msgid "Expression" +msgstr "تعبير " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Expression labelled '%(label)s' of line '%(line)s' is being overwritten when " +"computing the current report. Make sure the cross-report aggregations of " +"this report only reference terms belonging to other reports." +msgstr "" +"تتم الكتابة فوق التعبير الذي عنوانه \"%(label)s\" من البند \"%(line)s\" عند " +"احتساب التقرير الحالي. تأكد من أن مجموعات التقارير التبادلية لهذا التقرير " +"تشير فقط إلى الشروط التي تنتمي إلى تقارير أخرى. " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group_rule__field_name +msgid "Field" +msgstr "حقل" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Field %s does not exist on account.move.line, and is not supported by this " +"report's custom handler." +msgstr "" +"الحقل %s غير موجود في account.move.line، وهو غير مدعوم في أداة معالجة " +"التقارير هذه. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Field %s does not exist on account.move.line." +msgstr "الحقل %s غير موجود في account.move.line. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Field %s of account.move.line cannot be used in a groupby expression." +msgstr "لا يمكن استخدام حقل%s account.move.line في تعبير groupby. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Field %s of account.move.line is not searchable and can therefore not be " +"used in a groupby expression." +msgstr "" +"لا يمكن البحث في حقل %s لـ account.move.line، وبالتالي لا يمكن استخدامه في " +"تعبير groupby. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Field 'Custom Handler Model' can only reference records inheriting from [%s]." +msgstr "" +"الحقل 'نموذج المعالج المخصص' يمكنه فقط الإشارة إلى السجلات التي ترث من [%s]. " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_file_download_error_wizard__file_content +msgid "File Content" +msgstr "محتوى الملف " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_account_report_file_download_error_wizard_form +msgid "File Download Errors" +msgstr "أخطاء تنزيل الملف " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_file_download_error_wizard__file_name +msgid "File Name" +msgstr "اسم الملف" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_form +msgid "Filters" +msgstr "عوامل التصفية " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_aml_ir_filters.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_export_filters +msgid "Filters:" +msgstr "عوامل التصفية: " + +#. module: odex30_account_reports +#: model:ir.actions.act_window,name:odex30_account_reports.action_account_report_budget_tree +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_budget_tree +msgid "Financial Budgets" +msgstr "الميزانيات المالية " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_fiscal_position +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_annotation__fiscal_position_id +msgid "Fiscal Position" +msgstr "الوضع المالي " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_fiscal_position.xml:0 +msgid "Fiscal Position:" +msgstr "الوضع المالي: " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_tax_unit__fpos_synced +msgid "Fiscal Positions Synchronised" +msgstr "الأوضاع المالية المتزامنة " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_tax_unit_form +msgid "" +"Fiscal Positions should apply to all companies of the tax unit. You may want " +"to" +msgstr "" +"يجب أن تنطبق الأوضاع المالية على كافة الشركات لوحدة الضريبة. ربما عليك " + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.followup_report +msgid "Follow-Up Report" +msgstr "تقرير المتابعة " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_followup_report_handler +msgid "Follow-Up Report Custom Handler" +msgstr "المعالج المخصص لتقرير المتابعة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +msgid "Foreign currencies adjustment entry as of %s" +msgstr "قيد تعديل العملات الأجنبية اعتباراً من %s" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line/popover/debug_popover.xml:0 +msgid "Formula" +msgstr "الصيغة" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"From %(date_from)s\n" +"to %(date_to)s" +msgstr "" +"من %(date_from)s\n" +"إلى %(date_to)s " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard_format__fun_param +msgid "Function Parameter" +msgstr "معايير الوظيفة " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard_format__fun_to_call +msgid "Function to Call" +msgstr "الوظيفة لاستدعائها " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/models/account_trial_balance_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +#: code:addons/odex30_account_reports/static/src/components/multicurrency_revaluation_report/line_name.xml:0 +#: model:account.report,name:odex30_account_reports.general_ledger_report +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_general_ledger +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_general_ledger +msgid "General Ledger" +msgstr "دفتر الأستاذ العام" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_general_ledger_report_handler +msgid "General Ledger Custom Handler" +msgstr "المعالج المخصص لدفتر الأستاذ العام " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Generate entry" +msgstr "إنشاء قيد " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/report_export_wizard.py:0 +msgid "Generated Documents" +msgstr "إنشاء المستندات " + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.generic_ec_sales_report +msgid "Generic EC Sales List" +msgstr "قائمة مبيعات EC عامة " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_generic_tax_report_handler +msgid "Generic Tax Report Custom Handler" +msgstr "معالج مخصص للتقرير الضريبي العام " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_generic_tax_report_handler_account_tax +msgid "Generic Tax Report Custom Handler (Account -> Tax)" +msgstr "معالج مخصص للتقرير الضريبي العام (الحساب -> الضريبة) " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_generic_tax_report_handler_tax_account +msgid "Generic Tax Report Custom Handler (Tax -> Account)" +msgstr "معالج مخصص للتقرير الضريبي العام (الضريبة -> الحساب) " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.journal_report_pdf_export_main +msgid "Global Tax Summary" +msgstr "الملخص الشامل للضريبة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "Goods" +msgstr "البضائع " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_journal_report_taxes_summary +msgid "Grid" +msgstr "الشبكة" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_gross_profit0 +msgid "Gross Profit" +msgstr "إجمالي الربح" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_gross_profit0 +msgid "Gross profit" +msgstr "إجمالي الربح" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_gpmargin0 +msgid "Gross profit margin (gross profit / operating income)" +msgstr "إجمالي هامش الربح (إجمالي الربح / الدخل التشغيلي)" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_line_form +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_account_report_search +msgid "Group By" +msgstr "تجميع حسب" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_horizontal_group_form +msgid "Group Name" +msgstr "اسم المجموعة" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/deferred_reports/groupby.xml:0 +msgid "Group by" +msgstr "التجميع حسب " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Grouped Deferral Entry of %s" +msgstr "القيد المؤجل المجمع لـ %s" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/partner_ledger/filter_extra_options.xml:0 +msgid "Hide Account" +msgstr "إخفاء الحساب " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/partner_ledger/filter_extra_options.xml:0 +msgid "Hide Debit/Credit" +msgstr "إخفاء الخصم / الائتمان " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +msgid "Hide lines at 0" +msgstr "إخفاء البنود في 0 " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +msgid "Hierarchy and Subtotals" +msgstr "التسلسل الهرمي والمجاميع الفرعية" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group_rule__horizontal_group_id +msgid "Horizontal Group" +msgstr "المجموعة الأفقية " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_horizontal_groups.xml:0 +msgid "Horizontal Group:" +msgstr "المجموعة الأفقية: " + +#. module: odex30_account_reports +#: model:ir.actions.act_window,name:odex30_account_reports.action_account_report_horizontal_groups +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report__horizontal_group_ids +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_horizontal_groups +msgid "Horizontal Groups" +msgstr "المجموعات الأفقية " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_report_horizontal_group +msgid "Horizontal group for reports" +msgstr "المجموعة الأفقية للتقارير " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_report_horizontal_group_rule +msgid "Horizontal group rule for reports" +msgstr "قاعدة المجموعة الأفقية للتقارير " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_export_filters +msgid "Horizontal:" +msgstr "أفقي: " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.res_config_settings_view_form +msgid "How often tax returns have to be made" +msgstr "مدى تواتر الإقرارات الضريبية " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_multicurrency_revaluation_wizard__id +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_annotation__id +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget__id +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget_item__id +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_file_download_error_wizard__id +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group__id +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group_rule__id +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__id +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard__id +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard_format__id +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_tax_unit__id +msgid "ID" +msgstr "المُعرف" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_journal_report_taxes_summary +msgid "Impact On Grid" +msgstr "التأثير على الشبكة " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_journal_report_taxes_summary +msgid "Impacted Tax Grids" +msgstr "شبكات الضرائب المتأثرة " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "In %s" +msgstr "في %s " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_account_report_search +msgid "Inactive" +msgstr "غير نشط " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/journal_report/filter_extra_options.xml:0 +msgid "Include Payments" +msgstr "تضمين المدفوعات " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_export_filter_extra_options_template +msgid "Including Analytic Simulations" +msgstr "شاملة عمليات المحاكات التحليلية " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.no_statement_unreconciled_payments +#: model:account.report.line,name:odex30_account_reports.unreconciled_last_statement_payments +msgid "Including Unreconciled Payments" +msgstr "شاملة المدفوعات غير المسواة " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.no_statement_unreconciled_receipt +#: model:account.report.line,name:odex30_account_reports.unreconciled_last_statement_receipts +msgid "Including Unreconciled Receipts" +msgstr "شاملة الإيصالات غير المسواة " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_multicurrency_revaluation_wizard__income_provision_account_id +msgid "Income Account" +msgstr "حساب الدخل" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_company__account_revaluation_income_provision_account_id +msgid "Income Provision Account" +msgstr "حساب أحكام الدخل " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +msgid "Income Provision for %s" +msgstr "حكم الدخل لـ %s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/bank_reconciliation_report.py:0 +msgid "Inconsistent Statements" +msgstr "كشوفات الحساب غير المتسقة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Inconsistent data: more than one external value at the same date for a " +"'most_recent' external line." +msgstr "" +"Inconsistent data: more than one external value at the same date for a " +"'most_recent' external line." + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Inconsistent report_id in options dictionary. Options says %" +"(options_report)s; report is %(report)s." +msgstr "" +"report_id غير متسق في دليل الخيارات. يقول الخيار %(options_report)s؛ التقرير " +"%(report)s. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/models/account_trial_balance_report.py:0 +msgid "Initial Balance" +msgstr "الرصيد الافتتاحي" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +msgid "Integer Rounding" +msgstr "تقريب العدد الصحيح " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filters.js:0 +msgid "Intervals cannot be smaller than 1" +msgstr "لا يمكن أن تكون الفترات الزمنية أقل من 1 " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "Intra-community taxes are applied on" +msgstr "الضرائب بين المجتمعات مطبقة على " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Invalid domain formula in expression \"%(expression)s\" of line \"%" +"(line)s\": %(formula)s" +msgstr "" +"صيغة النطاق غير صالحة في التعبير \"%(expression)s\" في البند \"%(line)s\": %" +"(formula)s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Invalid method “%s”" +msgstr "الطريقة غير صحيحة \"%s\" " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Invalid subformula in expression \"%(expression)s\" of line \"%(line)s\": %" +"(subformula)s" +msgstr "" +"الصيغة الفرعية غير صالحة في التعبير \"%(expression)s\" في البند \"%" +"(line)s\": %(subformula)s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Invalid token '%(token)s' in account_codes formula '%(formula)s'" +msgstr "الرمز غير صالح '%(token)s' في صيغة account_codes '%(formula)s' " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filter_aging.xml:0 +#: model:account.report.column,name:odex30_account_reports.aged_payable_report_invoice_date +#: model:account.report.column,name:odex30_account_reports.aged_receivable_report_invoice_date +#: model:account.report.column,name:odex30_account_reports.customer_statement_report_invoicing_date +#: model:account.report.column,name:odex30_account_reports.followup_report_invoicing_date +#: model:account.report.column,name:odex30_account_reports.partner_ledger_report_invoicing_date +msgid "Invoice Date" +msgstr "تاريخ الفاتورة" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_journal_report_audit_move_line_search +msgid "Invoice lines" +msgstr "بنود الفاتورة" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report__is_account_coverage_report_available +msgid "Is Account Coverage Report Available" +msgstr "تقرير تغطية الحسابات متاح " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "It seems there is some depending closing move to be posted" +msgstr "يبدو أنه توجد حركة إغلاق معتمدة على غيرها يجب أن يتم ترحيلها. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "It's not possible to select a budget with the horizontal group feature." +msgstr "لا يمكن تحديد ميزانية باستخدام خاصية المجموعة الأفقية. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "It's not possible to select a horizontal group with the budget feature." +msgstr "لا يمكن تحديد مجموعة أفقية باستخدام خاصية الميزانية. " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget__item_ids +msgid "Items" +msgstr "العناصر " + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.partner_ledger_report_journal_code +#: model:ir.model,name:odex30_account_reports.model_account_journal +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_financial_year_op__account_tax_periodicity_journal_id +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_multicurrency_revaluation_wizard__journal_id +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_company__account_tax_periodicity_journal_id +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_config_settings__account_tax_periodicity_journal_id +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.setup_financial_year_opening_form +msgid "Journal" +msgstr "دفتر اليومية" + +#. module: odex30_account_reports +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_ja +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_ja +msgid "Journal Audit" +msgstr "تدقيق دفتر اليومية " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_move +msgid "Journal Entry" +msgstr "قيد اليومية" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_move_line +msgid "Journal Item" +msgstr "عنصر اليومية" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/models/account_trial_balance_report.py:0 +#: code:addons/odex30_account_reports/models/bank_reconciliation_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/general_ledger/line_name.xml:0 +#: code:addons/odex30_account_reports/static/src/components/partner_ledger/line_name.xml:0 +msgid "Journal Items" +msgstr "عناصر اليومية" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Journal Items for Tax Audit" +msgstr "عناصر اليومية للتدقيق الضريبي" + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.journal_report +msgid "Journal Report" +msgstr "تقرير اليومية " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_journal_report_handler +msgid "Journal Report Custom Handler" +msgstr "المعالج المخصص لتقرير اليومية " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Journal items with archived tax tags" +msgstr "عناصر دفتر اليومية مع علامات تصنيف مؤرشفة للضريبة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Journals" +msgstr "دفاتر اليومية" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_export_filters +msgid "Journals:" +msgstr "دفاتر اليومية:" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_liabilities_view0 +msgid "LIABILITIES" +msgstr "التزامات" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_liabilities_and_equity_view0 +msgid "LIABILITIES + EQUITY" +msgstr "الالتزامات + رأس المال " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/static/src/components/account_report/line/popover/debug_popover.xml:0 +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +#: model:account.report.column,name:odex30_account_reports.bank_reconciliation_report_label +msgid "Label" +msgstr "بطاقة عنوان" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__mail_lang +msgid "Lang" +msgstr "اللغة " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_reports_journal_dashboard_kanban_view +msgid "Last Statement balance + Transactions since statement" +msgstr "رصيد آخر كشف حساب + المعاملات منذ إصدار كشف الحساب " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_multicurrency_revaluation_wizard__write_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_annotation__write_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget__write_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget_item__write_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_file_download_error_wizard__write_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group__write_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group_rule__write_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__write_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard__write_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard_format__write_uid +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_tax_unit__write_uid +msgid "Last Updated by" +msgstr "آخر تحديث بواسطة" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_multicurrency_revaluation_wizard__write_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_annotation__write_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget__write_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget_item__write_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_file_download_error_wizard__write_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group__write_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group_rule__write_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__write_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard__write_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard_format__write_date +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_tax_unit__write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.last_statement_balance +msgid "Last statement balance" +msgstr "رصيد آخر كشف حساب " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Later" +msgstr "لاحقاً" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_cost_sales0 +msgid "Less Costs of Revenue" +msgstr "تكاليف إيرادات أقل " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_expense0 +msgid "Less Operating Expenses" +msgstr "نفقات تشغيلية أقل " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_depreciation0 +msgid "Less Other Expenses" +msgstr "نفقات أخرى أقل " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_annotation__line_id +msgid "Line" +msgstr "البند " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Line '%(child)s' is configured to appear before its parent '%(parent)s'. " +"This is not allowed." +msgstr "" +"تم تهيئة البند '%(child)s' ليظهر قبل البند الأصلي '%(parent)s'. لا يُسمح " +"بذلك. " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_form +msgid "Lines" +msgstr "البنود" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Load more..." +msgstr "تحميل المزيد... " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__mail_attachments_widget +msgid "Mail Attachments Widget" +msgstr "أداة مرفقات البريد الإلكتروني " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_tax_unit__main_company_id +msgid "Main Company" +msgstr "الشركة الرئيسية " + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_account_tax_unit__main_company_id +msgid "" +"Main company of this unit; the one actually reporting and paying the taxes." +msgstr "" +"الشركة الرئيسية لهذه الوحدة؛ الشركة التي تقوم بإصدار التقارير ودفع الضرائب. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_multicurrency_revaluation_report.py:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_account_multicurrency_revaluation_wizard +msgid "Make Adjustment Entry" +msgstr "إنشاء قيد تعديل " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_report_file_download_error_wizard +msgid "Manage the file generation errors from report exports." +msgstr "قم بإدارة أخطاء إنشاء الملفات من عمليات تصدير التقارير. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Manual value" +msgstr "القيمة اليدوية " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Manual values" +msgstr "القيم اليدوية " + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.partner_ledger_report_matching_number +msgid "Matching" +msgstr "مطابقة" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_account_tax_unit__company_ids +msgid "Members of this unit" +msgstr "أعضاء هذه الوحدة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Method '%(method_name)s' must start with the '%(prefix)s' prefix." +msgstr "يجب أن تبدأ الطريقة '%(method_name)s' بالبادئة '%(prefix)s'. " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.misc_operations +msgid "Misc. operations" +msgstr "العمليات المتنوعة " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__mode +msgid "Mode" +msgstr "الوضع" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group_rule__res_model_name +msgid "Model" +msgstr "النموذج " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Month" +msgstr "الشهر" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_budget_form +msgid "Months" +msgstr "شهور" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_export_filters +msgid "Multi-Ledger:" +msgstr "دفتر الأستاذ المتعدد " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Multi-ledger" +msgstr "دفتر الأستاذ المتعدد " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_multicurrency_revaluation_report_handler +msgid "Multicurrency Revaluation Report Custom Handler" +msgstr "المعالج المخصص لتقرير إعادة التقييم متعدد العملات " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_multicurrency_revaluation_wizard +msgid "Multicurrency Revaluation Wizard" +msgstr "مُعالج إعادة التقييم متعدد العملات " + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:odex30_account_reports.selection__account_report_send__mode__multi +msgid "Multiple Recipients" +msgstr "عدة مستلمين " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/res_company.py:0 +msgid "" +"Multiple draft tax closing entries exist for fiscal position %(position)s " +"after %(period_start)s. There should be at most one. \n" +" %(closing_entries)s" +msgstr "" +"توجد عدة قيود إقفال الضريبة بحالة المسودة في الوضع المالي %(position)s بعد %" +"(period_start)s. يجب أن يكون هناك واحد فقط كحد أقصى. \n" +" %(closing_entries)s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/res_company.py:0 +msgid "" +"Multiple draft tax closing entries exist for your domestic region after %" +"(period_start)s. There should be at most one. \n" +" %(closing_entries)s" +msgstr "" +"توجد عدة قيود إقفال للضريبة بحالة المسودة في منطقتك بعد%(period_start)s. يجب " +"أن يكون هناك واحد فقط كحد أقصى. \n" +" %(closing_entries)s " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_general_ledger.py:0 +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model:account.report.line,name:odex30_account_reports.journal_report_line +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget__name +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group__name +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard_format__name +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_tax_unit__name +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.duplicated_vat_partner_tree_view +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_journal_report_taxes_summary +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_tax_unit_form +msgid "Name" +msgstr "الاسم" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_account_reports_export_wizard__doc_name +msgid "Name to give to the generated documents." +msgstr "الاسم لمنحه للمستندات المنشأة. " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_profit0 +#: model:account.report.line,name:odex30_account_reports.account_financial_report_net_profit0 +msgid "Net Profit" +msgstr "صافي الربح" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_net_assets0 +msgid "Net assets" +msgstr "صافي الأصول" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_cash_flow_report.py:0 +msgid "Net increase in cash and cash equivalents" +msgstr "صافي الزيادة في النقد وما يعادل النقد " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_npmargin0 +msgid "Net profit margin (net profit / revenue)" +msgstr "صافي هامش الربح (صافي الربح / الإيرادات) " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_reports_journal_dashboard_kanban_view +msgid "Never miss a tax deadline." +msgstr "لا تفوت أي موعد نهائي بعد الآن. " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/edit_popover.xml:0 +msgid "No" +msgstr "لا" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "No Comparison" +msgstr "بلا مقارنة" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "No Journal" +msgstr "لا يوجد دفتر يومية " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "No VAT number associated with your company. Please define one." +msgstr "لا يوجد رقم ضريبة مرتبط بشركتك. الرجاء تحديد واحد. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +msgid "No adjustment needed" +msgstr "لا حاجة لإجراء أي تعديل " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/account_report.xml:0 +msgid "No data to display !" +msgstr "لا توجد بيانات لعرضها! " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/chart_template.py:0 +msgid "No default miscellaneous journal could be found for the active company" +msgstr "لم يتم العثور على دفتر يومية افتراضي للمتفرقات للشركة الفعالة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "No entry to generate." +msgstr "لا يوجد قيد لإنشائه. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +msgid "No provision needed was found." +msgstr "لم يتم العثور على أي أحكام مطلوبة. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Non Trade Partners" +msgstr "الشركاء غير التجاريين. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Non Trade Payable" +msgstr "حساب الدائنين غير التجاري " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Non Trade Receivable" +msgstr "حساب المدينين غير التجاري " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_journal_report_taxes_summary +msgid "Non-Deductible" +msgstr "غير قابلة للاقتطاع " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_horizontal_groups.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +#: code:addons/odex30_account_reports/static/src/components/sales_report/filters/filters.js:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_form +msgid "None" +msgstr "لا شيء" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Not Started" +msgstr "لم يبدأ بعد " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Number of periods cannot be smaller than 1" +msgstr "لا يمكن أن يكون عدد الفترات أقل من 1 " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_off_sheet +msgid "OFF BALANCE SHEET ACCOUNTS" +msgstr "الحسابات خارج الميزانية العمومية " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filters.js:0 +msgid "Odoo Warning" +msgstr "تحذير من أودو" + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.aged_payable_report_period5 +#: model:account.report.column,name:odex30_account_reports.aged_receivable_report_period5 +msgid "Older" +msgstr "أقدم" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/report_export_wizard.py:0 +msgid "One of the formats chosen can not be exported in the DMS" +msgstr "إحدى الصيغ التي اخترتها لا يمكن تصديرها في برنامج إدارة المستندات " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "Only Billing Administrators are allowed to change lock dates!" +msgstr "مديرو الفوترة وحدهم المصرح لهم بتغيير تواريخ الإقفال! " + +#. module: odex30_account_reports +#: model:ir.actions.server,name:odex30_account_reports.action_account_reports_customer_statements +msgid "Open Customer Statements" +msgstr "فتح كشوفات العملاء " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_financial_year_op +msgid "Opening Balance of Financial Year" +msgstr "الرصيد الافتتاحي للسنة المالية " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_operating_income0 +msgid "Operating Income (or Loss)" +msgstr "الدخل التشغيلي (أو الخسائر التشغيلية) " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_expression_form +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_form +msgid "Options" +msgstr "الخيارات" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_export_filter_extra_options_template +msgid "Options:" +msgstr "الخيارات: " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.outstanding +msgid "Outstanding Receipts/Payments" +msgstr "المدفوعات/الإيصالات المستحقة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_followup_report.py:0 +msgid "Overdue" +msgstr "متأخر" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "PDF" +msgstr "PDF" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard__report_id +msgid "Parent Report Id" +msgstr "معرف التقرير الأساسي " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_reports_export_wizard_format__export_wizard_id +msgid "Parent Wizard" +msgstr "المعالج الأساسي " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/line_name/line_name.xml:0 +#: code:addons/odex30_account_reports/static/src/components/partner_ledger/line_name.xml:0 +#: model:account.report.column,name:odex30_account_reports.general_ledger_report_partner_name +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__partner_ids +msgid "Partner" +msgstr "الشريك" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Partner Categories" +msgstr "فئات الشركاء " + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.partner_ledger_report +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_partner_ledger +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_partner_ledger +msgid "Partner Ledger" +msgstr "دفتر الأستاذ العام للشركاء" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_partner_ledger_report_handler +msgid "Partner Ledger Custom Handler" +msgstr "المعالج المخصص لدفتر الأستاذ العام الخاص بالشريك " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/line_name/line_name.xml:0 +#: code:addons/odex30_account_reports/static/src/components/partner_ledger/line_name.xml:0 +msgid "Partner is bad" +msgstr "الشريك سيء " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/line_name/line_name.xml:0 +#: code:addons/odex30_account_reports/static/src/components/partner_ledger/line_name.xml:0 +msgid "Partner is good" +msgstr "الشريك جيد " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/account_report_send.py:0 +msgid "Partner(s) should have an email address." +msgstr "يجب أن يكون للوكلاء عنوان بريد إلكتروني. " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_partner.xml:0 +msgid "Partners" +msgstr "الشركاء" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_export_filters +msgid "Partners Categories:" +msgstr "فئات الشركاء: " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "Partners with duplicated VAT numbers" +msgstr "الشركاء الذين يملكون أرقام ضريبية مكررة " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_export_filters +msgid "Partners:" +msgstr "الشركاء:" + +#. module: odex30_account_reports +#: model:mail.activity.type,name:odex30_account_reports.mail_activity_type_tax_report_to_pay +msgid "Pay Tax" +msgstr "دفع الضريبة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "Pay tax: %s" +msgstr "دفع الضريبة: %s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_aged_partner_balance.py:0 +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Payable" +msgstr "الدائن" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Payable tax amount" +msgstr "مبلغ الضريبة الدائن " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_current_liabilities_payable +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_creditors0 +msgid "Payables" +msgstr "الدائنون" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_performance0 +msgid "Performance" +msgstr "الأداء" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Period" +msgstr "الفترة" + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.aged_payable_report_period1 +#: model:account.report.column,name:odex30_account_reports.aged_receivable_report_period1 +msgid "Period 1" +msgstr "الفترة 1 " + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.aged_payable_report_period2 +#: model:account.report.column,name:odex30_account_reports.aged_receivable_report_period2 +msgid "Period 2" +msgstr "الفترة 2 " + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.aged_payable_report_period3 +#: model:account.report.column,name:odex30_account_reports.aged_receivable_report_period3 +msgid "Period 3" +msgstr "الفترة 3 " + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.aged_payable_report_period4 +#: model:account.report.column,name:odex30_account_reports.aged_receivable_report_period4 +msgid "Period 4" +msgstr "الفترة 4 " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "Period order" +msgstr "طلب المدة " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_config_settings__account_tax_periodicity +#: model:ir.model.fields,help:odex30_account_reports.field_account_financial_year_op__account_tax_periodicity +#: model:ir.model.fields,help:odex30_account_reports.field_res_company__account_tax_periodicity +#: model:ir.model.fields,help:odex30_account_reports.field_res_config_settings__account_tax_periodicity +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.res_config_settings_view_form +msgid "Periodicity" +msgstr "الوتيرة " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_financial_year_op__account_tax_periodicity +msgid "Periodicity in month" +msgstr "الوتيرة في الشهر " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Periods" +msgstr "الفترات " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_analytic_groupby.xml:0 +msgid "Plans" +msgstr "الخطط " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/budget.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Please enter a valid budget name." +msgstr "يُرجى إدخال اسم ميزانية صالح. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/multicurrency_revaluation_report/filters/filters.js:0 +msgid "Please enter a valid number." +msgstr "يُرجى إدخال رقم صالح. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/account_report_send.py:0 +msgid "Please select a mail template to send multiple statements." +msgstr "يرجى تحديد قالب بريد لإرسال عدة كشوفات. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Please select the main company and its branches in the company selector to " +"proceed." +msgstr "يرجى تحديد الشركة الرئيسية وفروعها في أداة اختيار الشركة للمتابعة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Please set the deferred accounts in the accounting settings." +msgstr "يرجى تعيين الحسابات المؤجلة في إعدادات المحاسبة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Please set the deferred journal in the accounting settings." +msgstr "يرجى إعداد دفتر اليومية المؤجل في إعدادات المحاسبة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Please specify the accounts necessary for the Tax Closing Entry." +msgstr "يرجى تحديد الحسابات الضرورية للقيد الختامي للضريبة. " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_fixed_assets_view0 +msgid "Plus Fixed Assets" +msgstr "بالإضافة الى الأصول الثابتة" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_non_current_assets_view0 +msgid "Plus Non-current Assets" +msgstr "بالإضافة للأصول غير المتداولة" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_non_current_liabilities0 +msgid "Plus Non-current Liabilities" +msgstr "بالإضافة للالتزامات غير الجارية " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_other_income0 +msgid "Plus Other Income" +msgstr "بالإضافة إلى دخل آخر " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_position0 +msgid "Position" +msgstr "المنصب الوظيفي " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/edit_popover.xml:0 +msgid "Post" +msgstr "منشور " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Posted Entries" +msgstr "القيود المُرحّلة " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_prepayements0 +msgid "Prepayments" +msgstr "المدفوعات المسددة مقدمًا " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_multicurrency_revaluation_wizard__preview_data +msgid "Preview Data" +msgstr "معاينة البيانات " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "Previous Period" +msgstr "الفترة السابقة" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "Previous Periods" +msgstr "الفترات السابقة " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "Previous Year" +msgstr "العام الماضي" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "Previous Years" +msgstr "السنوات الماضية " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_retained_earnings_line_2 +msgid "Previous Years Retained Earnings" +msgstr "الأرباح المحتجزة للسنة الماضية " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_previous_year_earnings0 +msgid "Previous Years Unallocated Earnings" +msgstr "أرباح السنين الماضية غير المخصصة" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_send_form +msgid "Print & Send" +msgstr "طباعة وإرسال " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Proceed" +msgstr "استمرار " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_account_multicurrency_revaluation_wizard +msgid "" +"Proceed with caution as there might be an existing adjustment for this " +"period (" +msgstr "الاستمرار بحذر لأنه قد تكون هناك تعديلات لهذه الفترة (" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +#: code:addons/odex30_account_reports/static/src/components/deferred_reports/groupby.xml:0 +msgid "Product" +msgstr "المنتج " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/deferred_reports/groupby.xml:0 +msgid "Product Category" +msgstr "فئة المنتج " + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.profit_and_loss +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_pl +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_profit_and_loss +msgid "Profit and Loss" +msgstr "الربح والخسارة " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_profitability0 +msgid "Profitability" +msgstr "الربحية " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_move_form_vat_return +msgid "Proposition of tax closing journal entry." +msgstr "مقترح قيد يومية إقفال الضريبة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +msgid "Provision for %(for_cur)s (1 %(comp_cur)s = %(rate)s %(for_cur)s)" +msgstr "الحكل لـ %(for_cur)s (1 %(comp_cur)s = %(rate)s %(for_cur)s) " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Quarter" +msgstr "ربع السنة" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/multicurrency_revaluation_report/line_name.xml:0 +msgid "Rates" +msgstr "الأسعار" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_aged_partner_balance.py:0 +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Receivable" +msgstr "المدين" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Receivable tax amount" +msgstr "مبلغ الضريبة المدين " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_debtors0 +#: model:account.report.line,name:odex30_account_reports.account_financial_report_receivable0 +msgid "Receivables" +msgstr "المدينين" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__mail_partner_ids +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_send_form +msgid "Recipients" +msgstr "المستلمين" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_reports_journal_dashboard_kanban_view +msgid "Reconciliation Report" +msgstr "تقرير التسوية " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_financial_year_op__account_tax_periodicity_reminder_day +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_config_settings__account_tax_periodicity_reminder_day +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.setup_financial_year_opening_form +msgid "Reminder" +msgstr "تذكير" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_annotation__report_id +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__account_report_id +msgid "Report" +msgstr "التقرير" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_line_form +msgid "Report Line" +msgstr "بند التقرير" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_form +msgid "Report Name" +msgstr "اسم التقرير" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__report_options +msgid "Report Options" +msgstr "خيارات التقرير" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Report lines mentioning the account code" +msgstr "بنود التقرير التي تحتوي على كود الحساب " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_variant.xml:0 +msgid "Report:" +msgstr "التقرير:" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.res_config_settings_view_form +msgid "Reporting" +msgstr "إعداد التقارير " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group__report_ids +msgid "Reports" +msgstr "التقارير" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_line_form +msgid "Reset to Standard" +msgstr "إعادة التعيين إلى الوضع القياسي " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_retained_earnings0 +msgid "Retained Earnings" +msgstr "الأرباح المحتجزة" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_return_investment0 +msgid "Return on investments (net profit / assets)" +msgstr "العائد على الاستثمار (صافي الربح / الأصول)" + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_income0 +#: model:account.report.line,name:odex30_account_reports.account_financial_report_revenue0 +msgid "Revenue" +msgstr "الإيرادات " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_multicurrency_revaluation_wizard__reversal_date +msgid "Reversal Date" +msgstr "تاريخ الانعكاس" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "Reversal of Grouped Deferral Entry of %s" +msgstr "عكس القيد المؤجل المجمع لـ %s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/multicurrency_revaluation.py:0 +msgid "Reversal of: %s" +msgstr "عكس: %s" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_account_report_search +msgid "Root Report" +msgstr "تقرير الجذر " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_horizontal_group__rule_ids +msgid "Rules" +msgstr "القواعد" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +msgid "Same Period Last Year" +msgstr "نفس الفترة العام الماضي" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/search_bar/search_bar.xml:0 +msgid "Search..." +msgstr "بحث..." + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_form +msgid "Sections" +msgstr "الأقسام " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_customer_statement.py:0 +#: code:addons/odex30_account_reports/models/account_partner_ledger.py:0 +msgid "Send" +msgstr "إرسال" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_partner_ledger.py:0 +msgid "Send %s Statement" +msgstr "إرسال كشف حساب %s " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report__send_and_print_values +msgid "Send And Print Values" +msgstr "إرسال وطباعة القيم " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__send_mail_readonly +msgid "Send Mail Readonly" +msgstr "إرسال بريد إلكتروني للقراءة فقط " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_partner_ledger.py:0 +msgid "Send Partner Ledgers" +msgstr "إرسال دفاتر الأستاذ العام للشركاء " + +#. module: odex30_account_reports +#: model:ir.actions.server,name:odex30_account_reports.ir_cron_account_report_send_ir_actions_server +msgid "Send account reports automatically" +msgstr "إرسال تقارير الحسابات تلقائياً " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "Send tax report: %s" +msgstr "إرسال التقرير الضريبي: %s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/account_report_send.py:0 +msgid "Sending statements" +msgstr "جاري إرسال كشوفات الحساب " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_budget__sequence +msgid "Sequence" +msgstr "تسلسل " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "Services" +msgstr "الخدمات" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_journal_report_audit_move_line_tree +msgid "Set as Checked" +msgstr "التعيين كتمّ التحقق منه " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.duplicated_vat_partner_tree_view +msgid "Set as main" +msgstr "تعيين كالرئيسي " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_report_executivesummary_st_cash_forecast0 +msgid "Short term cash forecast" +msgstr "توقعات النقد قصيرة الأجل" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filter_extra_options.xml:0 +msgid "Show Account" +msgstr "إظهار الحساب " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_budgets.xml:0 +msgid "Show All Accounts" +msgstr "إظهار كافة الحسابات " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/filter_extra_options.xml:0 +msgid "Show Currency" +msgstr "إظهار العملة " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_multicurrency_revaluation_wizard__show_warning_move_id +msgid "Show Warning Move" +msgstr "إظهار حركة تحذير " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/deferred_reports/warnings.xml:0 +msgid "Show already generated deferrals." +msgstr "إظهار التأجيلات التي تم إنشاؤها بالفعل. " + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:odex30_account_reports.selection__account_report_send__mode__single +msgid "Single Recipient" +msgstr "مستلم واحد " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "Some" +msgstr "بعض " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/tax_report/warnings.xml:0 +msgid "Some journal items appear to point to obsolete report lines." +msgstr "يبدو أن بعض عناصر دفتر اليومية تشير إلى بنود تقرير قديمة. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "" +"Some lines in the report involve partners that share the same VAT number.\n" +"\n" +" Please review the" +msgstr "" +"تتضمن بعض بنود التقرير شركاء لهم نفس رقم ضريبة القيمة المضافة.\n" +"\n" +" يُرجى مراجعة " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_date.xml:0 +msgid "Specific Date" +msgstr "تاريخ محدد" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_res_company__account_representative_id +msgid "" +"Specify an Accounting Firm that will act as a representative when exporting " +"reports." +msgstr "" +"قم بتحديد منشأة محاسبية التي سوف تؤدي دور الوكيل أو الممثل عند تصدير " +"التقارير. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +msgid "Split Horizontally" +msgstr "التقسيم أفقياَ " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report__tax_closing_start_date +msgid "Start Date" +msgstr "تاريخ البدء " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_company__account_tax_periodicity_reminder_day +msgid "Start from" +msgstr "البدء من " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Starting Balance" +msgstr "الرصيد الافتتاحي" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/aged_partner_balance/line_name/line_name.xml:0 +msgid "Statement" +msgstr "كشف الحساب" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/account_report_send.py:0 +msgid "Statements are being sent in the background." +msgstr "يتم إرسال كشوف الحسابات في الخلفية. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line/popover/debug_popover.xml:0 +msgid "Subformula" +msgstr "صيغة فرعية " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__mail_subject +msgid "Subject" +msgstr "الموضوع " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_send_form +msgid "Subject..." +msgstr "الموضوع..." + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "T: %s" +msgstr "T: %s" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_partner.xml:0 +msgid "Tags" +msgstr "علامات التصنيف " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_general_ledger.py:0 +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_journal_report_taxes_summary +msgid "Tax Amount" +msgstr "مبلغ الضريبة " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_journal_report_taxes_summary +msgid "Tax Applied" +msgstr "تم تطبيق الضريبة " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_bank_statement_line__tax_closing_alert +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_move__tax_closing_alert +msgid "Tax Closing Alert" +msgstr "تنبيه الإقفال الضريبي " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_bank_statement_line__tax_closing_report_id +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_move__tax_closing_report_id +msgid "Tax Closing Report" +msgstr "تقرير الإقفال الضريبي " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_general_ledger.py:0 +msgid "Tax Declaration" +msgstr "الإقرار الضريبي " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Tax Grids" +msgstr "شبكات الضرائب" + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_tax_unit__vat +msgid "Tax ID" +msgstr "معرف الضريبة" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.company_information +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.tax_information_customer_report +msgid "Tax ID:" +msgstr "معرف الضريبة: " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Tax Paid Adjustment" +msgstr "تعديل الضريبة المدفوعة " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/tax_report/filters/filter_date.xml:0 +msgid "Tax Period" +msgstr "الفترة الضريبية " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "Tax Received Adjustment" +msgstr "تعديل الضريبة المتلقاة " + +#. module: odex30_account_reports +#: model:mail.activity.type,name:odex30_account_reports.tax_closing_activity_type +#: model:mail.activity.type,summary:odex30_account_reports.tax_closing_activity_type +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_move_form_vat_return +msgid "Tax Report" +msgstr "التقرير الضريبي " + +#. module: odex30_account_reports +#: model:mail.activity.type,name:odex30_account_reports.mail_activity_type_tax_report_error +msgid "Tax Report - Error" +msgstr "" + +#. module: odex30_account_reports +#: model:mail.activity.type,name:odex30_account_reports.mail_activity_type_tax_report_to_be_sent +msgid "Tax Report Ready" +msgstr "التقرير الضريبي جاهز " + +#. module: odex30_account_reports +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_gt +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_gt +msgid "Tax Return" +msgstr "الإقرار الضريبي " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.res_config_settings_view_form +msgid "Tax Return Periodicity" +msgstr "مدى دورية الإقرار الضريبي " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_tax_unit +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_tax_unit_form +msgid "Tax Unit" +msgstr "الوحدة الضريبية " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_tax_unit.xml:0 +msgid "Tax Unit:" +msgstr "وحدة الضريبة: " + +#. module: odex30_account_reports +#: model:ir.actions.act_window,name:odex30_account_reports.action_view_tax_units +#: model:ir.model.fields,field_description:odex30_account_reports.field_res_company__account_tax_unit_ids +#: model:ir.ui.menu,name:odex30_account_reports.menu_view_tax_units +msgid "Tax Units" +msgstr "الوحدات الضريبية " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_mail_activity__account_tax_closing_params +msgid "Tax closing additional params" +msgstr "المعايير الإضافية للإقفال الضريبي " + +#. module: odex30_account_reports +#: model:mail.activity.type,summary:odex30_account_reports.mail_activity_type_tax_report_to_pay +msgid "Tax is ready to be paid" +msgstr "الضريبة جاهزة ليتم دفعها " + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:odex30_account_reports.selection__mail_activity_type__category__tax_report +msgid "Tax report" +msgstr "التقرير الضريبي " + +#. module: odex30_account_reports +#: model:mail.activity.type,summary:odex30_account_reports.mail_activity_type_tax_report_to_be_sent +msgid "Tax report is ready to be sent to the administration" +msgstr "التقرير الضريبي جاهز لإرساله إلى الإدارة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/res_company.py:0 +msgid "Tax return" +msgstr "الإقرار الضريبي " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +msgid "Taxes" +msgstr "الضرائب" + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/journal_report/line/line.xml:0 +msgid "Taxes Applied" +msgstr "تم تطبيق الضرائب" + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_account_tax_unit__fpos_synced +msgid "" +"Technical field indicating whether Fiscal Positions exist for all companies " +"in the unit" +msgstr "" +"حقل تقني يشير إلى ما إذا كانت الأوضاع المالية موجودة لكافة الشركات في الوحدة " +"أم لا " + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_ir_actions_account_report_download +msgid "Technical model for accounting report downloads" +msgstr "نموذج تقني لتنزيلات التقارير المحاسبية " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/ellipsis/ellipsis.js:0 +msgid "Text copied" +msgstr "تم نسخ النص " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "The Accounts Coverage Report is not available for this report." +msgstr "تقرير تغطية الحسابات غير متاح لهذا التقرير. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_name/popover_line/annotation_popover_line.js:0 +msgid "The annotation shouldn't have an empty value." +msgstr "يجب ألا يحتوي الشرح على قيمة فارغة. " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_annotation__text +msgid "The annotation's content." +msgstr "محتوى الشرح. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "" +"The attachments of the tax report can be found on the %(link_start)sclosing " +"entry%(link_end)s of the representative company." +msgstr "" +"يمكن العثور على مرفقات التقرير الضريبي في %(link_start)sقيد الإقفال%" +"(link_end)s للشركة الممثلة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_partner_ledger.py:0 +msgid "The column '%s' is not available for this report." +msgstr "العمود '%s' غير متاح لهذا التقرير. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_tax.py:0 +msgid "" +"The country detected for this VAT number does not match the one set on this " +"Tax Unit." +msgstr "" +"لا تطابق الدولة التي تم رصدها لرقم الضريبة الدولة التي تم تعيينها لهذا الوضع " +"الضريبي. " + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_account_tax_unit__country_id +msgid "" +"The country in which this tax unit is used to group your companies' tax " +"reports declaration." +msgstr "" +"الدولة التي تُستخدَم فيها هذه الوحدة الضريبية لتجميع إقرارات التقارير الضريبية " +"لشركتك. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_multicurrency_revaluation_report.py:0 +msgid "The currency rate cannot be equal to zero" +msgstr "لا يمكن أن يكون سعر صرف العملة مساوياً لصفر " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "The current balance in the" +msgstr "الرصيد الحالي في " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "" +"The currently selected dates don't match a tax period. The closing entry " +"will be created for the closest-matching period according to your " +"periodicity setup." +msgstr "" +"لا تتطابق التواريخ المحددة حالياً مع إحدى الفترات الضريبية. سيتم إنشاء القيد " +"الختامي لأقرب فترة مطابقة وفقاً لإعدادات معدل التكرار والدورية الخاصة بك. " + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_account_report_annotation__fiscal_position_id +msgid "The fiscal position used while annotating." +msgstr "الوضع المالي المُستَخدَم عند الشرح. " + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_account_report_annotation__line_id +msgid "The id of the annotated line." +msgstr "معرِّف البند الذي تم شرحه. " + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_account_report_annotation__report_id +msgid "The id of the annotated report." +msgstr "معرِّف التقرير الذي تم شرحه. " + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_account_tax_unit__vat +msgid "The identifier to be used when submitting a report for this unit." +msgstr "المعرف لاستخدامه عند تسليم تقرير لهذه الوحدة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_tax.py:0 +msgid "The main company of a tax unit has to be part of it." +msgstr "يجب أن تكون الشركة الرئيسية لوحدة ضريبية جزءاً منها. " + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_res_company__account_tax_unit_ids +msgid "The tax units this company belongs to." +msgstr "الوحدة الضريبية التي تنتمي إليها هذه الشركة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "The used operator is not supported for this expression." +msgstr "المشغل المستخدَم غير مدعوم لهذا التعبير. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/warnings.xml:0 +msgid "There are" +msgstr "هناك " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/account_report_send.py:0 +msgid "There are currently reports waiting to be sent, please try again later." +msgstr "هناك تقارير بانتظار إرسالها حالياً. يُرجى إعادة المحاولة لاحقاً. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/account_report.xml:0 +msgid "There is no data to display for the given filters." +msgstr "لا توجد بيانات لعرضها لعناصر التصفية المحددة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"This account exists in the Chart of Accounts but is not mentioned in any " +"line of the report" +msgstr "" +"الحساب موجود في شجرة الحسابات ولكنه غير مذكور في أي بند من بنود التقرير " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"This account is reported in a line of the report but does not exist in the " +"Chart of Accounts" +msgstr "" +"تم إعداد تقرير حول هذا الحساب في بند من التقرير ولكنه غير موجود في شجرة " +"الحسابات " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "This account is reported in multiple lines of the report" +msgstr "توجد عدة تقارير حول هذا الحساب في عدة بنود من التقرير " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "This account is reported multiple times on the same line of the report" +msgstr "توجد عدة تقارير حول هذا الحساب في نفس البند من التقرير " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.res_config_settings_view_form +msgid "" +"This allows you to choose the position of totals in your financial reports." +msgstr "يسمح لك هذا باختيار مكان الإجمالي في تقاريرك المالية." + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/warnings.xml:0 +msgid "" +"This company is part of a tax unit. You're currently not viewing the whole " +"unit." +msgstr "هذه الشركة هي جزء من وحدة ضريبية. لا تعرض حالياً الوحدة بأكملها. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/widgets/account_report_x2many/account_report_x2many.js:0 +msgid "" +"This line and all its children will be deleted. Are you sure you want to " +"proceed?" +msgstr "سيتم حذف هذا البند وكافة توابعه. هل أنت متأكد من أنك ترغب بالاستمرار؟ " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/widgets/account_report_x2many/account_report_x2many.xml:0 +msgid "This line is out of sequence." +msgstr "هذا البند خارج التسلسل. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/widgets/account_report_x2many/account_report_x2many.xml:0 +msgid "" +"This line is placed before its parent, which is not allowed. You can fix it " +"by dragging it to the proper position." +msgstr "" +"تم وضع هذا البند قبل البند الأصلي، وهو أمر غير مسموح به. يمكنك إصلاحه عن " +"طريق سحبه إلى المكان المناسب. " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_line_form +msgid "This line uses a custom user-defined 'Group By' value." +msgstr "" +"يستخدم هذا البند قيمة \"التجميع حسب\" المخصصة المعرفة من قِبَل المستخدم. " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_form +msgid "This option hides lines with a value of 0" +msgstr "يقوم هذا الخيار بإخفاء البنود التي قيمتها 0 " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "This report already has a menuitem." +msgstr "هذا التقرير يحتوي على عنصر قائمة بالفعل. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/tax_report/warnings.xml:0 +msgid "" +"This report contains inconsistencies. The affected lines are marked with a " +"warning." +msgstr "" +"يحتوي التقرير على بيانات غير متسقة. تم وضع علامة تحذير على البنود المتأثرة. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/multicurrency_revaluation_report/warnings.xml:0 +msgid "This report only displays the data of the active company." +msgstr "هذا التقرير يعرض فقط بيانات الشركة النشطة. " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.account_report_form +msgid "" +"This report uses report-specific code.\n" +" You can customize it manually, but any change in the " +"parameters used for its computation could lead to errors." +msgstr "" +"يستخدم هذا التقرير كود خاص بالتقرير.\n" +" يمكنك تخصيصه يدوياً، ولكن قد يؤدي أي تغيير في العوامل " +"المستخدمة في حسابه إلى حدوث أخطاء. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/warnings.xml:0 +msgid "" +"This report uses the CTA conversion method to consolidate multiple companies " +"using different currencies,\n" +" which can lead the report to be unbalanced." +msgstr "" +"يستخدم هذا التقرير طريقة التحويل CTA لدمج عدة شركات تستخدم عملات مختلفة،\n" +" مما قد يؤدي إلى اختلال توازن التقرير. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "This subformula references an unknown expression: %s" +msgstr "تشير الصيغة الفرعية إلى تعبير غير معروف: %s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"This tag is reported in a line of the report but is not linked to any " +"account of the Chart of Accounts" +msgstr "" +"تم إعداد تقرير حول علامة التصنيف هذه في بند من التقرير ولكنه غير مرتبط بأي " +"حساب في شجرة الحسابات " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_move_form_vat_return +msgid "" +"This tax closing entry is posted, but the tax lock date is earlier than the " +"covered period's last day. You might need to reset it to draft and refresh " +"its content, in case other entries using taxes have been posted in the " +"meantime." +msgstr "" +"تم ترحيل قيد الإقفال الضريبي هذا، ولكن تاريخ قفل الضريبة يسبق اليوم الأخير " +"للفترة المشمولة. قد تحتاج إلى إعادة تعيينه إلى حالة المسودة لتحديث محتواه، " +"في حال تم ترحيل قيود أخرى تستخدم الضرائب في هذه الأثناء. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_date.xml:0 +msgid "Today" +msgstr "اليوم " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +#: code:addons/odex30_account_reports/models/account_general_ledger.py:0 +#: code:addons/odex30_account_reports/models/account_journal_report.py:0 +#: code:addons/odex30_account_reports/models/account_partner_ledger.py:0 +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +#: model:account.report.column,name:odex30_account_reports.aged_payable_report_total +#: model:account.report.column,name:odex30_account_reports.aged_receivable_report_total +msgid "Total" +msgstr "الإجمالي" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Total %s" +msgstr "الإجمالي %s" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Trade Partners" +msgstr "شركاء تجاريون " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.transaction_without_statement +msgid "Transactions without statement" +msgstr "المعاملات التي ليس لها كشف حساب " + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.trial_balance_report +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_coa +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_coa +msgid "Trial Balance" +msgstr "ميزان المراجعة" + +#. module: odex30_account_reports +#: model:ir.model,name:odex30_account_reports.model_account_trial_balance_report_handler +msgid "Trial Balance Custom Handler" +msgstr "معالج مخصص لميزان المراجعة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "Triangular" +msgstr "مثلث الشكل " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Trying to dispatch an action on a report not compatible with the provided " +"options." +msgstr "جاري محاولة إرسال إجراء في تقرير غير متوافق مع الخيارات المتوفرة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "" +"Trying to expand a group for a line which was not generated by a report " +"line: %s" +msgstr "نحاول تفصيل مجموعة لبند لم يتم إنشاؤه بواسطة بند تقرير: %s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Trying to expand a line without an expansion function." +msgstr "نحاول تفصيل بند دون استخدام خاصية التفصيل. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Trying to expand groupby results on lines without a groupby value." +msgstr "نحاول تفصيل نتائج خاصية groupby دون قيمة groupby. " + +#. module: odex30_account_reports +#: model:account.report.line,name:odex30_account_reports.account_financial_unaffected_earnings0 +msgid "Unallocated Earnings" +msgstr "أرباح غير مخصصة" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Undefined" +msgstr "غير محدد" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +msgid "Unfold All" +msgstr "كشف الكل" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Unknown" +msgstr "غير معروف" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_partner_ledger.py:0 +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +msgid "Unknown Partner" +msgstr "شريك مجهول " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Unknown bound criterium: %s" +msgstr "فئة ربط غير معروفة: %s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Unknown date scope: %s" +msgstr "نطاق البيانات غير معروف: %s " + +#. module: odex30_account_reports +#: model:account.report,name:odex30_account_reports.multicurrency_revaluation_report +#: model:ir.actions.client,name:odex30_account_reports.action_account_report_multicurrency_revaluation +#: model:ir.ui.menu,name:odex30_account_reports.menu_action_account_report_multicurrency_revaluation +msgid "Unrealized Currency Gains/Losses" +msgstr "الأرباح/الخسائر غير المُدرَكة للعملة " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_extra_options.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_export_filter_extra_options_template +msgid "Unreconciled Entries" +msgstr "القيود غير المسواة " + +#. module: odex30_account_reports +#: model:account.report.column,name:odex30_account_reports.account_financial_report_ec_sales_vat +msgid "VAT Number" +msgstr "رقم ضريبة القيمة المضافة" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.setup_financial_year_opening_form +msgid "VAT Periodicity" +msgstr "وتيرة ضريبة القيمة المضافة " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line/popover/debug_popover.xml:0 +msgid "Value" +msgstr "القيمة" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "Vat closing from %(date_from)s to %(date_to)s" +msgstr "إغلاق ضريبة القيمة المضافة من %(date_from)s إلى %(date_to)s " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_journal_report_audit_move_line_tree +msgid "View" +msgstr "أداة العرض" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "View Bank Statement" +msgstr "عرض كشف الحساب البنكي " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/carryover_popover.xml:0 +msgid "View Carryover Lines" +msgstr "عرض بنود الترحيل " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "View Journal Entry" +msgstr "عرض قيد اليومية" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/models/account_sales_report.py:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_journal_report_audit_move_line_tree +msgid "View Partner" +msgstr "عرض الشريك" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/wizard/account_report_send.py:0 +msgid "View Partner(s)" +msgstr "View Partner(s)" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "View Payment" +msgstr "عرض الدفع " + +#. module: odex30_account_reports +#: model:ir.model.fields,field_description:odex30_account_reports.field_account_report_send__warnings +msgid "Warnings" +msgstr "تحذيرات" + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.res_config_settings_view_form +msgid "" +"When ticked, totals and subtotals appear below the sections of the report" +msgstr "عند التحديد، سوف تظهر المجاميع الكلية والفرعية تحت أقسام التقرير " + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_res_company__totals_below_sections +#: model:ir.model.fields,help:odex30_account_reports.field_res_config_settings__totals_below_sections +msgid "" +"When ticked, totals and subtotals appear below the sections of the report." +msgstr "عند التحديد، سوف تظهر المجاميع الكلية والفرعية تحت أقسام التقرير " + +#. module: odex30_account_reports +#: model:ir.model.fields,help:odex30_account_reports.field_account_account__exclude_provision_currency_ids +msgid "" +"Whether or not we have to make provisions for the selected foreign " +"currencies." +msgstr "ما إذا كان علينا إنشاء أحكام للعملات الأجنبية المختارة أم لا. " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_export_filter_extra_options_template +msgid "With Draft Entries" +msgstr "مع القيود بحالة المسودة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_general_ledger.py:0 +msgid "Wrong ID for general ledger line to expand: %s" +msgstr "المعرّف غير صحيح لبند دفتر الأستاذ العام لتفصيله: %s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_partner_ledger.py:0 +msgid "Wrong ID for partner ledger line to expand: %s" +msgstr "المعرّف غير صحيح لبند دفتر الأستاذ الخاص بالشريك لتفصيله: %s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "Wrong format for if_other_expr_above/if_other_expr_below formula: %s" +msgstr "الصيغة غير صحيحة لمعادلة if_other_expr_above/if_other_expr_below: %s " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "XLSX" +msgstr "XLSX" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filters.js:0 +msgid "Year" +msgstr "السنة " + +#. module: odex30_account_reports +#. odoo-javascript +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/edit_popover.xml:0 +msgid "Yes" +msgstr "نعم" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/multicurrency_revaluation_report/warnings.xml:0 +msgid "You are using custom exchange rates." +msgstr "أنت تستخدم أسعار صرف مخصصة " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "You can't open a tax report from a move without a VAT closing date." +msgstr "" +"لا يمكنك فتح تقرير ضريبي من حركة دون تاريخ إقفال ضريبة القيمة المضافة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move_line.py:0 +msgid "You cannot add taxes on a tax closing move line." +msgstr "لا يمكنك إضافة ضرائب في بند حركة إقفال ضريبي. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "" +"You cannot generate entries for a period that does not end at the end of the " +"month." +msgstr "لا يمكنك إنشاء قيود لفترة لا تنتهي بنهاية الشهر. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_deferred_reports.py:0 +msgid "You cannot generate entries for a period that is locked." +msgstr "لا يمكنك إنشاء قيود لفترة مقفلة. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "" +"You cannot reset this closing entry to draft, as another closing entry has " +"been posted at a later date." +msgstr "" +"لا يمكنك إعادة تعيين قيد الإقفال هذا إلى حالة المسودة، لأنه قد تم ترحيل قيد " +"إقفال آخر بتاريخ لاحق. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_move.py:0 +msgid "" +"You cannot reset this closing entry to draft, as it would delete carryover " +"values impacting the tax report of a locked period. Please change the " +"following lock dates to proceed: %(lock_date_info)s." +msgstr "" +"لا يمكنك إعادة تعيين قيد الإقفال هذا إلى حالة المسودة، لأن ذلك سيؤدي إلى حذف " +"القيم المرحّلة التي تؤثر على تقرير الضرائب لفترة مقفلة. يرجى تغيير تواريخ " +"القفل التالية للمتابعة: %(lock_date_info)s." + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "You cannot update this value as it's locked by: %s" +msgstr "" + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_multicurrency_revaluation_report.py:0 +msgid "You need to activate more than one currency to access this report." +msgstr "عليك تفعيل أكثر من عملة واحدة للوصول إلى هذا التقرير. " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_generic_tax_report.py:0 +msgid "" +"You're about the generate the closing entries of multiple companies at once. " +"Each of them will be created in accordance with its company tax periodicity." +msgstr "" +"أنت على وشك إنشاء القيود الختامية لعدة شركات في آنٍ واحد. سيتم إنشاء كل منها " +"وفقاً لمعدل تكرار ضريبة الشركة الخاصة بها. " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.journal_report_pdf_export_main +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_export_main +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.pdf_export_main_customer_report +msgid "[Draft]" +msgstr "[Draft]" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "addressed to" +msgstr "موجهة إلى " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "affected partners" +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/tax_report/warnings.xml:0 +msgid "and correct their tax tags if necessary." +msgstr "وتصحيح علامات تصنيف الضريبة إذا لزم الأمر. " + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:odex30_account_reports.selection__res_company__account_tax_periodicity__year +msgid "annually" +msgstr "سنوياً " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.res_config_settings_view_form +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.setup_financial_year_opening_form +msgid "days after period" +msgstr "أيام بعد الفترة " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "doesn't match the balance of your" +msgstr "لا يطابق رصيد " + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:odex30_account_reports.selection__res_company__account_tax_periodicity__2_months +msgid "every 2 months" +msgstr "كل شهرين " + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:odex30_account_reports.selection__res_company__account_tax_periodicity__4_months +msgid "every 4 months" +msgstr "كل 4 شهور " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "have a starting balance different from the previous ending balance." +msgstr "أن يكون الرصيد الافتتاحي مختلفاً عن الرصيد الختامي السابق " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/carryover_popover.xml:0 +msgid "in the next period." +msgstr "في الفترة القادمة. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "invoices" +msgstr "فواتير العملاء " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "journal items" +msgstr "عناصر اليومية " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "last bank statement" +msgstr "آخر كشف حساب بنكي " + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:odex30_account_reports.selection__res_company__account_tax_periodicity__monthly +msgid "monthly" +msgstr "شهرياً " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_report.py:0 +msgid "n/a" +msgstr "غير منطبق " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "partners" +msgstr "الشركاء " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/warnings.xml:0 +msgid "prior or included in this period." +msgstr "قبل هذه الفترة أو مشمول فيها. " + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:odex30_account_reports.selection__res_company__account_tax_periodicity__trimester +msgid "quarterly" +msgstr "ربع سنوي " + +#. module: odex30_account_reports +#: model:ir.model.fields.selection,name:odex30_account_reports.selection__res_company__account_tax_periodicity__semester +msgid "semi-annually" +msgstr "شبه سنوي " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "statements" +msgstr "كشوفات الحسابات " + +#. module: odex30_account_reports +#: model_terms:ir.ui.view,arch_db:odex30_account_reports.view_tax_unit_form +msgid "synchronize fiscal positions" +msgstr "مزامنة الأوضاع المالية " + +#. module: odex30_account_reports +#. odoo-python +#: code:addons/odex30_account_reports/models/account_tax.py:0 +msgid "tax unit [%s]" +msgstr "وحدة الضريبة [%s] " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "that are not established abroad." +msgstr "التي لم يتم إنشاؤها في الخارج. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_comparison.xml:0 +#: code:addons/odex30_account_reports/static/src/components/account_report/filters/filter_date.xml:0 +msgid "to" +msgstr "إلى" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "to resolve the duplication." +msgstr "" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/warnings.xml:0 +msgid "unposted Journal Entries" +msgstr "قيود يومية غير مُرحلة" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/carryover_popover.xml:0 +msgid "were carried over to this line from previous period." +msgstr "تم ترحيلها إلى هذا البند من الفترة السابقة. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/bank_reconciliation_report/warnings.xml:0 +msgid "which don't originate from a bank statement nor payment." +msgstr "والذي لا ينتج عن كشف حساب بنكي أو عملية دفع. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "who are not established in any of the EC countries." +msgstr "غير المنشئين في أي من دول الاتحاد الأوروبي. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/carryover_popover.xml:0 +msgid "will be carried over to" +msgstr "سيتم ترحيلها إلى " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/account_report/line_cell/popover/carryover_popover.xml:0 +msgid "will be carried over to this line in the next period." +msgstr "سيتم ترحيلها إلى هذا البند في الفترة التالية. " + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/sales_report/warnings.xml:0 +msgid "without a valid intra-community VAT number." +msgstr "دون رقم ضريبي صالح لبين المجتمعات. " + +#. module: odex30_account_reports +#: model:mail.template,subject:odex30_account_reports.email_template_customer_statement +msgid "" +"{{ (object.company_id or " +"object._get_followup_responsible().company_id).name }} Statement - " +"{{ object.commercial_company_name }}" +msgstr "" +"{{ (object.company_id or " +"object._get_followup_responsible().company_id).name }} Statement - " +"{{ object.commercial_company_name }}" + +#. module: odex30_account_reports +#. odoo-javascript +#: code:addons/odex30_account_reports/static/src/components/multicurrency_revaluation_report/warnings.xml:0 +msgid "⇒ Reset to Odoo’s Rate" +msgstr "-> إعادة التعيين لأسعار أودو " diff --git a/dev_odex30_accounting/odex30_account_reports/models/__init__.py b/dev_odex30_accounting/odex30_account_reports/models/__init__.py new file mode 100644 index 0000000..2d52b6b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/__init__.py @@ -0,0 +1,32 @@ + +from . import res_partner +from . import res_company +from . import account +from . import account_report +from . import account_analytic_report +from . import bank_reconciliation_report +from . import account_general_ledger +from . import account_generic_tax_report +from . import account_journal_report +from . import account_cash_flow_report +from . import account_deferred_reports +from . import account_multicurrency_revaluation_report +from . import account_move_line +from . import account_trial_balance_report +from . import account_aged_partner_balance +from . import account_partner_ledger +from . import mail_activity +from . import mail_activity_type +from . import res_config_settings +from . import chart_template +from . import account_journal_dashboard +from . import ir_actions +from . import account_sales_report +from . import account_move +from . import account_tax +from . import executive_summary_report +from . import budget +from . import balance_sheet +from . import account_fiscal_position +from . import account_customer_statement +from . import account_followup_report diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/__init__.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e71859aeb7080ed513d0346b26f661ba543cd484 GIT binary patch literal 2055 zcma)+%Wm676oyBZEy=psx?gSCL7K)v8>KB!v_R2ED1sK<%!U|~V~Gwg!jN>Vyg(nJ zZ_uJ|!zGbbfv&nMkX=^&&sdZ?sTLs)etmP!8P3c(BmUlKR2iNhfBV_}?2xg)Xplb# z8+iAoz}ToBk+iiG>^e!KGr+|PxwUh z6g=fq&1c{M=Ze@3gI%Dm=@R&O$Fg zHX?XqEbjNryA2bCHFuF=KF=1>(z@}&*Lz})ypc*tXA_EWgs1sDKk;yY1mVD5BjHYX z$p^b`ZF9prX?boS@q%gYjFpQGT?r+M)ll>q^YkD@diRM21UNpBXH*jOidcIn}uY3n*;>qvT6YPsV z4AHmvQ2$db6bgT`QEFOd4iU{*FEuS=)6}$#eUh4%v8SnN8GD?X_Hj8+Qf63Y4iU}R z*Qse4o28~@>{)8sKF|MmI7yjd8M{bL%h+XV+P?aHnli&OHcU;+*rU|6jEz&%_I1Z7 bj;=;GWrk(u5pbf9>(_@peQ2?Ij4Sjn6hLR) literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b70bdaf0eb454eee9c298162718d032420443912 GIT binary patch literal 1078 zcmZ`&%}*0S6rcTQDNT`EHJX@>5tANl5klg@7(L+yN`ivf5GU)-gHF32b#_~6FZN(O zb0FdB31j5opHdSJWKJZWycOZZ$v3;*`VpDkd7r4!kG@cz@{;$qP+Ihb;C{&k6C}#N%iWO_e%nzs@o9)0=FkKGab7r?7Ciu z0YwzeP_!+=E{}K^^j9|<5H~iz#Lie8B%n8Cg-Xrmmg}4(1)7iwHi)eGMlvo$$vwrYkr^cX5Q|zDCzb)7=RjsI&UcXva#CA`pdy^1#&7$W> z29xh()*3uJom=|2aXh#5H5k_4jR;xRHw|R>UK(c!y-4WLymL~X+uPm`hl};$tLCuW z`c`foms^9n`o#4t%xWbsO?4=tUQAM0p+d{t3g+yk`IMC_S#krV%fh3yL65~PRPo)C kHX{G0dmH;(XNm9P3Ph5`FX_=e)Bpeg literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_aged_partner_balance.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_aged_partner_balance.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9b60c4dc16f13221ab3af15c905490642c9c2bf GIT binary patch literal 31150 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
      f-~dkl$%?39bWeSc z8Kl+?)5B!+V#V&%lE38dLhTEk$M(tM(bT>1zS3 zTDySv=V-&IZr1#`0!~Y^d>iBzef?(+4;x2w-=)I2shb(}aaRkWJZciUXNJ0DNNw0x zi=ZA+=aP2mX=^S3C zpESV#U#}aU^uqsHB8wJ{{ul?O)TXc_7g%S**^sVfIAz4gq9Tu&skz8$B8uvWn5Bgr ziqc6vQW80!&JqlT4hQ^y(FFj{-_o+>q_x*$THaaX&xP*^L4{R(adW^ZoVrC0f`T)+ z3KT7(!f#1dB$KQygw1U93im%DHQ63hHhTW4x!dPnm|@+$q1&%wW3Z@zCt0YcO30M} zmUlil@Cwv|sGDFg^vq{5u8I_FpS~bl);5TF2LgvC0iJpaOoYk3H&-Bl<1qG{OO)vmAQLaU0ox| zCUuP)S(S|zIr7G}IhatvHVg9@o=}-hPKO~Tnx80pEOIr+bzt=?oBz14gF7_yORKTO zPL5%$Gd#iu&oiT@=(k91Bp>|p*ZC;svOX9$sLMRjth=ch4Skk@6cxryvxh`0{rp=&^@IEz~FKP zy^96<2>_>+`)}|7H9DRHikl6*tZcibj4R2kI08~ZvVTCRfMmWyj#KrpQk{#eAS8}w zLj|#7_(v!O(d=@6jfws_rdEc^XlNKu;^bHPtRi_`As4o%ppJXl=XO@g6UhILQ3nwW zVf-r06Ii_ZRU!qm*E`FLWC|(ks#WTsXxODl z3mJvl;-NLHRIKw+rn!;>M=l{2kVT~{a-cN={Xc$z3Wps=Qia+{lgUBhV7pF09`gAK zEV#%b6{x|LS|i&*YE(}Qn}$a+t0)rdUorvs-&m=HQdWXXo_c41vW8x2|JmqbX!I9L zH4fn*_#VjKKvm;5`&w4Kq7qKCJ9asCY%+RmQaE-^Ja%oDa#|WbM<7_igqw+U#2XIp zQZ4!531Gb-?%2<_U5h%d365*=rnXqqV6+M?dq6 z?IW@FiD>%-Avc6vPsvnU^MD5JxQ!$nAYa_}qUs3DL`v%8<;;tLv$27@(E->^vLp<= zEe^aL8+Z^McpwZs6bInk8>R$u1wbh8<;z?6*4`KGhxqcg_>tqWBe$bRZu9PCNO(nF z2RLK6fTRAR;R-4qJFjAj0736p;X~~oK%u&QV>og?-g$E4d}KwaJ`}I+h*ft*tGl+l zc6_*1WnxOGz9v>*i&eX#)h_<_yik2ltiH#S8`RjxPX4D$|KSop=y_HEK)L6gG~86FHDnEGH{=Z;@YXerF95;RzT(J>lOwT{SEDDd3Ma?K zlYptT0;&LjP<;&a|M~HQhhqoNMGu}64qgxsUf39Y-qgC;D>QY9OFvT-hGk9uYgwMMmO{N4C1R`?tEcx^V+gV;}4U+8GfV zFUxO2V;_cigKs`yv4UngUxYMGuRn7LBs?wBA#5TV;Hkr(?CEZH_n{ghOI|K zJ98p48e=A+%tXAYW2<&27j`L$hbQ^QDZp0W0NCmwjtV|E0*cS~L(Bf3&zoT2?T*t_ zVewj?tnz}9oVaj8Mkdsy;2_7&C-<^KZ9mNc+0QsixH@PQ2 z;FeX1{}t?&W8s`v$pRYLA51K#KEJtwI@R9r@Ma$XVUGVV1QGTGK9q%OuO_usP!fLLmE!hg1z2s z0ZwPhB**6d8Wf(n1UhTR%^)*n{C60|NIB2}$EW!M49t2u{2W+Mf{`f)=A)pZtM(7D`6^+W%6$OMKOV9r7Ae?vwA2V0>U-pq zhzp3l%8Un0d$7Vml*>?^-0uPwtuj{1LrV?GWE^9&cD0&4aC-W=r#n!p^w8Au`Cf_QzU>qOC(aKB09?Y#rkZ$9J<$ zr3JwLi%Mhmj;Ot3D`&fu@4G6V9Fv!3c60E%nJOxe+1sM_w#_sAu_3`eEZT>6E%+&y zd^#SrAK$tUE8yZA6M}tGv`_Bl!Pm86C=b)THoSg9uvYJ}a+4tO5vT?r@o=iaJwime zAL@5bMxch$uaChixpu*QnsV^POV@SOLrFLXuC;&$RilB@>O%2wwbiV}uLm^*JE>~f zgXHgtjWz4ZG_ICve^(*-+X<{CY-Drsd?IqdUM`wJ>4`Nts?YSY_~dv!sM#dzB5`s^ ziF4q%ye!aQnvfykfyAs;Iqb}o@W+xH;AkpX0S190e^izgB9IkXVXy+OkfFDSEUpqu zt&q9t`oX4!gH0@V7=s-pA-a2hj9M1hj+x^Pu--XX!yJHj`TV4y7xwX+!4eKm#s`-L zq5Ly4+QE#v3GOTc9H5ddK^JgAH|U3h9mv_}E;O%G_tz2gu=KIal|!9`PQG%YwHIaj zH5{}52)TeMRi1r)Dw4nqPcN-q zjN7UsbktVQ+v?+0t(${e`?s6_tYgP19vR^)FY*!x+nj~ZIV1~_HAJKE5_J+(9W zJ=e4AV$T$ReO72-#RhiW2KEbovI3?@I}JMvu#x@;eqmsepSmUtToXF3iyha6n(OPi z@w)c!mWzi^?+iT47X~MV!&BnnDWPr(Y#d0^2l&c2cRKhnM9lZIe1&J-6n8L@{-~pg zcQirttt>c%ytbdO8CW0w>P1NzIelAMfQ5~SsPGyc1$IIlPKRW65gmccCFQzsacmhB zpf1Vk0)tw&5BCDWTehr5FvC&IU~A|N!e`bKnB~0WXAwA5!I2~0xtr+nBJd%YL4Zr! z+}|T8geKrnJmqT8g$*j@D+kA;kl}KDLUZTfI}v9UV>#3*a|mG19~CHqI4~(z|Kiq@ zkA~v5_D5&qjuVeYcC#$muthNeN*l8ASmHh4S-LR0WS2^SMml>E=0R!DL}%matZC46 z#+VHzTWRpB$&_6R=1D3j%+5x`I1Mc5$S&Tc5@3c-MIp_`_b*U~hH7+HzmYn{ z#spT;vYr~@uq)sP_bIL#xPsK@s6-T&m*AP zOruhMkaNRtd??i-L4;u7~iJ$gBvFDR44#_XkByuOvg(C@! zQc`54VgvCshcoJ-nvZ?|?VXDM z9R6OIzdp^^-NM^k{UWboV~Wpfgd2<-*GEO`zL>Q&YK5OxcvG* z*#ocwau57IQS6WY4%||Xx)gO9-Uuay{y}=eAbOy>n4_?{aP(lC%L4HJ*Id~N_3ha$ zUK0a0MgR#uXbzHA3j;#lX%X)WvAnTp9-JTpoa?5L_m-IV7Ju6x&GYklelTQ+IfkQ- zVg3vplsyA0AE2UIq|c%LsrWpqp8$ea{&@pxLoISA(UJ`8=!9gP2M3Z2?HLIv12{85 zz&U)%k7q$s8sOv;2oEbqWB?-DQmdWRxB$t?980Nod8Fa77dYXQXBsZ#ZK2jZD>yAI zN{oRzKn=t0xjIx1M{S2e@;JWJCD=wq+bC}yCH3%0F1H`Tb1ewa{Df;o(1zdu0>Xda zMAvBq2NARb&@x$6ICBWTfgeyn)G^t^$Yi^b$sR%`YtB9e^OST@oRtj|m;|uW*_VLt z{cKQXWtf#&$VKA%#j!HNhOQ=l0YFCrL(MvF1~Y5rcLFjpv|4OYCW-1_2u~}Nd0Mh^ zq}*g3jB`h^D;-Dh27q*SRhEqSnjDM#?qMkH+#Qqj@l?0xoh($a9H#a6%Xt&Exny zPQznh?aR&2&I3bPfR$wAF=QtTK;$v!{uy`-YW28&1Or$?9WNnNJ9O}6wU@>~{tIH+ zlYxM=bzZcA!s)zBYzHynRE{u=o(MicTxlHPXo4ej{%joK0^tZh3zRd7S#jFAdU!}# z_!FWW@_Ts)A98;w7d_j9em^WGqlOBU4GE9-1ux82(Z)?GMO*Uapw|Z^UGw9&FiNm>ueHUy%ZBq%(% z-Jm4W;EYn`+U0C1yRyq(d1mA+XQT1RWo<^4+NwD7XH=W5T_u@Kx>211(kWGOYim-O zKPjs0NnHMuoOAnuZUFQnn^x6iczTIF+zX+Y$_1s|P|B<47nQ1J=}9W+`5itERw%ASisj;h;+l3Za$)H_vOul|jalXF9@yk)Yb^N8Zn=i6(@kcO4 zj+(Zy)U=(oO*`xqSFxZk0Zfr~zyK>)C+lL}bN0vdC-Ceu%hk-02C^WWweyfZnkE zu+e;yEn7f{{Ub~TxQkO*TI6`X3Z|pyfCHE;gNYir(nQ*z^=L?6u8wu*Es?}vI(V{_pK z`5oSW@n=9D$PtjN)I+ed)FkE@1h!z1(7L$|y#k06E8kdkWE^TMtUY669Y{>%s)CS} zeI1FpQ2aO2$ zsxb`V8DCc(iN}OA%88>Z$BI~og)15Z)g}(oD;15zg`;qxx6pyD?||eECAObc&qsTI z?pPoGnd_m;$Re!b>uuWlhV+(0S_a7UDuiPzLwawzLsqxA~_$~KAv2! z`|+g*m(+Vm)wOIaSxcO=(p9=vX5v&ADp<+aKwpZ3OWsr}mIRJhJo6E4y%Yz?GsTNE z3vw};=5D6}U2qXTIuB$8P}&7zY>@*r5{`ld29%~rPkr&B^>%FCt->}z@h$S)%~)zl z&_%kkjY~#m;-)u5n~b0YjIw%j`d$l4LvdCZhZ88BvC&#{X={Wslscm+vO3rffU9CE zBV`5DOA07LmAgpsD}BRe^c?zT!QKQlgbzXZ-J$Zeez|t{CS~*Z^WOTk(R^pm!@-9` zxz0n`&O_qiu+({7?z}G2Oun|KP--KzZ_O?GUXtkD`IleC%K?erv$5}ZZr^Bj->7(s z6X)X6zJ$Clfe%9xJ&^C-pX)xD?FMZ5hIsj^)IBYCPm6R%UVT&djKTXUwV##YmTt>; z2OnM$L#O5LGr8_d+3rhXbYASfBz4E+?pUsSG26YEuc^OxQVfK|>H*Qa=Y_+zYu}d? zB+%r>z!`bqJa)WWqWkhgmvcjJXNTSv!<;lUD-X@$lYCxO7Fwh6U!Qu7|zi?&EUDiCo86wqxwslsI`=yt*KsyCI&9 zOC1ThBY~CsPRMd?<`@UnK!f*TfX@7~(rgg4#;mn>E$HCepqkQVrA}*Y{xB2?R*=`0ABJoGI3_zG z5pW%V`Zc_H9`06N`X;)!w!8CDNzz zUAx7;BXZY}*cE>|_jfn``i3}hLmG|CqjB+g9Jh~==$#@t)vZGAs~?Dd2iXc16xzLUV&bVpORO+4)mlg=E>HwzE}ya1#oET-_0)V! zU~a|YafV%5jK`t?2tYNDGrHt8T8@BH9bs88QdoP|g|*%Tn?mablbThFu`Foznl>M* zG<6Hz6q$}RmdC(=0MoE&I6&({8li@o15b#(VIE8)x1a=hWS$Gh=-np^%>&#A;|f?8 z!1TgIVObWIgfuqD2(iQ>w2fFg!p8)798r5v2dqy*(E2k*uMUZ<8fjt~>=FztZ5+mg zz^l-=wmOJ(3ghI#6ie~1U=o5vacdw(p`-J$I2%sQP66LPhmQ)7SYPKbVt2)7ES^?3 zXy^A~g&NIhp@BDk7i7XSY>a;$5{r_8{EH|ls0JYC1trD1ij+qc==_(J85^i3)j)wZ zh1O9Pfz!}1+71=h%n}QzvlLSw9JWHN@`$sXVsZ)E6}lh+#iS>xo=*;l*COIfT)vio zj7Kix0g)++TN{N^W3>nU?*G7{t`0RG^zeh~konXtK+Y&S`5{bD)+sK;#z|H!?M%Zf z!GY~LxeV116cg!cT71poq&NxGR4VXC@#>pSc8b^ynZThIT9U{Fg?`!yg7F+hnzP&l$VAePIdGoJZf7L3Eyd@oc zTR!-<!&&o&=_dR4qQExvhO zelsebWW^Jl)I2LU&#s-$w{`-^t=>bDd+xliE$8dZ`a0K7JsgvK1F~-bkS?5gZ(GjW zne}$&x3xX+Yz(~oJoNIDb5dwn4h`pf`yRVD-4&hnn-nHacX!Pu1<4D_U0wSnCUC1K z^;E;Q4+h1y1G4|sod0OnfAsTPzkcUe?}%q-rPt=<*XAVuyzHM}qw~$}Pz@&r$=WH? z2-+WbVFdYs1CLi8B{rQ7>=+ZL3pSOhR#=|9t-V{G(bi|IhpjX}FIdsoDr-q|Dc1W9&x);u*0I%mL(N+2GuHQ@a@EP! z!77Ay(GA zeOt~34Fn}eF`6dyMz4CzV_+LHbjI_z(dx=vtu*)aZEsbk$f68ZPIxndO_6^I1bz`* zQs^r|&|?VvG?!S^jVj?p3T$riSdueCD}YG}4osE+p}=k#2hWOzpHk?gnc)B;s2~s9 z1?MS)I%teT*rma{BBY}WG^01e)1!|{hj_+=*;q1?jDjnLQQc}L_;V($0!|eSFcBun z-O^AV0Z#Y~5iWlZf0j0w{NQ!muwQ;URt#xG2%t%Fez z@GxNXv_N{&Mu1%)t)T~w2Zvsa2Qd5X{j5w+j+`4gF~#g3la(V{Im#vKz6~_zgRJTZ4Rn;h@N& zdFue$mNaAMuRTZ5D|&m8Ke}>q*ovS*FGH3u3-nZK=GR-f34;*cg5-a|KLCgn z)iYsNQ!%ypb3xpF>hJx(*&$xJn!7Tay)r9ZnU}B3OJ`#8nV8hGAonbot88^m(8kI@ zIu%|3Rcfa9jq&l3$*JDqiHYH>;fay+7cPycH`ls_xB3V%27|#B-K$WT2)-Dh7`x)` zk0da>0Td)Y#V$p`kiD1^z>%QTt6t-{!3Uvq=)~~k2vXTN)2r5Fjxc+I%oOHmEin*N z!ZCZ8k@1r&{iWrP8s)VHOvM9bw>bn1hg;d=Wh8oKav79Au&M7sLU7MSKtqUfidXkR zrI#1s4!1O!4hv~$O{vs-0xyb_aL%Glnw-|Yc;1#WMg2}I*~5}+>a!$hG| zNse6ch#i79)lTV9bw(%QJBl-sPV<8171ummo+ARMIk^5wQjd@y{!#WoVg)9w{Oo4d_LA*e~AXMs59fwYwx5~=~# zvM^EqRbF4QkcuVwd7w6>Qfm(#a?ThCIYHSO))_eNn`&4B%!Q#QT0l^+N_D?^f#+cm z6lq(jN&zb3)qa#}V?n{tAt(i6F*AiQ%J7?!IPevv8KSC^b6g=S%7xh&@Y6;deCa}X z45H%iz(n|ehO==JPlbT`7H)uc5JQF1X-o@gro3EQ**pAwMOhU35}H(_MjPd+zDwV& z%F(S^x>anuEz!#|y)4qp`KsExgLe<-s@k(v?NZfFxoW4$?bg-%@U+-}Qtlebbxmcv zrlhV*a@QqrM?g5tjpy51KRWqi&jZh&*Zc$&|AJVA>zlUYC?iMg7ws?b?xH3!;RdAV zmn4Pj7IF>gTJ`hYA#vckIFpigFUq?YMY0VmpKK<8{5OxHtN3?7l0p&WBM%bb>&F_{_5F&DGU zMTwb^nTbs&6n=rc@JmcYdi$oA3Jh#gc2Cl#rfX;NwcAAIRk0S&=lci6gRlRW$xHGi zSm16*lW}=6F6~dq`x7EqDm;>J-&f$_d^|6{IwptC=0b^VC;_XNvW?>E4V=OSgA}}< z;20EJcmLMs-=ye9FBq$sz2b?<%{sd74ciL}(=SQ7=G<(s?DFR(x)Jc8***dUryj-8OOK0uC!qVAVuaEzy&m`kDy(>M z-8?R%7+N5}o&dIzLZ~cwp|%>0!-`1xpRyGh+f9l;VbMp4Wy5SqDb}#9t$@DmEN>$* z`;}Pm-dJa3ZN)|~>v>s5)u^f$E_`g*XGPq)^_7PSg=J!5Zp_->Qxj$NFeWL<9PRKedfx$PXxG zpQ`qBo`;sq3ITruGFJ8#@lT9f)CNviv&oFE1OH!OL%oowz+dc(!}&Dumy=HdpN1cY z)q8WQV)%Z2T@3MVg#3WqFnLn|33OW{QVp<)jseZ3@SWnG)cBkqLoNQNIBIxrDJ|ql zjn8@cyHDQ;Z~6>d(!!g1=S6aUKK+;eN7J9SKWq9{%IQV)IK<)o!^8f?{aTupQ!F9)Zx<2j_2l`c(3Ic1ygxAYZrv zcT!(mhO{Rx_ryhCSKilnzxMswpF6}Zhz&_dOj2f&k}oCuQX)CQBp!^}V4I%3Do)PI zXXoHj>YbNiH+y2{2G+;KJtv>Ce={#$n2|@LxzS8^G$W1vKpy>p#QacZeh8ANZWtvI zq#&Fi-KcF?^OEf^9|&6s%=<&zAKAZ2fcywPC@2_5t*jD*47Lz3MFK?#ZYfZT!dbTx zC_gHSS0M&=Lr9sKb9tr@^QbV*0|@0aLo}{dKsbRBx?0`P%zsy>=9vYFYOUWF8dXlyR@)OIvaj z*8p?Q?u_$I7|E(XNy)($&CM*F*h;O}?NGbAq$*^vm0;Y5krkrwS0R8l zQ<=vn&J%W}-dtY4F0(8DE8U|%1z=^OiuHy< ze&LF(w~l+=L?wk%R={9x^|8Nbf4ty`@Ujgk2r^!P4vpiAPjfC4h!DQPEfX-Y;@4Qa z_U#R^2Vj&Jewd?cyB4bq5S!|I-vt*cLM=of{m2q%rji7758vJR&@9La0)9pkkIZm! zfH6+>!cJm^!A2J0BMCtjpqhNZ^)A-G)bFRlktHxJg`-?NZo&`R=P#c_HS(DYNQ|d{ z@He-_2?)x&Ay34!r{Z@gRce+7vZ4z3JLDW++d@3Pi3HE^NxWKuM5&D|fgwU$Ft7sf zdm(qF+5j7n72>-g56ntlbFN|=8eQqvwO>8@xFBA!XK0rgpF!_Mp9WZ+(BIGh44Z3G zT8Q|zY@r@0K_UT6g1%&Z)P}A>LrRTl7clsgR^w{GGTEfs1jwS2;b;Qg0g5>PCf0RA zSUQ;U+&~-gNEANo(abkI>JUn0p=HH>VM1|1{4NG0An#QiJU6TO)E?AXq81;lDS!$7 zQ!Lj|Zh}gci5hv_TBXV~Lb5`NU&9c?T5QfaSW!NMWodvX@SRSIS1S3~+xCFTk!(7*(3H)f(_XP5b(MiebVjDVAedzPKr#Hp%>+-3H z)IKA(&p@E-Mr~)VwkKQLBlZqUwa4Y!iHgkXsUKWBI_2Tws4TuwOhd_H0bN^0pKR%YpFP*^S0#2m>xeyNcfS{Epxz zwXOOklH99&?r*xc^4@D7ytW?6`g=rwPre~=|NQ&s*I$wv`sIdxv7tZT(6$j8lzh9v zB6)i~u;Jf!|M2^VKN2K=r|j=sAC~>Q9`$AY2SopYeA~`HKmU{SkNU*Hb5h%Rx$XSD zk$h+GquwWDV#jOZ&SUq+?u~6U2E-lvvyJ=3#{K!uSDvt+!^2bJ&eQl1R->u){#^?7&i!?$zY2eRD<^4kxJZHMx0yC5)OFz|wM>}vfIlaDID+N`8H z``6o`4PVp!>i4TZT7ZxRh<;F`7Jl2fbG_?f?=SlPqE8%nTj~hQ9pPNZVzy&Z>fq%L zUc8+F;I?cd$gSx(S`{FLEJ$JT+q>6B?+r@cw!FV(?YxTU2nqnQ!UL6XWVv7bEhNS9 zz~BE%xng||LRM{Cgo+l0O@J&llv~Oy(eU*zIlw$`pR<+7QhNrS#Ex;DOI9wVzycD9 zBQyP1(8y@eP2z@Cou!R%42{o)wW2~;5PqcpeQ0WcU9kTzr!` z=o5I3N~3z%s5I8n4(qe>K{BOLTuZZN0JBETfa^^r80h-=Ua*5(e2m?fui*KdzPN78#6$bj$O)ruUjZ zXwKF3W$Pg1{Kafp02 zv3FYDJ1y2-6Mb(2#RRPsQ(2%G{v#MgutA~2#6KMlE0tjguwa+qOP4VCZ9$oj#L;UD zcQp7>NbmrUj74!DPo?mqbn;ye`Kpsgz|3R3J%0=nTpYzoK0W5&#|$J%9`$w}B_IE{ znBbBr)!MhB2+6|XPi^YEXM;z_)TlsIX~>I>m_WD+PhjcvfBD+>JEu2x^nEn@Aepc2 z$or;5IK!+MU);oa<#VX`j@#$(=N;R;9af~>1@BP13*Mo2msrudS?P2_m|K~oW}7nv z@=Q-&u{#rJEH0nY{Z0r%Gm^J$l*{w()lK`L6XM|@dEua3wR%R{=5sb~Qjk1-gZylr zbOoJ(O{z?CN$-JnHh~?&oEUv!ZbKD5`fdr~BxJ3lu-3+*Gleg@AglN<3$PXBTYbm7 zo@uy(Z}rjU=u~R8H{m>Z3kj-1Bh!?{>R`yIqp+vNGU^j3Uf@jSZ3^YM59l|B94vgv zUEYRJZ1m=*zgO)djZZjiu5GbD7}~wDq;O%KA@E+47G1DC6bJcb942G2`e86~Jy+ys zu!zhVjQ9qZ|1Ah?;UJ&|qQ7z@jgj}(IM0gE>X0=C<*YL#k~4a0}8QPn65e`0}r6{!Lr!iy1*sV-Z0 zSdCT+YI5#p_+$W+_b}NBiBKfx{ww6Iv=+VHAyc>i8!P<@B*3PB?**gkd+rb1T9EYU zqqCB4Q1%U?Efw6Da#gG9#}t`isp_~~1pwRbiQ1mM@|!{V?6ut4aQ19iy#9`KHY1{;cq}6Aossv>tc~0~F9!N0ZwTTY zG^=OOHWhU7{}Beq{|1x4$K*d@g45z9OtO#&@G|N0N5)J{0DM!zaY!ukr{m7)&5BB7 z=iehy87($C9;{I+@DG0Q$YqImCBjoxk9Xpe5ZKy*ibJ=!nGkL!4@3)puOS3qc*F%& zQ?4ZC(jb)u)gF)H7XDt!42Hf%)92w&gTz&E>{PGGq{s`Nj~{{!UV z3JAZ3WYb}@**2)4_-$vNIwV@pJhf9ScW$~C95#?j<_>`;Qs}T2V0Z? literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_cash_flow_report.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_cash_flow_report.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2495e2021b720eaba40b03543ce677aaa74ee50 GIT binary patch literal 41891 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 Hcpm>RbuGR? literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_customer_statement.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_customer_statement.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfc92135bbdba97b7bcbe0eb5ccfc6caadec2b7c GIT binary patch literal 2163 zcmbVM&2JM&6rWjp?RDZ1T0Vk<0HZ1ggKER*L{z(rXoBJSM7(Gf zw6(#glBCHQRM4NP>4GLxHIFh!NKCAFf$Ftru=yb<--0iODwv{*MsX!UHP|Il(U(yb z)8t*Fk_t2(wDdAsz!d{Lq~y^H4dHt=#%FxfXEo;fq2ZG0Qit(o!L%%|;rc}@!WBgf zEOJ)&xL=%$pc65)ZgSscyy!4G3*9TQ>+s2LG_FY@3N~2<^mtgIk#51#Lmg4Ior&jv!~ zuL5dqfaE!vXyFw|hTV;(Y_t~!5-fah zibOP%kXKQx(<)&L>MBUhwB2YY#v{OV0n4|!X$wZ|DserZRN+FY9NJnZN4NA~kAg0B z(Wo;n$H^@7tr=9KVo|Nx__|-17=LL&D$) z5sKA(e(B}I(j25-$#ibcnN2=#m#!^Zb0)7{sRB^)*z+)7o-*BRjF4omg?6eAdaH>1NNg&tC3iuk=Qbw2dR1;2T-n z(=iQ(ppYJe@_!1cg z#pJN*+%Xpg5p&+1LXu|zE)U012$2m%f+Y zFix%;Cm&Bgx!9h%+A+#qque&ie;T9rGhJhR!#KWf9Dln1!2Rlvmw&q4J6P-;8t)xG z*3ang4D}I+=Sa^Czfb~(+XX)WehL|B5TckQL=F)GHPdjEo+ac~!*rqZ!yOqq<}+~R1$m=GL!<9E1}pHUxR>9<6kd(X6f_Z=;@_P zy?v*bzUU`){V1Gzx7cIo5YB%SL7aihGCX%l^~P{jAHjXgkxy?3pFi_<#n literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_deferred_reports.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_deferred_reports.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd4db1be2ec60a70d3c66ec879a0ee591b5a4d76 GIT binary patch literal 41500 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

      (=MO=_k1%Z|!e7x{h$6&rXCmmF z2w)V>4&10;(kNj&v6a|#M$9l{vD;l z>0TP5fKmew?IZ$(GU~Rcba#&Ks5y%1(>>g!9L(rih*K!ZYX#EU7XBWAmjnnY63!xF zO7Wa;p3^F$jD6BVQG)!}h@Z;EcP8L2H_~3C@W@CqD;yy35oPxi0&GYhQ|z=WV1u3| zeTZWH3q>uFE%lU-<`=o*kJ0BTD1MP%IsKLLWe}nRQ~8LZe(@!x`l?mROXblUfmq|I z{0W%JD)(&qG38CT*oBuacsEHE3ZZGm`%qBj2pBBf6~#=({QCj5kfydl)T}39dXZoR zs40W%+S8lvZ-@w>+XmwvWu`f)5Qix;mGh}1V z2nKD;A?R7#H42R3!(HOOFyyHF=ZM7!D7kivt~#-Pcd{Dv@-eykxag`#x~s)N-wUT4 zIFxW765WTA#U($D{&@Du>|?k*t^Rd^rMgvY?Z=-~bwsW@0!i<$YTCs1qxh3*2IQIn zFw&BKun;|Y0&GqRE)FD%%f#|-xwr=n_Ef+F0%-V(MzMIy1oc> z*wTq--`yfIzig5kkIDG+9sigr^>M-m9JctAEI2UZur=vgF|9Jn>z;fxQr&k7E z)XF=KCz_6nO~;e|=4Jmflu4lvv4`aAty@36FSqu|tw&c|Pb6ATi04McQ)6HBe$gx5 z04IA|Iyo)1&d9AZA{-d|8&>`834i;m^15dQV7xp#E;jF$tM{x{UrJP8N^b35;ow_2 z*|s~`)SBEi^fD^%IwkJ9^u;W`rwX;&ns-R6wx$+3q&2l)+Fcc}+yMB}o?ikB4FK34 z0>DC}1=|ffkTp&00C5rpR;yy6CpT?fuhY&}u+qYWRpQ!8qB40c@^0F76W3G;f!Euon z~dEQWdj>4TVo&tmP3J~`tDDK#Al3e8~SD)bOU-`&kmoow7LH|`=^m+HD?*Ws7Na@U~PHT*>h@wt2Dnojg}$rQ?~t zbzu?uy08d+?LiL#psxW+EuPw?GKp)0i97yYdy604m%Vkeck8Nmd%}x7V^H!A$=)IQ zo=!nVy&AU34Lg&8Ua_thH6c?RnA8A(XI@wgo_S&Mmv$!=2S6&rGzh-hr2@$dB^6R$ z7G3=c^U*dm)NUOj9a?tWPGfs+52Rc{rv4ucrt*W3n?r_N9SGeo#TcM$?~P_xfZD#tWC%b!u$ z3j+TKfv*TyDQ~E=K;%Ssq(&={7)>B4lJIxwjt-2JM|HJMzRrR{FiyX~E9PJ2uyU;U zC@KLry*P{W0)j*BUy|#5FqrgqJvg2$-uK}2T8`DhlU;ury4(&hFm+H_<-o!*gT2tm z{^;78t%YI&d}+5hy;{IIYrbO&S+0ZS6%<_uyVOjqj(RFz0eVgp;M8Nxvnp!P5D7u) zSePDG2j-w!8QdFQUSL^Vuo_+?NK0Jl*tcfUfF6Yc4qF{mZ58rCd2xN229FPG8* z=#8R)BK75UtK$f=VLy5VW1#xZ{G*T}G{a1E4kjnNz6#*y6HCZ40-?-^jkk{2dD{s1 z$RiFu=OfDq{3k$O;Y?L)i1?tQT6lDpKI?QGBs2WB%xj-@)IGCwsnTfGA7a-{C8AJ> z(&p>5yaH-w0VTJ9nw^R0po$VA{S{Fk>2Cuw%}YjV`4MjLSj1L*+BH$O>M9?v)G;;H zJcsl#9%B7{m5U7F6~J4*sC=q;__JJLj+XU2fe#7LP9ww#q&FE>83W-;Zyx}BM0svw zd8XI(PFmMJw61q3>zZV+j!dA89cA*}jNJuD!tr&FH;tXDEbxZ0Q#1Q5#%=|jp^(X& zk6pIvZaj8BK|c#WpkAjz7#98my3H7rA5s{B-=)YOX^~k_dzr8u0qn~gQ{VxSi$#Sq zQA%0~ph~9DBhZcj!w1I)Y%+3CPAVtDM-DhiH_4zBsB`vqaY=3LcyLndH2{-;(YLOe@Gml01+8j?Pc3QE{)`O*8 cz~_J`Su22~Xi2R8eUFS)kEscbu%d-Ziu9 zD6t%oLnQ)=L=QlE;NSxapz=rb+>>otvNc!4ft#!JQ1!%{UE8rqA{cw$%)EIY^WOa4 z`!yOJK`>g6R?SN?LVt=)Zz$cx;Wb$7BLf-OLIs?~7)j_uWJnK@Ayb@}dI|?%;R$@f z$jV0O6O>f`7TYA|;eumO%hkKb{?t=FoP+H*;Dn+qHc(bFa8}+$ISfwJY{-xwqO7uu zHgPr#CPVx}TGySD?Jb$Eu30ONYkH<*m&dh$y^!7s!uzA9(|( z2f%v*UoffzCp{iQ!!j6EPzHVZ<~FVjq=JoAaJ8R`Bi-ZLdv6&CV#0SJEX6GqDdS_r zv^OYoDakpEnrk-M&^&&2a5GPIMm3KTgK0UB=oUn3uaSbY;VTU)CS@LSsg>iQ9OQ$a zAt0@}E+MYC-{j=ZtDjQqPJyO0>%qEKW_dHUvZb$UtgynIJk>on1rN9R-c^_!=gK?R z7J`+}efKKq<{aFo47x!A*+K3whcH@n7#I!Ukm{7$jcq{mm2*xvKMKoGYxg7uFf{q*_t}r9(%omq%(JLKzB3k*lW$$#SX&JJGdPm zYsGIh;xZ>lRhYZ+54~hQ^C2msXBh+?Fj1tGDT&DI054%)j`Z|xSF$e0&;EL(dg3CvA zr%=@FEpWuA$Qt#CW*ekb6t>CWeZ(DIb{+ytD(oywe4K8Yt|uyNsNP&Y+N(Tagh#0D zF_XGn5sNKXq;OIUb`DldwA%9RQ}F!1>sgp`p8?rHZFThf*mtqII?+@oYU)ILdiIyO z-)=Ui-)~K)8`J69qS-;n!iy42i#Q`aN9gSjq!&J|sTbRc>#anlk;pv#w4PXQCYD=? zdyT}sdg6XFabJ{31{4LYk526_KfctSm=vWVxPm@Xpk#iCwc_bUJpJ@?ZDqB&@&G)2 z4Gy7tz}fkXa0V2(M^yGr$VcW`48lo9xJrnv6(}Kmgg`GdN|soU67p3^v$`iLRQ@_; zrsuZ@Kc_s}?P)r-EJBi)MMaK8x!eviFCKykBFe%290;_C-me{-+xe&yQWVh^PNC-% zMFjER)DOjXB^r82v`i*?1Xn(WK4|$TzoS4(yyPqOdJyPMHV<2IXZJH89T{WXM&q^N aeEorJm!JD*FHVv09sdIsEdbmA literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_followup_report.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_followup_report.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5726de457a72beab6ef2df885ec44a4963631252 GIT binary patch literal 8364 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 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_general_ledger.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_general_ledger.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41cd339bafef09e2e15cd47893c2dfd9bba427fa GIT binary patch literal 45346 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 qL!+Sotr=i;^0GSRe_Chq?gjpux6g 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 N8O!EoPffYu?^w^*{pBZ_L;ri^X#6% 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 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_multicurrency_revaluation_report.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_multicurrency_revaluation_report.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b6504edcb27f66299ddb19f00439a1b8edf7964 GIT binary patch literal 27426 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 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_partner_ledger.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_partner_ledger.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..617f41c59198d30364346659782650380d732752 GIT binary patch literal 53533 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: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≉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 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_tax.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/account_tax.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..307603f928edf2454ee90eec4d1072bfd6574f62 GIT binary patch literal 13291 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 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/balance_sheet.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/balance_sheet.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35feb172d9d8f77dca5ad529464c1e70a9330628 GIT binary patch literal 1173 zcmZ`&y>HV%6hFsyQks;HRtQyq6scVzQKu~wIus;8hz?LyDn-Z)r_0^ZxIO#AoefRY zAwvfS_O6{kz{1F%5m1Nd7@63D%G8NF+o`B1&%Srh@9Tc=z4QCAu~DGu%g6QLy9K}x z^D!hh7Y-M-um=br76YN>TNWsQhkz7z0kNsISr`VqvjO;|S4O@~oHbB$f11ylrHUaZ zlu4YM(@h_l(qUC^dw>GpBET;YO9vNxhuFSLoL%4-iK|l;)#N?IP=x7PlhXKpB4Zvd zqlhpnI@1Vao75Chqi zX;$8x9gTU?=u;wvzhrwWZICDhV8t)iMQf_ zM^a58#vtY_2_v{6c+!%PZnp&033cL_$B0Qa@*0UKh&H4&g;xz7y{$KSNb87gHBm=w z2KCi8ZXyw`3cg8kEbAF$y>UJ>x9H8LQmUOlE=1?76Z#6CEYE09YK8^Zvzt@TtAyEP zTWvJ~v-t%b3Ws1jGx-evy(8W!?q_sqa!#`@=$FTP6H^D}>HVh%wvd7=Nz zf3w`X_~dJ4y_dcN8&qy;!=VlWE47jufiOZLg;0$`sG%mz$Q1}*CWz%0H+9jjLDZxo zh_#teiA9hOL|o9Rg!vQ2xMAlFGfhvKqXl_Ov+nWJugrHJ^v`+S<^IH6_tC&9xX-Nt zIGtxXO}dquqZ~6DVXm$kyW5blKsbJ^`_8fhPl7laS;`8!BQEO*^SjDtnhk8rvijgs b@8mlumMnwgbiQ9asNVRM8h`)CC58G2jZRYP literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/bank_reconciliation_report.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/bank_reconciliation_report.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..606e2fd03859c6c1c3278a5b8364d1bf4a4addec GIT binary patch literal 37316 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 UN6&y;Q@1mZu>Q#!jg(*i2iIvZF#rGn literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/chart_template.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/chart_template.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..770eec723430f3b6f45ba7e4db8326c456603441 GIT binary patch literal 2900 zcmb7GU1%d!6uy&5Cet)&w!gO3Y_qkZb$6S!YW-cYyV@3i7GYPZapf}2y=^AWPrNg! zZJEL%f>jh16c<^r2(HTdEc@Vtk3J|&%0R+^Q1EHrvg|&H_~5ydOq%E};$(8?+;h** zch5cN%zTqdB@kS-k6%`QkP!NvPr@tKB5u3@#OH`0B4|h#@`4`8M|3eS3Y-_wqIxVJ z6Ho*#A|k$nNR&oOV5@mu77@Av|K^pClh|1_EnVZ&Y0;NfRjLuomvoa*&GH32E%@nI z6ip?Ht(wNOjG3&^QVt%G*5t+{5bpvkit++M`3Mp6;tpCBNaP(kAKgJ4LY})4{h|3n z!K@he>7v5yb5t*DicPmhlqPqkz}Yi)i(iO#IEw?#q2KrmynZHpj%?vz^)irG+SA>R zl{OPOf)jDX?hpvbiIjUCR0?;3O6~A$M>_dL7;Br_?ZnmQuA$q?hlkge<%AQt3^=c} zv3>>7`a~e&_tDFM=1LpUcGQVlciE`}WjlR9lUTQv?%CV0=Uw?g`hapGrJiu+M2SS= zm&9&eNGREf;vgltWasX7dqdsMC+X?7upR5vA&LKrAn7GZk^*GO&}yl@>s68T!CI`7 zvnJjmT9PAK5hu1S!Or_aJDpGa@WHHfD5Q7$L#p%HomY<3eKP0ajJD(3GI$#3)Cy@w zIza2l-MZU7PLDMTnuDQq=hKn?DbLIMZ1A5>pV>->1yeFB%uqC_tf;+NroM2}kFQaK zGDW+_GYcv>rm4DWZ!MfLvxKfH70u4-s#TzxrWn+$SlO11EEJ|jvMV&Z3KdFVWLdjN zvr55M*D0*(WyRRM#_JH=4cn%zXck_fn)w#CC)cQf1z)nL z!U{!y7#E7P@CG;x_?Vcwq8f~MT*j;3mnvmYr-08`(@bnB8>WF<=v8CQ@3)E&Kj0C? zDz2CcBfiM!DjVj?5s20#UZZxf_kw0xpwbE}Ug4*tFqK-2_bfm94EGbWO^DttwA#T9 z&J%*<-wT#`rr5O0{J#XJd;O?IwN*bAHfGo^9Md@WdcX^!G}KBl%u_5pbbsLAN9ZSb zhBO23OPEx29ge4&F_;>}m)kgdFfM3{Wnpab)6BN73x9r?E1EjZDcT!FWs8;6+)JDM z6{5ey%o3!el>?j`51xRBX&!&z(U~R{aA!|+97B%Kb=;Kgp<#3~#`2lg7TB{;2Q$zWP1Kyn9a9XBX-ZJ=};#M-vSM!*vwx>AlGZ zn8J`ivvXk8lV|obM=mXYdH##@?)?kZ%%YcBbmj5-@Ytuz?%^44I9D5<+Z&#%C+F&^ zv5ODx#=Y#Umwnjf^UOudotpEe9&?kAgR4gq0CHfk(St@F0e>Sy;BRDTCjrh5jdSS7 z>SITDp4-n%)iR5FnZ;kFUwUgxukJ0qT3ve0TYAlXeXW`)dYNKX9^a8ZPSgj-YlA2E z22Wls{iy$(uMRGIgUdT|J$(l^c21}#2W!bE_L5IreeUN(HF?%co^`{!A##bP+zmKL z_=fUjj15Jn82br~Awen{r;`}JSy8msii}mG2tCmb62(uo@|w3|4BuMp1WyXywV!4W zz{vQEI~aI7u@+!}Yzcq$^t~6B8qvcsj^zK1Y&JA}W?J^6yf}gu!uWShvu&k0bB1md zXgO%?K}Yjb^DCCkpfF#A%FqI6-=U^84){;`$>z?VVo$=9@5EY%0pcYH`)Ja={ar^# c-R`>~9TE7}ZarR{^X|-D4;F9UMkK)XH}z@z2><{9 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/executive_summary_report.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/executive_summary_report.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ab0b5dac68b7b2bd918fe0e25b29ed1da00f512 GIT binary patch literal 1536 zcmbtU&u<$=6rNe{I(CxcDzXqwD|I=PXbG_kTzWt~rA-OKRE^5PLK>}i#_^in9cN~? zwXKvys0aQ4q(rC(P61R79Qh+a+EkVrjl>Bd!Oc}T^~B8X+G&*bQ1QHe^M1^{`SzQ6 z`@^|&vp~t6gS-BB1^|C*XChW^9N$vL9>4&@0EDm!L!)Ux?HfTMG@B*_23P~Q@DN~= z7~RP_a8Ll?vHEAyEMjW|IK_Xo>lm`w_DO)bEQS=5fICo@?{dO!Fh-e|uSo}mE0yC# zHS7Tbnh=Agfnl?NEo?r7O%oS%W%=ffKJjAV-y<7w7`kk5hx8~D!#7;dqj4l^EcKbL z*zn3(*;H%H8tL)hO6`GdlN;L>s|c88Q-$Gy@*YnkUqdlLrt;mX{r&WfPu2pkZD8ZV zG=K{y_UWqsqo(<)nnQKQ56aluE_cld1RrX~8pDmosypB|>Gv4n+@}$@XgINxL|&?sS6CaGb>F_g0`G{0iB$oJ)vRB*|aM6XphK>7c)j8fl@H7 zft-&>|HLcOcAFC+t-ud`AxrmN7O8D`jtu)Mt^2^9%JaQ?hlZr?248mEA?y0}+XJuT zvhX&eUE&E|SC_W`;Z-$Iy7Kf*PbJgqK2sV@Jx_RGzmKl}CL(R()!t81g`+VAiDw)}M6eX{N* zEkEh@My;)cJs7pVI$Ylwt?wLGcfKhfoqucJc~na(PEvA?)t101Wc}K3ELlP*azlcU zoJB~H6$jd$M`$Z{gFI70e$*k%7wn>1{S#o9)WGz&gUw7-Q5k$isom-CsB(Gt*4VVH zcgNrrDyyW6G@Kb}>Z4C@Fw03jR~0kjiv`RsE9t|X_Qu~~u&^jWq4`J*qM>G;1dNv1&l198Wr_-}*`jUO`&3nI@_ug;jW2rO+D4l~B-YWv| zLoISCWX^C2ojqW{h!1UI69O7M0H*B%(>ZBr`Gx}>;1Iu5Y@Hd;pi=m$mK72g+acq= zbhC6~uw){`t7!IsgH0IN8Y8$_vkj*2f?Y_DiLX5p%WmX_fn0Xoa4U$O^3700weW4= zhYpLcdxAPC0BwSxB7snrVY=3H?luF@b^LPDO}P<@at8K-jdF@F=XmMn4XQ5HoNBt^ zLsWb44q9kaVdP5g!v6T4QS<=4!_kUqP12nJKz{Vq?gdX&v(9rH8_bEEiWciU*p4sK z4Ibez4s+IhP8%NgnM6tr$^C{@^~$I3t!CKfmgB!}I$hE7ton}IbVR!@!WMTUX(9Wa z#d$PgICp!gntDleVLm4eIj|VtrYUwj`gbHFR$A$uT4&T(H+O`3Qr*S>Usv_Kk<>oO8}%}J%Y>Q|A8?YxNbauVoIB^`Wz0^rS(1fOd39%C=2bv&gBvcTEKq07-qq12%>tv0+>+Y^Y zVugwWhX_@ILnJtGun-Eg^gtyJ{Rus;t(9zzR0*l4-i*SDQ)hO)j-3!8K#aXJZ{BGl03d)=7UZZTm7|k%&Xe>|fCgs(r0)Re zk?0KLF5K_{@Em_mOL`%51w_67k!jR}*t9HVp^n&`3Z<-$C?VD0vUk4QVZKaL3WjNyRC4Wh5%vhFb_;LV{Mt9IDX;p?5Pkp!X9Z zOv~Vw2WJ4uSG#F{?wUPzEpYkVah1;an{bO9$Zlz+4Y$ec*rM#3kxhMC<+OWWp`fo# zZs!Nd?b_mQmuvL7_5hFxxNxb*g<8i}&q4og5;yRIw!gQc*S)o>6l|64!Z6UT z-z{d9DRC~fb%Z^u9vFn&BU;{88E|DGRW>wJoWf;wd3;n5o$4oOcJ0$+q~>9yQvwBJ zB`*nvxZEHMhAQO6m11{eRV=42NySqiE9$x==#pX-CqGJnq-m;F47#dh)Pjb~G3rR? zRb7x_vDc-fWj!TkV;F6h?C**_F2yk#bvh$ng!T|)8%17_6evK^kcwehv+n^_(cQ5a z-$iNSJ5|}{S7E_GtaDM!MrqWc<_VLIdgKK~)rcE(9V4P4)Fml;0b^7}LR@EpF`Bwifq_#dlc<$c*mCH zy28;NeJLzRMjN5A)HSFprRMUYvVv98$X$h))7XK?pVriz;M|YMFQipXSk7gM-fSUH zTpaZxMwhZ_#E_Ii9gS#erP+Ah&14*#$824<%ou^2=?TEzkE2ys#b2TqH z{&(Y69Gl+danVR4VaF0uM0Gzd3%5bd*L^Q|H(2)dTfTnN*I)AoE&o92^pmqs&p$qI zjw$6K)f!SOe%17=HNJQK_`?~CAFlF=3ZHl}@p7unpR)KP)OprtT zVR7SCZnDBn{xxAuCCxc#O-W@gZE*g2f5{aFKO?l{;MF4nJe8BWKLB*Q_H#nVYw``PZG^-kvuAcWY>SZV z>I{BZGvx5uN@xt(h@4*Jy@1bF*4gpS6CbW)3B0(t)GbGWN}D2l4HfcnY= b2Y36|+5Hq&X=nFv>Cx(If`9W4qP_Y5a=jm& literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/mail_activity_type.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/mail_activity_type.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..592f6a98d0c3225bcca03b9f95dd95e2afd2bcd9 GIT binary patch literal 1552 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⪻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 s=r{U;vv zpQv{Y-Z^wn{5IxF`(5df)A^fv=NQ<;H~GX9E;P{b48eaQT<7L558s-obqu>5!}mtN z9dkzxx+CYFL_-7T`Oo7&$GFk4A3_h_emrsP(ZsPIe^;BBawn#0V{f@*Z#ie@YGZS? zT^V;*#)(Pw;aw|SEN%-v{Cu|F^U4Yr?XrdXyR)}?+)ZblO=tf#ocv+W(%#48M<0zJ zt&Jad@jLam(|_-A&lYM^hC5}{hD~?abc$EqVS1~x-Z$d*9r;mv)Hm()P1k2XbY$Zh z$9>A57XHm~7ofT|>-L{>`p+%Te&WvB&b8{J+3E^T;YqlY!UX~FPYMKkIl)GO_~jj)I$JDfz+UNyV6^3fcw)Uup-V*WJjFM;&DrR28l~MWgJa_r$n&{` zZ%-xZvI)tUWG<+bY6Lha&6OpqsAjaRmVs;#eHqwpNX-;mTEsVmre-CY^zU0L=7Z7| z!(5aWb6O_1iYlWRQchWbEH7Abm9RqU=cl5QX*ANlRqGz1stqZVg;-;d049&XiBDn= zGe!SkWvIb%N?B?a8hd*wCAv#bAzE8N0#(upUKLX*qj~%!Pmcnp=qLa`+V@=yzJBHG zdfEB^-1aG49iyfj+|Qf1O?_XKzAAm*>AmAjvY*9d88aAJW(gUymJ$fP%sOTHYDv)> zGcj2+ATH2s-$6%Dfqz#OgAHt$rnC4ZRrgbN&t0?V+mHp#tCWof8owq;2gO;P+@6Q9 z;vgnUBhSNcWwi7d+>E}0Km@>|zBXE(pQf`oj_mx7^DgZ37lTQP0Bx-`3le#w`B(25 zy>WJVX#CEZyED$A_nlA5;AY+u-Vy5it1BUX$7lQ#4&gHoI^y8+%c(nA_vMuH+J_Fg z3dq;_Q|Ow`3-4hyd{KDfL2z2ocEp$Jd*66)c5$mGx0akND7ORPQqyY#t z03C6xo_zhmmZf3mWD%w-;3T1%5iVghei@Mg0y02H+_OA+{K3M~XU>_jGg+xkR@}*o zBTlS{9bwSpCfLqJdT(61`JvN0{@|Q*WY&2vR|{)ySX&W#!su!dJ_&J=Jl`4|X_9*j zZI6WqAUaqFd|o4mXOcZE201PmNQHVa9uqNB^&ZQUCW_9?H_KblkKk`@skUF`Xbdn| z50b&}LZ)t|3XnHbOdD9DHA?Y^N!EQCe)O|6u*T;>J$3Jy>BqPQ#sc2^{}Maq%lQdP zU<~b*^*sQ1UY-Yw$x9A5y!u<_UU7cyt8@FE_OHH)qwQKW68! literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/__pycache__/res_partner.cpython-311.pyc b/dev_odex30_accounting/odex30_account_reports/models/__pycache__/res_partner.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c75e49b2d1e99edf04f213835d47c04f8b88bb9 GIT binary patch literal 6235 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 literal 0 HcmV?d00001 diff --git a/dev_odex30_accounting/odex30_account_reports/models/account.py b/dev_odex30_accounting/odex30_account_reports/models/account.py new file mode 100644 index 0000000..63c5a14 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account.py @@ -0,0 +1,9 @@ + +from odoo import api, fields, models + + +class AccountAccount(models.Model): + _inherit = "account.account" + + exclude_provision_currency_ids = fields.Many2many('res.currency', relation='account_account_exclude_res_currency_provision', help="Whether or not we have to make provisions for the selected foreign currencies.") + budget_item_ids = fields.One2many(comodel_name='account.report.budget.item', inverse_name='account_id') # To use it in the domain when adding accounts from the report diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_aged_partner_balance.py b/dev_odex30_accounting/odex30_account_reports/models/account_aged_partner_balance.py new file mode 100644 index 0000000..35b0547 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_aged_partner_balance.py @@ -0,0 +1,447 @@ + +import datetime + +from odoo import models, fields, _ +from odoo.tools import SQL +from odoo.tools.misc import format_date + +from dateutil.relativedelta import relativedelta +from itertools import chain + + +class AgedPartnerBalanceCustomHandler(models.AbstractModel): + _name = 'account.aged.partner.balance.report.handler' + _inherit = 'account.report.custom.handler' + _description = 'Aged Partner Balance Custom Handler' + + def _get_custom_display_config(self): + return { + 'css_custom_class': 'aged_partner_balance', + 'templates': { + 'AccountReportLineName': 'odex30_account_reports.AgedPartnerBalanceLineName', + }, + 'components': { + 'AccountReportFilters': 'odex30_account_reports.AgedPartnerBalanceFilters', + }, + } + + def _custom_options_initializer(self, report, options, previous_options): + super()._custom_options_initializer(report, options, previous_options=previous_options) + hidden_columns = set() + + options['multi_currency'] = report.env.user.has_group('base.group_multi_currency') + options['show_currency'] = options['multi_currency'] and (previous_options or {}).get('show_currency', False) + options['no_xlsx_currency_code_columns'] = True + if not options['show_currency']: + hidden_columns.update(['amount_currency', 'currency']) + + options['show_account'] = (previous_options or {}).get('show_account', False) + if not options['show_account']: + hidden_columns.add('account_name') + + options['columns'] = [ + column for column in options['columns'] + if column['expression_label'] not in hidden_columns + ] + + default_order_column = { + 'expression_label': 'invoice_date', + 'direction': 'ASC', + } + + options['order_column'] = previous_options.get('order_column') or default_order_column + options['aging_based_on'] = previous_options.get('aging_based_on') or 'base_on_maturity_date' + options['aging_interval'] = previous_options.get('aging_interval') or 30 + + # Set aging column names + interval = options['aging_interval'] + for column in options['columns']: + if column['expression_label'].startswith('period'): + period_number = int(column['expression_label'].replace('period', '')) - 1 + if 0 <= period_number < 4: + column['name'] = f'{interval * period_number + 1}-{interval * (period_number + 1)}' + + def _custom_line_postprocessor(self, report, options, lines): + partner_lines_map = {} + + # Sort line dicts by partner + for line in lines: + model, model_id = report._get_model_info_from_id(line['id']) + if model == 'res.partner': + partner_lines_map[model_id] = line + + if partner_lines_map: + for partner, line_dict in zip( + self.env['res.partner'].browse(partner_lines_map), + partner_lines_map.values() + ): + line_dict['trust'] = partner.with_company(partner.company_id or self.env.company).trust + + return lines + + def _report_custom_engine_aged_receivable(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + return self._aged_partner_report_custom_engine_common(options, 'asset_receivable', current_groupby, next_groupby, offset=offset, limit=limit) + + def _report_custom_engine_aged_payable(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + return self._aged_partner_report_custom_engine_common(options, 'liability_payable', current_groupby, next_groupby, offset=offset, limit=limit) + + def _aged_partner_report_custom_engine_common(self, options, internal_type, current_groupby, next_groupby, offset=0, limit=None): + report = self.env['account.report'].browse(options['report_id']) + report._check_groupby_fields((next_groupby.split(',') if next_groupby else []) + ([current_groupby] if current_groupby else [])) + + def minus_days(date_obj, days): + return fields.Date.to_string(date_obj - relativedelta(days=days)) + + aging_date_field = SQL.identifier('invoice_date') if options['aging_based_on'] == 'base_on_invoice_date' else SQL.identifier('date_maturity') + date_to = fields.Date.from_string(options['date']['date_to']) + interval = options['aging_interval'] + periods = [(False, fields.Date.to_string(date_to))] + # Since we added the first period in the list we have to do one less iteration + nb_periods = len([column for column in options['columns'] if column['expression_label'].startswith('period')]) - 1 + for i in range(nb_periods): + start_date = minus_days(date_to, (interval * i) + 1) + # The last element of the list will have False for the end date + end_date = minus_days(date_to, interval * (i + 1)) if i < nb_periods - 1 else False + periods.append((start_date, end_date)) + + def build_result_dict(report, query_res_lines): + rslt = {f'period{i}': 0 for i in range(len(periods))} + + for query_res in query_res_lines: + for i in range(len(periods)): + period_key = f'period{i}' + rslt[period_key] += query_res[period_key] + + if current_groupby == 'id': + query_res = query_res_lines[0] # We're grouping by id, so there is only 1 element in query_res_lines anyway + currency = self.env['res.currency'].browse(query_res['currency_id'][0]) if len(query_res['currency_id']) == 1 else None + rslt.update({ + 'invoice_date': query_res['invoice_date'][0] if len(query_res['invoice_date']) == 1 else None, + 'due_date': query_res['due_date'][0] if len(query_res['due_date']) == 1 else None, + 'amount_currency': query_res['amount_currency'], + 'currency_id': query_res['currency_id'][0] if len(query_res['currency_id']) == 1 else None, + 'currency': currency.display_name if currency else None, + 'account_name': query_res['account_name'][0] if len(query_res['account_name']) == 1 else None, + 'total': None, + 'has_sublines': query_res['aml_count'] > 0, + + # Needed by the custom_unfold_all_batch_data_generator, to speed-up unfold_all + 'partner_id': query_res['partner_id'][0] if query_res['partner_id'] else None, + }) + else: + rslt.update({ + 'invoice_date': None, + 'due_date': None, + 'amount_currency': None, + 'currency_id': None, + 'currency': None, + 'account_name': None, + 'total': sum(rslt[f'period{i}'] for i in range(len(periods))), + 'has_sublines': False, + }) + + return rslt + + # Build period table + period_table_format = ('(VALUES %s)' % ','.join("(%s, %s, %s)" for period in periods)) + params = list(chain.from_iterable( + (period[0] or None, period[1] or None, i) + for i, period in enumerate(periods) + )) + period_table = SQL(period_table_format, *params) + + # Build query + query = report._get_report_query(options, 'strict_range', domain=[('account_id.account_type', '=', internal_type)]) + account_alias = query.left_join(lhs_alias='account_move_line', lhs_column='account_id', rhs_table='account_account', rhs_column='id', link='account_id') + account_code = self.env['account.account']._field_to_sql(account_alias, 'code', query) + + always_present_groupby = SQL("period_table.period_index") + if current_groupby: + groupby_field_sql = self.env['account.move.line']._field_to_sql("account_move_line", current_groupby, query) + select_from_groupby = SQL("%s AS grouping_key,", groupby_field_sql) + groupby_clause = SQL("%s, %s", groupby_field_sql, always_present_groupby) + else: + select_from_groupby = SQL() + groupby_clause = always_present_groupby + multiplicator = -1 if internal_type == 'liability_payable' else 1 + select_period_query = SQL(',').join( + SQL(""" + CASE WHEN period_table.period_index = %(period_index)s + THEN %(multiplicator)s * SUM(%(balance_select)s) + ELSE 0 END AS %(column_name)s + """, + period_index=i, + multiplicator=multiplicator, + column_name=SQL.identifier(f"period{i}"), + balance_select=report._currency_table_apply_rate(SQL( + "account_move_line.balance - COALESCE(part_debit.amount, 0) + COALESCE(part_credit.amount, 0)" + )), + ) + for i in range(len(periods)) + ) + + tail_query = report._get_engine_query_tail(offset, limit) + query = SQL( + """ + WITH period_table(date_start, date_stop, period_index) AS (%(period_table)s) + + SELECT + %(select_from_groupby)s + %(multiplicator)s * ( + SUM(account_move_line.amount_currency) + - COALESCE(SUM(part_debit.debit_amount_currency), 0) + + COALESCE(SUM(part_credit.credit_amount_currency), 0) + ) AS amount_currency, + ARRAY_AGG(DISTINCT account_move_line.partner_id) AS partner_id, + ARRAY_AGG(account_move_line.payment_id) AS payment_id, + ARRAY_AGG(DISTINCT account_move_line.invoice_date) AS invoice_date, + ARRAY_AGG(DISTINCT COALESCE(account_move_line.%(aging_date_field)s, account_move_line.date)) AS report_date, + ARRAY_AGG(DISTINCT %(account_code)s) AS account_name, + ARRAY_AGG(DISTINCT COALESCE(account_move_line.%(aging_date_field)s, account_move_line.date)) AS due_date, + ARRAY_AGG(DISTINCT account_move_line.currency_id) AS currency_id, + COUNT(account_move_line.id) AS aml_count, + ARRAY_AGG(%(account_code)s) AS account_code, + %(select_period_query)s + + FROM %(table_references)s + + JOIN account_journal journal ON journal.id = account_move_line.journal_id + %(currency_table_join)s + + LEFT JOIN LATERAL ( + SELECT + SUM(part.amount) AS amount, + SUM(part.debit_amount_currency) AS debit_amount_currency, + part.debit_move_id + FROM account_partial_reconcile part + WHERE part.max_date <= %(date_to)s AND part.debit_move_id = account_move_line.id + GROUP BY part.debit_move_id + ) part_debit ON TRUE + + LEFT JOIN LATERAL ( + SELECT + SUM(part.amount) AS amount, + SUM(part.credit_amount_currency) AS credit_amount_currency, + part.credit_move_id + FROM account_partial_reconcile part + WHERE part.max_date <= %(date_to)s AND part.credit_move_id = account_move_line.id + GROUP BY part.credit_move_id + ) part_credit ON TRUE + + JOIN period_table ON + ( + period_table.date_start IS NULL + OR COALESCE(account_move_line.%(aging_date_field)s, account_move_line.date) <= DATE(period_table.date_start) + ) + AND + ( + period_table.date_stop IS NULL + OR COALESCE(account_move_line.%(aging_date_field)s, account_move_line.date) >= DATE(period_table.date_stop) + ) + + WHERE %(search_condition)s + + GROUP BY %(groupby_clause)s + + HAVING + ROUND(SUM(%(having_debit)s), %(currency_precision)s) != 0 + OR ROUND(SUM(%(having_credit)s), %(currency_precision)s) != 0 + + ORDER BY %(groupby_clause)s + + %(tail_query)s + """, + account_code=account_code, + period_table=period_table, + select_from_groupby=select_from_groupby, + select_period_query=select_period_query, + multiplicator=multiplicator, + aging_date_field=aging_date_field, + table_references=query.from_clause, + currency_table_join=report._currency_table_aml_join(options), + date_to=date_to, + search_condition=query.where_clause, + groupby_clause=groupby_clause, + having_debit=report._currency_table_apply_rate(SQL("CASE WHEN account_move_line.balance > 0 THEN account_move_line.balance else 0 END - COALESCE(part_debit.amount, 0)")), + having_credit=report._currency_table_apply_rate(SQL("CASE WHEN account_move_line.balance < 0 THEN -account_move_line.balance else 0 END - COALESCE(part_credit.amount, 0)")), + currency_precision=self.env.company.currency_id.decimal_places, + tail_query=tail_query, + ) + + self._cr.execute(query) + query_res_lines = self._cr.dictfetchall() + + if not current_groupby: + return build_result_dict(report, query_res_lines) + else: + rslt = [] + + all_res_per_grouping_key = {} + for query_res in query_res_lines: + grouping_key = query_res['grouping_key'] + all_res_per_grouping_key.setdefault(grouping_key, []).append(query_res) + + for grouping_key, query_res_lines in all_res_per_grouping_key.items(): + rslt.append((grouping_key, build_result_dict(report, query_res_lines))) + + return rslt + + def open_journal_items(self, options, params): + params['view_ref'] = 'account.view_move_line_tree_grouped_partner' + options_for_audit = {**options, 'date': {**options['date'], 'date_from': None}} + report = self.env['account.report'].browse(options['report_id']) + action = report.open_journal_items(options=options_for_audit, params=params) + action.get('context', {}).update({'search_default_group_by_account': 0, 'search_default_group_by_partner': 1}) + return action + + def open_customer_statement(self, options, params): + report = self.env['account.report'].browse(options['report_id']) + record_model, record_id = report._get_model_info_from_id(params.get('line_id')) + if self.env.ref('odex30_account_reports.customer_statement_report', raise_if_not_found=False): + return self.env[record_model].browse(record_id).open_customer_statement() + return self.env[record_model].browse(record_id).open_partner_ledger() + + def _common_custom_unfold_all_batch_data_generator(self, internal_type, report, options, lines_to_expand_by_function): + rslt = {} # In the form {full_sub_groupby_key: all_column_group_expression_totals for this groupby computation} + report_periods = 6 # The report has 6 periods + + for expand_function_name, lines_to_expand in lines_to_expand_by_function.items(): + for line_to_expand in lines_to_expand: # In standard, this loop will execute only once + if expand_function_name == '_report_expand_unfoldable_line_with_groupby': + report_line_id = report._get_res_id_from_line_id(line_to_expand['id'], 'account.report.line') + expressions_to_evaluate = report.line_ids.expression_ids.filtered(lambda x: x.report_line_id.id == report_line_id and x.engine == 'custom') + + if not expressions_to_evaluate: + continue + + for column_group_key, column_group_options in report._split_options_per_column_group(options).items(): + # Get all aml results by partner + aml_data_by_partner = {} + for aml_id, aml_result in self._aged_partner_report_custom_engine_common(column_group_options, internal_type, 'id', None): + aml_result['aml_id'] = aml_id + aml_data_by_partner.setdefault(aml_result['partner_id'], []).append(aml_result) + + # Iterate on results by partner to generate the content of the column group + partner_expression_totals = rslt.setdefault(f"[{report_line_id}]=>partner_id", {})\ + .setdefault(column_group_key, {expression: {'value': []} for expression in expressions_to_evaluate}) + for partner_id, aml_data_list in aml_data_by_partner.items(): + partner_values = self._prepare_partner_values() + for i in range(report_periods): + partner_values[f'period{i}'] = 0 + + # Build expression totals under the right key + partner_aml_expression_totals = rslt.setdefault(f"[{report_line_id}]partner_id:{partner_id}=>id", {})\ + .setdefault(column_group_key, {expression: {'value': []} for expression in expressions_to_evaluate}) + for aml_data in aml_data_list: + for i in range(report_periods): + period_value = aml_data[f'period{i}'] + partner_values[f'period{i}'] += period_value + partner_values['total'] += period_value + + for expression in expressions_to_evaluate: + partner_aml_expression_totals[expression]['value'].append( + (aml_data['aml_id'], aml_data[expression.subformula]) + ) + + for expression in expressions_to_evaluate: + partner_expression_totals[expression]['value'].append( + (partner_id, partner_values[expression.subformula]) + ) + + return rslt + + def _prepare_partner_values(self): + return { + 'invoice_date': None, + 'due_date': None, + 'amount_currency': None, + 'currency_id': None, + 'currency': None, + 'account_name': None, + 'total': 0, + } + + def aged_partner_balance_audit(self, options, params, journal_type): + """ Open a list of invoices/bills and/or deferral entries for the clicked cell + :param dict options: the report's `options` + :param dict params: a dict containing: + `calling_line_dict_id`: line id containing the optional account of the cell + `expression_label`: the expression label of the cell + """ + report = self.env['account.report'].browse(options['report_id']) + action = self.env['ir.actions.actions']._for_xml_id('account.action_amounts_to_settle') + journal_type_to_exclude = {'purchase': 'sale', 'sale': 'purchase'} + if options: + domain = [ + ('account_id.reconcile', '=', True), + ('journal_id.type', '!=', journal_type_to_exclude.get(journal_type)), + *self._build_domain_from_period(options, params['expression_label']), + *report._get_options_domain(options, 'from_beginning'), + *report._get_audit_line_groupby_domain(params['calling_line_dict_id']), + ] + action['domain'] = domain + return action + + def _build_domain_from_period(self, options, period): + if period != "total" and period[-1].isdigit(): + period_number = int(period[-1]) + if period_number == 0: + domain = [('date_maturity', '>=', options['date']['date_to'])] + else: + options_date_to = datetime.datetime.strptime(options['date']['date_to'], '%Y-%m-%d') + period_end = options_date_to - datetime.timedelta(30*(period_number-1)+1) + period_start = options_date_to - datetime.timedelta(30*(period_number)) + domain = [('date_maturity', '>=', period_start), ('date_maturity', '<=', period_end)] + if period_number == 5: + domain = [('date_maturity', '<=', period_end)] + else: + domain = [] + return domain + +class AgedPayableCustomHandler(models.AbstractModel): + _name = 'account.aged.payable.report.handler' + _inherit = 'account.aged.partner.balance.report.handler' + _description = 'Aged Payable Custom Handler' + + def open_journal_items(self, options, params): + payable_account_type = {'id': 'trade_payable', 'name': _("Payable"), 'selected': True} + + if 'account_type' in options: + options['account_type'].append(payable_account_type) + else: + options['account_type'] = [payable_account_type] + + return super().open_journal_items(options, params) + + def _custom_unfold_all_batch_data_generator(self, report, options, lines_to_expand_by_function): + # We only optimize the unfold all if the groupby value of the report has not been customized. Else, we'll just run the full computation + if self.env.ref('odex30_account_reports.aged_payable_line').groupby.replace(' ', '') == 'partner_id,id': + return self._common_custom_unfold_all_batch_data_generator('liability_payable', report, options, lines_to_expand_by_function) + return {} + + def action_audit_cell(self, options, params): + return super().aged_partner_balance_audit(options, params, 'purchase') + +class AgedReceivableCustomHandler(models.AbstractModel): + _name = 'account.aged.receivable.report.handler' + _inherit = 'account.aged.partner.balance.report.handler' + _description = 'Aged Receivable Custom Handler' + + def open_journal_items(self, options, params): + receivable_account_type = {'id': 'trade_receivable', 'name': _("Receivable"), 'selected': True} + + if 'account_type' in options: + options['account_type'].append(receivable_account_type) + else: + options['account_type'] = [receivable_account_type] + + return super().open_journal_items(options, params) + + def _custom_unfold_all_batch_data_generator(self, report, options, lines_to_expand_by_function): + # We only optimize the unfold all if the groupby value of the report has not been customized. Else, we'll just run the full computation + if self.env.ref('odex30_account_reports.aged_receivable_line').groupby.replace(' ', '') == 'partner_id,id': + return self._common_custom_unfold_all_batch_data_generator('asset_receivable', report, options, lines_to_expand_by_function) + return {} + + def action_audit_cell(self, options, params): + return super().aged_partner_balance_audit(options, params, 'sale') diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_analytic_report.py b/dev_odex30_accounting/odex30_account_reports/models/account_analytic_report.py new file mode 100644 index 0000000..f972be1 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_analytic_report.py @@ -0,0 +1,257 @@ + +from odoo import models, fields, api, osv +from odoo.addons.web.controllers.utils import clean_action +from odoo.tools import SQL, Query + + +class AccountReport(models.AbstractModel): + _inherit = 'account.report' + + filter_analytic_groupby = fields.Boolean( + string="Analytic Group By", + compute=lambda x: x._compute_report_option_filter('filter_analytic_groupby'), readonly=False, store=True, depends=['root_report_id', 'section_main_report_ids'], + ) + + def _get_options_initializers_forced_sequence_map(self): + """ Force the sequence for the init_options so columns headers are already generated but not the columns + So, between _init_options_column_headers and _init_options_columns""" + sequence_map = super(AccountReport, self)._get_options_initializers_forced_sequence_map() + sequence_map[self._init_options_analytic_groupby] = 995 + return sequence_map + + def _init_options_analytic_groupby(self, options, previous_options): + if not self.filter_analytic_groupby: + return + enable_analytic_accounts = self.env.user.has_group('analytic.group_analytic_accounting') + if not enable_analytic_accounts: + return + + options['display_analytic_groupby'] = True + options['display_analytic_plan_groupby'] = True + + options['include_analytic_without_aml'] = previous_options.get('include_analytic_without_aml', False) + previous_analytic_accounts = previous_options.get('analytic_accounts_groupby', []) + analytic_account_ids = [int(x) for x in previous_analytic_accounts] + selected_analytic_accounts = self.env['account.analytic.account'].with_context(active_test=False).search( + [('id', 'in', analytic_account_ids)]) + options['analytic_accounts_groupby'] = selected_analytic_accounts.ids + options['selected_analytic_account_groupby_names'] = selected_analytic_accounts.mapped('name') + + previous_analytic_plans = previous_options.get('analytic_plans_groupby', []) + analytic_plan_ids = [int(x) for x in previous_analytic_plans] + selected_analytic_plans = self.env['account.analytic.plan'].search([('id', 'in', analytic_plan_ids)]) + options['analytic_plans_groupby'] = selected_analytic_plans.ids + options['selected_analytic_plan_groupby_names'] = selected_analytic_plans.mapped('name') + + self._create_column_analytic(options) + + def _init_options_readonly_query(self, options, previous_options): + super()._init_options_readonly_query(options, previous_options) + options['readonly_query'] = options['readonly_query'] and not options.get('analytic_groupby_option') + + def _create_column_analytic(self, options): + """ Creates the analytic columns for each plan or account in the filters. + This will duplicate all previous columns and adding the analytic accounts in the domain of the added columns. + + The analytic_groupby_option is used so the table used is the shadowed table. + The domain on analytic_distribution can just use simple comparison as the column of the shadowed + table will simply be filled with analytic_account_ids. + """ + analytic_headers = [] + plans = self.env['account.analytic.plan'].browse(options.get('analytic_plans_groupby')) + for plan in plans: + account_list = [] + accounts = self.env['account.analytic.account'].search([('plan_id', 'child_of', plan.id)]) + for account in accounts: + account_list.append(account.id) + analytic_headers.append({ + 'name': plan.name, + 'forced_options': { + 'analytic_groupby_option': True, + 'analytic_accounts_list': tuple(account_list), # Analytic accounts used in the domain to filter the lines. + 'analytic_plan_id': plan.id, + } + }) + + accounts = self.env['account.analytic.account'].browse(options.get('analytic_accounts_groupby')) + for account in accounts: + analytic_headers.append({ + 'name': account.name, + 'forced_options': { + 'analytic_groupby_option': True, + 'analytic_accounts_list': (account.id,), + } + }) + if analytic_headers: + has_selected_budgets = any([budget for budget in options.get('budgets', []) if budget['selected']]) + if has_selected_budgets: + # if budget is selected, then analytic headers are placed on the same header level + options['column_headers'][-1] = analytic_headers + options['column_headers'][-1] + else: + # We add the analytic layer to the column_headers before creating the columns + analytic_headers.append({'name': ''}) + + options['column_headers'] = [ + *options['column_headers'], + analytic_headers, + ] + + @api.model + def _prepare_lines_for_analytic_groupby(self): + """Prepare the analytic_temp_account_move_line + + This method should be used once before all the SQL queries using the + table account_move_line for the analytic columns for the financial reports. + It will create a new table with the schema of account_move_line table, but with + the data from account_analytic_line. + + We inherit the schema of account_move_line, make the correspondence between + account_move_line fields and account_analytic_line fields and put NULL for those + who don't exist in account_analytic_line. + We also drop the NOT NULL constraints for fields who are not required in account_analytic_line. + """ + self.env.cr.execute("SELECT 1 FROM information_schema.tables WHERE table_name='analytic_temp_account_move_line'") + if self.env.cr.fetchone(): + return + + project_plan, other_plans = self.env['account.analytic.plan']._get_all_plans() + analytic_cols = SQL(", ").join(SQL('"account_analytic_line".%s', SQL.identifier(n._column_name())) for n in (project_plan + other_plans)) + analytic_distribution_equivalent = SQL('to_jsonb(UNNEST(ARRAY_REMOVE(ARRAY[%s], NULL)))', analytic_cols) + + change_equivalence_dict = { + 'id': SQL("account_analytic_line.id"), + 'balance': SQL("-amount"), + 'display_type': 'product', + 'parent_state': 'posted', + 'account_id': SQL.identifier("general_account_id"), + 'debit': SQL("CASE WHEN (amount < 0) THEN -amount else 0 END"), + 'credit': SQL("CASE WHEN (amount > 0) THEN amount else 0 END"), + 'analytic_distribution': analytic_distribution_equivalent, + 'date': SQL("account_analytic_line.date"), + 'company_id': SQL("account_analytic_line.company_id"), + } + + all_stored_aml_fields = { + field + for field, attrs in self.env['account.move.line'].fields_get().items() + if attrs['type'] not in ['many2many', 'one2many'] and attrs.get('store') + } + + for aml_field in all_stored_aml_fields: + if aml_field not in change_equivalence_dict: + change_equivalence_dict[aml_field] = SQL('"account_move_line".%s', SQL.identifier(aml_field)) + + stored_aml_fields, fields_to_insert = self.env['account.move.line']._prepare_aml_shadowing_for_report(change_equivalence_dict) + + query = SQL(""" + CREATE OR REPLACE TEMPORARY VIEW analytic_temp_account_move_line (%(stored_aml_fields)s) AS + SELECT %(fields_to_insert)s + FROM account_analytic_line + LEFT JOIN account_move_line + ON account_analytic_line.move_line_id = account_move_line.id + WHERE + account_analytic_line.general_account_id IS NOT NULL; + """, stored_aml_fields=stored_aml_fields, fields_to_insert=fields_to_insert) + + self.env.cr.execute(query) + + def _get_report_query(self, options, date_scope, domain=None) -> Query: + # Override to add the context key which will eventually trigger the shadowing of the table + context_self = self.with_context(account_report_analytic_groupby=options.get('analytic_groupby_option')) + + # We add the domain filter for analytic_distribution here, as the search is not available + query = super(AccountReport, context_self)._get_report_query(options, date_scope, domain) + if options.get('analytic_accounts'): + if 'analytic_accounts_list' in options: + # the table will be `analytic_temp_account_move_line` and thus analytic_distribution will be a single ID + analytic_account_ids = tuple(str(account_id) for account_id in options['analytic_accounts']) + query.add_where(SQL("""account_move_line.analytic_distribution IN %s""", analytic_account_ids)) + else: + # Real `account_move_line` table so real JSON with percentage + analytic_account_ids = [[str(account_id) for account_id in options['analytic_accounts']]] + query.add_where(SQL('%s && %s', analytic_account_ids, self.env['account.move.line']._query_analytic_accounts())) + + return query + + def action_audit_cell(self, options, params): + column_group_options = self._get_column_group_options(options, params['column_group_key']) + + if not column_group_options.get('analytic_groupby_option'): + return super(AccountReport, self).action_audit_cell(options, params) + else: + # Start by getting the domain from the options. Note that this domain is targeting account.move.line + report_line = self.env['account.report.line'].browse(params['report_line_id']) + expression = report_line.expression_ids.filtered(lambda x: x.label == params['expression_label']) + line_domain = self._get_audit_line_domain(column_group_options, expression, params) + # The line domain is made for move lines, so we need some postprocessing to have it work with analytic lines. + domain = [] + AccountAnalyticLine = self.env['account.analytic.line'] + for expression in line_domain: + if len(expression) == 1: # For operators such as '&' or '|' we can juste add them again. + domain.append(expression) + continue + + field, operator, right_term = expression + # On analytic lines, the account.account field is named general_account_id and not account_id. + if field.split('.')[0] == 'account_id': + field = field.replace('account_id', 'general_account_id') + expression = [(field, operator, right_term)] + # Replace the 'analytic_distribution' by the account_id domain as we expect for analytic lines. + elif field == 'analytic_distribution': + expression = [('auto_account_id', 'in', right_term)] + # For other fields not present in on the analytic line model, map them to get the info from the move_line. + # Or ignore these conditions if there is no move lines. + elif field.split('.')[0] not in AccountAnalyticLine._fields: + expression = [(f'move_line_id.{field}', operator, right_term)] + if options.get('include_analytic_without_aml'): + expression = osv.expression.OR([ + [('move_line_id', '=', False)], + expression, + ]) + else: + expression = [expression] # just for the extend + domain.extend(expression) + + action = clean_action(self.env.ref('analytic.account_analytic_line_action_entries')._get_action_dict(), env=self.env) + action['domain'] = domain + return action + + @api.model + def _get_options_journals_domain(self, options): + domain = super(AccountReport, self)._get_options_journals_domain(options) + # Add False to the domain in order to select lines without journals for analytics columns. + if options.get('include_analytic_without_aml'): + domain = osv.expression.OR([ + domain, + [('journal_id', '=', False)], + ]) + return domain + + def _get_options_domain(self, options, date_scope): + self.ensure_one() + domain = super()._get_options_domain(options, date_scope) + + # Get the analytic accounts that we need to filter on from the options and add a domain for them. + if 'analytic_accounts_list' in options: + domain = osv.expression.AND([ + domain, + [('analytic_distribution', 'in', options.get('analytic_accounts_list', []))], + ]) + + return domain + + +class AccountMoveLine(models.Model): + _inherit = "account.move.line" + + def _where_calc(self, domain, active_test=True): + """ In case we need an analytic column in an account_report, we shadow the account_move_line table + with a temp table filled with analytic data, that will be used for the analytic columns. + We do it in this function to only create and fill it once for all computations of a report. + The following analytic columns and computations will just query the shadowed table instead of the real one. + """ + query = super()._where_calc(domain, active_test) + if self.env.context.get('account_report_analytic_groupby') and not self.env.context.get('account_report_cash_basis'): + self.env['account.report']._prepare_lines_for_analytic_groupby() + query._tables['account_move_line'] = SQL.identifier('analytic_temp_account_move_line') + return query diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_cash_flow_report.py b/dev_odex30_accounting/odex30_account_reports/models/account_cash_flow_report.py new file mode 100644 index 0000000..555a497 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_cash_flow_report.py @@ -0,0 +1,711 @@ +from odoo import models, _ +from odoo.tools import SQL, Query + + +class CashFlowReportCustomHandler(models.AbstractModel): + _name = 'account.cash.flow.report.handler' + _inherit = 'account.report.custom.handler' + _description = 'Cash Flow Report Custom Handler' + + def _dynamic_lines_generator(self, report, options, all_column_groups_expression_totals, warnings=None): + lines = [] + + layout_data = self._get_layout_data() + report_data = self._get_report_data(report, options, layout_data) + + for layout_line_id, layout_line_data in layout_data.items(): + lines.append((0, self._get_layout_line(report, options, layout_line_id, layout_line_data, report_data))) + + if layout_line_id in report_data and 'aml_groupby_account' in report_data[layout_line_id]: + aml_data_values = report_data[layout_line_id]['aml_groupby_account'].values() + + aml_data_values_with_account_code = [] + aml_data_values_without_account_code = [] + + for aml_data in aml_data_values: + if aml_data['account_code'] is not None: + aml_data_values_with_account_code.append(aml_data) + else: + aml_data_values_without_account_code.append(aml_data) + + for aml_data in (sorted(aml_data_values_with_account_code, key=lambda x: x['account_code']) + + aml_data_values_without_account_code): + lines.append((0, self._get_aml_line(report, options, aml_data))) + + unexplained_difference_line = self._get_unexplained_difference_line(report, options, report_data) + + if unexplained_difference_line: + lines.append((0, unexplained_difference_line)) + + return lines + + def _custom_options_initializer(self, report, options, previous_options): + super()._custom_options_initializer(report, options, previous_options=previous_options) + report._init_options_journals(options, previous_options=previous_options, additional_journals_domain=[('type', 'in', ('bank', 'cash', 'general'))]) + + def _get_report_data(self, report, options, layout_data): + report_data = {} + + payment_account_ids = self._get_account_ids(report, options) + if not payment_account_ids: + return report_data + + # Compute 'Cash and cash equivalents, beginning of period' + for aml_data in self._compute_liquidity_balance(report, options, payment_account_ids, 'to_beginning_of_period'): + self._add_report_data('opening_balance', aml_data, layout_data, report_data) + self._add_report_data('closing_balance', aml_data, layout_data, report_data) + + # Compute 'Cash and cash equivalents, closing balance' + for aml_data in self._compute_liquidity_balance(report, options, payment_account_ids, 'strict_range'): + self._add_report_data('closing_balance', aml_data, layout_data, report_data) + + tags_ids = self._get_tags_ids() + cashflow_tag_ids = self._get_cashflow_tag_ids() + + # Process liquidity moves + for aml_groupby_account in self._get_liquidity_moves(report, options, payment_account_ids, cashflow_tag_ids): + for aml_data in aml_groupby_account.values(): + self._dispatch_aml_data(tags_ids, aml_data, layout_data, report_data) + + # Process reconciled moves + for aml_groupby_account in self._get_reconciled_moves(report, options, payment_account_ids, cashflow_tag_ids): + for aml_data in aml_groupby_account.values(): + self._dispatch_aml_data(tags_ids, aml_data, layout_data, report_data) + + return report_data + + def _add_report_data(self, layout_line_id, aml_data, layout_data, report_data): + """ + Add or update the report_data dictionnary with aml_data. + + report_data is a dictionnary where the keys are keys from _cash_flow_report_get_layout_data() (used for mapping) + and the values can contain 2 dictionnaries: + * (required) 'balance' where the key is the column_group_key and the value is the balance of the line + * (optional) 'aml_groupby_account' where the key is an account_id and the values are the aml data + """ + def _report_update_parent(layout_line_id, aml_column_group_key, aml_balance, layout_data, report_data): + # Update the balance in report_data of the parent of the layout_line_id recursively (Stops when the line has no parent) + if 'parent_line_id' in layout_data[layout_line_id]: + parent_line_id = layout_data[layout_line_id]['parent_line_id'] + + report_data.setdefault(parent_line_id, {'balance': {}}) + report_data[parent_line_id]['balance'].setdefault(aml_column_group_key, 0.0) + report_data[parent_line_id]['balance'][aml_column_group_key] += aml_balance + + _report_update_parent(parent_line_id, aml_column_group_key, aml_balance, layout_data, report_data) + + aml_column_group_key = aml_data['column_group_key'] + aml_account_id = aml_data['account_id'] + aml_account_code = aml_data['account_code'] + aml_account_name = aml_data['account_name'] + aml_balance = aml_data['balance'] + aml_account_tag = aml_data.get('account_tag_id', None) + + if self.env.company.currency_id.is_zero(aml_balance): + return + + report_data.setdefault(layout_line_id, { + 'balance': {}, + 'aml_groupby_account': {}, + }) + + report_data[layout_line_id]['aml_groupby_account'].setdefault(aml_account_id, { + 'parent_line_id': layout_line_id, + 'account_id': aml_account_id, + 'account_code': aml_account_code, + 'account_name': aml_account_name, + 'account_tag_id': aml_account_tag, + 'level': layout_data[layout_line_id]['level'] + 1, + 'balance': {}, + }) + + report_data[layout_line_id]['balance'].setdefault(aml_column_group_key, 0.0) + report_data[layout_line_id]['balance'][aml_column_group_key] += aml_balance + + report_data[layout_line_id]['aml_groupby_account'][aml_account_id]['balance'].setdefault(aml_column_group_key, 0.0) + report_data[layout_line_id]['aml_groupby_account'][aml_account_id]['balance'][aml_column_group_key] += aml_balance + + _report_update_parent(layout_line_id, aml_column_group_key, aml_balance, layout_data, report_data) + + def _get_tags_ids(self): + ''' Get a dict to pass on to _dispatch_aml_data containing information mapping account tags to report lines. ''' + return { + 'operating': self.env.ref('account.account_tag_operating').id, + 'investing': self.env.ref('account.account_tag_investing').id, + 'financing': self.env.ref('account.account_tag_financing').id, + } + + def _get_cashflow_tag_ids(self): + ''' Get the list of account tags that are relevant for the cash flow report. ''' + return self._get_tags_ids().values() + + def _dispatch_aml_data(self, tags_ids, aml_data, layout_data, report_data): + # Dispatch the aml_data in the correct layout_line + if aml_data['account_account_type'] == 'asset_receivable': + self._add_report_data('advance_payments_customer', aml_data, layout_data, report_data) + elif aml_data['account_account_type'] == 'liability_payable': + self._add_report_data('advance_payments_suppliers', aml_data, layout_data, report_data) + elif aml_data['balance'] < 0: + if aml_data['account_tag_id'] == tags_ids['operating']: + self._add_report_data('paid_operating_activities', aml_data, layout_data, report_data) + elif aml_data['account_tag_id'] == tags_ids['investing']: + self._add_report_data('investing_activities_cash_out', aml_data, layout_data, report_data) + elif aml_data['account_tag_id'] == tags_ids['financing']: + self._add_report_data('financing_activities_cash_out', aml_data, layout_data, report_data) + else: + self._add_report_data('unclassified_activities_cash_out', aml_data, layout_data, report_data) + elif aml_data['balance'] > 0: + if aml_data['account_tag_id'] == tags_ids['operating']: + self._add_report_data('received_operating_activities', aml_data, layout_data, report_data) + elif aml_data['account_tag_id'] == tags_ids['investing']: + self._add_report_data('investing_activities_cash_in', aml_data, layout_data, report_data) + elif aml_data['account_tag_id'] == tags_ids['financing']: + self._add_report_data('financing_activities_cash_in', aml_data, layout_data, report_data) + else: + self._add_report_data('unclassified_activities_cash_in', aml_data, layout_data, report_data) + + # ------------------------------------------------------------------------- + # QUERIES + # ------------------------------------------------------------------------- + def _get_account_ids(self, report, options): + ''' Retrieve all accounts to be part of the cash flow statement and also the accounts making them. + + :param options: The report options. + :return: payment_account_ids: A tuple containing all account.account's ids being used in a liquidity journal. + ''' + # Fetch liquidity accounts: + # Accounts being used by at least one bank/cash journal. + selected_journal_ids = [j['id'] for j in report._get_options_journals(options)] + + where_clause = "account_journal.id IN %s" if selected_journal_ids else "account_journal.type IN ('bank', 'cash', 'general')" + where_params = [tuple(selected_journal_ids)] if selected_journal_ids else [] + + self._cr.execute(f''' + SELECT + array_remove(ARRAY_AGG(DISTINCT account_account.id), NULL), + array_remove(ARRAY_AGG(DISTINCT account_payment_method_line.payment_account_id), NULL) + FROM account_journal + JOIN res_company + ON account_journal.company_id = res_company.id + LEFT JOIN account_payment_method_line + ON account_journal.id = account_payment_method_line.journal_id + LEFT JOIN account_account + ON account_journal.default_account_id = account_account.id + AND account_account.account_type IN ('asset_cash', 'liability_credit_card') + WHERE {where_clause} + ''', where_params) + + res = self._cr.fetchall()[0] + payment_account_ids = set((res[0] or []) + (res[1] or [])) + + if not payment_account_ids: + return () + + return tuple(payment_account_ids) + + def _get_move_ids_query(self, report, payment_account_ids, column_group_options) -> SQL: + ''' Get all liquidity moves to be part of the cash flow statement. + :param payment_account_ids: A tuple containing all account.account's ids being used in a liquidity journal. + :return: query: The SQL query to retrieve the move IDs. + ''' + + query = report._get_report_query(column_group_options, 'strict_range', [('account_id', 'in', list(payment_account_ids))]) + return SQL( + ''' + SELECT + array_agg(DISTINCT account_move_line.move_id) AS move_id + FROM %(table_references)s + WHERE %(search_condition)s + ''', + table_references=query.from_clause, + search_condition=query.where_clause, + ) + + def _compute_liquidity_balance(self, report, options, payment_account_ids, date_scope): + ''' Compute the balance of all liquidity accounts to populate the following sections: + 'Cash and cash equivalents, beginning of period' and 'Cash and cash equivalents, closing balance'. + + :param options: The report options. + :param payment_account_ids: A tuple containing all account.account's ids being used in a liquidity journal. + :return: A list of tuple (account_id, account_code, account_name, balance). + ''' + queries = [] + + for column_group_key, column_group_options in report._split_options_per_column_group(options).items(): + query = report._get_report_query(column_group_options, date_scope, domain=[('account_id', 'in', payment_account_ids)]) + account_alias = query.join(lhs_alias='account_move_line', lhs_column='account_id', rhs_table='account_account', rhs_column='id', link='account_id') + account_name = self.env['account.account']._field_to_sql(account_alias, 'name') + account_code = self.env['account.account']._field_to_sql(account_alias, 'code', query) + + queries.append(SQL( + ''' + SELECT + %(column_group_key)s AS column_group_key, + account_move_line.account_id, + %(account_code)s AS account_code, + %(account_name)s AS account_name, + SUM(%(balance_select)s) AS balance + FROM %(table_references)s + %(currency_table_join)s + WHERE %(search_condition)s + GROUP BY account_move_line.account_id, %(account_code)s, %(account_name)s + ''', + column_group_key=column_group_key, + account_code=account_code, + account_name=account_name, + table_references=query.from_clause, + balance_select=report._currency_table_apply_rate(SQL("account_move_line.balance")), + currency_table_join=report._currency_table_aml_join(column_group_options), + search_condition=query.where_clause, + )) + + self._cr.execute(SQL(' UNION ALL ').join(queries)) + + return self._cr.dictfetchall() + + def _get_liquidity_moves(self, report, options, payment_account_ids, cash_flow_tag_ids): + ''' Fetch all information needed to compute lines from liquidity moves. + The difficulty is to represent only the not-reconciled part of balance. + + :param options: The report options. + :param payment_account_ids: A tuple containing all account.account's ids being used in a liquidity journal. + :return: A list of tuple (account_id, account_code, account_name, account_type, amount). + ''' + + reconciled_aml_groupby_account = {} + + queries = [] + + for column_group_key, column_group_options in report._split_options_per_column_group(options).items(): + move_ids_query = self._get_move_ids_query(report, payment_account_ids, column_group_options) + query = Query(self.env, 'account_move_line') + account_alias = query.join(lhs_alias='account_move_line', lhs_column='account_id', rhs_table='account_account', rhs_column='id', link='account_id') + account_code = self.env['account.account']._field_to_sql(account_alias, 'code', query) + account_name = self.env['account.account']._field_to_sql(account_alias, 'name') + account_type = SQL.identifier(account_alias, 'account_type') + + queries.append(SQL( + ''' + (WITH payment_move_ids AS (%(move_ids_query)s) + -- Credit amount of each account + SELECT + %(column_group_key)s AS column_group_key, + account_move_line.account_id, + %(account_code)s AS account_code, + %(account_name)s AS account_name, + %(account_type)s AS account_account_type, + account_account_account_tag.account_account_tag_id AS account_tag_id, + SUM(%(partial_amount_select)s) AS balance + FROM %(from_clause)s + %(currency_table_join)s + LEFT JOIN account_partial_reconcile + ON account_partial_reconcile.credit_move_id = account_move_line.id + LEFT JOIN account_account_account_tag + ON account_account_account_tag.account_account_id = account_move_line.account_id + AND account_account_account_tag.account_account_tag_id IN %(cash_flow_tag_ids)s + WHERE account_move_line.move_id IN (SELECT unnest(payment_move_ids.move_id) FROM payment_move_ids) + AND account_move_line.account_id NOT IN %(payment_account_ids)s + AND account_partial_reconcile.max_date BETWEEN %(date_from)s AND %(date_to)s + GROUP BY account_move_line.company_id, account_move_line.account_id, %(account_code)s, %(account_name)s, account_account_type, account_account_account_tag.account_account_tag_id + + UNION ALL + + -- Debit amount of each account + SELECT + %(column_group_key)s AS column_group_key, + account_move_line.account_id, + %(account_code)s AS account_code, + %(account_name)s AS account_name, + %(account_type)s AS account_account_type, + account_account_account_tag.account_account_tag_id AS account_tag_id, + -SUM(%(partial_amount_select)s) AS balance + FROM %(from_clause)s + %(currency_table_join)s + LEFT JOIN account_partial_reconcile + ON account_partial_reconcile.debit_move_id = account_move_line.id + LEFT JOIN account_account_account_tag + ON account_account_account_tag.account_account_id = account_move_line.account_id + AND account_account_account_tag.account_account_tag_id IN %(cash_flow_tag_ids)s + WHERE account_move_line.move_id IN (SELECT unnest(payment_move_ids.move_id) FROM payment_move_ids) + AND account_move_line.account_id NOT IN %(payment_account_ids)s + AND account_partial_reconcile.max_date BETWEEN %(date_from)s AND %(date_to)s + GROUP BY account_move_line.company_id, account_move_line.account_id, %(account_code)s, %(account_name)s, account_account_type, account_account_account_tag.account_account_tag_id + + UNION ALL + + -- Total amount of each account + SELECT + %(column_group_key)s AS column_group_key, + account_move_line.account_id AS account_id, + %(account_code)s AS account_code, + %(account_name)s AS account_name, + %(account_type)s AS account_account_type, + account_account_account_tag.account_account_tag_id AS account_tag_id, + SUM(%(aml_balance_select)s) AS balance + FROM %(from_clause)s + %(currency_table_join)s + LEFT JOIN account_account_account_tag + ON account_account_account_tag.account_account_id = account_move_line.account_id + AND account_account_account_tag.account_account_tag_id IN %(cash_flow_tag_ids)s + WHERE account_move_line.move_id IN (SELECT unnest(payment_move_ids.move_id) FROM payment_move_ids) + AND account_move_line.account_id NOT IN %(payment_account_ids)s + GROUP BY account_move_line.account_id, %(account_code)s, %(account_name)s, account_account_type, account_account_account_tag.account_account_tag_id) + ''', + column_group_key=column_group_key, + move_ids_query=move_ids_query, + account_code=account_code, + account_name=account_name, + account_type=account_type, + from_clause=query.from_clause, + currency_table_join=report._currency_table_aml_join(column_group_options), + partial_amount_select=report._currency_table_apply_rate(SQL("account_partial_reconcile.amount")), + aml_balance_select=report._currency_table_apply_rate(SQL("account_move_line.balance")), + cash_flow_tag_ids=tuple(cash_flow_tag_ids), + payment_account_ids=payment_account_ids, + date_from=column_group_options['date']['date_from'], + date_to=column_group_options['date']['date_to'], + )) + + self._cr.execute(SQL(' UNION ALL ').join(queries)) + + for aml_data in self._cr.dictfetchall(): + reconciled_aml_groupby_account.setdefault(aml_data['account_id'], {}) + reconciled_aml_groupby_account[aml_data['account_id']].setdefault(aml_data['column_group_key'], { + 'column_group_key': aml_data['column_group_key'], + 'account_id': aml_data['account_id'], + 'account_code': aml_data['account_code'], + 'account_name': aml_data['account_name'], + 'account_account_type': aml_data['account_account_type'], + 'account_tag_id': aml_data['account_tag_id'], + 'balance': 0.0, + }) + + reconciled_aml_groupby_account[aml_data['account_id']][aml_data['column_group_key']]['balance'] -= aml_data['balance'] + + return list(reconciled_aml_groupby_account.values()) + + def _get_reconciled_moves(self, report, options, payment_account_ids, cash_flow_tag_ids): + ''' Retrieve all moves being not a liquidity move to be shown in the cash flow statement. + Each amount must be valued at the percentage of what is actually paid. + E.g. An invoice of 1000 being paid at 50% must be valued at 500. + + :param options: The report options. + :param payment_account_ids: A tuple containing all account.account's ids being used in a liquidity journal. + :return: A list of tuple (account_id, account_code, account_name, account_type, amount). + ''' + + reconciled_account_ids = {column_group_key: set() for column_group_key in options['column_groups']} + reconciled_percentage_per_move = {column_group_key: {} for column_group_key in options['column_groups']} + currency_table = report._get_currency_table(options) + + queries = [] + + for column_group_key, column_group_options in report._split_options_per_column_group(options).items(): + move_ids_query = self._get_move_ids_query(report, payment_account_ids, column_group_options) + + queries.append(SQL( + ''' + (WITH payment_move_ids AS (%(move_ids_query)s) + SELECT + %(column_group_key)s AS column_group_key, + debit_line.move_id, + debit_line.account_id, + SUM(%(partial_amount)s) AS balance + FROM account_move_line AS credit_line + LEFT JOIN account_partial_reconcile + ON account_partial_reconcile.credit_move_id = credit_line.id + JOIN %(currency_table)s + ON account_currency_table.company_id = account_partial_reconcile.company_id + AND account_currency_table.rate_type = 'current' -- For payable/receivable accounts it'll always be 'current' anyway + INNER JOIN account_move_line AS debit_line + ON debit_line.id = account_partial_reconcile.debit_move_id + WHERE credit_line.move_id IN (SELECT unnest(payment_move_ids.move_id) FROM payment_move_ids) + AND credit_line.account_id NOT IN %(payment_account_ids)s + AND credit_line.credit > 0.0 + AND debit_line.move_id NOT IN (SELECT unnest(payment_move_ids.move_id) FROM payment_move_ids) + AND account_partial_reconcile.max_date BETWEEN %(date_from)s AND %(date_to)s + GROUP BY debit_line.move_id, debit_line.account_id + + UNION ALL + + SELECT + %(column_group_key)s AS column_group_key, + credit_line.move_id, + credit_line.account_id, + -SUM(%(partial_amount)s) AS balance + FROM account_move_line AS debit_line + LEFT JOIN account_partial_reconcile + ON account_partial_reconcile.debit_move_id = debit_line.id + JOIN %(currency_table)s + ON account_currency_table.company_id = account_partial_reconcile.company_id + AND account_currency_table.rate_type = 'current' -- For payable/receivable accounts it'll always be 'current' anyway + INNER JOIN account_move_line AS credit_line + ON credit_line.id = account_partial_reconcile.credit_move_id + WHERE debit_line.move_id IN (SELECT unnest(payment_move_ids.move_id) FROM payment_move_ids) + AND debit_line.account_id NOT IN %(payment_account_ids)s + AND debit_line.debit > 0.0 + AND credit_line.move_id NOT IN (SELECT unnest(payment_move_ids.move_id) FROM payment_move_ids) + AND account_partial_reconcile.max_date BETWEEN %(date_from)s AND %(date_to)s + GROUP BY credit_line.move_id, credit_line.account_id) + ''', + move_ids_query=move_ids_query, + column_group_key=column_group_key, + payment_account_ids=payment_account_ids, + date_from=column_group_options['date']['date_from'], + date_to=column_group_options['date']['date_to'], + currency_table=currency_table, + partial_amount=report._currency_table_apply_rate(SQL("account_partial_reconcile.amount")), + )) + + self._cr.execute(SQL(' UNION ALL ').join(queries)) + + for aml_data in self._cr.dictfetchall(): + reconciled_percentage_per_move[aml_data['column_group_key']].setdefault(aml_data['move_id'], {}) + reconciled_percentage_per_move[aml_data['column_group_key']][aml_data['move_id']].setdefault(aml_data['account_id'], [0.0, 0.0]) + reconciled_percentage_per_move[aml_data['column_group_key']][aml_data['move_id']][aml_data['account_id']][0] += aml_data['balance'] + + reconciled_account_ids[aml_data['column_group_key']].add(aml_data['account_id']) + + if not reconciled_percentage_per_move: + return [] + + queries = [] + + for column in options['columns']: + queries.append(SQL( + ''' + SELECT + %(column_group_key)s AS column_group_key, + account_move_line.move_id, + account_move_line.account_id, + SUM(%(balance_select)s) AS balance + FROM account_move_line + JOIN %(currency_table)s + ON account_currency_table.company_id = account_move_line.company_id + AND account_currency_table.rate_type = 'current' -- For payable/receivable accounts it'll always be 'current' anyway + WHERE account_move_line.move_id IN %(move_ids)s + AND account_move_line.account_id IN %(account_ids)s + GROUP BY account_move_line.move_id, account_move_line.account_id + ''', + column_group_key=column['column_group_key'], + currency_table=currency_table, + balance_select=report._currency_table_apply_rate(SQL("account_move_line.balance")), + move_ids=tuple(reconciled_percentage_per_move[column['column_group_key']].keys()) or (None,), + account_ids=tuple(reconciled_account_ids[column['column_group_key']]) or (None,) + )) + + self._cr.execute(SQL(' UNION ALL ').join(queries)) + + for aml_data in self._cr.dictfetchall(): + if aml_data['account_id'] in reconciled_percentage_per_move[aml_data['column_group_key']][aml_data['move_id']]: + reconciled_percentage_per_move[aml_data['column_group_key']][aml_data['move_id']][aml_data['account_id']][1] += aml_data['balance'] + + reconciled_aml_per_account = {} + + queries = [] + + query = Query(self.env, 'account_move_line') + account_alias = query.join(lhs_alias='account_move_line', lhs_column='account_id', rhs_table='account_account', rhs_column='id', link='account_id') + account_code = self.env['account.account']._field_to_sql(account_alias, 'code', query) + account_name = self.env['account.account']._field_to_sql(account_alias, 'name') + account_type = SQL.identifier(account_alias, 'account_type') + + for column in options['columns']: + queries.append(SQL( + ''' + SELECT + %(column_group_key)s AS column_group_key, + account_move_line.move_id, + account_move_line.account_id, + %(account_code)s AS account_code, + %(account_name)s AS account_name, + %(account_type)s AS account_account_type, + account_account_account_tag.account_account_tag_id AS account_tag_id, + SUM(%(balance_select)s) AS balance + FROM %(from_clause)s + %(currency_table_join)s + LEFT JOIN account_account_account_tag + ON account_account_account_tag.account_account_id = account_move_line.account_id + AND account_account_account_tag.account_account_tag_id IN %(cash_flow_tag_ids)s + WHERE account_move_line.move_id IN %(move_ids)s + GROUP BY account_move_line.move_id, account_move_line.account_id, %(account_code)s, %(account_name)s, account_account_type, account_account_account_tag.account_account_tag_id + ''', + column_group_key=column['column_group_key'], + account_code=account_code, + account_name=account_name, + account_type=account_type, + from_clause=query.from_clause, + currency_table_join=report._currency_table_aml_join(options), + balance_select=report._currency_table_apply_rate(SQL("account_move_line.balance")), + cash_flow_tag_ids=tuple(cash_flow_tag_ids), + move_ids=tuple(reconciled_percentage_per_move[column['column_group_key']].keys()) or (None,) + )) + + self._cr.execute(SQL(' UNION ALL ').join(queries)) + + for aml_data in self._cr.dictfetchall(): + aml_column_group_key = aml_data['column_group_key'] + aml_move_id = aml_data['move_id'] + aml_account_id = aml_data['account_id'] + aml_account_code = aml_data['account_code'] + aml_account_name = aml_data['account_name'] + aml_account_account_type = aml_data['account_account_type'] + aml_account_tag_id = aml_data['account_tag_id'] + aml_balance = aml_data['balance'] + + # Compute the total reconciled for the whole move. + total_reconciled_amount = 0.0 + total_amount = 0.0 + + for reconciled_amount, amount in reconciled_percentage_per_move[aml_column_group_key][aml_move_id].values(): + total_reconciled_amount += reconciled_amount + total_amount += amount + + # Compute matched percentage for each account. + if total_amount and aml_account_id not in reconciled_percentage_per_move[aml_column_group_key][aml_move_id]: + # Lines being on reconciled moves but not reconciled with any liquidity move must be valued at the + # percentage of what is actually paid. + reconciled_percentage = total_reconciled_amount / total_amount + aml_balance *= reconciled_percentage + elif not total_amount and aml_account_id in reconciled_percentage_per_move[aml_column_group_key][aml_move_id]: + # The total amount to reconcile is 0. In that case, only add entries being on these accounts. Otherwise, + # this special case will lead to an unexplained difference equivalent to the reconciled amount on this + # account. + # E.g: + # + # Liquidity move: + # Account | Debit | Credit + # -------------------------------------- + # Bank | | 100 + # Receivable | 100 | + # + # Reconciled move: <- reconciled_amount=100, total_amount=0.0 + # Account | Debit | Credit + # -------------------------------------- + # Receivable | | 200 + # Receivable | 200 | <- Only the reconciled part of this entry must be added. + aml_balance = -reconciled_percentage_per_move[aml_column_group_key][aml_move_id][aml_account_id][0] + else: + # Others lines are not considered. + continue + + reconciled_aml_per_account.setdefault(aml_account_id, {}) + reconciled_aml_per_account[aml_account_id].setdefault(aml_column_group_key, { + 'column_group_key': aml_column_group_key, + 'account_id': aml_account_id, + 'account_code': aml_account_code, + 'account_name': aml_account_name, + 'account_account_type': aml_account_account_type, + 'account_tag_id': aml_account_tag_id, + 'balance': 0.0, + }) + + reconciled_aml_per_account[aml_account_id][aml_column_group_key]['balance'] -= aml_balance + + return list(reconciled_aml_per_account.values()) + + # ------------------------------------------------------------------------- + # COLUMNS / LINES + # ------------------------------------------------------------------------- + def _get_layout_data(self): + # Indentation of the following dict reflects the structure of the report. + return { + 'opening_balance': {'name': _('Cash and cash equivalents, beginning of period'), 'level': 0}, + 'net_increase': {'name': _('Net increase in cash and cash equivalents'), 'level': 0, 'unfolded': True}, + 'operating_activities': {'name': _('Cash flows from operating activities'), 'level': 2, 'parent_line_id': 'net_increase', 'class': 'fw-bold', 'unfolded': True}, + 'advance_payments_customer': {'name': _('Advance Payments received from customers'), 'level': 4, 'parent_line_id': 'operating_activities'}, + 'received_operating_activities': {'name': _('Cash received from operating activities'), 'level': 4, 'parent_line_id': 'operating_activities'}, + 'advance_payments_suppliers': {'name': _('Advance payments made to suppliers'), 'level': 4, 'parent_line_id': 'operating_activities'}, + 'paid_operating_activities': {'name': _('Cash paid for operating activities'), 'level': 4, 'parent_line_id': 'operating_activities'}, + 'investing_activities': {'name': _('Cash flows from investing & extraordinary activities'), 'level': 2, 'parent_line_id': 'net_increase', 'class': 'fw-bold', 'unfolded': True}, + 'investing_activities_cash_in': {'name': _('Cash in'), 'level': 4, 'parent_line_id': 'investing_activities'}, + 'investing_activities_cash_out': {'name': _('Cash out'), 'level': 4, 'parent_line_id': 'investing_activities'}, + 'financing_activities': {'name': _('Cash flows from financing activities'), 'level': 2, 'parent_line_id': 'net_increase', 'class': 'fw-bold', 'unfolded': True}, + 'financing_activities_cash_in': {'name': _('Cash in'), 'level': 4, 'parent_line_id': 'financing_activities'}, + 'financing_activities_cash_out': {'name': _('Cash out'), 'level': 4, 'parent_line_id': 'financing_activities'}, + 'unclassified_activities': {'name': _('Cash flows from unclassified activities'), 'level': 2, 'parent_line_id': 'net_increase', 'class': 'fw-bold', 'unfolded': True}, + 'unclassified_activities_cash_in': {'name': _('Cash in'), 'level': 4, 'parent_line_id': 'unclassified_activities'}, + 'unclassified_activities_cash_out': {'name': _('Cash out'), 'level': 4, 'parent_line_id': 'unclassified_activities'}, + 'closing_balance': {'name': _('Cash and cash equivalents, closing balance'), 'level': 0}, + } + + def _get_layout_line(self, report, options, layout_line_id, layout_line_data, report_data): + line_id = report._get_generic_line_id(None, None, markup=layout_line_id) + unfoldable = 'aml_groupby_account' in report_data[layout_line_id] if layout_line_id in report_data else False + + column_values = [] + + for column in options['columns']: + expression_label = column['expression_label'] + column_group_key = column['column_group_key'] + + value = report_data[layout_line_id][expression_label].get(column_group_key, 0.0) if layout_line_id in report_data else 0.0 + + column_values.append(report._build_column_dict(value, column, options=options)) + + return { + 'id': line_id, + 'name': layout_line_data['name'], + 'level': layout_line_data['level'], + 'class': layout_line_data.get('class', ''), + 'columns': column_values, + 'unfoldable': unfoldable, + 'unfolded': line_id in options['unfolded_lines'] or layout_line_data.get('unfolded') or (options.get('unfold_all') and unfoldable), + } + + def _get_aml_line(self, report, options, aml_data): + parent_line_id = report._get_generic_line_id(None, None, aml_data['parent_line_id']) + line_id = report._get_generic_line_id('account.account', aml_data['account_id'], parent_line_id=parent_line_id) + + column_values = [] + + for column in options['columns']: + expression_label = column['expression_label'] + column_group_key = column['column_group_key'] + + value = aml_data[expression_label].get(column_group_key, 0.0) + + column_values.append(report._build_column_dict(value, column, options=options)) + + return { + 'id': line_id, + 'name': f"{aml_data['account_code']} {aml_data['account_name']}" if aml_data['account_code'] else aml_data['account_name'], + 'caret_options': 'account.account', + 'level': aml_data['level'], + 'parent_id': parent_line_id, + 'columns': column_values, + } + + def _get_unexplained_difference_line(self, report, options, report_data): + unexplained_difference = False + column_values = [] + + for column in options['columns']: + expression_label = column['expression_label'] + column_group_key = column['column_group_key'] + + opening_balance = report_data['opening_balance'][expression_label].get(column_group_key, 0.0) if 'opening_balance' in report_data else 0.0 + closing_balance = report_data['closing_balance'][expression_label].get(column_group_key, 0.0) if 'closing_balance' in report_data else 0.0 + net_increase = report_data['net_increase'][expression_label].get(column_group_key, 0.0) if 'net_increase' in report_data else 0.0 + + balance = closing_balance - opening_balance - net_increase + + if not self.env.company.currency_id.is_zero(balance): + unexplained_difference = True + + column_values.append(report._build_column_dict( + balance, + { + 'figure_type': 'monetary', + 'expression_label': 'balance', + }, + options=options, + )) + + if unexplained_difference: + return { + 'id': report._get_generic_line_id(None, None, markup='unexplained_difference'), + 'name': 'Unexplained Difference', + 'level': 1, + 'columns': column_values, + } diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_customer_statement.py b/dev_odex30_accounting/odex30_account_reports/models/account_customer_statement.py new file mode 100644 index 0000000..c53756b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_customer_statement.py @@ -0,0 +1,24 @@ +from odoo import models, _ + + +class CustomerStatementCustomHandler(models.AbstractModel): + _name = 'account.customer.statement.report.handler' + _inherit = 'account.partner.ledger.report.handler' + _description = 'Customer Statement Custom Handler' + + def _get_custom_display_config(self): + display_config = super()._get_custom_display_config() + display_config['css_custom_class'] += ' customer_statement' + if self.env.ref('odex30_account_reports.pdf_export_main_customer_report', raise_if_not_found=False): + display_config.setdefault('pdf_export', {})['pdf_export_main'] = 'odex30_account_reports.pdf_export_main_customer_report' + return display_config + + def _custom_options_initializer(self, report, options, previous_options): + super()._custom_options_initializer(report, options, previous_options) + + options['buttons'].append({ + 'name': _('Send'), + 'action': 'action_send_statements', + 'sequence': 90, + 'always_show': True, + }) diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_deferred_reports.py b/dev_odex30_accounting/odex30_account_reports/models/account_deferred_reports.py new file mode 100644 index 0000000..9732ba6 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_deferred_reports.py @@ -0,0 +1,659 @@ +import calendar +from collections import defaultdict +from dateutil.relativedelta import relativedelta + +from odoo import models, fields, _, api, Command +from odoo.exceptions import UserError +from odoo.tools import groupby, SQL +from odoo.addons.odex30_account_accountant.models.account_move import DEFERRED_DATE_MIN, DEFERRED_DATE_MAX + + +class DeferredReportCustomHandler(models.AbstractModel): + _name = 'account.deferred.report.handler' + _inherit = 'account.report.custom.handler' + _description = 'Deferred Expense Report Custom Handler' + + def _get_deferred_report_type(self): + raise NotImplementedError("This method is not implemented in the deferred report handler.") + + + def _get_domain_fully_inside_period(self, options): + return [ # Exclude if entirely inside the period + '!', '&', '&', '&', '&', '&', '&', '&', + ('deferred_start_date', '!=', False), + ('deferred_end_date', '!=', False), + ('deferred_start_date', '>=', options['date']['date_from']), + ('deferred_start_date', '<=', options['date']['date_to']), + ('deferred_end_date', '>=', options['date']['date_from']), + ('deferred_end_date', '<=', options['date']['date_to']), + ('move_id.date', '>=', options['date']['date_from']), + ('move_id.date', '<=', options['date']['date_to']), + ] + + def _get_domain(self, report, options, filter_already_generated=False, filter_not_started=False): + domain = report._get_options_domain(options, "from_beginning") + account_types = ('expense', 'expense_depreciation', 'expense_direct_cost') if self._get_deferred_report_type() == 'expense' else ('income', 'income_other') + domain += [ + ('account_id.account_type', 'in', account_types), + ('deferred_start_date', '!=', False), + ('deferred_end_date', '!=', False), + ('deferred_end_date', '>=', options['date']['date_from']), + ('move_id.date', '<=', options['date']['date_to']), + ] + domain += self._get_domain_fully_inside_period(options) + if filter_already_generated: + # Avoid regenerating already generated deferrals + domain += [ + ('deferred_end_date', '>=', options['date']['date_from']), + '!', + ('move_id.deferred_move_ids', 'any', [ + ('date', '=', options['date']['date_to']), + '|', + ('state', '=', 'posted'), # Either posted + '&', # Or autoposted in the future + ('auto_post', '=', 'at_date'), + ('date', '>=', fields.Date.context_today(self)), + ]) + ] + if filter_not_started: + domain += [('deferred_start_date', '>', options['date']['date_to'])] + return domain + + @api.model + def _get_select(self, options): + account_name = self.env['account.account']._field_to_sql('account_move_line__account_id', 'name') + return [ + SQL("account_move_line.id AS line_id"), + SQL("account_move_line.account_id AS account_id"), + SQL("account_move_line.partner_id AS partner_id"), + SQL("account_move_line.product_id AS product_id"), + SQL("account_move_line__product_template_id.categ_id AS product_category_id"), + SQL("account_move_line.name AS line_name"), + SQL("account_move_line.deferred_start_date AS deferred_start_date"), + SQL("account_move_line.deferred_end_date AS deferred_end_date"), + SQL("account_move_line.deferred_end_date - account_move_line.deferred_start_date AS diff_days"), + SQL("account_move_line.balance AS balance"), + SQL("account_move_line.analytic_distribution AS analytic_distribution"), + SQL("account_move_line__move_id.id as move_id"), + SQL("account_move_line__move_id.name AS move_name"), + SQL(""" + NOT ( + account_move_line.deferred_end_date >= %(report_date_from)s + AND + NOT EXISTS ( + SELECT 1 + FROM account_move_deferred_rel AS amdr + LEFT JOIN account_move AS am ON amdr.deferred_move_id = am.id + WHERE amdr.original_move_id = account_move_line.move_id + AND am.date = %(report_date_to)s + AND ( + am.state = 'posted' + OR (am.auto_post = 'at_date' AND am.date >= %(today)s) + ) + ) + ) AS is_already_generated + """, + report_date_from=options['date']['date_from'], + report_date_to=options['date']['date_to'], + today=fields.Date.context_today(self), + ), + SQL("%s AS account_name", account_name), + ] + + def _get_lines(self, report, options, filter_already_generated=False): + if 'report_deferred_lines' not in self.env.cr.cache: + self._fetch_lines(report, options, filter_already_generated) + + if not filter_already_generated: + # No more filtering needed, we can reuse the cached result + return self.env.cr.cache['report_deferred_lines'].values() + else: + # Filter the cached result to only keep the lines that are not already generated + cached_lines = self.env.cr.cache['report_deferred_lines'].values() + return [cached_line for cached_line in cached_lines if not cached_line['is_already_generated']] + + def _fetch_lines(self, report, options, filter_already_generated): + """Fetch the lines that need to be deferred from the DB and store them in the cache for later reuse""" + domain = self._get_domain(report, options, filter_already_generated) + query = report._get_report_query(options, domain=domain, date_scope='from_beginning') + select_clause = SQL(', ').join(self._get_select(options)) + + query = SQL( + """ + SELECT %(select_clause)s + FROM %(table_references)s + LEFT JOIN product_product AS account_move_line__product_id ON account_move_line.product_id = account_move_line__product_id.id + LEFT JOIN product_template AS account_move_line__product_template_id ON account_move_line__product_id.product_tmpl_id = account_move_line__product_template_id.id + WHERE %(search_condition)s + ORDER BY account_move_line.deferred_start_date, account_move_line.id + """, + select_clause=select_clause, + table_references=query.from_clause, + search_condition=query.where_clause, + ) + + self.env.cr.execute(query) + # Cache the result so that it can be reused to check whether a warning banner should be shown + # only if it's the generic query (so without filtering already generated deferrals) + self.env.cr.cache['report_deferred_lines'] = { + r['line_id']: r for r in self.env.cr.dictfetchall() + } + + @api.model + def _get_grouping_fields_deferred_lines(self, filter_already_generated=False, grouping_field='account_id'): + return (grouping_field,) + + @api.model + def _group_by_deferred_fields(self, line, filter_already_generated=False, grouping_field='account_id'): + return tuple(line[k] for k in self._get_grouping_fields_deferred_lines(filter_already_generated, grouping_field)) + + @api.model + def _get_grouping_fields_deferral_lines(self): + return () + + @api.model + def _group_by_deferral_fields(self, line): + return tuple(line[k] for k in self._get_grouping_fields_deferral_lines()) + + @api.model + def _group_deferred_amounts_by_grouping_field(self, deferred_amounts_by_line, periods, is_reverse, filter_already_generated=False, grouping_field='account_id'): + """ + Groups the deferred amounts by account and computes the totals for each account for each period. + And the total for all accounts for each period. + E.g. (where period1 = (date1, date2, label1), period2 = (date2, date3, label2), ...) + { + self._get_grouping_keys_deferred_lines(): { + 'account_id': account1, 'amount_total': 600, period_1: 200, period_2: 400 + }, + self._get_grouping_keys_deferred_lines(): { + 'account_id': account2, 'amount_total': 700, period_1: 300, period_2: 400 + }, + }, {'totals_aggregated': 1300, period_1: 500, period_2: 800} + """ + deferred_amounts_by_line = groupby(deferred_amounts_by_line, key=lambda x: self._group_by_deferred_fields(x, filter_already_generated, grouping_field)) + totals_per_key = {} # {key: {**self._get_grouping_fields_deferral_lines(), total, before, current, later}} + totals_aggregated_by_period = {period: 0 for period in periods + ['totals_aggregated']} + sign = 1 if is_reverse else -1 + for key, lines_per_key in deferred_amounts_by_line: + lines_per_key = list(lines_per_key) + current_key_totals = self._get_current_key_totals_dict(lines_per_key, sign) + totals_aggregated_by_period['totals_aggregated'] += current_key_totals['amount_total'] + for period in periods: + current_key_totals[period] = sign * sum(line[period] for line in lines_per_key) + totals_aggregated_by_period[period] += self.env.company.currency_id.round(current_key_totals[period]) + totals_per_key[key] = current_key_totals + return totals_per_key, totals_aggregated_by_period + + ########################### + # DEFERRED REPORT DISPLAY # + ########################### + + def _get_custom_display_config(self): + return { + 'templates': { + 'AccountReportFilters': 'odex30_account_reports.DeferredFilters', + }, + } + + def _custom_options_initializer(self, report, options, previous_options): + super()._custom_options_initializer(report, options, previous_options=previous_options) + + options_per_col_group = report._split_options_per_column_group(options) + for column_dict in options['columns']: + column_options = options_per_col_group[column_dict['column_group_key']] + column_dict['name'] = column_options['date']['string'] + column_dict['date_from'] = column_options['date']['date_from'] + column_dict['date_to'] = column_options['date']['date_to'] + + options['columns'] = list(reversed(options['columns'])) + total_column = [{ + **options['columns'][0], + 'name': _('Total'), + 'expression_label': 'total', + 'date_from': DEFERRED_DATE_MIN, + 'date_to': DEFERRED_DATE_MAX, + }] + not_started_column = [{ + **options['columns'][0], + 'name': _('Not Started'), + 'expression_label': 'not_started', + 'date_from': options['columns'][-1]['date_to'], + 'date_to': DEFERRED_DATE_MAX, + }] + before_column = [{ + **options['columns'][0], + 'name': _('Before'), + 'expression_label': 'before', + 'date_from': DEFERRED_DATE_MIN, + 'date_to': fields.Date.to_string(fields.Date.to_date(options['columns'][0]['date_from']) - relativedelta(days=1)), + }] + later_column = [{ + **options['columns'][0], + 'name': _('Later'), + 'expression_label': 'later', + 'date_from': fields.Date.to_string(fields.Date.to_date(options['columns'][-1]['date_to']) + relativedelta(days=1)), + 'date_to': DEFERRED_DATE_MAX, + }] + options['columns'] = total_column + not_started_column + before_column + options['columns'] + later_column + options['column_headers'] = [] + options['deferred_report_type'] = self._get_deferred_report_type() + options['deferred_grouping_field'] = previous_options.get('deferred_grouping_field') or 'account_id' + if ( + self._get_deferred_report_type() == 'expense' and self.env.company.generate_deferred_expense_entries_method == 'manual' + or self._get_deferred_report_type() == 'revenue' and self.env.company.generate_deferred_revenue_entries_method == 'manual' + ): + options['buttons'].append({'name': _('Generate entry'), 'action': 'action_generate_entry', 'sequence': 80, 'always_show': True}) + + def action_audit_cell(self, options, params): + """ Open a list of invoices/bills and/or deferral entries for the clicked cell in a deferred report. + + Specifically, we show the following lines, grouped by their journal entry, filtered by the column date bounds: + - Total: Lines of all invoices/bills being deferred in the current period + - Not Started: Lines of all deferral entries for which the original invoice/bill date is before or in the + current period, but the deferral only starts after the current period, as well as the lines of + their original invoices/bills + - Before: Lines of all deferral entries with a date before the current period, created by invoices/bills also + being deferred in the current period, as well as the lines of their original invoices/bills + - Current: Lines of all deferral entries in the current period, as well as these of their original + invoices/bills + - Later: Lines of all deferral entries with a date after the current period, created by invoices/bills also + being deferred in the current period, as well as the lines of their original invoices/bills + + :param dict options: the report's `options` + :param dict params: a dict containing: + `calling_line_dict_id`: line id containing the optional account of the cell + `column_group_id`: the column group id of the cell + `expression_label`: the expression label of the cell + """ + report = self.env['account.report'].browse(options['report_id']) + column_values = next( + (column for column in options['columns'] if ( + column['column_group_key'] == params.get('column_group_key') + and column['expression_label'] == params.get('expression_label') + )), + None + ) + if not column_values: + return + + column_date_from = fields.Date.to_date(column_values['date_from']) + column_date_to = fields.Date.to_date(column_values['date_to']) + report_date_from = fields.Date.to_date(options['date']['date_from']) + report_date_to = fields.Date.to_date(options['date']['date_to']) + + # Corrections for comparisons + if column_values['expression_label'] in ('not_started', 'later'): + # Not Started and Later period start one day after `report_date_to` + column_date_from = report_date_to + relativedelta(days=1) + if column_values['expression_label'] == 'before': + # Before period ends one day before `report_date_from` + column_date_to = report_date_from - relativedelta(days=1) + + # calling_line_dict_id is of the format `~account.report~15|~account.account~25` + _grouping_model, grouping_record_id = report._get_model_info_from_id(params.get('calling_line_dict_id')) + + # Find the original lines to be deferred in the report period + original_move_lines_domain = self._get_domain( + report, options, filter_not_started=column_values['expression_label'] == 'not_started' + ) + if grouping_record_id: + # We're auditing a specific account, so we only want moves containing this account + original_move_lines_domain.append((options['deferred_grouping_field'], '=', grouping_record_id)) + # We're getting all lines from the concerned moves. They are filtered later for flexibility. + original_moves = self.env['account.move.line'].search(original_move_lines_domain).move_id + + domain = [ + # For the Total period only show the original move lines + '&', + ('move_id', 'in', original_moves.ids), + ('deferred_end_date', '>=', report_date_from), + ] + + # Show both the original move lines and deferral move lines for all other periods + if column_values['expression_label'] != 'total' and original_moves.deferred_move_ids: + domain = ['|'] + [('move_id', 'in', original_moves.deferred_move_ids.ids)] + domain + + if column_values['expression_label'] == 'not_started': + domain += [('deferred_start_date', '>=', column_date_from)] + else: + # If in manually & grouped mode, and deferrals have not yet been generated + # so no move with `date` set => instead show the candidates original deferred moves that + # will be deferred upon clicking the button. If totally/partially generated, we'll just + # use the `date` filter which will include both the originals and deferrals. + if not original_moves.deferred_move_ids: + domain += [ + ('deferred_start_date', '<=', column_date_to), + ('deferred_end_date', '>=', column_date_from), + ] + else: + domain += [ + ('date', '>=', column_date_from), + ('date', '<=', column_date_to), + ] + domain += self._get_domain_fully_inside_period(options) + + return { + 'type': 'ir.actions.act_window', + 'name': _('Deferred Entries'), + 'res_model': 'account.move.line', + 'domain': domain, + 'views': [(self.env.ref('odex30_account_accountant.view_deferred_entries_tree').id, 'list'), (False, 'pivot'), (False, 'graph'), (False, 'kanban')], + # Most filters are set here to allow auditing flexibility to the user + 'context': { + 'search_default_pl_accounts': True, + f'search_default_{options["deferred_grouping_field"]}': grouping_record_id, + 'expand': True, + }, + } + + def _caret_options_initializer(self): + return { + 'deferred_caret': [ + {'name': _("Journal Items"), 'action': 'open_journal_items'}, + ], + } + + def _customize_warnings(self, report, options, all_column_groups_expression_totals, warnings): + if ( + self._get_deferred_report_type() == 'expense' and self.env.company.generate_deferred_expense_entries_method == 'manual' + or self._get_deferred_report_type() == 'revenue' and self.env.company.generate_deferred_revenue_entries_method == 'manual' + ): + already_generated = self.env['account.move'].search_count( + report._get_generated_deferral_entries_domain(options) + ) + # This will trigger a second _get_lines call, however the first one was cached, so we just need to filter again on the cache (see _get_lines) + moves_lines_to_generate, __, __, __, __ = self._get_moves_to_defer(options) + if moves_lines_to_generate and already_generated: + warnings['odex30_account_reports.deferred_report_warning_partially_generated'] = {'alert_type': 'warning'} + elif moves_lines_to_generate: + warnings['odex30_account_reports.deferred_report_warning_never_generated'] = {'alert_type': 'warning'} + elif already_generated: + warnings['odex30_account_reports.deferred_report_info_fully_generated'] = {'alert_type': 'info'} + + + def open_journal_items(self, options, params): + report = self.env['account.report'].browse(options['report_id']) + record_model, record_id = report._get_model_info_from_id(params.get('line_id')) + domain = self._get_domain(report, options) + if record_model == 'account.account' and record_id: + domain += [('account_id', '=', record_id)] + elif record_model == 'product.product' and record_id: + domain += [('product_id', '=', record_id)] + elif record_model == 'product.category' and record_id: + domain += [('product_category_id', '=', record_id)] + return { + 'type': 'ir.actions.act_window', + 'name': _("Deferred Entries"), + 'res_model': 'account.move.line', + 'domain': domain, + 'views': [(self.env.ref('odex30_account_accountant.view_deferred_entries_tree').id, 'list')], + 'context': { + 'search_default_group_by_move': True, + 'expand': True, + } + } + + def _dynamic_lines_generator(self, report, options, all_column_groups_expression_totals, warnings=None): + def get_columns(totals): + return [ + { + **report._build_column_dict( + totals[( + fields.Date.to_date(column['date_from']), + fields.Date.to_date(column['date_to']), + column['expression_label'] + )], + column, + options=options, + currency=self.env.company.currency_id, + ), + 'auditable': True, + } + for column in options['columns'] + ] + + lines = self._get_lines(report, options) + periods = [ + ( + fields.Date.from_string(column['date_from']), + fields.Date.from_string(column['date_to']), + column['expression_label'], + ) + for column in options['columns'] + ] + deferred_amounts_by_line = self.env['account.move']._get_deferred_amounts_by_line(lines, periods, self._get_deferred_report_type()) + totals_per_grouping_field, totals_all_grouping_field = self._group_deferred_amounts_by_grouping_field( + deferred_amounts_by_line=deferred_amounts_by_line, + periods=periods, + is_reverse=self._get_deferred_report_type() == 'expense', + filter_already_generated=False, + grouping_field=options['deferred_grouping_field'], + ) + + report_lines = [] + grouping_model = self.env['account.move.line'][options['deferred_grouping_field']]._name + for totals_grouping_field in totals_per_grouping_field.values(): + grouping_record = self.env[grouping_model].browse(totals_grouping_field[options['deferred_grouping_field']]) + grouping_field_description = self.env['account.move.line'][options['deferred_grouping_field']]._description + if options['deferred_grouping_field'] == 'product_id': + grouping_field_description = _("Product") + grouping_name = grouping_record.display_name or _("(No %s)", grouping_field_description) + report_lines.append((0, { + 'id': report._get_generic_line_id(grouping_model, grouping_record.id), + 'name': grouping_name, + 'caret_options': 'deferred_caret', + 'level': 1, + 'columns': get_columns(totals_grouping_field), + })) + if totals_per_grouping_field: + report_lines.append((0, { + 'id': report._get_generic_line_id(None, None, markup='total'), + 'name': 'Total', + 'level': 1, + 'columns': get_columns(totals_all_grouping_field), + })) + + return report_lines + + ####################### + # DEFERRED GENERATION # + ####################### + + def action_generate_entry(self, options): + new_deferred_moves = self._generate_deferral_entry(options) + return { + 'name': _('Deferred Entries'), + 'type': 'ir.actions.act_window', + 'views': [(False, "list"), (False, "form")], + 'domain': [('id', 'in', new_deferred_moves.ids)], + 'res_model': 'account.move', + 'context': { + 'search_default_group_by_move': True, + 'expand': True, + }, + 'target': 'current', + } + + def _get_moves_to_defer(self, options): + date_from = fields.Date.to_date(DEFERRED_DATE_MIN) + date_to = fields.Date.from_string(options['date']['date_to']) + if date_to.day != calendar.monthrange(date_to.year, date_to.month)[1]: + raise UserError(_("You cannot generate entries for a period that does not end at the end of the month.")) + options['all_entries'] = False # We only want to create deferrals for posted moves + report = self.env["account.report"].browse(options["report_id"]) + self.env['account.move.line'].flush_model() + lines = self._get_lines(report, options, filter_already_generated=True) + deferral_entry_period = self.env['account.report']._get_dates_period(date_from, date_to, 'range', period_type='month') + ref = _("Grouped Deferral Entry of %s", deferral_entry_period['string']) + ref_rev = _("Reversal of Grouped Deferral Entry of %s", deferral_entry_period['string']) + deferred_account = self.env.company.deferred_expense_account_id if self._get_deferred_report_type() == 'expense' else self.env.company.deferred_revenue_account_id + move_lines, original_move_ids = self._get_deferred_lines(lines, deferred_account, (date_from, date_to, 'current'), self._get_deferred_report_type() == 'expense', ref) + return move_lines, original_move_ids, ref, ref_rev, date_to + + def _generate_deferral_entry(self, options): + journal = self.env.company.deferred_expense_journal_id if self._get_deferred_report_type() == "expense" else self.env.company.deferred_revenue_journal_id + if not journal: + raise UserError(_("Please set the deferred journal in the accounting settings.")) + move_lines, original_move_ids, ref, ref_rev, date_to = self._get_moves_to_defer(options) + if self.env.company._get_violated_lock_dates(date_to, False, journal): + raise UserError(_("You cannot generate entries for a period that is locked.")) + if not move_lines: + raise UserError(_("No entry to generate.")) + + deferred_move = self.env['account.move'].with_context(skip_account_deprecation_check=True).create({ + 'move_type': 'entry', + 'deferred_original_move_ids': [Command.set(original_move_ids)], + 'journal_id': journal.id, + 'date': date_to, + 'auto_post': 'at_date', + 'ref': ref, + }) + # We write the lines after creation, to make sure the `deferred_original_move_ids` is set. + # This way we can avoid adding taxes for deferred moves. + deferred_move.write({'line_ids': move_lines}) + reverse_move = deferred_move._reverse_moves() + reverse_move.write({ + 'date': deferred_move.date + relativedelta(days=1), + 'ref': ref_rev, + }) + reverse_move.line_ids.name = ref_rev + new_deferred_moves = deferred_move + reverse_move + # We create the relation (original deferred move, deferral entry) + # using SQL. This avoids a MemoryError using the ORM which will + # load huge amounts of moves in memory for nothing + self.env.cr.execute_values(""" + INSERT INTO account_move_deferred_rel(original_move_id, deferred_move_id) + VALUES %s + ON CONFLICT DO NOTHING + """, [ + (original_move_id, deferral_move.id) + for original_move_id in original_move_ids + for deferral_move in new_deferred_moves + ]) + new_deferred_moves.invalidate_recordset() + new_deferred_moves._post(soft=True) + return new_deferred_moves + + @api.model + def _get_current_key_totals_dict(self, lines_per_key, sign): + return { + 'account_id': lines_per_key[0]['account_id'], + 'product_id': lines_per_key[0]['product_id'], + 'product_category_id': lines_per_key[0]['product_category_id'], + 'amount_total': sign * sum(line['balance'] for line in lines_per_key), + 'move_ids': {line['move_id'] for line in lines_per_key}, + } + + @api.model + def _get_deferred_lines(self, lines, deferred_account, period, is_reverse, ref): + """ + Returns a list of Command objects to create the deferred lines of a single given period. + And the move_ids of the original lines that created these deferred + (to keep track of the original invoice in the deferred entries). + """ + if not deferred_account: + raise UserError(_("Please set the deferred accounts in the accounting settings.")) + + deferred_amounts_by_line = self.env['account.move']._get_deferred_amounts_by_line(lines, [period], is_reverse) + deferred_amounts_by_key, deferred_amounts_totals = self._group_deferred_amounts_by_grouping_field(deferred_amounts_by_line, [period], is_reverse, filter_already_generated=True) + totals_aggregated = deferred_amounts_totals['totals_aggregated'] + if totals_aggregated == deferred_amounts_totals[period]: + return [], set() + + # compute analytic distribution to populate on deferred lines + # structure: {self._get_grouping_keys_deferred_lines(): [analytic distribution]} + # dict of keys: self._get_grouping_keys_deferred_lines() + # values: dict of keys: "account.analytic.account.id" (string) + # values: float + anal_dist_by_key = defaultdict(lambda: defaultdict(float)) + # using another var for the analytic distribution of the deferral account + deferred_anal_dist = defaultdict(lambda: defaultdict(float)) + for line in lines: + if not line['analytic_distribution']: + continue + # Analytic distribution should be computed from the lines with the same _get_grouping_keys_deferred_lines(), except for + # the deferred line with the deferral account which will use _get_grouping_fields_deferral_lines() + sign = 1 if is_reverse else -1 + key_amount = deferred_amounts_by_key.get(self._group_by_deferred_fields(line, True)) + total_amount = key_amount.get('amount_total') + key_ratio = sign * line['balance'] / total_amount if total_amount else 0 + full_ratio = sign * line['balance'] / totals_aggregated if totals_aggregated else 0 + + for account_id, distribution in line['analytic_distribution'].items(): + anal_dist_by_key[self._group_by_deferred_fields(line, True)][account_id] += distribution * key_ratio + deferred_anal_dist[self._group_by_deferral_fields(line)][account_id] += distribution * full_ratio + + remaining_balance = 0 + deferred_lines = [] + original_move_ids = set() + for key, line in deferred_amounts_by_key.items(): + for balance in (-line['amount_total'], line[period]): + if balance != 0 and line[period] != line['amount_total']: + original_move_ids |= line['move_ids'] + deferred_balance = self.env.company.currency_id.round((1 if is_reverse else -1) * balance) + deferred_lines.append( + Command.create( + self.env['account.move.line']._get_deferred_lines_values( + account_id=line['account_id'], + balance=deferred_balance, + ref=ref, + analytic_distribution=anal_dist_by_key[key] or False, + line=line, + ) + ) + ) + remaining_balance += deferred_balance + + grouped_by_key = { + key: list(value) + for key, value in groupby( + deferred_amounts_by_key.values(), + key=self._group_by_deferral_fields, + ) + } + deferral_lines = [] + for key, lines_per_key in grouped_by_key.items(): + balance = 0 + for line in lines_per_key: + if line[period] != line['amount_total']: + balance += self.env.company.currency_id.round((1 if is_reverse else -1) * (line['amount_total'] - line[period])) + deferral_lines.append( + Command.create( + self.env['account.move.line']._get_deferred_lines_values( + account_id=deferred_account.id, + balance=balance, + ref=ref, + analytic_distribution=deferred_anal_dist[key] or False, + line=lines_per_key[0], + ) + ) + ) + remaining_balance += balance + + if not self.env.company.currency_id.is_zero(remaining_balance): + deferral_lines.append( + Command.create({ + 'account_id': deferred_account.id, + 'balance': -remaining_balance, + 'name': ref, + }) + ) + return deferred_lines + deferral_lines, original_move_ids + + +class DeferredExpenseCustomHandler(models.AbstractModel): + _name = 'account.deferred.expense.report.handler' + _inherit = 'account.deferred.report.handler' + _description = 'Deferred Expense Custom Handler' + + def _get_deferred_report_type(self): + return 'expense' + + +class DeferredRevenueCustomHandler(models.AbstractModel): + _name = 'account.deferred.revenue.report.handler' + _inherit = 'account.deferred.report.handler' + _description = 'Deferred Revenue Custom Handler' + + def _get_deferred_report_type(self): + return 'revenue' diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_fiscal_position.py b/dev_odex30_accounting/odex30_account_reports/models/account_fiscal_position.py new file mode 100644 index 0000000..bcba747 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_fiscal_position.py @@ -0,0 +1,19 @@ +from odoo import models + + +class AccountFiscalPosition(models.Model): + _inherit = 'account.fiscal.position' + + def _inverse_foreign_vat(self): + # EXTENDS account + super()._inverse_foreign_vat() + for fpos in self: + if fpos.foreign_vat: + fpos._create_draft_closing_move_for_foreign_vat() + + def _create_draft_closing_move_for_foreign_vat(self): + self.ensure_one() + existing_draft_closings = self.env['account.move'].search([('tax_closing_report_id', '!=', False), ('state', '=', 'draft')]) + for closing_date, entries in existing_draft_closings.grouped('date').items(): + for entry in entries: + self.company_id._get_and_update_tax_closing_moves(closing_date, entry.tax_closing_report_id, fiscal_positions=self) diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_followup_report.py b/dev_odex30_accounting/odex30_account_reports/models/account_followup_report.py new file mode 100644 index 0000000..2b3d59e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_followup_report.py @@ -0,0 +1,109 @@ +from odoo import fields, models, _ +from odoo.tools import SQL + + +class AccountFollowupCustomHandler(models.AbstractModel): + _name = 'account.followup.report.handler' + _inherit = 'account.partner.ledger.report.handler' + _description = 'Follow-Up Report Custom Handler' + + def _custom_options_initializer(self, report, options, previous_options): + super()._custom_options_initializer(report, options, previous_options) + + options['hide_initial_balance'] = True + if len(options['partner_ids']) == 1: + options['ignore_totals_below_sections'] = True + options['hide_partner_totals'] = True + + if options['report_id'] != previous_options.get('report_id'): + options['unreconciled'] = True + # by default, select only the 'sales' journals + for journal in options.get('journals', []): + journal['selected'] = journal.get('type') != 'general' # dividers don't get a type + # Since we forced the selection of some journal, we need to recompute the filter label + report._init_options_journals_names(options, previous_options=previous_options) + + def _get_custom_display_config(self): + display_config = super()._get_custom_display_config() + if self.env.ref('odex30_account_reports.pdf_export_main_customer_report', raise_if_not_found=False): + display_config.setdefault('pdf_export', {})['pdf_export_main'] = 'odex30_account_reports.pdf_export_main_customer_report' + return display_config + + def _filter_overdue_amls_from_results(self, aml_results): + return list(filter(lambda aml: aml['date_maturity'] and aml['date_maturity'] < fields.Date.today(), aml_results)) + + def _filter_due_amls_from_results(self, aml_results): + return list(filter(lambda aml: not aml['date_maturity'] or aml['date_maturity'] >= fields.Date.today(), aml_results)) + + def _get_partner_aml_report_lines(self, report, options, partner_line_id, aml_results, progress, offset=0, level_shift=0): + + def create_status_line(status_name): + return { + 'id': report._get_generic_line_id(None, None, markup=status_name, parent_line_id=partner_line_id), + 'name': status_name, + 'level': 3 + level_shift, + 'parent_id': partner_line_id, + 'columns': [{} for _col in options['columns']], + 'unfolded': True, + } + + def get_aml_lines_with_status_line(status_name, status_line_id, aml_values, treated_results_count, progress): + lines = [] + next_progress = progress + has_more = False + + if not status_line_id or offset == 0: + status_line = create_status_line(status_name) + lines.append(status_line) + status_line_id = status_line['id'] + + for aml_value in aml_values: + if self._is_report_limit_reached(report, options, treated_results_count): + # We loaded one more than the limit on purpose: this way we know we need a "load more" line + has_more = True + break + + aml_report_line = self._get_report_line_move_line(options, aml_value, status_line_id, next_progress, level_shift=level_shift + 1) + lines.append(aml_report_line) + next_progress = self._init_load_more_progress(options, aml_report_line) + treated_results_count += 1 + + return lines, next_progress, treated_results_count, has_more + + lines = [] + next_progress = progress + has_more = False + treated_results_count = 0 + due_line_id, overdue_line_id = self._get_unfolded_partner_status_lines(report, options, partner_line_id) + + overdue_aml_values = self._filter_overdue_amls_from_results(aml_results) + due_aml_values = self._filter_due_amls_from_results(aml_results) + + if overdue_aml_values: + overdue_lines, next_progress, treated_results_count, has_more = get_aml_lines_with_status_line(_('Overdue'), overdue_line_id, overdue_aml_values, treated_results_count, next_progress) + lines.extend(overdue_lines) + # If we reached the limit just before the due line and have already loaded one extra line, we should skip the due line for now and add a "load more" line + if self._is_report_limit_reached(report, options, treated_results_count) and due_aml_values: + has_more = True + + if due_aml_values and not has_more: + due_lines, next_progress, treated_results_count, has_more = get_aml_lines_with_status_line(_('Due'), due_line_id, due_aml_values, treated_results_count, next_progress) + lines.extend(due_lines) + + return lines, next_progress, treated_results_count, has_more + + def _get_unfolded_partner_status_lines(self, report, options, partner_line_id): + _dummy1, _dummy2, partner_id = report._parse_line_id(partner_line_id)[-1] + due_line_id, overdue_line_id = None, None + for line_id in options['unfolded_lines']: + res_ids_map = report._get_res_ids_from_line_id(line_id, ['account.report', 'res.partner']) + if res_ids_map['account.report'] == report.id and res_ids_map['res.partner'] == partner_id: + markup, _dummy1, _dummy2 = report._parse_line_id(line_id)[-1] + if markup == 'Due': + due_line_id = line_id + if markup == 'Overdue': + overdue_line_id = line_id + return due_line_id, overdue_line_id + + def _get_order_by_aml_values(self): + return SQL('account_move_line.date_maturity, %(order_by)s', order_by=super()._get_order_by_aml_values()) diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_general_ledger.py b/dev_odex30_accounting/odex30_account_reports/models/account_general_ledger.py new file mode 100644 index 0000000..6c065f7 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_general_ledger.py @@ -0,0 +1,761 @@ +import json + +from odoo import models, fields, api, _ +from odoo.tools.misc import format_date +from odoo.tools import get_lang, SQL +from odoo.exceptions import UserError + +from datetime import timedelta +from collections import defaultdict + + +class GeneralLedgerCustomHandler(models.AbstractModel): + _name = 'account.general.ledger.report.handler' + _inherit = 'account.report.custom.handler' + _description = 'General Ledger Custom Handler' + + def _get_custom_display_config(self): + return { + 'templates': { + 'AccountReportLineName': 'odex30_account_reports.GeneralLedgerLineName', + }, + } + + def _custom_options_initializer(self, report, options, previous_options): + # Remove multi-currency columns if needed + super()._custom_options_initializer(report, options, previous_options=previous_options) + if self.env.user.has_group('base.group_multi_currency'): + options['multi_currency'] = True + else: + options['columns'] = [ + column for column in options['columns'] + if column['expression_label'] != 'amount_currency' + ] + + # Automatically unfold the report when printing it, unless some specific lines have been unfolded + options['unfold_all'] = (options['export_mode'] == 'print' and not options.get('unfolded_lines')) or options['unfold_all'] + + def _dynamic_lines_generator(self, report, options, all_column_groups_expression_totals, warnings=None): + lines = [] + date_from = fields.Date.from_string(options['date']['date_from']) + company_currency = self.env.company.currency_id + + totals_by_column_group = defaultdict(lambda: {'debit': 0, 'credit': 0, 'balance': 0}) + for account, column_group_results in self._query_values(report, options): + eval_dict = {} + has_lines = False + for column_group_key, results in column_group_results.items(): + account_sum = results.get('sum', {}) + account_un_earn = results.get('unaffected_earnings', {}) + + account_debit = account_sum.get('debit', 0.0) + account_un_earn.get('debit', 0.0) + account_credit = account_sum.get('credit', 0.0) + account_un_earn.get('credit', 0.0) + account_balance = account_sum.get('balance', 0.0) + account_un_earn.get('balance', 0.0) + + eval_dict[column_group_key] = { + 'amount_currency': account_sum.get('amount_currency', 0.0) + account_un_earn.get('amount_currency', 0.0), + 'debit': account_debit, + 'credit': account_credit, + 'balance': account_balance, + } + + max_date = account_sum.get('max_date') + has_lines = has_lines or (max_date and max_date >= date_from) + + totals_by_column_group[column_group_key]['debit'] += account_debit + totals_by_column_group[column_group_key]['credit'] += account_credit + totals_by_column_group[column_group_key]['balance'] += account_balance + + lines.append(self._get_account_title_line(report, options, account, has_lines, eval_dict)) + + # Report total line. + for totals in totals_by_column_group.values(): + totals['balance'] = company_currency.round(totals['balance']) + + # Tax Declaration lines. + journal_options = report._get_options_journals(options) + if len(options['column_groups']) == 1 and len(journal_options) == 1 and journal_options[0]['type'] in ('sale', 'purchase'): + lines += self._tax_declaration_lines(report, options, journal_options[0]['type']) + + # Total line + lines.append(self._get_total_line(report, options, totals_by_column_group)) + + return [(0, line) for line in lines] + + def _custom_unfold_all_batch_data_generator(self, report, options, lines_to_expand_by_function): + account_ids_to_expand = [] + for line_dict in lines_to_expand_by_function.get('_report_expand_unfoldable_line_general_ledger', []): + model, model_id = report._get_model_info_from_id(line_dict['id']) + if model == 'account.account': + account_ids_to_expand.append(model_id) + + limit_to_load = report.load_more_limit if report.load_more_limit and not options.get('export_mode') else None + has_more_per_account_id = {} + + unlimited_aml_results_per_account_id = self._get_aml_values(report, options, account_ids_to_expand)[0] + if limit_to_load: + # Apply the load_more_limit. + # load_more_limit cannot be passed to the call to _get_aml_values, otherwise it won't be applied per account but on the whole result. + # We gain perf from batching, but load every result ; then we need to filter them. + + aml_results_per_account_id = {} + for account_id, account_aml_results in unlimited_aml_results_per_account_id.items(): + account_values = {} + for key, value in account_aml_results.items(): + if len(account_values) == limit_to_load: + has_more_per_account_id[account_id] = True + break + account_values[key] = value + aml_results_per_account_id[account_id] = account_values + else: + aml_results_per_account_id = unlimited_aml_results_per_account_id + + return { + 'initial_balances': self._get_initial_balance_values(report, account_ids_to_expand, options), + 'aml_results': aml_results_per_account_id, + 'has_more': has_more_per_account_id, + } + + def _tax_declaration_lines(self, report, options, tax_type): + labels_replacement = { + 'debit': _("Base Amount"), + 'credit': _("Tax Amount"), + } + + rslt = [{ + 'id': report._get_generic_line_id(None, None, markup='tax_decl_header_1'), + 'name': _('Tax Declaration'), + 'columns': [{} for column in options['columns']], + 'level': 1, + 'unfoldable': False, + 'unfolded': False, + }, { + 'id': report._get_generic_line_id(None, None, markup='tax_decl_header_2'), + 'name': _('Name'), + 'columns': [{'name': labels_replacement.get(col['expression_label'], '')} for col in options['columns']], + 'level': 3, + 'unfoldable': False, + 'unfolded': False, + }] + + # Call the generic tax report + generic_tax_report = self.env.ref('account.generic_tax_report') + tax_report_options = generic_tax_report.get_options({**options, 'selected_variant_id': generic_tax_report.id, 'forced_domain': [('tax_line_id.type_tax_use', '=', tax_type)]}) + tax_report_lines = generic_tax_report._get_lines(tax_report_options) + tax_type_parent_line_id = generic_tax_report._get_generic_line_id(None, None, markup=tax_type) + + for tax_report_line in tax_report_lines: + if tax_report_line.get('parent_id') == tax_type_parent_line_id: + original_columns = tax_report_line['columns'] + row_column_map = { + 'debit': original_columns[0], + 'credit': original_columns[1], + } + + tax_report_line['columns'] = [row_column_map.get(col['expression_label'], {}) for col in options['columns']] + rslt.append(tax_report_line) + + return rslt + + def _query_values(self, report, options): + """ Executes the queries, and performs all the computations. + + :return: [(record, values_by_column_group), ...], where + - record is an account.account record. + - values_by_column_group is a dict in the form {column_group_key: values, ...} + - column_group_key is a string identifying a column group, as in options['column_groups'] + - values is a list of dictionaries, one per period containing: + - sum: {'debit': float, 'credit': float, 'balance': float} + - (optional) initial_balance: {'debit': float, 'credit': float, 'balance': float} + - (optional) unaffected_earnings: {'debit': float, 'credit': float, 'balance': float} + """ + # Execute the queries and dispatch the results. + query = self._get_query_sums(report, options) + + if not query: + return [] + + groupby_accounts = {} + groupby_companies = {} + + for res in self.env.execute_query_dict(query): + # No result to aggregate. + if res['groupby'] is None: + continue + + column_group_key = res['column_group_key'] + key = res['key'] + if key == 'sum': + groupby_accounts.setdefault(res['groupby'], {col_group_key: {} for col_group_key in options['column_groups']}) + groupby_accounts[res['groupby']][column_group_key][key] = res + + elif key == 'initial_balance': + groupby_accounts.setdefault(res['groupby'], {col_group_key: {} for col_group_key in options['column_groups']}) + groupby_accounts[res['groupby']][column_group_key][key] = res + + elif key == 'unaffected_earnings': + groupby_companies.setdefault(res['groupby'], {col_group_key: {} for col_group_key in options['column_groups']}) + groupby_companies[res['groupby']][column_group_key] = res + + # Affect the unaffected earnings to the first fetched account of type 'account.data_unaffected_earnings'. + # It's less costly to fetch all candidate accounts in a single search and then iterate it. + if groupby_companies: + unaffected_earnings_accounts = self.env['account.account'].search([ + ('display_name', 'ilike', options.get('filter_search_bar')), + *self.env['account.account']._check_company_domain(list(groupby_companies.keys())), + ('account_type', '=', 'equity_unaffected'), + ]) + for company_id, groupby_company in groupby_companies.items(): + if equity_unaffected_account := unaffected_earnings_accounts.filtered(lambda a: self.env['res.company'].browse(company_id).root_id in a.company_ids): + for column_group_key in options['column_groups']: + groupby_accounts.setdefault( + equity_unaffected_account.id, + {col_group_key: {'unaffected_earnings': {}} for col_group_key in options['column_groups']}, + ) + if unaffected_earnings := groupby_company.get(column_group_key): + if groupby_accounts[equity_unaffected_account.id][column_group_key].get('unaffected_earnings'): + for key in ['amount_currency', 'debit', 'credit', 'balance']: + groupby_accounts[equity_unaffected_account.id][column_group_key]['unaffected_earnings'][key] += unaffected_earnings[key] + else: + groupby_accounts[equity_unaffected_account.id][column_group_key]['unaffected_earnings'] = unaffected_earnings + + # Retrieve the accounts to browse. + # groupby_accounts.keys() contains all account ids affected by: + # - the amls in the current period. + # - the amls affecting the initial balance. + # - the unaffected earnings allocation. + # Note a search is done instead of a browse to preserve the table ordering. + if groupby_accounts: + accounts = self.env['account.account'].search([('id', 'in', list(groupby_accounts.keys()))]) + else: + accounts = [] + + return [(account, groupby_accounts[account.id]) for account in accounts] + + def _get_query_sums(self, report, options) -> SQL: + """ Construct a query retrieving all the aggregated sums to build the report. It includes: + - sums for all accounts. + - sums for the initial balances. + - sums for the unaffected earnings. + - sums for the tax declaration. + :return: query as SQL object + """ + options_by_column_group = report._split_options_per_column_group(options) + + queries = [] + + # ============================================ + # 1) Get sums for all accounts. + # ============================================ + for column_group_key, options_group in options_by_column_group.items(): + + # Sum is computed including the initial balance of the accounts configured to do so, unless a special option key is used + # (this is required for trial balance, which is based on general ledger) + sum_date_scope = 'strict_range' if options_group.get('general_ledger_strict_range') else 'from_beginning' + + query_domain = [] + + if not options_group.get('general_ledger_strict_range'): + date_from = fields.Date.from_string(options_group['date']['date_from']) + current_fiscalyear_dates = self.env.company.compute_fiscalyear_dates(date_from) + query_domain += [ + '|', + ('date', '>=', current_fiscalyear_dates['date_from']), + ('account_id.include_initial_balance', '=', True), + ] + + if options_group.get('export_mode') == 'print' and options_group.get('filter_search_bar'): + if options_group.get('hierarchy'): + query_domain += [ + '|', + ('account_id', 'ilike', options_group['filter_search_bar']), + ('account_id.id', 'in', SQL( + """ + /* + JOIN clause: Check if the account_group include the account_account + A group from 10 to 10 include every account with code that begin with 10. + If there is an account with a length of 6, it should be included if it's in the range from 100 000 to 109 999 included + + Where clause: Check if the account_group matches the filter + */ + (SELECT distinct account_account.id + FROM account_account + LEFT JOIN account_group ON + ( + LEFT(account_account.code_store->> '%(company_id)s', LENGTH(code_prefix_start)) BETWEEN + code_prefix_start + AND code_prefix_end + ) + WHERE ( account_group.name->> %(lang)s ILIKE %(filter_search_bar)s + OR account_group.code_prefix_start ILIKE %(filter_search_bar)s) + )""", + lang=self.env.lang, + company_id=self.env.company.id, + filter_search_bar="%" + options_group['filter_search_bar'] + "%")), + ] + else: + query_domain.append(('account_id', 'ilike', options_group['filter_search_bar'])) + + if options_group.get('include_current_year_in_unaff_earnings'): + query_domain += [('account_id.include_initial_balance', '=', True)] + + query = report._get_report_query(options_group, sum_date_scope, domain=query_domain) + queries.append(SQL( + """ + SELECT + account_move_line.account_id AS groupby, + 'sum' AS key, + MAX(account_move_line.date) AS max_date, + %(column_group_key)s AS column_group_key, + COALESCE(SUM(account_move_line.amount_currency), 0.0) AS amount_currency, + SUM(%(debit_select)s) AS debit, + SUM(%(credit_select)s) AS credit, + SUM(%(balance_select)s) AS balance + FROM %(table_references)s + %(currency_table_join)s + WHERE %(search_condition)s + GROUP BY account_move_line.account_id + """, + column_group_key=column_group_key, + table_references=query.from_clause, + debit_select=report._currency_table_apply_rate(SQL("account_move_line.debit")), + credit_select=report._currency_table_apply_rate(SQL("account_move_line.credit")), + balance_select=report._currency_table_apply_rate(SQL("account_move_line.balance")), + currency_table_join=report._currency_table_aml_join(options_group), + search_condition=query.where_clause, + )) + + # ============================================ + # 2) Get sums for the unaffected earnings. + # ============================================ + if not options_group.get('general_ledger_strict_range'): + unaff_earnings_domain = [('account_id.include_initial_balance', '=', False)] + + # The period domain is expressed as: + # [ + # ('date' <= fiscalyear['date_from'] - 1), + # ('account_id.include_initial_balance', '=', False), + # ] + + new_options = self._get_options_unaffected_earnings(options_group) + query = report._get_report_query(new_options, 'strict_range', domain=unaff_earnings_domain) + queries.append(SQL( + """ + SELECT + account_move_line.company_id AS groupby, + 'unaffected_earnings' AS key, + NULL AS max_date, + %(column_group_key)s AS column_group_key, + COALESCE(SUM(account_move_line.amount_currency), 0.0) AS amount_currency, + SUM(%(debit_select)s) AS debit, + SUM(%(credit_select)s) AS credit, + SUM(%(balance_select)s) AS balance + FROM %(table_references)s + %(currency_table_join)s + WHERE %(search_condition)s + GROUP BY account_move_line.company_id + """, + column_group_key=column_group_key, + table_references=query.from_clause, + debit_select=report._currency_table_apply_rate(SQL("account_move_line.debit")), + credit_select=report._currency_table_apply_rate(SQL("account_move_line.credit")), + balance_select=report._currency_table_apply_rate(SQL("account_move_line.balance")), + currency_table_join=report._currency_table_aml_join(options_group), + search_condition=query.where_clause, + )) + + return SQL(" UNION ALL ").join(queries) + + def _get_options_unaffected_earnings(self, options): + ''' Create options used to compute the unaffected earnings. + The unaffected earnings are the amount of benefits/loss that have not been allocated to + another account in the previous fiscal years. + The resulting dates domain will be: + [ + ('date' <= fiscalyear['date_from'] - 1), + ('account_id.include_initial_balance', '=', False), + ] + :param options: The report options. + :return: A copy of the options. + ''' + new_options = options.copy() + new_options.pop('filter_search_bar', None) + fiscalyear_dates = self.env.company.compute_fiscalyear_dates(fields.Date.from_string(options['date']['date_from'])) + + # Trial balance uses the options key, general ledger does not + new_date_to = fields.Date.from_string(new_options['date']['date_to']) if options.get('include_current_year_in_unaff_earnings') else fiscalyear_dates['date_from'] - timedelta(days=1) + + new_options['date'] = self.env['account.report']._get_dates_period(None, new_date_to, 'single') + + return new_options + + def _get_aml_values(self, report, options, expanded_account_ids, offset=0, limit=None): + rslt = {account_id: {} for account_id in expanded_account_ids} + aml_query = self._get_query_amls(report, options, expanded_account_ids, offset=offset, limit=limit) + self._cr.execute(aml_query) + aml_results_number = 0 + has_more = False + for aml_result in self._cr.dictfetchall(): + aml_results_number += 1 + if aml_results_number == limit: + has_more = True + break + + # For asset_receivable the name will already contains the ref with the _compute_name + if aml_result['ref'] and aml_result['account_type'] != 'asset_receivable': + aml_result['communication'] = f"{aml_result['ref']} - {aml_result['name']}" + else: + aml_result['communication'] = aml_result['name'] + + # The same aml can return multiple results when using account_report_cash_basis module, if the receivable/payable + # is reconciled with multiple payments. In this case, the date shown for the move lines actually corresponds to the + # reconciliation date. In order to keep distinct lines in this case, we include date in the grouping key. + aml_key = (aml_result['id'], aml_result['date']) + + account_result = rslt[aml_result['account_id']] + if not aml_key in account_result: + account_result[aml_key] = {col_group_key: {} for col_group_key in options['column_groups']} + + account_result[aml_key][aml_result['column_group_key']] = aml_result + + return rslt, has_more + + def _get_query_amls(self, report, options, expanded_account_ids, offset=0, limit=None) -> SQL: + """ Construct a query retrieving the account.move.lines when expanding a report line with or without the load + more. + :param options: The report options. + :param expanded_account_ids: The account.account ids corresponding to consider. If None, match every account. + :param offset: The offset of the query (used by the load more). + :param limit: The limit of the query (used by the load more). + :return: (query, params) + """ + additional_domain = [('account_id', 'in', expanded_account_ids)] if expanded_account_ids is not None else None + queries = [] + journal_name = self.env['account.journal']._field_to_sql('journal', 'name') + for column_group_key, group_options in report._split_options_per_column_group(options).items(): + # Get sums for the account move lines. + # period: [('date' <= options['date_to']), ('date', '>=', options['date_from'])] + query = report._get_report_query(group_options, domain=additional_domain, date_scope='strict_range') + account_alias = query.left_join(lhs_alias='account_move_line', lhs_column='account_id', rhs_table='account_account', rhs_column='id', link='account_id') + account_code = self.env['account.account']._field_to_sql(account_alias, 'code', query) + account_name = self.env['account.account']._field_to_sql(account_alias, 'name') + account_type = self.env['account.account']._field_to_sql(account_alias, 'account_type') + + query = SQL( + ''' + SELECT + account_move_line.id, + account_move_line.date, + MIN(account_move_line.date_maturity) AS date_maturity, + MIN(account_move_line.name) AS name, + MIN(account_move_line.ref) AS ref, + MIN(account_move_line.company_id) AS company_id, + MIN(account_move_line.account_id) AS account_id, + MIN(account_move_line.payment_id) AS payment_id, + MIN(account_move_line.partner_id) AS partner_id, + MIN(account_move_line.currency_id) AS currency_id, + SUM(account_move_line.amount_currency) AS amount_currency, + MIN(COALESCE(account_move_line.invoice_date, account_move_line.date)) AS invoice_date, + account_move_line.date AS date, + SUM(%(debit_select)s) AS debit, + SUM(%(credit_select)s) AS credit, + SUM(%(balance_select)s) AS balance, + MIN(move.name) AS move_name, + MIN(company.currency_id) AS company_currency_id, + MIN(partner.name) AS partner_name, + MIN(move.move_type) AS move_type, + MIN(%(account_code)s) AS account_code, + MIN(%(account_name)s) AS account_name, + MIN(%(account_type)s) AS account_type, + MIN(journal.code) AS journal_code, + MIN(%(journal_name)s) AS journal_name, + MIN(full_rec.id) AS full_rec_name, + %(column_group_key)s AS column_group_key + FROM %(table_references)s + JOIN account_move move ON move.id = account_move_line.move_id + %(currency_table_join)s + LEFT JOIN res_company company ON company.id = account_move_line.company_id + LEFT JOIN res_partner partner ON partner.id = account_move_line.partner_id + LEFT JOIN account_journal journal ON journal.id = account_move_line.journal_id + LEFT JOIN account_full_reconcile full_rec ON full_rec.id = account_move_line.full_reconcile_id + WHERE %(search_condition)s + GROUP BY account_move_line.id, account_move_line.date + ORDER BY account_move_line.date, move_name, account_move_line.id + ''', + account_code=account_code, + account_name=account_name, + account_type=account_type, + journal_name=journal_name, + column_group_key=column_group_key, + table_references=query.from_clause, + currency_table_join=report._currency_table_aml_join(group_options), + debit_select=report._currency_table_apply_rate(SQL("account_move_line.debit")), + credit_select=report._currency_table_apply_rate(SQL("account_move_line.credit")), + balance_select=report._currency_table_apply_rate(SQL("account_move_line.balance")), + search_condition=query.where_clause, + ) + queries.append(query) + + full_query = SQL(" UNION ALL ").join(SQL("(%s)", query) for query in queries) + + if offset: + full_query = SQL('%s OFFSET %s ', full_query, offset) + if limit: + full_query = SQL('%s LIMIT %s ', full_query, limit) + + return full_query + + def _get_initial_balance_values(self, report, account_ids, options): + """ + Get sums for the initial balance. + """ + queries = [] + for column_group_key, options_group in report._split_options_per_column_group(options).items(): + new_options = self._get_options_initial_balance(options_group) + domain = [ + ('account_id', 'in', account_ids), + ] + if not new_options.get('general_ledger_strict_range'): + domain += [ + '|', + ('date', '>=', new_options['date']['date_from']), + ('account_id.include_initial_balance', '=', True), + ] + if new_options.get('include_current_year_in_unaff_earnings'): + domain += [('account_id.include_initial_balance', '=', True)] + query = report._get_report_query(new_options, 'from_beginning', domain=domain) + queries.append(SQL( + """ + SELECT + account_move_line.account_id AS groupby, + 'initial_balance' AS key, + NULL AS max_date, + %(column_group_key)s AS column_group_key, + COALESCE(SUM(account_move_line.amount_currency), 0.0) AS amount_currency, + SUM(%(debit_select)s) AS debit, + SUM(%(credit_select)s) AS credit, + SUM(%(balance_select)s) AS balance + FROM %(table_references)s + %(currency_table_join)s + WHERE %(search_condition)s + GROUP BY account_move_line.account_id + """, + column_group_key=column_group_key, + table_references=query.from_clause, + debit_select=report._currency_table_apply_rate(SQL("account_move_line.debit")), + credit_select=report._currency_table_apply_rate(SQL("account_move_line.credit")), + balance_select=report._currency_table_apply_rate(SQL("account_move_line.balance")), + currency_table_join=report._currency_table_aml_join(options_group), + search_condition=query.where_clause, + )) + + self._cr.execute(SQL(" UNION ALL ").join(queries)) + + init_balance_by_col_group = { + account_id: {column_group_key: {} for column_group_key in options['column_groups']} + for account_id in account_ids + } + for result in self._cr.dictfetchall(): + init_balance_by_col_group[result['groupby']][result['column_group_key']] = result + + accounts = self.env['account.account'].browse(account_ids) + return { + account.id: (account, init_balance_by_col_group[account.id]) + for account in accounts + } + + def _get_options_initial_balance(self, options): + """ Create options used to compute the initial balances. + The initial balances depict the current balance of the accounts at the beginning of + the selected period in the report. + The resulting dates domain will be: + [ + ('date' <= options['date_from'] - 1), + '|', + ('date' >= fiscalyear['date_from']), + ('account_id.include_initial_balance', '=', True) + ] + :param options: The report options. + :return: A copy of the options. + """ + #pylint: disable=sql-injection + new_options = options.copy() + date_to = new_options['comparison']['periods'][-1]['date_from'] if new_options.get('comparison', {}).get('periods') else new_options['date']['date_from'] + new_date_to = fields.Date.from_string(date_to) - timedelta(days=1) + + # Date from computation + # We have two case: + # 1) We are choosing a date that starts at the beginning of a fiscal year and we want the initial period to be + # the previous fiscal year + # 2) We are choosing a date that starts in the middle of a fiscal year and in that case we want the initial period + # to be the beginning of the fiscal year + date_from = fields.Date.from_string(new_options['date']['date_from']) + current_fiscalyear_dates = self.env.company.compute_fiscalyear_dates(date_from) + + if date_from == current_fiscalyear_dates['date_from']: + # We want the previous fiscal year + previous_fiscalyear_dates = self.env.company.compute_fiscalyear_dates(date_from - timedelta(days=1)) + new_date_from = previous_fiscalyear_dates['date_from'] + include_current_year_in_unaff_earnings = True + else: + # We want the current fiscal year + new_date_from = current_fiscalyear_dates['date_from'] + include_current_year_in_unaff_earnings = False + + new_options['date'] = self.env['account.report']._get_dates_period( + new_date_from, + new_date_to, + 'range', + ) + new_options['include_current_year_in_unaff_earnings'] = include_current_year_in_unaff_earnings + + return new_options + + #################################################### + # COLUMN/LINE HELPERS + #################################################### + def _get_account_title_line(self, report, options, account, has_lines, eval_dict): + line_columns = [] + for column in options['columns']: + col_value = eval_dict.get(column['column_group_key'], {}).get(column['expression_label']) + col_expr_label = column['expression_label'] + + value = None if col_value is None or (col_expr_label == 'amount_currency' and not account.currency_id) else col_value + + line_columns.append(report._build_column_dict( + value, + column, + options=options, + currency=account.currency_id if col_expr_label == 'amount_currency' else None, + )) + + line_id = report._get_generic_line_id('account.account', account.id) + is_in_unfolded_lines = any( + report._get_res_id_from_line_id(line_id, 'account.account') == account.id + for line_id in options.get('unfolded_lines') + ) + return { + 'id': line_id, + 'name': account.display_name, + 'columns': line_columns, + 'level': 1, + 'unfoldable': has_lines, + 'unfolded': has_lines and (is_in_unfolded_lines or options.get('unfold_all')), + 'expand_function': '_report_expand_unfoldable_line_general_ledger', + } + + def _get_aml_line(self, report, parent_line_id, options, eval_dict, init_bal_by_col_group): + line_columns = [] + for column in options['columns']: + col_expr_label = column['expression_label'] + col_value = eval_dict[column['column_group_key']].get(col_expr_label) + col_currency = None + + if col_value is not None: + if col_expr_label == 'amount_currency': + col_currency = self.env['res.currency'].browse(eval_dict[column['column_group_key']]['currency_id']) + col_value = None if col_currency == self.env.company.currency_id else col_value + elif col_expr_label == 'balance': + col_value += (init_bal_by_col_group[column['column_group_key']] or 0) + + line_columns.append(report._build_column_dict( + col_value, + column, + options=options, + currency=col_currency, + )) + + aml_id = None + move_name = None + caret_type = None + for column_group_dict in eval_dict.values(): + aml_id = column_group_dict.get('id', '') + if aml_id: + if column_group_dict.get('payment_id'): + caret_type = 'account.payment' + else: + caret_type = 'account.move.line' + move_name = column_group_dict['move_name'] + date = str(column_group_dict.get('date', '')) + break + + return { + 'id': report._get_generic_line_id('account.move.line', aml_id, parent_line_id=parent_line_id, markup=date), + 'caret_options': caret_type, + 'parent_id': parent_line_id, + 'name': move_name or _('Draft Entry'), + 'columns': line_columns, + 'level': 3, + } + + @api.model + def _get_total_line(self, report, options, eval_dict): + line_columns = [] + for column in options['columns']: + col_value = eval_dict[column['column_group_key']].get(column['expression_label']) + col_value = None if col_value is None else col_value + + line_columns.append(report._build_column_dict(col_value, column, options=options)) + + return { + 'id': report._get_generic_line_id(None, None, markup='total'), + 'name': _('Total'), + 'level': 1, + 'columns': line_columns, + } + + def caret_option_audit_tax(self, options, params): + return self.env['account.generic.tax.report.handler'].caret_option_audit_tax(options, params) + + def _report_expand_unfoldable_line_general_ledger(self, line_dict_id, groupby, options, progress, offset, unfold_all_batch_data=None): + def init_load_more_progress(line_dict): + return { + column['column_group_key']: line_col.get('no_format', 0) + for column, line_col in zip(options['columns'], line_dict['columns']) + if column['expression_label'] == 'balance' + } + + report = self.env.ref('odex30_account_reports.general_ledger_report') + model, model_id = report._get_model_info_from_id(line_dict_id) + + if model != 'account.account': + raise UserError(_("Wrong ID for general ledger line to expand: %s", line_dict_id)) + + lines = [] + + # Get initial balance + if offset == 0: + if unfold_all_batch_data: + account, init_balance_by_col_group = unfold_all_batch_data['initial_balances'][model_id] + else: + account, init_balance_by_col_group = self._get_initial_balance_values(report, [model_id], options)[model_id] + + initial_balance_line = report._get_partner_and_general_ledger_initial_balance_line(options, line_dict_id, init_balance_by_col_group, account.currency_id) + + if initial_balance_line: + lines.append(initial_balance_line) + + # For the first expansion of the line, the initial balance line gives the progress + progress = init_load_more_progress(initial_balance_line) + + # Get move lines + limit_to_load = report.load_more_limit + 1 if report.load_more_limit and options['export_mode'] != 'print' else None + if unfold_all_batch_data: + aml_results = unfold_all_batch_data['aml_results'][model_id] + has_more = unfold_all_batch_data['has_more'].get(model_id, False) + else: + aml_results, has_more = self._get_aml_values(report, options, [model_id], offset=offset, limit=limit_to_load) + aml_results = aml_results[model_id] + + next_progress = progress + for aml_result in aml_results.values(): + new_line = self._get_aml_line(report, line_dict_id, options, aml_result, next_progress) + lines.append(new_line) + next_progress = init_load_more_progress(new_line) + + return { + 'lines': lines, + 'offset_increment': report.load_more_limit, + 'has_more': has_more, + 'progress': next_progress, + } diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_generic_tax_report.py b/dev_odex30_accounting/odex30_account_reports/models/account_generic_tax_report.py new file mode 100644 index 0000000..b9adb8e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_generic_tax_report.py @@ -0,0 +1,1222 @@ +import ast +from collections import defaultdict + +from odoo import models, api, fields, Command, _ +from odoo.addons.web.controllers.utils import clean_action +from odoo.exceptions import UserError, RedirectWarning +from odoo.osv import expression +from odoo.tools import SQL + + +class AccountTaxReportHandler(models.AbstractModel): + _name = 'account.tax.report.handler' + _inherit = 'account.report.custom.handler' + _description = 'Account Report Handler for Tax Reports' + + + def _custom_options_initializer(self, report, options, previous_options): + optional_periods = { + 'monthly': 'month', + 'trimester': 'quarter', + 'year': 'year', + } + + options['buttons'].append({'name': _('Closing Entry'), 'action': 'action_periodic_vat_entries', 'sequence': 110, 'always_show': True}) + options['enable_export_buttons_for_common_vat_in_branches'] = True + + day, month = self.env.company._get_tax_closing_start_date_attributes(report) + periodicity = self.env.company._get_tax_periodicity(report) + options['tax_periodicity'] = { + 'periodicity': periodicity, + 'months_per_period': self.env.company._get_tax_periodicity_months_delay(report), + 'start_day': day, + 'start_month': month, + } + + options['show_tax_period_filter'] = periodicity not in optional_periods or day != 1 or month != 1 + if not options['show_tax_period_filter'] and 'custom' not in options['date']['filter']: + period_type = optional_periods[periodicity] + options['date']['filter'] = options['date']['filter'].replace('tax_period', period_type) + options['date']['period_type'] = options['date']['period_type'].replace('tax_period', period_type) + + def _get_custom_display_config(self): + display_config = defaultdict(dict) + display_config['templates']['AccountReportFilters'] = 'odex30_account_reports.GenericTaxReportFiltersCustomizable' + return display_config + + def _customize_warnings(self, report, options, all_column_groups_expression_totals, warnings): + if 'odex30_account_reports.common_warning_draft_in_period' in warnings: + # Recompute the warning 'common_warning_draft_in_period' to not include tax closing entries in the banner of unposted moves + if not self.env['account.move'].search_count( + [('state', '=', 'draft'), ('date', '<=', options['date']['date_to']), + ('tax_closing_report_id', '=', False)], + limit=1, + ): + warnings.pop('odex30_account_reports.common_warning_draft_in_period') + + # Chek the use of inactive tags in the period + query = report._get_report_query(options, 'strict_range') + rows = self.env.execute_query(SQL(""" + SELECT 1 + FROM %s + JOIN account_account_tag_account_move_line_rel aml_tag + ON account_move_line.id = aml_tag.account_move_line_id + JOIN account_account_tag tag + ON aml_tag.account_account_tag_id = tag.id + WHERE %s + AND NOT tag.active + LIMIT 1 + """, query.from_clause, query.where_clause)) + if rows: + warnings['odex30_account_reports.tax_report_warning_inactive_tags'] = {} + + + # ------------------------------------------------------------------------- + # TAX CLOSING + # ------------------------------------------------------------------------- + + def _is_period_equal_to_options(self, report, options): + options_date_to = fields.Date.from_string(options['date']['date_to']) + options_date_from = fields.Date.from_string(options['date']['date_from']) + date_from, date_to = self.env.company._get_tax_closing_period_boundaries(options_date_to, report) + return date_from == options_date_from and date_to == options_date_to + + def action_periodic_vat_entries(self, options, from_post=False): + report = self.env['account.report'].browse(options['report_id']) + if ( + options['date']['period_type'] != 'tax_period' + and not self._is_period_equal_to_options(report, options) + and not self.env.context.get('override_tax_closing_warning') + ): + if len(options['companies']) > 1 and (report.filter_multi_company != 'tax_units' or not (report.country_id and options['available_tax_units'])): + message = _( + "You're about the generate the closing entries of multiple companies at once. Each of them will be created in accordance with its company tax periodicity.") + else: + message = _( + "The currently selected dates don't match a tax period. The closing entry will be created for the closest-matching period according to your periodicity setup.") + + return { + 'type': 'ir.actions.client', + 'tag': 'odex30_account_reports.redirect_action', + 'target': 'new', + 'params': { + 'depending_action': self.with_context( + {'override_tax_closing_warning': True}).action_periodic_vat_entries(options), + 'message': message, + 'button_text': _("Proceed"), + }, + 'context': { + 'dialog_size': 'medium', + 'override_tax_closing_warning': True, + }, + } + + moves = self._get_periodic_vat_entries(options, from_post=from_post) + # Make the action for the retrieved move and return it. + action = self.env["ir.actions.actions"]._for_xml_id("account.action_move_journal_line") + action = clean_action(action, env=self.env) + action.pop('domain', None) + + if len(moves) == 1: + action['views'] = [(self.env.ref('account.view_move_form').id, 'form')] + action['res_id'] = moves.id + else: + action['domain'] = [('id', 'in', moves.ids)] + action['context'] = dict(ast.literal_eval(action['context'])) + action['context'].pop('search_default_posted', None) + return action + + def _get_periodic_vat_entries(self, options, from_post=False): + report = self.env['account.report'].browse(options['report_id']) + + # When integer_rounding is available, we always want it for tax closing (as it means it's a legal requirement) + if options.get('integer_rounding'): + options['integer_rounding_enabled'] = True + + # Return action to open form view of newly created entry + moves = self.env['account.move'] + + # Get all companies impacting the report. + companies = self.env['res.company'].browse(report.get_report_company_ids(options)) + + companies_moves = self._get_tax_closing_entries_for_closed_period(report, options, companies, posted_only=False) + moves += companies_moves + moves += self._generate_tax_closing_entries(report, options, companies=companies - companies_moves.company_id, from_post=from_post) + + return moves + + def _generate_tax_closing_entries(self, report, options, closing_moves=None, companies=None, from_post=False): + """Generates and/or updates VAT closing entries. + + This method computes the content of the tax closing in the following way: + - Search on all tax lines in the given period, group them by tax_group (each tax group might have its own + tax receivable/payable account). + - Create a move line that balances each tax account and add the difference in the correct receivable/payable + account. Also take into account amounts already paid via advance tax payment account. + + The tax closing is done so that an individual move is created per available VAT number: so, one for each + foreign vat fiscal position (each with fiscal_position_id set to this fiscal position), and one for the domestic + position (with fiscal_position_id = None). The moves created by this function hence depends on the content of the + options dictionary, and what fiscal positions are accepted by it. + + :param options: the tax report options dict to use to make the closing. + :param closing_moves: If provided, closing moves to update the content from. + They need to be compatible with the provided options (if they have a fiscal_position_id, for example). + :param companies: optional params, the companies given will be used instead of taking all the companies impacting + the report. + :return: The closing moves. + """ + if companies is None: + companies = self.env['res.company'].browse(report.get_report_company_ids(options)) + + if closing_moves is None: + closing_moves = self.env['account.move'] + + end_date = fields.Date.from_string(options['date']['date_to']) + + closing_moves_by_company = defaultdict(lambda: self.env['account.move']) + + companies_without_closing = companies.filtered(lambda company: company not in closing_moves.company_id) + if closing_moves: + for move in closing_moves.filtered(lambda x: x.state == 'draft'): + closing_moves_by_company[move.company_id] |= move + + for company in companies_without_closing: + include_domestic, fiscal_positions = self._get_fpos_info_for_tax_closing(company, report, options) + company_closing_moves = company._get_and_update_tax_closing_moves(end_date, report, fiscal_positions=fiscal_positions, include_domestic=include_domestic) + closing_moves_by_company[company] = company_closing_moves + closing_moves += company_closing_moves + + for company, company_closing_moves in closing_moves_by_company.items(): + + # First gather the countries for which the closing is being done + countries = self.env['res.country'] + for move in company_closing_moves: + if move.fiscal_position_id.foreign_vat: + countries |= move.fiscal_position_id.country_id + else: + countries |= company.account_fiscal_country_id + + # Check the tax groups from the company for any misconfiguration in these countries + if self.env['account.tax.group']._check_misconfigured_tax_groups(company, countries): + self._redirect_to_misconfigured_tax_groups(company, countries) + + for move in company_closing_moves: + # When coming from post and that the current move is the closing of the current company we don't want to + # write on it again + if from_post and move == closing_moves_by_company.get(self.env.company): + continue + + # get tax entries by tax_group for the period defined in options + move_options = {**options, 'fiscal_position': move.fiscal_position_id.id if move.fiscal_position_id else 'domestic'} + line_ids_vals, tax_group_subtotal = self._compute_vat_closing_entry(company, move_options) + + line_ids_vals += self._add_tax_group_closing_items(tax_group_subtotal, move) + + if move.line_ids: + line_ids_vals += [Command.delete(aml.id) for aml in move.line_ids] + + move_vals = {} + if line_ids_vals: + move_vals['line_ids'] = line_ids_vals + move.write(move_vals) + + return closing_moves + + def _get_tax_closing_entries_for_closed_period(self, report, options, companies, posted_only=True): + """ Fetch the closing entries related to the given companies for the currently selected tax report period. + Only used when the selected period already has a tax lock date impacting it, and assuming that these periods + all have a tax closing entry. + :param report: The tax report for which we are getting the closing entries. + :param options: the tax report options dict needed to get the period end date and fiscal position info. + :param companies: a recordset of companies for which the period has already been closed. + :return: The closing moves. + """ + closing_moves = self.env['account.move'] + for company in companies: + _dummy, period_end = company._get_tax_closing_period_boundaries(fields.Date.from_string(options['date']['date_to']), report) + include_domestic, fiscal_positions = self._get_fpos_info_for_tax_closing(company, report, options) + fiscal_position_ids = fiscal_positions.ids + ([False] if include_domestic else []) + state_domain = ('state', '=', 'posted') if posted_only else ('state', '!=', 'cancel') + closing_moves += self.env['account.move'].search([ + ('company_id', '=', company.id), + ('fiscal_position_id', 'in', fiscal_position_ids), + ('date', '=', period_end), + ('tax_closing_report_id', '!=', False), + state_domain, + ]) + + return closing_moves + + @api.model + def _compute_vat_closing_entry(self, company, options): + """Compute the VAT closing entry. + + This method returns the one2many commands to balance the tax accounts for the selected period, and + a dictionnary that will help balance the different accounts set per tax group. + """ + self = self.with_company(company) # Needed to handle access to property fields correctly + + # first, for each tax group, gather the tax entries per tax and account + self.env['account.tax'].flush_model(['name', 'tax_group_id']) + self.env['account.tax.repartition.line'].flush_model(['use_in_tax_closing']) + self.env['account.move.line'].flush_model(['account_id', 'debit', 'credit', 'move_id', 'tax_line_id', 'date', 'company_id', 'display_type', 'parent_state']) + self.env['account.move'].flush_model(['state']) + + new_options = { + **options, + 'all_entries': False, + 'date': dict(options['date']), + } + + report = self.env['account.report'].browse(options['report_id']) + period_start, period_end = company._get_tax_closing_period_boundaries(fields.Date.from_string(options['date']['date_to']), report) + new_options['date']['date_from'] = fields.Date.to_string(period_start) + new_options['date']['date_to'] = fields.Date.to_string(period_end) + new_options['date']['period_type'] = 'custom' + new_options['date']['filter'] = 'custom' + new_options = report.with_context(allowed_company_ids=company.ids).get_options(previous_options=new_options) + # Force the use of the fiscal position from the original options (_get_options sets the fiscal + # position to 'all' when the report is the generic tax report) + new_options['fiscal_position'] = options['fiscal_position'] + + query = self.env.ref('account.generic_tax_report')._get_report_query( + new_options, + 'strict_range', + domain=self._get_vat_closing_entry_additional_domain() + ) + + # Check whether it is multilingual, in order to get the translation from the JSON value if present + tax_name = self.env['account.tax']._field_to_sql('tax', 'name') + + query = SQL( + """ + SELECT "account_move_line".tax_line_id as tax_id, + tax.tax_group_id as tax_group_id, + %(tax_name)s as tax_name, + "account_move_line".account_id, + COALESCE(SUM("account_move_line".balance), 0) as amount + FROM account_tax tax, account_tax_repartition_line repartition, %(table_references)s + WHERE %(search_condition)s + AND tax.id = "account_move_line".tax_line_id + AND repartition.id = "account_move_line".tax_repartition_line_id + AND repartition.use_in_tax_closing + GROUP BY tax.tax_group_id, "account_move_line".tax_line_id, tax.name, "account_move_line".account_id + """, + tax_name=tax_name, + table_references=query.from_clause, + search_condition=query.where_clause, + ) + self.env.cr.execute(query) + results = self.env.cr.dictfetchall() + results = self._postprocess_vat_closing_entry_results(company, new_options, results) + + tax_group_ids = [r['tax_group_id'] for r in results] + tax_groups = {} + for tg, result in zip(self.env['account.tax.group'].browse(tax_group_ids), results): + if tg not in tax_groups: + tax_groups[tg] = {} + if result.get('tax_id') not in tax_groups[tg]: + tax_groups[tg][result.get('tax_id')] = [] + tax_groups[tg][result.get('tax_id')].append((result.get('tax_name'), result.get('account_id'), result.get('amount'))) + + # then loop on previous results to + # * add the lines that will balance their sum per account + # * make the total per tax group's account triplet + # (if 2 tax groups share the same 3 accounts, they should consolidate in the vat closing entry) + move_vals_lines = [] + tax_group_subtotal = {} + currency = self.env.company.currency_id + for tg, values in tax_groups.items(): + total = 0 + # ignore line that have no property defined on tax group + if not tg.tax_receivable_account_id or not tg.tax_payable_account_id: + continue + for dummy, value in values.items(): + for v in value: + tax_name, account_id, amt = v + # Line to balance + move_vals_lines.append((0, 0, {'name': tax_name, 'debit': abs(amt) if amt < 0 else 0, 'credit': amt if amt > 0 else 0, 'account_id': account_id})) + total += amt + + if not currency.is_zero(total): + # Add total to correct group + key = (tg.advance_tax_payment_account_id.id or False, tg.tax_receivable_account_id.id, tg.tax_payable_account_id.id) + + if tax_group_subtotal.get(key): + tax_group_subtotal[key] += total + else: + tax_group_subtotal[key] = total + + # If the tax report is completely empty, we add two 0-valued lines, using the first in in and out + # account id we find on the taxes. + if len(move_vals_lines) == 0: + rep_ln_in = self.env['account.tax.repartition.line'].search([ + *self.env['account.tax.repartition.line']._check_company_domain(company), + ('account_id.deprecated', '=', False), + ('repartition_type', '=', 'tax'), + ('document_type', '=', 'invoice'), + ('tax_id.type_tax_use', '=', 'purchase') + ], limit=1) + rep_ln_out = self.env['account.tax.repartition.line'].search([ + *self.env['account.tax.repartition.line']._check_company_domain(company), + ('account_id.deprecated', '=', False), + ('repartition_type', '=', 'tax'), + ('document_type', '=', 'invoice'), + ('tax_id.type_tax_use', '=', 'sale') + ], limit=1) + + if rep_ln_out.account_id and rep_ln_in.account_id: + move_vals_lines = [ + Command.create({ + 'name': _('Tax Received Adjustment'), + 'debit': 0, + 'credit': 0.0, + 'account_id': rep_ln_out.account_id.id + }), + + Command.create({ + 'name': _('Tax Paid Adjustment'), + 'debit': 0.0, + 'credit': 0, + 'account_id': rep_ln_in.account_id.id + }) + ] + + return move_vals_lines, tax_group_subtotal + + def _get_vat_closing_entry_additional_domain(self): + return [] + + def _postprocess_vat_closing_entry_results(self, company, options, results): + # Override this to, for example, apply a rounding to the lines of the closing entry + return results + + def _vat_closing_entry_results_rounding(self, company, options, results, rounding_accounts, vat_results_summary): + """ + Apply the rounding from the tax report by adding a line to the end of the query results + representing the sum of the roundings on each line of the tax report. + """ + # Ignore if the rounding accounts cannot be found + if not rounding_accounts.get('profit') or not rounding_accounts.get('loss'): + return results + + total_amount = 0.0 + tax_group_id = None + + for line in results: + total_amount += line['amount'] + # The accounts on the tax group ids from the results should be uniform, + # but we choose the greatest id so that the line appears last on the entry. + tax_group_id = line['tax_group_id'] + + report = self.env['account.report'].browse(options['report_id']) + + for line in report._get_lines(options): + model, record_id = report._get_model_info_from_id(line['id']) + + if model != 'account.report.line': + continue + + for (operation_type, report_line_id, column_expression_label) in vat_results_summary: + for column in line['columns']: + if record_id != report_line_id or column['expression_label'] != column_expression_label: + continue + + # We accept 3 types of operations: + # 1) due and 2) deductible - This is used for reports that have lines for the payable vat and + # lines for the reclaimable vat. + # 3) total - This is used for reports that have a single line with the payable/reclaimable vat. + if operation_type in {'due', 'total'}: + total_amount += column['no_format'] + elif operation_type == 'deductible': + total_amount -= column['no_format'] + + currency = company.currency_id + total_difference = currency.round(total_amount) + + if not currency.is_zero(total_difference): + results.append({ + 'tax_name': _('Difference from rounding taxes'), + 'amount': total_difference * -1, + 'tax_group_id': tax_group_id, + 'account_id': rounding_accounts['profit'].id if total_difference < 0 else rounding_accounts['loss'].id + }) + + return results + + @api.model + def _add_tax_group_closing_items(self, tax_group_subtotal, closing_move): + """Transform the parameter tax_group_subtotal dictionnary into one2many commands. + + Used to balance the tax group accounts for the creation of the vat closing entry. + """ + def _add_line(account, name, company_currency): + self.env.cr.execute(sql_account, ( + account, + closing_move.date, + closing_move.company_id.id, + )) + result = self.env.cr.dictfetchone() + advance_balance = result.get('balance') or 0 + # Deduct/Add advance payment + if not company_currency.is_zero(advance_balance): + line_ids_vals.append((0, 0, { + 'name': name, + 'debit': abs(advance_balance) if advance_balance < 0 else 0, + 'credit': abs(advance_balance) if advance_balance > 0 else 0, + 'account_id': account + })) + return advance_balance + + currency = closing_move.company_id.currency_id + sql_account = ''' + SELECT SUM(aml.balance) AS balance + FROM account_move_line aml + LEFT JOIN account_move move ON move.id = aml.move_id + WHERE aml.account_id = %s + AND aml.date <= %s + AND move.state = 'posted' + AND aml.company_id = %s + ''' + line_ids_vals = [] + # keep track of already balanced account, as one can be used in several tax group + account_already_balanced = [] + for key, value in tax_group_subtotal.items(): + total = value + # Search if any advance payment done for that configuration + if key[0] and key[0] not in account_already_balanced: + total += _add_line(key[0], _('Balance tax advance payment account'), currency) + account_already_balanced.append(key[0]) + if key[1] and key[1] not in account_already_balanced: + total += _add_line(key[1], _('Balance tax current account (receivable)'), currency) + account_already_balanced.append(key[1]) + if key[2] and key[2] not in account_already_balanced: + total += _add_line(key[2], _('Balance tax current account (payable)'), currency) + account_already_balanced.append(key[2]) + # Balance on the receivable/payable tax account + if not currency.is_zero(total): + line_ids_vals.append(Command.create({ + 'name': _('Payable tax amount') if total < 0 else _('Receivable tax amount'), + 'debit': total if total > 0 else 0, + 'credit': abs(total) if total < 0 else 0, + 'account_id': key[2] if total < 0 else key[1] + })) + return line_ids_vals + + @api.model + def _redirect_to_misconfigured_tax_groups(self, company, countries): + """ Raises a RedirectWarning informing the user his tax groups are missing configuration + for a given company, redirecting him to the list view of account.tax.group, filtered + accordingly to the provided countries. + """ + need_config_action = { + 'type': 'ir.actions.act_window', + 'name': 'Tax groups', + 'res_model': 'account.tax.group', + 'view_mode': 'list', + 'views': [[False, 'list']], + 'domain': ['|', ('country_id', 'in', countries.ids), ('country_id', '=', False)] + } + + raise RedirectWarning( + _('Please specify the accounts necessary for the Tax Closing Entry.'), + need_config_action, + _('Configure your TAX accounts - %s', company.display_name), + ) + + def _get_fpos_info_for_tax_closing(self, company, report, options): + """ Returns the fiscal positions information to use to generate the tax closing + for this company, with the provided options. + + :return: (include_domestic, fiscal_positions), where fiscal positions is a recordset + and include_domestic is a boolean telling whether or not the domestic closing + (i.e. the one without any fiscal position) must also be performed + """ + if options['fiscal_position'] == 'domestic': + fiscal_positions = self.env['account.fiscal.position'] + elif options['fiscal_position'] == 'all': + fiscal_positions = self.env['account.fiscal.position'].search([ + *self.env['account.fiscal.position']._check_company_domain(company), + ('foreign_vat', '!=', False), + ]) + else: + fpos_ids = [options['fiscal_position']] + fiscal_positions = self.env['account.fiscal.position'].browse(fpos_ids) + + if options['fiscal_position'] == 'all': + fiscal_country = company.account_fiscal_country_id + include_domestic = not fiscal_positions \ + or not report.country_id \ + or fiscal_country == fiscal_positions[0].country_id + else: + include_domestic = options['fiscal_position'] == 'domestic' + + return include_domestic, fiscal_positions + + def _get_amls_with_archived_tags_domain(self, options): + domain = [ + ('tax_tag_ids.active', '=', False), + ('parent_state', '=', 'posted'), + ('date', '>=', options['date']['date_from']), + ] + if options['date']['mode'] == 'single': + domain.append(('date', '<=', options['date']['date_to'])) + return domain + + def action_open_amls_with_archived_tags(self, options, params=None): + return { + 'name': _("Journal items with archived tax tags"), + 'type': 'ir.actions.act_window', + 'res_model': 'account.move.line', + 'domain': self._get_amls_with_archived_tags_domain(options), + 'context': {'active_test': False}, + 'views': [(self.env.ref('odex30_account_reports.view_archived_tag_move_tree').id, 'list')], + } + + +class GenericTaxReportCustomHandler(models.AbstractModel): + _name = 'account.generic.tax.report.handler' + _inherit = 'account.tax.report.handler' + _description = 'Generic Tax Report Custom Handler' + + def _get_custom_display_config(self): + parent_config = super()._get_custom_display_config() + parent_config['css_custom_class'] = 'generic_tax_report' + parent_config['templates']['AccountReportLineName'] = 'odex30_account_reports.TaxReportLineName' + + return parent_config + + def _custom_options_initializer(self, report, options, previous_options=None): + super()._custom_options_initializer(report, options, previous_options=previous_options) + + # We are on the generic tax report (no country) and the user can not change the fiscal position so we show them all. + if not report.country_id and len(options['available_vat_fiscal_positions']) <= (0 if options['allow_domestic'] else 1) and len(options['companies']) <= 1: + options['allow_domestic'] = False + options['fiscal_position'] = 'all' + + def _dynamic_lines_generator(self, report, options, all_column_groups_expression_totals, warnings=None): + return self._get_dynamic_lines(report, options, 'default', warnings) + + def _caret_options_initializer(self): + return { + 'generic_tax_report': [ + {'name': _("Audit"), 'action': 'caret_option_audit_tax'}, + ] + } + + def _get_dynamic_lines(self, report, options, grouping, warnings=None): + """ Compute the report lines for the generic tax report. + + :param options: The report options. + :return: A list of lines, each one being a python dictionary. + """ + options_by_column_group = report._split_options_per_column_group(options) + + # Compute tax_base_amount / tax_amount for each selected groupby. + if grouping == 'tax_account': + groupby_fields = [('src_tax', 'type_tax_use'), ('src_tax', 'id'), ('account', 'id')] + comodels = [None, 'account.tax', 'account.account'] + elif grouping == 'account_tax': + groupby_fields = [('src_tax', 'type_tax_use'), ('account', 'id'), ('src_tax', 'id')] + comodels = [None, 'account.account', 'account.tax'] + else: + groupby_fields = [('src_tax', 'type_tax_use'), ('src_tax', 'id')] + comodels = [None, 'account.tax'] + + if grouping in ('tax_account', 'account_tax'): + tax_amount_hierarchy = self._read_generic_tax_report_amounts(report, options_by_column_group, groupby_fields) + else: + tax_amount_hierarchy = self._read_generic_tax_report_amounts_no_tax_details(report, options, options_by_column_group) + + + # Fetch involved records in order to ensure all lines are sorted according the comodel order. + # To do so, we compute 'sorting_map_list' allowing to retrieve each record by id and the order + # to be used. + record_ids_gb = [set() for dummy in groupby_fields] + + def populate_record_ids_gb_recursively(node, level=0): + for k, v in node.items(): + if k: + record_ids_gb[level].add(k) + if v.get('children'): + populate_record_ids_gb_recursively(v['children'], level=level + 1) + + populate_record_ids_gb_recursively(tax_amount_hierarchy) + + sorting_map_list = [] + for i, comodel in enumerate(comodels): + if comodel: + # Relational records. + records = self.env[comodel].with_context(active_test=False).search([('id', 'in', tuple(record_ids_gb[i]))]) + sorting_map = {r.id: (r, j) for j, r in enumerate(records)} + sorting_map_list.append(sorting_map) + else: + # src_tax_type_tax_use. + selection = self.env['account.tax']._fields['type_tax_use']._description_selection(self.env) + sorting_map_list.append({v[0]: (v, j) for j, v in enumerate(selection) if v[0] in record_ids_gb[i]}) + + # Compute report lines. + lines = [] + self._populate_lines_recursively( + report, + options, + lines, + sorting_map_list, + groupby_fields, + tax_amount_hierarchy, + warnings=warnings, + ) + return lines + + + # ------------------------------------------------------------------------- + # GENERIC TAX REPORT COMPUTATION (DYNAMIC LINES) + # ------------------------------------------------------------------------- + + @api.model + def _read_generic_tax_report_amounts_no_tax_details(self, report, options, options_by_column_group): + # Fetch the group of taxes. + # If all child taxes have a 'none' type_tax_use, all amounts are aggregated and only the group appears on the report. + company_ids = report.get_report_company_ids(options) + company_domain = self.env['account.tax']._check_company_domain(company_ids) + company_where_query = self.env['account.tax'].with_context(active_test=False)._where_calc(company_domain) + self._cr.execute(SQL( + ''' + SELECT + account_tax.id, + account_tax.type_tax_use, + ARRAY_AGG(child_tax.id) AS child_tax_ids, + ARRAY_AGG(DISTINCT child_tax.type_tax_use) AS child_types + FROM account_tax_filiation_rel account_tax_rel + JOIN account_tax ON account_tax.id = account_tax_rel.parent_tax + JOIN account_tax child_tax ON child_tax.id = account_tax_rel.child_tax + WHERE account_tax.amount_type = 'group' + AND %s + GROUP BY account_tax.id + ''', company_where_query.where_clause or SQL("TRUE") + )) + group_of_taxes_info = {} + child_to_group_of_taxes = {} + for row in self._cr.dictfetchall(): + row['to_expand'] = row['child_types'] != ['none'] + group_of_taxes_info[row['id']] = row + for child_id in row['child_tax_ids']: + child_to_group_of_taxes[child_id] = row['id'] + + results = defaultdict(lambda: { # key: type_tax_use + 'base_amount': {column_group_key: 0.0 for column_group_key in options['column_groups']}, + 'tax_amount': {column_group_key: 0.0 for column_group_key in options['column_groups']}, + 'tax_non_deductible': {column_group_key: 0.0 for column_group_key in options['column_groups']}, + 'tax_deductible': {column_group_key: 0.0 for column_group_key in options['column_groups']}, + 'tax_due': {column_group_key: 0.0 for column_group_key in options['column_groups']}, + 'children': defaultdict(lambda: { # key: tax_id + 'base_amount': {column_group_key: 0.0 for column_group_key in options['column_groups']}, + 'tax_amount': {column_group_key: 0.0 for column_group_key in options['column_groups']}, + 'tax_non_deductible': {column_group_key: 0.0 for column_group_key in options['column_groups']}, + 'tax_deductible': {column_group_key: 0.0 for column_group_key in options['column_groups']}, + 'tax_due': {column_group_key: 0.0 for column_group_key in options['column_groups']}, + }), + }) + + for column_group_key, options in options_by_column_group.items(): + query = report._get_report_query(options, 'strict_range') + # make sure account_move is always joined + if 'account_move_line__move_id' not in query._joins: + query.join('account_move_line', 'move_id', 'account_move', 'id', 'move_id') + + # Fetch the base amounts. + self._cr.execute(SQL( + ''' + SELECT + tax.id AS tax_id, + tax.type_tax_use AS tax_type_tax_use, + src_group_tax.id AS src_group_tax_id, + src_group_tax.type_tax_use AS src_group_tax_type_tax_use, + src_tax.id AS src_tax_id, + src_tax.type_tax_use AS src_tax_type_tax_use, + SUM(account_move_line.balance) AS base_amount + FROM %(table_references)s + JOIN account_move_line_account_tax_rel tax_rel ON account_move_line.id = tax_rel.account_move_line_id + JOIN account_tax tax ON tax.id = tax_rel.account_tax_id + LEFT JOIN account_tax src_tax ON src_tax.id = account_move_line.tax_line_id + LEFT JOIN account_tax src_group_tax ON src_group_tax.id = account_move_line.group_tax_id + WHERE %(search_condition)s + AND ( + /* CABA */ + account_move_line__move_id.always_tax_exigible + OR account_move_line__move_id.tax_cash_basis_rec_id IS NOT NULL + OR tax.tax_exigibility != 'on_payment' + ) + AND ( + ( + /* Tax lines affecting the base of others. */ + account_move_line.tax_line_id IS NOT NULL + AND ( + src_tax.type_tax_use IN ('sale', 'purchase') + OR src_group_tax.type_tax_use IN ('sale', 'purchase') + ) + ) + OR + ( + /* For regular base lines. */ + account_move_line.tax_line_id IS NULL + AND tax.type_tax_use IN ('sale', 'purchase') + ) + ) + GROUP BY tax.id, src_group_tax.id, src_tax.id + ORDER BY src_group_tax.sequence, src_group_tax.id, src_tax.sequence, src_tax.id, tax.sequence, tax.id + ''', + table_references=query.from_clause, + search_condition=query.where_clause, + )) + + group_of_taxes_with_extra_base_amount = set() + for row in self._cr.dictfetchall(): + is_tax_line = bool(row['src_tax_id']) + if is_tax_line: + if row['src_group_tax_id'] \ + and not group_of_taxes_info[row['src_group_tax_id']]['to_expand'] \ + and row['tax_id'] in group_of_taxes_info[row['src_group_tax_id']]['child_tax_ids']: + # Suppose a base of 1000 with a group of taxes 20% affect + 10%. + # The base of the group of taxes must be 1000, not 1200 because the group of taxes is not + # expanded. So the tax lines affecting the base of its own group of taxes are ignored. + pass + elif row['tax_type_tax_use'] == 'none' and child_to_group_of_taxes.get(row['tax_id']): + # The tax line is affecting the base of a 'none' tax belonging to a group of taxes. + # In that case, the amount is accounted as an extra base for that group. However, we need to + # account it only once. + # For example, suppose a tax 10% affect base of subsequent followed by a group of taxes + # 20% + 30%. On a base of 1000.0, the tax line for 10% will affect the base of 20% + 30%. + # However, this extra base must be accounted only once since the base of the group of taxes + # must be 1100.0 and not 1200.0. + group_tax_id = child_to_group_of_taxes[row['tax_id']] + if group_tax_id not in group_of_taxes_with_extra_base_amount: + group_tax_info = group_of_taxes_info[group_tax_id] + results[group_tax_info['type_tax_use']]['children'][group_tax_id]['base_amount'][column_group_key] += row['base_amount'] + group_of_taxes_with_extra_base_amount.add(group_tax_id) + else: + tax_type_tax_use = row['src_group_tax_type_tax_use'] or row['src_tax_type_tax_use'] + results[tax_type_tax_use]['children'][row['tax_id']]['base_amount'][column_group_key] += row['base_amount'] + else: + if row['tax_id'] in group_of_taxes_info and group_of_taxes_info[row['tax_id']]['to_expand']: + # Expand the group of taxes since it contains at least one tax with a type != 'none'. + group_info = group_of_taxes_info[row['tax_id']] + for child_tax_id in group_info['child_tax_ids']: + results[group_info['type_tax_use']]['children'][child_tax_id]['base_amount'][column_group_key] += row['base_amount'] + else: + results[row['tax_type_tax_use']]['children'][row['tax_id']]['base_amount'][column_group_key] += row['base_amount'] + + # Fetch the tax amounts. + + select_deductible = join_deductible = group_by_deductible = SQL() + if options.get('account_journal_report_tax_deductibility_columns'): + select_deductible = SQL(""", repartition.use_in_tax_closing AS trl_tax_closing + , SIGN(repartition.factor_percent) AS trl_factor""") + join_deductible = SQL("""JOIN account_tax_repartition_line repartition + ON account_move_line.tax_repartition_line_id = repartition.id""") + group_by_deductible = SQL(', repartition.use_in_tax_closing, SIGN(repartition.factor_percent)') + + self._cr.execute(SQL( + ''' + SELECT + tax.id AS tax_id, + tax.type_tax_use AS tax_type_tax_use, + group_tax.id AS group_tax_id, + group_tax.type_tax_use AS group_tax_type_tax_use, + SUM(account_move_line.balance) AS tax_amount + %(select_deductible)s + FROM %(table_references)s + JOIN account_tax tax ON tax.id = account_move_line.tax_line_id + %(join_deductible)s + LEFT JOIN account_tax group_tax ON group_tax.id = account_move_line.group_tax_id + WHERE %(search_condition)s + AND ( + /* CABA */ + account_move_line__move_id.always_tax_exigible + OR account_move_line__move_id.tax_cash_basis_rec_id IS NOT NULL + OR tax.tax_exigibility != 'on_payment' + ) + AND ( + (group_tax.id IS NULL AND tax.type_tax_use IN ('sale', 'purchase')) + OR + (group_tax.id IS NOT NULL AND group_tax.type_tax_use IN ('sale', 'purchase')) + ) + GROUP BY tax.id, group_tax.id %(group_by_deductible)s + ''', + select_deductible=select_deductible, + table_references=query.from_clause, + join_deductible=join_deductible, + search_condition=query.where_clause, + group_by_deductible=group_by_deductible, + )) + + for row in self._cr.dictfetchall(): + # Manage group of taxes. + # In case the group of taxes is mixing multiple taxes having a type_tax_use != 'none', consider + # them instead of the group. + tax_id = row['tax_id'] + if row['group_tax_id']: + tax_type_tax_use = row['group_tax_type_tax_use'] + if not group_of_taxes_info[row['group_tax_id']]['to_expand']: + tax_id = row['group_tax_id'] + else: + tax_type_tax_use = row['group_tax_type_tax_use'] or row['tax_type_tax_use'] + + results[tax_type_tax_use]['tax_amount'][column_group_key] += row['tax_amount'] + results[tax_type_tax_use]['children'][tax_id]['tax_amount'][column_group_key] += row['tax_amount'] + + if options.get('account_journal_report_tax_deductibility_columns'): + tax_detail_label = False + if row['trl_factor'] > 0 and tax_type_tax_use == 'purchase': + tax_detail_label = 'tax_deductible' if row['trl_tax_closing'] else 'tax_non_deductible' + elif row['trl_tax_closing'] and (row['trl_factor'] > 0, tax_type_tax_use) in ((False, 'purchase'), (True, 'sale')): + tax_detail_label = 'tax_due' + + if tax_detail_label: + results[tax_type_tax_use][tax_detail_label][column_group_key] += row['tax_amount'] * row['trl_factor'] + results[tax_type_tax_use]['children'][tax_id][tax_detail_label][column_group_key] += row['tax_amount'] * row['trl_factor'] + + return results + + def _read_generic_tax_report_amounts(self, report, options_by_column_group, groupby_fields): + """ Read the tax details to compute the tax amounts. + + :param options_list: The list of report options, one for each period. + :param groupby_fields: A list of tuple (alias, field) representing the way the amounts must be grouped. + :return: A dictionary mapping each groupby key (e.g. a tax_id) to a sub dictionary containing: + + base_amount: The tax base amount expressed in company's currency. + tax_amount The tax amount expressed in company's currency. + children: The children nodes following the same pattern as the current dictionary. + """ + fetch_group_of_taxes = False + + select_clause_list = [] + groupby_query_list = [] + for alias, field in groupby_fields: + select_clause_list.append(SQL("%s AS %s", SQL.identifier(alias, field), SQL.identifier(f'{alias}_{field}'))) + groupby_query_list.append(SQL.identifier(alias, field)) + + # Fetch both info from the originator tax and the child tax to manage the group of taxes. + if alias == 'src_tax': + select_clause_list.append(SQL("%s AS %s", SQL.identifier('tax', field), SQL.identifier(f'tax_{field}'))) + groupby_query_list.append(SQL.identifier('tax', field)) + fetch_group_of_taxes = True + + # Fetch the group of taxes. + # If all children taxes are 'none', all amounts are aggregated and only the group will appear on the report. + # If some children taxes are not 'none', the children are displayed. + group_of_taxes_to_expand = set() + if fetch_group_of_taxes: + group_of_taxes = self.env['account.tax'].with_context(active_test=False).search([('amount_type', '=', 'group')]) + for group in group_of_taxes: + if set(group.children_tax_ids.mapped('type_tax_use')) != {'none'}: + group_of_taxes_to_expand.add(group.id) + + res = {} + for column_group_key, options in options_by_column_group.items(): + query = report._get_report_query(options, 'strict_range') + tax_details_query = self.env['account.move.line']._get_query_tax_details(query.from_clause, query.where_clause) + + # Avoid adding multiple times the same base amount sharing the same grouping_key. + # It could happen when dealing with group of taxes for example. + row_keys = set() + + self._cr.execute(SQL( + ''' + SELECT + %(select_clause)s, + trl.document_type = 'refund' AS is_refund, + SUM(CASE WHEN tdr.display_type = 'rounding' THEN 0 ELSE tdr.base_amount END) AS base_amount, + SUM(tdr.tax_amount) AS tax_amount + FROM (%(tax_details_query)s) AS tdr + JOIN account_tax_repartition_line trl ON trl.id = tdr.tax_repartition_line_id + JOIN account_tax tax ON tax.id = tdr.tax_id + JOIN account_tax src_tax ON + src_tax.id = COALESCE(tdr.group_tax_id, tdr.tax_id) + AND src_tax.type_tax_use IN ('sale', 'purchase') + JOIN account_account account ON account.id = tdr.base_account_id + WHERE tdr.tax_exigible + GROUP BY tdr.tax_repartition_line_id, trl.document_type, %(groupby_query)s + ORDER BY src_tax.sequence, src_tax.id, tax.sequence, tax.id + ''', + select_clause=SQL(',').join(select_clause_list), + tax_details_query=tax_details_query, + groupby_query=SQL(',').join(groupby_query_list), + )) + + for row in self._cr.dictfetchall(): + node = res + + # tuple of values used to prevent adding multiple times the same base amount. + cumulated_row_key = [row['is_refund']] + + for alias, field in groupby_fields: + grouping_key = f'{alias}_{field}' + + # Manage group of taxes. + # In case the group of taxes is mixing multiple taxes having a type_tax_use != 'none', consider + # them instead of the group. + if grouping_key == 'src_tax_id' and row['src_tax_id'] in group_of_taxes_to_expand: + # Add the originator group to the grouping key, to make sure that its base amount is not + # treated twice, for hybrid cases where a tax is both used in a group and independently. + cumulated_row_key.append(row[grouping_key]) + + # Ensure the child tax is used instead of the group. + grouping_key = 'tax_id' + + row_key = row[grouping_key] + cumulated_row_key.append(row_key) + cumulated_row_key_tuple = tuple(cumulated_row_key) + + node.setdefault(row_key, { + 'base_amount': {column_group_key: 0.0 for column_group_key in options['column_groups']}, + 'tax_amount': {column_group_key: 0.0 for column_group_key in options['column_groups']}, + 'children': {}, + }) + sub_node = node[row_key] + + # Add amounts. + if cumulated_row_key_tuple not in row_keys: + sub_node['base_amount'][column_group_key] += row['base_amount'] + sub_node['tax_amount'][column_group_key] += row['tax_amount'] + + node = sub_node['children'] + row_keys.add(cumulated_row_key_tuple) + + return res + + def _populate_lines_recursively(self, report, options, lines, sorting_map_list, groupby_fields, values_node, index=0, type_tax_use=None, parent_line_id=None, warnings=None): + ''' Populate the list of report lines passed as parameter recursively. At this point, every amounts is already + fetched for every periods and every groupby. + + :param options: The report options. + :param lines: The list of report lines to populate. + :param sorting_map_list: A list of dictionary mapping each encountered key with a weight to sort the results. + :param index: The index of the current element to process (also equals to the level into the hierarchy). + :param groupby_fields: A list of tuple defining in which way tax amounts should be grouped. + :param values_node: The node containing the amounts and children into the hierarchy. + :param type_tax_use: The type_tax_use of the tax. + :param parent_line_id: The line id of the parent line (if any) + :param warnings The warnings dictionnary. + ''' + if index == len(groupby_fields): + return + + alias, field = groupby_fields[index] + groupby_key = f'{alias}_{field}' + + # Sort the keys in order to add the lines in the same order as the records. + sorting_map = sorting_map_list[index] + sorted_keys = sorted(list(values_node.keys()), key=lambda x: sorting_map[x][1]) + + for key in sorted_keys: + + # Compute 'type_tax_use' with the first grouping since 'src_tax_type_tax_use' is always + # the first one. + if groupby_key == 'src_tax_type_tax_use': + type_tax_use = key + sign = -1 if type_tax_use == 'sale' else 1 + + # Prepare columns. + tax_amount_dict = values_node[key] + columns = [] + tax_base_amounts = tax_amount_dict['base_amount'] + tax_amounts = tax_amount_dict['tax_amount'] + + for column in options['columns']: + tax_base_amount = tax_base_amounts[column['column_group_key']] + tax_amount = tax_amounts[column['column_group_key']] + + expr_label = column.get('expression_label') + col_value = '' + + if expr_label == 'net' and index == len(groupby_fields) - 1: + col_value = sign * tax_base_amount + + if expr_label == 'tax': + col_value = sign * tax_amount + + columns.append(report._build_column_dict(col_value, column, options=options)) + + # Add the non-deductible, deductible and due tax amounts. + if expr_label == 'tax' and options.get('account_journal_report_tax_deductibility_columns'): + for deduct_type in ('tax_non_deductible', 'tax_deductible', 'tax_due'): + columns.append(report._build_column_dict( + col_value=sign * tax_amount_dict[deduct_type][column['column_group_key']], + col_data={ + 'figure_type': 'monetary', + 'column_group_key': column['column_group_key'], + 'expression_label': deduct_type, + }, + options=options, + )) + + # Prepare line. + default_vals = { + 'columns': columns, + 'level': index if index == 0 else index + 1, + 'unfoldable': False, + } + report_line = self._build_report_line(report, options, default_vals, groupby_key, sorting_map[key][0], parent_line_id, warnings) + + if groupby_key == 'src_tax_id': + report_line['caret_options'] = 'generic_tax_report' + + lines.append((0, report_line)) + + # Process children recursively. + self._populate_lines_recursively( + report, + options, + lines, + sorting_map_list, + groupby_fields, + tax_amount_dict.get('children'), + index=index + 1, + type_tax_use=type_tax_use, + parent_line_id=report_line['id'], + warnings=warnings, + ) + + def _build_report_line(self, report, options, default_vals, groupby_key, value, parent_line_id, warnings=None): + """ Build the report line accordingly to its type. + :param options: The report options. + :param default_vals: The pre-computed report line values. + :param groupby_key: The grouping_key record. + :param value: The value that could be a record. + :param parent_line_id The line id of the parent line (if any, can be None otherwise) + :param warnings: The warnings dictionary. + :return: A python dictionary. + """ + report_line = dict(default_vals) + if parent_line_id is not None: + report_line['parent_id'] = parent_line_id + + if groupby_key == 'src_tax_type_tax_use': + type_tax_use_option = value + report_line['id'] = report._get_generic_line_id(None, None, markup=type_tax_use_option[0], parent_line_id=parent_line_id) + report_line['name'] = type_tax_use_option[1] + + elif groupby_key == 'src_tax_id': + tax = value + report_line['id'] = report._get_generic_line_id(tax._name, tax.id, parent_line_id=parent_line_id) + + if tax.amount_type == 'percent': + report_line['name'] = f"{tax.name} ({tax.amount}%)" + + if warnings is not None: + self._check_line_consistency(report, options, report_line, tax, warnings) + elif tax.amount_type == 'fixed': + report_line['name'] = f"{tax.name} ({tax.amount})" + else: + report_line['name'] = tax.name + + if options.get('multi-company'): + report_line['name'] = f"{report_line['name']} - {tax.company_id.display_name}" + + elif groupby_key == 'account_id': + account = value + report_line['id'] = report._get_generic_line_id(account._name, account.id, parent_line_id=parent_line_id) + + if options.get('multi-company'): + report_line['name'] = f"{account.display_name} - {account.company_id.display_name}" + else: + report_line['name'] = account.display_name + + return report_line + + def _check_line_consistency(self, report, options, report_line, tax, warnings=None): + tax_applied = tax.amount * sum(tax.invoice_repartition_line_ids.filtered(lambda tax_rep: tax_rep.repartition_type == 'tax').mapped('factor')) / 100 + + for column_group_key, column_group_options in report._split_options_per_column_group(options).items(): + net_value = next((col['no_format'] for col in report_line['columns'] if col['column_group_key'] == column_group_key and col['expression_label'] == 'net'), 0) + tax_value = next((col['no_format'] for col in report_line['columns'] if col['column_group_key'] == column_group_key and col['expression_label'] == 'tax'), 0) + + if net_value == '': # noqa: PLC1901 + continue + + currency = self.env.company.currency_id + computed_tax_amount = float(net_value or 0) * tax_applied + is_inconsistent = currency.compare_amounts(computed_tax_amount, tax_value) + + if is_inconsistent: + error = abs(abs(tax_value) - abs(computed_tax_amount)) / float(net_value or 1) + + # Error is bigger than 0.1%. We can not ignore it. + if error > 0.001: + report_line['alert'] = True + warnings['odex30_account_reports.tax_report_warning_lines_consistency'] = {'alert_type': 'danger'} + + return + + # ------------------------------------------------------------------------- + # BUTTONS & CARET OPTIONS + # ------------------------------------------------------------------------- + + def caret_option_audit_tax(self, options, params): + report = self.env['account.report'].browse(options['report_id']) + model, tax_id = report._get_model_info_from_id(params['line_id']) + + if model != 'account.tax': + raise UserError(_("Cannot audit tax from another model than account.tax.")) + + tax = self.env['account.tax'].browse(tax_id) + + if tax.amount_type == 'group': + tax_affecting_base_domain = [ + ('tax_ids', 'in', tax.children_tax_ids.ids), + ('tax_repartition_line_id', '!=', False), + ] + else: + tax_affecting_base_domain = [ + ('tax_ids', '=', tax.id), + ('tax_ids.type_tax_use', '=', tax.type_tax_use), + ('tax_repartition_line_id', '!=', False), + ] + + domain = report._get_options_domain(options, 'strict_range') + expression.OR(( + # Base lines + [ + ('tax_ids', 'in', tax.ids), + ('tax_ids.type_tax_use', '=', tax.type_tax_use), + ('tax_repartition_line_id', '=', False), + ], + # Tax lines + [ + ('group_tax_id', '=', tax.id) if tax.amount_type == 'group' else ('tax_line_id', '=', tax.id), + ], + # Tax lines acting as base lines + tax_affecting_base_domain, + )) + + ctx = self._context.copy() + ctx.update({'search_default_group_by_account': 2, 'expand': 1}) + + return { + 'type': 'ir.actions.act_window', + 'name': _('Journal Items for Tax Audit'), + 'res_model': 'account.move.line', + 'views': [[self.env.ref('account.view_move_line_tax_audit_tree').id, 'list']], + 'domain': domain, + 'context': ctx, + } + + +class GenericTaxReportCustomHandlerAT(models.AbstractModel): + _name = 'account.generic.tax.report.handler.account.tax' + _inherit = 'account.generic.tax.report.handler' + _description = 'Generic Tax Report Custom Handler (Account -> Tax)' + + def _dynamic_lines_generator(self, report, options, all_column_groups_expression_totals, warnings=None): + return super()._get_dynamic_lines(report, options, 'account_tax', warnings) + + +class GenericTaxReportCustomHandlerTA(models.AbstractModel): + _name = 'account.generic.tax.report.handler.tax.account' + _inherit = 'account.generic.tax.report.handler' + _description = 'Generic Tax Report Custom Handler (Tax -> Account)' + + def _dynamic_lines_generator(self, report, options, all_column_groups_expression_totals, warnings=None): + return super()._get_dynamic_lines(report, options, 'tax_account', warnings) diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_journal_dashboard.py b/dev_odex30_accounting/odex30_account_reports/models/account_journal_dashboard.py new file mode 100644 index 0000000..0b93785 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_journal_dashboard.py @@ -0,0 +1,28 @@ +from odoo import models + +import ast + + +class AccountJournal(models.Model): + _inherit = 'account.journal' + + def _fill_general_dashboard_data(self, dashboard_data): + super()._fill_general_dashboard_data(dashboard_data) + for journal in self.filtered(lambda journal: journal.type == 'general'): + dashboard_data[journal.id]['is_account_tax_periodicity_journal'] = journal == journal.company_id._get_tax_closing_journal() + + def action_open_bank_balance_in_gl(self): + + self.ensure_one() + action = self.env["ir.actions.actions"]._for_xml_id("odex30_account_reports.action_account_report_general_ledger") + + action['context'] = dict(ast.literal_eval(action['context']), default_filter_accounts=self.default_account_id.code) + + return action + + def _transform_activity_dict(self, activity_data): + error_type_id = self.env['ir.model.data']._xmlid_to_res_id('odex30_account_reports.mail_activity_type_tax_report_error', raise_if_not_found=False) + return { + **super()._transform_activity_dict(activity_data), + 'is_tax_report_error': error_type_id and activity_data['act_type_id'] == error_type_id, + } diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_journal_report.py b/dev_odex30_accounting/odex30_account_reports/models/account_journal_report.py new file mode 100644 index 0000000..14e6594 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_journal_report.py @@ -0,0 +1,1385 @@ +import io +import datetime + +from PIL import ImageFont +from markupsafe import Markup + +from odoo import models, _ +from odoo.tools import SQL +from odoo.tools.misc import xlsxwriter, file_path +from collections import defaultdict +from itertools import chain + +XLSX_GRAY_200 = '#EEEEEE' +XLSX_BORDER_COLOR = '#B4B4B4' +XLSX_FONT_SIZE_DEFAULT = 8 +XLSX_FONT_SIZE_HEADING = 11 + + +class JournalReportCustomHandler(models.AbstractModel): + _name = "account.journal.report.handler" + _inherit = "account.report.custom.handler" + _description = "Journal Report Custom Handler" + + def _custom_options_initializer(self, report, options, previous_options): + + # Initialise the custom option for this report. + options['ignore_totals_below_sections'] = True + options['show_payment_lines'] = previous_options.get('show_payment_lines', True) + + def _get_custom_display_config(self): + return { + 'css_custom_class': 'journal_report', + 'pdf_css_custom_class': 'journal_report_pdf', + 'components': { + 'AccountReportLine': 'odex30_account_reports.JournalReportLine', + }, + 'templates': { + 'AccountReportFilters': 'odex30_account_reports.JournalReportFilters', + 'AccountReportLineName': 'odex30_account_reports.JournalReportLineName', + }, + 'pdf_export': { + 'pdf_export_main': 'odex30_account_reports.journal_report_pdf_export_main', + }, + } + + + def _report_custom_engine_journal_report(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + + def build_result_dict(current_groupby, query_line): + """ + Creates a line entry used by the custom engine + """ + if current_groupby == 'account_id': + code = query_line['account_code'][0] + elif current_groupby == 'journal_id': + code = query_line['journal_code'][0] + else: + code = None + + result_line_dict = { + 'code': code, + 'credit': query_line['credit'], + 'debit': query_line['debit'], + 'balance': query_line['balance'] if current_groupby == 'account_id' else None + } + return query_line['grouping_key'], result_line_dict + + report = self.env['account.report'].browse(options['report_id']) + report._check_groupby_fields((next_groupby.split(',') if next_groupby else []) + ([current_groupby] if current_groupby else [])) + + # If it is the first line, we want to render our column label + # Since we don't use the one from the base report + if not current_groupby: + return { + 'code': None, + 'debit': None, + 'credit': None, + 'balance': None + } + + query = report._get_report_query(options, 'strict_range') + account_alias = query.join( + lhs_alias='account_move_line', + lhs_column='account_id', + rhs_table='account_account', + rhs_column='id', + link='account_id_for_code', # Custom link name to avoid potential alias clash with what is generated by _field_to_sql for the groupby below + ) + account_code = self.env['account.account']._field_to_sql(account_alias, 'code', query) + + groupby_clause = self.env['account.move.line']._field_to_sql('account_move_line', current_groupby, query) + select_from_groupby = SQL('%s AS grouping_key', groupby_clause) + + query = SQL( + """ + SELECT + %(select_from_groupby)s, + ARRAY_AGG(DISTINCT %(account_code)s) AS account_code, + ARRAY_AGG(DISTINCT j.code) AS journal_code, + SUM("account_move_line".debit) AS debit, + SUM("account_move_line".credit) AS credit, + SUM("account_move_line".balance) AS balance + FROM %(table)s + JOIN account_move am ON am.id = account_move_line.move_id + JOIN account_journal j ON j.id = am.journal_id + JOIN res_company cp ON cp.id = am.company_id + WHERE %(case_statement)s AND %(search_conditions)s + GROUP BY %(groupby_clause)s + ORDER BY %(groupby_clause)s + """, + select_from_groupby=select_from_groupby, + account_code=account_code, + table=query.from_clause, + search_conditions=query.where_clause, + case_statement=self._get_payment_lines_filter_case_statement(options), + groupby_clause=groupby_clause + ) + self._cr.execute(query) + query_lines = self._cr.dictfetchall() + result_lines = [] + + for query_line in query_lines: + result_lines.append(build_result_dict(current_groupby, query_line)) + + return result_lines + + def _custom_line_postprocessor(self, report, options, lines): + + new_lines = [] + + if not lines: + return new_lines + + for i, line in enumerate(lines): + new_lines.append(line) + line_id = line['id'] + + line_model, res_id = report._get_model_info_from_id(line_id) + if line_model == 'account.journal': + line['journal_id'] = res_id + elif line_model == 'account.account': + res_ids_map = report._get_res_ids_from_line_id(line_id, ['account.journal', 'account.account']) + line['journal_id'] = res_ids_map['account.journal'] + line['account_id'] = res_ids_map['account.account'] + line['date'] = options['date'] + + journal = self.env['account.journal'].browse(line['journal_id']) + + # If it is the last line of the journal section + # Check if the journal has taxes and if so, add the tax summaries + if (i + 1 == len(lines) or (i + 1 < len(lines) and report._get_model_info_from_id(lines[i + 1]['id'])[0] != 'account.account')) and self._section_has_tax(options, journal.id): + tax_summary_line = { + 'id': report._get_generic_line_id(False, False, parent_line_id=line['parent_id'], markup='tax_report_section'), + 'name': '', + 'parent_id': line['parent_id'], + 'journal_id': journal.id, + 'is_tax_section_line': True, + 'columns': [], + 'colspan': len(options['columns']) + 1, + 'level': 4, + **self._get_tax_summary_section(options, {'id': journal.id, 'type': journal.type}) + } + new_lines.append(tax_summary_line) + + # If we render the first level it means that we need to render + # the global tax summary lines + if report._get_model_info_from_id(lines[0]['id'])[0] == 'account.report.line': + if self._section_has_tax(options, False): + # We only add the global summary line if it has taxes + new_lines.append({ + 'id': report._get_generic_line_id(False, False, markup='tax_report_section_heading'), + 'name': _('Global Tax Summary'), + 'level': 0, + 'columns': [], + 'unfoldable': False, + 'colspan': len(options['columns']) + 1 + # We want it to take the whole line. It makes it easier to unfold it. + }) + summary_line = { + 'id': report._get_generic_line_id(False, False, markup='tax_report_section'), + 'name': '', + 'is_tax_section_line': True, + 'columns': [], + 'colspan': len(options['columns']) + 1, + 'level': 4, + 'class': 'o_odex30_account_reports_ja_subtable', + **self._get_tax_summary_section(options) + } + new_lines.append(summary_line) + + return new_lines + + def format_column_values_from_client(self, options, lines): + """ + Format column values for journal reports, including tax summary sections. + Called via dispatch_report_action when rounding unit changes on client side. + """ + report = self.env['account.report'].browse(options['report_id']) + for line_dict in lines: + if line_dict.get('is_tax_section_line'): + self._format_tax_summary_line(report, options, line_dict) + + return report.format_column_values_from_client(options, lines) + + def _format_tax_summary_line(self, report, options, line_dict): + """ Apply formatting to tax summary monetary values based on current options. """ + # Format tax_report_lines (individual tax details) + tax_report_lines = line_dict.get('tax_report_lines') + if tax_report_lines: + monetary_fields = ['base_amount', 'tax_amount', 'tax_non_deductible', 'tax_deductible', 'tax_due'] + for tax_line in chain.from_iterable(tax_report_lines.values()): + for field in monetary_fields: + no_format_field = f'{field}_no_format' + no_format_value = tax_line.get(no_format_field) + if no_format_value is not None: + tax_line[field] = report.format_value(options, no_format_value, figure_type='monetary') + + # Format tax_grid_summary_lines (tax grid summaries) + tax_grid_lines = line_dict.get('tax_grid_summary_lines') + if tax_grid_lines: + for country_grids in tax_grid_lines.values(): + for grid_line in country_grids.values(): + plus = grid_line.get('+_no_format', 0) + minus = grid_line.get('-_no_format', 0) + grid_line['+'] = report.format_value(options, plus, figure_type='monetary') + grid_line['-'] = report.format_value(options, minus, figure_type='monetary') + grid_line['impact'] = report.format_value(options, plus - minus, figure_type='monetary') + + ########################################################################## + # PDF Export + ########################################################################## + + def export_to_pdf(self, options): + """ + Overrides the default export_to_pdf function from account.report to + not use the default lines system since we make a different report + from the UI + """ + report = self.env['account.report'].browse(options['report_id']) + base_url = report.get_base_url() + print_options = { + **report.get_options(previous_options={**options, 'export_mode': 'print'}), + 'css_custom_class': self._get_custom_display_config().get('pdf_css_custom_class', 'journal_report_pdf') + } + rcontext = { + 'mode': 'print', + 'base_url': base_url, + 'company': self.env.company, + } + + footer = self.env['ir.actions.report']._render_template('odex30_account_reports.internal_layout', values=rcontext) + footer = self.env['ir.actions.report']._render_template('web.minimal_layout', values=dict(rcontext, subst=True, body=Markup(footer.decode()))) + + document_data = self._generate_document_data_for_export(report, print_options, 'pdf') + render_values = { + 'report': report, + 'options': print_options, + 'base_url': base_url, + 'document_data': document_data + } + body = self.env['ir.qweb']._render(self._get_custom_display_config()['pdf_export']['pdf_export_main'], render_values) + + action_report = self.env['ir.actions.report'] + pdf_file_stream = io.BytesIO(action_report._run_wkhtmltopdf( + [body], + footer=footer.decode(), + landscape=False, + specific_paperformat_args={ + 'data-report-margin-top': 10, + 'data-report-header-spacing': 10, + 'data-report-margin-bottom': 15, + } + )) + + pdf_result = pdf_file_stream.getvalue() + pdf_file_stream.close() + + return { + 'file_name': report.get_default_report_filename(print_options, 'pdf'), + 'file_content': pdf_result, + 'file_type': 'pdf', + } + + ########################################################################## + # XLSX Export + ########################################################################## + + def export_to_xlsx(self, options, response=None): + """ + Overrides the default XLSX Generation from account.repor to use a custom one. + """ + output = io.BytesIO() + workbook = xlsxwriter.Workbook(output, { + 'in_memory': True, + 'strings_to_formulas': False, + }) + report = self.env['account.report'].search([('id', '=', options['report_id'])], limit=1) + print_options = report.get_options(previous_options={**options, 'export_mode': 'print'}) + document_data = self._generate_document_data_for_export(report, print_options, 'xlsx') + + # We need to use fonts to calculate column width otherwise column width would be ugly + # Using Lato as reference font is a hack and is not recommended. Customer computers don't have this font by default and so + # the generated xlsx wouldn't have this font. Since it is not by default, we preferred using Arial font as default and keep + # Lato as reference for columns width calculations. + fonts = {} + for font_size in (XLSX_FONT_SIZE_HEADING, XLSX_FONT_SIZE_DEFAULT): + fonts[font_size] = defaultdict() + for font_type in ('Reg', 'Bol', 'RegIta', 'BolIta'): + try: + lato_path = f'web/static/fonts/lato/Lato-{font_type}-webfont.ttf' + fonts[font_size][font_type] = ImageFont.truetype(file_path(lato_path), font_size) + except (OSError, FileNotFoundError): + # This won't give great result, but it will work. + fonts[font_size][font_type] = ImageFont.load_default() + + for journal_vals in document_data['journals_vals']: + cursor_x = 0 + cursor_y = 0 + + # Default sheet properties + sheet = workbook.add_worksheet(journal_vals['name'][:31]) + columns = journal_vals['columns'] + + for column in columns: + align = 'left' + if 'o_right_alignment' in column.get('class', ''): + align = 'right' + self._write_cell(cursor_x, cursor_y, column['name'], 1, False, report, fonts, workbook, sheet, XLSX_FONT_SIZE_HEADING, + True, XLSX_GRAY_200, align, 2, 2) + cursor_x = cursor_x + 1 + + # Set cursor coordinates for the table generation + cursor_y += 1 + cursor_x = 0 + for line in journal_vals['lines'][:-1]: + is_first_aml_line = False + for column in columns: + border_top = 0 if not is_first_aml_line else 1 + align = 'left' + + if line.get(column['label'], {}).get('data'): + data = line[column['label']]['data'] + is_date = isinstance(data, datetime.date) + bold = False + + if 'o_right_alignment' in column.get('class', ''): + align = 'right' + + if line[column['label']].get('class') and 'o_bold' in line[column['label']]['class']: + # if the cell has bold styling, should only be on the first line of each aml + is_first_aml_line = True + border_top = 1 + bold = True + + self._write_cell(cursor_x, cursor_y, data, 1, is_date, report, fonts, workbook, sheet, XLSX_FONT_SIZE_DEFAULT, + bold, 'white', align, 0, border_top, XLSX_BORDER_COLOR) + + else: + # Empty value + self._write_cell(cursor_x, cursor_y, '', 1, False, report, fonts, workbook, sheet, XLSX_FONT_SIZE_DEFAULT, False, + 'white', align, 0, border_top, XLSX_BORDER_COLOR) + + cursor_x += 1 + cursor_x = 0 + cursor_y += 1 + + # Draw total line + total_line = journal_vals['lines'][-1] + for column in columns: + data = '' + align = 'left' + + if total_line.get(column['label'], {}).get('data'): + data = total_line[column['label']]['data'] + + if 'o_right_alignment' in column.get('class', ''): + align = 'right' + + self._write_cell(cursor_x, cursor_y, data, 1, False, report, fonts, workbook, sheet, XLSX_FONT_SIZE_DEFAULT, True, + XLSX_GRAY_200, align, 2, 2) + cursor_x += 1 + + cursor_x = 0 + + sheet.set_default_row(20) + sheet.set_row(0, 30) + + # Tax tables drawing + if journal_vals.get('tax_summary'): + self._write_tax_summaries_to_sheet(report, workbook, sheet, fonts, len(columns) + 1, 1, journal_vals['tax_summary']) + + if document_data.get('global_tax_summary'): + self._write_tax_summaries_to_sheet( + report, + workbook, + workbook.add_worksheet(_('Global Tax Summary')[:31]), + fonts, + 0, + 0, + document_data['global_tax_summary'] + ) + + report._add_options_xlsx_sheet(workbook, [print_options]) + workbook.close() + output.seek(0) + generated_file = output.read() + output.close() + + return { + 'file_name': report.get_default_report_filename(options, 'xlsx'), + 'file_content': generated_file, + 'file_type': 'xlsx', + } + + def _write_cell(self, x, y, value, colspan, datetime, report, fonts, workbook, sheet, font_size, bold=False, + bg_color='white', align='left', border_bottom=0, border_top=0, border_color='0x000000'): + """ + Write a value to a specific cell in the sheet with specific styling + + This helps to not create style format for every use case + + :param x: The x coordinate of the cell to write in + :param y: The y coordinate of the cell to write in + :param value: The value to write + :param colspan: The number of columns to extend + :param datetime: True if the value is a date else False + :param report: The current report + :param fonts: The fonts used to calculate the size of each cells. We use Lato because we cannot get Arial but, we write in Arial since we cannot embed Lato on the worksheet + :param workbook: The workbook currently using + :param sheet: The sheet from the workbook to write on + :param font_size: The font size to write with + :param bold: True if the written value should be bold default: False + :param bg_color: The background color of the cell in hex or string ex: '#fff' default: 'white' + :param align: The alignement of the text ex: 'left', 'right', 'center' default: 'left' + :param border_bottom: The width of the bottom border default: 0 + :param border_top: The width of the top border default: 0 + :param border_color: The color of the borders in hex or string default: '0x000' + """ + style = workbook.add_format({ + 'font_name': 'Arial', + 'font_size': font_size, + 'bold': bold, + 'bg_color': bg_color, + 'align': align, + 'bottom': border_bottom, + 'top': border_top, + 'border_color': border_color, + }) + + if colspan == 1: + if datetime: + style.set_num_format('yyyy-mm-dd') + sheet.write_datetime(y, x, value, style) + else: + # Some account_move_lines cells can have multiple lines: one for the title then some additional lines for text. + # On Xlsx it's better to keep everything on one line so when you click on cell, all the value is shown and not juste the title + if isinstance(value, str): + value = value.replace('\n', ' ') + report._set_xlsx_cell_sizes(sheet, fonts[font_size], x, y, value, style, colspan > 1) + sheet.write(y, x, value, style) + else: + sheet.merge_range(y, x, y, x + colspan - 1, value, style) + + def _write_tax_summaries_to_sheet(self, report, workbook, sheet, fonts, start_x, start_y, tax_summary): + cursor_x = start_x + cursor_y = start_y + + # Tax applied + columns = [] + taxes = tax_summary.get('tax_report_lines') + if taxes: + start_align_right = start_x + 1 + + if len(taxes) > 1: + start_align_right += 1 + columns.append(_('Country')) + + columns += [_('Name'), _('Base Amount'), _('Tax Amount')] + if tax_summary.get('tax_non_deductible_column'): + columns.append(_('Non-Deductible')) + if tax_summary.get('tax_deductible_column'): + columns.append(_('Deductible')) + if tax_summary.get('tax_due_column'): + columns.append(_('Due')) + + # Draw Tax Applied Table + # Write tax applied header amd columns + self._write_cell(cursor_x, cursor_y, _('Taxes Applied'), len(columns), False, report, fonts, workbook, sheet, + XLSX_FONT_SIZE_HEADING, True, 'white', 'left', 2) + cursor_y += 1 + for column in columns: + align = 'left' + if cursor_x >= start_align_right: + align = 'right' + self._write_cell(cursor_x, cursor_y, column, 1, False, report, fonts, workbook, sheet, XLSX_FONT_SIZE_DEFAULT, True, + XLSX_GRAY_200, align, 2) + cursor_x += 1 + + cursor_x = start_x + cursor_y += 1 + + for country in taxes: + is_country_first_line = True + for tax in taxes[country]: + if len(taxes) > 1: + if is_country_first_line: + is_country_first_line = not is_country_first_line + self._write_cell(cursor_x, cursor_y, country, 1, False, report, fonts, workbook, sheet, + XLSX_FONT_SIZE_DEFAULT, True, 'white', 'left', 1, 0, XLSX_BORDER_COLOR) + + cursor_x += 1 + + self._write_cell(cursor_x, cursor_y, tax['name'], 1, False, report, fonts, workbook, sheet, XLSX_FONT_SIZE_DEFAULT, + True, 'white', 'left', 1, 0, XLSX_BORDER_COLOR) + self._write_cell(cursor_x + 1, cursor_y, tax['base_amount'], 1, False, report, fonts, workbook, sheet, + XLSX_FONT_SIZE_DEFAULT, False, 'white', 'right', 1, 0, XLSX_BORDER_COLOR) + self._write_cell(cursor_x + 2, cursor_y, tax['tax_amount'], 1, False, report, fonts, workbook, sheet, + XLSX_FONT_SIZE_DEFAULT, False, 'white', 'right', 1, 0, XLSX_BORDER_COLOR) + cursor_x += 3 + + if tax_summary.get('tax_non_deductible_column'): + self._write_cell(cursor_x, cursor_y, tax['tax_non_deductible'], 1, False, report, fonts, workbook, sheet, + XLSX_FONT_SIZE_DEFAULT, False, 'white', 'right', 1, 0, XLSX_BORDER_COLOR) + cursor_x += 1 + + if tax_summary.get('tax_deductible_column'): + self._write_cell(cursor_x, cursor_y, tax['tax_deductible'], 1, False, report, fonts, workbook, sheet, + XLSX_FONT_SIZE_DEFAULT, False, 'white', 'right', 1, 0, XLSX_BORDER_COLOR) + cursor_x += 1 + + if tax_summary.get('tax_due_column'): + self._write_cell(cursor_x, cursor_y, tax['tax_due'], 1, False, report, fonts, workbook, sheet, + XLSX_FONT_SIZE_DEFAULT, False, 'white', 'right', 1, 0, XLSX_BORDER_COLOR) + + cursor_x = start_x + cursor_y += 1 + + cursor_x = start_x + cursor_y += 2 + + # Tax grids + columns = [] + grids = tax_summary.get('tax_grid_summary_lines') + if grids: + start_align_right = start_x + 1 + if len(grids) > 1: + start_align_right += 1 + columns.append(_('Country')) + + columns += [_('Grid'), _('+'), _('-'), _('Impact On Grid')] + + # Draw Tax Applied Table + # Write tax applied columns and header + self._write_cell(cursor_x, cursor_y, _('Impact On Grid'), len(columns), False, report, fonts, workbook, sheet, + XLSX_FONT_SIZE_HEADING, True, 'white', 'left', 2) + + cursor_y += 1 + for column in columns: + align = 'left' + if cursor_x >= start_align_right: + align = 'right' + self._write_cell(cursor_x, cursor_y, column, 1, False, report, fonts, workbook, sheet, XLSX_FONT_SIZE_DEFAULT, True, + XLSX_GRAY_200, align, 2) + cursor_x += 1 + + cursor_x = start_x + cursor_y += 1 + + for country in grids: + is_country_first_line = True + for grid_name in grids[country]: + if len(grids) > 1: + if is_country_first_line: + is_country_first_line = not is_country_first_line + self._write_cell(cursor_x, cursor_y, country, 1, False, report, fonts, workbook, sheet, XLSX_FONT_SIZE_DEFAULT, + True, 'white', 'left', 1, 0, XLSX_BORDER_COLOR) + + cursor_x += 1 + + self._write_cell(cursor_x, cursor_y, grid_name, 1, False, report, fonts, workbook, sheet, XLSX_FONT_SIZE_DEFAULT, True, + 'white', 'left', 1, 0, XLSX_BORDER_COLOR) + self._write_cell(cursor_x + 1, cursor_y, grids[country][grid_name].get('+', 0), 1, False, report, fonts, workbook, + sheet, XLSX_FONT_SIZE_DEFAULT, False, 'white', 'right', 1, 0, XLSX_BORDER_COLOR) + self._write_cell(cursor_x + 2, cursor_y, grids[country][grid_name].get('-', 0), 1, False, report, fonts, workbook, + sheet, XLSX_FONT_SIZE_DEFAULT, False, 'white', 'right', 1, 0, XLSX_BORDER_COLOR) + self._write_cell(cursor_x + 3, cursor_y, grids[country][grid_name]['impact'], 1, False, report, fonts, workbook, + sheet, XLSX_FONT_SIZE_DEFAULT, False, 'white', 'right', 1, 0, XLSX_BORDER_COLOR) + + cursor_x = start_x + cursor_y += 1 + + ########################################################################## + # Document Data Generation + ########################################################################## + + def _generate_document_data_for_export(self, report, options, export_type='pdf'): + """ + Used to generate all the data needed for the rendering of the export + + :param export_type: The export type the generation need to use can be ('pdf' or 'xslx') + + :return: a dictionnary containing a list of all lines grouped by journals and a dictionnay with the global tax summary lines + - journals_vals (mandatory): List of dictionary containing all the lines, columns, and tax summaries + - lines (mandatory): A list of dict containing all tha data for each lines in format returned by _get_lines_for_journal + - columns (mandatory): A list of columns for this journal returned in the format returned by _get_columns_for_journal + - tax_summary (optional): A dict of data for the tax summaries inside journals in the format returned by _get_tax_summary_section + - global_tax_summary: A dict with the global tax summaries data in the format returned by _get_tax_summary_section + """ + # Ensure that all the data is synchronized with the database before we read it + self.env.flush_all() + query = report._get_report_query(options, 'strict_range') + account_alias = query.left_join(lhs_alias='account_move_line', lhs_column='account_id', rhs_table='account_account', rhs_column='id', link='account_id') + account_code = self.env['account.account']._field_to_sql(account_alias, 'code', query) + account_name = self.env['account.account']._field_to_sql(account_alias, 'name') + + query = SQL( + """ + SELECT + account_move_line.id AS move_line_id, + account_move_line.name, + account_move_line.date, + account_move_line.invoice_date, + account_move_line.amount_currency, + account_move_line.tax_base_amount, + account_move_line.currency_id AS move_line_currency, + account_move_line.display_type AS display_type, + am.id AS move_id, + am.name AS move_name, + am.journal_id, + am.currency_id AS move_currency, + am.amount_total_in_currency_signed AS amount_currency_total, + am.currency_id != cp.currency_id AS is_multicurrency, + p.name AS partner_name, + %(account_code)s AS account_code, + %(account_name)s AS account_name, + %(account_alias)s.account_type AS account_type, + COALESCE(account_move_line.debit, 0) AS debit, + COALESCE(account_move_line.credit, 0) AS credit, + COALESCE(account_move_line.balance, 0) AS balance, + %(j_name)s AS journal_name, + j.code AS journal_code, + j.type AS journal_type, + cp.currency_id AS company_currency, + CASE WHEN j.type = 'sale' THEN am.payment_reference WHEN j.type = 'purchase' THEN am.ref END AS reference, + array_remove(array_agg(DISTINCT %(tax_name)s), NULL) AS taxes, + array_remove(array_agg(DISTINCT %(tag_name)s), NULL) AS tax_grids + FROM %(table)s + JOIN account_move am ON am.id = account_move_line.move_id + LEFT JOIN res_partner p ON p.id = account_move_line.partner_id + JOIN account_journal j ON j.id = am.journal_id + JOIN res_company cp ON cp.id = am.company_id + LEFT JOIN account_move_line_account_tax_rel aml_at_rel ON aml_at_rel.account_move_line_id = account_move_line.id + LEFT JOIN account_tax parent_tax ON parent_tax.id = aml_at_rel.account_tax_id and parent_tax.amount_type = 'group' + LEFT JOIN account_tax_filiation_rel tax_filiation_rel ON tax_filiation_rel.parent_tax = parent_tax.id + LEFT JOIN account_tax tax ON (tax.id = aml_at_rel.account_tax_id and tax.amount_type != 'group') or tax.id = tax_filiation_rel.child_tax + LEFT JOIN account_account_tag_account_move_line_rel tag_rel ON tag_rel.account_move_line_id = account_move_line.id + LEFT JOIN account_account_tag tag ON tag_rel.account_account_tag_id = tag.id + LEFT JOIN res_currency journal_curr ON journal_curr.id = j.currency_id + WHERE %(case_statement)s AND %(search_conditions)s + GROUP BY "account_move_line".id, am.id, p.id, %(account_alias)s.id, j.id, cp.id, journal_curr.id, account_code, account_name + ORDER BY + CASE j.type + WHEN 'sale' THEN 1 + WHEN 'purchase' THEN 2 + WHEN 'general' THEN 3 + WHEN 'bank' THEN 4 + ELSE 5 + END, + j.sequence, + CASE WHEN am.name = '/' THEN 1 ELSE 0 END, am.date, am.name, am.id, + CASE %(account_alias)s.account_type + WHEN 'liability_payable' THEN 1 + WHEN 'asset_receivable' THEN 1 + WHEN 'liability_credit_card' THEN 5 + WHEN 'asset_cash' THEN 5 + ELSE 2 + END, + account_move_line.tax_line_id NULLS FIRST + """, + table=query.from_clause, + case_statement=self._get_payment_lines_filter_case_statement(options), + search_conditions=query.where_clause, + account_code=account_code, + account_name=account_name, + account_alias=SQL.identifier(account_alias), + j_name=self.env['account.journal']._field_to_sql('j', 'name'), + tax_name=self.env['account.tax']._field_to_sql('tax', 'name'), + tag_name=self.env['account.account.tag']._field_to_sql('tag', 'name') + ) + + self._cr.execute(query) + result = {} + + # Grouping by journal_id then move_id + for entry in self._cr.dictfetchall(): + result.setdefault(entry['journal_id'], {}) + result[entry['journal_id']].setdefault(entry['move_id'], []) + result[entry['journal_id']][entry['move_id']].append(entry) + + journals_vals = [] + any_journal_group_has_taxes = False + + for journal_entry_dict in result.values(): + account_move_vals_list = list(journal_entry_dict.values()) + journal_vals = { + 'id': account_move_vals_list[0][0]['journal_id'], + 'name': account_move_vals_list[0][0]['journal_name'], + 'code': account_move_vals_list[0][0]['journal_code'], + 'type': account_move_vals_list[0][0]['journal_type'] + } + + if self._section_has_tax(options, journal_vals['id']): + journal_vals['tax_summary'] = self._get_tax_summary_section(options, journal_vals) + any_journal_group_has_taxes = True + + journal_vals['lines'] = self._get_export_lines_for_journal(report, options, export_type, journal_vals, account_move_vals_list) + journal_vals['columns'] = self._get_columns_for_journal(journal_vals, export_type) + journals_vals.append(journal_vals) + + return { + 'journals_vals': journals_vals, + 'global_tax_summary': self._get_tax_summary_section(options) if any_journal_group_has_taxes else False + } + + def _get_columns_for_journal(self, journal, export_type='pdf'): + """ + Creates a columns list that will be used in this journal for the pdf report + + :return: A list of the columns as dict each having: + - name (mandatory): A string that will be displayed + - label (mandatory): A string used to link lines with the column + - class (optional): A string with css classes that need to be applied to all that column + """ + columns = [ + {'name': _('Document'), 'label': 'document'}, + ] + + # We have different columns regarding we are exporting to a PDF file or an XLSX document + if export_type == 'pdf': + columns.append({'name': _('Account'), 'label': 'account_label'}) + else: + columns.extend([ + {'name': _('Account Code'), 'label': 'account_code'}, + {'name': _('Account Label'), 'label': 'account_label'} + ]) + + columns.extend([ + {'name': _('Name'), 'label': 'name'}, + {'name': _('Debit'), 'label': 'debit', 'class': 'o_right_alignment '}, + {'name': _('Credit'), 'label': 'credit', 'class': 'o_right_alignment '}, + ]) + + if journal.get('tax_summary'): + columns.append( + {'name': _('Taxes'), 'label': 'taxes'}, + ) + if journal['tax_summary'].get('tax_grid_summary_lines'): + columns.append({'name': _('Tax Grids'), 'label': 'tax_grids'}) + + if self._should_use_bank_journal_export(journal): + columns.append({ + 'name': _('Balance'), + 'label': 'balance', + 'class': 'o_right_alignment ' + }) + + if journal.get('multicurrency_column'): + columns.append({ + 'name': _('Amount Currency'), + 'label': 'amount_currency', + 'class': 'o_right_alignment ' + }) + + return columns + + def _should_use_bank_journal_export(self, journal_vals): + """Returns True if the journal requires bank-specific export logic.""" + return journal_vals.get('type') == 'bank' + + def _get_export_lines_for_journal(self, report, options, export_type, journal_vals, account_move_vals_list): + """ + Default document lines generation it will generate a list of lines in a format valid for the pdf and xlsx + + If it is a bank journal it will be redirected to _get_lines_for_bank_journal since this type of journals + require more complexity + We want to be as lightweight as possible and not at unnecessary calculations + + :return: A list of lines. Each line is a dict having: + - 'column_label': A dict containing the values for a cell with a key that links to the label of a column + - data (mandatory): The formatted cell value + - class (optional): Additional css classes to apply to the current cell + - line_class (optional): Additional css classes that applies to the entire line + """ + lines = [] + + if self._should_use_bank_journal_export(journal_vals): + return self._get_export_lines_for_bank_journal(report, options, export_type, journal_vals, account_move_vals_list) + + total_credit = 0 + total_debit = 0 + + for i, account_move_line_vals_list in enumerate(account_move_vals_list): + for j, move_line_entry_vals in enumerate(account_move_line_vals_list): + document = False + if j == 0: + document = move_line_entry_vals['move_name'] + elif j == 1: + document = move_line_entry_vals['date'] + + line = self._get_base_line(report, options, export_type, document, move_line_entry_vals, j, i % 2 != 0, journal_vals.get('tax_summary')) + + total_credit += move_line_entry_vals['credit'] + total_debit += move_line_entry_vals['debit'] + + lines.append(line) + + # Add other currency amout if this move is using multiple currencies + move_vals_entry = account_move_line_vals_list[0] + if move_vals_entry['is_multicurrency']: + amount_currency_name = _( + 'Amount in currency: %s', + report._format_value( + options, + move_vals_entry['amount_currency_total'], + 'monetary', + format_params={'currency_id': move_vals_entry['move_currency']}, + ), + ) + if len(account_move_line_vals_list) <= 2: + lines.append({ + 'document': {'data': amount_currency_name}, + 'line_class': 'o_even ' if i % 2 == 0 else 'o_odd ', + 'amount': {'data': move_vals_entry['amount_currency_total']}, + 'currency_id': {'data': move_vals_entry['move_currency']} + }) + else: + lines[-1]['document'] = {'data': amount_currency_name} + lines[-1]['amount'] = {'data': move_vals_entry['amount_currency_total']} + lines[-1]['currency_id'] = {'data': move_vals_entry['move_currency']} + + # Add an empty line to add a separation between the total section and the data section + lines.append({}) + + total_line = { + 'name': {'data': _('Total')}, + 'debit': {'data': report._format_value(options, total_debit, 'monetary')}, + 'credit': {'data': report._format_value(options, total_credit, 'monetary')}, + } + + lines.append(total_line) + + return lines + + def _get_export_lines_for_bank_journal(self, report, options, export_type, journal_vals, account_moves_vals_list): + """ + Bank journals are more complex and should be calculated separately from other journal types + + :return: A list of lines. Each line is a dict having: + - 'column_label': A dict containing the values for a cell with a key that links to the label of a column + - data (mandatory): The formatted cell value + - class (optional): Additional css classes to apply to the current cell + - line_class (optional): Additional css classes that applies to the entire line + """ + lines = [] + + # Initial balance + current_balance = self._query_bank_journal_initial_balance(options, journal_vals['id']) + lines.append({ + 'name': {'data': _('Starting Balance')}, + 'balance': {'data': report._format_value(options, current_balance, 'monetary')}, + }) + + # Debit and credit accumulators + total_credit = 0 + total_debit = 0 + + for i, account_move_line_vals_list in enumerate(account_moves_vals_list): + is_unreconciled_payment = not any( + line for line in account_move_line_vals_list if line['account_type'] in ('liability_credit_card', 'asset_cash') + ) + + for j, move_line_entry_vals in enumerate(account_move_line_vals_list): + # Do not display bank account lines for bank journals + if move_line_entry_vals['account_type'] not in ('liability_credit_card', 'asset_cash'): + document = '' + if j == 0: + document = f'{move_line_entry_vals["move_name"]} ({move_line_entry_vals["date"]})' + line = self._get_base_line(report, options, export_type, document, move_line_entry_vals, j, i % 2 != 0, journal_vals.get('tax_summary')) + + total_credit += move_line_entry_vals['credit'] + total_debit += move_line_entry_vals['debit'] + + if not is_unreconciled_payment: + # We need to invert the balance since it is a bank journal + line_balance = -move_line_entry_vals['balance'] + current_balance += line_balance + line.update({ + 'balance': { + 'data': report._format_value(options, current_balance, 'monetary'), + 'class': 'o_muted ' if self.env.company.currency_id.is_zero(line_balance) else '' + }, + }) + + if self.env.user.has_group('base.group_multi_currency') and move_line_entry_vals['move_line_currency'] != move_line_entry_vals['company_currency']: + journal_vals['multicurrency_column'] = True + amount_currency = -move_line_entry_vals['amount_currency'] if not is_unreconciled_payment else move_line_entry_vals['amount_currency'] + move_line_currency = self.env['res.currency'].browse(move_line_entry_vals['move_line_currency']) + line.update({ + 'amount_currency': { + 'data': report._format_value( + options, + amount_currency, + 'monetary', + format_params={'currency_id': move_line_currency.id}, + ), + 'class': 'o_muted ' if move_line_currency.is_zero(amount_currency) else '', + } + }) + lines.append(line) + + # Add an empty line to add a separation between the total section and the data section + lines.append({}) + + total_line = { + 'name': {'data': _('Total')}, + 'balance': {'data': report._format_value(options, current_balance, 'monetary')}, + } + lines.append(total_line) + + return lines + + def _get_base_line(self, report, options, export_type, document, line_entry, line_index, even, has_taxes): + """ + Returns the generic part of a line that is used by both '_get_lines_for_journal' and '_get_lines_for_bank_journal' + + :return: A dict with base values for the line + - line_class (mandatory): Css classes that applies to this whole line + - document (mandatory): A dict containing the cell data for the column document + - data (mandatory): The value of the cell formatted + - class (mandatory): css class for this cell + - account (mandatory): A dict containing the cell data for the column account + - data (mandatory): The value of the cell formatted + - account_code (mandatory): A dict containing the cell data for the column account_code + - data (mandatory): The value of the cell formatted + - account_label (mandatory): A dict containing the cell data for the column account_label + - data (mandatory): The value of the cell formatted + - name (mandatory): A dict containing the cell data for the column name + - data (mandatory): The value of the cell formatted + - debit (mandatory): A dict containing the cell data for the column debit + - data (mandatory): The value of the cell formatted + - class (mandatory): css class for this cell + - credit (mandatory): A dict containing the cell data for the column credit + - data (mandatory): The value of the cell formatted + - class (mandatory): css class for this cell + + - taxes(optional): A dict containing the cell data for the column taxes + - data (mandatory): The value of the cell formatted + - tax_grids(optional): A dict containing the cell data for the column taxes + - data (mandatory): The value of the cell formatted + """ + company_currency = self.env.company.currency_id + + name = line_entry['name'] or line_entry['reference'] + account_label = line_entry['partner_name'] or line_entry['account_name'] + + if line_entry['account_type'] not in ('asset_receivable', 'liability_payable'): + account_label = line_entry['account_name'] + elif line_entry['partner_name'] and line_entry['account_type'] in ('asset_receivable', 'liability_payable'): + name = f"{line_entry['partner_name']} {name or ''}" + + line = { + 'line_class': 'o_even ' if even else 'o_odd ', + 'document': {'data': document, 'class': 'o_bold ' if line_index == 0 else ''}, + 'account_code': {'data': line_entry['account_code']}, + 'account_label': { + 'data': ( + account_label + if export_type != 'pdf' + else ( + f"{line_entry['account_code']} " + + ( + line_entry['account_name'][:35] + '...' + if len(line_entry['account_name']) > 35 + else line_entry['account_name'] + ) + ) + ) + }, + 'name': {'data': name}, + 'debit': { + 'data': report._format_value(options, line_entry['debit'], 'monetary'), + 'class': 'o_muted ' if company_currency.is_zero(line_entry['debit']) else '' + }, + 'credit': { + 'data': report._format_value(options, line_entry['credit'], 'monetary'), + 'class': 'o_muted ' if company_currency.is_zero(line_entry['credit']) else '' + }, + } + + if has_taxes: + tax_val = '' + if line_entry['taxes']: + tax_val = _('T: %s', ', '.join(line_entry['taxes'])) + elif line_entry['tax_base_amount'] is not None: + tax_val = _('B: %s', report._format_value(options, line_entry['tax_base_amount'], 'monetary')) + + line.update({ + 'taxes': {'data': tax_val}, + 'tax_grids': {'data': ', '.join(line_entry['tax_grids'])}, + }) + + return line + + ########################################################################## + # Queries + ########################################################################## + + def _get_payment_lines_filter_case_statement(self, options): + if not options.get('show_payment_lines'): + return SQL( + """ + (j.type != 'bank' OR EXISTS( + SELECT + 1 + FROM account_move_line + JOIN account_account acc ON acc.id = account_move_line.account_id + WHERE account_move_line.move_id = am.id + AND acc.account_type IN ('liability_credit_card', 'asset_cash') + )) + """ + ) + else: + return SQL('TRUE') + + def _query_bank_journal_initial_balance(self, options, journal_id): + report = self.env.ref('odex30_account_reports.journal_report') + query = report._get_report_query(options, 'to_beginning_of_period', domain=[('journal_id', '=', journal_id)]) + query = SQL( + """ + SELECT + COALESCE(SUM(account_move_line.balance), 0) AS balance + FROM %(table)s + JOIN account_journal journal ON journal.id = "account_move_line".journal_id AND account_move_line.account_id = journal.default_account_id + WHERE %(search_conditions)s + GROUP BY journal.id + """, + table=query.from_clause, + search_conditions=query.where_clause, + ) + self._cr.execute(query) + result = self._cr.dictfetchall() + init_balance = result[0]['balance'] if len(result) >= 1 else 0 + return init_balance + + ########################################################################## + # Tax Grids + ########################################################################## + + def _section_has_tax(self, options, journal_id): + report = self.env['account.report'].browse(options.get('report_id')) + aml_has_tax_domain = [('tax_ids', '!=', False)] + if journal_id: + aml_has_tax_domain.append(('journal_id', '=', journal_id)) + aml_has_tax_domain += report._get_options_domain(options, 'strict_range') + return bool(self.env['account.move.line'].search_count(aml_has_tax_domain, limit=1)) + + def _get_tax_summary_section(self, options, journal_vals=None): + """ + Get the journal tax summary if it is passed as parameter. + In case no journal is passed, it will return the global tax summary data + """ + tax_data = { + 'date_from': options.get('date', {}).get('date_from'), + 'date_to': options.get('date', {}).get('date_to'), + } + + if journal_vals: + tax_data['journal_id'] = journal_vals['id'] + tax_data['journal_type'] = journal_vals['type'] + + tax_report_lines = self._get_generic_tax_summary_for_sections(options, tax_data) + tax_non_deductible_column = any(line.get('tax_non_deductible_no_format') for country_vals_list in tax_report_lines.values() for line in country_vals_list) + tax_deductible_column = any(line.get('tax_deductible_no_format') for country_vals_list in tax_report_lines.values() for line in country_vals_list) + tax_due_column = any(line.get('tax_due_no_format') for country_vals_list in tax_report_lines.values() for line in country_vals_list) + extra_columns = int(tax_non_deductible_column) + int(tax_deductible_column) + int(tax_due_column) + + tax_grid_summary_lines = self._get_tax_grids_summary(options, tax_data) + + return { + 'tax_report_lines': tax_report_lines, + 'tax_non_deductible_column': tax_non_deductible_column, + 'tax_deductible_column': tax_deductible_column, + 'tax_due_column': tax_due_column, + 'extra_columns': extra_columns, + 'tax_grid_summary_lines': tax_grid_summary_lines, + } + + def _get_generic_tax_report_options(self, options, data): + """ + Return an option dictionnary set to fetch the reports with the parameters needed for this journal. + The important bits are the journals, date, and fetch the generic tax reports that contains all taxes. + We also provide the information about wether to take all entries or only posted ones. + """ + generic_tax_report = self.env.ref('account.generic_tax_report') + previous_option = options.copy() + # Force the dates to the selected ones. Allows to get it correctly when grouped by months + previous_option.update({ + 'selected_variant_id': generic_tax_report.id, + 'date_from': data.get('date_from'), + 'date_to': data.get('date_to'), + }) + tax_report_options = generic_tax_report.get_options(previous_option) + journal_report = self.env['account.report'].browse(options['report_id']) + tax_report_options['forced_domain'] = tax_report_options.get('forced_domain', []) + journal_report._get_options_domain(options, 'strict_range') + + # Even though it doesn't have a journal selector, we can force a journal in the options to only get the lines for a specific journal. + if data.get('journal_id') or data.get('journal_type'): + tax_report_options['journals'] = [{ + 'id': data.get('journal_id'), + 'model': 'account.journal', + 'type': data.get('journal_type'), + 'selected': True, + }] + + return tax_report_options + + def _get_tax_grids_summary(self, options, data): + """ + Fetches the details of all grids that have been used in the provided journal. + The result is grouped by the country in which the tag exists in case of multivat environment. + Returns a dictionary with the following structure: + { + Country : { + tag_name: {+, -, impact}, + tag_name: {+, -, impact}, + tag_name: {+, -, impact}, + ... + }, + Country : [ + tag_name: {+, -, impact}, + tag_name: {+, -, impact}, + tag_name: {+, -, impact}, + ... + ], + ... + } + """ + report = self.env.ref('odex30_account_reports.journal_report') + # Use the same option as we use to get the tax details, but this time to generate the query used to fetch the + # grid information + tax_report_options = self._get_generic_tax_report_options(options, data) + query = report._get_report_query(tax_report_options, 'strict_range') + country_name = self.env['res.country']._field_to_sql('country', 'name') + tag_name = self.env['account.account.tag']._field_to_sql('tag', 'name') + query = SQL(""" + WITH tag_info (country_name, tag_id, tag_name, tag_sign, balance) AS ( + SELECT + %(country_name)s AS country_name, + tag.id, + %(tag_name)s AS name, + CASE WHEN tag.tax_negate IS TRUE THEN '-' ELSE '+' END, + SUM(COALESCE("account_move_line".balance, 0) + * CASE WHEN "account_move_line".tax_tag_invert THEN -1 ELSE 1 END + ) AS balance + FROM account_account_tag tag + JOIN account_account_tag_account_move_line_rel rel ON tag.id = rel.account_account_tag_id + JOIN res_country country ON country.id = tag.country_id + , %(table_references)s + WHERE %(search_condition)s + AND applicability = 'taxes' + AND "account_move_line".id = rel.account_move_line_id + GROUP BY country_name, tag.id + ) + SELECT + country_name, + tag_id, + REGEXP_REPLACE(tag_name, '^[+-]', '') AS name, -- Remove the sign from the grid name + balance, + tag_sign AS sign + FROM tag_info + ORDER BY country_name, name + """, country_name=country_name, tag_name=tag_name, table_references=query.from_clause, search_condition=query.where_clause) + self._cr.execute(query) + query_res = self.env.cr.fetchall() + + res = {} + opposite = {'+': '-', '-': '+'} + for country_name, tag_id, name, balance, sign in query_res: + res.setdefault(country_name, {}).setdefault(name, {}) + res[country_name][name].setdefault('tag_ids', []).append(tag_id) + res[country_name][name][sign] = report._format_value(options, balance, 'monetary') + + # We need them formatted, to ensure they are displayed correctly in the report. (E.g. 0.0, not 0) + if not opposite[sign] in res[country_name][name]: + res[country_name][name][opposite[sign]] = report._format_value(options, 0, 'monetary') + + res[country_name][name][sign + '_no_format'] = balance + res[country_name][name]['impact'] = report._format_value(options, res[country_name][name].get('+_no_format', 0) - res[country_name][name].get('-_no_format', 0), 'monetary') + + return res + + def _get_generic_tax_summary_for_sections(self, options, data): + """ + Overridden to make use of the generic tax report computation + Works by forcing specific options into the tax report to only get the lines we need. + The result is grouped by the country in which the tag exists in case of multivat environment. + Returns a dictionary with the following structure: + { + Country : [ + {name, base_amount{_no_format}, tax_amount{_no_format}, tax_non_deductible{_no_format}, tax_deductible{_no_format}, tax_due{_no_format}}, + {name, base_amount{_no_format}, tax_amount{_no_format}, tax_non_deductible{_no_format}, tax_deductible{_no_format}, tax_due{_no_format}}, + {name, base_amount{_no_format}, tax_amount{_no_format}, tax_non_deductible{_no_format}, tax_deductible{_no_format}, tax_due{_no_format}}, + ... + ], + Country : [ + {name, base_amount{_no_format}, tax_amount{_no_format}, tax_non_deductible{_no_format}, tax_deductible{_no_format}, tax_due{_no_format}}, + {name, base_amount{_no_format}, tax_amount{_no_format}, tax_non_deductible{_no_format}, tax_deductible{_no_format}, tax_due{_no_format}}, + {name, base_amount{_no_format}, tax_amount{_no_format}, tax_non_deductible{_no_format}, tax_deductible{_no_format}, tax_due{_no_format}}, + ... + ], + ... + } + """ + report = self.env['account.report'].browse(options['report_id']) + tax_report_options = self._get_generic_tax_report_options(options, data) + tax_report_options['account_journal_report_tax_deductibility_columns'] = True + tax_report = self.env.ref('account.generic_tax_report') + tax_report_lines = tax_report._get_lines(tax_report_options) + + tax_values = {} + for tax_report_line in tax_report_lines: + model, line_id = report._parse_line_id(tax_report_line.get('id'))[-1][1:] + if model == 'account.tax': + tax_values[line_id] = { + 'base_amount': tax_report_line['columns'][0]['no_format'], + 'tax_amount': tax_report_line['columns'][1]['no_format'], + 'tax_non_deductible': tax_report_line['columns'][2]['no_format'], + 'tax_deductible': tax_report_line['columns'][3]['no_format'], + 'tax_due': tax_report_line['columns'][4]['no_format'], + } + + # Make the final data dict that will be used by the template, using the taxes information. + taxes = self.env['account.tax'].browse(tax_values.keys()) + res = {} + for tax in taxes: + res.setdefault(tax.country_id.name, []).append({ + 'base_amount': report._format_value(options, tax_values[tax.id]['base_amount'], 'monetary'), + 'base_amount_no_format': tax_values[tax.id]['base_amount'], + 'tax_amount': report._format_value(options, tax_values[tax.id]['tax_amount'], 'monetary'), + 'tax_amount_no_format': tax_values[tax.id]['tax_amount'], + 'tax_non_deductible': report._format_value(options, tax_values[tax.id]['tax_non_deductible'], 'monetary'), + 'tax_non_deductible_no_format': tax_values[tax.id]['tax_non_deductible'], + 'tax_deductible': report._format_value(options, tax_values[tax.id]['tax_deductible'], 'monetary'), + 'tax_deductible_no_format': tax_values[tax.id]['tax_deductible'], + 'tax_due': report._format_value(options, tax_values[tax.id]['tax_due'], 'monetary'), + 'tax_due_no_format': tax_values[tax.id]['tax_due'], + 'name': tax.name, + 'line_id': report._get_generic_line_id('account.tax', tax.id) + }) + + # Return the result, ordered by country name + return dict(sorted(res.items())) + + ########################################################################## + # Actions + ########################################################################## + + def journal_report_tax_tag_template_open_aml(self, options, params=None): + """ returns an action to open a list view of the account.move.line having the selected tax tag """ + tag_ids = params.get('tag_ids') + domain = ( + self.env['account.report'].browse(options['report_id'])._get_options_domain(options, 'strict_range') + + [('tax_tag_ids', 'in', tag_ids)] + + self.env['account.move.line']._get_tax_exigible_domain() + ) + + return { + 'type': 'ir.actions.act_window', + 'name': _('Journal Items for Tax Audit'), + 'res_model': 'account.move.line', + 'views': [[self.env.ref('account.view_move_line_tax_audit_tree').id, 'list']], + 'domain': domain, + 'context': self.env.context, + } + + def journal_report_action_dropdown_audit_default_tax_report(self, options, params): + return self.env['account.generic.tax.report.handler'].caret_option_audit_tax(options, params) + + def journal_report_action_open_tax_journal_items(self, options, params): + """ + Open the journal items related to the tax on this line. + Take into account the given/options date and group by taxes then account. + :param options: the report options. + :param params: a dict containing the line params. (Dates, name, journal_id, tax_type) + :return: act_window on journal items grouped by tax or tags and accounts. + """ + ctx = { + 'search_default_posted': 0 if options.get('all_entries') else 1, + 'search_default_date_between': 1, + 'date_from': params and params.get('date_from') or options.get('date', {}).get('date_from'), + 'date_to': params and params.get('date_to') or options.get('date', {}).get('date_to'), + 'search_default_journal_id': params.get('journal_id'), + 'expand': 1, + } + if params and params.get('tax_type') == 'tag': + ctx.update({ + 'search_default_group_by_tax_tags': 1, + 'search_default_group_by_account': 2, + }) + elif params and params.get('tax_type') == 'tax': + ctx.update({ + 'search_default_group_by_taxes': 1, + 'search_default_group_by_account': 2, + }) + + if params and 'journal_id' in params: + ctx.update({ + 'search_default_journal_id': [params['journal_id']], + }) + + if options and options.get('journals') and not ctx.get('search_default_journal_id'): + selected_journals = [journal['id'] for journal in options['journals'] if journal.get('selected') and journal['model'] == 'account.journal'] + if len(selected_journals) == 1: + ctx['search_default_journal_id'] = selected_journals + + return { + 'name': params.get('name'), + 'view_mode': 'list,pivot,graph,kanban', + 'res_model': 'account.move.line', + 'views': [(self.env.ref('account.view_move_line_tree').id, 'list')], + 'type': 'ir.actions.act_window', + 'domain': [('display_type', 'not in', ('line_section', 'line_note'))], + 'context': ctx, + } + + def journal_report_action_open_account_move_lines_by_account(self, options, params): + """ + Open a list view of the journal account move lines + corresponding to the date filter and the current account line clicked + :param options: The current options of the report + :param params: The params given from the report UI (journal_id, account_id, date) + :return: act_window on journal items filtered on the current journal and the current account within a date. + """ + report = self.env['account.report'].browse(options['report_id']) + journal = self.env['account.journal'].browse(params['journal_id']) + account = self.env['account.account'].browse(params['account_id']) + + domain = [ + ('journal_id.id', '=', journal.id), + ('account_id.id', '=', account.id), + ] + domain += report._get_options_domain(options, 'strict_range') + + return { + 'type': 'ir.actions.act_window', + 'name': _("%(journal)s - %(account)s", journal=journal.name, account=account.name), + 'res_model': 'account.move.line', + 'views': [[False, 'list']], + 'domain': domain + } + + def journal_report_open_aml_by_move(self, options, params): + report = self.env['account.report'].browse(options['report_id']) + journal = self.env['account.journal'].browse(params['journal_id']) + + context_update = { + 'search_default_group_by_account': 0, + 'show_more_partner_info': 1, + } + + if journal.type in ('bank', 'credit'): + params['view_ref'] = 'odex30_account_reports.view_journal_report_audit_bank_move_line_tree' + # context_update['search_default_exclude_bank_lines'] = 1 + else: + params['view_ref'] = 'odex30_account_reports.view_journal_report_audit_move_line_tree' + context_update.update({ + 'search_default_group_by_partner': 1, + 'search_default_group_by_move': 2, + }) + if journal.type in ('sale', 'purchase'): + context_update['search_default_invoices_lines'] = 1 + + action = report.open_journal_items(options=options, params=params) + action.get('context', {}).update(context_update) + return action diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_move.py b/dev_odex30_accounting/odex30_account_reports/models/account_move.py new file mode 100644 index 0000000..6262e70 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_move.py @@ -0,0 +1,293 @@ +# -*- coding: utf-8 -*- +import ast + +from odoo.addons.account.models.exceptions import TaxClosingNonPostedDependingMovesError +from odoo import api, models, fields, _ +from odoo.exceptions import UserError +from odoo.tools.misc import format_date +from odoo.tools import date_utils +from odoo.addons.web.controllers.utils import clean_action + +from dateutil.relativedelta import relativedelta +from markupsafe import Markup + + +class AccountMove(models.Model): + _inherit = "account.move" + + # used for VAT closing, containing the end date of the period this entry closes + tax_closing_report_id = fields.Many2one(comodel_name='account.report') + # technical field used to know whether to show the tax closing alert or not + tax_closing_alert = fields.Boolean(compute='_compute_tax_closing_alert') + + def _post(self, soft=True): + # Overridden to create carryover external values and join the pdf of the report when posting the tax closing + for move in self.filtered(lambda m: m.tax_closing_report_id): + report = move.tax_closing_report_id + options = move._get_tax_closing_report_options(move.company_id, move.fiscal_position_id, report, move.date) + move._close_tax_period(report, options) + + return super()._post(soft) + + def action_post(self): + + try: + res = super().action_post() + except TaxClosingNonPostedDependingMovesError as exception: + return { + "type": "ir.actions.client", + "tag": "odex30_account_reports.redirect_action", + "target": "new", + "name": "Depending Action", + "params": { + "depending_action": exception.args[0], + "message": _("It seems there is some depending closing move to be posted"), + "button_text": _("Depending moves"), + }, + 'context': { + 'dialog_size': 'medium', + } + } + return res + + def button_draft(self): + super().button_draft() + for closing_move in self.filtered(lambda m: m.tax_closing_report_id): + report = closing_move.tax_closing_report_id + options = closing_move._get_tax_closing_report_options(closing_move.company_id, closing_move.fiscal_position_id, report, closing_move.date) + closing_months_delay = closing_move.company_id._get_tax_periodicity_months_delay(report) + + carryover_values = self.env['account.report.external.value'].search([ + ('carryover_origin_report_line_id', 'in', report.line_ids.ids), + ('date', '=', options['date']['date_to']), + ]) + + carryover_impacted_period_end = fields.Date.from_string(options['date']['date_to']) + relativedelta(months=closing_months_delay) + violated_lock_dates = closing_move.company_id._get_lock_date_violations( + carryover_impacted_period_end, fiscalyear=False, sale=False, purchase=False, tax=True, hard=True, + ) if carryover_values else None + + if violated_lock_dates: + raise UserError(_("You cannot reset this closing entry to draft, as it would delete carryover values impacting the tax report of a locked period. " + "Please change the following lock dates to proceed: %(lock_date_info)s.", + lock_date_info=self.env['res.company']._format_lock_dates(violated_lock_dates))) + + if self._has_subsequent_posted_closing_moves(): + raise UserError(_("You cannot reset this closing entry to draft, as another closing entry has been posted at a later date.")) + + carryover_values.unlink() + + def _has_subsequent_posted_closing_moves(self): + self.ensure_one() + closing_domains = [ + ('company_id', '=', self.company_id.id), + ('tax_closing_report_id', '!=', False), + ('state', '=', 'posted'), + ('date', '>', self.date), + ('fiscal_position_id', '=', self.fiscal_position_id.id) + ] + return bool(self.env['account.move'].search_count(closing_domains, limit=1)) + + def _get_tax_to_pay_on_closing(self): + self.ensure_one() + tax_payable_accounts = self.env['account.tax.group'].search([ + ('company_id', '=', self.company_id.id), + ]).tax_payable_account_id + payable_lines = self.line_ids.filtered(lambda line: line.account_id in tax_payable_accounts) + return self.currency_id.round(-sum(payable_lines.mapped('balance'))) + + def _action_tax_to_pay_wizard(self): + # hook for l10n tax payment wizard + return self.action_open_tax_report() + + def _action_tax_to_send(self): + return self.action_open_tax_report() + + def _action_tax_report_error(self): + # hook for l10n tax report errors + return self.action_open_tax_report() + + def action_open_tax_report(self): + action = self.env["ir.actions.actions"]._for_xml_id("odex30_account_reports.action_account_report_gt") + if not self.tax_closing_report_id: + raise UserError(_("You can't open a tax report from a move without a VAT closing date.")) + options = self._get_tax_closing_report_options(self.company_id, self.fiscal_position_id, self.tax_closing_report_id, self.date) + # Pass options in context and set ignore_session: true to prevent using session options + action.update({'params': {'options': options, 'ignore_session': True}}) + return action + + def _close_tax_period(self, report, options): + + self.ensure_one() + if not self.env.user.has_group('account.group_account_manager'): + raise UserError(_('Only Billing Administrators are allowed to change lock dates!')) + report = self.tax_closing_report_id + options = self._get_tax_closing_report_options(self.company_id, self.fiscal_position_id, report, self.date) + + sender_company = report._get_sender_company_for_export(options) + company_ids = report.get_report_company_ids(options) + if sender_company == self.company_id: + depending_closings = self.env['account.tax.report.handler']._get_tax_closing_entries_for_closed_period(report, options, self.env['res.company'].browse(company_ids), posted_only=False) - self + depending_closings_to_post = depending_closings.filtered(lambda x: x.state == 'draft') + if depending_closings_to_post: + depending_action = self.env["ir.actions.actions"]._for_xml_id("account.action_move_journal_line") + depending_action = clean_action(depending_action, env=self.env) + + if len(depending_closings_to_post) == 1: + depending_action['views'] = [(self.env.ref('account.view_move_form').id, 'form')] + depending_action['res_id'] = depending_closings_to_post.id + else: + depending_action['domain'] = [('id', 'in', depending_closings_to_post.ids)] + depending_action['context'] = dict(ast.literal_eval(depending_action['context'])) + depending_action['context'].pop('search_default_posted', None) + + + raise TaxClosingNonPostedDependingMovesError(depending_action) + + report.with_context(allowed_company_ids=company_ids)._generate_carryover_external_values(options) + + attachments = self._get_vat_report_attachments(report, options) + subject = _( + "Vat closing from %(date_from)s to %(date_to)s", + date_from=format_date(self.env, options['date']['date_from']), + date_to=format_date(self.env, options['date']['date_to']), + ) + self.with_context(no_new_invoice=True).message_post(body=self.ref, subject=subject, attachments=attachments) + + # Log a note on depending closings, redirecting to the main one + for closing_move in depending_closings: + closing_move.message_post(body=_( + "The attachments of the tax report can be found on the %(link_start)sclosing entry%(link_end)s of the representative company.", + link_start=Markup('') % self.id, + link_end=Markup(""), + )) + + # End activity + activity = self.company_id._get_tax_closing_reminder_activity(report.id, self.date, self.fiscal_position_id.id) + if activity: + activity.action_done() + + # Generate next activity + self.company_id._generate_tax_closing_reminder_activity(self.tax_closing_report_id, self.date + relativedelta(days=1), self.fiscal_position_id if self.fiscal_position_id.foreign_vat else None) + + if not self.fiscal_position_id and (not self.company_id.tax_lock_date or self.date > self.company_id.tax_lock_date): + self.env['account.report']._generate_default_external_values(options['date']['date_from'], options['date']['date_to'], True) + self.company_id.sudo().tax_lock_date = self.date + + self._close_tax_period_create_activities() + + def _get_tax_period_description(self): + self.ensure_one() + period_start, period_end = self.company_id._get_tax_closing_period_boundaries(self.date, self.tax_closing_report_id) + return self.company_id._get_tax_closing_move_description(self.company_id._get_tax_periodicity(self.tax_closing_report_id), period_start, period_end, self.fiscal_position_id, self.tax_closing_report_id) + + def _close_tax_period_create_activities(self): + mat_to_send_xml_id = 'odex30_account_reports.mail_activity_type_tax_report_to_be_sent' + mat_to_send = self.env.ref(mat_to_send_xml_id, raise_if_not_found=False) + if not mat_to_send: + # As this is introduced in stable, we ensure data exists by creating them on the fly if needed + mat_to_send = self.env['mail.activity.type'].sudo()._load_records([{ + 'xml_id': mat_to_send_xml_id, + 'noupdate': False, + 'values': { + 'name': 'Tax Report Ready', + 'summary': 'Tax report is ready to be sent to the administration', + 'category': 'tax_report', + 'delay_count': '0', + 'delay_unit': 'days', + 'delay_from': 'current_date', + 'res_model': 'account.move', + 'chaining_type': 'suggest', + } + }]) + mat_to_pay_xml_id = 'odex30_account_reports.mail_activity_type_tax_report_to_pay' + mat_to_pay = self.env.ref(mat_to_pay_xml_id, raise_if_not_found=False) + + act_user = mat_to_send.default_user_id + if act_user and not (self.company_id in act_user.company_ids and act_user.has_group('account.group_account_manager')): + act_user = self.env['res.users'] + + moves_without_send_activity = self.filtered_domain([ + '|', + ('activity_ids', '=', False), + ('activity_ids', 'not any', [('activity_type_id.id', '=', mat_to_send.id)]), + ]) + + for move in moves_without_send_activity: + period_desc = move._get_tax_period_description() + move.with_context(mail_activity_quick_update=True).activity_schedule( + act_type_xmlid=mat_to_send_xml_id, + summary=_("Send tax report: %s", period_desc), + date_deadline=fields.Date.context_today(move), + user_id=act_user.id or self.env.user.id, + ) + + if mat_to_pay and mat_to_pay not in move.activity_ids.activity_type_id and move._get_tax_to_pay_on_closing() > 0: + move.with_context(mail_activity_quick_update=True).activity_schedule( + act_type_xmlid=mat_to_pay_xml_id, + summary=_("Pay tax: %s", period_desc), + date_deadline=fields.Date.context_today(move), + user_id=act_user.id or self.env.user.id, + ) + + def refresh_tax_entry(self): + for move in self.filtered(lambda m: m.tax_closing_report_id and m.state == 'draft'): + report = move.tax_closing_report_id + options = move._get_tax_closing_report_options(move.company_id, move.fiscal_position_id, report, move.date) + self.env[report.custom_handler_model_name or 'account.generic.tax.report.handler']._generate_tax_closing_entries(report, options, closing_moves=move) + + @api.model + def _get_tax_closing_report_options(self, company, fiscal_position, report, date_inside_period): + _dummy, date_to = company._get_tax_closing_period_boundaries(date_inside_period, report) + + # In case the company submits its report in different regions, a closing entry + # is made for each fiscal position defining a foreign VAT. + # We hence need to make sure to select a tax report in the right country when opening + # the report (in case there are many, we pick the first one available; it doesn't impact the closing) + if fiscal_position and fiscal_position.foreign_vat: + fpos_option = fiscal_position.id + report_country = fiscal_position.country_id + else: + fpos_option = 'domestic' + report_country = company.account_fiscal_country_id + + options = { + 'date': { + 'date_to': fields.Date.to_string(date_to), + 'filter': 'custom_tax_period', + 'mode': 'range', + }, + 'selected_variant_id': report.id, + 'sections_source_id': report.id, + 'fiscal_position': fpos_option, + 'tax_unit': 'company_only', + } + + if report.filter_multi_company == 'tax_units': + # Enforce multicompany if the closing is done for a tax unit + candidate_tax_unit = company.account_tax_unit_ids.filtered(lambda x: x.country_id == report_country) + if candidate_tax_unit: + options['tax_unit'] = candidate_tax_unit.id + company_ids = candidate_tax_unit.company_ids.ids + else: + same_vat_branches = self.env.company._get_branches_with_same_vat() + # Consider the one with the least number of parents (highest in hierarchy) as the active company, coming first + company_ids = same_vat_branches.sorted(lambda x: len(x.parent_ids)).ids + else: + company_ids = self.env.company.ids + + return report.with_context(allowed_company_ids=company_ids).get_options(previous_options=options) + + def _get_vat_report_attachments(self, report, options): + # Fetch pdf + pdf_data = report.export_to_pdf(options) + return [(pdf_data['file_name'], pdf_data['file_content'])] + + def _compute_tax_closing_alert(self): + for move in self: + move.tax_closing_alert = ( + move.state == 'posted' + and move.tax_closing_report_id + and move.company_id.tax_lock_date + and move.company_id.tax_lock_date < move.date + ) diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_move_line.py b/dev_odex30_accounting/odex30_account_reports/models/account_move_line.py new file mode 100644 index 0000000..b1a4d9f --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_move_line.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +from odoo import api, models, fields, _ + +from odoo.exceptions import UserError +from odoo.tools import SQL + +class AccountMoveLine(models.Model): + _inherit = "account.move.line" + + exclude_bank_lines = fields.Boolean(compute='_compute_exclude_bank_lines', store=True) + + @api.depends('journal_id') + def _compute_exclude_bank_lines(self): + for move_line in self: + move_line.exclude_bank_lines = move_line.account_id != move_line.journal_id.default_account_id + + @api.constrains('tax_ids', 'tax_tag_ids') + def _check_taxes_on_closing_entries(self): + for aml in self: + if aml.move_id.tax_closing_report_id and (aml.tax_ids or aml.tax_tag_ids): + raise UserError(_("You cannot add taxes on a tax closing move line.")) + + @api.depends('product_id', 'product_uom_id', 'move_id.tax_closing_report_id') + def _compute_tax_ids(self): + """ Some special cases may see accounts used in tax closing having default taxes. + They would trigger the constrains above, which we don't want. Instead, we don't trigger + the tax computation in this case. + """ + # EXTEND account + lines_to_compute = self.filtered(lambda line: not line.move_id.tax_closing_report_id) + (self - lines_to_compute).tax_ids = False + super(AccountMoveLine, lines_to_compute)._compute_tax_ids() + + @api.model + def _prepare_aml_shadowing_for_report(self, change_equivalence_dict): + """ Prepares the fields lists for creating a temporary table shadowing the account_move_line one. + This is used to switch the computation mode of the reports, with analytics or financial budgets, for example. + + :param change_equivalence_dict: A dict, in the form {aml_field: sql_equivalence}, where: + - aml_field: is a string containing the name of field of account.move.line + - sql_equivalence: is the value to use to shadow aml_field. It can be an SQL object; if + it's not, it'll be escaped in the query. + + :return: A tuple of 2 SQL objects, so that: + - The first one is the fields list to pass into the INSERT TO part of the query filling up the temporary table + - The second one contains the field values to insert into the SELECT clause of the same query, in the same order + as in the first element of the returned tuple. + """ + line_fields = self.env['account.move.line'].fields_get() + self.env.cr.execute("SELECT column_name FROM information_schema.columns WHERE table_name='account_move_line'") + stored_fields = {f[0] for f in self.env.cr.fetchall() if f[0] in line_fields} + + fields_to_insert = [] + for fname in stored_fields: + if fname in change_equivalence_dict: + fields_to_insert.append(SQL( + "%(original)s AS %(asname)s", + original=change_equivalence_dict[fname], + asname=SQL('"account_move_line.%s"', SQL(fname)), + )) + else: + line_field = line_fields[fname] + if line_field.get("translate"): + typecast = SQL('jsonb') + else: + typecast = SQL(self.env['account.move.line']._fields[fname].column_type[0]) + + fields_to_insert.append(SQL( + "CAST(NULL AS %(typecast)s) AS %(fname)s", + typecast=typecast, + fname=SQL('"account_move_line.%s"', SQL(fname)), + )) + + return SQL(', ').join(SQL.identifier(fname) for fname in stored_fields), SQL(', ').join(fields_to_insert) diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_multicurrency_revaluation_report.py b/dev_odex30_accounting/odex30_account_reports/models/account_multicurrency_revaluation_report.py new file mode 100644 index 0000000..5670b89 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_multicurrency_revaluation_report.py @@ -0,0 +1,386 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api, _ +from odoo.tools import float_is_zero, SQL +from odoo.exceptions import UserError + +from itertools import chain + + +class MulticurrencyRevaluationReportCustomHandler(models.AbstractModel): + """Manage Unrealized Gains/Losses. + + In multi-currencies environments, we need a way to control the risk related + to currencies (in case some are higthly fluctuating) and, in some countries, + some laws also require to create journal entries to record the provisionning + of a probable future expense related to currencies. Hence, people need to + create a journal entry at the beginning of a period, to make visible the + probable expense in reports (and revert it at the end of the period, to + recon the real gain/loss. + """ + _name = 'account.multicurrency.revaluation.report.handler' + _inherit = 'account.report.custom.handler' + _description = 'Multicurrency Revaluation Report Custom Handler' + + def _get_custom_display_config(self): + return { + 'components': { + 'AccountReportFilters': 'odex30_account_reports.MulticurrencyRevaluationReportFilters', + }, + 'templates': { + 'AccountReportLineName': 'odex30_account_reports.MulticurrencyRevaluationReportLineName', + }, + } + + def _custom_options_initializer(self, report, options, previous_options): + super()._custom_options_initializer(report, options, previous_options=previous_options) + active_currencies = self.env['res.currency'].search([('active', '=', True)]) + if len(active_currencies) < 2: + raise UserError(_("You need to activate more than one currency to access this report.")) + rates = active_currencies._get_rates(self.env.company, options.get('date').get('date_to')) + # Normalize the rates to the company's currency + company_rate = rates[self.env.company.currency_id.id] + for key in rates.keys(): + rates[key] /= company_rate + + options['currency_rates'] = { + str(currency_id.id): { + 'currency_id': currency_id.id, + 'currency_name': currency_id.name, + 'currency_main': self.env.company.currency_id.name, + 'rate': (rates[currency_id.id] + if not previous_options.get('currency_rates', {}).get(str(currency_id.id), {}).get('rate') else + float(previous_options['currency_rates'][str(currency_id.id)]['rate'])), + } for currency_id in active_currencies + } + + for currency_rates in options['currency_rates'].values(): + if currency_rates['rate'] == 0: + raise UserError(_("The currency rate cannot be equal to zero")) + + options['company_currency'] = options['currency_rates'].pop(str(self.env.company.currency_id.id)) + options['custom_rate'] = any( + not float_is_zero(cr['rate'] - rates[cr['currency_id']], 20) + for cr in options['currency_rates'].values() + ) + + options['multi_currency'] = True + options['buttons'].append({'name': _('Adjustment Entry'), 'sequence': 30, 'action': 'action_multi_currency_revaluation_open_revaluation_wizard', 'always_show': True}) + + def _customize_warnings(self, report, options, all_column_groups_expression_totals, warnings): + if len(self.env.companies) > 1: + warnings['odex30_account_reports.multi_currency_revaluation_report_warning_multicompany'] = {'alert_type': 'warning'} + if options['custom_rate']: + warnings['odex30_account_reports.multi_currency_revaluation_report_warning_custom_rate'] = {'alert_type': 'warning'} + + def _custom_line_postprocessor(self, report, options, lines): + line_to_adjust_id = self.env.ref('odex30_account_reports.multicurrency_revaluation_to_adjust').id + line_excluded_id = self.env.ref('odex30_account_reports.multicurrency_revaluation_excluded').id + + rslt = [] + for index, line in enumerate(lines): + res_model_name, res_id = report._get_model_info_from_id(line['id']) + + if res_model_name == 'account.report.line' and ( + (res_id == line_to_adjust_id and report._get_model_info_from_id(lines[index + 1]['id']) == ('account.report.line', line_excluded_id)) or + (res_id == line_excluded_id and index == len(lines) - 1) + ): + # 'To Adjust' and 'Excluded' lines need to be hidden if they have no child + continue + + elif res_model_name == 'res.currency': + # Include the rate in the currency_id group lines + line['name'] = '{for_cur} (1 {comp_cur} = {rate:.6} {for_cur})'.format( + for_cur=line['name'], + comp_cur=self.env.company.currency_id.display_name, + rate=float(options['currency_rates'][str(res_id)]['rate']), + ) + + elif res_model_name == 'account.account': + # Mark the included/excluded lines, so that the custom component templates knows what label to put on them + line['is_included_line'] = report._get_res_id_from_line_id(line['id'], 'account.account') == line_to_adjust_id + + # Inject the related model into the line dict in order to use it on the custom component template on js side to display buttons + line['cur_revaluation_line_model'] = res_model_name + + rslt.append(line) + + return rslt + + def _custom_groupby_line_completer(self, report, options, line_dict): + model_info_from_id = report._get_model_info_from_id(line_dict['id']) + if model_info_from_id[0] == 'res.currency': + line_dict['unfolded'] = True + line_dict['unfoldable'] = False + + def action_multi_currency_revaluation_open_revaluation_wizard(self, options): + """Open the revaluation wizard.""" + form = self.env.ref('odex30_account_reports.view_account_multicurrency_revaluation_wizard', False) + return { + 'name': _("Make Adjustment Entry"), + 'type': 'ir.actions.act_window', + 'res_model': 'account.multicurrency.revaluation.wizard', + 'view_mode': 'form', + 'view_id': form.id, + 'views': [(form.id, 'form')], + 'multi': 'True', + 'target': 'new', + 'context': { + **self._context, + 'multicurrency_revaluation_report_options': options, + }, + } + + # ACTIONS + def action_multi_currency_revaluation_open_general_ledger(self, options, params): + report = self.env['account.report'].browse(options['report_id']) + account_id = report._get_res_id_from_line_id(params['line_id'], 'account.account') + account_line_id = report._get_generic_line_id('account.account', account_id) + general_ledger_options = self.env.ref('odex30_account_reports.general_ledger_report').get_options(options) + general_ledger_options['unfolded_lines'] = [account_line_id] + + general_ledger_action = self.env['ir.actions.actions']._for_xml_id('odex30_account_reports.action_account_report_general_ledger') + general_ledger_action['params'] = { + 'options': general_ledger_options, + 'ignore_session': True, + } + + return general_ledger_action + + def action_multi_currency_revaluation_toggle_provision(self, options, params): + """ Include/exclude an account from the provision. """ + res_ids_map = self.env['account.report']._get_res_ids_from_line_id(params['line_id'], ['res.currency', 'account.account']) + account = self.env['account.account'].browse(res_ids_map['account.account']) + currency = self.env['res.currency'].browse(res_ids_map['res.currency']) + if currency in account.exclude_provision_currency_ids: + account.exclude_provision_currency_ids -= currency + else: + account.exclude_provision_currency_ids += currency + return { + 'type': 'ir.actions.client', + 'tag': 'reload', + } + + def action_multi_currency_revaluation_open_currency_rates(self, options, params=None): + """ Open the currency rate list. """ + currency_id = self.env['account.report']._get_res_id_from_line_id(params['line_id'], 'res.currency') + return { + 'type': 'ir.actions.act_window', + 'name': _('Currency Rates (%s)', self.env['res.currency'].browse(currency_id).display_name), + 'views': [(False, 'list')], + 'res_model': 'res.currency.rate', + 'context': {**self.env.context, **{'default_currency_id': currency_id, 'active_id': currency_id}}, + 'domain': [('currency_id', '=', currency_id)], + } + + def _report_custom_engine_multi_currency_revaluation_to_adjust(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + return self._multi_currency_revaluation_get_custom_lines(options, 'to_adjust', current_groupby, next_groupby, offset=offset, limit=limit) + + def _report_custom_engine_multi_currency_revaluation_excluded(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + return self._multi_currency_revaluation_get_custom_lines(options, 'excluded', current_groupby, next_groupby, offset=offset, limit=limit) + + def _multi_currency_revaluation_get_custom_lines(self, options, line_code, current_groupby, next_groupby, offset=0, limit=None): + def build_result_dict(report, query_res): + return { + 'balance_currency': query_res['balance_currency'] if len(query_res['currency_id']) == 1 else None, + 'currency_id': query_res['currency_id'][0] if len(query_res['currency_id']) == 1 else None, + 'balance_operation': query_res['balance_operation'], + 'balance_current': query_res['balance_current'], + 'adjustment': query_res['adjustment'], + 'has_sublines': query_res['aml_count'] > 0, + } + + report = self.env['account.report'].browse(options['report_id']) + report._check_groupby_fields((next_groupby.split(',') if next_groupby else []) + ([current_groupby] if current_groupby else [])) + + # No need to run any SQL if we're computing the main line: it does not display any total + if not current_groupby: + return { + 'balance_currency': None, + 'currency_id': None, + 'balance_operation': None, + 'balance_current': None, + 'adjustment': None, + 'has_sublines': False, + } + + query = "(VALUES {})".format(', '.join("(%s, %s)" for rate in options['currency_rates'])) + params = list(chain.from_iterable((cur['currency_id'], cur['rate']) for cur in options['currency_rates'].values())) + custom_currency_table_query = SQL(query, *params) + date_to = options['date']['date_to'] + select_part_not_an_exchange_move_id = SQL( + """ + NOT EXISTS ( + SELECT 1 + FROM account_partial_reconcile part_exch + WHERE part_exch.exchange_move_id = account_move_line.move_id + AND part_exch.max_date <= %s + ) + """, + date_to + ) + + query = report._get_report_query(options, 'strict_range') + groupby_field_sql = self.env['account.move.line']._field_to_sql("account_move_line", current_groupby, query) + tail_query = report._get_engine_query_tail(offset, limit) + full_query = SQL( + """ + WITH custom_currency_table(currency_id, rate) AS (%(custom_currency_table_query)s) + + -- Final select that gets the following lines: + -- (where there is a change in the rates of currency between the creation of the move and the full payments) + -- - Moves that don't have a payment yet at a certain date + -- - Moves that have a partial but are not fully paid at a certain date + SELECT + subquery.grouping_key, + ARRAY_AGG(DISTINCT(subquery.currency_id)) AS currency_id, + SUM(subquery.balance_currency) AS balance_currency, + SUM(subquery.balance_operation) AS balance_operation, + SUM(subquery.balance_current) AS balance_current, + SUM(subquery.adjustment) AS adjustment, + COUNT(subquery.aml_id) AS aml_count + FROM ( + -- Get moves that have at least one partial at a certain date and are not fully paid at that date + SELECT + %(groupby_field_sql)s AS grouping_key, + ROUND(account_move_line.balance - SUM(ara.amount_debit) + SUM(ara.amount_credit), aml_comp_currency.decimal_places) AS balance_operation, + ROUND(account_move_line.amount_currency - SUM(ara.amount_debit_currency) + SUM(ara.amount_credit_currency), aml_currency.decimal_places) AS balance_currency, + ROUND(account_move_line.amount_currency - SUM(ara.amount_debit_currency) + SUM(ara.amount_credit_currency), aml_currency.decimal_places) / custom_currency_table.rate AS balance_current, + ( + -- adjustment is computed as: balance_current - balance_operation + ROUND( account_move_line.amount_currency - SUM(ara.amount_debit_currency) + SUM(ara.amount_credit_currency), aml_currency.decimal_places) / custom_currency_table.rate + - ROUND(account_move_line.balance - SUM(ara.amount_debit) + SUM(ara.amount_credit), aml_comp_currency.decimal_places) + ) AS adjustment, + account_move_line.currency_id AS currency_id, + account_move_line.id AS aml_id + FROM %(table_references)s, + account_account AS account, + res_currency AS aml_currency, + res_currency AS aml_comp_currency, + custom_currency_table, + + -- Get for each move line the amount residual and amount_residual currency + -- both for matched "debit" and matched "credit" the same way as account.move.line + -- '_compute_amount_residual()' method does + -- (using LATERAL greatly reduce the number of lines for which we have to compute it) + LATERAL ( + -- Get sum of matched "debit" amount and amount in currency for related move line at date + SELECT COALESCE(SUM(part.amount), 0.0) AS amount_debit, + ROUND( + SUM(part.debit_amount_currency), + curr.decimal_places + ) AS amount_debit_currency, + 0.0 AS amount_credit, + 0.0 AS amount_credit_currency, + account_move_line.currency_id AS currency_id, + account_move_line.id AS aml_id + FROM account_partial_reconcile part + JOIN res_currency curr ON curr.id = part.debit_currency_id + WHERE account_move_line.id = part.debit_move_id + AND part.max_date <= %(date_to)s + GROUP BY aml_id, + curr.decimal_places + UNION + -- Get sum of matched "credit" amount and amount in currency for related move line at date + SELECT 0.0 AS amount_debit, + 0.0 AS amount_debit_currency, + COALESCE(SUM(part.amount), 0.0) AS amount_credit, + ROUND( + SUM(part.credit_amount_currency), + curr.decimal_places + ) AS amount_credit_currency, + account_move_line.currency_id AS currency_id, + account_move_line.id AS aml_id + FROM account_partial_reconcile part + JOIN res_currency curr ON curr.id = part.credit_currency_id + WHERE account_move_line.id = part.credit_move_id + AND part.max_date <= %(date_to)s + GROUP BY aml_id, + curr.decimal_places + ) AS ara + WHERE %(search_condition)s + AND account_move_line.account_id = account.id + AND account_move_line.currency_id = aml_currency.id + AND account_move_line.company_currency_id = aml_comp_currency.id + AND account_move_line.currency_id = custom_currency_table.currency_id + AND account.account_type NOT IN ('income', 'income_other', 'expense', 'expense_depreciation', 'expense_direct_cost', 'off_balance') + AND ( + account.currency_id != account_move_line.company_currency_id + OR ( + account.account_type IN ('asset_receivable', 'liability_payable') + AND (account_move_line.currency_id != account_move_line.company_currency_id) + ) + ) + AND %(exist_condition)s ( + SELECT 1 + FROM account_account_exclude_res_currency_provision + WHERE account_account_id = account_move_line.account_id + AND res_currency_id = account_move_line.currency_id + ) + AND (%(select_part_not_an_exchange_move_id)s) + GROUP BY account_move_line.id, grouping_key, aml_comp_currency.decimal_places, aml_currency.decimal_places, custom_currency_table.rate + HAVING ROUND(account_move_line.balance - SUM(ara.amount_debit) + SUM(ara.amount_credit), aml_comp_currency.decimal_places) != 0 + OR ROUND(account_move_line.amount_currency - SUM(ara.amount_debit_currency) + SUM(ara.amount_credit_currency), aml_currency.decimal_places) != 0.0 + + UNION + -- Moves that don't have a payment yet at a certain date + SELECT + %(groupby_field_sql)s AS grouping_key, + account_move_line.balance AS balance_operation, + account_move_line.amount_currency AS balance_currency, + account_move_line.amount_currency / custom_currency_table.rate AS balance_current, + account_move_line.amount_currency / custom_currency_table.rate - account_move_line.balance AS adjustment, + account_move_line.currency_id AS currency_id, + account_move_line.id AS aml_id + FROM %(table_references)s + JOIN account_account account ON account_move_line.account_id = account.id + JOIN custom_currency_table ON custom_currency_table.currency_id = account_move_line.currency_id + WHERE %(search_condition)s + AND account.account_type NOT IN ('income', 'income_other', 'expense', 'expense_depreciation', 'expense_direct_cost', 'off_balance') + AND ( + account.currency_id != account_move_line.company_currency_id + OR ( + account.account_type IN ('asset_receivable', 'liability_payable') + AND (account_move_line.currency_id != account_move_line.company_currency_id) + ) + ) + AND %(exist_condition)s ( + SELECT 1 + FROM account_account_exclude_res_currency_provision + WHERE account_account_id = account_id + AND res_currency_id = account_move_line.currency_id + ) + AND (%(select_part_not_an_exchange_move_id)s) + AND NOT EXISTS ( + SELECT 1 FROM account_partial_reconcile part + WHERE (part.debit_move_id = account_move_line.id OR part.credit_move_id = account_move_line.id) + AND part.max_date <= %(date_to)s + ) + AND (account_move_line.balance != 0.0 OR account_move_line.amount_currency != 0.0) + + ) subquery + + GROUP BY grouping_key + ORDER BY grouping_key + %(tail_query)s + """, + groupby_field_sql=groupby_field_sql, + custom_currency_table_query=custom_currency_table_query, + exist_condition=SQL('NOT EXISTS') if line_code == 'to_adjust' else SQL('EXISTS'), + table_references=query.from_clause, + date_to=date_to, + tail_query=tail_query, + search_condition=query.where_clause, + select_part_not_an_exchange_move_id=select_part_not_an_exchange_move_id, + ) + self._cr.execute(full_query) + query_res_lines = self._cr.dictfetchall() + + if not current_groupby: + return build_result_dict(report, query_res_lines and query_res_lines[0] or {}) + else: + rslt = [] + for query_res in query_res_lines: + grouping_key = query_res['grouping_key'] + rslt.append((grouping_key, build_result_dict(report, query_res))) + return rslt diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_partner_ledger.py b/dev_odex30_accounting/odex30_account_reports/models/account_partner_ledger.py new file mode 100644 index 0000000..d6ea0db --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_partner_ledger.py @@ -0,0 +1,815 @@ + +from odoo import api, models, _, fields +from odoo.exceptions import UserError +from odoo.osv import expression +from odoo.tools import SQL + +from datetime import timedelta +from collections import defaultdict +from copy import deepcopy + + +class PartnerLedgerCustomHandler(models.AbstractModel): + _name = 'account.partner.ledger.report.handler' + _inherit = 'account.report.custom.handler' + _description = 'Partner Ledger Custom Handler' + + def _get_custom_display_config(self): + return { + 'css_custom_class': 'partner_ledger', + 'components': { + 'AccountReportLineCell': 'odex30_account_reports.PartnerLedgerLineCell', + }, + 'templates': { + 'AccountReportFilters': 'odex30_account_reports.PartnerLedgerFilters', + 'AccountReportLineName': 'odex30_account_reports.PartnerLedgerLineName', + }, + } + + def _dynamic_lines_generator(self, report, options, all_column_groups_expression_totals, warnings=None): + partner_lines, totals_by_column_group = self._build_partner_lines(report, options) + lines = report._regroup_lines_by_name_prefix(options, partner_lines, '_report_expand_unfoldable_line_partner_ledger_prefix_group', 0) + + # Inject sequence on dynamic lines + lines = [(0, line) for line in lines] + + # Report total line. + lines.append((0, self._get_report_line_total(options, totals_by_column_group))) + + return lines + + def _build_partner_lines(self, report, options, level_shift=0): + lines = [] + + totals_by_column_group = { + column_group_key: { + total: 0.0 + for total in ['debit', 'credit', 'amount', 'balance'] + } + for column_group_key in options['column_groups'] + } + + partners_results = self._query_partners(report, options) + + search_filter = options.get('filter_search_bar', '') + accept_unknown_in_filter = search_filter.lower() in self._get_no_partner_line_label().lower() + for partner, results in partners_results: + if options['export_mode'] == 'print' and search_filter and not partner and not accept_unknown_in_filter: + # When printing and searching for a specific partner, make it so we only show its lines, not the 'Unknown Partner' one, that would be + # shown in case a misc entry with no partner was reconciled with one of the target partner's entries. + continue + + partner_values = defaultdict(dict) + for column_group_key in options['column_groups']: + partner_sum = results.get(column_group_key, {}) + + partner_values[column_group_key]['debit'] = partner_sum.get('debit', 0.0) + partner_values[column_group_key]['credit'] = partner_sum.get('credit', 0.0) + partner_values[column_group_key]['amount'] = partner_sum.get('amount', 0.0) + partner_values[column_group_key]['balance'] = partner_sum.get('balance', 0.0) + + totals_by_column_group[column_group_key]['debit'] += partner_values[column_group_key]['debit'] + totals_by_column_group[column_group_key]['credit'] += partner_values[column_group_key]['credit'] + totals_by_column_group[column_group_key]['amount'] += partner_values[column_group_key]['amount'] + totals_by_column_group[column_group_key]['balance'] += partner_values[column_group_key]['balance'] + + lines.append(self._get_report_line_partners(options, partner, partner_values, level_shift=level_shift)) + + return lines, totals_by_column_group + + def _report_expand_unfoldable_line_partner_ledger_prefix_group(self, line_dict_id, groupby, options, progress, offset, unfold_all_batch_data=None): + report = self.env['account.report'].browse(options['report_id']) + matched_prefix = report._get_prefix_groups_matched_prefix_from_line_id(line_dict_id) + + prefix_domain = [('partner_id.name', '=ilike', f'{matched_prefix}%')] + if self._get_no_partner_line_label().upper().startswith(matched_prefix): + prefix_domain = expression.OR([prefix_domain, [('partner_id', '=', None)]]) + + expand_options = { + **options, + 'forced_domain': options.get('forced_domain', []) + prefix_domain + } + parent_level = len(matched_prefix) * 2 + partner_lines, dummy = self._build_partner_lines(report, expand_options, level_shift=parent_level) + + for partner_line in partner_lines: + partner_line['id'] = report._build_subline_id(line_dict_id, partner_line['id']) + partner_line['parent_id'] = line_dict_id + + lines = report._regroup_lines_by_name_prefix( + options, + partner_lines, + '_report_expand_unfoldable_line_partner_ledger_prefix_group', + parent_level, + matched_prefix=matched_prefix, + parent_line_dict_id=line_dict_id, + ) + + return { + 'lines': lines, + 'offset_increment': len(lines), + 'has_more': False, + } + + def _custom_options_initializer(self, report, options, previous_options): + super()._custom_options_initializer(report, options, previous_options=previous_options) + domain = [] + + company_ids = report.get_report_company_ids(options) + exch_code = self.env['res.company'].browse(company_ids).mapped('currency_exchange_journal_id') + if exch_code: + domain += ['!', '&', '&', '&', ('credit', '=', 0.0), ('debit', '=', 0.0), ('amount_currency', '!=', 0.0), ('journal_id', 'in', exch_code.ids)] + + if options['export_mode'] == 'print' and options.get('filter_search_bar'): + domain += [ + '|', ('matched_debit_ids.debit_move_id.partner_id.name', 'ilike', options['filter_search_bar']), + '|', ('matched_credit_ids.credit_move_id.partner_id.name', 'ilike', options['filter_search_bar']), + '|', ('partner_id.name', 'ilike', options['filter_search_bar']), + ('partner_id', '=', False), + ] + + options['forced_domain'] = options.get('forced_domain', []) + domain + + if self.env.user.has_group('base.group_multi_currency'): + options['multi_currency'] = True + else: + options['columns'] = [col for col in options['columns'] if col['expression_label'] != 'amount_currency'] + + if not self.env.ref('odex30_account_reports.customer_statement_report', raise_if_not_found=False): + # Deprecated, will be removed in master + columns_to_hide = [] + options['hide_account'] = (previous_options or {}).get('hide_account', False) + columns_to_hide += ['journal_code', 'account_code', 'matching_number'] if options['hide_account'] else [] + + options['hide_debit_credit'] = (previous_options or {}).get('hide_debit_credit', False) + columns_to_hide += ['debit', 'credit'] if options['hide_debit_credit'] else ['amount'] + + options['columns'] = [col for col in options['columns'] if col['expression_label'] not in columns_to_hide] + + options['buttons'].append({ + 'name': _('Send'), + 'action': 'action_send_statements', + 'sequence': 90, + 'always_show': True, + }) + + def _custom_unfold_all_batch_data_generator(self, report, options, lines_to_expand_by_function): + partner_ids_to_expand = [] + + # Regular case + for line_dict in lines_to_expand_by_function.get('_report_expand_unfoldable_line_partner_ledger', []): + markup, model, model_id = self.env['account.report']._parse_line_id(line_dict['id'])[-1] + if model == 'res.partner': + partner_ids_to_expand.append(model_id) + elif markup == 'no_partner': + partner_ids_to_expand.append(None) + + # In case prefix groups are used + no_partner_line_label = self._get_no_partner_line_label().upper() + partner_prefix_domains = [] + for line_dict in lines_to_expand_by_function.get('_report_expand_unfoldable_line_partner_ledger_prefix_group', []): + prefix = report._get_prefix_groups_matched_prefix_from_line_id(line_dict['id']) + partner_prefix_domains.append([('name', '=ilike', f'{prefix}%')]) + + # amls without partners are regrouped "Unknown Partner", which is also used to create prefix groups + if no_partner_line_label.startswith(prefix): + partner_ids_to_expand.append(None) + + if partner_prefix_domains: + partner_ids_to_expand += self.env['res.partner'].with_context(active_test=False).search(expression.OR(partner_prefix_domains)).ids + + return { + 'initial_balances': self._get_initial_balance_values(partner_ids_to_expand, options) if partner_ids_to_expand else {}, + + # load_more_limit cannot be passed to this call, otherwise it won't be applied per partner but on the whole result. + # We gain perf from batching, but load every result, even if the limit restricts them later. + 'aml_values': self._get_aml_values(options, partner_ids_to_expand) if partner_ids_to_expand else {}, + } + + def _get_report_send_recipients(self, options): + # Deprecated, to be moved to customer statement handler in master + partners = options.get('partner_ids', []) + if not partners: + report = self.env['account.report'].browse(options['report_id']) + self._cr.execute(self._get_query_sums(report, options)) + partners = [row['groupby'] for row in self._cr.dictfetchall() if row['groupby']] + return self.env['res.partner'].browse(partners) + + def action_send_statements(self, options): + # Deprecated, to be moved to customer statement handler in master + template = self.env.ref('odex30_account_reports.email_template_customer_statement', False) + partners = self.env['res.partner'].browse(options.get('partner_ids', [])) + return { + 'name': _("Send %s Statement", partners.name) if len(partners) == 1 else _("Send Partner Ledgers"), + 'type': 'ir.actions.act_window', + 'views': [[False, 'form']], + 'res_model': 'account.report.send', + 'target': 'new', + 'context': { + 'default_mail_template_id': template.id if template else False, + 'default_report_options': options, + }, + } + + @api.model + def action_open_partner(self, options, params): + dummy, record_id = self.env['account.report']._get_model_info_from_id(params['id']) + return { + 'type': 'ir.actions.act_window', + 'res_model': 'res.partner', + 'res_id': record_id, + 'views': [[False, 'form']], + 'view_mode': 'form', + 'target': 'current', + } + + def _query_partners(self, report, options): + """ Executes the queries and performs all the computation. + :return: A list of tuple (partner, column_group_values) sorted by the table's model _order: + - partner is a res.parter record. + - column_group_values is a dict(column_group_key, fetched_values), where + - column_group_key is a string identifying a column group, like in options['column_groups'] + - fetched_values is a dictionary containing: + - sum: {'debit': float, 'credit': float, 'balance': float} + - (optional) initial_balance: {'debit': float, 'credit': float, 'balance': float} + - (optional) lines: [line_vals_1, line_vals_2, ...] + """ + def assign_sum(row): + fields_to_assign = ['balance', 'debit', 'credit', 'amount'] + if any(not company_currency.is_zero(row[field]) for field in fields_to_assign): + groupby_partners.setdefault(row['groupby'], defaultdict(lambda: defaultdict(float))) + for field in fields_to_assign: + groupby_partners[row['groupby']][row['column_group_key']][field] += row[field] + + company_currency = self.env.company.currency_id + + # Execute the queries and dispatch the results. + query = self._get_query_sums(report, options) + + groupby_partners = {} + + self._cr.execute(query) + for res in self._cr.dictfetchall(): + assign_sum(res) + + # Correct the sums per partner, for the lines without partner reconciled with a line having a partner + self._add_sums_of_lines_without_partners(options, groupby_partners) + + # Retrieve the partners to browse. + # groupby_partners.keys() contains all account ids affected by: + # - the amls in the current period. + # - the amls affecting the initial balance. + if groupby_partners: + # Note a search is done instead of a browse to preserve the table ordering. + partners = self.env['res.partner'].with_context(active_test=False).search_fetch([('id', 'in', list(groupby_partners.keys()))], ["id", "name", "trust", "company_registry", "vat"]) + else: + partners = [] + + # Add 'Partner Unknown' if needed + if None in groupby_partners.keys(): + partners = [p for p in partners] + [None] + + return [(partner, groupby_partners[partner.id if partner else None]) for partner in partners] + + def _get_query_sums(self, report, options) -> SQL: + """ Construct a query retrieving all the aggregated sums to build the report. It includes: + - sums for all partners. + - sums for the initial balances. + :param options: The report options. + :return: query as SQL object + """ + queries = [] + + # Create the currency table. + for column_group_key, column_group_options in report._split_options_per_column_group(options).items(): + query = report._get_report_query(column_group_options, 'from_beginning') + date_from = options['date']['date_from'] + queries.append(SQL( + """ + (WITH partner_sums AS ( + SELECT + account_move_line.partner_id AS groupby, + %(column_group_key)s AS column_group_key, + SUM(%(debit_select)s) AS debit, + SUM(%(credit_select)s) AS credit, + SUM(%(balance_select)s) AS amount, + SUM(%(balance_select)s) AS balance, + BOOL_AND(account_move_line.reconciled) AS all_reconciled, + MAX(account_move_line.date) AS latest_date + FROM %(table_references)s + %(currency_table_join)s + WHERE %(search_condition)s + GROUP BY account_move_line.partner_id + ) + SELECT * + FROM partner_sums + WHERE partner_sums.balance != 0 + OR partner_sums.all_reconciled = FALSE + OR partner_sums.latest_date >= %(date_from)s + )""", + column_group_key=column_group_key, + debit_select=report._currency_table_apply_rate(SQL("account_move_line.debit")), + credit_select=report._currency_table_apply_rate(SQL("account_move_line.credit")), + balance_select=report._currency_table_apply_rate(SQL("account_move_line.balance")), + table_references=query.from_clause, + currency_table_join=report._currency_table_aml_join(column_group_options), + search_condition=query.where_clause, + date_from=date_from, + )) + + return SQL(' UNION ALL ').join(queries) + + def _get_initial_balance_values(self, partner_ids, options): + queries = [] + report = self.env.ref('odex30_account_reports.partner_ledger_report') + for column_group_key, column_group_options in report._split_options_per_column_group(options).items(): + # Get sums for the initial balance. + # period: [('date' <= options['date_from'] - 1)] + new_options = self._get_options_initial_balance(column_group_options) + query = report._get_report_query(new_options, 'from_beginning', domain=[('partner_id', 'in', partner_ids)]) + queries.append(SQL( + """ + SELECT + account_move_line.partner_id, + %(column_group_key)s AS column_group_key, + SUM(%(debit_select)s) AS debit, + SUM(%(credit_select)s) AS credit, + SUM(%(balance_select)s) AS amount, + SUM(%(balance_select)s) AS balance + FROM %(table_references)s + %(currency_table_join)s + WHERE %(search_condition)s + GROUP BY account_move_line.partner_id + """, + column_group_key=column_group_key, + debit_select=report._currency_table_apply_rate(SQL("account_move_line.debit")), + credit_select=report._currency_table_apply_rate(SQL("account_move_line.credit")), + balance_select=report._currency_table_apply_rate(SQL("account_move_line.balance")), + table_references=query.from_clause, + currency_table_join=report._currency_table_aml_join(column_group_options), + search_condition=query.where_clause, + )) + + self._cr.execute(SQL(" UNION ALL ").join(queries)) + + init_balance_by_col_group = { + partner_id: {column_group_key: defaultdict(float) for column_group_key in options['column_groups']} + for partner_id in partner_ids + } + for result in self._cr.dictfetchall(): + init_balance_by_col_group[result['partner_id']][result['column_group_key']] = result + + # Correct the sums per partner, for the lines without partner reconciled with a line having a partner + new_options = self._get_options_initial_balance(options) + self._add_sums_of_lines_without_partners(new_options, init_balance_by_col_group) + + return init_balance_by_col_group + + def _get_options_initial_balance(self, options): + """ Create options used to compute the initial balances for each partner. + The resulting dates domain will be: + [('date' <= options['date_from'] - 1)] + :param options: The report options. + :return: A copy of the options, modified to match the dates to use to get the initial balances. + """ + new_date_to = fields.Date.from_string(options['date']['date_from']) - timedelta(days=1) + new_options = deepcopy(options) + new_options['date']['date_from'] = False + new_options['date']['date_to'] = fields.Date.to_string(new_date_to) + for column_group in new_options['column_groups'].values(): + column_group['forced_options']['date'] = new_options['date'] + return new_options + + def _add_sums_of_lines_without_partners(self, options, result_dict): + fields2inverse = { + 'balance': ('balance', -1), + 'debit': ('credit', 1), + 'amount': ('amount', 1), + 'credit': ('debit', 1), + } + query = self._get_sums_without_partner(options) + self._cr.execute(query) + rows = self._cr.dictfetchall() + for row in rows: + for field, (inverse_field, inverse_sign) in fields2inverse.items(): + if partner_vals := result_dict.get(row['groupby']): + partner_vals[row['column_group_key']][field] += row[field] + if no_partner_vals := result_dict.get(None): + # Debit/credit are inverted for the unknown partner as the computation is made regarding the balance of the known partner + no_partner_vals[row['column_group_key']][inverse_field] += inverse_sign * row[field] + + def _get_sums_without_partner(self, options): + """ Get the sum of lines without partner reconciled with a line with a partner, grouped by partner. Those lines + should be considered as belonging to the partner for the reconciled amount as it may clear some of the partner + invoice/bill and they have to be accounted in the partner balance.""" + queries = [] + report = self.env.ref('odex30_account_reports.partner_ledger_report') + for column_group_key, column_group_options in report._split_options_per_column_group(options).items(): + query = report._get_report_query(column_group_options, 'from_beginning') + queries.append(SQL( + """ + SELECT + %(column_group_key)s AS column_group_key, + aml_with_partner.partner_id AS groupby, + SUM(%(debit_select)s) AS debit, + SUM(%(credit_select)s) AS credit, + SUM(%(balance_select)s) AS amount, + SUM(%(balance_select)s) AS balance + FROM %(table_references)s + JOIN account_partial_reconcile partial + ON account_move_line.id = partial.debit_move_id OR account_move_line.id = partial.credit_move_id + JOIN account_move_line aml_with_partner ON + (aml_with_partner.id = partial.debit_move_id OR aml_with_partner.id = partial.credit_move_id) + AND aml_with_partner.partner_id IS NOT NULL + %(currency_table_join)s + WHERE partial.max_date <= %(date_to)s AND %(search_condition)s + AND account_move_line.partner_id IS NULL + GROUP BY aml_with_partner.partner_id + """, + column_group_key=column_group_key, + debit_select=report._currency_table_apply_rate(SQL("CASE WHEN aml_with_partner.balance > 0 THEN 0 ELSE partial.amount END")), + credit_select=report._currency_table_apply_rate(SQL("CASE WHEN aml_with_partner.balance < 0 THEN 0 ELSE partial.amount END")), + balance_select=report._currency_table_apply_rate(SQL("-SIGN(aml_with_partner.balance) * partial.amount")), + table_references=query.from_clause, + currency_table_join=report._currency_table_aml_join(column_group_options, aml_alias=SQL("aml_with_partner")), + date_to=column_group_options['date']['date_to'], + search_condition=query.where_clause, + )) + + return SQL(" UNION ALL ").join(queries) + + def _report_expand_unfoldable_line_partner_ledger(self, line_dict_id, groupby, options, progress, offset, unfold_all_batch_data=None): + report = self.env['account.report'].browse(options['report_id']) + markup, model, record_id = report._parse_line_id(line_dict_id)[-1] + + if model != 'res.partner': + raise UserError(_("Wrong ID for partner ledger line to expand: %s", line_dict_id)) + + prefix_groups_count = 0 + for markup, dummy1, dummy2 in report._parse_line_id(line_dict_id): + if isinstance(markup, dict) and 'groupby_prefix_group' in markup: + prefix_groups_count += 1 + level_shift = prefix_groups_count * 2 + + lines = [] + + # Get initial balance + if offset == 0 and not options.get('hide_initial_balance'): + if unfold_all_batch_data: + init_balance_by_col_group = unfold_all_batch_data['initial_balances'][record_id] + else: + init_balance_by_col_group = self._get_initial_balance_values([record_id], options)[record_id] + initial_balance_line = report._get_partner_and_general_ledger_initial_balance_line(options, line_dict_id, init_balance_by_col_group, level_shift=level_shift) + if initial_balance_line: + lines.append(initial_balance_line) + + # For the first expansion of the line, the initial balance line gives the progress + progress = self._init_load_more_progress(options, initial_balance_line) + + limit_to_load = report.load_more_limit + 1 if report.load_more_limit and options['export_mode'] != 'print' else None + + if unfold_all_batch_data: + aml_results = unfold_all_batch_data['aml_values'][record_id] + else: + aml_results = self._get_aml_values(options, [record_id], offset=offset, limit=limit_to_load)[record_id] + + aml_report_lines, next_progress, treated_results_count, has_more = self._get_partner_aml_report_lines(report, options, line_dict_id, aml_results, progress, offset, level_shift=level_shift) + lines.extend(aml_report_lines) + + return { + 'lines': lines, + 'offset_increment': treated_results_count, + 'has_more': has_more, + 'progress': next_progress + } + + def _init_load_more_progress(self, options, line_dict): + return { + column['column_group_key']: line_col.get('no_format', 0) + for column, line_col in zip(options['columns'], line_dict['columns']) + if column['expression_label'] == 'balance' + } + + def _get_partner_aml_report_lines(self, report, options, partner_line_id, aml_results, progress, offset=0, level_shift=0): + lines = [] + has_more = False + treated_results_count = 0 + next_progress = progress + for result in aml_results: + if self._is_report_limit_reached(report, options, treated_results_count): + # We loaded one more than the limit on purpose: this way we know we need a "load more" line + has_more = True + break + + new_line = self._get_report_line_move_line(options, result, partner_line_id, next_progress, level_shift=level_shift) + lines.append(new_line) + next_progress = self._init_load_more_progress(options, new_line) + treated_results_count += 1 + return lines, next_progress, treated_results_count, has_more + + def _is_report_limit_reached(self, report, options, results_count): + return options['export_mode'] != 'print' and report.load_more_limit and results_count == report.load_more_limit + + def _get_additional_column_aml_values(self): + """ + Allows customization of additional fields in the partner ledger query. + + This method is intended to be overridden by other modules to add custom fields + to the partner ledger query, e.g. SQL("account_move_line.date AS date,"). + + By default, it returns an empty SQL object. + """ + return SQL() + + def _get_order_by_aml_values(self): + return SQL('account_move_line.date, account_move_line.id') + + def _get_aml_values(self, options, partner_ids, offset=0, limit=None): + rslt = {partner_id: [] for partner_id in partner_ids} + + partner_ids_wo_none = [x for x in partner_ids if x] + directly_linked_aml_partner_clauses = [] + indirectly_linked_aml_partner_clause = SQL('aml_with_partner.partner_id IS NOT NULL') + if None in partner_ids: + directly_linked_aml_partner_clauses.append(SQL('account_move_line.partner_id IS NULL')) + if partner_ids_wo_none: + directly_linked_aml_partner_clauses.append(SQL('account_move_line.partner_id IN %s', tuple(partner_ids_wo_none))) + indirectly_linked_aml_partner_clause = SQL('aml_with_partner.partner_id IN %s', tuple(partner_ids_wo_none)) + directly_linked_aml_partner_clause = SQL('(%s)', SQL(' OR ').join(directly_linked_aml_partner_clauses)) + + queries = [] + journal_name = self.env['account.journal']._field_to_sql('journal', 'name') + report = self.env.ref('odex30_account_reports.partner_ledger_report') + additional_columns = self._get_additional_column_aml_values() + order_by = self._get_order_by_aml_values() + for column_group_key, group_options in report._split_options_per_column_group(options).items(): + query = report._get_report_query(group_options, 'strict_range') + account_alias = query.left_join(lhs_alias='account_move_line', lhs_column='account_id', rhs_table='account_account', rhs_column='id', link='account_id') + account_code = self.env['account.account']._field_to_sql(account_alias, 'code', query) + account_name = self.env['account.account']._field_to_sql(account_alias, 'name') + + # For the move lines directly linked to this partner + # ruff: noqa: FURB113 + queries.append(SQL( + ''' + SELECT + account_move_line.id, + COALESCE(account_move_line.date_maturity, account_move_line.date) AS date_maturity, + account_move_line.name, + account_move_line.ref, + account_move_line.company_id, + account_move_line.account_id, + account_move_line.payment_id, + account_move_line.partner_id, + account_move_line.currency_id, + account_move_line.amount_currency, + account_move_line.matching_number, + %(additional_columns)s + COALESCE(account_move_line.invoice_date, account_move_line.date) AS invoice_date, + %(debit_select)s AS debit, + %(credit_select)s AS credit, + %(balance_select)s AS amount, + %(balance_select)s AS balance, + account_move.name AS move_name, + account_move.move_type AS move_type, + %(account_code)s AS account_code, + %(account_name)s AS account_name, + journal.code AS journal_code, + %(journal_name)s AS journal_name, + %(column_group_key)s AS column_group_key, + 'directly_linked_aml' AS key, + 0 AS partial_id + %(extra_select)s + FROM %(table_references)s + JOIN account_move ON account_move.id = account_move_line.move_id + %(currency_table_join)s + LEFT JOIN res_company company ON company.id = account_move_line.company_id + LEFT JOIN res_partner partner ON partner.id = account_move_line.partner_id + LEFT JOIN account_journal journal ON journal.id = account_move_line.journal_id + WHERE %(search_condition)s AND %(directly_linked_aml_partner_clause)s + ORDER BY %(order_by)s + ''', + additional_columns=additional_columns, + debit_select=report._currency_table_apply_rate(SQL("account_move_line.debit")), + credit_select=report._currency_table_apply_rate(SQL("account_move_line.credit")), + balance_select=report._currency_table_apply_rate(SQL("account_move_line.balance")), + account_code=account_code, + account_name=account_name, + journal_name=journal_name, + column_group_key=column_group_key, + table_references=query.from_clause, + currency_table_join=report._currency_table_aml_join(group_options), + search_condition=query.where_clause, + directly_linked_aml_partner_clause=directly_linked_aml_partner_clause, + order_by=order_by, + extra_select=SQL(' ').join(self._get_aml_value_extra_select()), + )) + + # For the move lines linked to no partner, but reconciled with this partner. They will appear in grey in the report + queries.append(SQL( + ''' + SELECT + account_move_line.id, + COALESCE(account_move_line.date_maturity, account_move_line.date) AS date_maturity, + account_move_line.name, + account_move_line.ref, + account_move_line.company_id, + account_move_line.account_id, + account_move_line.payment_id, + aml_with_partner.partner_id, + account_move_line.currency_id, + account_move_line.amount_currency, + account_move_line.matching_number, + %(additional_columns)s + COALESCE(account_move_line.invoice_date, account_move_line.date) AS invoice_date, + %(debit_select)s AS debit, + %(credit_select)s AS credit, + %(balance_select)s AS amount, + %(balance_select)s AS balance, + account_move.name AS move_name, + account_move.move_type AS move_type, + %(account_code)s AS account_code, + %(account_name)s AS account_name, + journal.code AS journal_code, + %(journal_name)s AS journal_name, + %(column_group_key)s AS column_group_key, + 'indirectly_linked_aml' AS key, + partial.id AS partial_id + %(extra_select)s + FROM %(table_references)s + %(currency_table_join)s, + account_partial_reconcile partial, + account_move, + account_move_line aml_with_partner, + account_journal journal + WHERE + (account_move_line.id = partial.debit_move_id OR account_move_line.id = partial.credit_move_id) + AND account_move_line.partner_id IS NULL + AND account_move.id = account_move_line.move_id + AND (aml_with_partner.id = partial.debit_move_id OR aml_with_partner.id = partial.credit_move_id) + AND %(indirectly_linked_aml_partner_clause)s + AND journal.id = account_move_line.journal_id + AND %(account_alias)s.id = account_move_line.account_id + AND %(search_condition)s + AND partial.max_date BETWEEN %(date_from)s AND %(date_to)s + ORDER BY %(order_by)s + ''', + additional_columns=additional_columns, + debit_select=report._currency_table_apply_rate(SQL("CASE WHEN aml_with_partner.balance > 0 THEN 0 ELSE partial.amount END")), + credit_select=report._currency_table_apply_rate(SQL("CASE WHEN aml_with_partner.balance < 0 THEN 0 ELSE partial.amount END")), + balance_select=report._currency_table_apply_rate(SQL("-SIGN(aml_with_partner.balance) * partial.amount")), + account_code=account_code, + account_name=account_name, + journal_name=journal_name, + column_group_key=column_group_key, + table_references=query.from_clause, + currency_table_join=report._currency_table_aml_join(group_options), + indirectly_linked_aml_partner_clause=indirectly_linked_aml_partner_clause, + account_alias=SQL.identifier(account_alias), + search_condition=query.where_clause, + date_from=group_options['date']['date_from'], + date_to=group_options['date']['date_to'], + order_by=order_by, + extra_select=SQL(' ').join(self._get_aml_value_extra_select()), + )) + + query = SQL(" UNION ALL ").join(SQL("(%s)", query) for query in queries) + + if offset: + query = SQL('%s OFFSET %s ', query, offset) + + if limit: + query = SQL('%s LIMIT %s ', query, limit) + + self._cr.execute(query) + for aml_result in self._cr.dictfetchall(): + if aml_result['key'] == 'indirectly_linked_aml': + + # Append the line to the partner found through the reconciliation. + if aml_result['partner_id'] in rslt: + rslt[aml_result['partner_id']].append(aml_result) + + # Balance it with an additional line in the Unknown Partner section but having reversed amounts. + if None in rslt: + rslt[None].append({ + **aml_result, + 'debit': aml_result['credit'], + 'credit': aml_result['debit'], + 'amount': aml_result['credit'] - aml_result['debit'], + 'balance': -aml_result['balance'], + }) + else: + rslt[aml_result['partner_id']].append(aml_result) + + return rslt + + def _get_aml_value_extra_select(self): + """ Hook method to add extra select fields to the aml queries. """ + return [] + + #################################################### + # COLUMNS/LINES + #################################################### + def _get_report_line_partners(self, options, partner, partner_values, level_shift=0): + company_currency = self.env.company.currency_id + + partner_data = next(iter(partner_values.values())) + unfoldable = not company_currency.is_zero(partner_data.get('debit', 0) or partner_data.get('credit', 0)) + column_values = [] + report = self.env['account.report'].browse(options['report_id']) + for column in options['columns']: + col_expr_label = column['expression_label'] + value = None if options.get('hide_partner_totals') else partner_values[column['column_group_key']].get(col_expr_label) + unfoldable = unfoldable or (col_expr_label in ('debit', 'credit', 'amount') and not company_currency.is_zero(value)) + column_values.append(report._build_column_dict(value, column, options=options)) + + + line_id = report._get_generic_line_id('res.partner', partner.id) if partner else report._get_generic_line_id('res.partner', None, markup='no_partner') + + return { + 'id': line_id, + 'name': partner is not None and (partner.name or '')[:128] or self._get_no_partner_line_label(), + 'columns': column_values, + 'level': 1 + level_shift, + 'trust': partner.trust if partner else None, + 'unfoldable': unfoldable, + 'unfolded': line_id in options['unfolded_lines'] or options['unfold_all'], + 'expand_function': '_report_expand_unfoldable_line_partner_ledger', + } + + def _get_no_partner_line_label(self): + return _('Unknown Partner') + + @api.model + def _format_aml_name(self, line_name, move_ref, move_name=None): + ''' Format the display of an account.move.line record. As its very costly to fetch the account.move.line + records, only line_name, move_ref, move_name are passed as parameters to deal with sql-queries more easily. + + :param line_name: The name of the account.move.line record. + :param move_ref: The reference of the account.move record. + :param move_name: The name of the account.move record. + :return: The formatted name of the account.move.line record. + ''' + return self.env['account.move.line']._format_aml_name(line_name, move_ref, move_name=move_name) + + def _get_report_line_move_line(self, options, aml_query_result, partner_line_id, init_bal_by_col_group, level_shift=0): + if aml_query_result['payment_id']: + caret_type = 'account.payment' + else: + caret_type = 'account.move.line' + + columns = [] + report = self.env['account.report'].browse(options['report_id']) + for column in options['columns']: + col_expr_label = column['expression_label'] + + if col_expr_label not in aml_query_result: + raise UserError(_("The column '%s' is not available for this report.", col_expr_label)) + + col_value = aml_query_result[col_expr_label] if column['column_group_key'] == aml_query_result['column_group_key'] else None + + if col_value is None: + columns.append(report._build_column_dict(None, None)) + else: + currency = False + + if col_expr_label == 'balance': + col_value += init_bal_by_col_group[column['column_group_key']] + + if col_expr_label == 'amount_currency': + currency = self.env['res.currency'].browse(aml_query_result['currency_id']) + + if currency == self.env.company.currency_id: + col_value = '' + + columns.append(report._build_column_dict(col_value, column, options=options, currency=currency)) + + return { + 'id': report._get_generic_line_id('account.move.line', aml_query_result['id'], parent_line_id=partner_line_id, markup=aml_query_result['partial_id']), + 'parent_id': partner_line_id, + 'name': self._format_aml_name(aml_query_result['name'], aml_query_result['ref'], aml_query_result['move_name']), + 'columns': columns, + 'caret_options': caret_type, + 'level': 3 + level_shift, + } + + def _get_report_line_total(self, options, totals_by_column_group): + column_values = [] + report = self.env['account.report'].browse(options['report_id']) + for column in options['columns']: + col_value = totals_by_column_group[column['column_group_key']].get(column['expression_label']) + column_values.append(report._build_column_dict(col_value, column, options=options)) + + return { + 'id': report._get_generic_line_id(None, None, markup='total'), + 'name': _('Total'), + 'level': 1, + 'columns': column_values, + } + + def open_journal_items(self, options, params): + params['view_ref'] = 'account.view_move_line_tree_grouped_partner' + report = self.env['account.report'].browse(options['report_id']) + action = report.open_journal_items(options=options, params=params) + action.get('context', {}).update({'search_default_group_by_account': 0}) + return action diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_report.py b/dev_odex30_accounting/odex30_account_reports/models/account_report.py new file mode 100644 index 0000000..d743356 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_report.py @@ -0,0 +1,7553 @@ + +import ast +import base64 +import datetime +import io +import json +import logging +import re +from ast import literal_eval +from collections import defaultdict +from functools import cmp_to_key +from itertools import groupby + +import markupsafe +from dateutil.relativedelta import relativedelta +from PIL import ImageFont + +from odoo import models, fields, api, _, osv +from odoo.addons.web.controllers.utils import clean_action +from odoo.exceptions import RedirectWarning, UserError, ValidationError +from odoo.service.model import get_public_method +from odoo.tools import date_utils, get_lang, float_is_zero, float_repr, SQL, parse_version, Query +from odoo.tools.float_utils import float_round, float_compare +from odoo.tools.misc import file_path, format_date, formatLang, split_every, xlsxwriter +from odoo.tools.safe_eval import expr_eval, safe_eval + +_logger = logging.getLogger(__name__) + +ACCOUNT_CODES_ENGINE_SPLIT_REGEX = re.compile(r"(?=[+-])") + +ACCOUNT_CODES_ENGINE_TERM_REGEX = re.compile( + r"^(?P[+-]?)"\ + r"(?P([A-Za-z\d.]*|tag\([\w.]+\))((?=\\)|(?<=[^CD])))"\ + r"(\\\((?P([A-Za-z\d.]+,)*[A-Za-z\d.]*)\))?"\ + r"(?P[DC]?)$" +) + +ACCOUNT_CODES_ENGINE_TAG_ID_PREFIX_REGEX = re.compile(r"tag\(((?P\d+)|(?P\w+\.\w+))\)") + +# Performance optimisation: those engines always will receive None as their next_groupby, allowing more efficient batching. +NO_NEXT_GROUPBY_ENGINES = {'tax_tags', 'account_codes'} + +NUMBER_FIGURE_TYPES = ('float', 'integer', 'monetary', 'percentage') + +LINE_ID_HIERARCHY_DELIMITER = '|' + +CURRENCIES_USING_LAKH = {'AFN', 'BDT', 'INR', 'MMK', 'NPR', 'PKR', 'LKR'} + + +class AccountReportAnnotation(models.Model): + _name = 'account.report.annotation' + _description = 'Account Report Annotation' + + report_id = fields.Many2one('account.report', help="The id of the annotated report.") + line_id = fields.Char(index=True, help="The id of the annotated line.") + text = fields.Char(string="The annotation's content.") + date = fields.Date(help="Date considered as annotated by the annotation.") + fiscal_position_id = fields.Many2one('account.fiscal.position', help="The fiscal position used while annotating.") + + @api.model_create_multi + def create(self, values): + fiscal_positions_with_foreign_vat = self.env['account.fiscal.position'].search([('foreign_vat', '!=', False)], limit=1) + for annotation in values: + if 'line_id' in annotation: + annotation['line_id'] = self._remove_tax_grouping_from_line_id(annotation['line_id']) + if 'fiscal_position_id' in annotation: + if annotation['fiscal_position_id'] == 'domestic': + del annotation['fiscal_position_id'] + elif annotation['fiscal_position_id'] == 'all': + annotation['fiscal_position_id'] = fiscal_positions_with_foreign_vat.id + else: + annotation['fiscal_position_id'] = int(annotation['fiscal_position_id']) + + return super().create(values) + + def _remove_tax_grouping_from_line_id(self, line_id): + """ + Remove the tax grouping from the line_id. This is needed because the tax grouping is not relevant for the annotation. + Tax grouping are any group using 'account.group' in the line_id. + """ + return self.env['account.report']._build_line_id([ + (markup, model, res_id) + for markup, model, res_id in self.env['account.report']._parse_line_id(line_id, markup_as_string=True) + if model != 'account.group' + ]) + +class AccountReport(models.Model): + _inherit = 'account.report' + + horizontal_group_ids = fields.Many2many(string="Horizontal Groups", comodel_name='account.report.horizontal.group') + annotations_ids = fields.One2many(string="Annotations", comodel_name='account.report.annotation', inverse_name='report_id') + + # Those fields allow case-by-case fine-tuning of the engine, for custom reports. + custom_handler_model_id = fields.Many2one(string='Custom Handler Model', comodel_name='ir.model') + custom_handler_model_name = fields.Char(string='Custom Handler Model Name', related='custom_handler_model_id.model') + + # Account Coverage Report + is_account_coverage_report_available = fields.Boolean(compute='_compute_is_account_coverage_report_available') + + tax_closing_start_date = fields.Date( # the default value is set in _auto_init + string="Start Date", + company_dependent=True + ) + + # Fields used for send reports by cron + send_and_print_values = fields.Json(copy=False) + + def _auto_init(self): + super()._auto_init() + + def precommit(): + self.env['ir.default'].set( + 'account.report', + 'tax_closing_start_date', + fields.Date.context_today(self).replace(month=1, day=1), + ) + self.env.cr.precommit.add(precommit) + + @api.constrains('custom_handler_model_id') + def _validate_custom_handler_model(self): + for report in self: + if report.custom_handler_model_id: + custom_handler_model = self.env.registry['account.report.custom.handler'] + current_model = self.env[report.custom_handler_model_name] + if not isinstance(current_model, custom_handler_model): + raise ValidationError(_( + "Field 'Custom Handler Model' can only reference records inheriting from [%s].", + custom_handler_model._name + )) + + def unlink(self): + for report in self: + action, menuitem = report._get_existing_menuitem() + menuitem.unlink() + action.unlink() + return super().unlink() + + def write(self, vals): + if 'active' in vals: + reports = {r.id: r.name for r in self} + actions = self.env['ir.actions.client'] \ + .search([('name', 'in', list(reports.values())), ('tag', '=', 'account_report')]) \ + .filtered(lambda act: (ast.literal_eval(act.context).get('report_id'), act.name) in reports.items()) + self.env['ir.ui.menu'] \ + .search([ + ('active', '=', not vals['active']), + ('action', 'in', [f'ir.actions.client,{action.id}' for action in actions]), + ])\ + .active = vals['active'] + return super().write(vals) + + #################################################### + # CRON + #################################################### + + @api.model + def _cron_account_report_send(self, job_count=10): + """ Handle Send & Print async processing. + :param job_count: maximum number of jobs to process if specified. + """ + to_process = self.env['account.report'].search( + [('send_and_print_values', '!=', False)], + ) + if not to_process: + return + + processed_count = 0 + need_retrigger = False + + for report in to_process: + if need_retrigger: + break + send_and_print_vals = report.send_and_print_values + report_partner_ids = send_and_print_vals.get('report_options', {}).get('partner_ids', []) + need_retrigger = processed_count + len(report_partner_ids) > job_count + partner_ids = report_partner_ids[:job_count - processed_count] + company = self.env['res.company'].browse(send_and_print_vals['report_options']['companies'][0]['id']) + existing_partner_ids = set(self.env['res.partner'].browse(partner_ids).exists().ids) + for partner_id in partner_ids: + if partner_id in existing_partner_ids: + options = { + **send_and_print_vals['report_options'], + 'partner_ids': [partner_id], + } + self.env['account.report.send']._process_send_and_print(report=report.with_company(company), options=options) + processed_count += 1 + report_partner_ids.remove(partner_id) + if report_partner_ids: + send_and_print_vals['report_options']['partner_ids'] = report_partner_ids + report.send_and_print_values = send_and_print_vals + else: + report.send_and_print_values = False + + if need_retrigger: + self.env.ref('odex30_account_reports.ir_cron_account_report_send')._trigger() + + #################################################### + # MENU MANAGEMENT + #################################################### + + def _get_existing_menuitem(self): + self.ensure_one() + action = self.env['ir.actions.client']\ + .search([('name', '=', self.name), ('tag', '=', 'account_report')])\ + .filtered(lambda act: ast.literal_eval(act.context).get('report_id') == self.id) + menuitem = self.env['ir.ui.menu']\ + .with_context({'active_test': False, 'ir.ui.menu.full_list': True})\ + .search([('action', '=', f'ir.actions.client,{action.id}')]) + return action, menuitem + + def _create_menu_item_for_report(self): + """ Adds a default menu item for this report. This is called by an action on the report, for reports created manually by the user. + """ + self.ensure_one() + + action, menuitem = self._get_existing_menuitem() + + if menuitem: + raise UserError(_("This report already has a menuitem.")) + + if not action: + action = self.env['ir.actions.client'].create({ + 'name': self.name, + 'tag': 'account_report', + 'context': {'report_id': self.id}, + }) + + self.env['ir.ui.menu'].create({ + 'name': self.name, + 'parent_id': self.env['ir.model.data']._xmlid_to_res_id('account.menu_finance_reports'), + 'action': f'ir.actions.client,{action.id}', + }) + + return { + 'type': 'ir.actions.client', + 'tag': 'reload', + } + + #################################################### + # OPTIONS: journals + #################################################### + + def _get_filter_journals(self, options, additional_domain=None): + return self.env['account.journal'].with_context(active_test=False).search([ + *self.env['account.journal']._check_company_domain(self.get_report_company_ids(options)), + *(additional_domain or []), + ], order="company_id, name") + + def _get_filter_journal_groups(self, options): + return self.env['account.journal.group'].search([ + *self.env['account.journal.group']._check_company_domain(self.get_report_company_ids(options)), + ], order='sequence') + + def _init_options_journals(self, options, previous_options, additional_journals_domain=None): + # The additional additional_journals_domain optional parameter allows calling this with an additional restriction on journals, + # to regenerate the journal options accordingly. + def option_value(value, selected=False, group_journals=None): + result = { + 'id': value.id, + 'model': value._name, + 'name': value.display_name, + 'selected': selected, + } + + if value._name == 'account.journal.group': + result.update({ + 'title': value.display_name, + 'journals': group_journals.ids, + 'journal_types': list(set(group_journals.mapped('type'))), + }) + elif value._name == 'account.journal': + result.update({ + 'title': f"{value.name} - {value.code}", + 'type': value.type, + 'visible': True, + }) + + return result + + if not self.filter_journals: + return + + previous_journals = previous_options.get('journals', []) + previous_journal_group_action = previous_options.get('__journal_group_action', {}) + + all_journals = self._get_filter_journals(options, additional_domain=additional_journals_domain) + all_journal_groups = self._get_filter_journal_groups(options) + + options['journals'] = [] + options['selected_journal_groups'] = {} + + groups_journals_selected = set() + options_journal_groups = [] + + # First time opening the report, and make sure it's not specifically stated that we should not reset the filter + is_opening_report = previous_options.get('is_opening_report') # key from JS controller when report is being opened + # a key to prevent the reset of the journals filter even when is_opening_report is True + can_reset_journals_filter = not previous_options.get('not_reset_journals_filter') + + # 1. Handle journal group selection + for group in all_journal_groups: + group_journals = all_journals - group.excluded_journal_ids + selected = False + first_group_already_selected = bool(options['selected_journal_groups']) # only one group should be selected at most + + # select the first group by default when opening the report + if is_opening_report and not first_group_already_selected and can_reset_journals_filter: + selected = True + # Otherwise, select the previous selected group (if any) + elif group.id == previous_journal_group_action.get('id'): + selected = previous_journal_group_action.get('action') == 'add' + + group_option = option_value(group, selected=selected, group_journals=group_journals) + options_journal_groups.append(group_option) + + # Select all the group journals + if selected: + options['selected_journal_groups'] = group_option + groups_journals_selected |= set(group_journals.ids) + + # 2. Handle journals selection + previous_selected_journals_ids = { + journal['id'] + for journal in previous_journals + if journal.get('model') == 'account.journal' and journal.get('selected') + } + + company_journals_map = defaultdict(list) + journals_selected = set() + + for journal in all_journals: + selected = False + + if journal.id in groups_journals_selected: + selected = True + + elif not options['selected_journal_groups'] and previous_journal_group_action.get('action') != 'remove': + if journal.id in previous_selected_journals_ids: + selected = True + + if selected: + journals_selected.add(journal.id) + + company_journals_map[journal.company_id].append(option_value(journal, selected=journal.id in journals_selected)) + + # 3. Recompute selected groups in case the set of selected journals is equal to a group's accepted journals + for group in options_journal_groups: + if journals_selected == set(group['journals']): + group['selected'] = True + options['selected_journal_groups'] = group + + # 4. Unselect all journals if all are selected and no group is specifically selected + if journals_selected == set(all_journals.ids) and not options['selected_journal_groups']: + for company, journals in company_journals_map.items(): + for journal in journals: + journal['selected'] = False + + # 5. Build group options + if all_journal_groups: + options['journals'] = [{ + 'id': 'divider', + 'name': _("Multi-ledger"), + 'model': 'account.journal.group', + }] + options_journal_groups + + if not company_journals_map: + options['name_journal_group'] = _("No Journal") + return + + # 6. Build journals options + if len(company_journals_map) > 1 or all_journal_groups: + for company, journals in company_journals_map.items(): + # users may not have full access to the parent company in case they are in a branch, yet they have to see the company name + company_name = company.sudo().display_name + + # if not is_opening_report, then gets the unfolded attribute of the company from the previous options + unfolded = False if is_opening_report else next( + (entry.get('unfolded') for entry in previous_journals + if entry['model'] == 'res.company' and entry['name'] == company_name), False) + + for journal in journals: + journal['visible'] = unfolded + + options['journals'].append({ + 'id': 'divider', + 'model': 'res.company', + 'name': company_name, + 'unfolded': unfolded, + }) + + options['journals'] += journals + + else: + options['journals'].extend(next(iter(company_journals_map.values()), [])) + + + def _init_options_journals_names(self, options, previous_options, additional_journals_domain=None): + all_journals = [ + journal for journal in options.get('journals', []) + if journal['model'] == 'account.journal' + ] + journals_selected = [j for j in all_journals if j.get('selected')] + # 1. Compute the name to display on the widget + if options.get('selected_journal_groups'): + names_to_display = [options['selected_journal_groups']['name']] + elif len(all_journals) == len(journals_selected) or not journals_selected: + names_to_display = [_("All Journals")] + else: + names_to_display = [] + for journal in options['journals']: + if journal.get('model') == 'account.journal' and journal['selected']: + names_to_display += [journal['name']] + + # 2. Abbreviate the name + max_nb_journals_displayed = 5 + nb_remaining = len(names_to_display) - max_nb_journals_displayed + displayed_names = ', '.join(names_to_display[:max_nb_journals_displayed]) + if nb_remaining == 1: + options['name_journal_group'] = _("%(names)s and one other", names=displayed_names) + elif nb_remaining > 1: + options['name_journal_group'] = _("%(names)s and %(remaining)s others", names=displayed_names, remaining=nb_remaining) + else: + options['name_journal_group'] = displayed_names + + @api.model + def _get_options_journals(self, options): + selected_journals = [ + journal for journal in options.get('journals', []) + if journal['model'] == 'account.journal' and journal['selected'] + ] + if not selected_journals: + # If no journal is specifically selected, we actually want to select them all. + # This is needed, because some reports will not use ALL available journals and filter by type. + # Without getting them from the options, we will use them all, which is wrong. + selected_journals = [ + journal for journal in options.get('journals', []) + if journal['model'] == 'account.journal' + ] + return selected_journals + + @api.model + def _get_options_journals_domain(self, options): + # Make sure to return an empty array when nothing selected to handle archived journals. + selected_journals = self._get_options_journals(options) + return selected_journals and [('journal_id', 'in', [j['id'] for j in selected_journals])] or [] + + # #################################################### + # OPTIONS: USER DEFINED FILTERS ON AML + #################################################### + def _init_options_aml_ir_filters(self, options, previous_options): + options['aml_ir_filters'] = [] + if not self.filter_aml_ir_filters: + return + + ir_filters = self.env['ir.filters'].search([('model_id', '=', 'account.move.line')]) + if not ir_filters: + return + + aml_ir_filters = [{'id': x.id, 'name': x.name, 'selected': False} for x in ir_filters] + previous_options_aml_ir_filters = previous_options.get('aml_ir_filters', []) + previous_options_filters_map = {filter_item['id']: filter_item for filter_item in previous_options_aml_ir_filters} + + for filter_item in aml_ir_filters: + if filter_item['id'] in previous_options_filters_map: + filter_item['selected'] = previous_options_filters_map[filter_item['id']]['selected'] + + options['aml_ir_filters'] = aml_ir_filters + + @api.model + def _get_options_aml_ir_filters(self, options): + selected_filters_ids = [ + filter_item['id'] + for filter_item in options.get('aml_ir_filters', []) + if filter_item['selected'] + ] + + if not selected_filters_ids: + return [] + + selected_ir_filters = self.env['ir.filters'].browse(selected_filters_ids) + return osv.expression.OR([filter_record._get_eval_domain() for filter_record in selected_ir_filters]) + + #################################################### + # OPTIONS: date + comparison + #################################################### + + @api.model + def _get_dates_period(self, date_from, date_to, mode, period_type=None): + '''Compute some information about the period: + * The name to display on the report. + * The period type (e.g. quarter) if not specified explicitly. + :param date_from: The starting date of the period. + :param date_to: The ending date of the period. + :param period_type: The type of the interval date_from -> date_to. + :return: A dictionary containing: + * date_from * date_to * string * period_type * mode * + ''' + def match(dt_from, dt_to): + return (dt_from, dt_to) == (date_from, date_to) + + def get_quarter_name(date_to, date_from): + date_to_quarter_string = format_date(self.env, fields.Date.to_string(date_to), date_format='MMM yyyy') + date_from_quarter_string = format_date(self.env, fields.Date.to_string(date_from), date_format='MMM') + return f"{date_from_quarter_string} - {date_to_quarter_string}" + + string = None + # If no date_from or not date_to, we are unable to determine a period + if not period_type or period_type == 'custom': + date = date_to or date_from + company_fiscalyear_dates = self.env.company.compute_fiscalyear_dates(date) + if match(company_fiscalyear_dates['date_from'], company_fiscalyear_dates['date_to']): + period_type = 'fiscalyear' + if company_fiscalyear_dates.get('record'): + string = company_fiscalyear_dates['record'].name + elif match(*date_utils.get_month(date)): + period_type = 'month' + elif match(*date_utils.get_quarter(date)): + period_type = 'quarter' + elif match(*date_utils.get_fiscal_year(date)): + period_type = 'year' + elif match(date_utils.get_month(date)[0], fields.Date.today()): + period_type = 'today' + else: + period_type = 'custom' + elif period_type == 'fiscalyear': + date = date_to or date_from + company_fiscalyear_dates = self.env.company.compute_fiscalyear_dates(date) + record = company_fiscalyear_dates.get('record') + string = record and record.name + elif period_type == 'tax_period': + day, month = self.env.company._get_tax_closing_start_date_attributes(self) + months_per_period = self.env.company._get_tax_periodicity_months_delay(self) + # We need to format ourselves the date and not switch the period type to the actual period because we do not want to write the actual period in the options but keep tax_period + if day == 1 and month == 1 and months_per_period in (1, 3, 12): + match months_per_period: + case 1: + string = format_date(self.env, fields.Date.to_string(date_to), date_format='MMM yyyy') + case 3: + string = get_quarter_name(date_to, date_from) + case 12: + string = date_to.strftime('%Y') + else: + dt_from_str = format_date(self.env, fields.Date.to_string(date_from)) + dt_to_str = format_date(self.env, fields.Date.to_string(date_to)) + string = '%s - %s' % (dt_from_str, dt_to_str) + + if not string: + fy_day = self.env.company.fiscalyear_last_day + fy_month = int(self.env.company.fiscalyear_last_month) + if mode == 'single': + string = _('As of %s', format_date(self.env, date_to)) + elif period_type == 'year' or ( + period_type == 'fiscalyear' and (date_from, date_to) == date_utils.get_fiscal_year(date_to)): + string = date_to.strftime('%Y') + elif period_type == 'fiscalyear' and (date_from, date_to) == date_utils.get_fiscal_year(date_to, day=fy_day, month=fy_month): + string = '%s - %s' % (date_to.year - 1, date_to.year) + elif period_type == 'month': + string = format_date(self.env, fields.Date.to_string(date_to), date_format='MMM yyyy') + elif period_type == 'quarter': + string = get_quarter_name(date_to, date_from) + else: + dt_from_str = format_date(self.env, fields.Date.to_string(date_from)) + dt_to_str = format_date(self.env, fields.Date.to_string(date_to)) + string = _('From %(date_from)s\nto %(date_to)s', date_from=dt_from_str, date_to=dt_to_str) + + return { + 'string': string, + 'period_type': period_type, + 'currency_table_period_key': f"{date_from if mode == 'range' else 'None'}_{date_to}", + 'mode': mode, + 'date_from': date_from and fields.Date.to_string(date_from) or False, + 'date_to': fields.Date.to_string(date_to), + } + + @api.model + def _get_shifted_dates_period(self, options, period_vals, periods, tax_period=False): + '''Shift the period. + :param period_vals: A dictionary generated by the _get_dates_period method. + :param periods: The number of periods we want to move either in the future or the past + :return: A dictionary containing: + * date_from * date_to * string * period_type * + ''' + period_type = period_vals['period_type'] + mode = period_vals['mode'] + date_from = fields.Date.from_string(period_vals['date_from']) + date_to = fields.Date.from_string(period_vals['date_to']) + if period_type == 'month': + date_to = date_from + relativedelta(months=periods) + elif period_type == 'quarter': + date_to = date_from + relativedelta(months=3 * periods) + elif period_type == 'year': + date_to = date_from + relativedelta(years=periods) + elif period_type in {'custom', 'today'}: + date_to = date_from + relativedelta(days=periods) + + if tax_period or 'tax_period' in period_type: + month_per_period = self.env.company._get_tax_periodicity_months_delay(self) + date_from, date_to = self.env.company._get_tax_closing_period_boundaries(date_from + relativedelta(months=month_per_period * periods), self) + return self._get_dates_period(date_from, date_to, mode, period_type='tax_period') + if period_type in ('fiscalyear', 'today'): + # Don't pass the period_type to _get_dates_period to be able to retrieve the account.fiscal.year record if + # necessary. + company_fiscalyear_dates = {} + # This loop is needed because a fiscal year can be a month, quarter, etc + for _ in range(abs(periods)): + date_to = (date_from if periods < 0 else date_to) + relativedelta(days=periods / abs(periods)) + company_fiscalyear_dates = self.env.company.compute_fiscalyear_dates(date_to) + if periods < 0: + date_from = company_fiscalyear_dates['date_from'] + else: + date_to = company_fiscalyear_dates['date_to'] + + return self._get_dates_period(company_fiscalyear_dates['date_from'], company_fiscalyear_dates['date_to'], mode) + if period_type in ('month', 'custom'): + return self._get_dates_period(*date_utils.get_month(date_to), mode, period_type='month') + if period_type == 'quarter': + return self._get_dates_period(*date_utils.get_quarter(date_to), mode, period_type='quarter') + if period_type == 'year': + return self._get_dates_period(*date_utils.get_fiscal_year(date_to), mode, period_type='year') + return None + + @api.model + def _get_dates_previous_year(self, options, period_vals): + '''Shift the period to the previous year. + :param options: The report options. + :param period_vals: A dictionary generated by the _get_dates_period method. + :return: A dictionary containing: + * date_from * date_to * string * period_type * + ''' + period_type = period_vals['period_type'] + mode = period_vals['mode'] + date_from = fields.Date.from_string(period_vals['date_from']) + date_from = date_from - relativedelta(years=1) + date_to = fields.Date.from_string(period_vals['date_to']) + date_to = date_to - relativedelta(years=1) + + if period_type == 'month': + date_from, date_to = date_utils.get_month(date_to) + + return self._get_dates_period(date_from, date_to, mode, period_type=period_type) + + def _init_options_date(self, options, previous_options): + """ Initialize the 'date' options key. + + :param options: The current report options to build. + :param previous_options: The previous options coming from another report. + """ + date = previous_options.get('date', {}) + period_date_to = date.get('date_to') + period_date_from = date.get('date_from') + mode = date.get('mode') + date_filter = date.get('filter', 'custom') + + default_filter = self.default_opening_date_filter + options_mode = 'range' if self.filter_date_range else 'single' + date_from = date_to = period_type = False + + if mode == 'single' and options_mode == 'range': + # 'single' date mode to 'range'. + if date_filter: + date_to = fields.Date.from_string(period_date_to or period_date_from) + date_from = self.env.company.compute_fiscalyear_dates(date_to)['date_from'] + options_filter = 'custom' + else: + options_filter = default_filter + elif mode == 'range' and options_mode == 'single': + # 'range' date mode to 'single'. + if date_filter == 'custom': + date_to = fields.Date.from_string(period_date_to or period_date_from) + date_from = date_utils.get_month(date_to)[0] + options_filter = 'custom' + elif date_filter: + options_filter = date_filter + else: + options_filter = default_filter + elif (mode is None or mode == options_mode) and date: + # Same date mode. + if date_filter == 'custom': + if options_mode == 'range': + date_from = fields.Date.from_string(period_date_from) + date_to = fields.Date.from_string(period_date_to) + else: + date_to = fields.Date.from_string(period_date_to or period_date_from) + date_from = date_utils.get_month(date_to)[0] + + options_filter = 'custom' + else: + options_filter = date_filter + else: + # Default. + options_filter = default_filter + + # Compute 'date_from' / 'date_to'. + if not date_from or not date_to: + if options_filter == 'today': + date_to = fields.Date.context_today(self) + date_from = self.env.company.compute_fiscalyear_dates(date_to)['date_from'] + period_type = 'today' + elif 'month' in options_filter: + date_from, date_to = date_utils.get_month(fields.Date.context_today(self)) + period_type = 'month' + elif 'quarter' in options_filter: + date_from, date_to = date_utils.get_quarter(fields.Date.context_today(self)) + period_type = 'quarter' + elif 'year' in options_filter: + company_fiscalyear_dates = self.env.company.compute_fiscalyear_dates(fields.Date.context_today(self)) + curr_year = fields.Date.context_today(self).year + if company_fiscalyear_dates['date_from'].year < curr_year: + company_fiscalyear_dates = self.env.company.compute_fiscalyear_dates(company_fiscalyear_dates['date_to'] + relativedelta(days=1)) + date_from = company_fiscalyear_dates['date_from'] + date_to = company_fiscalyear_dates['date_to'] + elif 'tax_period' in options_filter: + if 'custom' in options_filter: + base_date = fields.Date.from_string(period_date_to) + else: + base_date = fields.Date.context_today(self) + + date_from, date_to = self.env.company._get_tax_closing_period_boundaries(base_date, self) + period_type = 'tax_period' + start_day, start_month = self.env.company._get_tax_closing_start_date_attributes(self) + if start_day == 1 and start_month == 1: + periods = self.env.company._get_tax_periodicity_months_delay(self) + period_type_map = { + 1: 'month', + 3: 'quarter', + 12: 'year', + } + period_type = period_type_map.get(periods, 'tax_period') + + options['date'] = self._get_dates_period( + date_from, + date_to, + options_mode, + period_type=period_type, + ) + + if any(option in options_filter for option in ['previous', 'next']): + new_period = date.get('period', -1 if 'previous' in options_filter else 1) + options['date'] = self._get_shifted_dates_period(options, options['date'], new_period, tax_period='tax_period' in options_filter) + # This line is useful for the export and tax closing so that the period is set in the options. + options['date']['period'] = new_period + + options['date']['filter'] = options_filter if options_filter != 'custom_tax_period' else 'custom' + + def _init_options_comparison(self, options, previous_options): + """ Initialize the 'comparison' options key. + + This filter must be loaded after the 'date' filter. + + :param options: The current report options to build. + :param previous_options: The previous options coming from another report. + """ + if not self.filter_period_comparison: + return + + previous_comparison = previous_options.get('comparison', {}) + previous_filter = previous_comparison.get('filter') + + period_order = previous_comparison.get('period_order') or 'descending' + if previous_filter == 'custom': + # Try to adapt the previous 'custom' filter. + date_from = previous_comparison.get('date_from') + date_to = previous_comparison.get('date_to') + number_period = 1 + options_filter = 'custom' + else: + # Use the 'date' options. + date_from = options['date']['date_from'] + date_to = options['date']['date_to'] + number_period = max(previous_comparison.get('number_period', 1) or 0, 0) + options_filter = number_period and previous_filter or 'no_comparison' + + options['comparison'] = { + 'filter': options_filter, + 'number_period': number_period, + 'date_from': date_from, + 'date_to': date_to, + 'periods': [], + 'period_order': period_order, + } + + date_from_obj = fields.Date.from_string(date_from) + date_to_obj = fields.Date.from_string(date_to) + + if options_filter == 'custom': + options['comparison']['periods'].append(self._get_dates_period( + date_from_obj, + date_to_obj, + options['date']['mode'], + )) + elif options_filter in ('previous_period', 'same_last_year'): + previous_period = options['date'] + for dummy in range(0, number_period): + if options_filter == 'previous_period': + period_vals = self._get_shifted_dates_period(options, previous_period, -1) + elif options_filter == 'same_last_year': + period_vals = self._get_dates_previous_year(options, previous_period) + else: + date_from_obj = fields.Date.from_string(date_from) + date_to_obj = fields.Date.from_string(date_to) + period_vals = self._get_dates_period(date_from_obj, date_to_obj, previous_period['mode']) + options['comparison']['periods'].append(period_vals) + previous_period = period_vals + + if len(options['comparison']['periods']) > 0: + options['comparison'].update(options['comparison']['periods'][0]) + + def _init_options_column_percent_comparison(self, options, previous_options): + if options['selected_horizontal_group_id'] is None: + if self.filter_growth_comparison and len(options['columns']) == 2 and len(options.get('comparison', {}).get('periods', [])) == 1: + options['column_percent_comparison'] = 'growth' + + if self.filter_budgets and any(budget['selected'] for budget in options.get('budgets', [])): + options['column_percent_comparison'] = 'budget' + + def _get_options_date_domain(self, options, date_scope): + date_from, date_to = self._get_date_bounds_info(options, date_scope) + + scope_domain = [('date', '<=', date_to)] + if date_from: + scope_domain += [('date', '>=', date_from)] + + return scope_domain + + def _get_date_bounds_info(self, options, date_scope): + # Default values (the ones from 'strict_range') + date_to = options['date']['date_to'] + date_from = options['date']['date_from'] if options['date']['mode'] == 'range' else None + + if date_scope == 'from_beginning': + date_from = None + + elif date_scope == 'to_beginning_of_period': + date_tmp = fields.Date.from_string(date_from or date_to) - relativedelta(days=1) + date_to = date_tmp.strftime('%Y-%m-%d') + date_from = None + + elif date_scope == 'from_fiscalyear': + date_tmp = fields.Date.from_string(date_to) + date_tmp = self.env.company.compute_fiscalyear_dates(date_tmp)['date_from'] + date_from = date_tmp.strftime('%Y-%m-%d') + + elif date_scope == 'to_beginning_of_fiscalyear': + date_tmp = fields.Date.from_string(date_to) + date_tmp = self.env.company.compute_fiscalyear_dates(date_tmp)['date_from'] - relativedelta(days=1) + date_to = date_tmp.strftime('%Y-%m-%d') + date_from = None + + elif date_scope == 'previous_tax_period': + eve_of_date_from = fields.Date.from_string(options['date']['date_from']) - relativedelta(days=1) + date_from, date_to = self.env.company._get_tax_closing_period_boundaries(eve_of_date_from, self) + + return date_from, date_to + + + #################################################### + # OPTIONS: analytic filter + #################################################### + + def _init_options_analytic(self, options, previous_options): + if not self.filter_analytic: + return + + + if self.env.user.has_group('analytic.group_analytic_accounting'): + previous_analytic_accounts = previous_options.get('analytic_accounts', []) + analytic_account_ids = [int(x) for x in previous_analytic_accounts] + selected_analytic_accounts = self.env['account.analytic.account'].with_context(active_test=False).search([('id', 'in', analytic_account_ids)]) + + options['display_analytic'] = True + options['analytic_accounts'] = selected_analytic_accounts.ids + options['selected_analytic_account_names'] = selected_analytic_accounts.mapped('name') + + #################################################### + # OPTIONS: partners + #################################################### + + def _init_options_partner(self, options, previous_options): + if not self.filter_partner: + return + + options['partner'] = True + previous_partner_ids = previous_options.get('partner_ids') or [] + options['partner_categories'] = previous_options.get('partner_categories') or [] + + selected_partner_ids = [int(partner) for partner in previous_partner_ids] + # search instead of browse so that record rules apply and filter out the ones the user does not have access to + selected_partners = selected_partner_ids and self.env['res.partner'].with_context(active_test=False).search([('id', 'in', selected_partner_ids)]) or self.env['res.partner'] + options['selected_partner_ids'] = selected_partners.filtered('name').mapped('name') + options['partner_ids'] = selected_partners.ids + + selected_partner_category_ids = [int(category) for category in options['partner_categories']] + selected_partner_categories = selected_partner_category_ids and self.env['res.partner.category'].browse(selected_partner_category_ids) or self.env['res.partner.category'] + options['selected_partner_categories'] = selected_partner_categories.mapped('name') + + @api.model + def _get_options_partner_domain(self, options): + domain = [] + if options.get('partner_ids'): + partner_ids = [int(partner) for partner in options['partner_ids']] + domain.append(('partner_id', 'in', partner_ids)) + if options.get('partner_categories'): + partner_category_ids = [int(category) for category in options['partner_categories']] + domain.append(('partner_id.category_id', 'in', partner_category_ids)) + return domain + + #################################################### + # OPTIONS: all_entries + #################################################### + + @api.model + def _get_options_all_entries_domain(self, options): + if not options.get('all_entries'): + return [('parent_state', '=', 'posted')] + else: + return [('parent_state', '!=', 'cancel')] + + #################################################### + # OPTIONS: not reconciled entries + #################################################### + def _init_options_reconciled(self, options, previous_options): + if self.filter_unreconciled: + options['unreconciled'] = previous_options.get('unreconciled', False) + else: + options['unreconciled'] = False + + @api.model + def _get_options_unreconciled_domain(self, options): + if options.get('unreconciled'): + return ['&', ('full_reconcile_id', '=', False), ('balance', '!=', '0')] + return [] + + #################################################### + # OPTIONS: account_type + #################################################### + + def _init_options_account_type(self, options, previous_options): + ''' + Initialize a filter based on the account_type of the line (trade/non trade, payable/receivable). + Selects a name to display according to the selections. + The group display name is selected according to the display name of the options selected. + ''' + if self.filter_account_type in ('disabled', False): + return + + account_type_list = [ + {'id': 'trade_receivable', 'name': _("Receivable"), 'selected': True}, + {'id': 'non_trade_receivable', 'name': _("Non Trade Receivable"), 'selected': False}, + {'id': 'trade_payable', 'name': _("Payable"), 'selected': True}, + {'id': 'non_trade_payable', 'name': _("Non Trade Payable"), 'selected': False}, + ] + + if self.filter_account_type == 'receivable': + options['account_type'] = account_type_list[:2] + elif self.filter_account_type == 'payable': + options['account_type'] = account_type_list[2:] + else: + options['account_type'] = account_type_list + + if previous_options.get('account_type'): + previously_selected_ids = {x['id'] for x in previous_options['account_type'] if x.get('selected')} + for opt in options['account_type']: + opt['selected'] = opt['id'] in previously_selected_ids + + + @api.model + def _get_options_account_type_domain(self, options): + all_domains = [] + selected_domains = [] + if not options.get('account_type') or len(options.get('account_type')) == 0: + return [] + for opt in options.get('account_type', []): + if opt['id'] == 'trade_receivable': + domain = [('account_id.non_trade', '=', False), ('account_id.account_type', '=', 'asset_receivable')] + elif opt['id'] == 'trade_payable': + domain = [('account_id.non_trade', '=', False), ('account_id.account_type', '=', 'liability_payable')] + elif opt['id'] == 'non_trade_receivable': + domain = [('account_id.non_trade', '=', True), ('account_id.account_type', '=', 'asset_receivable')] + elif opt['id'] == 'non_trade_payable': + domain = [('account_id.non_trade', '=', True), ('account_id.account_type', '=', 'liability_payable')] + if opt['selected']: + selected_domains.append(domain) + all_domains.append(domain) + return osv.expression.OR(selected_domains or all_domains) + + #################################################### + # OPTIONS: order column + #################################################### + + @api.model + def _init_options_order_column(self, options, previous_options): + # options['order_column'] is in the form {'expression_label': expression label of the column to order, 'direction': the direction order ('ASC' or 'DESC')} + options['order_column'] = None + + previous_value = previous_options and previous_options.get('order_column') + if previous_value: + for col in options['columns']: + if col['sortable'] and col['expression_label'] == previous_value['expression_label']: + options['order_column'] = previous_value + break + + #################################################### + # OPTIONS: hierarchy + #################################################### + + def _init_options_hierarchy(self, options, previous_options): + company_ids = self.get_report_company_ids(options) + if self.filter_hierarchy != 'never' and self.env['account.group'].search_count(self.env['account.group']._check_company_domain(company_ids), limit=1): + options['display_hierarchy_filter'] = True + if 'hierarchy' in previous_options: + options['hierarchy'] = previous_options['hierarchy'] + else: + options['hierarchy'] = self.filter_hierarchy == 'by_default' + else: + options['hierarchy'] = False + options['display_hierarchy_filter'] = False + + @api.model + def _create_hierarchy(self, lines, options): + """Compute the hierarchy based on account groups when the option is activated. + + The option is available only when there are account.group for the company. + It should be called when before returning the lines to the client/templater. + The lines are the result of _get_lines(). If there is a hierarchy, it is left + untouched, only the lines related to an account.account are put in a hierarchy + according to the account.group's and their prefixes. + """ + if not lines: + return lines + + def get_account_group_hierarchy(account): + # Create codes path in the hierarchy based on account. + groups = self.env['account.group'] + if account.group_id: + group = account.group_id + while group: + groups += group + group = group.parent_id + return list(groups.sorted(reverse=True)) + + def create_hierarchy_line(account_group, column_totals, level, parent_id): + line_id = self._get_generic_line_id('account.group', account_group.id if account_group else None, parent_line_id=parent_id) + unfolded = line_id in options.get('unfolded_lines') or options['unfold_all'] + name = account_group.display_name if account_group else _('(No Group)') + columns = [] + for column_total, column in zip(column_totals, options['columns']): + columns.append(self._build_column_dict(column_total, column, options=options)) + return { + 'id': line_id, + 'name': name, + 'title_hover': name, + 'unfoldable': True, + 'unfolded': unfolded, + 'level': level, + 'parent_id': parent_id, + 'columns': columns, + } + + def compute_group_totals(line, group=None): + result = [] + for total, column in zip(hierarchy[group]['totals'], line['columns']): + value = column.get('no_format') + if isinstance(total, float) and isinstance(value, (int, float)): + result.append(total + value) + else: + result.append('') + return result + + def render_lines(account_groups, current_level, parent_line_id, skip_no_group=True): + to_treat = [(current_level, parent_line_id, group) for group in account_groups.sorted()] + + if None in hierarchy and not skip_no_group: + to_treat.append((current_level, parent_line_id, None)) + + while to_treat: + level_to_apply, parent_id, group = to_treat.pop(0) + group_data = hierarchy[group] + hierarchy_line = create_hierarchy_line(group, group_data['totals'], level_to_apply, parent_id) + new_lines.append(hierarchy_line) + treated_child_groups = self.env['account.group'] + + for account_line in group_data['lines']: + for child_group in group_data['child_groups']: + if child_group not in treated_child_groups and child_group['code_prefix_end'] < account_line['name']: + render_lines(child_group, hierarchy_line['level'] + 1, hierarchy_line['id']) + treated_child_groups += child_group + + markup, model, account_id = self._parse_line_id(account_line['id'])[-1] + account_line_id = self._get_generic_line_id(model, account_id, markup=markup, parent_line_id=hierarchy_line['id']) + account_line.update({ + 'id': account_line_id, + 'parent_id': hierarchy_line['id'], + 'level': hierarchy_line['level'] + 1, + }) + new_lines.append(account_line) + + for child_line in account_line_children_map[account_id]: + markup, model, res_id = self._parse_line_id(child_line['id'])[-1] + child_line.update({ + 'id': self._get_generic_line_id(model, res_id, markup=markup, parent_line_id=account_line_id), + 'parent_id': account_line_id, + 'level': account_line['level'] + 1, + }) + new_lines.append(child_line) + + to_treat = [ + (level_to_apply + 1, hierarchy_line['id'], child_group) + for child_group + in group_data['child_groups'].sorted() + if child_group not in treated_child_groups + ] + to_treat + + def create_hierarchy_dict(): + return defaultdict(lambda: { + 'lines': [], + 'totals': [('' if column.get('figure_type') == 'string' else 0.0) for column in options['columns']], + 'child_groups': self.env['account.group'], + }) + + # Precompute the account groups of the accounts in the report + account_ids = [] + for line in lines: + markup, res_model, model_id = self._parse_line_id(line['id'])[-1] + if res_model == 'account.account': + account_ids.append(model_id) + self.env['account.account'].browse(account_ids).group_id + + new_lines, total_lines = [], [] + + # root_line_id is the id of the parent line of the lines we want to render + root_line_id = self._build_parent_line_id(self._parse_line_id(lines[0]['id'])) or None + last_account_line_id = account_id = None + current_level = 0 + account_line_children_map = defaultdict(list) + account_groups = self.env['account.group'] + root_account_groups = self.env['account.group'] + hierarchy = create_hierarchy_dict() + + for line in lines: + markup, res_model, model_id = self._parse_line_id(line['id'])[-1] + + # Account lines are used as the basis for the computation of the hierarchy. + if res_model == 'account.account': + last_account_line_id = line['id'] + current_level = line['level'] + account_id = model_id + account = self.env[res_model].browse(account_id) + account_groups = get_account_group_hierarchy(account) + + if not account_groups: + hierarchy[None]['lines'].append(line) + hierarchy[None]['totals'] = compute_group_totals(line) + else: + for i, group in enumerate(account_groups): + if i == 0: + hierarchy[group]['lines'].append(line) + if i == len(account_groups) - 1 and group not in root_account_groups: + root_account_groups += group + if group.parent_id and group not in hierarchy[group.parent_id]['child_groups']: + hierarchy[group.parent_id]['child_groups'] += group + + hierarchy[group]['totals'] = compute_group_totals(line, group=group) + + # This is not an account line, so we check to see if it is a descendant of the last account line. + # If so, it is added to the mapping of the lines that are related to this account. + elif last_account_line_id and line.get('parent_id', '').startswith(last_account_line_id): + account_line_children_map[account_id].append(line) + + # This is a total line that is not linked to an account. It is saved in order to be added at the end. + elif markup == 'total': + total_lines.append(line) + + # This line ends the scope of the current hierarchy and is (possibly) the root of a new hierarchy. + # We render the current hierarchy and set up to build a new hierarchy + else: + render_lines(root_account_groups, current_level, root_line_id, skip_no_group=False) + + new_lines.append(line) + + # Reset the hierarchy-related variables for a new hierarchy + root_line_id = line['id'] + last_account_line_id = account_id = None + current_level = 0 + account_line_children_map = defaultdict(list) + root_account_groups = self.env['account.group'] + account_groups = self.env['account.group'] + hierarchy = create_hierarchy_dict() + + render_lines(root_account_groups, current_level, root_line_id, skip_no_group=False) + + return new_lines + total_lines + + #################################################### + # OPTIONS: prefix groups threshold + #################################################### + + def _init_options_prefix_groups_threshold(self, options, previous_options): + previous_threshold = previous_options.get('prefix_groups_threshold') + options['prefix_groups_threshold'] = self.prefix_groups_threshold + + #################################################### + # OPTIONS: fiscal position (multi vat) + #################################################### + + def _init_options_fiscal_position(self, options, previous_options): + if self.filter_fiscal_position and self.country_id and len(options['companies']) == 1: + vat_fpos_domain = [ + *self.env['account.fiscal.position']._check_company_domain(next(comp_id for comp_id in self.get_report_company_ids(options))), + ('foreign_vat', '!=', False), + ] + + vat_fiscal_positions = self.env['account.fiscal.position'].search([ + *vat_fpos_domain, + ('country_id', '=', self.country_id.id), + ]) + + options['allow_domestic'] = self.env.company.account_fiscal_country_id == self.country_id + + accepted_prev_vals = {*vat_fiscal_positions.ids} + if options['allow_domestic']: + accepted_prev_vals.add('domestic') + if len(vat_fiscal_positions) > (0 if options['allow_domestic'] else 1) or not accepted_prev_vals: + accepted_prev_vals.add('all') + + if previous_options.get('fiscal_position') in accepted_prev_vals: + # Legit value from previous options; keep it + options['fiscal_position'] = previous_options['fiscal_position'] + elif len(vat_fiscal_positions) == 1 and not options['allow_domestic']: + # Only one foreign fiscal position: always select it, menu will be hidden + options['fiscal_position'] = vat_fiscal_positions.id + else: + # Multiple possible values; by default, show the values of the company's area (if allowed), or everything + options['fiscal_position'] = options['allow_domestic'] and 'domestic' or 'all' + else: + # No country, or we're displaying data from several companies: disable fiscal position filtering + vat_fiscal_positions = [] + options['allow_domestic'] = True + previous_fpos = previous_options.get('fiscal_position') + options['fiscal_position'] = previous_fpos if previous_fpos in ('all', 'domestic') else 'all' + + options['available_vat_fiscal_positions'] = [{ + 'id': fiscal_pos.id, + 'name': fiscal_pos.name, + 'company_id': fiscal_pos.company_id.id, + } for fiscal_pos in vat_fiscal_positions] + + def _get_options_fiscal_position_domain(self, options): + def get_foreign_vat_tax_tag_extra_domain(fiscal_position=None): + # We want to gather any line wearing a tag, whatever its fiscal position. + # Nevertheless, if a country is using the same report for several regions (e.g. India) we need to exclude + # the lines from the other regions to avoid reporting numbers that don't belong to the current region. + fp_ids_to_exclude = self.env['account.fiscal.position'].search([ + ('id', '!=', fiscal_position.id if fiscal_position else False), + ('foreign_vat', '!=', False), + ('country_id', '=', self.country_id.id), + ]).ids + + if fiscal_position and fiscal_position.country_id == self.env.company.account_fiscal_country_id: + # We are looking for a fiscal position inside our country which means we need to exclude + # the local fiscal position which is represented by `False`. + fp_ids_to_exclude.append(False) + + return [ + ('tax_tag_ids.country_id', '=', self.country_id.id), + ('move_id.fiscal_position_id', 'not in', fp_ids_to_exclude), + ] + + fiscal_position_opt = options.get('fiscal_position') + + if fiscal_position_opt == 'domestic': + domain = [ + '|', + ('move_id.fiscal_position_id', '=', False), + ('move_id.fiscal_position_id.foreign_vat', '=', False), + ] + tax_tag_domain = get_foreign_vat_tax_tag_extra_domain() + return osv.expression.OR([domain, tax_tag_domain]) + + if isinstance(fiscal_position_opt, int): + # It's a fiscal position id + domain = [('move_id.fiscal_position_id', '=', fiscal_position_opt)] + fiscal_position = self.env['account.fiscal.position'].browse(fiscal_position_opt) + tax_tag_domain = get_foreign_vat_tax_tag_extra_domain(fiscal_position) + return osv.expression.OR([domain, tax_tag_domain]) + + # 'all', or option isn't specified + return [] + + #################################################### + # OPTIONS: MULTI COMPANY + #################################################### + + def _init_options_companies(self, options, previous_options): + if previous_options.get('forced_companies'): + options['forced_companies'] = previous_options['forced_companies'] + companies = self.env.company.browse(previous_options['forced_companies']) + elif self.filter_multi_company == 'selector': + companies = self.env.companies + elif self.filter_multi_company == 'tax_units': + companies = self._multi_company_tax_units_init_options(options, previous_options=previous_options) + else: + # Multi-company is disabled for this report ; only accept the sub-branches of the current company from the selector + companies = self.env.company._accessible_branches() + + options['companies'] = [{'name': c.name, 'id': c.id, 'currency_id': c.currency_id.id} for c in companies] + + def _multi_company_tax_units_init_options(self, options, previous_options): + """ Initializes the companies option for reports configured to compute it from tax units. + """ + tax_units_domain = [('company_ids', 'in', self.env.company.id)] + + if self.country_id: + tax_units_domain.append(('country_id', '=', self.country_id.id)) + + available_tax_units = self.env['account.tax.unit'].search(tax_units_domain) + + # Filter available units to only consider the ones whose companies are all accessible to the user + available_tax_units = available_tax_units.filtered( + lambda x: all(unit_company in self.env.user.company_ids for unit_company in x.sudo().company_ids) + # sudo() to avoid bypassing companies the current user does not have access to + ) + + options['available_tax_units'] = [{ + 'id': tax_unit.id, + 'name': tax_unit.name, + 'company_ids': tax_unit.company_ids.ids + } for tax_unit in available_tax_units] + + # Available tax_unit option values that are currently allowed by the company selector + # A js hack ensures the page is reloaded and the selected companies modified + # when clicking on a tax unit option in the UI, so we don't need to worry about that here. + companies_authorized_tax_unit_opt = { + *(available_tax_units.filtered(lambda x: set(self.env.companies) == set(x.company_ids)).ids), + 'company_only' + } + + if previous_options.get('tax_unit') in companies_authorized_tax_unit_opt: + options['tax_unit'] = previous_options['tax_unit'] + + else: + # No tax_unit gotten from previous options; initialize it + # A tax_unit will be set by default if only one tax unit is available for the report + # (which should always be true for non-generic reports, which have a country), and the companies of + # the unit are the only ones currently selected. + if companies_authorized_tax_unit_opt == {'company_only'}: + options['tax_unit'] = 'company_only' + elif len(available_tax_units) == 1 and available_tax_units[0].id in companies_authorized_tax_unit_opt: + options['tax_unit'] = available_tax_units[0].id + else: + options['tax_unit'] = 'company_only' + + # Finally initialize multi_company filter + if options['tax_unit'] == 'company_only': + companies = self.env.company._get_branches_with_same_vat(accessible_only=True) + else: + tax_unit = available_tax_units.filtered(lambda x: x.id == options['tax_unit']) + companies = tax_unit.company_ids + + return companies + + #################################################### + # OPTIONS: MULTI CURRENCY + #################################################### + def _init_options_multi_currency(self, options, previous_options): + options['multi_currency'] = ( + any([company.get('currency_id') != options['companies'][0].get('currency_id') for company in options['companies']]) + or any([column.figure_type != 'monetary' for column in self.column_ids]) + or any(expression.figure_type and expression.figure_type != 'monetary' for expression in self.line_ids.expression_ids) + ) + + #################################################### + # OPTIONS: CURRENCY TABLE + #################################################### + def _init_options_currency_table(self, options, previous_options): + companies = self.env['res.company'].browse(self.get_report_company_ids(options)) + table_type = 'monocurrency' if self.env['res.currency']._check_currency_table_monocurrency(companies) else self.currency_translation + + periods = {} + for col_group in options['column_groups'].values(): + if col_group['forced_options'].get('no_impact_on_currency_table'): + # This key is used to ignore the colum group in the creation of the periods list for + # the currency table. This way, its dates won't influence. It's useful for groups corresponding + # to an initial balance of some sorts, like on the Trial Balance. + continue + + col_group_date = col_group['forced_options'].get('date', options['date']) + + col_group_date_from = col_group_date['date_from'] if col_group_date['mode'] == 'range' else None + col_group_date_to = col_group_date['date_to'] + period_key = col_group_date['currency_table_period_key'] + + already_present_period = periods.get(period_key) + if already_present_period: + # This can happen for custom reports, needing to enforce the same rates on multiple column groups with + # different dates (e.g. Trial Balance). In that case, the date_from and date_to of the currency table period must respectively + # be the lowest and highest among those groups. + if col_group_date_from and already_present_period['from'] > col_group_date_from: + already_present_period['from'] = col_group_date_from + + if already_present_period['to'] < col_group_date_to: + already_present_period['to'] = col_group_date_to + else: + periods[period_key] = { + 'from': col_group_date_from, + 'to': col_group_date_to, + } + + options['currency_table'] = {'type': table_type, 'periods': periods} + + @api.model + def _currency_table_apply_rate(self, value: SQL) -> SQL: + """ Returns an SQL term to use in a SELECT statement converting the value passed as parameter into the current company's currency, using the + currency table (which must be joined in the query as well ; using _currency_table_aml_join for account.move.line, or _get_currency_table for + other more specific uses). + """ + return SQL("(%(value)s) * COALESCE(account_currency_table.rate, 1)", value=value) + + @api.model + def _currency_table_aml_join(self, options, aml_alias=SQL('account_move_line')) -> SQL: + """ Returns the JOIN condition to the currency table in a query needing to use it to convert aml balances from one currency to another. + """ + if options['currency_table']['type'] == 'cta': + return SQL( + """ + JOIN account_account aml_ct_account + ON aml_ct_account.id = %(aml_table)s.account_id + LEFT JOIN %(currency_table)s + ON %(aml_table)s.company_id = account_currency_table.company_id + AND ( + account_currency_table.rate_type = CASE + WHEN aml_ct_account.account_type LIKE %(equity_prefix)s THEN 'historical' + WHEN aml_ct_account.account_type LIKE ANY (ARRAY[%(income_prefix)s, %(expense_prefix)s, 'equity_unaffected']) THEN 'average' + ELSE 'current' + END + ) + AND (account_currency_table.date_from IS NULL OR account_currency_table.date_from <= %(aml_table)s.date) + AND (account_currency_table.date_next IS NULL OR account_currency_table.date_next > %(aml_table)s.date) + AND (account_currency_table.period_key = %(period_key)s OR account_currency_table.period_key IS NULL) + """, + aml_table=aml_alias, + equity_prefix='equity%', + income_prefix='income%', + expense_prefix='expense%', + currency_table=self._get_currency_table(options), + period_key=options['date']['currency_table_period_key'], + ) + + return SQL( + """ + JOIN %(currency_table)s + ON %(aml_table)s.company_id = account_currency_table.company_id + AND (account_currency_table.period_key = %(period_key)s OR account_currency_table.period_key IS NULL) + """, + aml_table=aml_alias, + currency_table=self._get_currency_table(options), + period_key=options['date']['currency_table_period_key'], + ) + + @api.model + def _get_currency_table(self, options) -> SQL: + """ Returns the currency table table definition to be injected in the JOIN condition of an SQL query needing to use it. + """ + if options['currency_table']['type'] == 'monocurrency': + companies = self.env['res.company'].browse(self.get_report_company_ids(options)) + return self.env['res.currency']._get_monocurrency_currency_table_sql(companies, use_cta_rates=options['currency_table']['type'] == 'cta') + + return SQL('account_currency_table') + + def _init_currency_table(self, options): + """ Creates the currency table temporary table if necessary, using the provided options to compute its periods. + This function should always be called before any query invovlving the currency table is run. + """ + if options['currency_table']['type'] != 'monocurrency': + companies = self.env['res.company'].browse(self.get_report_company_ids(options)) + + self.env['res.currency']._create_currency_table( + companies, + [(period_key, period['from'], period['to']) for period_key, period in options['currency_table']['periods'].items()], + use_cta_rates=options['currency_table']['type'] == 'cta', + ) + + #################################################### + # OPTIONS: ROUNDING UNIT + #################################################### + def _init_options_rounding_unit(self, options, previous_options): + default = 'decimals' + options['rounding_unit'] = previous_options.get('rounding_unit', default) + options['rounding_unit_names'] = self._get_rounding_unit_names() + + def _get_rounding_unit_names(self): + currency_symbol = self.env.company.currency_id.symbol + currency_name = self.env.company.currency_id.name + + rounding_unit_names = [ + ('decimals', (f'.{currency_symbol}', '')), + ('units', (f'{currency_symbol}', '')), + ('thousands', (f'K{currency_symbol}', _('Amounts in Thousands'))), + ('millions', (f'M{currency_symbol}', _('Amounts in Millions'))), + ] + + if currency_name in CURRENCIES_USING_LAKH: + rounding_unit_names.insert(3, ('lakhs', (f'L{currency_symbol}', _('Amounts in Lakhs')))) + + return dict(rounding_unit_names) + + # #################################################### + # OPTIONS: ALL ENTRIES + #################################################### + def _init_options_all_entries(self, options, previous_options): + if self.filter_show_draft: + options['all_entries'] = previous_options.get('all_entries', False) + else: + options['all_entries'] = False + + #################################################### + # OPTIONS: UNFOLDED LINES + #################################################### + def _init_options_unfolded(self, options, previous_options): + options['unfold_all'] = self.filter_unfold_all and previous_options.get('unfold_all', False) + + previous_section_source_id = previous_options.get('sections_source_id') + if not previous_section_source_id or previous_section_source_id == options['sections_source_id']: + # Only keep the unfolded lines if they belong to the same report or a section of the same report + options['unfolded_lines'] = previous_options.get('unfolded_lines', []) + else: + options['unfolded_lines'] = [] + + #################################################### + # OPTIONS: HIDE LINE AT 0 + #################################################### + def _init_options_hide_0_lines(self, options, previous_options): + if self.filter_hide_0_lines != 'never': + previous_val = previous_options.get('hide_0_lines') + if previous_val is not None: + options['hide_0_lines'] = previous_val + else: + options['hide_0_lines'] = self.filter_hide_0_lines == 'by_default' + else: + options['hide_0_lines'] = False + + def _filter_out_0_lines(self, lines): + """ Returns a list containing all lines that are not zero or that are parent to non-zero lines. + Can be used to ensure printed report does not include 0 lines, when hide_0_lines is toggled. + """ + lines_to_hide = set() # contain line ids to remove from lines + has_visible_children = set() # contain parent line ids + # Traverse lines in reverse to keep track of visible parent lines required by children lines + for line in reversed(lines): + is_zero_line = all(col.get('figure_type') not in NUMBER_FIGURE_TYPES or col.get('is_zero', True) for col in line['columns']) + if is_zero_line and line['id'] not in has_visible_children: + lines_to_hide.add(line['id']) + if line.get('parent_id') and line['id'] not in lines_to_hide: + has_visible_children.add(line['parent_id']) + return list(filter(lambda x: x['id'] not in lines_to_hide, lines)) + + #################################################### + # OPTIONS: HORIZONTAL GROUP + #################################################### + def _init_options_horizontal_groups(self, options, previous_options): + options['available_horizontal_groups'] = [ + { + 'id': horizontal_group.id, + 'name': horizontal_group.name, + } + for horizontal_group in self.horizontal_group_ids + ] + previous_selected = previous_options.get('selected_horizontal_group_id') + options['selected_horizontal_group_id'] = previous_selected if previous_selected in self.horizontal_group_ids.ids else None + + #################################################### + # OPTIONS: SEARCH BAR + #################################################### + def _init_options_search_bar(self, options, previous_options): + if self.search_bar: + options['search_bar'] = True + if 'default_filter_accounts' not in self._context and 'filter_search_bar' in previous_options: + options['filter_search_bar'] = previous_options['filter_search_bar'] + + #################################################### + # OPTIONS: COLUMN HEADERS + #################################################### + + def _init_options_column_headers(self, options, previous_options): + # Prepare column headers, in case the order of the comparison is ascending we reverse the order of the columns + all_comparison_date_vals = ([options['date']] + options.get('comparison', {}).get('periods', [])) + if options.get('comparison') and options['comparison']['period_order'] == 'ascending': + all_comparison_date_vals = all_comparison_date_vals[::-1] + + column_headers = [ + [ + { + 'name': comparison_date_vals['string'], + 'forced_options': {'date': comparison_date_vals}, + } + for comparison_date_vals in all_comparison_date_vals + ], # First level always consists of date comparison. Horizontal groupby are done on following levels. + ] + + # Handle horizontal groups + selected_horizontal_group_id = options.get('selected_horizontal_group_id') + if selected_horizontal_group_id: + horizontal_group = self.env['account.report.horizontal.group'].browse(selected_horizontal_group_id) + + for field_name, records in horizontal_group._get_header_levels_data(): + header_level = [ + { + 'name': record.display_name, + 'horizontal_groupby_element': {field_name: record.id}, + } + for record in records + ] + column_headers.append(header_level) + else: + # Insert budget column headers if needed + selected_budgets = [budget for budget in options.get('budgets', []) if budget['selected']] + if selected_budgets: + budget_headers = [{ + 'name': '', + 'forced_options': { + 'budget_base': True, + } + }] + + for budget in selected_budgets: + # Add budget amount column + budget_headers.append({ + 'name': budget['name'], + 'forced_options': { + 'compute_budget': budget['id'], + }, + 'colspan': 1, + }) + if len(self.column_ids.filtered(lambda column: column.figure_type == 'monetary')) == 1: + # Add budget percentage column (only if one column in the report) + budget_headers.append({ + 'name': "%", + 'forced_options': { + 'budget_percentage': budget['id'], + }, + 'colspan': 1, + }) + + column_headers.append(budget_headers) + + options['column_headers'] = column_headers + + #################################################### + # OPTIONS: COLUMNS + #################################################### + def _init_options_columns(self, options, previous_options): + default_group_vals = {'horizontal_groupby_element': {}, 'forced_options': {}} + all_column_group_vals_in_order = self._generate_columns_group_vals_recursively(options['column_headers'], default_group_vals) + + columns, column_groups = self._build_columns_from_column_group_vals(options, all_column_group_vals_in_order) + + options['columns'] = columns + options['column_groups'] = column_groups + + # Debug column is only shown when there is a single column group, so that we can display all the subtotals of the line in a clear way + options['show_debug_column'] = options['export_mode'] != 'print' \ + and self.env.user.has_group('base.group_no_one') \ + and len(options['column_groups']) == 1 \ + and len(self.line_ids) > 0 # No debug column on fully dynamic reports by default (they can customize this) + + # Show an additional column summing all the horizontal groups if there is no comparison and only one level of horizontal group + options['show_horizontal_group_total'] = options.get('selected_horizontal_group_id') \ + and options.get('comparison', {}).get('filter') == 'no_comparison' \ + and len(self.column_ids) == 1 \ + and len(options['column_headers']) == 2 + + def _generate_columns_group_vals_recursively(self, next_levels_headers, previous_levels_group_vals): + if next_levels_headers: + rslt = [] + for header_element in next_levels_headers[0]: + current_level_group_vals = {} + for key in previous_levels_group_vals: + current_level_group_vals[key] = {**previous_levels_group_vals.get(key, {}), **header_element.get(key, {})} + + rslt += self._generate_columns_group_vals_recursively(next_levels_headers[1:], current_level_group_vals) + return rslt + else: + return [previous_levels_group_vals] + + def _build_columns_from_column_group_vals(self, options, all_column_group_vals_in_order): + def _generate_domain_from_horizontal_group_hash_key_tuple(group_hash_key): + domain = [] + for field_name, field_value in group_hash_key: + domain.append((field_name, '=', field_value)) + return domain + + columns = [] + column_groups = {} + for column_group_val in all_column_group_vals_in_order: + horizontal_group_key_tuple = self._get_dict_hashable_key_tuple(column_group_val['horizontal_groupby_element']) # Empty tuple if no grouping + column_group_key = str(self._get_dict_hashable_key_tuple(column_group_val)) # Unique identifier for the column group + + column_groups[column_group_key] = { + 'forced_options': column_group_val['forced_options'], + 'forced_domain': _generate_domain_from_horizontal_group_hash_key_tuple(horizontal_group_key_tuple), + } + + # for budget, only one column in needed, regardless of the number of columns in the report + if any(budget_key in column_group_val['forced_options'] for budget_key in ('compute_budget', 'budget_percentage')): + columns.append({ + 'name': "", + 'column_group_key': column_group_key, + 'expression_label': 'balance', + 'sortable': False, + 'figure_type': 'monetary', + 'blank_if_zero': False, + 'style': "text-align: center; white-space: nowrap;", + }) + + else: + for report_column in self.column_ids: + columns.append({ + 'name': report_column.name, + 'column_group_key': column_group_key, + 'expression_label': report_column.expression_label, + 'sortable': report_column.sortable, + 'figure_type': report_column.figure_type, + 'blank_if_zero': report_column.blank_if_zero, + 'style': "text-align: center; white-space: nowrap;", + }) + + return columns, column_groups + + def _get_dict_hashable_key_tuple(self, dict_to_convert): + rslt = [] + for key, value in sorted(dict_to_convert.items()): + if isinstance(value, dict): + value = self._get_dict_hashable_key_tuple(value) + rslt.append((key, value)) + return tuple(rslt) + + #################################################### + # OPTIONS: BUTTONS + #################################################### + + def action_open_report_form(self, options, params): + return { + 'type': 'ir.actions.act_window', + 'res_model': 'account.report', + 'view_mode': 'form', + 'views': [(False, 'form')], + 'res_id': self.id, + } + + def _init_options_buttons(self, options, previous_options): + options['buttons'] = [ + {'name': _('PDF'), 'sequence': 10, 'action': 'export_file', 'action_param': 'export_to_pdf', 'file_export_type': _('PDF'), 'branch_allowed': True, 'always_show': True}, + {'name': _('XLSX'), 'sequence': 20, 'action': 'export_file', 'action_param': 'export_to_xlsx', 'file_export_type': _('XLSX'), 'branch_allowed': True, 'always_show': True}, + ] + + def open_account_report_file_download_error_wizard(self, errors, content): + self.ensure_one() + + model = 'account.report.file.download.error.wizard' + vals = {'actionable_errors': errors} + + if content: + vals['file_name'] = content['file_name'] + vals['file_content'] = base64.b64encode(re.sub(r'\n\s*\n', '\n', content['file_content']).encode()) + + return { + 'type': 'ir.actions.act_window', + 'res_model': model, + 'res_id': self.env[model].create(vals).id, + 'target': 'new', + 'views': [(False, 'form')], + } + + def get_export_mime_type(self, file_type): + """ Returns the MIME type associated with a report export file type, + for attachment generation. + """ + type_mapping = { + 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'pdf': 'application/pdf', + 'xml': 'application/xml', + 'xaf': 'application/vnd.sun.xml.writer', + 'txt': 'text/plain', + 'csv': 'text/csv', + 'zip': 'application/zip', + } + return type_mapping.get(file_type, False) + + def _init_options_section_buttons(self, options, previous_options): + """ In case we're displaying a section, we want to replace its buttons by its source report's. This needs to be done last, after calling the + custom handler, to avoid its _custom_options_initializer function to generate additional buttons. + """ + if options['sections_source_id'] != self.id: + # We need to re-call a full get_options in case a custom options initializer adds new buttons depending on other options. + # This way, we're sure we always get all buttons that are needed. + sections_source = self.env['account.report'].browse(options['sections_source_id']) + options['buttons'] = sections_source.get_options(previous_options={**options, 'no_report_reroute': True})['buttons'] + + #################################################### + # OPTIONS: VARIANTS + #################################################### + def _init_options_variants(self, options, previous_options): + allowed_variant_ids = set() + + previous_section_source_id = previous_options.get('sections_source_id') + if previous_section_source_id: + previous_section_source = self.env['account.report'].browse(previous_section_source_id) + if self in previous_section_source.section_report_ids: + options['variants_source_id'] = (previous_section_source.root_report_id or previous_section_source).id + allowed_variant_ids.add(previous_section_source_id) + + if 'variants_source_id' not in options: + options['variants_source_id'] = (self.root_report_id or self).id + + available_variants = self.env['account.report'] + options['has_inactive_variants'] = False + allowed_country_variant_ids = {} + all_variants = self._get_variants(options['variants_source_id']) + for variant in all_variants.filtered(lambda x: x._is_available_for(options)): + if not self.root_report_id and variant != self and variant.active: # Non-route reports don't reroute the variant when computing their options + allowed_variant_ids.add(variant.id) + if variant.country_id: + allowed_country_variant_ids.setdefault(variant.country_id.id, []).append(variant.id) + + if variant.active: + available_variants += variant + else: + options['has_inactive_variants'] = True + + options['available_variants'] = [ + { + 'id': variant.id, + 'name': variant.display_name, + 'country_id': variant.country_id.id, # To ease selection of default variant to open, without needing browsing again + } + for variant in sorted(available_variants, key=lambda x: (x.country_id and 1 or 0, x.sequence, x.id)) + ] + + previous_opt_report_id = previous_options.get('selected_variant_id') + if previous_opt_report_id in allowed_variant_ids or previous_opt_report_id == self.id: + options['selected_variant_id'] = previous_opt_report_id + elif allowed_country_variant_ids: + country_id = self.env.company.account_fiscal_country_id.id + report_id = (allowed_country_variant_ids.get(country_id) or next(iter(allowed_country_variant_ids.values())))[0] + options['selected_variant_id'] = report_id + else: + options['selected_variant_id'] = self.id + + def _get_variants(self, report_id): + source_report = self.env['account.report'].browse(report_id) + if source_report.root_report_id: + # We need to get the root report in order to get all variants + source_report = source_report.root_report_id + return source_report + source_report.with_context(active_test=False).variant_report_ids + + #################################################### + # OPTIONS: SECTIONS + #################################################### + def _init_options_sections(self, options, previous_options): + if options.get('selected_variant_id'): + options['sections_source_id'] = options['selected_variant_id'] + else: + options['sections_source_id'] = self.id + + source_report = self.env['account.report'].browse(options['sections_source_id']) + + available_sections = source_report.section_report_ids if source_report.use_sections else self.env['account.report'] + options['sections'] = [{'name': section.name, 'id': section.id} for section in available_sections] + + if available_sections: + section_id = previous_options.get('selected_section_id') + if not section_id or section_id not in available_sections.ids: + section_id = available_sections[0].id + + options['selected_section_id'] = section_id + + options['has_inactive_sections'] = bool(self.env['account.report'].with_context(active_test=False).search_count([ + ('section_main_report_ids', 'in', options['sections_source_id']), + ('active', '=', False) + ])) + + #################################################### + # OPTIONS: REPORT_ID + #################################################### + def _init_options_report_id(self, options, previous_options): + if previous_options.get('no_report_reroute'): + # Used for exports + options['report_id'] = self.id + else: + options['report_id'] = options.get('selected_section_id') or options.get('selected_variant_id') or self.id + + #################################################### + # OPTIONS: EXPORT MODE + #################################################### + def _init_options_export_mode(self, options, previous_options): + options['export_mode'] = previous_options.get('export_mode') + + #################################################### + # OPTIONS: HORIZONTAL SPLIT + #################################################### + def _init_options_horizontal_split(self, options, previous_options): + if any(line.horizontal_split_side for line in self.line_ids): + options['horizontal_split'] = previous_options.get('horizontal_split', False) + + #################################################### + # OPTIONS: CUSTOM + #################################################### + def _init_options_custom(self, options, previous_options): + custom_handler_model = self._get_custom_handler_model() + if custom_handler_model: + self.env[custom_handler_model]._custom_options_initializer(self, options, previous_options) + + #################################################### + # OPTIONS: INTEGER ROUNDING + #################################################### + def _init_options_integer_rounding(self, options, previous_options): + if self.integer_rounding: + options['integer_rounding'] = self.integer_rounding + if options.get('export_mode') == 'file': + options['integer_rounding_enabled'] = True + else: + options['integer_rounding_enabled'] = previous_options.get('integer_rounding_enabled', True) + return options + + #################################################### + # OPTIONS: BUDGETS + #################################################### + def _init_options_budgets(self, options, previous_options): + if self.filter_budgets: + previous_selection = {budget_option['id'] for budget_option in previous_options.get('budgets', []) if budget_option.get('selected')} + + options['budgets'] = [ + { + 'id': budget.id, + 'name': budget.name, + 'selected': budget.id in previous_selection, + 'company_id': budget.company_id.id, + } + for budget in self.env['account.report.budget'].search([('company_id', '=', self.env.company.id)]) + ] + options['show_all_accounts'] = previous_options.get('show_all_accounts') or False + + #################################################### + # OPTIONS: LOADING CALL + #################################################### + def _init_options_loading_call(self, options, previous_options): + """ Used by the js to know if it needs to reload the options (to not overwrite new options from the js) """ + options['loading_call_number'] = previous_options.get('loading_call_number') or 0 + return options + + #################################################### + # OPTIONS: READONLY QUERY + #################################################### + def _init_options_readonly_query(self, options, previous_options): + options['readonly_query'] = ( + options['currency_table']['type'] == 'monocurrency' + and not any(budget_opt['selected'] for budget_opt in options.get('budgets', [])) + ) + + #################################################### + # OPTIONS: CORE + #################################################### + + @api.readonly + def get_options(self, previous_options): + self.ensure_one() + + initializers_in_sequence = self._get_options_initializers_in_sequence() + + options = {} + + if previous_options.get('_running_export_test'): + options['_running_export_test'] = True + + # We need report_id to be initialized. Compute the necessary options to check for reroute. + for reroute_initializer_index, initializer in enumerate(initializers_in_sequence): + initializer(options, previous_options=previous_options) + + # pylint: disable=W0143 + if initializer == self._init_options_report_id: + break + + # Stop the computation to check for reroute once we have computed the necessary information + if (not self.root_report_id or (self.use_sections and self.section_report_ids)) and options['report_id'] != self.id: + # Load the variant/section instead of the root report + variant_options = {**previous_options} + for reroute_opt_key in ('selected_variant_id', 'selected_section_id', 'variants_source_id', 'sections_source_id'): + opt_val = options.get(reroute_opt_key) + if opt_val: + variant_options[reroute_opt_key] = opt_val + + return self.env['account.report'].browse(options['report_id']).get_options(variant_options) + + # No reroute; keep on and compute the other options + for initializer_index in range(reroute_initializer_index + 1, len(initializers_in_sequence)): + initializer = initializers_in_sequence[initializer_index] + initializer(options, previous_options=previous_options) + + options_companies = self.env['res.company'].browse(self.get_report_company_ids(options)) + # Set export buttons to 'branch_allowed' if the currently selected company branches all share the same VAT + # number and no unselected sub-branch of the active company has the same VAT number. Companies with an empty VAT + # field will be considered as having the same VAT number as their closest parent with a non-empty VAT. + if options.get('enable_export_buttons_for_common_vat_in_branches'): + report_accepted_company_ids = set(options_companies.ids) + same_vat_branch_ids = set(self.env.company._get_branches_with_same_vat().ids) + if report_accepted_company_ids == same_vat_branch_ids: + options['buttons'] = [{**button, 'branch_allowed': button.get('branch_allowed', True)} for button in options['buttons']] + + # Disable buttons without branch_allowed = True if not all branches are selected + if not options_companies._all_branches_selected(): + for button in filter(lambda x: not x.get('branch_allowed'), options['buttons']): + button['error_action'] = 'show_error_branch_allowed' + + # Sort the buttons list by sequence, for rendering + options['buttons'] = sorted(options['buttons'], key=lambda x: x.get('sequence', 90)) + + # Sanitizing date_from and date_to since they need to be JSON-serializable when exporting the report + # on the server side, since the ORM converts them to strings automatically when sending them to the client. + for date_dict in ( + [options.get('date', {})] + + [group_data['forced_options']['date'] for group_data in options['column_groups'].values() if group_data.get('forced_options', {}).get('date')] + ): + if (date_from := date_dict.get('date_from')) and not isinstance(date_from, str): + date_dict['date_from'] = fields.Date.to_string(date_from) + + if (date_to := date_dict.get('date_to')) and not isinstance(date_to, str): + date_dict['date_to'] = fields.Date.to_string(date_to) + + return options + + def _get_options_initializers_in_sequence(self): + """ Gets all filters in the right order to initialize them, so that each filter is + guaranteed to be after all of its dependencies in the resulting list. + + :return: a list of initializer functions, each accepting two parameters: + - options (mandatory): The options dictionary to be modified by this initializer to include its related option's data + + - previous_options (optional, defaults to None): A dict with default options values, coming from a previous call to the report. + These values can be considered or ignored on a case-by-case basis by the initializer, + depending on functional needs. + """ + initializer_prefix = '_init_options_' + initializers = [ + getattr(self, attr) for attr in dir(self) + if attr.startswith(initializer_prefix) + ] + + # Order them in a dependency-compliant way + forced_sequence_map = self._get_options_initializers_forced_sequence_map() + initializers.sort(key=lambda x: forced_sequence_map.get(x, forced_sequence_map.get('default'))) + + return initializers + + def _get_options_initializers_forced_sequence_map(self): + """ By default, not specific order is ensured for the filters when calling _get_options_initializers_in_sequence. + This function allows giving them a sequence number. It can be overridden + to make filters depend on each other. + + :return: dict(str, int): str is the filter name, int is its sequence (lowest = first). + Multiple filters may share the same sequence, their relative order is then not guaranteed. + """ + return { + self._init_options_companies: 10, + self._init_options_variants: 15, + self._init_options_sections: 16, + self._init_options_report_id: 17, + self._init_options_fiscal_position: 20, + self._init_options_date: 30, + self._init_options_horizontal_groups: 40, + self._init_options_comparison: 50, + self._init_options_export_mode: 60, + self._init_options_integer_rounding: 70, + self._init_options_journals: 80, + self._init_options_journals_names: 90, + + 'default': 200, + + self._init_options_column_headers: 990, + self._init_options_columns: 1000, + self._init_options_column_percent_comparison: 1010, + self._init_options_order_column: 1020, + self._init_options_hierarchy: 1030, + self._init_options_prefix_groups_threshold: 1040, + self._init_options_custom: 1050, + self._init_options_currency_table: 1055, + self._init_options_section_buttons: 1060, + self._init_options_readonly_query: 1070, + } + + def _get_options_domain(self, options, date_scope): + self.ensure_one() + + available_scopes = dict(self.env['account.report.expression']._fields['date_scope'].selection) + if date_scope and date_scope not in available_scopes: # date_scope can be passed to None explicitly to ignore the dates + raise UserError(_("Unknown date scope: %s", date_scope)) + + domain = [ + ('display_type', 'not in', ('line_section', 'line_note')), + ('company_id', 'in', self.get_report_company_ids(options)), + ] + if not options.get('compute_budget'): + domain += self._get_options_journals_domain(options) + if date_scope: + domain += self._get_options_date_domain(options, date_scope) + domain += self._get_options_partner_domain(options) + domain += self._get_options_all_entries_domain(options) + domain += self._get_options_unreconciled_domain(options) + domain += self._get_options_fiscal_position_domain(options) + domain += self._get_options_account_type_domain(options) + domain += self._get_options_aml_ir_filters(options) + + if self.only_tax_exigible: + domain += self.env['account.move.line']._get_tax_exigible_domain() + + if options.get('forced_domain'): + # That option key is set when splitting options between column groups + domain += options['forced_domain'] + + return domain + + #################################################### + # QUERIES + #################################################### + + def _get_report_query(self, options, date_scope, domain=None) -> Query: + """ Get a Query object that references the records needed for this report. """ + domain = self._get_options_domain(options, date_scope) + (domain or []) + + self.env['account.move.line'].check_access('read') + + query = self.env['account.move.line']._where_calc(domain) + + if options.get('compute_budget'): + self._create_report_budget_temp_table(options) + query._tables['account_move_line'] = SQL.identifier('account_report_budget_temp_aml') + query.add_where(SQL( + "%s AND budget_id = %s", + query.where_clause, + options['compute_budget'], + )) + + # Wrap the query with 'company_id IN (...)' to avoid bypassing company access rights. + self.env['account.move.line']._apply_ir_rules(query) + + return query + + def _create_report_budget_temp_table(self, options): + self._cr.execute("SELECT 1 FROM information_schema.tables WHERE table_name='account_report_budget_temp_aml'") + if self._cr.fetchone(): + return + + stored_aml_fields, fields_to_insert = self.env['account.move.line']._prepare_aml_shadowing_for_report({ + 'id': SQL.identifier("id"), + 'balance': SQL.identifier('amount'), + 'company_id': self.env.company.id, + 'parent_state': 'posted', + 'date': SQL.identifier('date'), + 'account_id': SQL.identifier("account_id"), + 'debit': SQL("CASE WHEN (amount > 0) THEN amount else 0 END"), + 'credit': SQL("CASE WHEN (amount < 0) THEN -amount else 0 END"), + }) + + self._cr.execute(SQL( + """ + -- Create a temporary table, dropping not null constraints because we're not filling those columns + CREATE TEMPORARY TABLE IF NOT EXISTS account_report_budget_temp_aml () inherits (account_move_line) ON COMMIT DROP; + ALTER TABLE account_report_budget_temp_aml NO INHERIT account_move_line; + ALTER TABLE account_report_budget_temp_aml ALTER COLUMN move_id DROP NOT NULL; + ALTER TABLE account_report_budget_temp_aml ALTER COLUMN currency_id DROP NOT NULL; + ALTER TABLE account_report_budget_temp_aml ALTER COLUMN journal_id DROP NOT NULL; + ALTER TABLE account_report_budget_temp_aml ALTER COLUMN display_type DROP NOT NULL; + ALTER TABLE account_report_budget_temp_aml ADD budget_id INTEGER NOT NULL; + + INSERT INTO account_report_budget_temp_aml (%(stored_aml_fields)s, budget_id) + SELECT %(fields_to_insert)s, budget_id + FROM account_report_budget_item + WHERE budget_id IN %(available_budget_ids)s; + + -- Create a supporting index to avoid seq.scans + CREATE INDEX IF NOT EXISTS account_report_budget_temp_aml__composite_idx ON account_report_budget_temp_aml (account_id, journal_id, date, company_id); + -- Update statistics for correct planning + ANALYZE account_report_budget_temp_aml + """, + stored_aml_fields=stored_aml_fields, + fields_to_insert=fields_to_insert, + available_budget_ids=tuple(budget_option['id'] for budget_option in options['budgets']), + )) + + if options.get('show_all_accounts'): + stored_aml_fields, fields_to_insert = self.env['account.move.line']._prepare_aml_shadowing_for_report({ + # Using nextval will consume a sequence number, we decide to do it to avoid comparing apples and oranges + 'id': SQL("(SELECT nextval('account_report_budget_item_id_seq'))"), + 'balance': SQL("0"), + 'company_id': self.env.company.id, + 'parent_state': 'posted', + 'date': SQL("%s", options['date']['date_from']), + 'account_id': SQL.identifier("accounts", "id"), + 'debit': SQL("0"), + 'credit': SQL("0"), + }) + accounts_subquery = self.env['account.account']._where_calc([ + ('company_ids', 'in', self.get_report_company_ids(options)), + ('internal_group', 'in', ['income', 'expense']), + ]) + self._cr.execute(SQL( + """ + -- Insert dynamic combinations of account_id and budget_id into the temporary table + INSERT INTO account_report_budget_temp_aml (%(stored_aml_fields)s, budget_id) + SELECT %(fields_to_insert)s, budgets.id AS budget_id + FROM (%(accounts_subquery)s) AS accounts + CROSS JOIN ( + SELECT id + FROM account_report_budget + WHERE id IN %(available_budget_ids)s + ) AS budgets + """, + stored_aml_fields=stored_aml_fields, + fields_to_insert=fields_to_insert, + accounts_subquery=accounts_subquery.select(), + available_budget_ids=tuple(budget_option['id'] for budget_option in options['budgets']), + income='income%', + expense='expense%', + company_ids=tuple(), + )) + + #################################################### + # LINE IDS MANAGEMENT HELPERS + #################################################### + def _get_generic_line_id(self, model_name, value, markup=None, parent_line_id=None): + """ Generates a generic line id from the provided parameters. + + Such a generic id consists of a string repeating 1 to n times the following pattern: + markup-model-value, each occurence separated by a LINE_ID_HIERARCHY_DELIMITER character from the previous one. + + Each pattern corresponds to a level of hierarchy in the report, so that + the n-1 patterns starting the id of a line actually form the id of its generator line. + EX: a~b~c|d~e~f|g~h~i => This line is a subline generated by a~b~c|d~e~f where | is the LINE_ID_HIERARCHY_DELIMITER. + + Each pattern consists of the three following elements: + - markup: a (possibly empty) free string or json-formatted dict allowing finer identification of the line + (like the name of the field for account.accounting.reports) + + - model: the model this line has been generated for, or an empty string if there is none + + - value: the groupby value for this line (typically the id of a record + or the value of a field), or an empty string if there isn't any. + """ + self.ensure_one() + + if parent_line_id: + parent_id_list = self._parse_line_id(parent_line_id, markup_as_string=True) + else: + parent_id_list = [(None, 'account.report', self.id)] + + # In case the markup is a dict, it must be converted to a string, but in a way such that the keys are ordered alphabetically. + # This is useful, notably for annotations where the ids of the lines are stored, therefore requiring a consistent ordering + if isinstance(markup, dict): + markup = json.dumps(markup, sort_keys=True) + + new_line = self._build_line_id(parent_id_list + [(markup, model_name, value)]) + return new_line + + @api.model + def _get_line_from_xml_id(self, lines, xml_id): + """ Helper function to get a specific account report line from the xmlid """ + report_line = self.env.ref(xml_id, raise_if_not_found=False) + return next( + line for line in lines + if self._get_model_info_from_id(line['id']) == ('account.report.line', report_line.id) + ) + + @api.model + def _get_model_info_from_id(self, line_id): + """ Parse the provided generic report line id. + + :param line_id: the report line id (i.e. markup~model~value|markup2~model2~value2 where | is the LINE_ID_HIERARCHY_DELIMITER) + :return: tuple(model, id) of the report line. Each of those values can be None if the id contains no information about them. + """ + last_id_tuple = self._parse_line_id(line_id)[-1] + return last_id_tuple[-2:] + + @api.model + def _build_line_id(self, current): + """ Build a generic line id string from its list representation, converting + the None values for model and value to empty strings. + :param current (list): list of tuple(markup, model, value) + """ + def convert_none(x): + return x if x is not None and x is not False else '' + return LINE_ID_HIERARCHY_DELIMITER.join(f'{convert_none(markup)}~{convert_none(model)}~{convert_none(value)}' for markup, model, value in current) + + @api.model + def _build_parent_line_id(self, current): + """Build the parent_line id based on the current position in the report. + + For instance, if current is [('markup1', 'account.account', 5), ('markup2', 'res.partner', 8)], it will return + markup1~account.account~5 + :param current (list): list of tuple(markup, model, value) + """ + to_process = [(json.dumps(markup) if isinstance(markup, dict) else markup, model, value) for markup, model, value in current[:-1]] + return self._build_line_id(to_process) + + @api.model + def _parse_markup(self, markup): + if not markup: + return markup + try: + result = json.loads(markup) + except json.JSONDecodeError: # the markup is not a JSON object + return markup + if isinstance(result, dict): + return result + + return markup + + @api.model + def _parse_line_id(self, line_id, markup_as_string=False): + """Parse the provided string line id and convert it to its list representation. + Empty strings for model and value will be converted to None. + + For instance if line_id is markup1~account.account~5|markup2~res.partner~8 (where | is the LINE_ID_HIERARCHY_DELIMITER), + it will return [('markup1', 'account.account', 5), ('markup2', 'res.partner', 8)] + :param line_id (str): the generic line id to parse + """ + return line_id and [ + # When there is a model, value is an id, so we cast it to and int. Else, we keep the original value (for groupby lines on + # non-relational fields, for example). + (self._parse_markup(markup) if not markup_as_string else markup, model or None, int(value) if model and value else (value or None)) + for markup, model, value in (key.rsplit('~', 2) for key in line_id.split(LINE_ID_HIERARCHY_DELIMITER)) + ] or [] + + @api.model + def _get_unfolded_lines(self, lines, parent_line_id): + """ Return a list of all children lines for specified parent_line_id. + NB: It will return the parent_line itself! + + For instance if parent_line_ids is '~account.report.line~84|{"groupby": "currency_id"}~res.currency~174' + (where | is the LINE_ID_HIERARCHY_DELIMITER), it will return every subline for this currency. + :param lines: list of report lines + :param parent_line_id: id of a specified line + :return: A list of all children lines for a specified parent_line_id + """ + return [ + line for line in lines + if line['id'].startswith(parent_line_id) + ] + + @api.model + def _get_res_id_from_line_id(self, line_id, target_model_name): + """ Parses the provided generic line id and returns the most local (i.e. the furthest on the right) record id it contains which + corresponds to the provided model name. If line_id does not contain anything related to target_model_name, None will be returned. + + For example, parsing ~account.move~1|~res.partner~2|~account.move~3 (where | is the LINE_ID_HIERARCHY_DELIMITER) + with target_model_name='account.move' will return 3. + """ + dict_result = self._get_res_ids_from_line_id(line_id, [target_model_name]) + return dict_result[target_model_name] if dict_result else None + + + @api.model + def _get_res_ids_from_line_id(self, line_id, target_model_names): + """ Parses the provided generic line id and returns the most local (i.e. the furthest on the right) record ids it contains which + correspond to the provided model names, in the form {model_name: res_id}. If a model is not present in line_id, its model will be absent + from the resulting dict. + + For example, parsing ~account.move~1|~res.partner~2|~account.move~3 with target_model_names=['account.move', 'res.partner'] will return + {'account.move': 3, 'res.partner': 2}. + """ + result = {} + models_to_find = set(target_model_names) + for dummy, model, value in reversed(self._parse_line_id(line_id)): + if model in models_to_find: + result[model] = value + models_to_find.remove(model) + + return result + + @api.model + def _get_markup(self, line_id): + """ Directly returns the markup associated with the provided line_id. + """ + return self._parse_line_id(line_id)[-1][0] if line_id else None + + def _build_subline_id(self, parent_line_id, subline_id_postfix): + """ Creates a new subline id by concatanating parent_line_id with the provided id postfix. + """ + return f"{parent_line_id}{LINE_ID_HIERARCHY_DELIMITER}{subline_id_postfix}" + + #################################################### + # CARET OPTIONS MANAGEMENT + #################################################### + + def _get_caret_options(self): + return { + **self._caret_options_initializer_default(), + **(self.env[self.custom_handler_model_name]._caret_options_initializer() if self.custom_handler_model_id else {}), + } + + def _caret_options_initializer_default(self): + return { + 'account.account': [ + {'name': _("General Ledger"), 'action': 'caret_option_open_general_ledger'}, + ], + + 'account.move': [ + {'name': _("View Journal Entry"), 'action': 'caret_option_open_record_form'}, + ], + + 'account.move.line': [ + {'name': _("View Journal Entry"), 'action': 'caret_option_open_record_form', 'action_param': 'move_id'}, + ], + + 'account.payment': [ + {'name': _("View Payment"), 'action': 'caret_option_open_record_form', 'action_param': 'payment_id'}, + ], + + 'account.bank.statement': [ + {'name': _("View Bank Statement"), 'action': 'caret_option_open_statement_line_reco_widget'}, + ], + + 'res.partner': [ + {'name': _("View Partner"), 'action': 'caret_option_open_record_form'}, + ], + } + + def caret_option_open_record_form(self, options, params): + model, record_id = self._get_model_info_from_id(params['line_id']) + record = self.env[model].browse(record_id) + target_record = record[params['action_param']] if 'action_param' in params else record + + view_id = self._resolve_caret_option_view(target_record) + + action = { + 'type': 'ir.actions.act_window', + 'view_mode': 'form', + 'views': [(view_id, 'form')], # view_id will be False in case the default view is needed + 'res_model': target_record._name, + 'res_id': target_record.id, + 'context': self._context, + } + + if view_id is not None: + action['view_id'] = view_id + + return action + + def _get_caret_option_view_map(self): + return { + 'account.payment': 'account.view_account_payment_form', + 'res.partner': 'base.view_partner_form', + 'account.move': 'account.view_move_form', + } + + def _resolve_caret_option_view(self, target): + '''Retrieve the target view of the caret option. + + :param target: The target record of the redirection. + :return: The id of the target view. + ''' + view_map = self._get_caret_option_view_map() + + view_xmlid = view_map.get(target._name) + if not view_xmlid: + return None + + return self.env['ir.model.data']._xmlid_lookup(view_xmlid)[1] + + def caret_option_open_general_ledger(self, options, params): + # When coming from a specific account, the unfold must only be retained + # on the specified account. Better performance and more ergonomic + # as it opens what client asked. And "Unfold All" is 1 clic away. + options["unfold_all"] = False + + records_to_unfold = [] + for _dummy, model, record_id in self._parse_line_id(params['line_id']): + if model in ('account.group', 'account.account'): + records_to_unfold.append((model, record_id)) + + if not records_to_unfold or records_to_unfold[-1][0] != 'account.account': + raise UserError(_("'Open General Ledger' caret option is only available form report lines targetting accounts.")) + + general_ledger = self.env.ref('odex30_account_reports.general_ledger_report') + lines_to_unfold = [] + for model, record_id in records_to_unfold: + parent_line_id = lines_to_unfold[-1] if lines_to_unfold else None + # Re-create the hierarchy of account groups that should be unfolded in GL + generic_line_id = general_ledger._get_generic_line_id(model, record_id, parent_line_id=parent_line_id) + lines_to_unfold.append(generic_line_id) + + options['not_reset_journals_filter'] = True # prevents resetting the default journal group + gl_options = general_ledger.get_options(options) + gl_options['not_reset_journals_filter'] = True # prevents resetting the default journal group + gl_options['unfolded_lines'] = lines_to_unfold + + account_id = self.env['account.account'].browse(records_to_unfold[-1][1]) + action_vals = self.env['ir.actions.actions']._for_xml_id('odex30_account_reports.action_account_report_general_ledger') + action_vals['params'] = { + 'options': gl_options, + 'ignore_session': True, + } + action_vals['context'] = dict(ast.literal_eval(action_vals['context']), default_filter_accounts=account_id.code) + + return action_vals + + def caret_option_open_statement_line_reco_widget(self, options, params): + model, record_id = self._get_model_info_from_id(params['line_id']) + record = self.env[model].browse(record_id) + if record._name == 'account.bank.statement.line': + return record.action_open_recon_st_line() + elif record._name == 'account.bank.statement': + return record.action_open_bank_reconcile_widget() + raise UserError(_("'View Bank Statement' caret option is only available for report lines targeting bank statements.")) + + #################################################### + # MISC + #################################################### + + def _get_custom_handler_model(self): + """ Check whether the current report has a custom handler and if it does, return its name. + Otherwise, try to fall back on the root report. + """ + return self.custom_handler_model_name or self.root_report_id.custom_handler_model_name or None + + def dispatch_report_action(self, options, action, action_param=None, on_sections_source=False): + """ Dispatches calls made by the client to either the report itself, or its custom handler if it exists. + The action should be a public method, by definition, but a check is made to make sure + it is not trying to call a private method. + """ + self.ensure_one() + + if on_sections_source: + report_to_call = self.env['account.report'].browse(options['sections_source_id']) + options["report_id"] = report_to_call.id + return report_to_call.dispatch_report_action(options, action, action_param=action_param, on_sections_source=False) + + if self.id not in (options['report_id'], options.get('sections_source_id')): + raise UserError(_("Trying to dispatch an action on a report not compatible with the provided options.")) + + args = [options, action_param] if action_param is not None else [options] + model = self + custom_handler_model = self._get_custom_handler_model() + if custom_handler_model and hasattr(self.env[custom_handler_model], action): + model = self.env[custom_handler_model] + report_method = get_public_method(model, action) + return report_method(model, *args) + + def _get_custom_report_function(self, function_name, prefix): + """ Returns a report function from its name, first checking it to ensure it's private (and raising if it isn't). + This helper is used by custom report fields containing function names. + The function will be called on the report's custom handler if it exists, or on the report itself otherwise. + """ + self.ensure_one() + function_name_prefix = f'_report_{prefix}_' + if not function_name.startswith(function_name_prefix): + raise UserError(_("Method '%(method_name)s' must start with the '%(prefix)s' prefix.", method_name=function_name, prefix=function_name_prefix)) + + if self.custom_handler_model_id: + handler = self.env[self.custom_handler_model_name] + if hasattr(handler, function_name): + return getattr(handler, function_name) + + if not hasattr(self, function_name): + raise UserError(_("Invalid method “%s”", function_name)) + # Call the check method without the private prefix to check for others security risks. + return getattr(self, function_name) + + def _get_lines(self, options, all_column_groups_expression_totals=None, warnings=None): + self.ensure_one() + + if options['report_id'] != self.id: + # Should never happen; just there to prevent BIG issues and directly spot them + raise UserError(_("Inconsistent report_id in options dictionary. Options says %(options_report)s; report is %(report)s.", options_report=options['report_id'], report=self.id)) + + # Necessary to ensure consistency of the data if some of them haven't been written in database yet + self.env.flush_all() + + if warnings is not None: + self._generate_common_warnings(options, warnings) + + # Merge static and dynamic lines in a common list + if all_column_groups_expression_totals is None: + self._init_currency_table(options) + all_column_groups_expression_totals = self._compute_expression_totals_for_each_column_group( + self.line_ids.expression_ids, + options, + warnings=warnings, + ) + + dynamic_lines = self._get_dynamic_lines(options, all_column_groups_expression_totals, warnings=warnings) + + lines = [] + line_cache = {} # {report_line: report line dict} + hide_if_zero_lines = self.env['account.report.line'] + + # There are two types of lines: + # - static lines: the ones generated from self.line_ids + # - dynamic lines: the ones generated from a call to the functions referred to by self.dynamic_lines_generator + # This loops combines both types of lines together within the lines list + for line in self.line_ids: # _order ensures the sequence of the lines + # Inject all the dynamic lines whose sequence is inferior to the next static line to add + while dynamic_lines and line.sequence > dynamic_lines[0][0]: + lines.append(dynamic_lines.pop(0)[1]) + + parent_generic_id = None + + if line.parent_id: + # Normally, the parent line has necessarily been treated in a previous iteration + try: + parent_generic_id = line_cache[line.parent_id]['id'] + except KeyError as e: + raise UserError(_( + "Line '%(child)s' is configured to appear before its parent '%(parent)s'. This is not allowed.", + child=line.name, parent=e.args[0].name + )) + + line_dict = self._get_static_line_dict(options, line, all_column_groups_expression_totals, parent_id=parent_generic_id) + line_cache[line] = line_dict + + if line.hide_if_zero: + hide_if_zero_lines += line + + lines.append(line_dict) + + for dummy, left_dynamic_line in dynamic_lines: + lines.append(left_dynamic_line) + + # Manage growth comparison + if options.get('column_percent_comparison') == 'growth': + for line in lines: + first_value, second_value = line['columns'][0]['no_format'], line['columns'][1]['no_format'] + + green_on_positive = True + model, line_id = self._get_model_info_from_id(line['id']) + + if model == 'account.report.line' and line_id: + report_line = self.env['account.report.line'].browse(line_id) + compared_expression = report_line.expression_ids.filtered( + lambda expr: expr.label == line['columns'][0]['expression_label'] + ) + green_on_positive = compared_expression.green_on_positive + + line['column_percent_comparison_data'] = self._compute_column_percent_comparison_data( + options, first_value, second_value, green_on_positive=green_on_positive + ) + # Manage budget comparison + elif options.get('column_percent_comparison') == 'budget': + for line in lines: + self._set_budget_column_comparisons(options, line) + + # Manage hide_if_zero lines: + # - If they have column values: hide them if all those values are 0 (or empty) + # - If they don't: hide them if all their children's column values are 0 (or empty) + # Also, hide all the children of a hidden line. + hidden_lines_dict_ids = set() + for line in hide_if_zero_lines: + children_to_check = line + current = line + while current: + children_to_check |= current + current = current.children_ids + + all_children_zero = True + hide_candidates = set() + for child in children_to_check: + child_line_dict_id = line_cache[child]['id'] + + if child_line_dict_id in hidden_lines_dict_ids: + continue + elif all(col.get('is_zero', True) for col in line_cache[child]['columns']): + hide_candidates.add(child_line_dict_id) + else: + all_children_zero = False + break + + if all_children_zero: + hidden_lines_dict_ids |= hide_candidates + + lines[:] = filter(lambda x: x['id'] not in hidden_lines_dict_ids and x.get('parent_id') not in hidden_lines_dict_ids, lines) + + # Create the hierarchy of lines if necessary + if options.get('hierarchy'): + lines = self._create_hierarchy(lines, options) + + # Handle totals below sections for static lines + lines = self._add_totals_below_sections(lines, options) + + # Unfold lines (static or dynamic) if necessary and add totals below section to dynamic lines + lines = self._fully_unfold_lines_if_needed(lines, options) + + self._inject_account_names_for_consolidation(lines) + + if self.custom_handler_model_id: + lines = self.env[self.custom_handler_model_name]._custom_line_postprocessor(self, options, lines) + + if warnings is not None: + custom_handler_name = self.custom_handler_model_name or self.root_report_id.custom_handler_model_name + if custom_handler_name: + self.env[custom_handler_name]._customize_warnings(self, options, all_column_groups_expression_totals, warnings) + + # Format values in columns of lines that will be displayed + self._format_column_values(options, lines) + + if options.get('export_mode') == 'print' and options.get('hide_0_lines'): + lines = self._filter_out_0_lines(lines) + + return lines + + # Deprecated, removed in master. + @api.model + def format_column_values(self, options, lines): + self._format_column_values(options, lines, force_format=True) + + return lines + + def format_column_values_from_client(self, options, lines): + """ Format column values for display. Called via dispatch_report_action when rounding unit changes on client side.""" + self._format_column_values(options, lines, force_format=True) + + return lines + + def _format_column_values(self, options, line_dict_list, force_format=False): + for line_dict in line_dict_list: + for column_dict in line_dict['columns']: + if 'name' in column_dict and not force_format: + # Columns which have already received a name are assumed to be already formatted; nothing needs to be done for them. + # This gives additional flexibility to custom reports, if needed. + continue + + if not column_dict: + continue + elif column_dict.get('is_zero') and column_dict.get('blank_if_zero'): + rslt = '' + elif options.get('export_mode') == 'file': + rslt = column_dict.get('no_format', '') + else: + rslt = self.format_value( + options, + column_dict.get('no_format'), + column_dict.get('figure_type'), + format_params=column_dict.get('format_params'), + ) + + column_dict['name'] = rslt + + # Handle the total in case of an horizontal group when there is no comparison and only one level of horizontal group + if options.get('show_horizontal_group_total'): + # In case the line has no formula + if all(column['no_format'] is None for column in line_dict['columns']): + continue + # In case total below section, some line don't have the value displayed + if self.env.company.totals_below_sections and not options.get('ignore_totals_below_sections') and line_dict['unfolded']: + continue + + figure_type_is_valid = all(column['figure_type'] in {'float', 'integer', 'monetary'} for column in line_dict['columns']) + total_value = sum(column["no_format"] for column in line_dict['columns']) if figure_type_is_valid else None + line_dict['horizontal_group_total_data'] = { + 'name': self.format_value( + options, + total_value, + line_dict['columns'][0]['figure_type'], + format_params=line_dict['columns'][0]['format_params'], + ), + 'no_format': total_value, + } + + def _generate_common_warnings(self, options, warnings): + # Display a warning if we're displaying only the data of the current company, but it's also part of a tax unit + if options.get('available_tax_units') and options['tax_unit'] == 'company_only': + warnings['odex30_account_reports.common_warning_tax_unit'] = {} + + report_company_ids = self.get_report_company_ids(options) + # The _accessible_branches function will return the accessible branches from the ones that are already selected, + # and the report_company_ids function will return the current company and its branches (that are selected) with the same VAT + # or tax unit. Therefore, we will display the warning only when the selected companies do not have the same VAT + # and in the context of branches. + if self.filter_multi_company == 'tax_units' and any(accessible_branch.id not in report_company_ids for accessible_branch in self.env.company._accessible_branches()): + warnings['odex30_account_reports.tax_report_warning_tax_id_selected_companies'] = {'alert_type': 'warning'} + + # Check whether there are unposted entries for the selected period and partner or not (if the report allows it) + if options.get('date') and options.get('all_entries') is not None: + domain = osv.expression.AND([ + self.env['account.move']._check_company_domain(report_company_ids), + [('state', '=', 'draft')], + [('date', '<=', options['date']['date_to'])], + ]) + if options.get('partner_ids'): + domain = osv.expression.AND([ + domain, + osv.expression.OR([ + [('partner_id', 'in', options['partner_ids'])], + [('partner_shipping_id', 'in', options['partner_ids'])], + [('commercial_partner_id', 'in', options['partner_ids'])], + ]) + ]) + if self.env['account.move'].search_count(domain, limit=1): + warnings['odex30_account_reports.common_warning_draft_in_period'] = {} + + def _fully_unfold_lines_if_needed(self, lines, options): + def line_need_expansion(line_dict): + return line_dict.get('unfolded') and line_dict.get('expand_function') + + custom_unfold_all_batch_data = None + + # If it's possible to batch unfold and we're unfolding all lines, compute the batch, so that individual expansions are more efficient + if options['unfold_all'] and self.custom_handler_model_id: + lines_to_expand_by_function = {} + for line_dict in lines: + if line_need_expansion(line_dict): + lines_to_expand_by_function.setdefault(line_dict['expand_function'], []).append(line_dict) + + custom_unfold_all_batch_data = self.env[self.custom_handler_model_name]._custom_unfold_all_batch_data_generator(self, options, lines_to_expand_by_function) + + i = 0 + while i < len(lines): + # We iterate in such a way that if the lines added by an expansion need expansion, they will get it as well + line_dict = lines[i] + if line_need_expansion(line_dict): + groupby = line_dict.get('groupby') + progress = line_dict.get('progress') + to_insert = self._expand_unfoldable_line( + line_dict['expand_function'], line_dict['id'], groupby, options, progress, 0, line_dict.get('horizontal_split_side'), + unfold_all_batch_data=custom_unfold_all_batch_data, + ) + lines = lines[:i+1] + to_insert + lines[i+1:] + i += 1 + + return lines + + def _generate_total_below_section_line(self, section_line_dict): + return { + **section_line_dict, + 'id': self._get_generic_line_id(None, None, parent_line_id=section_line_dict['id'], markup='total'), + 'level': section_line_dict['level'] if section_line_dict['level'] != 0 else 1, # Total line should not be level 0 + 'name': _("Total %s", section_line_dict['name']), + 'parent_id': section_line_dict['id'], + 'unfoldable': False, + 'unfolded': False, + 'caret_options': None, + 'action_id': None, + 'page_break': False, # If the section's line possesses a page break, we don't want the total to have it. + } + + def _get_static_line_dict(self, options, line, all_column_groups_expression_totals, parent_id=None): + line_id = self._get_generic_line_id('account.report.line', line.id, parent_line_id=parent_id) + columns = self._build_static_line_columns(line, options, all_column_groups_expression_totals) + groupby = line._get_groupby(options) + has_children = (groupby and any(col['has_sublines'] for col in columns)) or bool(line.children_ids) + + rslt = { + 'id': line_id, + 'name': line.name, + 'groupby': groupby, + 'unfoldable': line.foldable and has_children, + 'unfolded': (not line.foldable and (groupby or has_children)) or line_id in options['unfolded_lines'] or has_children and options['unfold_all'], + 'columns': columns, + 'level': line.hierarchy_level, + 'page_break': line.print_on_new_page, + 'action_id': line.action_id.id, + 'expand_function': groupby and '_report_expand_unfoldable_line_with_groupby' or None, + } + + if line.horizontal_split_side: + rslt['horizontal_split_side'] = line.horizontal_split_side + + if parent_id: + rslt['parent_id'] = parent_id + + if options['export_mode'] == 'file': + rslt['code'] = line.code + + if options['show_debug_column']: + first_group_key = list(options['column_groups'].keys())[0] + column_group_totals = all_column_groups_expression_totals[first_group_key] + # Only consider the first column group, as show_debug_column is only true if there is but one. + + engine_selection_labels = dict(self.env['account.report.expression']._fields['engine']._description_selection(self.env)) + expressions_detail = defaultdict(lambda: []) + col_expression_to_figure_type = { + column.get('expression_label'): column.get('figure_type') for column in options['columns'] + } + for expression in line.expression_ids.filtered(lambda x: not x.label.startswith('_default')): + engine_label = engine_selection_labels[expression.engine] + figure_type = expression.figure_type or col_expression_to_figure_type.get(expression.label) or 'none' + expressions_detail[engine_label].append(( + expression.label, + {'formula': expression.formula, 'subformula': expression.subformula, 'value': self.format_value(options, column_group_totals[expression]['value'], figure_type)} + )) + + # Sort results so that they can be rendered nicely in the UI + for details in expressions_detail.values(): + details.sort(key=lambda x: x[0]) + sorted_expressions_detail = sorted(expressions_detail.items(), key=lambda x: x[0]) + + if sorted_expressions_detail: + try: + rslt['debug_popup_data'] = json.dumps({'expressions_detail': sorted_expressions_detail}) + except TypeError: + raise UserError(_( + 'Invalid subformula in expression "%(expression)s" of line "%(line)s": %(subformula)s', + expression=expression.label, + line=expression.report_line_id.name, + subformula=expression.subformula, + )) + return rslt + + @api.model + def _build_static_line_columns(self, line, options, all_column_groups_expression_totals, groupby_model=None): + line_expressions_map = {expr.label: expr for expr in line.expression_ids} + columns = [] + for column_data in options['columns']: + col_group_key = column_data['column_group_key'] + current_group_expression_totals = all_column_groups_expression_totals[col_group_key] + target_line_res_dict = {expr.label: current_group_expression_totals[expr] for expr in line.expression_ids if not expr.label.startswith('_default')} + + column_expr_label = column_data['expression_label'] + column_res_dict = target_line_res_dict.get(column_expr_label, {}) + column_value = column_res_dict.get('value') + column_has_sublines = column_res_dict.get('has_sublines', False) + column_expression = line_expressions_map.get(column_expr_label, self.env['account.report.expression']) + figure_type = column_expression.figure_type or column_data['figure_type'] + + # Handle info popup + info_popup_data = {} + + # Check carryover + carryover_expr_label = '_carryover_%s' % column_expr_label + carryover_value = target_line_res_dict.get(carryover_expr_label, {}).get('value', 0) + if self.env.company.currency_id.compare_amounts(0, carryover_value) != 0: + info_popup_data['carryover'] = self._format_value(options, carryover_value, 'monetary') + + carryover_expression = line_expressions_map[carryover_expr_label] + if carryover_expression.carryover_target: + info_popup_data['carryover_target'] = carryover_expression._get_carryover_target_expression(options).report_line_name + # If it's not set, it means the carryover needs to target the same expression + + applied_carryover_value = target_line_res_dict.get('_applied_carryover_%s' % column_expr_label, {}).get('value', 0) + if self.env.company.currency_id.compare_amounts(0, applied_carryover_value) != 0: + info_popup_data['applied_carryover'] = self._format_value(options, applied_carryover_value, 'monetary') + info_popup_data['allow_carryover_audit'] = self.env.user.has_group('base.group_no_one') + info_popup_data['expression_id'] = line_expressions_map['_applied_carryover_%s' % column_expr_label]['id'] + info_popup_data['column_group_key'] = col_group_key + + # Handle manual edition popup + edit_popup_data = {} + formatter_params = {} + if column_expression.engine == 'external' and column_expression.subformula \ + and len(options['companies']) == 1 \ + and (not options['available_vat_fiscal_positions'] or options['fiscal_position'] != 'all'): + + # Compute rounding for manual values + rounding = None + if figure_type == 'integer': + rounding = 0 + else: + rounding_opt_match = re.search(r"\Wrounding\W*=\W*(?P\d+)", column_expression.subformula) + if rounding_opt_match: + rounding = int(rounding_opt_match.group('rounding')) + elif figure_type == 'monetary': + rounding = self.env.company.currency_id.decimal_places + + if 'editable' in column_expression.subformula: + edit_popup_data = { + 'column_group_key': col_group_key, + 'target_expression_id': column_expression.id, + 'rounding': rounding, + 'figure_type': figure_type, + 'column_value': column_value, + } + + formatter_params['digits'] = rounding + + # Handle editable financial budgets + editable_budget = groupby_model == 'account.account' and options['column_groups'][col_group_key]['forced_options'].get('compute_budget') + if editable_budget and self.env.user.has_group('account.group_account_manager'): + edit_popup_data = { + 'column_group_key': col_group_key, + 'target_expression_id': column_expression.id, + 'rounding': self.env.company.currency_id.decimal_places, + 'figure_type': 'monetary', + 'column_value': column_value, + } + + # Build result + if column_value is not None: #In case column value is zero, we still want to go through the condition + foreign_currency_id = target_line_res_dict.get(f'_currency_{column_expr_label}', {}).get('value') + if foreign_currency_id: + formatter_params['currency'] = self.env['res.currency'].browse(foreign_currency_id) + + column_data = self._build_column_dict( + column_value, + column_data, + options=options, + column_expression=column_expression if column_expression else None, + has_sublines=column_has_sublines, + report_line_id=line.id, + **formatter_params, + ) + + if info_popup_data: + column_data['info_popup_data'] = json.dumps(info_popup_data) + + if edit_popup_data: + column_data['edit_popup_data'] = json.dumps(edit_popup_data) + + columns.append(column_data) + + return columns + + def _build_column_dict( + self, col_value, col_data, + options=None, currency=False, digits=1, + column_expression=None, has_sublines=False, + report_line_id=None, + ): + # Empty column + if col_value is None and col_data is None: + return {} + + col_data = col_data or {} + column_expression = column_expression or self.env['account.report.expression'] + options = options or {} + + blank_if_zero = column_expression.blank_if_zero or col_data.get('blank_if_zero', False) + figure_type = column_expression.figure_type or col_data.get('figure_type', 'string') + + format_params = {} + if figure_type == 'monetary' and currency: + format_params['currency_id'] = currency.id + elif figure_type in ('float', 'percentage'): + format_params['digits'] = digits + + col_group_key = col_data.get('column_group_key') + + return { + 'auditable': col_value is not None + and column_expression.auditable + and not options['column_groups'][col_group_key]['forced_options'].get('compute_budget'), + 'blank_if_zero': blank_if_zero, + 'column_group_key': col_group_key, + 'currency': currency, + 'currency_symbol': (currency or self.env.company.currency_id).symbol if options.get('multi_currency') else None, + 'digits': digits, + 'expression_label': col_data.get('expression_label'), + 'figure_type': figure_type, + 'green_on_positive': column_expression.green_on_positive, + 'has_sublines': has_sublines, + 'is_zero': col_value is None or ( + isinstance(col_value, (int, float)) + and figure_type in NUMBER_FIGURE_TYPES + and self._is_value_zero(col_value, figure_type, format_params) + ), + 'no_format': col_value, + 'format_params': format_params, + 'report_line_id': report_line_id, + 'sortable': col_data.get('sortable', False), + 'comparison_mode': col_data.get('comparison_mode'), + } + + def _inject_account_names_for_consolidation(self, lines): + """ When grouping by account_code, in order to make the consolidation clearer, we add the account name in the context + of the current company next to the account_code. + """ + account_codes = [] + for line in lines: + markup = self._get_markup(line['id']) + if isinstance(markup, dict) and markup.get('groupby') == 'account_code': + account_codes.append(line['name']) + if not account_codes: + return + + account_code_to_account_name_dict = {account.code: account.name for account in self.env['account.account'].search([ + *self.env['account.account']._check_company_domain(self.env.company), + ('code', 'in', account_codes), + ])} + for line in lines: + markup = self._get_markup(line['id']) + if isinstance(markup, dict) and markup.get('groupby') == 'account_code': + account_code = line['name'] + account_name = account_code_to_account_name_dict.get(account_code) + if account_code and account_name: + line['name'] = f'{account_code} {account_name}' + + def _get_dynamic_lines(self, options, all_column_groups_expression_totals, warnings=None): + if self.custom_handler_model_id: + rslt = self.env[self.custom_handler_model_name]._dynamic_lines_generator(self, options, all_column_groups_expression_totals, warnings=warnings) + self._apply_integer_rounding_to_dynamic_lines(options, (line for _sequence, line in rslt)) + return rslt + return [] + + def _apply_integer_rounding_to_dynamic_lines(self, options, dynamic_lines): + if options.get('integer_rounding_enabled'): + for line in dynamic_lines: + for column_dict in line.get('columns', []): + if 'name' not in column_dict and column_dict.get('figure_type') == 'monetary' and column_dict.get('no_format'): + # If 'name' is already in it, no need to round the amount ; it is forced by the custom report already + column_dict['no_format'] = float_round( + column_dict['no_format'], + precision_digits=0, + rounding_method=options['integer_rounding'], + ) + + def _compute_expression_totals_for_each_column_group(self, expressions, options, + groupby_to_expand=None, forced_all_column_groups_expression_totals=None, col_groups_restrict=None, offset=0, limit=None, include_default_vals=False, warnings=None): + """ + Main computation function for static lines. + + :param expressions: The account.report.expression objects to evaluate. + + :param options: The options dict for this report, obtained from.get_options({}). + + :param groupby_to_expand: The full groupby string for the grouping we want to evaluate. If None, the aggregated value will be computed. + For example, when evaluating a group by partner_id, which further will be divided in sub-groups by account_id, + then id, the full groupby string will be: 'partner_id, account_id, id'. + + :param forced_all_column_groups_expression_totals: The expression totals already computed for this report, to which we will add the + new totals we compute for expressions (or update the existing ones if some + expressions are already in forced_all_column_groups_expression_totals). This is + a dict in the same format as returned by this function. + This parameter is for example used when adding manual values, where only + the expressions possibly depending on the new manual value + need to be updated, while we want to keep all the other values as-is. + + :param col_groups_restrict: List of column group keys of the groups to compute. Other column groups will be ignored, and will + not be added to the result of this function (they can still be provided beforehand through + forced_all_column_groups_expression_totals). If not provided, all colum groups will be computed. + + :param offset: The SQL offset to use when computing the result of these expressions. Used if self.load_more_limit is set, to handle + the load more feature. + + :param limit: The SQL limit to apply when computing these expressions' result. Used if self.load_more_limit is set, to handle + the load more feature. + + :return: dict(column_group_key, expressions_totals), where: + - column group key is string identifying each column group in a unique way ; as in options['column_groups'] + - expressions_totals is a dict in the format returned by _compute_expression_totals_for_single_column_group + """ + + def add_expressions_to_groups(expressions_to_add, grouped_formulas, force_date_scope=None): + """ Groups the expressions that should be computed together. + """ + for expression in expressions_to_add: + engine = expression.engine + + if engine not in grouped_formulas: + grouped_formulas[engine] = {} + + date_scope = force_date_scope or self._standardize_date_scope_for_date_range(expression.date_scope) + groupby_data = expression.report_line_id._parse_groupby(options, groupby_to_expand=groupby_to_expand) + + next_groupby = groupby_data['next_groupby'] if engine not in NO_NEXT_GROUPBY_ENGINES else None + grouping_key = (date_scope, groupby_data['current_groupby'], next_groupby) + + if grouping_key not in grouped_formulas[engine]: + grouped_formulas[engine][grouping_key] = {} + + formula = expression.formula + + if expression.engine == 'aggregation' and expression.formula == 'sum_children': + formula = ' + '.join( + f'_expression:{child_expr.id}' + for child_expr in expression.report_line_id.children_ids.expression_ids.filtered(lambda e: e.label == expression.label) + ) + + if formula not in grouped_formulas[engine][grouping_key]: + grouped_formulas[engine][grouping_key][formula] = expression + else: + grouped_formulas[engine][grouping_key][formula] |= expression + + if groupby_to_expand and any(not expression.report_line_id._get_groupby(options) for expression in expressions): + raise UserError(_("Trying to expand groupby results on lines without a groupby value.")) + + # Group formulas for batching (when possible) + grouped_formulas = {} + if expressions and not include_default_vals: + expressions = expressions.filtered(lambda x: not x.label.startswith('_default')) + for expression in expressions: + add_expressions_to_groups(expression, grouped_formulas) + + if expression.engine == 'aggregation' and expression.subformula == 'cross_report': + # Always expand aggregation expressions, in case their subexpressions are not in expressions parameter + # (this can happen in cross report, or when auditing an individual aggregation expression) + expanded_cross = expression._expand_aggregations() + forced_date_scope = self._standardize_date_scope_for_date_range(expression.date_scope) + add_expressions_to_groups(expanded_cross, grouped_formulas, force_date_scope=forced_date_scope) + + # Treat each formula batch for each column group + all_column_groups_expression_totals = {} + for group_key, group_options in self._split_options_per_column_group(options).items(): + if forced_all_column_groups_expression_totals: + forced_column_group_totals = forced_all_column_groups_expression_totals.get(group_key, None) + else: + forced_column_group_totals = None + + if not col_groups_restrict or group_key in col_groups_restrict: + current_group_expression_totals = self._compute_expression_totals_for_single_column_group( + group_options, + grouped_formulas, + forced_column_group_expression_totals=forced_column_group_totals, + offset=offset, + limit=limit, + warnings=warnings, + ) + else: + current_group_expression_totals = forced_column_group_totals + + all_column_groups_expression_totals[group_key] = current_group_expression_totals + + return all_column_groups_expression_totals + + def _standardize_date_scope_for_date_range(self, date_scope): + """ Depending on the fact the report accepts date ranges or not, different date scopes might mean the same thing. + This function is used so that, in those cases, only one of these date_scopes' values is used, to avoid useless creation + of multiple computation batches and improve the overall performance as much as possible. + """ + if not self.filter_date_range and date_scope == 'strict_range': + return 'from_beginning' + else: + return date_scope + + def _split_options_per_column_group(self, options): + """ Get a specific option dict per column group, each enforcing the comparison and horizontal grouping associated + with the column group. Each of these options dict will contain a new key 'owner_column_group', with the column group key of the + group it was generated for. + + :param options: The report options upon which the returned options be be based. + + :return: A dict(column_group_key, options_dict), where column_group_key is the string identifying each column group (the keys + of options['column_groups'], and options_dict the generated options for this group. + """ + options_per_group = {} + for group_key in options['column_groups']: + group_options = self._get_column_group_options(options, group_key) + options_per_group[group_key] = group_options + + return options_per_group + + def _get_column_group_options(self, options, group_key): + column_group = options['column_groups'][group_key] + return { + **options, + **column_group['forced_options'], + 'forced_domain': options.get('forced_domain', []) + column_group['forced_domain'] + column_group['forced_options'].get('forced_domain', []), + 'owner_column_group': group_key, + } + + def _compute_expression_totals_for_single_column_group(self, column_group_options, grouped_formulas, forced_column_group_expression_totals=None, offset=0, limit=None, warnings=None): + """ Evaluates expressions for a single column group. + + :param column_group_options: The options dict obtained from _split_options_per_column_group() for the column group to evaluate. + + :param grouped_formulas: A dict(engine, formula_dict), where: + - engine is a string identifying a report engine, in the same format as in account.report.expression's engine + field's technical labels. + - formula_dict is a dict in the same format as _compute_formula_batch's formulas_dict parameter, + containing only aggregation formulas. + + :param forced_column_group_expression_totals: The expression totals previously computed, in the same format as this function's result. + If provided, the result of this function will be an updated version of this parameter, + recomputing the expressions in grouped_fomulas. + + :param offset: The SQL offset to use when computing the result of these expressions. Used if self.load_more_limit is set, to handle + the load more feature. + + :param limit: The SQL limit to apply when computing these expressions' result. Used if self.load_more_limit is set, to handle + the load more feature. + + :return: A dict(expression, {'value': value, 'has_sublines': has_sublines}), where: + - expression is one of the account.report.expressions that got evaluated + + - value is the result of that evaluation. Two cases are possible: + - if we're evaluating a groupby: value will then be a in the form [(groupby_key, group_val)], where + - groupby_key is the key used in the SQL GROUP BY clause to generate this result + - group_val: The result computed by the engine for this group. Typically a float. + + - else: value will directly be the result computed for this expression + + - has_sublines: [optional key, will default to False if absent] + Whether or not this result corresponds to 1 or more subelements in the database (typically move lines). + This is used to know whether an unfoldable line has results to unfold in the UI. + """ + def inject_formula_results(formula_results, column_group_expression_totals, cross_report_expression_totals=None): + for (_key, expressions), result in formula_results.items(): + for expression in expressions: + subformula_error_format = _( + 'Invalid subformula in expression "%(expression)s" of line "%(line)s": %(subformula)s', + expression=expression.label, + line=expression.report_line_id.name, + subformula=expression.subformula, + ) + if expression.engine not in ('aggregation', 'external') and expression.subformula: + # aggregation subformulas behave differently (cross_report is markup ; if_below, if_above and force_between need evaluation) + # They are directly handled in aggregation engine + result_value_key = expression.subformula + else: + result_value_key = 'result' + + # The expression might be signed, so we can't just access the dict key, and directly evaluate it instead. + + if isinstance(result, list): + # Happens when expanding a groupby line, to compute its children. + # We then want to keep a list(grouping key, total) as the final result of each total + expression_value = [] + expression_has_sublines = False + for key, result_dict in result: + try: + expression_value.append((key, safe_eval(result_value_key, result_dict))) + except (ValueError, SyntaxError): + raise UserError(subformula_error_format) + expression_has_sublines = expression_has_sublines or result_dict.get('has_sublines') + else: + # For non-groupby lines, we directly set the total value for the line. + try: + expression_value = safe_eval(result_value_key, result) + except (ValueError, SyntaxError): + raise UserError(subformula_error_format) + expression_has_sublines = result.get('has_sublines') + + if column_group_options.get('integer_rounding_enabled'): + in_monetary_column = any( + col['expression_label'] == expression.label + for col in column_group_options['columns'] + if col['figure_type'] == 'monetary' + ) + + if (in_monetary_column and not expression.figure_type) or expression.figure_type == 'monetary': + method = column_group_options['integer_rounding'] + if isinstance(expression_value, list): + expression_value = [(key, float_round(value, precision_digits=0, rounding_method=method)) for key, value in expression_value] + else: + expression_value = float_round(expression_value, precision_digits=0, rounding_method=method) + + expression_result = { + 'value': expression_value, + 'has_sublines': expression_has_sublines, + } + + if expression.report_line_id.report_id == self: + if expression in column_group_expression_totals: + # This can happen because of a cross report aggregation referencing an expression of its own report, + # but forcing a different date_scope onto it. This case is not supported for now ; splitting the aggregation can be + # used as a workaround. + raise UserError(_( + "Expression labelled '%(label)s' of line '%(line)s' is being overwritten when computing the current report. " + "Make sure the cross-report aggregations of this report only reference terms belonging to other reports.", + label=expression.label, line=expression.report_line_id.name + )) + column_group_expression_totals[expression] = expression_result + elif cross_report_expression_totals is not None: + # Entering this else means this expression needs to be evaluated because of a cross_report aggregation + cross_report_expression_totals[expression] = expression_result + + # Batch each engine that can be + column_group_expression_totals = dict(forced_column_group_expression_totals) if forced_column_group_expression_totals else {} + cross_report_expr_totals_by_scope = {} + batchable_engines = [ + selection_val[0] + for selection_val in self.env['account.report.expression']._fields['engine'].selection + if selection_val[0] != 'aggregation' + ] + for engine in batchable_engines: + for (date_scope, current_groupby, next_groupby), formulas_dict in grouped_formulas.get(engine, {}).items(): + formula_results = self._compute_formula_batch(column_group_options, engine, date_scope, formulas_dict, current_groupby, next_groupby, + offset=offset, limit=limit, warnings=warnings) + inject_formula_results( + formula_results, + column_group_expression_totals, + cross_report_expression_totals=cross_report_expr_totals_by_scope.setdefault(date_scope, {}) + ) + + # Now that everything else has been computed, resolve aggregation expressions + # (they can't be treated as the other engines, as if we batch them per date_scope, we'll not be able + # to compute expressions depending on other expressions with a different date scope). + aggregation_formulas_dict = {} + for (date_scope, _current_groupby, _next_groupby), formulas_dict in grouped_formulas.get('aggregation', {}).items(): + for formula, expressions in formulas_dict.items(): + for expression in expressions: + # group_by are ignored by this engine, so we merge every grouped entry into a common dict + forced_date_scope = date_scope if expression.subformula == 'cross_report' or expression.report_line_id.report_id != self else None + aggreation_formula_dict_key = (formula, forced_date_scope) + aggregation_formulas_dict.setdefault(aggreation_formula_dict_key, self.env['account.report.expression']) + aggregation_formulas_dict[aggreation_formula_dict_key] |= expression + + if aggregation_formulas_dict: + aggregation_formula_results = self._compute_totals_no_batch_aggregation(column_group_options, aggregation_formulas_dict, column_group_expression_totals, cross_report_expr_totals_by_scope) + inject_formula_results(aggregation_formula_results, column_group_expression_totals) + + return column_group_expression_totals + + def _compute_totals_no_batch_aggregation(self, column_group_options, formulas_dict, other_current_report_expr_totals, other_cross_report_expr_totals_by_scope): + """ Computes expression totals for 'aggregation' engine, after all other engines have been evaluated. + + :param column_group_options: The options for the column group being evaluated, as obtained from _split_options_per_column_group. + + :param formulas_dict: A dict {(formula, forced_date_scope): expressions}, containing only aggregation formulas. + forced_date_scope will only be set in case of cross_report expressions. Else, it will be None + + :param other_current_report_expr_totals: The expressions_totals obtained after computing all non-aggregation engines, for the expressions + belonging directly to self (so, not the ones referenced by a cross_report aggreation). + This is a dict in the same format as _compute_expression_totals_for_single_column_group's result + (the only difference being it does not contain any aggregation expression yet). + + :param other_cross_report_expr_totals: A dict(forced_date_scope, expression_totals), where expression_totals is in the same form as + _compute_expression_totals_for_single_column_group's result. This parameter contains the results + of the non-aggregation expressions used by cross_report expressions ; they all belong to different + reports than self. The forced_date_scope corresponds to the original date_scope set on the + cross_report expression referencing them. The same expressions can be referenced multiple times + under different date scopes. + + :return : A dict((formula, expressions), result), where result is in the form {'result': numeric_value} + """ + def _resolve_subformula_on_dict(result, line_codes_expression_map, subformula): + split_subformula = subformula.split('.') + if len(split_subformula) > 1: + line_code, expression_label = split_subformula + return result[line_codes_expression_map[line_code][expression_label]] + + if subformula.startswith('_expression:'): + expression_id = int(subformula.split(':')[1]) + return result[expression_id] + + # Wrong subformula; the KeyError is caught in the function below + raise KeyError() + + def _check_is_float(to_test): + try: + float(to_test) + return True + except ValueError: + return False + + def add_expression_to_map(expression, expression_res, figure_types_cache, current_report_eval_dict, current_report_codes_map, other_reports_eval_dict, other_reports_codes_map, cross_report=False): + """ + Process an expression and its result, updating various dictionaries with relevant information. + Parameters: + - expression (object): The expression object to process. + - expression_res (dict): The result of the expression. + - figure_types_cache (dict): {report : {label: figure_type}}. + - current_report_eval_dict (dict): {expression_id: value}. + - current_report_codes_map (dict): {line_code: {expression_label: expression_id}}. + - other_reports_eval_dict (dict): {forced_date_scope: {expression_id: value}}. + - other_reports_codes_map (dict): {forced_date_scope: {line_code: {expression_label: expression_id}}}. + - cross_report: A boolean to know if we are processsing cross_report expression. + """ + + expr_report = expression.report_line_id.report_id + report_default_figure_types = figure_types_cache.setdefault(expr_report, {}) + expression_label = report_default_figure_types.get(expression.label, '_not_in_cache') + if expression_label == '_not_in_cache': + report_default_figure_types[expression.label] = expr_report.column_ids.filtered( + lambda x: x.expression_label == expression.label).figure_type + + default_figure_type = figure_types_cache[expr_report][expression.label] + figure_type = expression.figure_type or default_figure_type + value = expression_res['value'] + if figure_type == 'monetary' and value: + value = self.env.company.currency_id.round(value) + + if cross_report: + other_reports_eval_dict.setdefault(forced_date_scope, {})[expression.id] = value + else: + current_report_eval_dict[expression.id] = value + + current_report_eval_dict = {} # {expression_id: value} + other_reports_eval_dict = {} # {forced_date_scope: {expression_id: value}} + current_report_codes_map = {} # {line_code: {expression_label: expression_id}} + other_reports_codes_map = {} # {forced_date_scope: {line_code: {expression_label: expression_id}}} + + figure_types_cache = {} # {report : {label: figure_type}} + for expression, expression_res in other_current_report_expr_totals.items(): + add_expression_to_map(expression, expression_res, figure_types_cache, current_report_eval_dict, current_report_codes_map, other_reports_eval_dict, other_reports_codes_map) + if expression.report_line_id.code: + current_report_codes_map.setdefault(expression.report_line_id.code, {})[expression.label] = expression.id + + for forced_date_scope, scope_expr_totals in other_cross_report_expr_totals_by_scope.items(): + for expression, expression_res in scope_expr_totals.items(): + add_expression_to_map(expression, expression_res, figure_types_cache, current_report_eval_dict, current_report_codes_map, other_reports_eval_dict, other_reports_codes_map, True) + if expression.report_line_id.code: + other_reports_codes_map.setdefault(forced_date_scope, {}).setdefault(expression.report_line_id.code, {})[expression.label] = expression.id + + # Complete current_report_eval_dict with the formulas of uncomputed aggregation lines + aggregations_terms_to_evaluate = set() # Those terms are part of the formulas to evaluate; we know they will get a value eventually + for (formula, forced_date_scope), expressions in formulas_dict.items(): + for expression in expressions: + aggregations_terms_to_evaluate.add(f"_expression:{expression.id}") # In case it needs to be called by sum_children + + if expression.report_line_id.code: + if expression.report_line_id.report_id == self: + current_report_codes_map.setdefault(expression.report_line_id.code, {})[expression.label] = expression.id + else: + other_reports_codes_map.setdefault(forced_date_scope, {}).setdefault(expression.report_line_id.code, {})[expression.label] = expression.id + + aggregations_terms_to_evaluate.add(f"{expression.report_line_id.code}.{expression.label}") + + if not expression.subformula: + # Expressions with bounds cannot be replaced by their formula in formulas calling them (otherwize, bounds would be ignored). + # Same goes for cross_report, otherwise the forced_date_scope will be ignored, leading to an impossibility to get evaluate the expression. + if expression.report_line_id.report_id == self: + eval_dict = current_report_eval_dict + else: + eval_dict = other_reports_eval_dict.setdefault(forced_date_scope, {}) + + eval_dict[expression.id] = formula + + rslt = {} + to_treat = [(formula, formula, forced_date_scope) for (formula, forced_date_scope) in formulas_dict.keys()] # Formed like [(expanded formula, original unexpanded formula)] + term_separator_regex = r'(?\w+)\(" + r"(?P\w+)[.](?P\w+),[ ]*" + r"(?P.*)\)$", + expression.subformula + ) + if not other_expr_criterium_match: + raise UserError(_("Wrong format for if_other_expr_above/if_other_expr_below formula: %s", expression.subformula)) + + criterium_code = other_expr_criterium_match['line_code'] + criterium_label = other_expr_criterium_match['expr_label'] + criterium_expression_id = full_codes_map.get(criterium_code, {}).get(criterium_label) + criterium_val = full_eval_dict.get(criterium_expression_id) + + if not criterium_expression_id: + raise UserError(_("This subformula references an unknown expression: %s", expression.subformula)) + + if not isinstance(criterium_val, (float, int)): + # The criterium expression has not be evaluated yet. Postpone the evaluation of this formula, and skip this expression + # for now. We still try to evaluate other expressions using this formula if any; this means those expressions will + # be processed a second time later, giving the same result. This is a rare corner case, and not so costly anyway. + to_treat.append((formula, unexpanded_formula, forced_date_scope)) + continue + + bound_subformula = other_expr_criterium_match['criterium'].replace('other_expr_', '') # e.g. 'if_other_expr_above' => 'if_above' + bound_params = other_expr_criterium_match['bound_params'] + bound_value = self._aggregation_apply_bounds(column_group_options, f"{bound_subformula}({bound_params})", criterium_val) + expression_result = formula_result * int(bool(bound_value)) + + else: + expression_result = self._aggregation_apply_bounds(column_group_options, expression.subformula, formula_result) + + if column_group_options.get('integer_rounding_enabled'): + expression_result = float_round(expression_result, precision_digits=0, rounding_method=column_group_options['integer_rounding']) + + # Store result + standardized_expression_scope = self._standardize_date_scope_for_date_range(expression.date_scope) + if (forced_date_scope == standardized_expression_scope or not forced_date_scope) and expression.report_line_id.report_id == self: + # This condition ensures we don't return necessary subcomputations in the final result + rslt[(unexpanded_formula, expression)] = {'result': expression_result} + + # Handle recursive aggregations (explicit or through the sum_children shortcut). + # We need to make the result of our computation available to other aggregations, as they are still waiting in to_treat to be evaluated. + if expression.report_line_id.report_id == self: + current_report_eval_dict[expression.id] = expression_result + else: + other_reports_eval_dict.setdefault(forced_date_scope, {})[expression.id] = expression_result + + return rslt + + def _aggregation_apply_bounds(self, column_group_options, subformula, unbound_value): + """ Applies the bounds of the provided aggregation expression to an unbounded value that got computed for it and returns the result. + Bounds can be defined as subformulas of aggregation expressions, with the following possible values: + + - if_above(CUR(bound_value)): + => Result will be 0 if it's <= the provided bound value; else it'll be unbound_value + + - if_below(CUR(bound_value)): + => Result will be 0 if it's >= the provided bound value; else it'll be unbound_value + + - if_between(CUR(bound_value1), CUR(bound_value2)): + => Result will be unbound_value if it's strictly between the provided bounds. Else, it will + be brought back to the closest bound. + + - round(decimal_places): + => Result will be round(unbound_value, decimal_places) + + (where CUR is a currency code, and bound_value* are float amounts in CUR currency) + """ + if not subformula: + return unbound_value + + # So an expression can't have bounds and be cross_reports, for simplicity. + # To do that, just split the expression in two parts. + if subformula and subformula.startswith('round'): + precision_string = re.match(r"round\((?P\d+)\)", subformula)['precision'] + return round(unbound_value, int(precision_string)) + + if subformula not in {'cross_report', 'ignore_zero_division'}: + company_currency = self.env.company.currency_id + date_to = column_group_options['date']['date_to'] + + match = re.match( + r"(?P\w*)" + r"\((?P[A-Z]{3})\((?P[-]?\d+(\.\d+)?)\)" + r"(,(?P[A-Z]{3})\((?P[-]?\d+(\.\d+)?)\))?\)$", + subformula.replace(' ', '') + ) + group_values = match.groupdict() + + # Convert the provided bounds into company currency + currency_code_1 = group_values.get('currency_1') + currency_code_2 = group_values.get('currency_2') + currency_codes = [ + currency_code + for currency_code in [currency_code_1, currency_code_2] + if currency_code and currency_code != company_currency.name + ] + + if currency_codes: + currencies = self.env['res.currency'].with_context(active_test=False).search([('name', 'in', currency_codes)]) + else: + currencies = self.env['res.currency'] + + amount_1 = float(group_values['amount_1'] or 0) + amount_2 = float(group_values['amount_2'] or 0) + for currency in currencies: + if currency != company_currency: + if currency.name == currency_code_1: + amount_1 = currency._convert(amount_1, company_currency, self.env.company, date_to) + if amount_2 and currency.name == currency_code_2: + amount_2 = currency._convert(amount_2, company_currency, self.env.company, date_to) + + # Evaluate result + criterium = group_values['criterium'] + if criterium == 'if_below': + if company_currency.compare_amounts(unbound_value, amount_1) >= 0: + return 0 + elif criterium == 'if_above': + if company_currency.compare_amounts(unbound_value, amount_1) <= 0: + return 0 + elif criterium == 'if_between': + if company_currency.compare_amounts(unbound_value, amount_1) < 0 or company_currency.compare_amounts(unbound_value, amount_2) > 0: + return 0 + else: + raise UserError(_("Unknown bound criterium: %s", criterium)) + + return unbound_value + + def _compute_formula_batch(self, column_group_options, formula_engine, date_scope, formulas_dict, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + """ Evaluates a batch of formulas. + + :param column_group_options: The options for the column group being evaluated, as obtained from _split_options_per_column_group. + + :param formula_engine: A string identifying a report engine. Must be one of account.report.expression's engine field's technical labels. + + :param date_scope: The date_scope under which to evaluate the fomulas. Must be one of account.report.expression's date_scope field's + technical labels. + + :param formulas_dict: A dict in the dict(formula, expressions), where: + - formula: a formula to be evaluated with the engine referred to by parent dict key + - expressions: a recordset of all the expressions to evaluate using formula (possibly with distinct subformulas) + + :param current_groupby: The groupby to evaluate, or None if there isn't any. In case of multi-level groupby, only contains the element + that needs to be computed (so, if unfolding a line doing 'partner_id,account_id,id'; current_groupby will only be + 'partner_id'). Subsequent groupby will be in next_groupby. + + :param next_groupby: Full groupby string of the groups that will have to be evaluated next for these expressions, or None if there isn't any. + For example, in the case depicted in the example of current_groupby, next_groupby will be 'account_id,id'. + + :param offset: The SQL offset to use when computing the result of these expressions. + + :param limit: The SQL limit to apply when computing these expressions' result. + + :return: The result might have two different formats depending on the situation: + - if we're computing a groupby: {(formula, expressions): [(grouping_key, {'result': value, 'has_sublines': boolean}), ...], ...} + - if we're not: {(formula, expressions): {'result': value, 'has_sublines': boolean}, ...} + 'result' key is the default; different engines might use one or multiple other keys instead, depending of the subformulas they allow + (e.g. 'sum', 'sum_if_pos', ...) + """ + engine_function_name = f'_compute_formula_batch_with_engine_{formula_engine}' + return getattr(self, engine_function_name)( + column_group_options, date_scope, formulas_dict, current_groupby, next_groupby, + offset=offset, limit=limit, warnings=warnings, + ) + + def _compute_formula_batch_with_engine_tax_tags(self, options, date_scope, formulas_dict, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + """ Report engine. + + The formulas made for this report simply consist of a tag label. When an expression using this engine is created, it also creates two + account.account.tag objects, namely -tag and +tag, where tag is the chosen formula. The balance of the expressions using this engine is + computed by gathering all the move lines using their tags, and applying the sign of their tag to their balance, together with a -1 factor + if the tax_tag_invert field of the move line is True. + + This engine does not support any subformula. + """ + self._check_groupby_fields((next_groupby.split(',') if next_groupby else []) + ([current_groupby] if current_groupby else [])) + all_expressions = self.env['account.report.expression'] + for expressions in formulas_dict.values(): + all_expressions |= expressions + tags = all_expressions._get_matching_tags() + + query = self._get_report_query(options, date_scope) + groupby_sql = self.env['account.move.line']._field_to_sql('account_move_line', current_groupby, query) if current_groupby else None + tail_query = self._get_engine_query_tail(offset, limit) + lang = get_lang(self.env, self.env.user.lang).code + acc_tag_name = self.with_context(lang='en_US').env['account.account.tag']._field_to_sql('acc_tag', 'name') + sql = SQL( + """ + SELECT + SUBSTRING(%(acc_tag_name)s, 2, LENGTH(%(acc_tag_name)s) - 1) AS formula, + SUM(%(balance_select)s + * CASE WHEN acc_tag.tax_negate THEN -1 ELSE 1 END + * CASE WHEN account_move_line.tax_tag_invert THEN -1 ELSE 1 END + ) AS balance, + COUNT(account_move_line.id) AS aml_count + %(select_groupby_sql)s + + FROM %(table_references)s + + JOIN account_account_tag_account_move_line_rel aml_tag + ON aml_tag.account_move_line_id = account_move_line.id + JOIN account_account_tag acc_tag + ON aml_tag.account_account_tag_id = acc_tag.id + AND acc_tag.id IN %(tag_ids)s + %(currency_table_join)s + + WHERE %(search_condition)s + + GROUP BY %(groupby_clause)s + + ORDER BY %(groupby_clause)s + + %(tail_query)s + """, + acc_tag_name=acc_tag_name, + select_groupby_sql=SQL(', %s AS grouping_key', groupby_sql) if groupby_sql else SQL(), + table_references=query.from_clause, + tag_ids=tuple(tags.ids), + balance_select=self._currency_table_apply_rate(SQL("account_move_line.balance")), + currency_table_join=self._currency_table_aml_join(options), + search_condition=query.where_clause, + groupby_clause=SQL( + "SUBSTRING(%(acc_tag_name)s, 2, LENGTH(%(acc_tag_name)s) - 1)%(groupby_sql)s", + acc_tag_name=acc_tag_name, + groupby_sql=SQL(', %s', groupby_sql) if groupby_sql else SQL(), + ), + tail_query=tail_query, + ) + + self._cr.execute(sql) + + rslt = {formula_expr: [] if current_groupby else {'result': 0, 'has_sublines': False} for formula_expr in formulas_dict.items()} + for query_res in self._cr.dictfetchall(): + + formula = query_res['formula'] + rslt_dict = {'result': query_res['balance'], 'has_sublines': query_res['aml_count'] > 0} + if current_groupby: + rslt[(formula, formulas_dict[formula])].append((query_res['grouping_key'], rslt_dict)) + else: + rslt[(formula, formulas_dict[formula])] = rslt_dict + + return rslt + + def _compute_formula_batch_with_engine_domain(self, options, date_scope, formulas_dict, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + """ Report engine. + + Formulas made for this engine consist of a domain on account.move.line. Only those move lines will be used to compute the result. + + This engine supports a few subformulas, each returning a slighlty different result: + - sum: the result will be sum of the matched move lines' balances + + - sum_if_pos: the result will be the same as sum only if it's positive; else, it will be 0 + + - sum_if_neg: the result will be the same as sum only if it's negative; else, it will be 0 + + - count_rows: the result will be the number of sublines this expression has. If the parent report line has no groupby, + then it will be the number of matching amls. If there is a groupby, it will be the number of distinct grouping + keys at the first level of this groupby (so, if groupby is 'partner_id, account_id', the number of partners). + """ + def _format_result_depending_on_groupby(formula_rslt): + if not current_groupby: + if formula_rslt: + # There should be only one element in the list; we only return its totals (a dict) ; so that a list is only returned in case + # of a groupby being unfolded. + return formula_rslt[0][1] + else: + # No result at all + return { + 'sum': 0, + 'sum_if_pos': 0, + 'sum_if_neg': 0, + 'count_rows': 0, + 'has_sublines': False, + } + return formula_rslt + + self._check_groupby_fields((next_groupby.split(',') if next_groupby else []) + ([current_groupby] if current_groupby else [])) + + rslt = {} + + for formula, expressions in formulas_dict.items(): + try: + line_domain = literal_eval(formula) + except (ValueError, SyntaxError): + raise UserError(_( + 'Invalid domain formula in expression "%(expression)s" of line "%(line)s": %(formula)s', + expression=expressions.label, + line=expressions.report_line_id.name, + formula=formula, + )) + query = self._get_report_query(options, date_scope, domain=line_domain) + + groupby_sql = self.env['account.move.line']._field_to_sql('account_move_line', current_groupby, query) if current_groupby else None + select_count_field = self.env['account.move.line']._field_to_sql('account_move_line', next_groupby.split(',')[0] if next_groupby else 'id', query) + + tail_query = self._get_engine_query_tail(offset, limit) + query = SQL( + """ + SELECT + COALESCE(SUM(%(balance_select)s), 0.0) AS sum, + COUNT(DISTINCT %(select_count_field)s) AS count_rows + %(select_groupby_sql)s + FROM %(table_references)s + %(currency_table_join)s + WHERE %(search_condition)s + %(group_by_groupby_sql)s + %(order_by_sql)s + %(tail_query)s + """, + select_count_field=select_count_field, + select_groupby_sql=SQL(', %s AS grouping_key', groupby_sql) if groupby_sql else SQL(), + table_references=query.from_clause, + balance_select=self._currency_table_apply_rate(SQL("account_move_line.balance")), + currency_table_join=self._currency_table_aml_join(options), + search_condition=query.where_clause, + group_by_groupby_sql=SQL('GROUP BY %s', groupby_sql) if groupby_sql else SQL(), + order_by_sql=SQL(' ORDER BY %s', groupby_sql) if groupby_sql else SQL(), + tail_query=tail_query, + ) + + # Fetch the results. + formula_rslt = [] + self._cr.execute(query) + all_query_res = self._cr.dictfetchall() + + total_sum = 0 + for query_res in all_query_res: + res_sum = query_res['sum'] + total_sum += res_sum + totals = { + 'sum': res_sum, + 'sum_if_pos': 0, + 'sum_if_neg': 0, + 'count_rows': query_res['count_rows'], + 'has_sublines': query_res['count_rows'] > 0, + } + formula_rslt.append((query_res.get('grouping_key', None), totals)) + + # Handle sum_if_pos, -sum_if_pos, sum_if_neg and -sum_if_neg + expressions_by_sign_policy = defaultdict(lambda: self.env['account.report.expression']) + for expression in expressions: + subformula_without_sign = expression.subformula.replace('-', '').strip() + if subformula_without_sign in ('sum_if_pos', 'sum_if_neg'): + expressions_by_sign_policy[subformula_without_sign] += expression + else: + expressions_by_sign_policy['no_sign_check'] += expression + + # Then we have to check the total of the line and only give results if its sign matches the desired policy. + # This is important for groupby managements, for which we can't just check the sign query_res by query_res + if expressions_by_sign_policy['sum_if_pos'] or expressions_by_sign_policy['sum_if_neg']: + sign_policy_with_value = 'sum_if_pos' if self.env.company.currency_id.compare_amounts(total_sum, 0.0) >= 0 else 'sum_if_neg' + # >= instead of > is intended; usability decision: 0 is considered positive + + formula_rslt_with_sign = [(grouping_key, {**totals, sign_policy_with_value: totals['sum']}) for grouping_key, totals in formula_rslt] + + for sign_policy in ('sum_if_pos', 'sum_if_neg'): + policy_expressions = expressions_by_sign_policy[sign_policy] + + if policy_expressions: + if sign_policy == sign_policy_with_value: + rslt[(formula, policy_expressions)] = _format_result_depending_on_groupby(formula_rslt_with_sign) + else: + rslt[(formula, policy_expressions)] = _format_result_depending_on_groupby([]) + + if expressions_by_sign_policy['no_sign_check']: + rslt[(formula, expressions_by_sign_policy['no_sign_check'])] = _format_result_depending_on_groupby(formula_rslt) + + return rslt + + def _compute_formula_batch_with_engine_account_codes(self, options, date_scope, formulas_dict, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + r""" Report engine. + + Formulas made for this engine target account prefixes. Each of the prefix used in the formula will be evaluated as the sum of the move + lines made on the accounts matching it. Those prefixes can be used together with arithmetic operations to perform them on the obtained + results. + Example: '123 - 456' will substract the balance of all account starting with 456 from the one of all accounts starting with 123. + + It is also possible to exclude some subprefixes, with \ operator. + Example: '123\(1234)' will match prefixes all accounts starting with '123', except the ones starting with '1234' + + To only match the balance of an account is it's positive (debit) or negative (credit), the letter D or C can be put just next to the prefix: + Example '123D': will give the total balance of accounts starting with '123' if it's positive, else it will be evaluated as 0. + + Multiple subprefixes can be excluded if needed. + Example: '123\(1234,1236) + + All these syntaxes can be mixed together. + Example: '123D\(1235) + 56 - 416C' + + Note: if C or D character needs to be part of the prefix, it is possible to differentiate them of debit and credit match characters + by using an empty prefix exclusion. + Example 1: '123D\' will take the total balance of accounts starting with '123D' + Example 2: '123D\C' will return the balance of accounts starting with '123D' if it's negative, 0 otherwise. + """ + self._check_groupby_fields((next_groupby.split(',') if next_groupby else []) + ([current_groupby] if current_groupby else [])) + + # Gather the account code prefixes to compute the total from + prefix_details_by_formula = {} # in the form {formula: [(1, prefix1), (-1, prefix2)]} + prefixes_to_compute = set() + for formula in formulas_dict: + prefix_details_by_formula[formula] = [] + for token in ACCOUNT_CODES_ENGINE_SPLIT_REGEX.split(formula.replace(' ', '')): + if token: + token_match = ACCOUNT_CODES_ENGINE_TERM_REGEX.match(token) + + if not token_match: + raise UserError(_("Invalid token '%(token)s' in account_codes formula '%(formula)s'", token=token, formula=formula)) + + parsed_token = token_match.groupdict() + + if not parsed_token: + raise UserError(_("Could not parse account_code formula from token '%s'", token)) + + multiplicator = -1 if parsed_token['sign'] == '-' else 1 + excluded_prefixes_match = token_match['excluded_prefixes'] + excluded_prefixes = excluded_prefixes_match.split(',') if excluded_prefixes_match else [] + prefix = token_match['prefix'] + + # We group using both prefix and excluded_prefixes as keys, for the case where two expressions would + # include the same prefix, but exlcude different prefixes (example 104\(1041) and 104\(1042)) + prefix_key = (prefix, *excluded_prefixes) + prefix_details_by_formula[formula].append((multiplicator, prefix_key, token_match['balance_character'])) + prefixes_to_compute.add((prefix, tuple(excluded_prefixes))) + + # Create the subquery for the WITH linking our prefixes with account.account entries + all_prefixes_queries: list[SQL] = [] + prefilter = self.env['account.account']._check_company_domain(self.get_report_company_ids(options)) + for prefix, excluded_prefixes in prefixes_to_compute: + account_domain = [ + *prefilter, + ] + + tag_match = ACCOUNT_CODES_ENGINE_TAG_ID_PREFIX_REGEX.match(prefix) + + if tag_match: + if tag_match['ref']: + tag_id = self.env['ir.model.data']._xmlid_to_res_id(tag_match['ref']) + else: + tag_id = int(tag_match['id']) + + account_domain.append(('tag_ids', 'in', [tag_id])) + else: + account_domain.append(('code', '=like', f'{prefix}%')) + + excluded_prefixes_domains = [] + + for excluded_prefix in excluded_prefixes: + excluded_prefixes_domains.append([('code', '=like', f'{excluded_prefix}%')]) + + if excluded_prefixes_domains: + account_domain.append('!') + account_domain += osv.expression.OR(excluded_prefixes_domains) + + prefix_query = self.env['account.account']._where_calc(account_domain) + all_prefixes_queries.append(prefix_query.select( + SQL("%s AS prefix", [prefix, *excluded_prefixes]), + SQL("account_account.id AS account_id"), + )) + + # Build a map to associate each account with the prefixes it matches + accounts_prefix_map = defaultdict(list) + for prefix, account_id in self.env.execute_query(SQL(' UNION ALL ').join(all_prefixes_queries)): + accounts_prefix_map[account_id].append(tuple(prefix)) + + # Run main query + query = self._get_report_query(options, date_scope) + + current_groupby_aml_sql = self.env['account.move.line']._field_to_sql('account_move_line', current_groupby, query) if current_groupby else None + tail_query = self._get_engine_query_tail(offset, limit) + if current_groupby_aml_sql and tail_query: + tail_query_additional_groupby_where_sql = SQL( + """ + AND %(current_groupby_aml_sql)s IN ( + SELECT DISTINCT %(current_groupby_aml_sql)s + FROM account_move_line + WHERE %(search_condition)s + ORDER BY %(current_groupby_aml_sql)s + %(tail_query)s + ) + """, + current_groupby_aml_sql=current_groupby_aml_sql, + search_condition=query.where_clause, + tail_query=tail_query, + ) + else: + tail_query_additional_groupby_where_sql = SQL() + + extra_groupby_sql = SQL(", %s", current_groupby_aml_sql) if current_groupby_aml_sql else SQL() + extra_select_sql = SQL(", %s AS grouping_key", current_groupby_aml_sql) if current_groupby_aml_sql else SQL() + + query = SQL( + """ + SELECT + account_move_line.account_id AS account_id, + SUM(%(balance_select)s) AS sum, + COUNT(account_move_line.id) AS aml_count + %(extra_select_sql)s + FROM %(table_references)s + %(currency_table_join)s + WHERE %(search_condition)s + %(tail_query_additional_groupby_where_sql)s + GROUP BY account_move_line.account_id%(extra_groupby_sql)s + %(order_by_sql)s + %(tail_query)s + """, + extra_select_sql=extra_select_sql, + table_references=query.from_clause, + balance_select=self._currency_table_apply_rate(SQL("account_move_line.balance")), + currency_table_join=self._currency_table_aml_join(options), + search_condition=query.where_clause, + extra_groupby_sql=extra_groupby_sql, + tail_query_additional_groupby_where_sql=tail_query_additional_groupby_where_sql, + order_by_sql=SQL('ORDER BY %s', current_groupby_aml_sql) if current_groupby_aml_sql else SQL(), + tail_query=tail_query if not tail_query_additional_groupby_where_sql else SQL(), + ) + self._cr.execute(query) + + # Parse result + rslt = {} + + res_by_prefix_account_id = {} + for query_res in self._cr.dictfetchall(): + # Done this way so that we can run similar code for groupby and non-groupby + grouping_key = query_res['grouping_key'] if current_groupby else None + account_id = query_res['account_id'] + for prefix_key in accounts_prefix_map[account_id]: + res_by_prefix_account_id.setdefault(prefix_key, {})\ + .setdefault(account_id, [])\ + .append((grouping_key, {'result': query_res['sum'], 'has_sublines': query_res['aml_count'] > 0})) + + for formula, prefix_details in prefix_details_by_formula.items(): + rslt_key = (formula, formulas_dict[formula]) + rslt_destination = rslt.setdefault(rslt_key, [] if current_groupby else {'result': 0, 'has_sublines': False}) + rslt_groups_by_grouping_keys = {} + for multiplicator, prefix_key, balance_character in prefix_details: + res_by_account_id = res_by_prefix_account_id.get(prefix_key, {}) + + for account_results in res_by_account_id.values(): + account_total_value = sum(group_val['result'] for (group_key, group_val) in account_results) + comparator = self.env.company.currency_id.compare_amounts(account_total_value, 0.0) + + # Manage balance_character. + if not balance_character or (balance_character == 'D' and comparator >= 0) or (balance_character == 'C' and comparator < 0): + + for group_key, group_val in account_results: + rslt_group = { + **group_val, + 'result': multiplicator * group_val['result'], + } + if not current_groupby: + rslt_destination['result'] += rslt_group['result'] + rslt_destination['has_sublines'] = rslt_destination['has_sublines'] or rslt_group['has_sublines'] + elif group_key in rslt_groups_by_grouping_keys: + # Will happen if the same grouping key is used on move lines with different accounts. + # This comes from the GROUPBY in the SQL query, which uses both grouping key and account. + # When this happens, we want to aggregate the results of each grouping key, to avoid duplicates in the end result. + already_treated_rslt_group = rslt_groups_by_grouping_keys[group_key] + already_treated_rslt_group['has_sublines'] = already_treated_rslt_group['has_sublines'] or rslt_group['has_sublines'] + already_treated_rslt_group['result'] += rslt_group['result'] + else: + rslt_groups_by_grouping_keys[group_key] = rslt_group + rslt_destination.append((group_key, rslt_group)) + + return rslt + + def _compute_formula_batch_with_engine_external(self, options, date_scope, formulas_dict, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + """ Report engine. + + This engine computes its result from the account.report.external.value objects that are linked to the expression. + + Two different formulas are possible: + - sum: if the result must be the sum of all the external values in the period. + - most_recent: it the result must be the value of the latest external value in the period, which can be a number or a text + + No subformula is allowed for this engine. + """ + self._check_groupby_fields((next_groupby.split(',') if next_groupby else []) + ([current_groupby] if current_groupby else [])) + + if current_groupby or next_groupby or offset or limit: + raise UserError(_("'external' engine does not support groupby, limit nor offset.")) + + # Date clause + date_from, date_to = self._get_date_bounds_info(options, date_scope) + external_value_domain = [('date', '<=', date_to)] + if date_from: + external_value_domain.append(('date', '>=', date_from)) + + # Company clause + external_value_domain.append(('company_id', 'in', self.get_report_company_ids(options))) + + # Fiscal Position clause + fpos_option = options['fiscal_position'] + if fpos_option == 'domestic': + external_value_domain.append(('foreign_vat_fiscal_position_id', '=', False)) + elif fpos_option != 'all': + # Then it's a fiscal position id + external_value_domain.append(('foreign_vat_fiscal_position_id', '=', int(fpos_option))) + + # Do the computation + where_clause = self.env['account.report.external.value']._where_calc(external_value_domain).where_clause + + # We have to execute two separate queries, one for text values and one for numeric values + num_queries = [] + string_queries = [] + monetary_queries = [] + for formula, expressions in formulas_dict.items(): + query_end = SQL() + if formula == 'most_recent': + query_end = SQL( + """ + GROUP BY date + ORDER BY date DESC + LIMIT 1 + """, + ) + string_query = """ + SELECT %(expression_id)s, text_value + FROM account_report_external_value + WHERE %(where_clause)s AND target_report_expression_id = %(expression_id)s + """ + monetary_query = """ + SELECT + %(expression_id)s, + COALESCE(SUM(COALESCE(%(balance_select)s, 0)), 0) + FROM account_report_external_value + %(currency_table_join)s + WHERE %(where_clause)s AND target_report_expression_id = %(expression_id)s + %(query_end)s + """ + num_query = """ + SELECT %(expression_id)s, SUM(COALESCE(value, 0)) + FROM account_report_external_value + WHERE %(where_clause)s AND target_report_expression_id = %(expression_id)s + %(query_end)s + """ + + for expression in expressions: + if expression.figure_type == "string": + string_queries.append(SQL( + string_query, + expression_id=expression.id, + where_clause=where_clause, + )) + elif expression.figure_type == "monetary": + monetary_queries.append(SQL( + monetary_query, + expression_id=expression.id, + balance_select=self._currency_table_apply_rate(SQL("CAST(value AS numeric)")), + currency_table_join=SQL( + """ + JOIN %(currency_table)s + ON account_currency_table.company_id = account_report_external_value.company_id + AND account_currency_table.rate_type = 'current' + """, + currency_table=self._get_currency_table(options), + ), + where_clause=where_clause, + query_end=query_end, + )) + else: + num_queries.append(SQL( + num_query, + expression_id=expression.id, + where_clause=where_clause, + query_end=query_end, + )) + + # Convert to dict to have expression ids as keys + query_results_dict = {} + for query_list in (num_queries, string_queries, monetary_queries): + if query_list: + query_results = self.env.execute_query(SQL(' UNION ALL ').join(SQL("(%s)", query) for query in query_list)) + query_results_dict.update(dict(query_results)) + + # Build result dict + rslt = {} + for formula, expressions in formulas_dict.items(): + for expression in expressions: + expression_value = query_results_dict.get(expression.id) + # If expression_value is None, we have no previous value for this expression (set default at 0.0) + expression_value = expression_value or ('' if expression.figure_type == 'string' else 0.0) + rslt[(formula, expression)] = {'result': expression_value, 'has_sublines': False} + + return rslt + + def _compute_formula_batch_with_engine_custom(self, options, date_scope, formulas_dict, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + self._check_groupby_fields((next_groupby.split(',') if next_groupby else []) + ([current_groupby] if current_groupby else [])) + + rslt = {} + for formula, expressions in formulas_dict.items(): + custom_engine_function = self._get_custom_report_function(formula, 'custom_engine') + rslt[(formula, expressions)] = custom_engine_function( + expressions, options, date_scope, current_groupby, next_groupby, offset=offset, limit=limit, warnings=warnings) + return rslt + + def _get_engine_query_tail(self, offset, limit) -> SQL: + """ Helper to generate the OFFSET, LIMIT and ORDER conditions of formula engines' queries. + """ + query_tail = SQL() + + if offset: + query_tail = SQL("%s OFFSET %s", query_tail, offset) + + if limit: + query_tail = SQL("%s LIMIT %s", query_tail, limit) + + return query_tail + + def _generate_carryover_external_values(self, options): + """ Generates the account.report.external.value objects corresponding to this report's carryover under the provided options. + + In case of multicompany setup, we need to split the carryover per company, for ease of audit, and so that the carryover isn't broken when + a company leaves a tax unit. + + We first generate the carryover for the wholy-aggregated report, so that we can see what final result we want. + Indeed due to force_between, if_above and if_below conditions, each carryover might be different from the sum of the individidual companies' + carryover values. To handle this case, we generate each company's carryover values separately, then do a carryover adjustment on the + main company (main for tax units, first one selected else) in order to bring their total to the result we computed for the whole unit. + """ + self.ensure_one() + + if len(options['column_groups']) > 1: + # The options must be forged in order to generate carryover values. Entering this conditions means this hasn't been done in the right way. + raise UserError(_("Carryover can only be generated for a single column group.")) + + # Get the expressions to evaluate from the report + carryover_expressions = self.line_ids.expression_ids.filtered(lambda x: x.label.startswith('_carryover_')) + expressions_to_evaluate = carryover_expressions._expand_aggregations() + + # Expression totals for all selected companies + expression_totals_per_col_group = self._compute_expression_totals_for_each_column_group(expressions_to_evaluate, options) + expression_totals = expression_totals_per_col_group[list(options['column_groups'].keys())[0]] + carryover_values = {expression: expression_totals[expression]['value'] for expression in carryover_expressions} + + if len(options['companies']) == 1: + company = self.env['res.company'].browse(self.get_report_company_ids(options)) + self._create_carryover_for_company(options, company, {expr: result for expr, result in carryover_values.items()}) + else: + multi_company_carryover_values_sum = defaultdict(lambda: 0) + + column_group_key = next(col_group_key for col_group_key in options['column_groups']) + for company_opt in options['companies']: + company = self.env['res.company'].browse(company_opt['id']) + company_options = {**options, 'companies': [{'id': company.id, 'name': company.name}]} + company_expressions_totals = self._compute_expression_totals_for_each_column_group(expressions_to_evaluate, company_options) + company_carryover_values = {expression: company_expressions_totals[column_group_key][expression]['value'] for expression in carryover_expressions} + self._create_carryover_for_company(options, company, company_carryover_values) + + for carryover_expr, carryover_val in company_carryover_values.items(): + multi_company_carryover_values_sum[carryover_expr] += carryover_val + + # Adjust multicompany amounts on main company + main_company = self._get_sender_company_for_export(options) + for expr in carryover_expressions: + difference = carryover_values[expr] - multi_company_carryover_values_sum[expr] + self._create_carryover_for_company(options, main_company, {expr: difference}, label=_("Carryover adjustment for tax unit")) + + @api.model + def _generate_default_external_values(self, date_from, date_to, is_tax_report=False): + """ Generates the account.report.external.value objects for the given dates. + If is_tax_report, the values are only created for tax reports, else for all other reports. + """ + options_dict = {} + default_expr_by_report = defaultdict(list) + tax_report = self.env.ref('account.generic_tax_report') + company = self.env.company + previous_options = { + 'date': { + 'date_from': date_from, + 'date_to': date_to, + } + } + + # Get all the default expressions from all reports + default_expressions = self.env['account.report.expression'].search([('label', '=like', '_default_%')]) + # Options depend on the report, also we need to filter out tax report/other reports depending on is_tax_report + # Hence we need to group the default expressions by report + for expr in default_expressions: + report = expr.report_line_id.report_id + if is_tax_report == (tax_report in (report + report.root_report_id + report.section_main_report_ids.root_report_id)): + if report not in options_dict: + options = report.with_context(allowed_company_ids=[company.id]).get_options(previous_options) + options_dict[report] = options + + if report._is_available_for(options_dict[report]): + default_expr_by_report[report].append(expr) + + external_values_create_vals = [] + for report, report_default_expressions in default_expr_by_report.items(): + options = options_dict[report] + fpos_options = {options['fiscal_position']} + + for available_fp in options['available_vat_fiscal_positions']: + fpos_options.add(available_fp['id']) + + # remove 'all' from fiscal positions if we have several of them - all will then include the sum of other fps + # but if there aren't any other fps, we need to keep 'all' + if len(fpos_options) > 1 and 'all' in fpos_options: + fpos_options.remove('all') + + # The default values should be created for every fiscal position available + for fiscal_pos in fpos_options: + fiscal_pos_id = int(fiscal_pos) if fiscal_pos not in {'domestic', 'all'} else None + fp_options = {**options, 'fiscal_position': fiscal_pos} + + expressions_to_compute = {} + for default_expression in report_default_expressions: + # The default expression needs to have the same label as the target external expression, e.g. '_default_balance' + target_label = default_expression.label[len('_default_'):] + target_external_expression = default_expression.report_line_id.expression_ids.filtered(lambda x: x.label == target_label) + # If the value has been created before/modified manually, we shouldn't create anything + # and we won't recompute expression totals for them + external_value = self.env['account.report.external.value'].search([ + ('company_id', '=', company.id), + ('date', '>=', date_from), + ('date', '<=', date_to), + ('foreign_vat_fiscal_position_id', '=', fiscal_pos_id), + ('target_report_expression_id', '=', target_external_expression.id), + ]) + + if not external_value: + expressions_to_compute[default_expression] = target_external_expression.id + + # Evaluate the expressions for the report to fetch the value of the default expression + # These have to be computed for each fiscal position + expression_totals_per_col_group = report.with_company(company)\ + ._compute_expression_totals_for_each_column_group(expressions_to_compute, fp_options, include_default_vals=True) + expression_totals = expression_totals_per_col_group[list(fp_options['column_groups'].keys())[0]] + + for expression, target_expression in expressions_to_compute.items(): + external_values_create_vals.append({ + 'name': _("Manual value"), + 'value': expression_totals[expression]['value'], + 'date': date_to, + 'target_report_expression_id': target_expression, + 'foreign_vat_fiscal_position_id': fiscal_pos_id, + 'company_id': company.id, + }) + + self.env['account.report.external.value'].create(external_values_create_vals) + + @api.model + def _get_sender_company_for_export(self, options): + """ Return the sender company when generating an export file from this report. + :return: self.env.company if not using a tax unit, else the main company of that unit + """ + if options.get('tax_unit', 'company_only') != 'company_only': + tax_unit = self.env['account.tax.unit'].browse(options['tax_unit']) + return tax_unit.main_company_id + + report_companies = self.env['res.company'].browse(self.get_report_company_ids(options)) + options_main_company = report_companies[0] + + if options.get('tax_unit') is not None and options_main_company._get_branches_with_same_vat() == report_companies: + # The line with the smallest number of parents in the VAT sub-hierarchy is assumed to be the root + return report_companies.sorted(lambda x: len(x.parent_ids))[0] + elif options_main_company._all_branches_selected(): + return options_main_company.root_id + + return options_main_company + + def _create_carryover_for_company(self, options, company, carryover_per_expression, label=None): + date_from = options['date']['date_from'] + date_to = options['date']['date_to'] + fiscal_position_opt = options['fiscal_position'] + + if carryover_per_expression and fiscal_position_opt == 'all': + # Not supported, as it wouldn't make sense, and would make the code way more complicated (because of if_below/if_above/force_between, + # just in the same way as it is explained below for multi company) + raise UserError(_("Cannot generate carryover values for all fiscal positions at once!")) + + external_values_create_vals = [] + for expression, carryover_value in carryover_per_expression.items(): + if not company.currency_id.is_zero(carryover_value): + target_expression = expression._get_carryover_target_expression(options) + external_values_create_vals.append({ + 'name': label or _("Carryover from %(date_from)s to %(date_to)s", date_from=format_date(self.env, date_from), date_to=format_date(self.env, date_to)), + 'value': carryover_value, + 'date': date_to, + 'target_report_expression_id': target_expression.id, + 'foreign_vat_fiscal_position_id': fiscal_position_opt if isinstance(fiscal_position_opt, int) else None, + 'carryover_origin_expression_label': expression.label, + 'carryover_origin_report_line_id': expression.report_line_id.id, + 'company_id': company.id, + }) + + self.env['account.report.external.value'].create(external_values_create_vals) + + def get_default_report_filename(self, options, extension): + """The default to be used for the file when downloading pdf,xlsx,...""" + self.ensure_one() + + sections_source_id = options['sections_source_id'] + if sections_source_id != self.id: + sections_source = self.env['account.report'].browse(sections_source_id) + else: + sections_source = self + + return f"{sections_source.name.lower().replace(' ', '_')}.{extension}" + + def execute_action(self, options, params=None): + action_id = int(params.get('actionId')) + action = self.env['ir.actions.actions'].sudo().browse([action_id]) + action_type = action.type + action = self.env[action.type].sudo().browse([action_id]) + action_read = clean_action(action.read()[0], env=action.env) + + if action_type == 'ir.actions.client': + # Check if we are opening another report. If so, generate options for it from the current options. + if action.tag == 'account_report': + target_report = self.env['account.report'].browse(ast.literal_eval(action_read['context'])['report_id']) + new_options = target_report.get_options(previous_options=options) + action_read.update({'params': {'options': new_options, 'ignore_session': True}}) + + if params.get('id'): + # Add the id of the calling object in the action's context + if isinstance(params['id'], int): + # id of the report line might directly be the id of the model we want. + model_id = params['id'] + else: + # It can also be a generic account.report id, as defined by _get_generic_line_id + model_id = self._get_model_info_from_id(params['id'])[1] + + context = action_read.get('context') and literal_eval(action_read['context']) or {} + context.setdefault('active_id', model_id) + action_read['context'] = context + + return action_read + + def action_audit_cell(self, options, params): + report_line = self.env['account.report.line'].browse(params['report_line_id']) + expression_label = params['expression_label'] + expression = report_line.expression_ids.filtered(lambda x: x.label == expression_label) + column_group_options = self._get_column_group_options(options, params['column_group_key']) + + # Audit of external values + if expression.engine == 'external': + date_from, date_to = self._get_date_bounds_info(column_group_options, expression.date_scope) + external_values_domain = [('target_report_expression_id', '=', expression.id), ('date', '<=', date_to)] + if date_from: + external_values_domain.append(('date', '>=', date_from)) + + if expression.formula == 'most_recent': + query = self.env['account.report.external.value']._where_calc(external_values_domain) + rows = self.env.execute_query(SQL(""" + SELECT ARRAY_AGG(id) + FROM %s + WHERE %s + GROUP BY date + ORDER BY date DESC + LIMIT 1 + """, query.from_clause, query.where_clause or SQL("TRUE"))) + if rows: + external_values_domain = [('id', 'in', rows[0][0])] + + return { + 'name': _("Manual values"), + 'type': 'ir.actions.act_window', + 'res_model': 'account.report.external.value', + 'view_mode': 'list', + 'views': [(False, 'list')], + 'domain': external_values_domain, + } + + # Audit of move lines + # If we're auditing a groupby line, we need to make sure to restrict the result of what we audit to the right group values + column = next((col for col in report_line.report_id.column_ids if col.expression_label == expression_label), self.env['account.report.column']) + if column.custom_audit_action_id: + action_dict = column.custom_audit_action_id._get_action_dict() + else: + action_dict = { + 'name': _("Journal Items"), + 'type': 'ir.actions.act_window', + 'res_model': 'account.move.line', + 'view_mode': 'list', + 'views': [(False, 'list')], + } + + action = clean_action(action_dict, env=self.env) + action['domain'] = self._get_audit_line_domain(column_group_options, expression, params) + return action + + def action_view_all_variants(self, options, params): + return { + 'name': _('All Report Variants'), + 'type': 'ir.actions.act_window', + 'res_model': 'account.report', + 'view_mode': 'list', + 'views': [(False, 'list'), (False, 'form')], + 'context': { + 'active_test': False, + }, + 'domain': [('id', 'in', self._get_variants(options['variants_source_id']).filtered( + lambda x: x._is_available_for(options) + ).mapped('id'))], + } + + def _get_audit_line_domain(self, column_group_options, expression, params): + groupby_domain = self._get_audit_line_groupby_domain(params['calling_line_dict_id']) + # Aggregate all domains per date scope, then create the final domain. + audit_or_domains_per_date_scope = {} + for expression_to_audit in expression._expand_aggregations(): + expression_domain = self._get_expression_audit_aml_domain(expression_to_audit, column_group_options) + + if expression_domain is None: + continue + + date_scope = expression.date_scope if expression.subformula == 'cross_report' else expression_to_audit.date_scope + audit_or_domains = audit_or_domains_per_date_scope.setdefault(date_scope, []) + audit_or_domains.append(osv.expression.AND([ + expression_domain, + groupby_domain, + ])) + + if audit_or_domains_per_date_scope: + domain = osv.expression.OR([ + osv.expression.AND([ + osv.expression.OR(audit_or_domains), + self._get_options_domain(column_group_options, date_scope), + groupby_domain, + ]) + for date_scope, audit_or_domains in audit_or_domains_per_date_scope.items() + ]) + else: + # Happens when no expression was provided (empty recordset), or if none of the expressions had a standard engine + domain = osv.expression.AND([ + self._get_options_domain(column_group_options, 'strict_range'), + groupby_domain, + ]) + + # Analytic Filter + if column_group_options.get("analytic_accounts"): + domain = osv.expression.AND([ + domain, + [("analytic_distribution", "in", column_group_options["analytic_accounts"])], + ]) + + return domain + + def _get_audit_line_groupby_domain(self, calling_line_dict_id): + parsed_line_dict_id = self._parse_line_id(calling_line_dict_id) + groupby_domain = [] + for markup, dummy, grouping_key in parsed_line_dict_id: + if isinstance(markup, dict) and 'groupby' in markup: + groupby_field_name = markup['groupby'] + custom_handler_model = self._get_custom_handler_model() + if custom_handler_model and (custom_groupby_data := self.env[custom_handler_model]._get_custom_groupby_map().get(groupby_field_name)): + groupby_domain += custom_groupby_data['domain_builder'](grouping_key) + else: + groupby_domain.append((groupby_field_name, '=', grouping_key)) + + return groupby_domain + + def _get_expression_audit_aml_domain(self, expression_to_audit, options): + """ Returns the domain used to audit a single provided expression. + + 'account_codes' engine's D and C formulas can't be handled by a domain: we make the choice to display + everything for them (so, audit shows all the lines that are considered by the formula). To avoid confusion from the user + when auditing such lines, a default group by account can be used in the list view. + """ + if expression_to_audit.engine == 'account_codes': + formula = expression_to_audit.formula.replace(' ', '') + + account_codes_domains = [] + for token in ACCOUNT_CODES_ENGINE_SPLIT_REGEX.split(formula.replace(' ', '')): + if token: + match_dict = ACCOUNT_CODES_ENGINE_TERM_REGEX.match(token).groupdict() + tag_match = ACCOUNT_CODES_ENGINE_TAG_ID_PREFIX_REGEX.match(match_dict['prefix']) + account_codes_domain = [] + + if tag_match: + if tag_match['ref']: + tag_id = self.env['ir.model.data']._xmlid_to_res_id(tag_match['ref']) + else: + tag_id = int(tag_match['id']) + + account_codes_domain.append(('account_id.tag_ids', 'in', [tag_id])) + else: + account_codes_domain.append(('account_id.code', '=like', f"{match_dict['prefix']}%")) + + excluded_prefix_str = match_dict['excluded_prefixes'] + if excluded_prefix_str: + for excluded_prefix in excluded_prefix_str.split(','): + # "'not like', prefix%" doesn't work + account_codes_domain += ['!', ('account_id.code', '=like', f"{excluded_prefix}%")] + + account_codes_domains.append(account_codes_domain) + + return osv.expression.OR(account_codes_domains) + + if expression_to_audit.engine == 'tax_tags': + tags = self.env['account.account.tag']._get_tax_tags(expression_to_audit.formula, expression_to_audit.report_line_id.report_id.country_id.id) + return [('tax_tag_ids', 'in', tags.ids)] + + if expression_to_audit.engine == 'domain': + return ast.literal_eval(expression_to_audit.formula) + + return None + + def open_journal_items(self, options, params): + ''' Open the journal items view with the proper filters and groups ''' + record_model, record_id = self._get_model_info_from_id(params.get('line_id')) + view_id = self.env.ref(params['view_ref']).id if params.get('view_ref') else None + + ctx = { + 'search_default_group_by_account': 1, + 'search_default_posted': 0 if options.get('all_entries') else 1, + 'date_from': options.get('date').get('date_from'), + 'date_to': options.get('date').get('date_to'), + 'search_default_journal_id': params.get('journal_id', False), + 'expand': 1, + } + + if options['date'].get('date_from'): + ctx['search_default_date_between'] = 1 + else: + ctx['search_default_date_before'] = 1 + + if options.get('selected_journal_groups'): + ctx.update({ + 'search_default_journal_group_id': [options['selected_journal_groups']['id']], + }) + + journal_type = params.get('journal_type') + if journal_type or options.get('selected_journal_groups') and options['selected_journal_groups']['journal_types']: + type_to_view_param = { + 'bank': { + 'filter': 'search_default_bank', + 'view_id': self.env.ref('account.view_move_line_tree_grouped_bank_cash').id + }, + 'cash': { + 'filter': 'search_default_cash', + 'view_id': self.env.ref('account.view_move_line_tree_grouped_bank_cash').id + }, + 'general': { + 'filter': 'search_default_misc_filter', + 'view_id': self.env.ref('account.view_move_line_tree_grouped_misc').id + }, + 'sale': { + 'filter': 'search_default_sales', + 'view_id': self.env.ref('account.view_move_line_tree_grouped_sales_purchases').id + }, + 'purchase': { + 'filter': 'search_default_purchases', + 'view_id': self.env.ref('account.view_move_line_tree_grouped_sales_purchases').id + }, + 'credit': { + 'filter': 'search_default_credit', + 'view_id': self.env.ref('account.view_move_line_tree').id + }, + } + if options.get('selected_journal_groups'): + ctx_to_update = {} + for journal_type in options['selected_journal_groups']['journal_types']: + ctx_to_update[type_to_view_param[journal_type]['filter']] = 1 + ctx.update(ctx_to_update) + else: + ctx.update({ + type_to_view_param[journal_type]['filter']: 1, + }) + view_id = type_to_view_param[journal_type]['view_id'] + + action_domain = [('display_type', 'not in', ('line_section', 'line_note'))] + + if record_id is None: + # Default filters don't support the 'no set' value. For this case, we use a domain on the action instead + model_fields_map = { + 'account.account': 'account_id', + 'res.partner': 'partner_id', + 'account.journal': 'journal_id', + } + model_field = model_fields_map.get(record_model) + if model_field: + action_domain += [(model_field, '=', False)] + else: + model_default_filters = { + 'account.account': 'search_default_account_id', + 'res.partner': 'search_default_partner_id', + 'account.journal': 'search_default_journal_id', + 'product.product': 'search_default_product_id', + 'product.category': 'search_default_product_category_id', + } + model_filter = model_default_filters.get(record_model) + if model_filter: + ctx.update({ + 'active_id': record_id, + model_filter: [record_id], + }) + + if options: + for account_type in options.get('account_type', []): + ctx.update({ + f"search_default_{account_type['id']}": account_type['selected'] and 1 or 0, + }) + + if options.get('journals') and 'search_default_journal_id' not in ctx: + selected_journals = [journal['id'] for journal in options['journals'] if journal.get('selected')] + if len(selected_journals) == 1: + ctx['search_default_journal_id'] = selected_journals + + if options.get('analytic_accounts'): + analytic_ids = [int(r) for r in options['analytic_accounts']] + ctx.update({ + 'search_default_analytic_accounts': 1, + 'analytic_ids': analytic_ids, + }) + + return { + 'name': self._get_action_name(params, record_model, record_id), + 'view_mode': 'list,pivot,graph,kanban', + 'res_model': 'account.move.line', + 'views': [(view_id, 'list')], + 'type': 'ir.actions.act_window', + 'domain': action_domain, + 'context': ctx, + } + + def open_unposted_moves(self, options, params=None): + ''' Open the list of draft journal entries that might impact the reporting''' + action = self.env["ir.actions.actions"]._for_xml_id("account.action_move_journal_line") + action = clean_action(action, env=self.env) + action['domain'] = [('state', '=', 'draft'), ('date', '<=', options['date']['date_to'])] + #overwrite the context to avoid default filtering on 'misc' journals + action['context'] = {} + return action + + def _get_generated_deferral_entries_domain(self, options): + """Get the search domain for the generated deferral entries of the current period. + + :param options: the report's `options` dict containing `date_from`, `date_to` and `deferred_report_type` + :return: a search domain that can be used to get the deferral entries + """ + if options.get('deferred_report_type') == 'expense': + account_types = ('expense', 'expense_depreciation', 'expense_direct_cost') + else: + account_types = ('income', 'income_other') + date_to = fields.Date.from_string(options['date']['date_to']) + date_to_next_reversal = fields.Date.to_string(date_to + datetime.timedelta(days=1)) + return [ + ('company_id', '=', self.env.company.id), + # We exclude the reversal entries of the previous period that fall on the first day of this period + ('date', '>', options['date']['date_from']), + # We include the reversal entries of the current period that fall on the first day of the next period + ('date', '<=', date_to_next_reversal), + ('deferred_original_move_ids', '!=', False), + ('line_ids.account_id.account_type', 'in', account_types), + ('state', '!=', 'cancel'), + ] + + def open_deferral_entries(self, options, params): + domain = self._get_generated_deferral_entries_domain(options) + deferral_line_ids = self.env['account.move'].search(domain).line_ids.ids + return { + 'type': 'ir.actions.act_window', + 'name': _('Deferred Entries'), + 'res_model': 'account.move.line', + 'domain': [('id', 'in', deferral_line_ids)], + 'views': [(False, 'list'), (False, 'form')], + 'context': { + 'search_default_group_by_move': True, + 'expand': True, + } + } + + def action_modify_manual_value(self, line_id, options, column_group_key, new_value_str, target_expression_id, rounding, json_friendly_column_group_totals): + """ Edit a manual value from the report, updating or creating the corresponding account.report.external.value object. + + :param options: The option dict the report is evaluated with. + + :param column_group_key: The string identifying the column group into which the change as manual value needs to be done. + + :param new_value_str: The new value to be set, as a string. + + :param rounding: The number of decimal digits to round with. + + :param json_friendly_column_group_totals: The expression totals by column group already computed for this report, in the format returned + by _get_json_friendly_column_group_totals. These will be used to reevaluate the report, recomputing + only the expressions depending on the newly-modified manual value, and keeping all the results + from the previous computations for the other ones. + """ + self.ensure_one() + + target_column_group_options = self._get_column_group_options(options, column_group_key) + self._init_currency_table(target_column_group_options) + + if target_column_group_options.get('compute_budget'): + expressions_to_recompute = self.env['account.report.expression'].browse(target_expression_id) \ + + self.line_ids.expression_ids.filtered(lambda x: x.engine == 'aggregation') + self._action_modify_manual_budget_value(line_id, target_column_group_options, new_value_str, target_expression_id, rounding) + else: + expressions_to_recompute = self.line_ids.expression_ids.filtered(lambda x: x.engine in ('external', 'aggregation')) + self._action_modify_manual_external_value(target_column_group_options, new_value_str, target_expression_id, rounding) + + # We recompute values for each column group, not only the one we modified a value in; this is important in case some date_scope is used to + # retrieve the manual value from a previous period. + + all_column_groups_expression_totals = self._convert_json_friendly_column_group_totals( + json_friendly_column_group_totals, + expressions_to_exclude=expressions_to_recompute, + ) + + recomputed_expression_totals = self._compute_expression_totals_for_each_column_group( + expressions_to_recompute, options, forced_all_column_groups_expression_totals=all_column_groups_expression_totals) + + return { + 'lines': self._get_lines(options, all_column_groups_expression_totals=recomputed_expression_totals), + 'column_groups_totals': self._get_json_friendly_column_group_totals(recomputed_expression_totals), + } + + def _convert_json_friendly_column_group_totals(self, json_friendly_column_group_totals, expressions_to_exclude=None, col_groups_to_exclude=None): + """ json_friendly_column_group_totals contains ids instead of expressions (because it comes from js) ; this function is used + to convert them back to records. + """ + all_column_groups_expression_totals = {} + for column_group_key, expression_totals in json_friendly_column_group_totals.items(): + if col_groups_to_exclude and column_group_key in col_groups_to_exclude: + continue + + all_column_groups_expression_totals[column_group_key] = {} + for expr_id, expr_totals in expression_totals.items(): + expression = self.env['account.report.expression'].browse(int(expr_id)) # Should already be in cache, so acceptable + if not expressions_to_exclude or expression not in expressions_to_exclude: + all_column_groups_expression_totals[column_group_key][expression] = expr_totals + + return all_column_groups_expression_totals + + def _action_modify_manual_external_value(self, target_column_group_options, new_value_str, target_expression_id, rounding): + """ Edit a manual value from the report, updating or creating the corresponding account.report.external.value object. + + :param target_column_group_options: The options dict of the column group where the modification happened. + + :param column_group_key: The string identifying the column group into which the change as manual value needs to be done. + + :param new_value_str: The new value to be set, as a string. + + :param rounding: The number of decimal digits to round with. + + """ + if len(target_column_group_options['companies']) > 1: + raise UserError(_("Editing a manual report line is not allowed when multiple companies are selected.")) + + if target_column_group_options['fiscal_position'] == 'all' and target_column_group_options['available_vat_fiscal_positions']: + raise UserError(_("Editing a manual report line is not allowed in multivat setup when displaying data from all fiscal positions.")) + + # Create the manual value + target_expression = self.env['account.report.expression'].browse(target_expression_id) + date_from, date_to = self._get_date_bounds_info(target_column_group_options, target_expression.date_scope) + fiscal_position_id = target_column_group_options['fiscal_position'] if isinstance(target_column_group_options['fiscal_position'], int) else False + + external_values_domain = [ + ('target_report_expression_id', '=', target_expression.id), + ('company_id', '=', self.env.company.id), + ('foreign_vat_fiscal_position_id', '=', fiscal_position_id), + ] + + if target_expression.formula == 'most_recent': + value_to_adjust = 0 + existing_value_to_modify = self.env['account.report.external.value'].search([ + *external_values_domain, + ('date', '=', date_to), + ]) + + # There should be at most 1 + if len(existing_value_to_modify) > 1: + raise UserError(_("Inconsistent data: more than one external value at the same date for a 'most_recent' external line.")) + else: + existing_external_values = self.env['account.report.external.value'].search([ + *external_values_domain, + ('date', '>=', date_from), + ('date', '<=', date_to), + ], order='date ASC') + existing_value_to_modify = existing_external_values[-1] if existing_external_values and str(existing_external_values[-1].date) == date_to else None + value_to_adjust = sum(existing_external_values.filtered(lambda x: x != existing_value_to_modify).mapped('value')) + + if not new_value_str and target_expression.figure_type != 'string': + new_value_str = '0' + + try: + float(new_value_str) + is_number = True + except ValueError: + is_number = False + + if target_expression.figure_type == 'string': + value_to_set = new_value_str + else: + if not is_number: + raise UserError(_("%s is not a numeric value", new_value_str)) + if target_expression.figure_type == 'boolean': + rounding = 0 + value_to_set = float_round(float(new_value_str) - value_to_adjust, precision_digits=rounding) + + field_name = 'value' if target_expression.figure_type != 'string' else 'text_value' + + if existing_value_to_modify: + existing_value_to_modify[field_name] = value_to_set + existing_value_to_modify.flush_recordset() + else: + self.env['account.report.external.value'].create({ + 'name': _("Manual value"), + field_name: value_to_set, + 'date': date_to, + 'target_report_expression_id': target_expression.id, + 'company_id': self.env.company.id, + 'foreign_vat_fiscal_position_id': fiscal_position_id, + }) + + def _action_modify_manual_budget_value(self, line_id, target_column_group_options, new_value_str, target_expression_id, rounding): + target_expression = self.env['account.report.expression'].browse(target_expression_id) + + if not new_value_str and target_expression.figure_type != 'string': + new_value_str = '0' + + try: + value_to_set = float_round(float(new_value_str), precision_digits=rounding) + except ValueError: + raise UserError(_("%s is not a numeric value", new_value_str)) + + model, account_id = self._get_model_info_from_id(line_id) + if model != 'account.account': + raise UserError(_("Budget items can only be edited from account lines.")) + + # Depending on the expression's formula, the balance of the account could be multiplied by -1 + # within the report. We need to apply the same multiplier on the budget item we create. + if target_expression.engine == 'domain' and target_expression.subformula.startswith('-'): + value_to_set *= -1 + elif target_expression.engine == 'account_codes': + account = self.env['account.account'].browse(account_id) + + # Search for the sign to apply to this account + for token in ACCOUNT_CODES_ENGINE_SPLIT_REGEX.split(target_expression.formula.replace(' ', '')): + if not token: + continue + + token_match = ACCOUNT_CODES_ENGINE_TERM_REGEX.match(token) + multiplicator = -1 if token_match['sign'] == '-' else 1 + prefix = token_match['prefix'] + + tag_match = ACCOUNT_CODES_ENGINE_TAG_ID_PREFIX_REGEX.match(prefix) + if tag_match: + if tag_match['ref']: + tag = self.env.ref(tag_match['ref']) + else: + tag = self.env['account.account.tag'].browse(tag_match['id']) + + account_matches = tag in account.tag_ids + else: + account_matches = account.code.startswith(prefix) + + if account_matches: + value_to_set *= multiplicator + break + + self.env['account.report.budget'].browse(target_column_group_options['compute_budget'])._create_or_update_budget_items( + value_to_set, + account_id, + rounding, + target_column_group_options['date']['date_from'], + target_column_group_options['date']['date_to'], + ) + + def action_display_inactive_sections(self, options): + self.ensure_one() + + return { + 'type': 'ir.actions.act_window', + 'name': _("Enable Sections"), + 'view_mode': 'list,form', + 'res_model': 'account.report', + 'domain': [('section_main_report_ids', 'in', options['sections_source_id']), ('active', '=', False)], + 'views': [(False, 'list'), (False, 'form')], + 'context': { + 'list_view_ref': 'odex30_account_reports.account_report_add_sections_tree', + 'active_test': False, + }, + } + + @api.model + def sort_lines(self, lines, options, result_as_index=False): + ''' Sort report lines based on the 'order_column' key inside the options. + The value of options['order_column'] is an integer, positive or negative, indicating on which column + to sort and also if it must be an ascending sort (positive value) or a descending sort (negative value). + Note that for this reason, its indexing is made starting at 1, not 0. + If this key is missing or falsy, lines is returned directly. + + This method has some limitations: + - The selected_column must have 'sortable' in its classes. + - All lines are sorted except: + - lines having the 'total' class + - static lines (lines with model 'account.report.line') + - This only works when each line has an unique id. + - All lines inside the selected_column must have a 'no_format' value. + + Example: + + parent_line_1 balance=11 + child_line_1 balance=1 + child_line_2 balance=3 + child_line_3 balance=2 + child_line_4 balance=7 + child_line_5 balance=4 + child_line_6 (total line) + parent_line_2 balance=10 + child_line_7 balance=5 + child_line_8 balance=6 + child_line_9 (total line) + + + The resulting lines will be: + + parent_line_2 balance=10 + child_line_7 balance=5 + child_line_8 balance=6 + child_line_9 (total line) + parent_line_1 balance=11 + child_line_1 balance=1 + child_line_3 balance=2 + child_line_2 balance=3 + child_line_5 balance=4 + child_line_4 balance=7 + child_line_6 (total line) + + :param lines: The report lines. + :param options: The report options. + :return: Lines sorted by the selected column. + ''' + def needs_to_be_at_bottom(line_elem): + return self._get_markup(line_elem.get('id')) in ('total', 'load_more') + + def compare_values(a_line, b_line): + if column_index is False: + return 0 + type_seq = { + type(None): 0, + bool: 1, + float: 2, + int: 2, + str: 3, + datetime.date: 4, + datetime.datetime: 5, + } + + a_line_dict = lines[a_line] if result_as_index else a_line + b_line_dict = lines[b_line] if result_as_index else b_line + a_total = needs_to_be_at_bottom(a_line_dict) + b_total = needs_to_be_at_bottom(b_line_dict) + a_model = self._get_model_info_from_id(a_line_dict['id'])[0] + b_model = self._get_model_info_from_id(b_line_dict['id'])[0] + + # static lines are not sorted + if a_model == b_model == 'account.report.line': + return 0 + + if a_total: + if b_total: # a_total & b_total + return 0 + else: # a_total & !b_total + return -1 if descending else 1 + if b_total: # => !a_total & b_total + return 1 if descending else -1 + + a_val = a_line_dict['columns'][column_index].get('no_format') + b_val = b_line_dict['columns'][column_index].get('no_format') + type_a, type_b = type_seq[type(a_val)], type_seq[type(b_val)] + + if type_a == type_b: + return 0 if a_val == b_val else 1 if a_val > b_val else -1 + else: + return type_a - type_b + + def merge_tree(tree_elem, ls): + nonlocal descending # The direction of the sort is needed to compare total lines + ls.append(tree_elem) + + elem = tree[lines[tree_elem]['id']] if result_as_index else tree[tree_elem['id']] + + for tree_subelem in sorted(elem, key=comp_key, reverse=descending): + merge_tree(tree_subelem, ls) + + descending = options['order_column']['direction'] == 'DESC' # To keep total lines at the end, used in compare_values & merge_tree scopes + + column_index = False + for index, col in enumerate(options['columns']): + if options['order_column']['expression_label'] == col['expression_label']: + column_index = index # To know from which column to sort, used in merge_tree scope + break + + comp_key = cmp_to_key(compare_values) + sorted_list = [] + tree = defaultdict(list) + non_total_parents = set() + + for index, line in enumerate(lines): + line_parent = line.get('parent_id') or None + + if result_as_index: + tree[line_parent].append(index) + else: + tree[line_parent].append(line) + + line_markup = self._get_markup(line['id']) + + if line_markup != 'total': + non_total_parents.add(line_parent) + + if None not in tree and len(non_total_parents) == 1: + # Happens when unfolding a groupby line, to sort its children. + sorting_root = next(iter(non_total_parents)) + else: + sorting_root = None + + for line in sorted(tree[sorting_root], key=comp_key, reverse=descending): + merge_tree(line, sorted_list) + + return sorted_list + + def _get_annotations_domain_date_from(self, options): + if options['date']['filter'] in {'today', 'custom'} and options['date']['mode'] == 'single': + options_company_ids = [company['id'] for company in options['companies']] + root_companies_ids = self.env['res.company'].browse(options_company_ids).root_id.ids + fiscal_year = self.env['account.fiscal.year'].search_fetch([ + ('company_id', 'in', root_companies_ids), + ('date_from', '<=', options['date']['date_to']), + ('date_to', '>=', options['date']['date_to']), + ], limit=1, field_names=['date_from']) + if fiscal_year: + return datetime.datetime.combine(fiscal_year.date_from, datetime.time.min) + + period_date_from, _ = date_utils.get_fiscal_year( + datetime.datetime.strptime(options['date']['date_to'], '%Y-%m-%d'), + day=self.env.company.fiscalyear_last_day, + month=int(self.env.company.fiscalyear_last_month) + ) + return period_date_from + + date_from = datetime.datetime.strptime(options['date']['date_from'], '%Y-%m-%d') + if options['date']['period_type'] == "fiscalyear": + period_date_from, _ = date_utils.get_fiscal_year(date_from) + elif options['date']['period_type'] in ["year", "quarter", "month", "week", "day", "hour"]: + period_date_from = date_utils.start_of(date_from, options['date']['period_type']) + else: + period_date_from = date_from + return period_date_from + + def _adjust_date_for_joined_comparison(self, options, period_date_from): + comparison_filter = options.get('comparison', {}).get('filter') + if comparison_filter == 'previous_period': + comparison_date_from = datetime.datetime.strptime(options['comparison'].get('periods', [{}])[-1].get('date_from'), '%Y-%m-%d') + return min(period_date_from, comparison_date_from) + return period_date_from + + def _adjust_domain_for_unjoined_comparison(self, options, dates_domain): + comparison_filter = options.get('comparison', {}).get('filter') + if comparison_filter and comparison_filter not in {'no_comparison', 'previous_period'}: + unlinked_comparison_periods_domains_list = [ + ['&', ('date', '>=', period['date_from']), ('date', '<=', period['date_to'])] + for period in options['comparison']['periods'] + ] + dates_domain = osv.expression.OR([dates_domain, *unlinked_comparison_periods_domains_list]) + + return dates_domain + + def _build_annotations_domain(self, options): + domain = [('report_id', '=', options['report_id'])] + if options.get('date'): + period_date_from = self._get_annotations_domain_date_from(options) + period_date_from = self._adjust_date_for_joined_comparison(options, period_date_from) + dates_domain = osv.expression.AND([ + [('date', '>=', period_date_from)], + [('date', '<=', options['date']['date_to'])], + ]) + dates_domain = self._adjust_domain_for_unjoined_comparison(options, dates_domain) + + domain = osv.expression.AND([ + domain, + osv.expression.OR([ + [('date', '=', False)], + dates_domain, + ]), + ]) + + fiscal_position_option = options.get('fiscal_position') + if isinstance(fiscal_position_option, int): + domain = osv.expression.AND([domain, [('fiscal_position_id', '=', fiscal_position_option)]]) + elif fiscal_position_option == 'domestic': + domain = osv.expression.AND([domain, [('fiscal_position_id', '=', False)]]) + return domain + + def get_annotations(self, options): + """ + This method handles which annotations have to be displayed on the report. + This decision is based on the different dates and mode of display of those dates in the report. + + param options: dict of options used to generate the report + return: dict of lists containing for each annotated line_id of the report the list of annotations linked to it + """ + self.ensure_one() + annotations_by_line = defaultdict(list) + annotations = self.env['account.report.annotation'].search_read(self._build_annotations_domain(options)) + for annotation in annotations: + line_id_without_tax_grouping = self.env['account.report.annotation']._remove_tax_grouping_from_line_id(annotation['line_id']) + annotation['create_date'] = annotation['create_date'].date() + annotations_by_line[line_id_without_tax_grouping].append(annotation) + return annotations_by_line + + def get_report_information(self, options): + """ + return a dictionary of information that will be consumed by the AccountReport component. + """ + self.ensure_one() + self.env.flush_all() + + warnings = {} + self._init_currency_table(options) + all_column_groups_expression_totals = self._compute_expression_totals_for_each_column_group(self.line_ids.expression_ids, options, warnings=warnings) + + # Convert all_column_groups_expression_totals to a json-friendly form (its keys are records) + json_friendly_column_group_totals = self._get_json_friendly_column_group_totals(all_column_groups_expression_totals) + + if self.custom_handler_model_name: + custom_display_config = self.env[self.custom_handler_model_name]._get_custom_display_config() + elif self.root_report_id and self.root_report_id.custom_handler_model_name: + custom_display_config = self.env[self.root_report_id.custom_handler_model_name]._get_custom_display_config() + else: + custom_display_config = {} + + return { + 'caret_options': self._get_caret_options(), + 'column_headers_render_data': self._get_column_headers_render_data(options), + 'column_groups_totals': json_friendly_column_group_totals, + 'context': self.env.context, + 'custom_display': custom_display_config, + 'filters': { + 'show_all': self.filter_unfold_all, + 'show_analytic': options.get('display_analytic', False), + 'show_analytic_groupby': options.get('display_analytic_groupby', False), + 'show_analytic_plan_groupby': options.get('display_analytic_plan_groupby', False), + 'show_draft': self.filter_show_draft, + 'show_hierarchy': options.get('display_hierarchy_filter', False), + 'show_period_comparison': self.filter_period_comparison, + 'show_totals': self.env.company.totals_below_sections and not options.get('ignore_totals_below_sections'), + 'show_unreconciled': self.filter_unreconciled, + 'show_hide_0_lines': self.filter_hide_0_lines, + }, + 'annotations': self.get_annotations(options), + 'groups': { + 'analytic_accounting': self.env.user.has_group('analytic.group_analytic_accounting'), + 'account_readonly': self.env.user.has_group('account.group_account_readonly'), + 'account_user': self.env.user.has_group('account.group_account_user'), + }, + 'lines': self._get_lines(options, all_column_groups_expression_totals=all_column_groups_expression_totals, warnings=warnings), + 'warnings': warnings, + 'report': { + 'company_name': self.env.company.name, + 'company_country_code': self.env.company.country_code, + 'company_currency_symbol': self.env.company.currency_id.symbol, + 'name': self.name, + 'root_report_id': self.root_report_id, + } + } + + @api.readonly + def get_report_information_readonly(self, options): + """ Readonly version of get_report_information, to be called from RPC when options['readonly_query'] is True, + to better spread the load on servers when possible. + """ + return self.get_report_information(options) + + def _get_json_friendly_column_group_totals(self, all_column_groups_expression_totals): + # Convert all_column_groups_expression_totals to a json-friendly form (its keys are records) + json_friendly_column_group_totals = {} + for column_group_key, expressions_totals in all_column_groups_expression_totals.items(): + json_friendly_column_group_totals[column_group_key] = {expression.id: totals for expression, totals in expressions_totals.items()} + return json_friendly_column_group_totals + + def _is_available_for(self, options): + """ Called on report variants to know whether they are available for the provided options or not, computed for their root report, + computing their availability_condition field. + + Note that only the options initialized by the init_options with a more prioritary sequence than _init_options_variants are guaranteed to + be in the provided options' dict (since this function is called by _init_options_variants, while resolving a call to get_options()). + """ + self.ensure_one() + + companies = self.env['res.company'].browse(self.get_report_company_ids(options)) + + if self.availability_condition == 'country': + countries = companies.account_fiscal_country_id + if self.filter_fiscal_position: + foreign_vat_fpos = self.env['account.fiscal.position'].search([ + ('foreign_vat', '!=', False), + ('company_id', 'in', companies.ids), + ]) + countries += foreign_vat_fpos.country_id + + return not self.country_id or self.country_id in countries + + elif self.availability_condition == 'coa': + # When restricting to 'coa', the report is only available is all the companies have the same CoA as the report + return self.chart_template in set(companies.mapped('chart_template')) + + return True + + def _get_column_headers_render_data(self, options): + column_headers_render_data = {} + + # We only want to consider the columns that are visible in the current report and don't rely on self.column_ids + # since custom reports could alter them (e.g. for multi-currency purposes) + columns = [col for col in options['columns'] if col['column_group_key'] == next(k for k in options['column_groups'])] + + # Compute the colspan of each header level, aka the number of single columns it contains at the base of the hierarchy + level_colspan_list = column_headers_render_data['level_colspan'] = [] + for i in range(len(options['column_headers'])): + colspan = max(len(columns), 1) + for column_header in options['column_headers'][i + 1:]: + # Separate non-budget and budget headers + budget_count = sum( + any(key in header.get('forced_options', {}) for key in ('compute_budget', 'budget_percentage')) + for header in column_header + ) + non_budget_count = len(column_header) - budget_count + + # budget headers (amount and percentage) can only contain a single column each, regardless of the amount of columns in the report. + # This implies that we first need to multiply for the 'regular' columns and then add the budget columns. + colspan *= non_budget_count + colspan += budget_count + + level_colspan_list.append(colspan) + + # Compute the number of times each header level will have to be repeated, and its colspan to properly handle horizontal groups/comparisons + column_headers_render_data['level_repetitions'] = [] + for i in range(len(options['column_headers'])): + colspan = 1 + for column_header in options['column_headers'][:i]: + colspan *= len(column_header) + column_headers_render_data['level_repetitions'].append(colspan) + + # Custom reports have the possibility to define custom subheaders that will be displayed between the generic header and the column names. + column_headers_render_data['custom_subheaders'] = options.get('custom_columns_subheaders', []) * len(options['column_groups']) + + return column_headers_render_data + + def _get_action_name(self, params, record_model=None, record_id=None): + if not (record_model or record_id): + record_model, record_id = self._get_model_info_from_id(params.get('line_id')) + return params.get('name') or self.env[record_model].browse(record_id).display_name or '' + + def _format_lines_for_display(self, lines, options): + """ + This method should be overridden in a report in order to apply specific formatting when printing + the report lines. + + Used for example by the carryover functionnality in the generic tax report. + :param lines: A list with the lines for this report. + :param options: The options for this report. + :return: The formatted list of lines + """ + return lines + + def get_expanded_lines(self, options, line_dict_id, groupby, expand_function_name, progress, offset, horizontal_split_side): + self.env.flush_all() + self._init_currency_table(options) + + lines = self._expand_unfoldable_line(expand_function_name, line_dict_id, groupby, options, progress, offset, horizontal_split_side) + lines = self._fully_unfold_lines_if_needed(lines, options) + + self._inject_account_names_for_consolidation(lines) + + if self.custom_handler_model_id: + lines = self.env[self.custom_handler_model_name]._custom_line_postprocessor(self, options, lines) + + self._format_column_values(options, lines) + return lines + + @api.readonly + def get_expanded_lines_readonly(self, options, line_dict_id, groupby, expand_function_name, progress, offset, horizontal_split_side): + """ Readonly version of get_expanded_lines_readonly, to be called from RPC when options['readonly_query'] is True, + to better spread the load on servers when possible. + """ + return self.get_expanded_lines(options, line_dict_id, groupby, expand_function_name, progress, offset, horizontal_split_side) + + def _expand_unfoldable_line(self, expand_function_name, line_dict_id, groupby, options, progress, offset, horizontal_split_side, unfold_all_batch_data=None): + if not expand_function_name: + raise UserError(_("Trying to expand a line without an expansion function.")) + + if not progress: + progress = {column_group_key: 0 for column_group_key in options['column_groups']} + + expand_function = self._get_custom_report_function(expand_function_name, 'expand_unfoldable_line') + expansion_result = expand_function(line_dict_id, groupby, options, progress, offset, unfold_all_batch_data=unfold_all_batch_data) + + rslt = expansion_result['lines'] + + if horizontal_split_side: + for line in rslt: + line['horizontal_split_side'] = horizontal_split_side + + # Apply integer rounding to the result if needed. + # The groupby expansion function is the only one guaranteed to call the expressions computation, + # so the values computed for it will already have been rounded if integer rounding is enabled. No need to round them again. + if expand_function_name != '_report_expand_unfoldable_line_with_groupby': + self._apply_integer_rounding_to_dynamic_lines(options, rslt) + + if expansion_result.get('has_more'): + # We only add load_more line for groupby + next_offset = offset + expansion_result['offset_increment'] + rslt.append(self._get_load_more_line(next_offset, line_dict_id, expand_function_name, groupby, expansion_result.get('progress', 0), options)) + + # In some specific cases, we may want to add lines that are always at the end. So they need to be added after the load more line. + if expansion_result.get('after_load_more_lines'): + rslt.extend(expansion_result['after_load_more_lines']) + + return self._add_totals_below_sections(rslt, options) + + def _add_totals_below_sections(self, lines, options): + """ Returns a new list, corresponding to lines with the required total lines added as sublines of the sections it contains. + """ + if not self.env.company.totals_below_sections or options.get('ignore_totals_below_sections'): + return lines + + # Gather the lines needing the totals + lines_needing_total_below = set() + for line_dict in lines: + line_markup = self._get_markup(line_dict['id']) + + if line_markup != 'total': + # If we are on the first level of an expandable line, we arelady generate its total + if line_dict.get('unfoldable') or (line_dict.get('unfolded') and line_dict.get('expand_function')): + lines_needing_total_below.add(line_dict['id']) + + # All lines that are parent of other lines need to receive a total + line_parent_id = line_dict.get('parent_id') + if line_parent_id: + lines_needing_total_below.add(line_parent_id) + + # Inject the totals + if lines_needing_total_below: + lines_with_totals_below = [] + totals_below_stack = [] + for line_dict in lines: + while totals_below_stack and not line_dict['id'].startswith(totals_below_stack[-1]['parent_id'] + LINE_ID_HIERARCHY_DELIMITER): + lines_with_totals_below.append(totals_below_stack.pop()) + + lines_with_totals_below.append(line_dict) + + if line_dict['id'] in lines_needing_total_below and any(col.get('no_format') is not None for col in line_dict['columns']): + totals_below_stack.append(self._generate_total_below_section_line(line_dict)) + + while totals_below_stack: + lines_with_totals_below.append(totals_below_stack.pop()) + + return lines_with_totals_below + + return lines + + @api.model + def _get_load_more_line(self, offset, parent_line_id, expand_function_name, groupby, progress, options): + """ Returns a 'Load more' line allowing to reach the subsequent elements of an unfolded line with an expand function if the maximum + limit of sublines is reached (we load them by batch, using the load_more_limit field's value). + + :param offset: The offset to be passed to the expand function to generate the next results, when clicking on this 'load more' line. + + :param parent_line_id: The generic id of the line this load more line is created for. + + :param expand_function_name: The name of the expand function this load_more is created for (so, the one of its parent). + + :param progress: A json-formatted dict(column_group_key, value) containing the progress value for each column group, as it was + returned by the expand function. This is for example used by reports such as the general ledger, whose lines display a c + cumulative sum of their balance and the one of all the previous lines under the same parent. In this case, progress + will be the total sum of all the previous lines before the load_more line, that the subsequent lines will need to use as + base for their own cumulative sum. + + :param options: The options dict corresponding to this report's state. + """ + return { + 'id': self._get_generic_line_id(None, None, parent_line_id=parent_line_id, markup='load_more'), + 'name': _("Load more..."), + 'parent_id': parent_line_id, + 'expand_function': expand_function_name, + 'columns': [{} for col in options['columns']], + 'unfoldable': False, + 'unfolded': False, + 'offset': offset, + 'groupby': groupby, # We keep the groupby value from the parent, so that it can be propagated through js + 'progress': progress, + } + + def _report_expand_unfoldable_line_with_groupby(self, line_dict_id, groupby, options, progress, offset, unfold_all_batch_data=None): + # The line we're expanding might be an inner groupby; we first need to find the report line generating it + report_line_id = None + for dummy, model, model_id in reversed(self._parse_line_id(line_dict_id)): + if model == 'account.report.line': + report_line_id = model_id + break + + if report_line_id is None: + raise UserError(_("Trying to expand a group for a line which was not generated by a report line: %s", line_dict_id)) + + line = self.env['account.report.line'].browse(report_line_id) + + if ',' not in groupby and options['export_mode'] is None: + # if ',' not in groupby, then its a terminal groupby (like 'id' in 'partner_id, id'), so we can use the 'load more' feature if necessary + # When printing, we want to ignore the limit. + limit_to_load = self.load_more_limit or None + else: + # Else, we disable it + limit_to_load = None + offset = 0 + + rslt_lines = line._expand_groupby(line_dict_id, groupby, options, offset=offset, limit=limit_to_load, load_one_more=bool(limit_to_load), unfold_all_batch_data=unfold_all_batch_data) + lines_to_load = rslt_lines[:self.load_more_limit] if limit_to_load else rslt_lines + + if not limit_to_load and options['export_mode'] is None: + lines_to_load = self._regroup_lines_by_name_prefix(options, rslt_lines, '_report_expand_unfoldable_line_groupby_prefix_group', line.hierarchy_level, + groupby=groupby, parent_line_dict_id=line_dict_id) + + return { + 'lines': lines_to_load, + 'offset_increment': len(lines_to_load), + 'has_more': len(lines_to_load) < len(rslt_lines) if limit_to_load else False, + } + + def _regroup_lines_by_name_prefix(self, options, lines_to_group, expand_function_name, parent_level, matched_prefix='', groupby=None, parent_line_dict_id=None): + """ Postprocesses a list of report line dictionaries in order to regroup them by name prefix and reduce the overall number of lines + if their number is above a provided threshold (set in the report configuration). + + The lines regrouped under a common prefix will be removed from the returned list of lines; only the prefix line will stay, folded. + Its expand function must ensure the right sublines are reloaded when unfolding it. + + :param options: Option dict for this report. + :lines_to_group: The lines list to regroup by prefix if necessary. They must all have the same parent line (which might be no line at all). + :expand_function_name: Name of the expand function to be called on created prefix group lines, when unfolding them + :parent_level: Level of the parent line, which generated the lines in lines_to_group. It will be used to compute the level of the prefix group lines. + :matched_prefix': A string containing the parent prefix that's already matched. For example, when computing prefix 'ABC', matched_prefix will be 'AB'. + :groupby: groupby value of the parent line, which generated the lines in lines_to_group. + :parent_line_dict_id: id of the parent line, which generated the lines in lines_to_group. + + :return: lines_to_group, grouped by prefix if it was necessary. + """ + threshold = options['prefix_groups_threshold'] + + # When grouping by prefix, we ignore the totals + lines_to_group_without_totals = list(filter(lambda x: self._get_markup(x['id']) != 'total', lines_to_group)) + + if options['export_mode'] == 'print' or threshold <= 0 or len(lines_to_group_without_totals) < threshold: + # No grouping needs to be done + return lines_to_group + + char_index = len(matched_prefix) + prefix_groups = defaultdict(list) + rslt = [] + for line in lines_to_group_without_totals: + line_name = line['name'].strip() + + if len(line_name) - 1 < char_index: + rslt.append(line) + else: + prefix_groups[line_name[char_index].lower()].append(line) + + float_figure_types = {'monetary', 'integer', 'float'} + unfold_all = options['export_mode'] == 'print' or options.get('unfold_all') + for prefix_key, prefix_sublines in sorted(prefix_groups.items(), key=lambda x: x[0]): + # Compute the total of this prefix line, summming all of its content + prefix_expression_totals_by_group = {} + for column_index, column_data in enumerate(options['columns']): + if column_data['figure_type'] in float_figure_types: + # Then we want to sum this column's value in our children + for prefix_subline in prefix_sublines: + prefix_expr_label_result = prefix_expression_totals_by_group.setdefault(column_data['column_group_key'], {}) + prefix_expr_label_result.setdefault(column_data['expression_label'], 0) + prefix_expr_label_result[column_data['expression_label']] += (prefix_subline['columns'][column_index]['no_format'] or 0) + + column_values = [] + for column in options['columns']: + col_value = prefix_expression_totals_by_group.get(column['column_group_key'], {}).get(column['expression_label']) + + column_values.append(self._build_column_dict(col_value, column, options=options)) + + line_id = self._get_generic_line_id(None, None, parent_line_id=parent_line_dict_id, markup={'groupby_prefix_group': prefix_key}) + + sublines_nber = len(prefix_sublines) + prefix_to_display = prefix_key.upper() + + if re.match(r'\s', prefix_to_display[-1]): + # In case the last character of the prefix to_display is blank, replace it by "[ ]", to make the space more visible to the user. + prefix_to_display = f'{prefix_to_display[:-1]}[ ]' + + if sublines_nber == 1: + prefix_group_line_name = f"{matched_prefix}{prefix_to_display} " + _("(1 line)") + else: + prefix_group_line_name = f"{matched_prefix}{prefix_to_display} " + _("(%s lines)", sublines_nber) + + prefix_group_line = { + 'id': line_id, + 'name': prefix_group_line_name, + 'unfoldable': True, + 'unfolded': unfold_all or line_id in options['unfolded_lines'], + 'columns': column_values, + 'groupby': groupby, + 'level': parent_level + 1, + 'parent_id': parent_line_dict_id, + 'expand_function': expand_function_name, + 'hide_line_buttons': True, + } + rslt.append(prefix_group_line) + + return rslt + + def _report_expand_unfoldable_line_groupby_prefix_group(self, line_dict_id, groupby, options, progress, offset, unfold_all_batch_data=None): + """ Expand function used by prefix_group lines generated for groupby lines. + """ + report_line_id = None + parent_groupby_count = 0 + for markup, model, model_id in reversed(self._parse_line_id(line_dict_id)): + if model == 'account.report.line': + report_line_id = model_id + break + elif isinstance(markup, dict) and 'groupby' in markup or 'groupby_prefix_group' in markup: + parent_groupby_count += 1 + + if report_line_id is None: + raise UserError(_("Trying to expand a group for a line which was not generated by a report line: %s", line_dict_id)) + + report_line = self.env['account.report.line'].browse(report_line_id) + + + matched_prefix = self._get_prefix_groups_matched_prefix_from_line_id(line_dict_id) + first_groupby = groupby.split(',')[0] + expand_options = { + **options, + 'forced_domain': options.get('forced_domain', []) + [(f"{f'{first_groupby}.' if first_groupby != 'id' else ''}name", '=ilike', f'{matched_prefix}%')] + } + expanded_groupby_lines = report_line._expand_groupby(line_dict_id, groupby, expand_options) + parent_level = report_line.hierarchy_level + parent_groupby_count * 2 + + lines = self._regroup_lines_by_name_prefix( + options, + expanded_groupby_lines, + '_report_expand_unfoldable_line_groupby_prefix_group', + parent_level, + groupby=groupby, + matched_prefix=matched_prefix, + parent_line_dict_id=line_dict_id, + ) + + return { + 'lines': lines, + 'offset_increment': len(lines), + 'has_more': False, + } + + @api.model + def _get_prefix_groups_matched_prefix_from_line_id(self, line_dict_id): + matched_prefix = '' + for markup, dummy1, dummy2 in self._parse_line_id(line_dict_id): + if markup and isinstance(markup, dict) and 'groupby_prefix_group' in markup: + prefix_piece = markup['groupby_prefix_group'] + matched_prefix += prefix_piece.upper() + else: + # Might happen if a groupby is grouped by prefix, then a subgroupby is grouped by another subprefix. + # In this case, we want to reset the prefix group to only consider the one used in the subgroupby. + matched_prefix = '' + + return matched_prefix + + @api.model + def format_value(self, options, value, figure_type, format_params=None): + if format_params is None: + format_params = {} + + if 'currency' in format_params: + format_params['currency'] = self.env['res.currency'].browse(format_params['currency'].id) + + return self._format_value(options=options, value=value, figure_type=figure_type, format_params=format_params) + + def _format_value(self, options, value, figure_type, format_params=None): + """ Formats a value for display in a report (not especially numerical). figure_type provides the type of formatting we want. + """ + if value is None: + return '' + + if figure_type == 'none': + return value + + if isinstance(value, str) or figure_type == 'string': + return str(value) + + if format_params is None: + format_params = {} + + formatLang_params = { + 'rounding_method': 'HALF-UP', + 'rounding_unit': options.get('rounding_unit'), + } + + if figure_type == 'monetary': + currency = self.env['res.currency'].browse(format_params['currency_id']) if 'currency_id' in format_params else self.env.company.currency_id + if options.get('multi_currency'): + formatLang_params['currency_obj'] = currency + else: + formatLang_params['digits'] = currency.decimal_places + + elif figure_type == 'integer': + formatLang_params['digits'] = 0 + + elif figure_type == 'boolean': + return _("Yes") if bool(value) else _("No") + + elif figure_type in ('date', 'datetime'): + return format_date(self.env, value) + + else: + formatLang_params['digits'] = format_params.get('digits', 1) + + if self._is_value_zero(value, figure_type, format_params): + # Make sure -0.0 becomes 0.0 + value = abs(value) + + if self._context.get('no_format'): + return value + + formatted_amount = formatLang(self.env, value, **formatLang_params) + + if figure_type == 'percentage': + return f"{formatted_amount}%" + + return formatted_amount + + @api.model + def _is_value_zero(self, amount, figure_type, format_params): + if amount is None: + return True + + if figure_type == 'monetary': + currency = self.env['res.currency'].browse(format_params['currency_id']) if 'currency_id' in format_params else self.env.company.currency_id + return currency.is_zero(amount) + elif figure_type in NUMBER_FIGURE_TYPES: + return float_is_zero(amount, precision_digits=format_params.get('digits', 0)) + else: + return False + + def format_date(self, options, dt_filter='date'): + date_from = fields.Date.from_string(options[dt_filter]['date_from']) + date_to = fields.Date.from_string(options[dt_filter]['date_to']) + return self._get_dates_period(date_from, date_to, options['date']['mode'])['string'] + + def export_file(self, options, file_generator): + self.ensure_one() + + export_options = {**options, 'export_mode': 'file'} + + return { + 'type': 'ir_actions_account_report_download', + 'data': { + 'options': json.dumps(export_options), + 'file_generator': file_generator, + } + } + + def _get_report_send_recipients(self, options): + custom_handler_model = self._get_custom_handler_model() + if custom_handler_model and hasattr(self.env[custom_handler_model], '_get_report_send_recipients'): + return self.env[custom_handler_model]._get_report_send_recipients(options) + return self.env['res.partner'] + + def export_to_pdf(self, options): + self.ensure_one() + + base_url = self.env['ir.config_parameter'].sudo().get_param('report.url') or self.env['ir.config_parameter'].sudo().get_param('web.base.url') + rcontext = { + 'mode': 'print', + 'base_url': base_url, + 'company': self.env.company, + } + + print_options = self.get_options(previous_options={**options, 'export_mode': 'print'}) + if print_options['sections']: + reports_to_print = self.env['account.report'].browse([section['id'] for section in print_options['sections']]) + else: + reports_to_print = self + + reports_options = [] + for report in reports_to_print: + reports_options.append(report.get_options(previous_options={**print_options, 'selected_section_id': report.id})) + + grouped_reports_by_format = groupby( + zip(reports_to_print, reports_options), + key=lambda report: len(report[1]['columns']) > 5 or report[1].get('horizontal_split') + ) + + footer = self.env['ir.actions.report']._render_template("odex30_account_reports.internal_layout", values=rcontext) + footer = self.env['ir.actions.report']._render_template("web.minimal_layout", values=dict(rcontext, subst=True, body=markupsafe.Markup(footer.decode()))) + + action_report = self.env['ir.actions.report'] + files_stream = [] + for is_landscape, reports_with_options in grouped_reports_by_format: + bodies = [] + + for report, report_options in reports_with_options: + bodies.append(report._get_pdf_export_html( + report_options, + report._filter_out_folded_children(report._get_lines(report_options)), + additional_context={'base_url': base_url} + )) + + files_stream.append( + io.BytesIO(action_report._run_wkhtmltopdf( + bodies, + footer=footer.decode(), + landscape=is_landscape or self._context.get('force_landscape_printing'), + specific_paperformat_args={ + 'data-report-margin-top': 10, + 'data-report-header-spacing': 10, + 'data-report-margin-bottom': 15, + } + ) + )) + + if len(files_stream) > 1: + result_stream = action_report._merge_pdfs(files_stream) + result = result_stream.getvalue() + # Close the different stream + result_stream.close() + for file_stream in files_stream: + file_stream.close() + else: + result = files_stream[0].read() + + return { + 'file_name': self.get_default_report_filename(options, 'pdf'), + 'file_content': result, + 'file_type': 'pdf', + } + + def _get_pdf_export_html(self, options, lines, additional_context=None, template=None): + report_info = self.get_report_information(options) + + custom_print_templates = report_info['custom_display'].get('pdf_export', {}) + template = custom_print_templates.get('pdf_export_main', 'odex30_account_reports.pdf_export_main') + + render_values = { + 'report': self, + 'report_title': self.name, + 'options': options, + 'table_start': markupsafe.Markup(''), + 'table_end': markupsafe.Markup(''' +

    +
    +
    + + '''), + 'column_headers_render_data': self._get_column_headers_render_data(options), + 'custom_templates': custom_print_templates, + } + if additional_context: + render_values.update(additional_context) + + if options.get('order_column'): + lines = self.sort_lines(lines, options) + + lines = self._format_lines_for_display(lines, options) + + render_values['lines'] = lines + + # Manage annotations. + render_values['annotations'] = self._build_annotations_list_for_pdf_export(options['date'], lines, report_info['annotations']) + + options['css_custom_class'] = report_info['custom_display'].get('css_custom_class', '') + + # Render. + return self.env['ir.qweb']._render(template, render_values) + + def _build_annotations_list_for_pdf_export(self, date_options, lines, annotations_per_line_id): + annotations_to_render = [] + number = 0 + for line in lines: + if line_annotations := annotations_per_line_id.get(line['id']): + line['annotations'] = [] + for annotation in line_annotations: + report_period_date_from = datetime.datetime.strptime(date_options['date_from'], '%Y-%m-%d').date() + report_period_date_to = datetime.datetime.strptime(date_options['date_to'], '%Y-%m-%d').date() + if not annotation['date'] or report_period_date_from <= annotation['date'] <= report_period_date_to: + number += 1 + line['annotations'].append(str(number)) + annotations_to_render.append({ + 'number': str(number), + 'text': annotation['text'], + 'date': format_date(self.env, annotation['date']) if annotation['date'] else None, + }) + return annotations_to_render + + def _filter_out_folded_children(self, lines): + """ Returns a list containing all the lines of the provided list that need to be displayed when printing, + hence removing the children whose parent is folded (especially useful to remove total lines). + """ + rslt = [] + folded_lines = set() + for line in lines: + if line.get('unfoldable') and not line.get('unfolded'): + folded_lines.add(line['id']) + + if 'parent_id' not in line or line['parent_id'] not in folded_lines: + rslt.append(line) + return rslt + + def export_to_xlsx(self, options, response=None): + def add_worksheet_unique_name(workbook, sheet_name): + existing_names = set(workbook.sheetnames.keys()) + count = 1 + max_length = 31 + new_sheet_name = sheet_name[:max_length] + + while new_sheet_name in existing_names: + suffix = f" ({count})" + truncated_name = sheet_name[:max_length - len(suffix)] + new_sheet_name = f"{truncated_name}{suffix}" + count += 1 + return workbook.add_worksheet(new_sheet_name) + + self.ensure_one() + output = io.BytesIO() + workbook = xlsxwriter.Workbook(output, { + 'in_memory': True, + 'strings_to_formulas': False, + }) + + print_options = self.get_options(previous_options={**options, 'export_mode': 'print'}) + if print_options['sections']: + reports_to_print = self.env['account.report'].browse([section['id'] for section in print_options['sections']]) + else: + reports_to_print = self + + reports_options = [] + for report in reports_to_print: + report_options = report.get_options(previous_options={**print_options, 'selected_section_id': report.id}) + reports_options.append(report_options) + report._inject_report_into_xlsx_sheet(report_options, workbook, add_worksheet_unique_name(workbook, report.name)) + + self._add_options_xlsx_sheet(workbook, reports_options) + + workbook.close() + output.seek(0) + generated_file = output.read() + output.close() + + return { + 'file_name': self.get_default_report_filename(options, 'xlsx'), + 'file_content': generated_file, + 'file_type': 'xlsx', + } + + @api.model + def _set_xlsx_cell_sizes(self, sheet, fonts, col, row, value, style, has_colspan): + """ This small helper will resize the cells if needed, to allow to get a better output. """ + def get_string_width(font, string): + return font.getlength(string) / 5 + + # Get the correct font for the row style + font_type = ('Bol' if style.bold else 'Reg') + ('Ita' if style.italic else '') + report_font = fonts[font_type] + + # 8.43 is the default width of a column in Excel. + if parse_version(xlsxwriter.__version__) >= parse_version('3.0.6'): + # cols_sizes was removed in 3.0.6 and colinfo was replaced by col_info + try: + col_width = sheet.col_info[col][0] + except KeyError: + col_width = 8.43 + else: + col_width = sheet.col_sizes.get(col, [8.43])[0] + + row_height = sheet.row_sizes.get(row, [8.43])[0] + + if value is None: + value = '' + else: + try: # noqa: SIM105 + # This is needed, otherwise we could compute width on very long number such as 12.0999999998 + # which wouldn't show well in the end result as the numbers are rounded. + value = float_repr(float(value), self.env.company.currency_id.decimal_places) + except (ValueError, OverflowError): + pass + + # Start by computing the width of the cell if we are not using colspans. + if not has_colspan: + # Ensure to take indents into account when computing the width. + formatted_value = f"{' ' * style.indent}{value}" + width = get_string_width( + report_font, + max(formatted_value.split('\n'), key=lambda line: get_string_width(report_font, line)) + ) + # We set the width if it is bigger than the current one, with a limit at 75 (max to avoid taking excessive space). + if width > col_width: + sheet.set_column(col, col, min(width + 4, 75)) # We need to add a little extra padding to ensure our columns are not clipping the text + + def _get_xlsx_export_fonts(self): + """ Get the bold, italic and regular LATO font information so that we can use them for format purposes. """ + fonts = {} + for font_type in ('Reg', 'Bol', 'RegIta', 'BolIta'): + try: + lato_path = f'web/static/fonts/lato/Lato-{font_type}-webfont.ttf' + fonts[font_type] = ImageFont.truetype(file_path(lato_path), 12) + except (OSError, FileNotFoundError): + # This won't give great result, but it will work. + fonts[font_type] = ImageFont.load_default() + return fonts + + def _inject_report_into_xlsx_sheet(self, options, workbook, sheet): + fonts = self._get_xlsx_export_fonts() + + def write_cell(sheet, x, y, value, style, colspan=1, datetime=False): + self._set_xlsx_cell_sizes(sheet, fonts, x, y, value, style, colspan > 1) + if colspan == 1: + if datetime: + sheet.write_datetime(y, x, value, style) + else: + sheet.write(y, x, value, style) + else: + sheet.merge_range(y, x, y, x + colspan - 1, value, style) + + default_format_props = {'font_name': 'Lato', 'font_size': 12, 'font_color': '#666666', 'num_format': '#,##0.00'} + text_format_props = {'font_name': 'Lato', 'font_size': 12, 'font_color': '#666666'} + date_format_props = {'font_name': 'Lato', 'font_size': 12, 'font_color': '#666666', 'align': 'left', 'num_format': 'yyyy-mm-dd'} + title_format = workbook.add_format({'font_name': 'Lato', 'font_size': 12, 'bold': True, 'bottom': 2}) + annotation_format = workbook.add_format({**text_format_props, 'text_wrap': True}) + workbook_formats = { + 0: { + 'default': workbook.add_format({**default_format_props, 'bold': True, 'font_size': 13, 'bottom': 6}), + 'text': workbook.add_format({**text_format_props, 'bold': True, 'font_size': 13, 'bottom': 6}), + 'date': workbook.add_format({**date_format_props, 'bold': True, 'font_size': 13, 'bottom': 6}), + 'total': workbook.add_format({**default_format_props, 'bold': True, 'font_size': 13, 'bottom': 6}), + }, + 1: { + 'default': workbook.add_format({**default_format_props, 'bold': True, 'font_size': 13, 'bottom': 1}), + 'text': workbook.add_format({**text_format_props, 'bold': True, 'font_size': 13, 'bottom': 1}), + 'date': workbook.add_format({**date_format_props, 'bold': True, 'font_size': 13, 'bottom': 1}), + 'total': workbook.add_format({**default_format_props, 'bold': True, 'font_size': 13, 'bottom': 1}), + 'default_indent': workbook.add_format({**default_format_props, 'bold': True, 'font_size': 13, 'bottom': 1, 'indent': 1}), + 'date_indent': workbook.add_format({**date_format_props, 'bold': True, 'font_size': 13, 'bottom': 1, 'indent': 1}), + }, + 2: { + 'default': workbook.add_format({**default_format_props, 'bold': True}), + 'text': workbook.add_format({**text_format_props, 'bold': True}), + 'date': workbook.add_format({**date_format_props, 'bold': True}), + 'initial': workbook.add_format(default_format_props), + 'total': workbook.add_format({**default_format_props, 'bold': True}), + 'default_indent': workbook.add_format({**default_format_props, 'bold': True, 'indent': 2}), + 'date_indent': workbook.add_format({**date_format_props, 'bold': True, 'indent': 2}), + 'initial_indent': workbook.add_format({**default_format_props, 'indent': 2}), + 'total_indent': workbook.add_format({**default_format_props, 'bold': True, 'indent': 1}), + }, + 'default': { + 'default': workbook.add_format(default_format_props), + 'text': workbook.add_format(text_format_props), + 'date': workbook.add_format(date_format_props), + 'total': workbook.add_format(default_format_props), + 'default_indent': workbook.add_format({**default_format_props, 'indent': 2}), + 'date_indent': workbook.add_format({**date_format_props, 'indent': 2}), + 'total_indent': workbook.add_format({**default_format_props, 'indent': 2}), + }, + } + + def get_format(content_type='default', level='default'): + if isinstance(level, int) and level not in workbook_formats: + workbook_formats[level] = { + **workbook_formats['default'], + 'default_indent': workbook.add_format({**default_format_props, 'indent': level}), + 'date_indent': workbook.add_format({**date_format_props, 'indent': level}), + 'total_indent': workbook.add_format({**default_format_props, 'bold': True, 'indent': level - 1}), + } + + level_formats = workbook_formats[level] + if '_indent' in content_type and not level_formats.get(content_type): + return level_formats.get('default_indent', level_formats.get(content_type.removesuffix('_indent'), level_formats['default'])) + return level_formats.get(content_type, level_formats['default']) + + print_mode_self = self.with_context(no_format=True) + lines = self._filter_out_folded_children(print_mode_self._get_lines(options)) + annotations = self.get_annotations(options) + + # For reports with lines generated for accounts, the account name and codes are shown in a single column. + # To help user post-process the report if they need, we should in such a case split the account name and code in two columns. + account_lines_split_names = {} + for line in lines: + line_model = self._get_model_info_from_id(line['id'])[0] + if line_model == 'account.account': + # Reuse the _split_code_name to split the name and code in two values. + account_lines_split_names[line['id']] = self.env['account.account']._split_code_name(line['name']) + + # Set the (Account) Name column width to 50. + # If we have account lines and split the name and code in two columns, we will also set the code column. + if len(account_lines_split_names) > 0: + sheet.set_column(0, 0, 13) + sheet.set_column(1, 1, 50) + else: + sheet.set_column(0, 0, 50) + + if not options.get('no_xlsx_currency_code_columns'): + self._add_xlsx_currency_codes_columns(options, lines) + + original_x_offset = 1 if len(account_lines_split_names) > 0 else 0 + + y_offset = 0 + # 1 and not 0 to leave space for the line name. original_x_offset allows making place for the code column if needed. + x_offset = original_x_offset + 1 + + # Add headers. + # For this, iterate in the same way as done in main_table_header template + column_headers_render_data = self._get_column_headers_render_data(options) + for header_level_index, header_level in enumerate(options['column_headers']): + for header_to_render in header_level * column_headers_render_data['level_repetitions'][header_level_index]: + colspan = header_to_render.get('colspan', column_headers_render_data['level_colspan'][header_level_index]) + write_cell(sheet, x_offset, y_offset, header_to_render.get('name', ''), title_format, colspan + (1 if options['show_horizontal_group_total'] and header_level_index == 0 else 0)) + x_offset += colspan + if options.get('column_percent_comparison') == 'growth': + write_cell(sheet, x_offset, y_offset, '%', title_format) + x_offset += 1 + + if options['show_horizontal_group_total'] and header_level_index != 0: + horizontal_group_name = next((group['name'] for group in options['available_horizontal_groups'] if group['id'] == options['selected_horizontal_group_id']), None) + write_cell(sheet, x_offset, y_offset, horizontal_group_name, title_format) + x_offset += 1 + if annotations: + annotations_x_offset = x_offset + write_cell(sheet, annotations_x_offset, y_offset, 'Annotations', title_format) + x_offset += 1 + y_offset += 1 + x_offset = original_x_offset + 1 + + for subheader in column_headers_render_data['custom_subheaders']: + colspan = subheader.get('colspan', 1) + write_cell(sheet, x_offset, y_offset, subheader.get('name', ''), title_format, colspan) + x_offset += colspan + y_offset += 1 + x_offset = original_x_offset + 1 + + if account_lines_split_names: + # If we have a separate account code column, add a title for it + write_cell(sheet, x_offset - 2, y_offset, _("Code"), title_format) + write_cell(sheet, x_offset - 1, y_offset, _("Account Name"), title_format) + sheet.set_column(x_offset, x_offset + len(options['columns']), 10) + + for column in options['columns']: + colspan = column.get('colspan', 1) + write_cell(sheet, x_offset, y_offset, column.get('name', ''), title_format, colspan) + x_offset += colspan + + if options['show_horizontal_group_total']: + write_cell(sheet, x_offset, y_offset, options['columns'][0].get('name', ''), title_format, colspan) + + if options.get('column_percent_comparison') == 'growth': + write_cell(sheet, x_offset, y_offset, '', title_format, colspan) + y_offset += 1 + + if options.get('order_column'): + lines = self.sort_lines(lines, options) + + # Disable bold styling for the max level. + max_level = max(line.get('level', -1) for line in lines) if lines else -1 + if max_level in {0, 1, 2}: + # Total lines are supposed to be a level above, so we don't touch them. + for wb_format in (s for s in workbook_formats[max_level] if 'total' not in s): + workbook_formats[max_level][wb_format].set_bold(False) + + # Add lines. + counter = 1 + for y, line in enumerate(lines): + level = line.get('level') + if level == 0: + y_offset += 1 + elif not level: + level = 'default' + + line_id = self._parse_line_id(line.get('id')) + is_initial_line = line_id[-1][0] == 'initial' if line_id else False + is_total_line = line_id[-1][0] == 'total' if line_id else False + + # Write the first column(s), with a specific style to manage the indentation. + cell_type, cell_value = self._get_cell_type_value(line) + account_code_cell_format = get_format('text', level) + + if cell_type == 'date': + cell_format = get_format('date_indent', level) + elif is_initial_line: + cell_format = get_format('initial_indent', level) + elif is_total_line: + cell_format = get_format('total_indent', level) + else: + cell_format = get_format('default_indent', level) + + x_offset = original_x_offset + 1 + if lines[y]['id'] in account_lines_split_names: + # Write the Account Code and Name columns. + code, name = account_lines_split_names[lines[y]['id']] + # Don't indent the account code and don't format is as a monetary value either. + write_cell(sheet, 0, y + y_offset, code, account_code_cell_format) + write_cell(sheet, 1, y + y_offset, name, cell_format) + else: + write_cell(sheet, original_x_offset, y + y_offset, cell_value, cell_format, datetime=cell_type == 'date') + + if 'parent_id' in line and line['parent_id'] in account_lines_split_names: + write_cell(sheet, 1 + original_x_offset, y + y_offset, account_lines_split_names[line['parent_id']][0], account_code_cell_format) + elif account_lines_split_names: + write_cell(sheet, 1 + original_x_offset, y + y_offset, "", account_code_cell_format) + + # Write all the remaining cells. + columns = line['columns'] + if options.get('column_percent_comparison') and 'column_percent_comparison_data' in line: + columns += [line['column_percent_comparison_data']] + + if options['show_horizontal_group_total']: + columns += [line.get('horizontal_group_total_data', {'name': 0})] + for x, column in enumerate(columns, start=x_offset): + cell_type, cell_value = self._get_cell_type_value(column) + if cell_type == 'date': + cell_format = get_format('date', level) + elif is_initial_line: + cell_format = get_format('initial', level) + elif is_total_line: + cell_format = get_format('total', level) + else: + cell_format = get_format('default', level) + write_cell(sheet, x + line.get('colspan', 1) - 1, y + y_offset, cell_value, cell_format, datetime=cell_type == 'date') + + # Write annotations. + if annotations and (line_annotations := annotations.get(line['id'])): + line_annotation_text = [] + for line_annotation in line_annotations: + line_annotation_text.append(f"{counter} - {line_annotation['text']}") + counter += 1 + write_cell(sheet, annotations_x_offset, y + y_offset, "\n".join(line_annotation_text), annotation_format) + + def _add_xlsx_currency_codes_columns(self, options, lines): + """ Adds a 'Currency Code' column for each column displaying amounts in foreign currencies. This is done because + the raw number is displayed on the xlsx file, making it impossible to know the currency used. + To have it displayed, the line must have an expression label starting with '_currency_' """ + required_currency_code_columns = { + label.removeprefix('_currency_') + for label in self.line_ids.expression_ids.mapped('label') + if label.startswith('_currency_') + } + + new_columns = [] + for col in options['columns']: + new_columns.append(col) + + if col['expression_label'] in required_currency_code_columns: + new_columns.append({ + **col, + 'name': _("Currency Code"), + 'figure_type': 'string', + 'expression_label': f"_xlsx_currency_code_{col['expression_label']}" + }) + + options['columns'] = new_columns + + # Add 'Currency Code' values to each line + for line in lines: + new_column_values = [] + + for index, col_data in enumerate(line['columns']): + new_column_values.append(col_data) + + if col_data.get('expression_label') in required_currency_code_columns: + currency = col_data.get('currency') + currency_code = currency.name if currency else '' + new_column = self._build_column_dict(currency_code, options['columns'][index+1], options) + new_column['name'] = new_column['no_format'] + new_column_values.append(new_column) + + line['columns'] = new_column_values + + def _add_options_xlsx_sheet(self, workbook, options_list): + """Adds a new sheet for xlsx report exports with a summary of all filters and options activated at the moment of the export.""" + filters_sheet = workbook.add_worksheet(_("Filters")) + # Set first and second column widths. + filters_sheet.set_column(0, 0, 20) + filters_sheet.set_column(1, 1, 50) + name_style = workbook.add_format({'font_name': 'Arial', 'bold': True, 'bottom': 2}) + y_offset = 0 + + if len(options_list) == 1: + self.env['account.report'].browse(options_list[0]['report_id'])._inject_report_options_into_xlsx_sheet(options_list[0], filters_sheet, y_offset) + return + + # Find uncommon keys + options_sets = list(map(set, options_list)) + common_keys = set.intersection(*options_sets) + all_keys = set.union(*options_sets) + uncommon_options_keys = all_keys - common_keys + # Try to find the common filter values between all reports to avoid duplication. + common_options_values = {} + for key in common_keys: + first_value = options_list[0][key] + if all(options[key] == first_value for options in options_list[1:]): + common_options_values[key] = first_value + else: + uncommon_options_keys.add(key) + + # Write common options to the sheet. + filters_sheet.write(y_offset, 0, _("All"), name_style) + y_offset += 1 + y_offset = self._inject_report_options_into_xlsx_sheet(common_options_values, filters_sheet, y_offset) + + for report_options in options_list: + report = self.env['account.report'].browse(report_options['report_id']) + + filters_sheet.write(y_offset, 0, report.name, name_style) + y_offset += 1 + new_offset = report._inject_report_options_into_xlsx_sheet(report_options, filters_sheet, y_offset, uncommon_options_keys) + + if y_offset == new_offset: + y_offset -= 1 + # Clear the report name's cell since it didn't add any data to the xlsx. + filters_sheet.write(y_offset, 0, " ") + else: + y_offset = new_offset + + def _inject_report_options_into_xlsx_sheet(self, options, sheet, y_offset, options_to_print=None): + """ + Injects the report options into the filters sheet. + + :param options: Dictionary containing report options. + :param sheet: XLSX sheet to inject options into. + :param y_offset: Offset for the vertical position in the sheet. + :param options_to_print: Optional list of names to print. If not provided, all printable options will be included. + """ + def write_filter_lines(filter_title, filter_lines, y_offset): + sheet.write(y_offset, 0, filter_title) + for line in filter_lines: + sheet.write(y_offset, 1, line) + y_offset += 1 + return y_offset + + def should_print_option(option_key): + """Check if the option should be printed based on options_to_print.""" + return not options_to_print or option_key in options_to_print + + # Company + if should_print_option('companies'): + companies = options['companies'] + title = _("Companies") if len(companies) > 1 else _("Company") + lines = [company['name'] for company in companies] + y_offset = write_filter_lines(title, lines, y_offset) + + # Journals + if should_print_option('journals') and (journals := options.get('journals')): + journal_titles = [journal.get('title') for journal in journals if journal.get('selected')] + if journal_titles: + y_offset = write_filter_lines(_("Journals"), journal_titles, y_offset) + + # Partners + if should_print_option('selected_partner_ids') and (partner_names := options.get('selected_partner_ids')): + y_offset = write_filter_lines(_("Partners"), partner_names, y_offset) + + # Partner categories + if should_print_option('selected_partner_categories') and (partner_categories := options.get('selected_partner_categories')): + y_offset = write_filter_lines(_("Partner Categories"), partner_categories, y_offset) + + # Horizontal groups + if should_print_option('selected_horizontal_group_id') and (group_id := options.get('selected_horizontal_group_id')): + for horizontal_group in options['available_horizontal_groups']: + if horizontal_group['id'] == group_id: + filter_name = horizontal_group['name'] + y_offset = write_filter_lines(_("Horizontal Group"), [filter_name], y_offset) + break + + # Currency + if should_print_option('company_currency') and options.get('company_currency'): + y_offset = write_filter_lines(_("Company Currency"), [options['company_currency']['currency_name']], y_offset) + + # Filters + if should_print_option('aml_ir_filters'): + if options.get('aml_ir_filters') and any(opt['selected'] for opt in options['aml_ir_filters']): + filter_names = [opt['name'] for opt in options['aml_ir_filters'] if opt['selected']] + y_offset = write_filter_lines(_("Filters"), filter_names, y_offset) + + # Extra options + # Array of tuples for the extra options: (name, option_key, condition) + extra_options = [ + (_("With Draft Entries"), 'all_entries', self.filter_show_draft), + (_("Unreconciled Entries"), 'unreconciled', self.filter_unreconciled), + (_("Including Analytic Simulations"), 'include_analytic_without_aml', True) + ] + filter_names = [ + name for name, option_key, condition in extra_options + if (not options_to_print or option_key in options_to_print) and condition and options.get(option_key) + ] + if filter_names: + y_offset = write_filter_lines(_("Options"), filter_names, y_offset) + + return y_offset + + def _get_cell_type_value(self, cell): + if 'date' not in cell.get('class', '') or not cell.get('name'): + # cell is not a date + return ('text', cell.get('name', '')) + if isinstance(cell['name'], (float, datetime.date, datetime.datetime)): + # the date is xlsx compatible + return ('date', cell['name']) + try: + # the date is parsable to a xlsx compatible date + lg = get_lang(self.env, self.env.user.lang) + return ('date', datetime.datetime.strptime(cell['name'], lg.date_format)) + except: + # the date is not parsable thus is returned as text + return ('text', cell['name']) + + def get_vat_for_export(self, options, raise_warning=True): + """ Returns the VAT number to use when exporting this report with the provided + options. If a single fiscal_position option is set, its VAT number will be + used; else the current company's will be, raising an error if its empty. + """ + self.ensure_one() + + if self.filter_multi_company == 'tax_units' and options['tax_unit'] != 'company_only': + tax_unit = self.env['account.tax.unit'].browse(options['tax_unit']) + return tax_unit.vat + + if options['fiscal_position'] in {'all', 'domestic'}: + company = self._get_sender_company_for_export(options) + if not company.vat and raise_warning: + action = self.env.ref('base.action_res_company_form') + raise RedirectWarning(_('No VAT number associated with your company. Please define one.'), action.id, _("Company Settings")) + return company.vat + + fiscal_position = self.env['account.fiscal.position'].browse(options['fiscal_position']) + return fiscal_position.foreign_vat + + @api.model + def get_report_company_ids(self, options): + """ Returns a list containing the ids of the companies to be used to + render this report, following the provided options. + """ + return [comp_data['id'] for comp_data in options['companies']] + + def _get_partner_and_general_ledger_initial_balance_line(self, options, parent_line_id, eval_dict, account_currency=None, level_shift=0): + """ Helper to generate dynamic 'initial balance' lines, used by general ledger and partner ledger. + """ + line_columns = [] + for column in options['columns']: + col_value = eval_dict[column['column_group_key']].get(column['expression_label']) + col_expr_label = column['expression_label'] + + if col_value is None or (col_expr_label == 'amount_currency' and not account_currency): + line_columns.append(self._build_column_dict(None, None)) + else: + line_columns.append(self._build_column_dict( + col_value, + column, + options=options, + currency=account_currency if col_expr_label == 'amount_currency' else None, + )) + + # Display unfold & initial balance even when debit/credit column is hidden and the balance == 0 + if not any(isinstance(column.get('no_format'), (int, float)) and column.get('expression_label') != 'balance' for column in line_columns): + return None + + return { + 'id': self._get_generic_line_id(None, None, parent_line_id=parent_line_id, markup='initial'), + 'name': _("Initial Balance"), + 'level': 3 + level_shift, + 'parent_id': parent_line_id, + 'columns': line_columns, + } + + def _compute_column_percent_comparison_data(self, options, value1, value2, green_on_positive=True): + ''' Helper to get the additional columns due to the growth comparison feature. When only one comparison is + requested, an additional column is there to show the percentage of growth based on the compared period. + :param options: The report options. + :param value1: The value in the current period. + :param value2: The value in the compared period. + :param green_on_positive: A flag customizing the value with a green color depending if the growth is positive. + :return: The new columns to add to line['columns']. + ''' + if value1 is None or value2 is None or float_is_zero(value2, precision_rounding=0.1): + return {'name': _('n/a'), 'mode': 'muted'} + + comparison_type = options['column_percent_comparison'] + if comparison_type == 'growth': + + values_diff = value1 - value2 + growth = round(values_diff / value2 * 100, 1) + + # In case the comparison is made on a negative figure, the color should be the other + # way around. For example: + # 2018 2017 % + # Product Sales 1000.00 -1000.00 -200.0% + # + # The percentage is negative, which is mathematically correct, but my sales increased + # => it should be green, not red! + if float_is_zero(growth, 1): + return {'name': '0.0%', 'mode': 'muted'} + else: + return { + 'name': f"{float_repr(growth, 1)}%", + 'mode': 'red' if ((values_diff > 0) ^ green_on_positive) else 'green', + } + + elif comparison_type == 'budget': + percentage_value = value1 / value2 * 100 + if float_is_zero(percentage_value, 1): + # To avoid negative 0 + return {'name': '0.0%', 'mode': 'green'} + + comparison_value = float_compare(value1, value2, 1) + return { + 'name': f"{float_repr(percentage_value, 1)}%", + 'mode': 'green' if (comparison_value >= 0 and green_on_positive) or (comparison_value == -1 and not green_on_positive) else 'red', + } + + def _set_budget_column_comparisons(self, options, line): + """ + Set the percentage values in the budget columns + """ + for col_index, col in enumerate(line['columns']): + col_group_data = options['column_groups'][col['column_group_key']] + if 'budget_percentage' in col_group_data.get('forced_options'): + budget_id = col_group_data['forced_options']['budget_percentage'] + date_key = col_group_data.get('forced_options', {}).get('date') + if not date_key: + continue + + budget_base_col = None + budget_amount_col = None + for line_col in line['columns']: + other_col_group_key = line_col['column_group_key'] + other_col_options = options['column_groups'][other_col_group_key] + if other_col_options.get('forced_options', {}).get('date') == date_key: + if other_col_options.get('forced_options', {}).get('budget_base') and line_col['figure_type'] == 'monetary': + budget_base_col = line_col + elif other_col_options.get('forced_options', {}).get('compute_budget') == budget_id: + budget_amount_col = line_col + + value = self._compute_column_percent_comparison_data( + options, + budget_base_col['no_format'], + budget_amount_col['no_format'], + green_on_positive=budget_base_col['green_on_positive'], + ) + comparison_column = self._build_column_dict( + value['name'], + { + **budget_amount_col, + 'figure_type': 'string', + 'comparison_mode': value['mode'], + } + ) + line['columns'][col_index] = comparison_column + + def _check_groupby_fields(self, groupby_fields_name: list[str] | str): + """ Checks that each string in the groupby_fields_name list is a valid groupby value for an accounting report. + So it must be: + - a field from account.move.line which is (1) searchable and (2) for which _field_to_sql is implemented, + this includes stored and related non-stored fields, or + - a custom value allowed by the _get_custom_groupby_map function of the custom handler + """ + self.ensure_one() + if isinstance(groupby_fields_name, str | bool): + groupby_fields_name = groupby_fields_name.split(',') if groupby_fields_name else [] + + for field_name in (fname.strip() for fname in groupby_fields_name): + groupby_field = self.env['account.move.line']._fields.get(field_name) + if groupby_field: + if not groupby_field._description_searchable: + raise UserError(self.env._("Field %s of account.move.line is not searchable and can therefore not be used in a groupby expression.", field_name)) + try: + self.env['account.move.line']._field_to_sql('account_move_line', field_name, Query(self.env, 'account_move_line')) + except ValueError: + raise UserError(self.env._("Field %s of account.move.line cannot be used in a groupby expression.", field_name)) from None + elif (custom_handler_name := self._get_custom_handler_model()): + if field_name not in self.env[custom_handler_name]._get_custom_groupby_map(): + raise UserError(_("Field %s does not exist on account.move.line, and is not supported by this report's custom handler.", field_name)) + else: + raise UserError(_("Field %s does not exist on account.move.line.", field_name)) + + # ============ Accounts Coverage Debugging Tool - START ================ + @api.depends('country_id', 'chart_template', 'root_report_id') + def _compute_is_account_coverage_report_available(self): + for report in self: + report.is_account_coverage_report_available = ( + ( + report.availability_condition == 'country' and self.env.company.account_fiscal_country_id == report.country_id + or + report.availability_condition == 'coa' and self.env.company.chart_template == report.chart_template + or + report.availability_condition == 'always' + ) + and + report.root_report_id in ( + self.env.ref('odex30_account_reports.profit_and_loss', raise_if_not_found=False), + self.env.ref('odex30_account_reports.balance_sheet', raise_if_not_found=False) + ) + ) + + def action_download_xlsx_accounts_coverage_report(self): + """ + Generate an XLSX file that can be used to debug the + report by issuing the following warnings if applicable: + - an account exists in the Chart of Accounts but is not mentioned in any line of the report (red) + - an account is reported in multiple lines of the report (orange) + - an account is reported in a line of the report but does not exist in the Chart of Accounts (yellow) + """ + self.ensure_one() + if not self.is_account_coverage_report_available: + raise UserError(_("The Accounts Coverage Report is not available for this report.")) + + output = io.BytesIO() + workbook = xlsxwriter.Workbook(output, {'in_memory': True}) + worksheet = workbook.add_worksheet(_('Accounts coverage')) + worksheet.set_column(0, 0, 20) + worksheet.set_column(1, 1, 75) + worksheet.set_column(2, 2, 80) + worksheet.freeze_panes(1, 0) + + headers = [_("Account Code / Tag"), _("Error message"), _("Report lines mentioning the account code"), '#FFFFFF'] + lines = [headers] + self._generate_accounts_coverage_report_xlsx_lines() + for i, line in enumerate(lines): + worksheet.write_row(i, 0, line[:-1], workbook.add_format({'bg_color': line[-1]})) + + workbook.close() + attachment_id = self.env['ir.attachment'].create({ + 'name': f"{self.display_name} - {_('Accounts Coverage Report')}", + 'datas': base64.encodebytes(output.getvalue()) + }) + return { + "type": "ir.actions.act_url", + "url": f"/web/content/{attachment_id.id}", + "target": "download", + } + + def _generate_accounts_coverage_report_xlsx_lines(self): + """ + Generate the lines of the XLSX file that can be used to debug the + report by issuing the following warnings if applicable: + - an account exists in the Chart of Accounts but is not mentioned in any line of the report (red) + - an account is reported in multiple lines of the report (orange) + - an account is reported in a line of the report but does not exist in the Chart of Accounts (yellow) + """ + def get_account_domain(prefix): + # Helper function to get the right domain to find the account + # This function verifies if we have to look for a tag or if we have + # to look for an account code. + if tag_matching := ACCOUNT_CODES_ENGINE_TAG_ID_PREFIX_REGEX.match(prefix): + if tag_matching['ref']: + account_tag_id = self.env['ir.model.data']._xmlid_to_res_id(tag_matching['ref']) + else: + account_tag_id = int(tag_matching['id']) + return 'tag_ids', 'in', (account_tag_id,) + else: + return 'code', '=like', f'{prefix}%' + + self.ensure_one() + + all_reported_accounts = self.env["account.account"] # All accounts mentioned in the report (including those reported without using the account code) + accounts_by_expressions = {} # {expression_id: account.account objects} + reported_account_codes = [] # [{'prefix': ..., 'balance': ..., 'exclude': ..., 'line': ...}, ...] + non_existing_codes = defaultdict(lambda: self.env["account.report.line"]) # {non_existing_account_code: {lines_with_that_code,}} + lines_per_non_linked_tag = defaultdict(lambda: self.env['account.report.line']) + lines_using_bad_operator_per_tag = defaultdict(lambda: self.env['account.report.line']) + candidate_duplicate_codes = defaultdict(lambda: self.env["account.report.line"]) # {candidate_duplicate_account_code: {lines_with_that_code,}} + duplicate_codes = defaultdict(lambda: self.env["account.report.line"]) # {verified duplicate_account_code: {lines_with_that_code,}} + duplicate_codes_same_line = defaultdict(lambda: self.env["account.report.line"]) # {duplicate_account_code: {line_with_that_code_multiple_times,}} + common_account_domain = [ + *self.env['account.account']._check_company_domain(self.env.company), + ('deprecated', '=', False), + ] + + # tag_ids already linked to an account - avoid several search_count to know if the tag is used or not + tag_ids_linked_to_account = set(self.env['account.account'].search([('tag_ids', '!=', False)]).tag_ids.ids) + + expressions = self.line_ids.expression_ids._expand_aggregations() + for i, expr in enumerate(expressions): + reported_accounts = self.env["account.account"] + if expr.engine == "domain": + domain = literal_eval(expr.formula.strip()) + accounts_domain = [] + for j, operand in enumerate(domain): + if isinstance(operand, tuple): + operand = list(operand) + # Skip tuples that will not be used in the new domain to retrieve the reported accounts + if not operand[0].startswith('account_id.'): + if domain[j - 1] in ("&", "|", "!"): # Remove the operator linked to the tuple if it exists + accounts_domain.pop() + continue + operand[0] = operand[0].replace('account_id.', '') + # Check that the code exists in the CoA + if operand[0] == 'code' and not self.env["account.account"].search_count([operand]): + non_existing_codes[operand[2]] |= expr.report_line_id + elif operand[0] == 'tag_ids': + tag_ids = operand[2] + if not isinstance(tag_ids, (list, tuple, set)): + tag_ids = [tag_ids] + + if operand[1] in ('=', 'in'): + tag_ids_to_browse = [tag_id for tag_id in tag_ids if tag_id not in tag_ids_linked_to_account] + for tag in self.env['account.account.tag'].browse(tag_ids_to_browse): + lines_per_non_linked_tag[f'{tag.name} ({tag.id})'] |= expr.report_line_id + else: + for tag in self.env['account.account.tag'].browse(tag_ids): + lines_using_bad_operator_per_tag[f'{tag.name} ({tag.id}) - Operator: {operand[1]}'] |= expr.report_line_id + + accounts_domain.append(operand) + reported_accounts += self.env['account.account'].search(accounts_domain) + elif expr.engine == "account_codes": + account_codes = [] + for token in ACCOUNT_CODES_ENGINE_SPLIT_REGEX.split(expr.formula.replace(' ', '')): + if not token: + continue + token_match = ACCOUNT_CODES_ENGINE_TERM_REGEX.match(token) + if not token_match: + continue + + parsed_token = token_match.groupdict() + account_codes.append({ + 'prefix': parsed_token['prefix'], + 'balance': parsed_token['balance_character'], + 'exclude': parsed_token['excluded_prefixes'].split(',') if parsed_token['excluded_prefixes'] else [], + 'line': expr.report_line_id, + }) + + for account_code in account_codes: + reported_account_codes.append(account_code) + exclude_domain_accounts = [get_account_domain(exclude_code) for exclude_code in account_code['exclude']] + reported_accounts += self.env["account.account"].search([ + *common_account_domain, + get_account_domain(account_code['prefix']), + *[excl_domain for excl_tuple in exclude_domain_accounts for excl_domain in ("!", excl_tuple)], + ]) + + # Check that the code exists in the CoA or that the tag is linked to an account + prefixes_to_check = [account_code['prefix']] + account_code['exclude'] + for prefix_to_check in prefixes_to_check: + account_domain = get_account_domain(prefix_to_check) + if not self.env["account.account"].search_count([ + *common_account_domain, + account_domain, + ]): + # Identify if we're working with account codes or account tags + if account_domain[0] == 'code': + non_existing_codes[prefix_to_check] |= account_code['line'] + elif account_domain[0] == 'tag_ids': + lines_per_non_linked_tag[prefix_to_check] |= account_code['line'] + + all_reported_accounts |= reported_accounts + accounts_by_expressions[expr.id] = reported_accounts + + # Check if an account is reported multiple times in the same line of the report + if len(reported_accounts) != len(set(reported_accounts)): + seen = set() + for reported_account in reported_accounts: + if reported_account not in seen: + seen.add(reported_account) + else: + duplicate_codes_same_line[reported_account.code] |= expr.report_line_id + + # Check if the account is reported in multiple lines of the report + for expr2 in expressions[:i + 1]: + reported_accounts2 = accounts_by_expressions[expr2.id] + for duplicate_account in (reported_accounts & reported_accounts2): + if len(expr.report_line_id | expr2.report_line_id) > 1 \ + and expr.date_scope == expr2.date_scope \ + and expr.subformula == expr2.subformula: + candidate_duplicate_codes[duplicate_account.code] |= expr.report_line_id | expr2.report_line_id + + # Check that the duplicates are not false positives because of the balance character + for candidate_duplicate_code, candidate_duplicate_lines in candidate_duplicate_codes.items(): + seen_balance_chars = [] + for reported_account_code in reported_account_codes: + if candidate_duplicate_code.startswith(reported_account_code['prefix']) and reported_account_code['balance']: + seen_balance_chars.append(reported_account_code['balance']) + if not seen_balance_chars or seen_balance_chars.count("C") > 1 or seen_balance_chars.count("D") > 1: + duplicate_codes[candidate_duplicate_code] |= candidate_duplicate_lines + + # Check that all codes in CoA are correctly reported + if self.root_report_id == self.env.ref('odex30_account_reports.profit_and_loss'): + accounts_in_coa = self.env["account.account"].search([ + *common_account_domain, + ('account_type', 'in', ("income", "income_other", "expense", "expense_depreciation", "expense_direct_cost")), + ('account_type', '!=', "off_balance"), + ]) + else: # Balance Sheet + accounts_in_coa = self.env["account.account"].search([ + *common_account_domain, + ('account_type', 'not in', ("off_balance", "income", "income_other", "expense", "expense_depreciation", "expense_direct_cost")) + ]) + + # Compute codes that exist in the CoA but are not reported in the report + non_reported_codes = set((accounts_in_coa - all_reported_accounts).mapped('code')) + + # Create the lines that will be displayed in the xlsx + all_reported_codes = sorted(set(all_reported_accounts.mapped("code")) | non_reported_codes | non_existing_codes.keys()) + errors_trie = self._get_accounts_coverage_report_errors_trie(all_reported_codes, non_reported_codes, duplicate_codes, duplicate_codes_same_line, non_existing_codes) + errors_trie['children'].update(**self._get_account_tag_coverage_report_errors_trie(lines_per_non_linked_tag, lines_using_bad_operator_per_tag)) # Add tags that are not linked to an account + + errors_trie = self._regroup_accounts_coverage_report_errors_trie(errors_trie) + return self._get_accounts_coverage_report_coverage_lines("", errors_trie) + + def _get_accounts_coverage_report_errors_trie(self, all_reported_codes, non_reported_codes, duplicate_codes, duplicate_codes_same_line, non_existing_codes): + """ + Create the trie that will be used to regroup the same errors on the same subcodes. + This trie will be in the form of: + { + "children": { + "1": { + "children": { + "10": { ... }, + "11": { ... }, + }, + "lines": { + "Line1", + "Line2", + }, + "errors": { + "DUPLICATE" + } + }, + "lines": { + "", + }, + "errors": { + None # Avoid that all codes are merged into the root with the code "" in case all of the errors are the same + }, + } + """ + errors_trie = {"children": {}, "lines": {}, "errors": {None}} + for reported_code in all_reported_codes: + current_trie = errors_trie + lines = self.env["account.report.line"] + errors = set() + if reported_code in non_reported_codes: + errors.add("NON_REPORTED") + elif reported_code in duplicate_codes_same_line: + lines |= duplicate_codes_same_line[reported_code] + errors.add("DUPLICATE_SAME_LINE") + elif reported_code in duplicate_codes: + lines |= duplicate_codes[reported_code] + errors.add("DUPLICATE") + elif reported_code in non_existing_codes: + lines |= non_existing_codes[reported_code] + errors.add("NON_EXISTING") + else: + errors.add("NONE") + + for j in range(1, len(reported_code) + 1): + current_trie = current_trie["children"].setdefault(reported_code[:j], { + "children": {}, + "lines": lines, + "errors": errors + }) + return errors_trie + + @api.model + def _get_account_tag_coverage_report_errors_trie(self, lines_per_non_linked_tag, lines_per_bad_operator_tag): + """ As we don't want to make a hierarchy for tags, we use a specific + function to handle tags. + """ + errors = { + non_linked_tag: { + 'children': {}, + 'lines': line, + 'errors': {'NON_LINKED'}, + } + for non_linked_tag, line in lines_per_non_linked_tag.items() + } + errors.update({ + bad_operator_tag: { + 'children': {}, + 'lines': line, + 'errors': {'BAD_OPERATOR'}, + } + for bad_operator_tag, line in lines_per_bad_operator_tag.items() + }) + return errors + + def _regroup_accounts_coverage_report_errors_trie(self, trie): + """ + Regroup the codes that have the same error under the same common subcode/prefix. + This is done in-place on the given trie. + """ + if trie.get("children"): + children_errors = set() + children_lines = self.env["account.report.line"] + if trie.get("errors"): # Add own error + children_errors |= set(trie.get("errors")) + for child in trie["children"].values(): + regroup = self._regroup_accounts_coverage_report_errors_trie(child) + children_lines |= regroup["lines"] + children_errors |= set(regroup["errors"]) + if len(children_errors) == 1 and children_lines and children_lines == trie["lines"]: + trie["children"] = {} + trie["lines"] = children_lines + trie["errors"] = children_errors + return trie + + def _get_accounts_coverage_report_coverage_lines(self, subcode, trie, coverage_lines=None): + """ + Create the coverage lines from the grouped trie. Each line has + - the account code + - the error message + - the lines on which the account code is used + - the color of the error message for the xlsx + """ + # Dictionnary of the three possible errors, their message and the corresponding color for the xlsx file + ERRORS = { + "NON_REPORTED": { + "msg": _("This account exists in the Chart of Accounts but is not mentioned in any line of the report"), + "color": "#FF0000" + }, + "DUPLICATE": { + "msg": _("This account is reported in multiple lines of the report"), + "color": "#FF8916" + }, + "DUPLICATE_SAME_LINE": { + "msg": _("This account is reported multiple times on the same line of the report"), + "color": "#E6A91D" + }, + "NON_EXISTING": { + "msg": _("This account is reported in a line of the report but does not exist in the Chart of Accounts"), + "color": "#FFBF00" + }, + "NON_LINKED": { + "msg": _("This tag is reported in a line of the report but is not linked to any account of the Chart of Accounts"), + "color": "#FFBF00", + }, + "BAD_OPERATOR": { + "msg": _("The used operator is not supported for this expression."), + "color": "#FFBF00", + } + } + if coverage_lines is None: + coverage_lines = [] + if trie.get("children"): + for child in trie.get("children"): + self._get_accounts_coverage_report_coverage_lines(child, trie["children"][child], coverage_lines) + else: + error = list(trie["errors"])[0] if trie["errors"] else False + if error and error != "NONE": + coverage_lines.append([ + subcode, + ERRORS[error]["msg"], + " + ".join(trie["lines"].sorted().mapped("name")), + ERRORS[error]["color"] + ]) + return coverage_lines + + # ============ Accounts Coverage Debugging Tool - END ================ + + def _generate_file_data_with_error_check(self, options, content_generator, generator_params, errors): + """ Checks for critical errors (i.e. errors that would cause the rendering to fail) in the generator values. + If at least one error is critical, the 'account.report.file.download.error.wizard' wizard is opened + before rendering the file, so they can be fixed. + If there are only non-critical errors, the wizard is opened after the file has been generated, + allowing the user to download it anyway. + + :param dict options: The report options. + :param def content_generator: The function used to generate the exported content. + :param dict generator_params: The parameters passed to the 'content_generator' method (List). + :param list errors: A list of errors in the following format: + [ + { + 'message': The error message to be displayed in the wizard (String), + 'action_text': The text of the action button (String), + 'action': Contains the action values (Dictionary), + 'level': One of 'info', 'warning', 'danger'. (String). + Only the 'danger' level represents a blocking error. + }, + {...}, + ] + :returns: The data that will be used by the file generator. + :rtype: dict + """ + if errors is None: + errors = [] + self.ensure_one() + if any(error_value.get('level') == 'danger' for error_value in errors.values()): + raise AccountReportFileDownloadException(errors) + + content = content_generator(**generator_params) + + file_data = { + 'file_name': self.get_default_report_filename(options, generator_params['file_type']), + 'file_content': re.sub(r'\n\s*\n', '\n', content).encode(), + 'file_type': generator_params['file_type'], + } + + if errors: + raise AccountReportFileDownloadException(errors, file_data) + + return file_data + + def action_create_composite_report(self): + return { + 'type': 'ir.actions.act_window', + 'res_model': 'account.report', + 'views': [[False, 'form']], + 'context': { + 'default_section_report_ids': self.ids, + } + } + + def show_error_branch_allowed(self, *args, **kwargs): + raise UserError(_("Please select the main company and its branches in the company selector to proceed.")) + + +class AccountReportLine(models.Model): + _inherit = 'account.report.line' + + display_custom_groupby_warning = fields.Boolean(compute='_compute_display_custom_groupby_warning') + + @api.depends('groupby', 'user_groupby') + def _compute_display_custom_groupby_warning(self): + for line in self: + line.display_custom_groupby_warning = line.get_external_id()[line.id] and line.user_groupby != line.groupby + + @api.constrains('groupby', 'user_groupby') + def _validate_groupby(self): + super()._validate_groupby() + for report_line in self: + report_line.report_id._check_groupby_fields(report_line.user_groupby) + report_line.report_id._check_groupby_fields(report_line.groupby) + + def _expand_groupby(self, line_dict_id, groupby, options, offset=0, limit=None, load_one_more=False, unfold_all_batch_data=None): + """ Expand function used to get the sublines of a groupby. + groupby param is a string consisting of one or more coma-separated field names. Only the first one + will be used for the expansion; if there are subsequent ones, the generated lines will themselves used them as + their groupby value, and point to this expand_function, hence generating a hierarchy of groupby). + """ + self.ensure_one() + + group_indent = 0 + line_id_list = self.report_id._parse_line_id(line_dict_id) + + # Parse groupby + groupby_data = self._parse_groupby(options, groupby_to_expand=groupby) + groupby_model = groupby_data['current_groupby_model'] + next_groupby = groupby_data['next_groupby'] + current_groupby = groupby_data['current_groupby'] + custom_groupby_map = groupby_data['custom_groupby_map'] + + # If this line is a sub-groupby of groupby line (for example, when grouping by partner, id; the id line is a subgroup of partner), + # we need to add the domain of the parent groupby criteria to the options + prefix_groups_count = 0 + sub_groupby_domain = [] + full_sub_groupby_key_elements = [] + for markup, model, value in line_id_list: + if isinstance(markup, dict) and 'groupby' in markup: + field_name = markup['groupby'] + if field_name in custom_groupby_map: + sub_groupby_domain += custom_groupby_map[field_name]['domain_builder'](value) + else: + sub_groupby_domain.append((field_name, '=', value)) + full_sub_groupby_key_elements.append(f"{field_name}:{value}") + elif isinstance(markup, dict) and 'groupby_prefix_group' in markup: + prefix_groups_count += 1 + + if model == 'account.group': + group_indent += 1 + + if sub_groupby_domain: + forced_domain = options.get('forced_domain', []) + sub_groupby_domain + options = {**options, 'forced_domain': forced_domain} + + # If the report transmitted custom_unfold_all_batch_data dictionary, use it + full_sub_groupby_key = f"[{self.id}]{','.join(full_sub_groupby_key_elements)}=>{current_groupby}" + + cached_result = (unfold_all_batch_data or {}).get(full_sub_groupby_key) + + if cached_result is not None: + all_column_groups_expression_totals = cached_result + else: + all_column_groups_expression_totals = self.report_id._compute_expression_totals_for_each_column_group( + self.expression_ids, + options, + groupby_to_expand=groupby, + offset=offset, + limit=limit + 1 if limit and load_one_more else limit, + ) + + # Put similar grouping keys from different totals/periods together, so that we don't display multiple + # lines for the same grouping key + + figure_types_defaulting_to_0 = {'monetary', 'percentage', 'integer', 'float'} + + default_value_per_expr_label = { + col_opt['expression_label']: 0 if col_opt['figure_type'] in figure_types_defaulting_to_0 else None + for col_opt in options['columns'] + } + + # Gather default value for each expression, in case it has no value for a given grouping key + default_value_per_expression = {} + for expression in self.expression_ids: + if expression.figure_type: + default_value = 0 if expression.figure_type in figure_types_defaulting_to_0 else None + else: + default_value = default_value_per_expr_label.get(expression.label) + + default_value_per_expression[expression] = {'value': default_value} + + # Build each group's result + aggregated_group_totals = defaultdict(lambda: defaultdict(default_value_per_expression.copy)) + for column_group_key, expression_totals in all_column_groups_expression_totals.items(): + for expression in self.expression_ids: + for grouping_key, result in expression_totals[expression]['value']: + aggregated_group_totals[grouping_key][column_group_key][expression] = {'value': result} + + # Generate groupby lines + group_lines_by_keys = {} + for grouping_key, group_totals in aggregated_group_totals.items(): + # For this, we emulate a dict formatted like the result of _compute_expression_totals_for_each_column_group, so that we can call + # _build_static_line_columns like on non-grouped lines + line_id = self.report_id._get_generic_line_id(groupby_model, grouping_key, parent_line_id=line_dict_id, markup={'groupby': current_groupby}) + group_line_dict = { + # 'name' key will be set later, so that we can browse all the records of this expansion at once (in case we're dealing with records) + 'id': line_id, + 'unfoldable': bool(next_groupby), + 'unfolded': (next_groupby and options['unfold_all']) or line_id in options['unfolded_lines'], + 'groupby': next_groupby, + 'columns': self.report_id._build_static_line_columns(self, options, group_totals, groupby_model=groupby_model), + 'level': self.hierarchy_level + 2 * (prefix_groups_count + len(sub_groupby_domain) + 1) + (group_indent - 1), + 'parent_id': line_dict_id, + 'expand_function': '_report_expand_unfoldable_line_with_groupby' if next_groupby else None, + 'caret_options': groupby_model if not next_groupby else None, + } + + if self.report_id.custom_handler_model_id: + self.env[self.report_id.custom_handler_model_name]._custom_groupby_line_completer(self.report_id, options, group_line_dict) + + # Growth comparison column. + if options.get('column_percent_comparison') == 'growth': + compared_expression = self.expression_ids.filtered(lambda expr: expr.label == group_line_dict['columns'][0]['expression_label']) + group_line_dict['column_percent_comparison_data'] = self.report_id._compute_column_percent_comparison_data( + options, group_line_dict['columns'][0]['no_format'], group_line_dict['columns'][1]['no_format'], green_on_positive=compared_expression.green_on_positive) + # Manage budget comparison + elif options.get('column_percent_comparison') == 'budget': + self.report_id._set_budget_column_comparisons(options, group_line_dict) + + group_lines_by_keys[grouping_key] = group_line_dict + + # Sort grouping keys in the right order and generate line names + keys_and_names_in_sequence = {} # Order of this dict will matter + + if groupby_model: + browsed_groupby_keys = self.env[groupby_model].browse(list(key for key in group_lines_by_keys if key is not None)) + + out_of_sorting_record = None + records_to_sort = browsed_groupby_keys + if browsed_groupby_keys and load_one_more and len(browsed_groupby_keys) >= limit: + out_of_sorting_record = browsed_groupby_keys[-1] + records_to_sort = records_to_sort[:-1] + + for record in records_to_sort.with_context(active_test=False).sorted(): + keys_and_names_in_sequence[record.id] = record.display_name + + if None in group_lines_by_keys: + keys_and_names_in_sequence[None] = _("Unknown") + + if out_of_sorting_record: + keys_and_names_in_sequence[out_of_sorting_record.id] = out_of_sorting_record.display_name + + else: + for non_relational_key in sorted(group_lines_by_keys.keys(), key=lambda k: (k is None, k)): + if custom_groupby_name_builder := custom_groupby_map.get(current_groupby, {}).get('label_builder'): + keys_and_names_in_sequence[non_relational_key] = custom_groupby_name_builder(non_relational_key) + else: + if non_relational_key is None: + keys_and_names_in_sequence[non_relational_key] = _("Undefined") + else: + groupby_field = self.env['account.move.line']._fields[groupby_data['current_groupby']] + if groupby_field.type == 'selection': + selection_options = dict(groupby_field._description_selection(self.env)) + keys_and_names_in_sequence[non_relational_key] = selection_options.get(non_relational_key) or _("Undefined") + else: + keys_and_names_in_sequence[non_relational_key] = str(non_relational_key) + + # Build result: add a name to the groupby lines and handle totals below section for multi-level groupby + group_lines = [] + for grouping_key, line_name in keys_and_names_in_sequence.items(): + group_line_dict = group_lines_by_keys[grouping_key] + group_line_dict['name'] = line_name + group_lines.append(group_line_dict) + + if options.get('hierarchy'): + group_lines = self.report_id._create_hierarchy(group_lines, options) + + return group_lines + + def _get_groupby_line_name(self, groupby_field_name, groupby_model, grouping_key): + # TODO master: remove this method as it is dead code + if groupby_model is None: + return grouping_key + + if grouping_key is None: + return _("Unknown") + + return self.env[groupby_model].browse(grouping_key).display_name + + def _parse_groupby(self, options, groupby_to_expand=None): + """ Retrieves the information needed to handle the groupby feature on the current line. + + :param groupby_to_expand: A coma-separated string containing, in order, all the fields that are used in the groupby we're expanding. + None if we're not expanding anything. + + :return: A dictionary with 4 keys: + 'current_groupby': The name of the value to be used to retrieve the results of the current groupby we're + expanding, or None if nothing is being expanded. That value can be either a field of account.move.line, or + a custom groupby value defined in this report's custom handler's _get_custom_groupby_map function. + + 'next_groupby': The subsequent groupings to be applied after current_groupby, as a string of coma-separated values (again, + either field names from account.move.line or a custom groupby defined on the handler). + If no subsequent grouping exists, next_groupby will be None. + + 'current_groupby_model': The model name corresponding to current_groupby, or None if current_groupby is None. + + 'custom_groupby_map'; The groupby map, used to handle custom groupby values, as returned by the _get_custom_groupby_map function + of the custom handler (by default, it will be an empty dict) + + EXAMPLE: + When computing a line with groupby=partner_id,account_id,id , without expanding it: + - groupby_to_expand will be None + - current_groupby will be None + - next_groupby will be 'partner_id,account_id,id' + - current_groupby_model will be None + + When expanding the first group level of the line: + - groupby_to_expand will be: partner_id,account_id,id + - current_groupby will be 'partner_id' + - next_groupby will be 'account_id,id' + - current_groupby_model will be 'res.partner' + + When expanding further: + - groupby_to_expand will be: account_id,id ; corresponding to the next_groupby computed when expanding partner_id + - current_groupby will be 'account_id' + - next_groupby will be 'id' + - current_groupby_model will be 'account.account' + """ + self.ensure_one() + + if groupby_to_expand: + groupby_to_expand = groupby_to_expand.replace(' ', '') + split_groupby = groupby_to_expand.split(',') + current_groupby = split_groupby[0] + next_groupby = ','.join(split_groupby[1:]) if len(split_groupby) > 1 else None + else: + current_groupby = None + groupby = self._get_groupby(options) + next_groupby = groupby.replace(' ', '') if groupby else None + + custom_handler_name = self.report_id._get_custom_handler_model() + custom_groupby_map = self.env[custom_handler_name]._get_custom_groupby_map() if custom_handler_name else {} + if current_groupby in custom_groupby_map: + groupby_model = custom_groupby_map[current_groupby]['model'] + elif current_groupby == 'id': + groupby_model = 'account.move.line' + elif current_groupby: + groupby_model = self.env['account.move.line']._fields[current_groupby].comodel_name + else: + groupby_model = None + + return { + 'current_groupby': current_groupby, + 'next_groupby': next_groupby, + 'current_groupby_model': groupby_model, + 'custom_groupby_map': custom_groupby_map, + } + + def _get_groupby(self, options): + self.ensure_one() + if options['export_mode'] == 'file': + return self.groupby + return self.user_groupby + + def action_reset_custom_groupby(self): + self.ensure_one() + self.user_groupby = self.groupby + + +class AccountReportExpression(models.Model): + _inherit = 'account.report.expression' + + def action_view_carryover_lines(self, options, column_group_key=None): + if column_group_key: + options = self.report_line_id.report_id._get_column_group_options(options, column_group_key) + + date_from, date_to = self.report_line_id.report_id._get_date_bounds_info(options, self.date_scope) + + return { + 'type': 'ir.actions.act_window', + 'name': _('Carryover lines for: %s', self.report_line_name), + 'res_model': 'account.report.external.value', + 'views': [(False, 'list')], + 'domain': [ + ('target_report_expression_id', '=', self.id), + ('date', '>=', date_from), + ('date', '<=', date_to), + ], + } + + +class AccountReportExternalValue(models.Model): + _inherit = 'account.report.external.value' + + @api.model_create_multi + def create(self, vals_list): + records = super().create(vals_list) + self._check_lock_date_violation(set(self._build_vals_to_check_for_lock_date(records))) + return records + + def write(self, vals): + # We need to build vals_to_check before the super() call because of the 'target_report_expression_id' field : + # if the user tries to modify this specific field, it'll potentially change the linked report id, and so he can + # bypass the lock dates from the original report (if it was a tax report for example) + vals_to_check = set(self._build_vals_to_check_for_lock_date(self)) + res = super().write(vals) + # Then we add the modified records + for lock_date_to_check in self._build_vals_to_check_for_lock_date(self): + vals_to_check.add(lock_date_to_check) + self._check_lock_date_violation(vals_to_check) + return res + + @api.model + def _build_vals_to_check_for_lock_date(self, records): + """ + Generator method to build tuples out of records. The tuples will contain 3 values: + - is tax, bool: is the external value linked to a tax report + - date to check, date: the date we want to check the lock dates for + - company, res.company: the company we want to check the lock dates for + """ + generic_tax_report = self.env.ref('account.generic_tax_report') + for external_value in records: + report = external_value.target_report_expression_id.report_line_id.report_id + yield ( + not self.env.context.get('ignore_tax_lock_date') and generic_tax_report in (report + report.root_report_id + report.section_main_report_ids.root_report_id), # is tax + external_value.date, # date to check + external_value.company_id, # company + ) + + def _check_lock_date_violation(self, vals_to_check): + """ + This method raises an error if the companies have lock dates after the date we want to create/write the values + :param vals_to_check: a set of tuples like: `{(is_tax, date, company_id)}` + """ + for is_tax, date, company_id in vals_to_check: + violated_lock_dates = company_id._get_lock_date_violations( + date, + sale=False, + purchase=False, + tax=is_tax, + ) + if violated_lock_dates: + lock_date_names = [company_id._fields[lock_date[1]].get_description(self.env)['string'] for lock_date in violated_lock_dates] + lock_dates = "\n- " + "\n- ".join(lock_date_names) + raise ValidationError(_("You cannot update this value as it's locked by: %s", lock_dates)) + + +class AccountReportHorizontalGroup(models.Model): + _name = "account.report.horizontal.group" + _description = "Horizontal group for reports" + + name = fields.Char(string="Name", required=True, translate=True) + rule_ids = fields.One2many(string="Rules", comodel_name='account.report.horizontal.group.rule', inverse_name='horizontal_group_id', required=True) + report_ids = fields.Many2many(string="Reports", comodel_name='account.report') + + _sql_constraints = [ + ('name_uniq', 'unique (name)', "A horizontal group with the same name already exists."), + ] + + def _get_header_levels_data(self): + return [ + (rule.field_name, rule._get_matching_records()) + for rule in self.rule_ids + ] + +class AccountReportHorizontalGroupRule(models.Model): + _name = "account.report.horizontal.group.rule" + _description = "Horizontal group rule for reports" + + def _field_name_selection_values(self): + return [ + (aml_field['name'], aml_field['string']) + for aml_field in self.env['account.move.line'].fields_get().values() + if aml_field['type'] in ('many2one', 'many2many') + ] + + horizontal_group_id = fields.Many2one(string="Horizontal Group", comodel_name='account.report.horizontal.group', required=True) + domain = fields.Char(string="Domain", required=True, default='[]') + field_name = fields.Selection(string="Field", selection='_field_name_selection_values', required=True) + res_model_name = fields.Char(string="Model", compute='_compute_res_model_name') + + @api.depends('field_name') + def _compute_res_model_name(self): + for record in self: + if record.field_name: + record.res_model_name = self.env['account.move.line']._fields[record.field_name].comodel_name + else: + record.res_model_name = None + + def _get_matching_records(self): + self.ensure_one() + model_name = self.env['account.move.line']._fields[self.field_name].comodel_name + domain = ast.literal_eval(self.domain) + return self.env[model_name].search(domain) + + +class AccountReportCustomHandler(models.AbstractModel): + _name = 'account.report.custom.handler' + _description = 'Account Report Custom Handler' + + # This abstract model allows case-by-case localized changes of behaviors of reports. + # This is used for custom reports, for cases that cannot be supported by the standard engines. + + def _dynamic_lines_generator(self, report, options, all_column_groups_expression_totals, warnings=None): + """ Generates lines dynamically for reports that require a custom processing which cannot be handled + by regular report engines. + :return: A list of tuples [(sequence, line_dict), ...], where: + - sequence is the sequence to apply when rendering the line (can be mixed with static lines), + - line_dict is a dict containing all the line values. + """ + return [] + + def _caret_options_initializer(self): + """ Returns the caret options dict to be used when rendering this report, + in the same format as the one used in _caret_options_initializer_default (defined on 'account.report'). + If the result is empty, the engine will use the default caret options. + """ + return self.env['account.report']._caret_options_initializer_default() + + def _custom_options_initializer(self, report, options, previous_options): + """ To be overridden to add report-specific _init_options... code to the report. """ + if report.root_report_id and report.root_report_id.custom_handler_model_id != report.custom_handler_model_id: + report.root_report_id._init_options_custom(options, previous_options) + + def _custom_line_postprocessor(self, report, options, lines): + """ Postprocesses the result of the report's _get_lines() before returning it. """ + return lines + + def _custom_groupby_line_completer(self, report, options, line_dict): + """ Postprocesses the dict generated by the group_by_line, to customize its content. """ + + def _custom_unfold_all_batch_data_generator(self, report, options, lines_to_expand_by_function): + """ When using the 'unfold all' option, some reports might end up recomputing the same query for + each line to unfold, leading to very inefficient computation. This function allows batching this computation, + and returns a dictionary where all results are cached, for use in expansion functions. + """ + return None + + def _get_custom_display_config(self): + """ To be overridden in order to change the templates used by Javascript to render this report (keeping the same + OWL components), and/or replace some of the default OWL components by custom-made ones. + + This function returns a dict (possibly empty, if there is no custom display config): + + { + 'css_custom_class: 'class', + 'components': { + + }, + 'pdf_export': { + + }, + 'templates': { + + }, + }, + """ + return {} + + def _get_custom_groupby_map(self): + """ Allows the use of custom values in the groupby field of account.report.line, to use them in custom engines. Those custom + values can be anything, and need to be properly handled by the custom engine using them. This allows adding support for grouping on + something else than just the fields of account.move.line, which is the default. + + :return: A dict, in the form {groupby_name: {'model': model, 'domain_builder': domain_builder}}, where: + - groupby_name is the custom value to use in groupby instead of one of aml's field names + - model: is a model name (a string), representing the model the value returned for this custom groupby targets. + The model will be used to compute the display_name to show for each generated groupby line, in the UI. + This value can be passed to None ; in such case, the raw value returned by the engine will be shown. + - domain_builder is a function to be called when expanding a groupby line generated by this custom groupby, to compute the + domain to apply in order to restrict the computation to the content of this groupby line. + This function must accept a single parameter, corresponding to the groupby value to compute the domain for. + - label_builder is a function to be called to compute a label for the groupby value, that will be shown as the line name + in the UI. This ways, translatable labels and multi-values keys serialized to json can be fully supported. + """ + return {} + + def _customize_warnings(self, report, options, all_column_groups_expression_totals, warnings): + """ To be overridden to add report-specific warnings in the warnings dictionary. + When a root report defines something in this function, its variants without any custom handler will also call the root report's + _customize_warnings function. This can hence be used to share warnings between all variants. + + Should only be used when necessary, _dynamic_lines_generator is preferred. + """ + + def _enable_export_buttons_for_common_vat_groups_in_branches(self, options): + """ DEPRECATED: to be removed in master. Buttons are now set to 'branch_allowed' when needed in get_options() """ + pass + + +class AccountReportFileDownloadException(Exception): + def __init__(self, errors, content=None): + super().__init__() + self.errors = errors + self.content = content diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_sales_report.py b/dev_odex30_accounting/odex30_account_reports/models/account_sales_report.py new file mode 100644 index 0000000..0f55676 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_sales_report.py @@ -0,0 +1,420 @@ +from collections import defaultdict + +from odoo import _, api, fields, models +from odoo.tools import SQL + + +class ECSalesReportCustomHandler(models.AbstractModel): + _name = 'account.ec.sales.report.handler' + _inherit = 'account.report.custom.handler' + _description = 'EC Sales Report Custom Handler' + + def _get_custom_display_config(self): + return { + 'components': { + 'AccountReportFilters': 'odex30_account_reports.SalesReportFilters', + }, + } + + def _dynamic_lines_generator(self, report, options, all_column_groups_expression_totals, warnings=None): + """ + Generate the dynamic lines for the report in a vertical style (one line per tax per partner). + """ + lines = [] + totals_by_column_group = { + column_group_key: { + 'balance': 0.0, + 'goods': 0.0, + 'triangular': 0.0, + 'services': 0.0, + 'vat_number': '', + 'country_code': '', + 'sales_type_code': '', + } + for column_group_key in options['column_groups'] + } + + operation_categories = options['sales_report_taxes'].get('operation_category', {}) + ec_tax_filter_selection = {v.get('id'): v.get('selected') for v in options.get('ec_tax_filter_selection', [])} + for partner, results in self._query_partners(report, options, warnings): + for tax_ec_category in ('goods', 'triangular', 'services'): + if not ec_tax_filter_selection[tax_ec_category]: + # Skip the line if the tax is not selected + continue + partner_values = defaultdict(dict) + country_specific_code = operation_categories.get(tax_ec_category) + has_found_a_line = False + for col_grp_key in options['column_groups']: + partner_sum = results.get(col_grp_key, {}) + partner_values[col_grp_key]['vat_number'] = partner_sum.get('vat_number', 'UNKNOWN') + partner_values[col_grp_key]['country_code'] = partner_sum.get('country_code', 'UNKNOWN') + partner_values[col_grp_key]['sales_type_code'] = [] + partner_values[col_grp_key]['balance'] = partner_sum.get(tax_ec_category, 0.0) + totals_by_column_group[col_grp_key]['balance'] += partner_sum.get(tax_ec_category, 0.0) + for i, operation_id in enumerate(partner_sum.get('tax_element_id', [])): + if operation_id in options['sales_report_taxes'][tax_ec_category]: + has_found_a_line = True + partner_values[col_grp_key]['sales_type_code'] += [ + country_specific_code or + (partner_sum.get('sales_type_code') and partner_sum.get('sales_type_code')[i]) + or None] + partner_values[col_grp_key]['sales_type_code'] = ', '.join(set(partner_values[col_grp_key]['sales_type_code'])) + if has_found_a_line: + lines.append((0, self._get_report_line_partner(report, options, partner, partner_values, markup=tax_ec_category))) + + # Report total line. + if lines: + lines.append((0, self._get_report_line_total(report, options, totals_by_column_group))) + + return lines + + def _caret_options_initializer(self): + """ + Add custom caret option for the report to link to the partner and allow cleaner overrides. + """ + return { + 'ec_sales': [ + {'name': _("View Partner"), 'action': 'caret_option_open_record_form'} + ], + } + + def _custom_options_initializer(self, report, options, previous_options): + """ + Add the invoice lines search domain that is specific to the country. + Typically, the taxes tag_ids relative to the country for the triangular, sale of goods or services + :param dict options: Report options + :param dict previous_options: Previous report options + """ + super()._custom_options_initializer(report, options, previous_options=previous_options) + self._init_core_custom_options(report, options, previous_options) + options.update({ + 'sales_report_taxes': { + 'goods': tuple(self.env['account.tax'].search([ + *self.env['account.tax']._check_company_domain(self.env.company), + ('amount', '=', 0.0), + ('amount_type', '=', 'percent'), + ('type_tax_use', '=', 'sale'), + ]).ids), + 'services': tuple(), + 'triangular': tuple(), + 'use_taxes_instead_of_tags': True, + # We can't use tags as we don't have a country tax report correctly set, 'use_taxes_instead_of_tags' + # should never be used outside this case + } + }) + country_ids = self.env['res.country'].search([ + ('code', 'in', tuple(self._get_ec_country_codes(options))) + ]).ids + other_country_ids = tuple(set(country_ids) - {self.env.company.account_fiscal_country_id.id}) + options.setdefault('forced_domain', []).extend([ + '|', + ('move_id.partner_shipping_id.country_id', 'in', other_country_ids), + '&', + ('move_id.partner_shipping_id', '=', False), + ('partner_id.country_id', 'in', other_country_ids), + ]) + + report._init_options_journals(options, previous_options=previous_options) + + options['enable_export_buttons_for_common_vat_in_branches'] = True + + def _init_core_custom_options(self, report, options, previous_options): + """ + Add the invoice lines search domain that is common to all countries. + :param dict options: Report options + :param dict previous_options: Previous report options + """ + default_tax_filter = [ + {'id': 'goods', 'name': _('Goods'), 'selected': True}, + {'id': 'triangular', 'name': _('Triangular'), 'selected': True}, + {'id': 'services', 'name': _('Services'), 'selected': True}, + ] + + ec_tax_filter_selection = previous_options.get('ec_tax_filter_selection', default_tax_filter) + # In case we have a EC sale list report with more ec_tax_filter_selection the previous options will have extra + # item we just keep the default ones, and we let variant extend the function to add the ones they need + if ec_tax_filter_selection != default_tax_filter: + filtered_ec_tax_filter_selection = [item for item in ec_tax_filter_selection if item['id'] in {item['id'] for item in default_tax_filter}] + options['ec_tax_filter_selection'] = filtered_ec_tax_filter_selection + else: + options['ec_tax_filter_selection'] = ec_tax_filter_selection + + def _get_report_line_partner(self, report, options, partner, partner_values, markup=''): + """ + Convert the partner values to a report line. + :param dict options: Report options + :param recordset partner: the corresponding res.partner record + :param dict partner_values: Dictionary of values for the report line + :return dict: Return a dict with the values for the report line. + """ + column_values = [] + for column in options['columns']: + value = partner_values[column['column_group_key']].get(column['expression_label']) + column_values.append(report._build_column_dict(value, column, options=options)) + + return { + 'id': report._get_generic_line_id('res.partner', partner.id, markup=markup), + 'name': partner is not None and (partner.name or '')[:128] or _('Unknown Partner'), + 'columns': column_values, + 'level': 2, + 'trust': partner.trust if partner else None, + 'caret_options': 'ec_sales', + } + + def _get_report_line_total(self, report, options, totals_by_column_group): + """ + Convert the total values to a report line. + :param dict options: Report options + :param dict totals_by_column_group: Dictionary of values for the total line + :return dict: Return a dict with the values for the report line. + """ + column_values = [] + for column in options['columns']: + col_value = totals_by_column_group[column['column_group_key']].get(column['expression_label']) + col_value = col_value if column['figure_type'] == 'monetary' else '' + + column_values.append(report._build_column_dict(col_value, column, options=options)) + + return { + 'id': report._get_generic_line_id(None, None, markup='total'), + 'name': _('Total'), + 'class': 'total', + 'level': 1, + 'columns': column_values, + } + + def _query_partners(self, report, options, warnings=None): + ''' Execute the queries, perform all the computation, then + returns a lists of tuple (partner, fetched_values) sorted by the table's model _order: + - partner is a res.parter record. + - fetched_values is a dictionary containing: + - sums by operation type: {'goods': float, + 'triangular': float, + 'services': float, + + - tax identifiers: 'tax_element_id': list[int], > the tag_id in almost every case + 'sales_type_code': list[str], + + - partner identifier elements: 'vat_number': str, + 'full_vat_number': str, + 'country_code': str} + + :param options: The report options. + :return: (accounts_values, taxes_results) + ''' + groupby_partners = {} + vat_set = set() + + def assign_sum(row): + """ + Assign corresponding values from the SQL querry row to the groupby_partners dictionary. + If the line balance isn't 0, find the tax tag_id and check in which column/report line the SQL line balance + should be displayed. + + The tricky part is to allow for the report to be displayed in vertical or horizontal format. + In vertical, you have up to 3 lines per partner (one for each operation type). + In horizontal, you have one line with 3 columns per partner (one for each operation type). + + Add then the more straightforward data (vat number, country code, ...) + :param dict row: + """ + if not company_currency.is_zero(row['balance']): + vat = row['vat_number'] or '' + vat_country_code = vat[:2] if vat[:2].isalpha() else None + duplicated_vat = vat and vat in vat_set and row['groupby'] not in groupby_partners + if vat: + vat_set.add(vat) + + groupby_partners.setdefault(row['groupby'], defaultdict(lambda: defaultdict(float))) + groupby_partners_keyed = groupby_partners[row['groupby']][row['column_group_key']] + for key in options['sales_report_taxes']: + # options['sales_report_taxes'][key] could be either a list, set, tuple or boolean, in case of boolean + # the in operator would traceback + if not isinstance(options['sales_report_taxes'][key], bool) and row['tax_element_id'] in options['sales_report_taxes'][key]: + groupby_partners_keyed[key] += row['balance'] + + groupby_partners_keyed.setdefault('tax_element_id', []).append(row['tax_element_id']) + groupby_partners_keyed.setdefault('sales_type_code', []).append(row['sales_type_code']) + + groupby_partners_keyed.setdefault('vat_number', vat if not vat_country_code else vat[2:]) + groupby_partners_keyed.setdefault('full_vat_number', vat) + groupby_partners_keyed.setdefault('country_code', vat_country_code or row.get('country_code')) + + if warnings is not None: + if row['country_code'] not in self._get_ec_country_codes(options): + warnings['odex30_account_reports.sales_report_warning_non_ec_country'] = {'alert_type': 'warning'} + elif not row.get('vat_number'): + warnings['odex30_account_reports.sales_report_warning_missing_vat'] = {'alert_type': 'warning'} + if row.get('same_country') and row['country_code']: + warnings['odex30_account_reports.sales_report_warning_same_country'] = {'alert_type': 'warning'} + if duplicated_vat: + if warnings.get('odex30_account_reports.sales_report_warning_duplicated_vat'): + warnings['odex30_account_reports.sales_report_warning_duplicated_vat']['duplicated_partners_vat'].append(vat) + else: + warnings['odex30_account_reports.sales_report_warning_duplicated_vat'] = {'alert_type': 'warning', 'duplicated_partners_vat': [vat]} + + company_currency = self.env.company.currency_id + + # Execute the queries and dispatch the results. + query = self._get_query_sums(report, options) + self._cr.execute(query) + + dictfetchall = self._cr.dictfetchall() + for res in dictfetchall: + assign_sum(res) + + if groupby_partners: + partners = self.env['res.partner'].with_context(active_test=False).browse(groupby_partners.keys()) + else: + partners = self.env['res.partner'] + + return [(partner, groupby_partners[partner.id]) for partner in partners.sorted()] + + def _get_query_sums(self, report, options) -> SQL: + ''' Construct a query retrieving all the aggregated sums to build the report. It includes: + - sums for all partners. + - sums for the initial balances. + :param options: The report options. + :return: query as SQL object + ''' + queries = [] + # Create the currency table. + allowed_ids = self._get_tag_ids_filtered(options) + + # In the case of the generic report, we don't have a country defined. So no reliable tax report whose + # tag_ids can be used. So we have a fallback to tax_ids. + + if options.get('sales_report_taxes', {}).get('use_taxes_instead_of_tags'): + tax_elem_table = SQL('account_tax') + tax_elem_table_id = SQL('account_tax_id') + aml_rel_table = SQL('account_move_line_account_tax_rel') + tax_elem_table_name = self.env['account.tax']._field_to_sql('account_tax', 'name') + else: + tax_elem_table = SQL('account_account_tag') + tax_elem_table_id = SQL('account_account_tag_id') + aml_rel_table = SQL('account_account_tag_account_move_line_rel') + tax_elem_table_name = self.env['account.account.tag']._field_to_sql('account_account_tag', 'name') + + for column_group_key, column_group_options in report._split_options_per_column_group(options).items(): + query = report._get_report_query(column_group_options, 'strict_range') + if allowed_ids: + query.add_where(SQL('%s.id IN %s', tax_elem_table, tuple(allowed_ids))) + queries.append(SQL( + """ + SELECT + %(column_group_key)s AS column_group_key, + account_move_line.partner_id AS groupby, + res_partner.vat AS vat_number, + res_country.code AS country_code, + -SUM(%(balance_select)s) AS balance, + %(tax_elem_table_name)s AS sales_type_code, + %(tax_elem_table)s.id AS tax_element_id, + (comp_partner.country_id = res_partner.country_id) AS same_country + FROM %(table_references)s + %(currency_table_join)s + JOIN %(aml_rel_table)s ON %(aml_rel_table)s.account_move_line_id = account_move_line.id + JOIN %(tax_elem_table)s ON %(aml_rel_table)s.%(tax_elem_table_id)s = %(tax_elem_table)s.id + JOIN res_partner ON account_move_line.partner_id = res_partner.id + JOIN res_country ON res_partner.country_id = res_country.id + JOIN res_company ON res_company.id = account_move_line.company_id + JOIN res_partner comp_partner ON comp_partner.id = res_company.partner_id + WHERE %(search_condition)s + GROUP BY %(tax_elem_table)s.id, %(tax_elem_table)s.name, account_move_line.partner_id, + res_partner.vat, res_country.code, comp_partner.country_id, res_partner.country_id + """, + column_group_key=column_group_key, + tax_elem_table_name=tax_elem_table_name, + tax_elem_table=tax_elem_table, + table_references=query.from_clause, + balance_select=report._currency_table_apply_rate(SQL("account_move_line.balance")), + currency_table_join=report._currency_table_aml_join(column_group_options), + aml_rel_table=aml_rel_table, + tax_elem_table_id=tax_elem_table_id, + search_condition=query.where_clause, + )) + return SQL(' UNION ALL ').join(queries) + + @api.model + def _get_tag_ids_filtered(self, options): + """ + Helper function to get all the tag_ids concerned by the report for the given options. + :param dict options: Report options + :return tuple: tag_ids untyped after filtering + """ + allowed_taxes = set() + for operation_type in options.get('ec_tax_filter_selection', []): + if operation_type.get('selected'): + allowed_taxes.update(options['sales_report_taxes'][operation_type.get('id')]) + return allowed_taxes + + @api.model + def _get_ec_country_codes(self, options): + """ + Return the list of country codes for the EC countries. + :param dict options: Report options + :return set: List of country codes for a given date (UK case) + """ + rslt = {'AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HU', + 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE', 'XI'} + + # GB left the EU on January 1st 2021. But before this date, it's still to be considered as a EC country + if fields.Date.from_string(options['date']['date_from']) < fields.Date.from_string('2021-01-01'): + rslt.add('GB') + # Monaco is treated as part of France for VAT purposes (but should not be displayed within FR context) + if self.env.company.account_fiscal_country_id.code != 'FR': + rslt.add('MC') + + return rslt + + def get_warning_act_window(self, options, params): + act_window = {'type': 'ir.actions.act_window', 'context': {}} + if params['type'] == 'no_vat': + aml_domains = [ + ('partner_id.vat', '=', None), + ('partner_id.country_id.code', 'in', tuple(self._get_ec_country_codes(options))), + ] + act_window.update({ + 'name': _("Entries with partners with no VAT"), + 'context': {'search_default_group_by_partner': 1, 'expand': 1} + }) + elif params['type'] == 'non_ec_country': + aml_domains = [('partner_id.country_id.code', 'not in', tuple(self._get_ec_country_codes(options)))] + act_window['name'] = _("EC tax on non EC countries") + elif params['type'] == 'duplicated_vat': + return self._get_duplicated_vat_partners(tuple(params['duplicated_partners_vat'])) + else: + aml_domains = [('partner_id.country_id.code', '=', options.get('same_country_warning'))] + act_window['name'] = _("EC tax on same country") + use_taxes_instead_of_tags = options.get('sales_report_taxes', {}).get('use_taxes_instead_of_tags') + tax_or_tag_field = 'tax_ids.id' if use_taxes_instead_of_tags else 'tax_tag_ids.id' + amls = self.env['account.move.line'].search([ + *aml_domains, + *self.env['account.report']._get_options_date_domain(options, 'strict_range'), + (tax_or_tag_field, 'in', tuple(self._get_tag_ids_filtered(options))) + ]) + + if params['model'] == 'move': + act_window.update({ + 'views': [[self.env.ref('account.view_move_tree').id, 'list'], (False, 'form')], + 'res_model': 'account.move', + 'domain': [('id', 'in', amls.move_id.ids)], + }) + else: + act_window.update({ + 'views': [(False, 'list'), (False, 'form')], + 'res_model': 'res.partner', + 'domain': [('id', 'in', amls.move_id.partner_id.ids)], + }) + + return act_window + + def _get_duplicated_vat_partners(self, duplicated_partners_vat): + view_ref = self.env.ref('odex30_account_reports.duplicated_vat_partner_tree_view', raise_if_not_found=False) + return { + 'type': 'ir.actions.act_window', + 'name': _('Partners with duplicated VAT numbers'), + 'context': {'group_by': 'vat', 'expand': 1, 'duplicated_partners_vat': duplicated_partners_vat}, + 'views': [(view_ref and view_ref.id or False, 'list'), (False, 'form')], + 'res_model': 'res.partner', + 'domain': [('vat', 'in', duplicated_partners_vat)], + } diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_tax.py b/dev_odex30_accounting/odex30_account_reports/models/account_tax.py new file mode 100644 index 0000000..b116dc5 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_tax.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- + +from odoo import api, models, fields, Command, _ +from odoo.exceptions import ValidationError + + +class AccountTaxUnit(models.Model): + _name = "account.tax.unit" + _description = "Tax Unit" + + name = fields.Char(string="Name", required=True) + country_id = fields.Many2one(string="Country", comodel_name='res.country', required=True, help="The country in which this tax unit is used to group your companies' tax reports declaration.") + vat = fields.Char(string="Tax ID", required=True, help="The identifier to be used when submitting a report for this unit.") + company_ids = fields.Many2many(string="Companies", comodel_name='res.company', required=True, help="Members of this unit") + main_company_id = fields.Many2one(string="Main Company", comodel_name='res.company', required=True, help="Main company of this unit; the one actually reporting and paying the taxes.") + fpos_synced = fields.Boolean(string="Fiscal Positions Synchronised", compute='_compute_fiscal_position_completion', help="Technical field indicating whether Fiscal Positions exist for all companies in the unit") + + def create(self, vals_list): + res = super().create(vals_list) + + horizontal_groups = self.env['account.report.horizontal.group'].create([ + { + 'name': tax_unit.name, + 'rule_ids': [ + Command.create({ + 'field_name': 'company_id', + 'domain': f"[('account_tax_unit_ids', 'in', {tax_unit.id})]", + }), + ], + } + for tax_unit in res + ]) + + generic_tax_report = self.env.ref('account.generic_tax_report') + generic_tax_report.horizontal_group_ids |= horizontal_groups + + generic_tax_report_account_tax = self.env.ref('account.generic_tax_report_account_tax') + generic_tax_report_account_tax.horizontal_group_ids |= horizontal_groups + + generic_tax_report_tax_account = self.env.ref('account.generic_tax_report_tax_account') + generic_tax_report_tax_account.horizontal_group_ids |= horizontal_groups + + generic_ec_sales_report = self.env.ref('odex30_account_reports.generic_ec_sales_report') + generic_ec_sales_report.horizontal_group_ids |= horizontal_groups + + for tax_unit in res: + generic_tax_report.variant_report_ids.filtered(lambda variant: variant.country_id == tax_unit.country_id).write( + { + 'horizontal_group_ids': [Command.link(group.id) for group in horizontal_groups], + } + ) + + return res + + @api.depends('company_ids') + def _compute_fiscal_position_completion(self): + for unit in self: + synced = True + for company in unit.company_ids: + origin_company = company._origin if isinstance(company.id, models.NewId) else company + fp = unit._get_tax_unit_fiscal_positions(companies=origin_company) + all_partners_with_fp = self.env['res.company'].search([]).with_company(origin_company).partner_id\ + .filtered(lambda p: p.property_account_position_id == fp) if fp else self.env['res.partner'] + synced = all_partners_with_fp == (unit.company_ids - origin_company).partner_id + if not synced: + break + unit.fpos_synced = synced + + def _get_tax_unit_fiscal_positions(self, companies, create_or_refresh=False): + """ + Retrieves or creates fiscal positions for all companies specified. + Each Fiscal Position contains all the taxes of the company mapped to no tax + + @param {recordset} companies: companies for which to find/create fiscal positions + @param {boolean} create_or_refresh: a boolean indicating whether the fiscal positions should be created if not found + @return {recordset} all the fiscal positions found/created for the companies requested. + """ + fiscal_positions = self.env['account.fiscal.position'].with_context(allowed_company_ids=self.env.user.company_ids.ids) + for unit in self: + for company in companies: + fp_identifier = 'account.tax_unit_%s_fp_%s' % (unit.id, company.id) + existing_fp = self.env.ref(fp_identifier, raise_if_not_found=False) + if create_or_refresh: + taxes_to_map = self.env['account.tax'].with_context( + allowed_company_ids=self.env.user.company_ids.ids, + ).search(self.env['account.tax']._check_company_domain(company)) + data = { + 'xml_id': fp_identifier, + 'values': { + 'name': unit.name, + 'company_id': company.id, + 'tax_ids': [Command.clear()] + [Command.create({'tax_src_id': tax.id}) for tax in taxes_to_map] + } + } + existing_fp = fiscal_positions._load_records([data]) + if existing_fp: + fiscal_positions += existing_fp + return fiscal_positions + + def action_sync_unit_fiscal_positions(self): + self._get_tax_unit_fiscal_positions(companies=self.env['res.company'].search([])).unlink() + for unit in self: + for company in unit.company_ids: + fp = unit._get_tax_unit_fiscal_positions(companies=company, create_or_refresh=True) + (unit.company_ids - company).with_company(company).partner_id.property_account_position_id = fp + + def unlink(self): + # EXTENDS base + self._get_tax_unit_fiscal_positions(companies=self.env['res.company'].search([])).unlink() + return super().unlink() + + @api.constrains('country_id', 'company_ids') + def _validate_companies_country(self): + for record in self: + currencies = set() + for company in record.company_ids: + currencies.add(company.currency_id) + + if any(unit != record and unit.country_id == record.country_id for unit in company.account_tax_unit_ids): + raise ValidationError(_("Company %(company)s already belongs to a tax unit in %(country)s. A company can at most be part of one tax unit per country.", company=company.name, country=record.country_id.name)) + + if len(currencies) > 1: + raise ValidationError(_("A tax unit can only be created between companies sharing the same main currency.")) + + @api.constrains('company_ids', 'main_company_id') + def _validate_main_company(self): + for record in self: + if record.main_company_id not in record.company_ids: + raise ValidationError(_("The main company of a tax unit has to be part of it.")) + + @api.constrains('company_ids') + def _validate_companies(self): + for record in self: + if len(record.company_ids) < 2: + raise ValidationError(_("A tax unit must contain a minimum of two companies. You might want to delete the unit.")) + + @api.constrains('country_id', 'vat') + def _validate_vat(self): + for record in self: + if not record.vat: + continue + + checked_country_code = self.env['res.partner']._run_vat_test(record.vat, record.country_id) + + if checked_country_code and checked_country_code != record.country_id.code.lower(): + raise ValidationError(_("The country detected for this VAT number does not match the one set on this Tax Unit.")) + + if not checked_country_code: + tu_label = _("tax unit [%s]", record.name) + error_message = self.env['res.partner']._build_vat_error_message(record.country_id.code.lower(), record.vat, tu_label) + raise ValidationError(error_message) + + @api.onchange('company_ids') + def _onchange_company_ids(self): + if self.main_company_id not in self.company_ids and self.company_ids: + self.main_company_id = self.company_ids[0]._origin + elif not self.company_ids: + self.main_company_id = False diff --git a/dev_odex30_accounting/odex30_account_reports/models/account_trial_balance_report.py b/dev_odex30_accounting/odex30_account_reports/models/account_trial_balance_report.py new file mode 100644 index 0000000..5f9bb16 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/account_trial_balance_report.py @@ -0,0 +1,195 @@ +# -*- coding: utf-8 -*- + +from odoo import api, models, _, fields +from odoo.tools import float_compare +from odoo.tools.misc import DEFAULT_SERVER_DATE_FORMAT + + +class TrialBalanceCustomHandler(models.AbstractModel): + _name = 'account.trial.balance.report.handler' + _inherit = 'account.report.custom.handler' + _description = 'Trial Balance Custom Handler' + + def _dynamic_lines_generator(self, report, options, all_column_groups_expression_totals, warnings=None): + def _update_column(line, column_key, new_value): + line['columns'][column_key]['no_format'] = new_value + line['columns'][column_key]['is_zero'] = self.env.company.currency_id.is_zero(new_value) + + def _update_balance_columns(line, debit_column_key, credit_column_key, balance_column_key=None): + debit_value = line['columns'][debit_column_key]['no_format'] if debit_column_key is not None else False + credit_value = line['columns'][credit_column_key]['no_format'] if credit_column_key is not None else False + + if debit_value and credit_value: + new_debit_value = 0.0 + new_credit_value = 0.0 + + if self.env.company.currency_id.compare_amounts(debit_value, credit_value) == 1: + new_debit_value = debit_value - credit_value + else: + new_credit_value = (debit_value - credit_value) * -1 + + _update_column(line, debit_column_key, new_debit_value) + _update_column(line, credit_column_key, new_credit_value) + + if balance_column_key is not None: + _update_column(line, balance_column_key, debit_value - credit_value) + + def is_end_balance_column(column): + return options['column_groups'][column['column_group_key']].get('forced_options').get('is_end_balance') + + lines = [line[1] for line in self.env['account.general.ledger.report.handler']._dynamic_lines_generator(report, options, all_column_groups_expression_totals, warnings=warnings)] + + # We need to find the index of debit and credit columns for initial and end balance in case of extra custom columns + init_balance_debit_index = next((index for index, column in enumerate(options['columns']) if column.get('expression_label') == 'debit'), None) + init_balance_credit_index = next((index for index, column in enumerate(options['columns']) if column.get('expression_label') == 'credit'), None) + + end_balance_debit_index = next((index for index, column in enumerate(options['columns']) if column.get('expression_label') == 'debit' and is_end_balance_column(column)), None) + end_balance_credit_index = next((index for index, column in enumerate(options['columns']) if column.get('expression_label') == 'credit' and is_end_balance_column(column)), None) + end_balance_balance_index = next((index for index, column in enumerate(options['columns']) if column.get('expression_label') == 'balance' and is_end_balance_column(column)), None) + + currency = self.env.company.currency_id + for line in lines[:-1]: + # Initial balance + _update_balance_columns(line, init_balance_debit_index, init_balance_credit_index) + _update_balance_columns(line, end_balance_debit_index, end_balance_credit_index, end_balance_balance_index) + + line.pop('expand_function', None) + line.pop('groupby', None) + line.update({ + 'unfoldable': False, + 'unfolded': False, + }) + + res_model = report._get_model_info_from_id(line['id'])[0] + if res_model == 'account.account': + line['caret_options'] = 'trial_balance' + + # Total line + if lines: + total_line = lines[-1] + + for index in (init_balance_debit_index, init_balance_credit_index, end_balance_debit_index, end_balance_credit_index): + if index is not None: + total_line['columns'][index]['no_format'] = sum(currency.round(line['columns'][index]['no_format']) for line in lines[:-1] if report._get_model_info_from_id(line['id'])[0] == 'account.account') + total_line['columns'][index]['blank_if_zero'] = False + + return [(0, line) for line in lines] + + def _caret_options_initializer(self): + return { + 'trial_balance': [ + {'name': _("General Ledger"), 'action': 'caret_option_open_general_ledger'}, + {'name': _("Journal Items"), 'action': 'open_journal_items'}, + ], + } + + def _get_column_group_creation_data(self, report, options, previous_options=None): + """ + Return tuple of tuples containing a reference to the column_group creation function and on which side ('left' | 'right') of the report the column_group goes + """ + return ( + (self._create_column_group_initial_balance, 'left'), + (self._create_column_group_end_balance, 'right'), + ) + + @api.model + def _create_and_append_column_group(self, report, options, header_name, forced_options, side_to_append, group_vals, exclude_initial_balance=False, append_col_groups=True): + header_element = [{'name': header_name, 'forced_options': forced_options}] + column_headers = [header_element, *options['column_headers'][1:]] + column_group_vals = report._generate_columns_group_vals_recursively(column_headers, group_vals) + + if exclude_initial_balance: + # This column group must not include initial balance; we use a special option key for that in general ledger + for column_group in column_group_vals: + column_group['forced_options']['general_ledger_strict_range'] = True + + columns, column_groups = report._build_columns_from_column_group_vals(forced_options, column_group_vals) + + side_to_append['column_headers'] += header_element + if append_col_groups: + side_to_append['column_groups'] |= column_groups + side_to_append['columns'] += columns + + def _custom_options_initializer(self, report, options, previous_options): + """ Modifies the provided options to add a column group for initial balance and end balance, as well as the appropriate columns. + """ + default_group_vals = {'horizontal_groupby_element': {}, 'forced_options': {}} + left_side = {'column_headers': [], 'column_groups': {}, 'columns': []} + right_side = {'column_headers': [], 'column_groups': {}, 'columns': []} + + # Columns between initial and end balance must not include initial balance; we use a special option key for that in general ledger + for column_group in options['column_groups'].values(): + column_group['forced_options']['general_ledger_strict_range'] = True + + if options.get('comparison') and not options['comparison'].get('periods'): + options['comparison']['period_order'] = 'ascending' + + # Create column groups + for function, side in self._get_column_group_creation_data(report, options, previous_options): + function(report, options, previous_options, default_group_vals, left_side if side == 'left' else right_side) + + # Update options + options['column_headers'][0] = left_side['column_headers'] + options['column_headers'][0] + right_side['column_headers'] + options['column_groups'].update(left_side['column_groups']) + options['column_groups'].update(right_side['column_groups']) + options['columns'] = left_side['columns'] + options['columns'] + right_side['columns'] + options['ignore_totals_below_sections'] = True # So that GL does not compute them + + # All the periods displayed between initial and end balance need to use the same rates, so we manually change the period key. + # account.report will then compute the currency table periods accordingly + middle_periods_period_key = '_trial_balance_middle_periods' + for col_group in options['column_groups'].values(): + col_group_date = col_group['forced_options'].get('date') + if col_group_date: + col_group_date['currency_table_period_key'] = middle_periods_period_key + + report._init_options_order_column(options, previous_options) + + def _custom_line_postprocessor(self, report, options, lines): + # If the hierarchy is enabled, ensure to add the o_account_coa_column_contrast class to the hierarchy lines + if options.get('hierarchy'): + for line in lines: + model, dummy = report._get_model_info_from_id(line['id']) + if model == 'account.group': + line_classes = line.get('class', '') + line['class'] = line_classes + ' o_account_coa_column_contrast_hierarchy' + + return lines + + def _create_column_group_initial_balance(self, report, options, previous_options, default_group_vals, side_to_append): + initial_balance_options = self.env['account.general.ledger.report.handler']._get_options_initial_balance(options) + initial_forced_options = { + 'date': initial_balance_options['date'], + 'include_current_year_in_unaff_earnings': initial_balance_options['include_current_year_in_unaff_earnings'], + 'no_impact_on_currency_table': True, + } + + self._create_and_append_column_group( + report, + options, + _("Initial Balance"), + initial_forced_options, + side_to_append, + default_group_vals, + ) + + def _create_column_group_end_balance(self, report, options, previous_options, default_group_vals, side_to_append): + end_date_to = options['date']['date_to'] + end_date_from = options['date']['date_from'] + end_forced_options = { + 'date': report._get_dates_period( + fields.Date.from_string(end_date_from), + fields.Date.from_string(end_date_to), + 'range', + ), + 'is_end_balance': True, + } + + self._create_and_append_column_group( + report, + options, + _("End Balance"), + end_forced_options, + side_to_append, + default_group_vals, + ) diff --git a/dev_odex30_accounting/odex30_account_reports/models/balance_sheet.py b/dev_odex30_accounting/odex30_account_reports/models/balance_sheet.py new file mode 100644 index 0000000..189098a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/balance_sheet.py @@ -0,0 +1,11 @@ +from odoo import models + + +class BalanceSheetCustomHandler(models.AbstractModel): + _name = 'account.balance.sheet.report.handler' + _inherit = 'account.report.custom.handler' + _description = "Balance Sheet Custom Handler" + + def _customize_warnings(self, report, options, all_column_groups_expression_totals, warnings): + if options['currency_table']['type'] == 'cta': + warnings['odex30_account_reports.common_possibly_unbalanced_because_cta'] = {} diff --git a/dev_odex30_accounting/odex30_account_reports/models/bank_reconciliation_report.py b/dev_odex30_accounting/odex30_account_reports/models/bank_reconciliation_report.py new file mode 100644 index 0000000..e2ad93d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/bank_reconciliation_report.py @@ -0,0 +1,620 @@ +from datetime import date +import logging +from odoo import models, fields, _ +from odoo.exceptions import UserError +from odoo.tools import SQL +from odoo.osv import expression + +_logger = logging.getLogger(__name__) + + +class BankReconciliationReportCustomHandler(models.AbstractModel): + _name = 'account.bank.reconciliation.report.handler' + _inherit = 'account.report.custom.handler' + _description = 'Bank Reconciliation Report Custom Handler' + + ###################### + # Options + ###################### + def _custom_options_initializer(self, report, options, previous_options): + super()._custom_options_initializer(report, options, previous_options=previous_options) + + # Options is needed otherwise some elements added in the post processor go on the total line + options['ignore_totals_below_sections'] = True + options['no_xlsx_currency_code_columns'] = True + if 'active_id' in self._context and self._context.get('active_model') == 'account.journal': + options['bank_reconciliation_report_journal_id'] = self._context['active_id'] + elif 'bank_reconciliation_report_journal_id' in previous_options: + options['bank_reconciliation_report_journal_id'] = previous_options['bank_reconciliation_report_journal_id'] + else: + # This should never happen except in some test cases + options['bank_reconciliation_report_journal_id'] = self.env['account.journal'].search([('type', '=', 'bank')], limit=1).id + + # Remove multi-currency columns if needed + is_multi_currency = self.env.user.has_group('base.group_multi_currency') and self.env.user.has_group('base.group_no_one') + if not is_multi_currency: + options['columns'] = [ + column for column in options['columns'] + if column['expression_label'] not in ('amount_currency', 'currency') + ] + + ###################### + # Getter + ###################### + def _get_bank_journal_and_currencies(self, options): + journal = self.env['account.journal'].browse(options.get('bank_reconciliation_report_journal_id')) + company_currency = journal.company_id.currency_id + journal_currency = journal.currency_id or company_currency + return journal, journal_currency, company_currency + + ###################### + # Return function + ###################### + def _build_custom_engine_result(self, date=None, label=None, amount_currency=None, amount_currency_currency_id=None, currency=None, amount=0, amount_currency_id=None, has_sublines=False): + return { + 'date': date, + 'label': label, + 'amount_currency': amount_currency, + 'amount_currency_currency_id': amount_currency_currency_id, + 'currency': currency, + 'amount': amount, + 'amount_currency_id': amount_currency_id, + 'has_sublines': has_sublines, + } + + ###################### + # Engine + ###################### + def _report_custom_engine_forced_currency_amount(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + _journal, journal_currency, _company_currency = self._get_bank_journal_and_currencies(options) + return self._build_custom_engine_result(amount_currency_id=journal_currency.id) + + def _report_custom_engine_unreconciled_last_statement_receipts(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + return self._bank_reconciliation_report_custom_engine_common(options, 'receipts', current_groupby, True) + + def _report_custom_engine_unreconciled_last_statement_payments(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + return self._bank_reconciliation_report_custom_engine_common(options, 'payments', current_groupby, True) + + def _report_custom_engine_unreconciled_receipts(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + return self._bank_reconciliation_report_custom_engine_common(options, 'receipts', current_groupby, False) + + def _report_custom_engine_unreconciled_payments(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + return self._bank_reconciliation_report_custom_engine_common(options, 'payments', current_groupby, False) + + def _report_custom_engine_outstanding_receipts(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + return self._bank_reconciliation_report_custom_engine_outstanding_common(options, 'receipts', current_groupby) + + def _report_custom_engine_outstanding_payments(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + return self._bank_reconciliation_report_custom_engine_outstanding_common(options, 'payments', current_groupby) + + def _report_custom_engine_misc_operations(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + report = self.env['account.report'].browse(options['report_id']) + report._check_groupby_fields([current_groupby] if current_groupby else []) + + journal, journal_currency, _company_currency = self._get_bank_journal_and_currencies(options) + exchange_journal = journal.company_id.currency_exchange_journal_id + + bank_miscellaneous_domain = self._get_bank_miscellaneous_move_lines_domain(options, journal) + bank_miscellaneous_domain = expression.AND([ + bank_miscellaneous_domain, + [('journal_id', '!=', exchange_journal.id)] + ]) + + base_query = report._get_report_query(options, 'strict_range', domain=bank_miscellaneous_domain or []) + + groupby_field_sql = self.env['account.move.line']._field_to_sql("account_move_line", current_groupby, base_query) if current_groupby else None + query_sql = SQL( + """ + SELECT + %(select_from_groupby)s, + COALESCE(SUM(COALESCE(NULLIF(account_move_line.amount_currency, 0), account_move_line.balance)), 0) + FROM %(table_references)s + WHERE %(search_condition)s + %(groupby_sql)s + """, + select_from_groupby=groupby_field_sql, + table_references=base_query.from_clause, + search_condition=base_query.where_clause, + groupby_sql=SQL("GROUP BY %s", groupby_field_sql) if groupby_field_sql else SQL(), + ) + + self._cr.execute(query_sql) + query_res_lines = self._cr.fetchall() + + if not current_groupby: + return self._build_custom_engine_result(amount=query_res_lines[-1][1], amount_currency_id=journal_currency.id) + else: + return [ + (grouping_key, self._build_custom_engine_result(amount=amount, amount_currency_id=journal_currency.id)) + for grouping_key, amount in query_res_lines + ] + + def _report_custom_engine_last_statement_balance_amount(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + if current_groupby: + raise UserError(_("Custom engine _report_custom_engine_last_statement_balance_amount does not support groupby")) + + journal, journal_currency, _company_currency = self._get_bank_journal_and_currencies(options) + last_statement = self._get_last_bank_statement(journal, options) + + return self._build_custom_engine_result(amount=last_statement.balance_end_real, amount_currency_id=journal_currency.id) + + def _report_custom_engine_transaction_without_statement_amount(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + return self._bank_reconciliation_report_custom_engine_common(options, 'all', current_groupby, False, unreconciled=False) + + def _bank_reconciliation_report_custom_engine_common(self, options, internal_type, current_groupby, from_last_statement, unreconciled=True): + """ + Retrieve entries for bank reconciliation based on specified parameters. + Parameters: + - options (dict): A dictionary containing options of the report. + - internal_type (str): The internal type used for classification (e.g., receipt, payment). For the receipt + we will query the entries with a positive amounts and for the payment + the negative amounts. + If the internal type is another thing that receipt or payment it will get all the + entries position or negative + - current_groupby (str): The current grouping criteria. + - last_statement (bool, optional): If True, query entries from the last bank statement. + Otherwise, query entries that are not part of the last bank + statement. + - unreconciled (bool, optional): If True, query the unreconciled entries only + + """ + journal, journal_currency, _company_currency = self._get_bank_journal_and_currencies(options) + if not journal: + return self._build_custom_engine_result() + + report = self.env['account.report'].browse(options['report_id']) + report._check_groupby_fields([current_groupby] if current_groupby else []) + + def build_result_dict(query_res_lines): + # The query should find exactly one account move line per bank statement line + if current_groupby == 'id': + res = query_res_lines[0] + foreign_currency = self.env['res.currency'].browse(res['foreign_currency_id']) + rate = 1 # journal_currency / foreign_currency + if foreign_currency: + rate = (res['amount'] / res['amount_currency']) if res['amount_currency'] else 0 + + return self._build_custom_engine_result( + date=res['date'] if res['date'] else None, + label=res['payment_ref'] or res['ref'] or '/', + amount_currency=-res['amount_residual'] if res['foreign_currency_id'] else None, + amount_currency_currency_id=foreign_currency.id if res['foreign_currency_id'] else None, + currency=foreign_currency.display_name if res['foreign_currency_id'] else None, + amount=-res['amount_residual'] * rate if res['amount_residual'] else None, + amount_currency_id=journal_currency.id, + ) + else: + amount = 0 + for res in query_res_lines: + rate = 1 # journal_currency / foreign_currency + if res['foreign_currency_id']: + rate = (res['amount'] / res['amount_currency']) if res['amount_currency'] else 0 + amount += -res.get('amount_residual', 0) * rate if unreconciled else res.get('amount', 0) + + return self._build_custom_engine_result( + amount=amount, + amount_currency_id=journal_currency.id, + has_sublines=bool(len(query_res_lines)), + ) + + query = report._get_report_query(options, 'strict_range', domain=[ + ('journal_id', '=', journal.id), + ('account_id', '=', journal.default_account_id.id), # There should be only 1 line per move with that account + ]) + + if from_last_statement: + last_statement_id = self._get_last_bank_statement(journal, options).id + if last_statement_id: + last_statement_id_condition = SQL("st_line.statement_id = %s", last_statement_id) + else: + # If there is no last statement, the last statement section must be empty and the other must have all + # transaction + return self._compute_result([], current_groupby, build_result_dict) + else: + last_statement_id_condition = SQL("st_line.statement_id IS NULL") + + if internal_type == 'receipts': + st_line_amount_condition = SQL("AND st_line.amount > 0") + elif internal_type == 'payments': + st_line_amount_condition = SQL("AND st_line.amount < 0") + else: + # For the Transaction without statement, the internal type is 'all' + st_line_amount_condition = SQL("") + + groupby_field_sql = self.env['account.move.line']._field_to_sql("account_move_line", current_groupby, query) if current_groupby else SQL('NULL') + # Build query + query = SQL( + """ + SELECT %(select_from_groupby)s, + st_line.id, + move.name, + move.ref, + move.date, + st_line.payment_ref, + st_line.amount, + st_line.amount_residual, + st_line.amount_currency, + st_line.foreign_currency_id + FROM %(table_references)s + JOIN account_bank_statement_line st_line ON st_line.move_id = account_move_line.move_id + JOIN account_move move ON move.id = st_line.move_id + WHERE %(search_condition)s + %(is_unreconciled)s + %(st_line_amount_condition)s + AND %(last_statement_id_condition)s + GROUP BY %(group_by)s, + st_line.id, + move.id + """, + select_from_groupby=SQL("%s AS grouping_key", groupby_field_sql), + table_references=query.from_clause, + search_condition=query.where_clause, + is_receipt=SQL("st_line.amount > 0") if internal_type == "receipts" else SQL("st_line.amount < 0"), + is_unreconciled=SQL("AND NOT st_line.is_reconciled") if unreconciled else SQL(""), + st_line_amount_condition=st_line_amount_condition, + last_statement_id_condition=last_statement_id_condition, + group_by=groupby_field_sql if current_groupby else SQL('st_line.id'), # Same key in the groupby because we can't put a null key in a group by + ) + + self._cr.execute(query) + query_res_lines = self._cr.dictfetchall() + + return self._compute_result(query_res_lines, current_groupby, build_result_dict) + + def _bank_reconciliation_report_custom_engine_outstanding_common(self, options, internal_type, current_groupby): + """ + This engine retrieves the data of all recorded payments/receipts that have not been matched with a bank + statement yet + """ + journal, journal_currency, company_currency = self._get_bank_journal_and_currencies(options) + if not journal: + return self._build_custom_engine_result() + + report = self.env['account.report'].browse(options['report_id']) + report._check_groupby_fields([current_groupby] if current_groupby else []) + + def build_result_dict(query_res_lines): + if current_groupby == 'id': + res = query_res_lines[0] + convert = not (journal_currency and res['currency_id'] == journal_currency.id) + amount_currency = res['amount_residual_currency'] if res['is_account_reconcile'] else res['amount_currency'] + balance = res['amount_residual'] if res['is_account_reconcile'] else res['balance'] + foreign_currency = self.env['res.currency'].browse(res['currency_id']) + + return self._build_custom_engine_result( + date=res['date'] if res['date'] else None, + label=res['ref'] if res['ref'] else None, + amount_currency=amount_currency if convert else None, + amount_currency_currency_id=foreign_currency.id if convert else None, + currency=foreign_currency.display_name if convert else None, + amount=company_currency._convert(balance, journal_currency, journal.company_id, options['date']['date_to']) if convert else amount_currency, + amount_currency_id=journal_currency.id, + ) + else: + amount = 0 + for res in query_res_lines: + convert = not (journal_currency and res['currency_id'] == journal_currency.id) + if convert: + balance = res['amount_residual'] if res['is_account_reconcile'] else res['balance'] + amount += company_currency._convert(balance, journal_currency, journal.company_id, options['date']['date_to']) + else: + amount += res['amount_residual_currency'] if res['is_account_reconcile'] else res['amount_currency'] + + return self._build_custom_engine_result( + amount=amount, + amount_currency_id=journal_currency.id, + has_sublines=bool(len(query_res_lines)), + ) + + accounts = journal._get_journal_inbound_outstanding_payment_accounts() + journal._get_journal_outbound_outstanding_payment_accounts() + + query = report._get_report_query(options, 'from_beginning', domain=[ + ('journal_id', '=', journal.id), + ('account_id', 'in', accounts.ids), + ('full_reconcile_id', '=', False), + ('amount_residual_currency', '!=', 0.0) + ]) + + # Build query + groupby_field_sql = self.env['account.move.line']._field_to_sql("account_move_line", current_groupby, query) if current_groupby else SQL('NULL') + query = SQL( + """ + SELECT %(select_from_groupby)s, + account_move_line.account_id, + account_move_line.payment_id, + account_move_line.move_id, + account_move_line.currency_id, + account_move_line.move_name AS name, + account_move_line.ref, + account_move_line.date, + account.reconcile AS is_account_reconcile, + SUM(account_move_line.amount_residual) AS amount_residual, + SUM(account_move_line.balance) AS balance, + SUM(account_move_line.amount_residual_currency) AS amount_residual_currency, + SUM(account_move_line.amount_currency) AS amount_currency + FROM %(table_references)s + JOIN account_account account ON account.id = account_move_line.account_id + WHERE %(search_condition)s + AND %(is_receipt)s + GROUP BY %(group_by)s, + account_move_line.account_id, + account_move_line.payment_id, + account_move_line.move_id, + account_move_line.currency_id, + account_move_line.move_name, + account_move_line.ref, + account_move_line.date, + account.reconcile + """, + select_from_groupby=SQL("%s AS grouping_key", groupby_field_sql), + table_references=query.from_clause, + search_condition=query.where_clause, + is_receipt=SQL("account_move_line.balance > 0") if internal_type == "receipts" else SQL("account_move_line.balance < 0"), + group_by=groupby_field_sql if current_groupby else SQL('account_move_line.account_id'), # Same key in the groupby because we can't put a null key in a group by + ) + self._cr.execute(query) + query_res_lines = self._cr.dictfetchall() + + return self._compute_result(query_res_lines, current_groupby, build_result_dict) + + def _compute_result(self, query_res_lines, current_groupby, build_result_dict): + if not current_groupby: + return build_result_dict(query_res_lines) + else: + rslt = [] + + all_res_per_grouping_key = {} + for query_res in query_res_lines: + grouping_key = query_res['grouping_key'] + all_res_per_grouping_key.setdefault(grouping_key, []).append(query_res) + + for grouping_key, query_res_lines in all_res_per_grouping_key.items(): + rslt.append((grouping_key, build_result_dict(query_res_lines))) + + return rslt + + def _custom_line_postprocessor(self, report, options, lines): + lines = super()._custom_line_postprocessor(report, options, lines) + journal, _journal_currency, _company_currency = self._get_bank_journal_and_currencies(options) + if not journal: + return lines + + last_statement = self._get_last_bank_statement(journal, options) + + for line in lines: + line_id = report._get_res_id_from_line_id(line['id'], 'account.report.line') + code = self.env['account.report.line'].browse(line_id).code + + if code == "balance_bank": + line['name'] = _("Balance of '%s'", journal.default_account_id.display_name) + + if code == "last_statement_balance": + line['class'] = 'o_bold_tr' + if last_statement: + line['columns'][1].update({ + 'name': last_statement.display_name, + 'auditable': True, + }) + + if code == "transaction_without_statement": + line['class'] = 'o_bold_tr' + + if code == "misc_operations": + line['class'] = 'o_bold_tr' + + # Check if it's a leaf node + model, _model_id = report._get_model_info_from_id(line['id']) + if model == "account.move.line": + line_name = line['name'].split() + line['name'] = line_name[0] # This will give just the name without the ref or label + + return lines + + def _customize_warnings(self, report, options, all_column_groups_expression_totals, warnings): + journal, journal_currency, _company_currency = self._get_bank_journal_and_currencies(options) + inconsistent_statement = self._get_inconsistent_statements(options, journal).ids + bank_miscellaneous_domain = self._get_bank_miscellaneous_move_lines_domain(options, journal) + has_bank_miscellaneous_move_lines = bank_miscellaneous_domain and bool(self.env['account.move.line'].search_count(bank_miscellaneous_domain, limit=1)) + last_statement, balance_gl, balance_end, unexplained_difference, general_ledger_not_matching = self._compute_journal_balances(report, options, journal, journal_currency) + + if warnings is not None: + if last_statement and general_ledger_not_matching: + warnings['odex30_account_reports.journal_balance'] = { + 'alert_type': 'warning', + 'general_ledger_amount': balance_gl, + 'last_bank_statement_amount': balance_end, + 'unexplained_difference': unexplained_difference, + } + if inconsistent_statement: + warnings['odex30_account_reports.inconsistent_statement_warning'] = {'alert_type': 'warning', 'args': inconsistent_statement} + if has_bank_miscellaneous_move_lines: + warnings['odex30_account_reports.has_bank_miscellaneous_move_lines'] = {'alert_type': 'warning', 'args': journal.default_account_id.display_name} + + def _compute_journal_balances(self, report, options, journal, journal_currency): + """ + This function compute all necessary information for the warning 'odex30_account_reports.journal_balance' + :param report: The bank reconciliation report. + :param options: The report options. + :param journal: The journal used. + """ + # Get domain and balances + domain = report._get_options_domain(options, 'from_beginning') + balance_gl = journal._get_journal_bank_account_balance(domain=domain)[0] + last_statement, balance_end, difference, general_ledger_not_matching = self._compute_balances(options, journal, balance_gl, journal_currency) + + # Format values + balance_gl = report.format_value(options, balance_gl, format_params={'currency_id': journal_currency.id}, figure_type='monetary') + balance_end = report.format_value(options, balance_end, format_params={'currency_id': journal_currency.id}, figure_type='monetary') + difference = report.format_value(options, difference, format_params={'currency_id': journal_currency.id}, figure_type='monetary') + + return last_statement, balance_gl, balance_end, difference, general_ledger_not_matching + + def _compute_balances(self, options, journal, balance_gl, report_currency): + """ + This function will compute the balance of the last statement and the unexplained difference. + :param options: The report options. + :param journal: The journal used. + :param balance_gl: The balance of the general ledger. + :param report_currency: The currency of the report. + """ + report_date = fields.Date.from_string(options['date']['date_to']) + last_statement = self._get_last_bank_statement(journal, options) + balance_end = 0 + difference = 0 + general_ledger_not_matching = False + + if last_statement: + lines_before_date_to = last_statement.line_ids.filtered(lambda line: line.date <= report_date) + balance_end = last_statement.balance_start + sum(lines_before_date_to.mapped('amount')) + difference = balance_gl - balance_end + general_ledger_not_matching = not report_currency.is_zero(difference) + + return last_statement, balance_end, difference, general_ledger_not_matching + + def _get_last_bank_statement(self, journal, options): + """ + Retrieve the last bank statement created using this journal. + :param journal: The journal used. + :param domain: An additional domain to be applied on the account.bank.statement model. + :return: An account.bank.statement record or an empty recordset. + """ + report_date = fields.Date.from_string(options['date']['date_to']) + last_statement_domain = [('journal_id', '=', journal.id), ('statement_id', '!=', False), ('date', '<=', report_date)] + last_st_line = self.env['account.bank.statement.line'].search(last_statement_domain, order='date desc, id desc', limit=1) + return last_st_line.statement_id + + def _get_inconsistent_statements(self, options, journal): + """ + Retrieve the account.bank.statements records on the range of the options date having different starting + balance regarding its previous statement. + :param options: The report options. + :param journal: The account.journal from which this report has been opened. + :return: An account.bank.statements recordset. + """ + return self.env['account.bank.statement'].search([ + ('journal_id', '=', journal.id), + ('date', '<=', options['date']['date_to']), + ('is_valid', '=', False), + ]) + + def _get_bank_miscellaneous_move_lines_domain(self, options, journal): + """ + Get the domain to be used to retrieve the journal items affecting the bank accounts but not linked to + a statement line. (Limited in a year) + :param options: The report options. + :param journal: The account.journal from which this report has been opened. + :return: A domain to search on the account.move.line model. + + """ + if not journal.default_account_id: + return None + + report = self.env['account.report'].browse(options['report_id']) + domain = [ + ('account_id', '=', journal.default_account_id.id), + ('statement_line_id', '=', False), + *report._get_options_domain(options, 'from_beginning'), + ] + + fiscal_lock_date = journal.company_id._get_user_fiscal_lock_date(journal) + if fiscal_lock_date != date.min: + domain.append(('date', '>', fiscal_lock_date)) + + if journal.company_id.account_opening_move_id: + domain.append(('move_id', '!=', journal.company_id.account_opening_move_id.id)) + + return domain + + ################ + # Audit + ################ + def action_audit_cell(self, options, params): + report_line = self.env['account.report.line'].browse(params['report_line_id']) + if report_line.code == "balance_bank": + return self.action_redirect_to_general_ledger(options) + elif report_line.code == "misc_operations": + return self.open_bank_miscellaneous_move_lines(options) + elif report_line.code == "last_statement_balance": + return self.action_redirect_to_bank_statement_widget(options) + else: + return report_line.report_id.action_audit_cell(options, params) + + ################ + # ACTIONS + ################ + def action_redirect_to_general_ledger(self, options): + """ + Action to redirect to the general ledger + :param options: The report options. + :return: Actions to the report + """ + general_ledger_action = self.env['ir.actions.actions']._for_xml_id('odex30_account_reports.action_account_report_general_ledger') + general_ledger_action['params'] = { + 'options': options, + 'ignore_session': True, + } + + return general_ledger_action + + def action_redirect_to_bank_statement_widget(self, options): + """ + Redirect the user to the requested bank statement, if empty displays all bank transactions of the journal. + :param options: The report options. + :param params: The action params containing at least 'statement_id', can be false. + :return: A dictionary representing an ir.actions.act_window. + """ + journal = self.env['account.journal'].browse(options.get('bank_reconciliation_report_journal_id')) + last_statement = self._get_last_bank_statement(journal, options) + return self.env['account.bank.statement.line']._action_open_bank_reconciliation_widget( + default_context={'create': False, 'search_default_statement_id': last_statement.id}, + name=last_statement.display_name, + ) + + def open_bank_miscellaneous_move_lines(self, options): + """ + An action opening the account.move.line list view affecting the bank account balance but not linked to + a bank statement line. + :param options: The report options. + :param params: -Not used-. + :return: An action redirecting to the list view of journal items. + """ + journal = self.env['account.journal'].browse(options['bank_reconciliation_report_journal_id']) + + return { + 'name': _('Journal Items'), + 'type': 'ir.actions.act_window', + 'res_model': 'account.move.line', + 'view_type': 'list', + 'view_mode': 'list', + 'target': 'current', + 'views': [(self.env.ref('account.view_move_line_tree').id, 'list')], + 'domain': self.env['account.bank.reconciliation.report.handler']._get_bank_miscellaneous_move_lines_domain(options, journal), + } + + def bank_reconciliation_report_open_inconsistent_statements(self, options, params=None): + """ + An action opening the account.bank.statement view (form or list) depending the 'inconsistent_statement_ids' + key set on the options. + :param options: The report options. + :param params: -Not used-. + :return: An action redirecting to a view of statements. + """ + inconsistent_statement_ids = params['args'] + action = { + 'name': _("Inconsistent Statements"), + 'type': 'ir.actions.act_window', + 'res_model': 'account.bank.statement', + } + if len(inconsistent_statement_ids) == 1: + action.update({ + 'view_mode': 'form', + 'res_id': inconsistent_statement_ids[0], + 'views': [(False, 'form')], + }) + else: + action.update({ + 'view_mode': 'list', + 'domain': [('id', 'in', inconsistent_statement_ids)], + 'views': [(False, 'list')], + }) + return action diff --git a/dev_odex30_accounting/odex30_account_reports/models/budget.py b/dev_odex30_accounting/odex30_account_reports/models/budget.py new file mode 100644 index 0000000..ddf15a8 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/budget.py @@ -0,0 +1,116 @@ +from itertools import zip_longest +from dateutil.relativedelta import relativedelta + +from odoo import api, Command, fields, models, _ +from odoo.exceptions import ValidationError +from odoo.tools import date_utils, float_is_zero, float_round + + +class AccountReportBudget(models.Model): + _name = 'account.report.budget' + _description = "Accounting Report Budget" + _order = 'sequence, id' + + sequence = fields.Integer(string="Sequence") + name = fields.Char(string="Name", required=True) + item_ids = fields.One2many(string="Items", comodel_name='account.report.budget.item', inverse_name='budget_id') + company_id = fields.Many2one(string="Company", comodel_name='res.company', required=True, default=lambda x: x.env.company) + + @api.constrains('name') + def _contrains_name(self): + for budget in self: + if not budget.name: + raise ValidationError(_("Please enter a valid budget name.")) + + @api.model_create_multi + def create(self, create_values): + for values in create_values: + if name := values.get('name'): + values['name'] = name.strip() + return super().create(create_values) + + def _create_or_update_budget_items(self, value_to_set, account_id, rounding, date_from, date_to): + """ This method will create / update several budget items following the number + of months between date_from(include) and date_to(include). + + :param value_to_set: The value written by the user in the report cell. + :param account_id: The related account id. + :param rounding: The rounding for the decimal precision. + :param date_from: The start date for the budget item creation. + :param date_to: The end date for the budget item creation. + """ + self.ensure_one() + + date_from, date_to = fields.Date.to_date(date_from), fields.Date.to_date(date_to) + if date_from != date_utils.start_of(date_from, 'month'): + date_from = (date_from.replace(day=1) + relativedelta(months=1)) + existing_budget_items = self.env['account.report.budget.item'].search_fetch([ + ('budget_id', '=', self.id), + ('account_id', '=', account_id), + ('date', '<=', date_to), + ('date', '>=', date_from), + ], ['id', 'amount']) + existing_budget_items_by_date = {item.date: item for item in existing_budget_items} + total_amount = sum(existing_budget_items.mapped('amount')) + + value_to_compute = value_to_set - total_amount + if float_is_zero(value_to_compute, precision_digits=rounding): + # In case the computed amount equals 0, we do an early return as + # it's not necessary to create new budget item + return + + start_month_dates = [ + date_utils.start_of(date, 'month') + for date in date_utils.date_range(date_from, date_to) + ] + + # Fill a list with the same amounts for each month + amounts = [float_round(value_to_compute / len(start_month_dates), precision_digits=rounding, rounding_method='DOWN')] * len(start_month_dates) + # Add the remainder in the last amount + amounts[-1] += float_round(value_to_compute - sum(amounts), precision_digits=rounding) + + budget_items_commands = [] + for start_month_date, amount in zip_longest(start_month_dates, amounts): + existing_budget_item = existing_budget_items_by_date.get(start_month_date) + if existing_budget_item: + budget_items_commands.append(Command.update(existing_budget_item.id, { + 'amount': existing_budget_item.amount + amount, + })) + else: + budget_items_commands.append(Command.create({ + 'account_id': account_id, + 'amount': amount, + 'date': start_month_date, + })) + + if budget_items_commands: + self.item_ids = budget_items_commands + # Make sure that the model is flushed before continuing the code and fetching these new items + self.env['account.report.budget.item'].flush_model() + + def copy_data(self, default=None): + vals_list = super().copy_data(default=default) + return [dict(vals, name=self.env._("%s (copy)", budget.name)) for budget, vals in zip(self, vals_list)] + + def copy(self, default=None): + new_budgets = super().copy(default) + for old_budget, new_budget in zip(self, new_budgets): + for item in old_budget.item_ids: + item.copy({ + 'budget_id': new_budget.id, + 'account_id': item.account_id.id, + 'amount': item.amount, + 'date': item.date, + }) + + return new_budgets + + +class AccountReportBudgetItem(models.Model): + _name = 'account.report.budget.item' + _description = "Accounting Report Budget Item" + + budget_id = fields.Many2one(string="Budget", comodel_name='account.report.budget', required=True, ondelete='cascade') + account_id = fields.Many2one(string="Account", comodel_name='account.account', required=True) + amount = fields.Float(string="Amount", default=0) + date = fields.Date(required=True) diff --git a/dev_odex30_accounting/odex30_account_reports/models/chart_template.py b/dev_odex30_accounting/odex30_account_reports/models/chart_template.py new file mode 100644 index 0000000..0a9728b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/chart_template.py @@ -0,0 +1,39 @@ +# coding: utf-8 +from odoo import fields, models, _ +from odoo.exceptions import ValidationError + + +class AccountChartTemplate(models.AbstractModel): + _inherit = 'account.chart.template' + + def _post_load_data(self, template_code, company, template_data): + super()._post_load_data(template_code, company, template_data) + + company = company or self.env.company + default_misc_journal = self.env['account.journal'].search([ + *self.env['account.journal']._check_company_domain(company), + ('type', '=', 'general') + ], limit=1) + if not default_misc_journal: + raise ValidationError(_("No default miscellaneous journal could be found for the active company")) + + company.update({ + 'totals_below_sections': company.anglo_saxon_accounting, + 'account_tax_periodicity_journal_id': default_misc_journal, + 'account_tax_periodicity_reminder_day': 7, + }) + default_misc_journal.show_on_dashboard = True + + generic_tax_report = self.env.ref('account.generic_tax_report') + tax_report = self.env['account.report'].search([ + ('availability_condition', '=', 'country'), + ('country_id', '=', company.country_id.id), + ('root_report_id', '=', generic_tax_report.id), + ], limit=1) + if not tax_report: + tax_report = generic_tax_report + + _dummy, period_end = company._get_tax_closing_period_boundaries(fields.Date.today(), tax_report) + activity = company._get_tax_closing_reminder_activity(tax_report.id, period_end) + if not activity: + company._generate_tax_closing_reminder_activity(tax_report, period_end) diff --git a/dev_odex30_accounting/odex30_account_reports/models/executive_summary_report.py b/dev_odex30_accounting/odex30_account_reports/models/executive_summary_report.py new file mode 100644 index 0000000..dd409a4 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/executive_summary_report.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- + +from odoo import fields, models +from odoo.exceptions import UserError + +class ExecutiveSummaryReport(models.Model): + _inherit = 'account.report' + + def _report_custom_engine_executive_summary_ndays(self, expressions, options, date_scope, current_groupby, next_groupby, offset=0, limit=None, warnings=None): + if current_groupby or next_groupby: + raise UserError("NDays expressions of executive summary report don't support the 'group by' feature.") + + date_diff = fields.Date.from_string(options['date']['date_to']) - fields.Date.from_string(options['date']['date_from']) + return {'result': date_diff.days} diff --git a/dev_odex30_accounting/odex30_account_reports/models/ir_actions.py b/dev_odex30_accounting/odex30_account_reports/models/ir_actions.py new file mode 100644 index 0000000..cfe18b9 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/ir_actions.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- + +from odoo import models + +class IrActionsAccountReportDownload(models.AbstractModel): + + _name = 'ir_actions_account_report_download' + _description = 'Technical model for accounting report downloads' + + def _get_readable_fields(self): + + return self.env['ir.actions.actions']._get_readable_fields() | {'data'} diff --git a/dev_odex30_accounting/odex30_account_reports/models/mail_activity.py b/dev_odex30_accounting/odex30_account_reports/models/mail_activity.py new file mode 100644 index 0000000..8ca2a7f --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/mail_activity.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- + +from odoo import fields, models, _ + + +class AccountTaxReportActivity(models.Model): + _inherit = "mail.activity" + + account_tax_closing_params = fields.Json(string="Tax closing additional params") + + def action_open_tax_activity(self): + self.ensure_one() + if self.activity_type_id == self.env.ref('odex30_account_reports.mail_activity_type_tax_report_to_pay'): + move = self.env['account.move'].browse(self.res_id) + return move._action_tax_to_pay_wizard() + elif self.activity_type_id == self.env.ref('odex30_account_reports.mail_activity_type_tax_report_to_be_sent'): + move = self.env['account.move'].browse(self.res_id) + return move._action_tax_to_send() + + if self.activity_type_id == self.env.ref('odex30_account_reports.mail_activity_type_tax_report_error'): + move = self.env['account.move'].browse(self.res_id) + return move._action_tax_report_error() + + journal = self.env['account.journal'].browse(self.res_id) + options = {} + if self.account_tax_closing_params: + options = self.env['account.move']._get_tax_closing_report_options( + journal.company_id, + self.env['account.fiscal.position'].browse(self.account_tax_closing_params['fpos_id']) if self.account_tax_closing_params['fpos_id'] else False, + self.env['account.report'].browse(self.account_tax_closing_params['report_id']), + fields.Date.from_string(self.account_tax_closing_params['tax_closing_end_date']) + ) + action = self.env["ir.actions.actions"]._for_xml_id("odex30_account_reports.action_account_report_gt") + action.update({'params': {'options': options, 'ignore_session': True}}) + return action diff --git a/dev_odex30_accounting/odex30_account_reports/models/mail_activity_type.py b/dev_odex30_accounting/odex30_account_reports/models/mail_activity_type.py new file mode 100644 index 0000000..d02c57e --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/mail_activity_type.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +from odoo import api, fields, models + + +class AccountTaxReportActivityType(models.Model): + _inherit = "mail.activity.type" + + category = fields.Selection(selection_add=[('tax_report', 'Tax report')]) + + @api.model + def _get_model_info_by_xmlid(self): + info = super()._get_model_info_by_xmlid() + info['odex30_account_reports.tax_closing_activity_type'] = { + 'res_model': 'account.journal', + 'unlink': False, + } + info['odex30_account_reports.mail_activity_type_tax_report_to_pay'] = { + 'res_model': 'account.move', + 'unlink': False, + } + info['odex30_account_reports.mail_activity_type_tax_report_to_be_sent'] = { + 'res_model': 'account.move', + 'unlink': False, + } + return info diff --git a/dev_odex30_accounting/odex30_account_reports/models/res_company.py b/dev_odex30_accounting/odex30_account_reports/models/res_company.py new file mode 100644 index 0000000..fd3dd36 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/res_company.py @@ -0,0 +1,465 @@ +# -*- coding: utf-8 -*- + +import datetime +from dateutil.relativedelta import relativedelta +import itertools + +from odoo import api, fields, models, _ +from odoo.exceptions import UserError +from odoo.tools import date_utils +from odoo.tools.misc import format_date + + +class ResCompany(models.Model): + _inherit = "res.company" + + totals_below_sections = fields.Boolean( + string='Add totals below sections', + help='When ticked, totals and subtotals appear below the sections of the report.') + account_tax_periodicity = fields.Selection([ + ('year', 'annually'), + ('semester', 'semi-annually'), + ('4_months', 'every 4 months'), + ('trimester', 'quarterly'), + ('2_months', 'every 2 months'), + ('monthly', 'monthly')], string="Delay units", help="Periodicity", default='monthly', required=True) + account_tax_periodicity_reminder_day = fields.Integer(string='Start from', default=7, required=True) + account_tax_periodicity_journal_id = fields.Many2one('account.journal', string='Journal', domain=[('type', '=', 'general')], check_company=True) + account_revaluation_journal_id = fields.Many2one('account.journal', domain=[('type', '=', 'general')], check_company=True) + account_revaluation_expense_provision_account_id = fields.Many2one('account.account', string='Expense Provision Account', check_company=True) + account_revaluation_income_provision_account_id = fields.Many2one('account.account', string='Income Provision Account', check_company=True) + account_tax_unit_ids = fields.Many2many(string="Tax Units", comodel_name='account.tax.unit', help="The tax units this company belongs to.") + account_representative_id = fields.Many2one('res.partner', string='Accounting Firm', + help="Specify an Accounting Firm that will act as a representative when exporting reports.") + account_display_representative_field = fields.Boolean(compute='_compute_account_display_representative_field') + + @api.depends('account_fiscal_country_id.code') + def _compute_account_display_representative_field(self): + country_set = self._get_countries_allowing_tax_representative() + for record in self: + record.account_display_representative_field = record.account_fiscal_country_id.code in country_set + + def _get_countries_allowing_tax_representative(self): + """ Returns a set containing the country codes of the countries for which + it is possible to use a representative to submit the tax report. + This function is a hook that needs to be overridden in localisation modules. + """ + return set() + + def _get_default_misc_journal(self): + """ Returns a default 'miscellanous' journal to use for + account_tax_periodicity_journal_id field. This is useful in case a + CoA was already installed on the company at the time the module + is installed, so that the field is set automatically when added.""" + return self.env['account.journal'].search([ + *self.env['account.journal']._check_company_domain(self), + ('type', '=', 'general'), + ], limit=1) + + def _get_tax_closing_journal(self): + journals = self.env['account.journal'] + for company in self: + journals |= company.account_tax_periodicity_journal_id or company._get_default_misc_journal() + + return journals + + @api.model_create_multi + def create(self, vals_list): + companies = super().create(vals_list) + companies._initiate_account_onboardings() + return companies + + def write(self, values): + tax_closing_update_dependencies = ('account_tax_periodicity', 'account_tax_periodicity_journal_id.id') + to_update = self.env['res.company'] + for company in self: + if company._get_tax_closing_journal(): + need_tax_closing_update = any( + update_dep in values and company.mapped(update_dep)[0] != values[update_dep] + for update_dep in tax_closing_update_dependencies + ) + + if need_tax_closing_update: + to_update += company + + res = super().write(values) + + # Early return + if not to_update: + return res + + to_reset_closing_moves = self.env['account.move'].sudo().search([ + ('company_id', 'in', to_update.ids), + ('tax_closing_report_id', '!=', False), + ('state', '=', 'draft'), + ]) + to_reset_closing_moves.button_cancel() + misc_journals = self.env['account.journal'].sudo().search([ + *self.env['account.journal']._check_company_domain(to_update), + ('type', '=', 'general'), + ]) + to_reset_closing_reminder_activities = self.env['mail.activity'].sudo().search([ + ('res_id', 'in', misc_journals.ids), + ('res_model_id', '=', self.env['ir.model']._get_id('account.journal')), + ('activity_type_id', '=', self.env.ref('odex30_account_reports.tax_closing_activity_type').id), + ('active', '=', True), + ]) + to_reset_closing_reminder_activities.action_cancel() + generic_tax_report = self.env.ref('account.generic_tax_report') + + # Create a new reminder + # The user is unlikely to change the periodicity often and for multiple companies at once + # So it is fair enough to make this that way as we are obliged to get the tax report for each company + # And then loop over all the reports to get their period boudaries and look for activity + for company in to_update: + tax_reports = self.env['account.report'].search([ + ('availability_condition', '=', 'country'), + ('country_id', 'in', company.account_enabled_tax_country_ids.ids), + ('root_report_id', '=', generic_tax_report.id), + ]) + if not tax_reports.filtered(lambda x: x.country_id == company.account_fiscal_country_id): + tax_reports += generic_tax_report + + for tax_report in tax_reports: + period_start, period_end = company._get_tax_closing_period_boundaries(fields.Date.today(), tax_report) + activity = company._get_tax_closing_reminder_activity(tax_report.id, period_end) + if not activity and self.env['account.move'].search_count([ + ('date', '<=', period_end), + ('date', '>=', period_start), + ('tax_closing_report_id', '=', tax_report.id), + ('company_id', '=', company.id), + ('state', '=', 'posted') + ]) == 0: + company._generate_tax_closing_reminder_activity(tax_report, period_end) + + hidden_tax_journals = self._get_tax_closing_journal().sudo().filtered(lambda j: not j.show_on_dashboard) + if hidden_tax_journals: + hidden_tax_journals.show_on_dashboard = True + + return res + + def _get_closing_report_for_tax_closing_move(self, report, fpos): + closing_report = report + + if not closing_report.country_id and closing_report.root_report_id: + # Fallback to root report if we're using a non-localized variant (typically the grouped tax reports) + closing_report = closing_report.root_report_id + + target_country = (fpos and fpos.country_id) or self.env.company.account_fiscal_country_id + country_variants = [variant for variant in (closing_report.root_report_id or closing_report).variant_report_ids if variant.country_id == target_country] + if len(country_variants) > 1: + # More than one national variant available: use the generic tax report + closing_report = self.env.ref('account.generic_tax_report') + elif country_variants and closing_report.country_id != target_country: + # Only one national variant available: select it + closing_report = country_variants[0] + + return closing_report + + def _get_and_update_tax_closing_moves(self, in_period_date, report, fiscal_positions=None, include_domestic=False): + """ Searches for tax closing moves. If some are missing for the provided parameters, + they are created in draft state. Also, existing moves get updated in case of configuration changes + (closing journal or periodicity, for example). Note the content of these moves stays untouched. + + :param in_period_date: A date within the tax closing period we want the closing for. + :param fiscal_positions: The fiscal positions we want to generate the closing for (as a recordset). + :param include_domestic: Whether or not the domestic closing (i.e. the one without any fiscal_position_id) must be included + + :return: The closing moves, as a recordset. + """ + self.ensure_one() + + if not fiscal_positions: + fiscal_positions = [] + + # Compute period dates depending on the date + tax_closing_journal = self._get_tax_closing_journal() + + all_closing_moves = self.env['account.move'] + for fpos in itertools.chain(fiscal_positions, [False] if include_domestic else []): + closing_report = self._get_closing_report_for_tax_closing_move(report, fpos) + + period_start, period_end = self._get_tax_closing_period_boundaries(in_period_date, closing_report) + periodicity = self._get_tax_periodicity(closing_report) + + fpos_id = fpos.id if fpos else False + tax_closing_move = self.env['account.move'].search([ + ('state', '=', 'draft'), + ('company_id', '=', self.id), + ('tax_closing_report_id', '=', closing_report.id), + ('date', '>=', period_start), + ('date', '<=', period_end), + ('fiscal_position_id', '=', fpos.id if fpos else None), + ]) + + # This should never happen, but can be caused by wrong manual operations + if len(tax_closing_move) > 1: + if fpos: + error = _("Multiple draft tax closing entries exist for fiscal position %(position)s after %(period_start)s. There should be at most one. \n %(closing_entries)s", + position=fpos.name, period_start=period_start, closing_entries=tax_closing_move.mapped('display_name')) + + else: + error = _("Multiple draft tax closing entries exist for your domestic region after %(period_start)s. There should be at most one. \n %(closing_entries)s", + period_start=period_start, closing_entries=tax_closing_move.mapped('display_name')) + + raise UserError(error) + + # Compute tax closing description + ref = _("%(report_label)s: %(period)s", report_label=self._get_tax_closing_report_display_name(closing_report), period=self._get_tax_closing_move_description(periodicity, period_start, period_end, fpos, closing_report)) + + # Values for update/creation of closing move + closing_vals = { + 'company_id': self.id,# Important to specify together with the journal, for branches + 'journal_id': tax_closing_journal.id, + 'date': period_end, + 'tax_closing_report_id': closing_report.id, + 'fiscal_position_id': fpos_id, + 'ref': ref, + 'name': '/', # Explicitly set a void name so that we don't set the sequence for the journal and don't consume a sequence number + } + + if tax_closing_move: + tax_closing_move.write(closing_vals) + else: + # Create a new, empty, tax closing move + tax_closing_move = self.env['account.move'].create(closing_vals) + + # Create a reminder activity if it doesn't exist + activity = self._get_tax_closing_reminder_activity(closing_report.id, period_end, fpos_id) + tax_closing_options = tax_closing_move._get_tax_closing_report_options(tax_closing_move.company_id, tax_closing_move.fiscal_position_id, tax_closing_move.tax_closing_report_id, tax_closing_move.date) + if not activity and closing_report._get_sender_company_for_export(tax_closing_options) == tax_closing_move.company_id: + self._generate_tax_closing_reminder_activity(closing_report, period_end, fpos) + + all_closing_moves += tax_closing_move + + return all_closing_moves + + def _get_tax_closing_report_display_name(self, report): + if report.get_external_id().get(report.id) in ('account.generic_tax_report', 'account.generic_tax_report_account_tax', 'account.generic_tax_report_tax_account'): + return _("Tax return") + + return report.display_name + + def _generate_tax_closing_reminder_activity(self, report, date_in_period=None, fiscal_position=None): + """ + Create a reminder on the current tax_closing_journal for a certain report with a fiscal_position or not if None. + The reminder will target the period from which the date sits in + """ + self.ensure_one() + if not date_in_period: + date_in_period = fields.Date.today() + # Search for an existing tax closing move + tax_closing_activity_type = self.env.ref('odex30_account_reports.tax_closing_activity_type') + + # Tax period + period_start, period_end = self._get_tax_closing_period_boundaries(date_in_period, report) + periodicity = self._get_tax_periodicity(report) + activity_deadline = period_end + relativedelta(days=self.account_tax_periodicity_reminder_day) + + # Reminder title + summary = _( + "%(report_label)s: %(period)s", + report_label=self._get_tax_closing_report_display_name(report), + period=self._get_tax_closing_move_description(periodicity, period_start, period_end, fiscal_position, report) + ) + + activity_user = tax_closing_activity_type.default_user_id if tax_closing_activity_type else self.env['res.users'] + if activity_user and not (self in activity_user.company_ids and activity_user.has_group('account.group_account_manager')): + activity_user = self.env['res.users'] + + if not activity_user: + activity_user = self.env['res.users'].search( + [('company_ids', 'in', self.ids), ('groups_id', 'in', self.env.ref('account.group_account_manager').ids)], + limit=1, order="id ASC", + ) + + self.env['mail.activity'].with_context(mail_activity_quick_update=True).create({ + 'res_id': self._get_tax_closing_journal().id, + 'res_model_id': self.env['ir.model']._get_id('account.journal'), + 'activity_type_id': tax_closing_activity_type.id, + 'date_deadline': activity_deadline, + 'automated': True, + 'summary': summary, + 'user_id': activity_user.id or self.env.user.id, + 'account_tax_closing_params': { + 'report_id': report.id, + 'tax_closing_end_date': fields.Date.to_string(period_end), + 'fpos_id': fiscal_position.id if fiscal_position else False, + }, + }) + + def _get_tax_closing_reminder_activity(self, report_id, period_end, fpos_id=False): + self.ensure_one() + tax_closing_activity_type = self.env.ref('odex30_account_reports.tax_closing_activity_type') + return self._get_tax_closing_journal().activity_ids.filtered( + lambda act: act.account_tax_closing_params and (act.activity_type_id == tax_closing_activity_type and act.account_tax_closing_params['report_id'] == report_id + and fields.Date.from_string(act.account_tax_closing_params['tax_closing_end_date']) == period_end + and act.account_tax_closing_params['fpos_id'] == fpos_id) + ) + + def _get_tax_closing_move_description(self, periodicity, period_start, period_end, fiscal_position, report): + """ Returns a string description of the provided period dates, with the + given tax periodicity. + """ + self.ensure_one() + + foreign_vat_fpos_count = self.env['account.fiscal.position'].search_count([ + ('company_id', '=', self.id), + ('foreign_vat', '!=', False) + ]) + if foreign_vat_fpos_count: + if fiscal_position: + country_code = fiscal_position.country_id.code + state_codes = fiscal_position.mapped('state_ids.code') if fiscal_position.state_ids else [] + else: + # On domestic country + country_code = self.account_fiscal_country_id.code + + # Only consider the state in case there are foreign VAT fpos on states in this country + vat_fpos_with_state_count = self.env['account.fiscal.position'].search_count([ + ('company_id', '=', self.id), + ('foreign_vat', '!=', False), + ('country_id', '=', self.account_fiscal_country_id.id), + ('state_ids', '!=', False), + ]) + state_codes = [self.state_id.code] if self.state_id and vat_fpos_with_state_count else [] + + if state_codes: + region_string = " (%s - %s)" % (country_code, ', '.join(state_codes)) + else: + region_string = " (%s)" % country_code + else: + # Don't add region information in case there is no foreign VAT fpos + region_string = '' + + # Shift back to normal dates if we are using a start date so periods aren't broken + start_day, start_month = self._get_tax_closing_start_date_attributes(report) + if start_day != 1 or start_month != 1: + return f"{format_date(self.env, period_start)} - {format_date(self.env, period_end)}{region_string}" + + if periodicity == 'year': + return f"{period_start.year}{region_string}" + elif periodicity == 'trimester': + return f"{format_date(self.env, period_start, date_format='qqq yyyy')}{region_string}" + elif periodicity == 'monthly': + return f"{format_date(self.env, period_start, date_format='LLLL yyyy')}{region_string}" + else: + return f"{format_date(self.env, period_start)} - {format_date(self.env, period_end)}{region_string}" + + def _get_tax_closing_period_boundaries(self, date, report): + """ Returns the boundaries of the tax period containing the provided date + for this company, as a tuple (start, end). + + This function needs to stay consitent with the one inside Javascript in the filters for the tax report + """ + self.ensure_one() + period_months = self._get_tax_periodicity_months_delay(report) + start_day, start_month = self._get_tax_closing_start_date_attributes(report) + aligned_date = date + relativedelta(days=-(start_day - 1)) # we offset the date back from start_day amount of day - 1 so we can compute months periods aligned to the start and end of months + year = aligned_date.year + month_offset = aligned_date.month - start_month + period_number = (month_offset // period_months) + 1 + + # If the date is before the start date and start month of this year, this mean we are in the previous period + # So the initial_date should be one year before and the period_number should be computed in reverse because month_offset is negative + if date < datetime.date(date.year, start_month, start_day): + year -= 1 + period_number = ((12 + month_offset) // period_months) + 1 + + month_delta = period_number * period_months + + # We need to work with offsets because it handle automatically the end of months (28, 29, 30, 31) + end_date = datetime.date(year, start_month, 1) + relativedelta(months=month_delta, days=start_day - 2) # -1 because the first days is aldready counted and -1 because the first day of the next period must not be in this range + start_date = datetime.date(year, start_month, 1) + relativedelta(months=month_delta - period_months, day=start_day) + + return start_date, end_date + + def _get_available_tax_unit(self, report): + """ + Must ensures that report has a country_id to search for a tax unit + + :return: A recordset of available tax units for this report country_id and this company + """ + self.ensure_one() + return self.env['account.tax.unit'].search([ + ('company_ids', 'in', self.id), + ('country_id', '=', report.country_id.id), + ], limit=1) + + def _get_tax_periodicity(self, report): + main_company = self + if report.filter_multi_company == 'tax_units' and report.country_id and (tax_unit := self._get_available_tax_unit(report)): + main_company = tax_unit.main_company_id + + return main_company.account_tax_periodicity + + def _get_tax_closing_start_date_attributes(self, report): + if not report.tax_closing_start_date: + start_year = fields.Date.start_of(fields.Date.today(), 'year') + return start_year.day, start_year.month + + main_company = self + if report.filter_multi_company == 'tax_units' and report.country_id and (tax_unit := self._get_available_tax_unit(report)): + main_company = tax_unit.main_company_id + + start_date = report.with_company(main_company).tax_closing_start_date + + return start_date.day, start_date.month + + def _get_tax_periodicity_months_delay(self, report): + """ Returns the number of months separating two tax returns with the provided periodicity + """ + self.ensure_one() + periodicities = { + 'year': 12, + 'semester': 6, + '4_months': 4, + 'trimester': 3, + '2_months': 2, + 'monthly': 1, + } + return periodicities[self._get_tax_periodicity(report)] + + def _get_branches_with_same_vat(self, accessible_only=False): + """ Returns all companies among self and its branch hierachy (considering children and parents) that share the same VAT number + as self. An empty VAT number is considered as being the same as the one of the closest parent with a VAT number. + + self is always returned as the first element of the resulting recordset (so that this can safely be used to restore the active company). + + Example: + - main company ; vat = 123 + - branch 1 + - branch 1_1 + - branch 2 ; vat = 456 + - branch 2_1 ; vat = 789 + - branch 2_2 + + In this example, the following VAT numbers will be considered for each company: + - main company: 123 + - branch 1: 123 + - branch 1_1: 123 + - branch 2: 456 + - branch 2_1: 789 + - branch 2_2: 456 + + :param accessible_only: whether the returned companies should exclude companies that are not in self.env.companies + """ + self.ensure_one() + + current = self.sudo() + same_vat_branch_ids = [current.id] # Current is always available + current_strict_parents = current.parent_ids - current + if accessible_only: + candidate_branches = current.root_id._accessible_branches() + else: + candidate_branches = self.env['res.company'].sudo().search([('id', 'child_of', current.root_id.ids)]) + + current_vat_check_set = {current.vat} if current.vat else set() + for branch in candidate_branches - current: + parents_vat_set = set(filter(None, (branch.parent_ids - current_strict_parents).mapped('vat'))) + if parents_vat_set == current_vat_check_set: + # If all the branches between the active company and branch (both included) share the same VAT number as the active company, + # we want to add the branch to the selection. + same_vat_branch_ids.append(branch.id) + + return self.browse(same_vat_branch_ids) diff --git a/dev_odex30_accounting/odex30_account_reports/models/res_config_settings.py b/dev_odex30_accounting/odex30_account_reports/models/res_config_settings.py new file mode 100644 index 0000000..f589d33 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/res_config_settings.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- + +from calendar import monthrange + +from odoo import api, fields, models, _ +from dateutil.relativedelta import relativedelta +from odoo.tools.misc import format_date +from odoo.tools import date_utils + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + totals_below_sections = fields.Boolean(related='company_id.totals_below_sections', string='Add totals below sections', readonly=False, + help='When ticked, totals and subtotals appear below the sections of the report.') + account_tax_periodicity = fields.Selection(related='company_id.account_tax_periodicity', string='Periodicity', readonly=False, required=True) + account_tax_periodicity_reminder_day = fields.Integer(related='company_id.account_tax_periodicity_reminder_day', string='Reminder', readonly=False, required=True) + account_tax_periodicity_journal_id = fields.Many2one(related='company_id.account_tax_periodicity_journal_id', string='Journal', readonly=False) + + account_reports_show_per_company_setting = fields.Boolean(compute="_compute_account_reports_show_per_company_setting") + + def open_tax_group_list(self): + self.ensure_one() + return { + 'type': 'ir.actions.act_window', + 'name': 'Tax groups', + 'res_model': 'account.tax.group', + 'view_mode': 'list', + 'context': { + 'default_country_id': self.account_fiscal_country_id.id, + 'search_default_country_id': self.account_fiscal_country_id.id, + }, + } + + @api.depends('account_tax_periodicity', 'company_id', 'fiscalyear_last_day', 'fiscalyear_last_month') + def _compute_account_reports_show_per_company_setting(self): + custom_start_country_codes = self._get_country_codes_with_another_tax_closing_start_date() + countries = self.env['account.fiscal.position'].search([ + ('company_id', '=', self.env.company.id), + ('foreign_vat', '!=', False), + ]).mapped('country_id') + self.env.company.account_fiscal_country_id + countries_to_always_show = bool(set(countries.mapped('code')) & custom_start_country_codes) + for config_settings in self: + if countries_to_always_show: + config_settings.account_reports_show_per_company_setting = True + else: + max_last_day = monthrange(fields.Date.today().year, int(config_settings.fiscalyear_last_month))[1] + if config_settings.account_tax_periodicity == 'monthly': + config_settings.account_reports_show_per_company_setting = max_last_day != config_settings.fiscalyear_last_day + else: + config_settings.account_reports_show_per_company_setting = config_settings.fiscalyear_last_month != '12' or config_settings.fiscalyear_last_day != max_last_day + + def open_company_dependent_report_settings(self): + self.ensure_one() + generic_tax_report = self.env.ref('account.generic_tax_report') + available_reports = generic_tax_report._get_variants(generic_tax_report.id) + + return { + 'type': 'ir.actions.act_window', + 'name': _('Configure your start dates'), + 'res_model': 'account.report', + 'domain': [('id', 'in', available_reports.ids)], + 'views': [(self.env.ref('odex30_account_reports.account_report_tree_configure_start_dates').id, 'list')] + } + + def _get_country_codes_with_another_tax_closing_start_date(self): + """ + To be overridden by specific countries that wants this + + Used to know which countries can have specific start dates settings on reports + + :returns set(str): A set of country codes from which the start date settings should be shown + """ + return set() diff --git a/dev_odex30_accounting/odex30_account_reports/models/res_partner.py b/dev_odex30_accounting/odex30_account_reports/models/res_partner.py new file mode 100644 index 0000000..f767469 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/models/res_partner.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- + +from odoo import api, fields, models, _ + + +class ResPartner(models.Model): + _name = 'res.partner' + _inherit = 'res.partner' + + account_represented_company_ids = fields.One2many('res.company', 'account_representative_id') + + def _get_followup_responsible(self): + return self.env.user + + def open_partner_ledger(self): + # Deprecated, will be removed in master + action = self.env["ir.actions.actions"]._for_xml_id("odex30_account_reports.action_account_report_partner_ledger") + action['params'] = { + 'options': {'partner_ids': self.ids, 'unfold_all': len(self.ids) == 1}, + 'ignore_session': True, + } + return action + + def open_customer_statement(self): + if not self.env.ref('odex30_account_reports.customer_statement_report', raise_if_not_found=False): + return self.open_partner_ledger() + action = self.env["ir.actions.actions"]._for_xml_id("odex30_account_reports.action_account_report_customer_statement") + action['params'] = { + 'options': { + 'partner_ids': (self | self.commercial_partner_id).ids, + 'unfold_all': len(self.ids) == 1, + }, + 'ignore_session': True, + } + return action + + def open_partner(self): + return { + 'type': 'ir.actions.act_window', + 'res_model': 'res.partner', + 'res_id': self.id, + 'views': [[False, 'form']], + 'view_mode': 'form', + 'target': 'current', + } + + @api.depends_context('show_more_partner_info') + def _compute_display_name(self): + if not self.env.context.get('show_more_partner_info'): + return super()._compute_display_name() + for partner in self: + res = "" + if partner.vat: + res += f" {partner.vat}," + if partner.country_id: + res += f" {partner.country_id.code}," + partner.display_name = f"{partner.name} - " + res + + def _get_partner_account_report_attachment(self, report, options=None): + self.ensure_one() + if self.lang: + # Print the followup in the customer's language + report = report.with_context(lang=self.lang) + + if not options: + options = report.get_options({ + 'forced_companies': self.env.company.search([('id', 'child_of', self.env.context.get('allowed_company_ids', self.env.company.id))]).ids, + 'partner_ids': self.ids, + 'unfold_all': True, + 'unreconciled': True, + # The following two options are Deprecated, will be removed in master + 'hide_account': True, + 'hide_debit_credit': True, + 'all_entries': False, + }) + attachment_file = report.export_to_pdf(options) + return self.env['ir.attachment'].create([ + { + 'name': f"{self.name} - {attachment_file['file_name']}", + 'res_model': self._name, + 'res_id': self.id, + 'type': 'binary', + 'raw': attachment_file['file_content'], + 'mimetype': 'application/pdf', + }, + ]) + + def set_commercial_partner_main(self): + self.ensure_one() + + main_partner = self + duplicated_partners = self.env['res.partner'].search([ + ('vat', '=', main_partner.vat), + ('id', '!=', main_partner.id) + ]) + # Update commercial partner of all duplicates + duplicated_partners.write({ + 'is_company': False, + 'parent_id': main_partner.id, + 'type': 'invoice', + }) + duplicated_partners_vat = self._context.get('duplicated_partners_vat', []) + remaining_vats = [pvat for pvat in duplicated_partners_vat if pvat != main_partner.vat] + return self.env['account.ec.sales.report.handler']._get_duplicated_vat_partners(remaining_vats) diff --git a/dev_odex30_accounting/odex30_account_reports/security/ir.model.access.csv b/dev_odex30_accounting/odex30_account_reports/security/ir.model.access.csv new file mode 100644 index 0000000..beaceee --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/security/ir.model.access.csv @@ -0,0 +1,19 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_report_annotation_readonly,account.account_report_annotation_readonly,model_account_report_annotation,account.group_account_readonly,1,0,0,0 +access_account_report_annotation,account.account_report_annotation,model_account_report_annotation,account.group_account_user,1,1,1,1 +access_account_report_annotation_invoice,account.account_report_annotation,model_account_report_annotation,account.group_account_invoice,1,0,0,0 +access_account_reports_export_wizard,access.account_reports.export.wizard,model_account_reports_export_wizard,account.group_account_user,1,1,1,0 +access_account_reports_export_wizard_format,access.account_reports.export.wizard.format,model_account_reports_export_wizard_format,account.group_account_user,1,1,1,0 +access_account_report_file_download_error_wizard,account.report.file.download.error.wizard,model_account_report_file_download_error_wizard,account.group_account_user,1,1,1,0 +access_account_multicurrency_revaluation_wizard,access.account.multicurrency.revaluation.wizard,model_account_multicurrency_revaluation_wizard,account.group_account_user,1,1,1,0 +access_account_tax_unit_readonly,access_account_tax_unit_readonly,model_account_tax_unit,account.group_account_readonly,1,0,0,0 +access_account_tax_unit_manager,access_account_tax_unit_manager,model_account_tax_unit,account.group_account_manager,1,1,1,1 +access_account_report_horizontal_group_readonly,account.report.horizontal.group.readonly,model_account_report_horizontal_group,account.group_account_readonly,1,0,0,0 +access_account_report_horizontal_group_ac_user,account.report.horizontal.group.ac.user,model_account_report_horizontal_group,account.group_account_manager,1,1,1,1 +access_account_report_horizontal_group_rule_readonly,account.report.horizontal.group.rule.readonly,model_account_report_horizontal_group_rule,account.group_account_readonly,1,0,0,0 +access_account_report_horizontal_group_rule_ac_user,account.report.horizontal.group.rule.ac.user,model_account_report_horizontal_group_rule,account.group_account_manager,1,1,1,1 +access_account_report_budget_readonly,account.report.budget.readonly,model_account_report_budget,account.group_account_readonly,1,0,0,0 +access_account_report_budget_ac_user,account.report.budget.ac.user,model_account_report_budget,account.group_account_manager,1,1,1,1 +access_account_report_budget_item_readonly,account.report.budget.item.readonly,model_account_report_budget_item,account.group_account_readonly,1,0,0,0 +access_account_report_budget_item_ac_user,account.report.budget.item.ac.user,model_account_report_budget_item,account.group_account_manager,1,1,1,1 +access_account_report_send,access.account.report.send,model_account_report_send,account.group_account_invoice,1,1,1,1 diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/account_report.js b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/account_report.js new file mode 100644 index 0000000..79b5307 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/account_report.js @@ -0,0 +1,125 @@ +/** @odoo-module */ + +import { registry } from "@web/core/registry"; +import { useService } from "@web/core/utils/hooks"; +import { ControlPanel } from "@web/search/control_panel/control_panel"; + +import { Component, onWillStart, useRef, useState, useSubEnv } from "@odoo/owl"; + +import { AccountReportController } from "@odex30_account_reports/components/account_report/controller"; +import { AccountReportButtonsBar } from "@odex30_account_reports/components/account_report/buttons_bar/buttons_bar"; +import { AccountReportCogMenu } from "@odex30_account_reports/components/account_report/cog_menu/cog_menu"; +import { AccountReportEllipsis } from "@odex30_account_reports/components/account_report/ellipsis/ellipsis"; +import { AccountReportFilters } from "@odex30_account_reports/components/account_report/filters/filters"; +import { AccountReportHeader } from "@odex30_account_reports/components/account_report/header/header"; +import { AccountReportLine } from "@odex30_account_reports/components/account_report/line/line"; +import { AccountReportLineCell } from "@odex30_account_reports/components/account_report/line_cell/line_cell"; +import { AccountReportLineName } from "@odex30_account_reports/components/account_report/line_name/line_name"; +import { AccountReportSearchBar } from "@odex30_account_reports/components/account_report/search_bar/search_bar"; +import { standardActionServiceProps } from "@web/webclient/actions/action_service"; +import { useSetupAction } from "@web/search/action_hook"; + + +export class AccountReport extends Component { + static template = "odex30_account_reports.AccountReport"; + static props = { ...standardActionServiceProps }; + static components = { + ControlPanel, + AccountReportButtonsBar, + AccountReportCogMenu, + AccountReportSearchBar, + }; + + static customizableComponents = [ + AccountReportEllipsis, + AccountReportFilters, + AccountReportHeader, + AccountReportLine, + AccountReportLineCell, + AccountReportLineName, + ]; + static defaultComponentsMap = []; + + setup() { + this.rootRef = useRef("root"); + useSetupAction({ + rootRef: this.rootRef, + getLocalState: () => { + return { + keep_journal_groups_options: true, // used when using the breadcrumb + }; + } + }) + if (this.props?.state?.keep_journal_groups_options !== undefined) { + this.props.action.keep_journal_groups_options = true; + } + + // Can not use 'control-panel-bottom-right' slot without this, as viewSwitcherEntries doesn't exist here. + this.env.config.viewSwitcherEntries = []; + + this.orm = useService("orm"); + this.actionService = useService("action"); + this.controller = useState(new AccountReportController(this.props.action)); + this.initialQuery = this.props.action.context.default_filter_accounts || ''; + + for (const customizableComponent of AccountReport.customizableComponents) + AccountReport.defaultComponentsMap[customizableComponent.name] = customizableComponent; + + onWillStart(async () => { + await this.controller.load(this.env); + }); + + useSubEnv({ + controller: this.controller, + component: this.getComponent.bind(this), + template: this.getTemplate.bind(this), + }); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Custom overrides + // ----------------------------------------------------------------------------------------------------------------- + static registerCustomComponent(customComponent) { + registry.category("account_reports_custom_components").add(customComponent.template, customComponent); + } + + get cssCustomClass() { + return this.controller.data.custom_display.css_custom_class || ""; + } + + getComponent(name) { + const customComponents = this.controller.data.custom_display.components; + + if (customComponents && customComponents[name]) + return registry.category("account_reports_custom_components").get(customComponents[name]); + + return AccountReport.defaultComponentsMap[name]; + } + + getTemplate(name) { + const customTemplates = this.controller.data.custom_display.templates; + + if (customTemplates && customTemplates[name]) + return customTemplates[name]; + + return `odex30_account_reports.${ name }Customizable`; + } + + // ----------------------------------------------------------------------------------------------------------------- + // Table + // ----------------------------------------------------------------------------------------------------------------- + get tableClasses() { + let classes = ""; + + if (this.controller.options.columns.length > 1) { + classes += " striped"; + } + + if (this.controller.options['horizontal_split']) + classes += " w-50 mx-2"; + + return classes; + } +} + +registry.category("actions").add("account_report", AccountReport); diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/account_report.scss b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/account_report.scss new file mode 100644 index 0000000..1c6cfe1 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/account_report.scss @@ -0,0 +1,465 @@ +.account_report { + .fit-content { width: fit-content } + + //------------------------------------------------------------------------------------------------------------------ + // Control panel + //------------------------------------------------------------------------------------------------------------------ + .o_control_panel_main_buttons { + .dropdown-item { + padding: 0; + .btn-link { + width: 100%; + text-align: left; + padding: 3px 20px; + border-radius: 0; + } + } + } + + .o_control_panel_breadcrumbs { + flex-basis: min-content; + } + + //------------------------------------------------------------------------------------------------------------------ + // Sections + //------------------------------------------------------------------------------------------------------------------ + .section_selector { + display: flex; + gap: 4px; + margin: 16px 16px 8px 16px; + justify-content: center; + } + + //------------------------------------------------------------------------------------------------------------------ + // Alert + //------------------------------------------------------------------------------------------------------------------ + .warnings { margin-bottom: 1rem } + .alert { + margin-bottom: 0; + border-radius: 0; + + a:hover { cursor:pointer } + } + + //------------------------------------------------------------------------------------------------------------------ + // No content + //------------------------------------------------------------------------------------------------------------------ + .o_view_nocontent { z-index: -1 } + + //------------------------------------------------------------------------------------------------------------------ + // Table + //------------------------------------------------------------------------------------------------------------------ + .table { + background-color: $o-view-background-color; + border-collapse: separate; //!\\ Allows to add padding to the table + border-spacing: 0; //!\\ Removes default spacing between cells due to 'border-collapse: separate' + font-size: 0.8rem; + margin: 0 auto 24px; + padding: 24px; + width: auto; + min-width: 800px; + border: 1px solid $o-gray-300; + border-radius: 0.25rem; + + > :not(caption) > * > * { padding: 0.25rem 0.75rem } //!\\ Override of bootstrap, keep selector + + > thead { + > tr { + th:first-child { + color: lightgrey; + } + th:not(:first-child) { + text-align: center; + vertical-align: middle; + } + } + > tr:not(:last-child) > th:not(:first-child) { border: 1px solid $o-gray-300 } + } + + > tbody { + > tr { + &.unfolded { font-weight: bold } + > td { + a { cursor: pointer } + .clickable { color: $o-enterprise-action-color } + &.muted { color: var(--AccountReport-muted-data-color, $o-gray-300) } + &:empty::after{ content: "\00a0" } //!\\ Prevents the collapse of empty table rows + &:empty { line-height: 1 } + .btn_annotation { color: $o-enterprise-action-color } + } + + &:not(.empty) > td { border-bottom: 1px solid var(--AccountReport-fine-line-separator-color, $o-gray-200) } + &.total { font-weight: bold } + &.o_bold_tr { font-weight: bold } + + &.unfolded { + > td { border-bottom: 1px solid $o-gray-300 } + .btn_action { opacity: 1 } + .btn_more { opacity: 1 } + } + + &:hover { + &.empty > * { --table-accent-bg: transparent } + .auditable { + color: $o-enterprise-action-color !important; + + > a:hover { cursor: pointer } + } + .muted { color: $o-gray-800 } + .btn_action, .btn_more { + opacity: 1; + color: $o-enterprise-action-color; + } + .btn_edit { color: $o-enterprise-action-color } + .btn_dropdown { color: $o-enterprise-action-color } + .btn_foldable { color: $o-enterprise-action-color } + .btn_ellipsis { color: $o-enterprise-action-color } + .btn_annotation_go { color: $o-enterprise-action-color } + .btn_debug { color: $o-enterprise-action-color } + } + } + } + } + + table.striped { + //!\\ Changes the background of every even column starting with the 3rd one + > thead > tr:not(:first-child) > th:nth-child(2n+3) { background: $o-gray-100 } + > tbody { + > tr:not(.line_level_0):not(.empty) > td:nth-child(2n+3) { background: $o-gray-100 } + > tr.line_level_0 > td:nth-child(2n+3) { background: $o-gray-300 } + } + } + + thead.sticky { + background-color: $o-view-background-color; + position: sticky; + top: 0; + z-index: 999; + } + + //------------------------------------------------------------------------------------------------------------------ + // Line + //------------------------------------------------------------------------------------------------------------------ + .line_name { + vertical-align: middle; + > .wrapper { + display: flex; + align-items: center; + + > .content { + display: flex; + align-items: center; + sup { top: auto } + } + } + + .name { white-space: nowrap } + &.unfoldable:hover { cursor: pointer } + } + + .line_cell { + vertical-align: middle; + > .wrapper { + display: flex; + align-items: center; + + > .content { + display: flex; + align-items: center; + } + } + + &.date > .wrapper { justify-content: center } + &.numeric > .wrapper { justify-content: flex-end } + .name { white-space: nowrap } + } + + .editable-cell { + input { + color: $o-enterprise-action-color; + border: none; + max-width: 100px; + float: right; + + &:hover { + cursor: pointer; + } + } + + &:hover { + cursor: pointer; + } + + &:focus-within { + border-bottom-color: $o-enterprise-action-color !important; + + input { + color: $o-black; + } + } + } + + .line_level_0 { + color: $o-gray-700; + font-weight: bold; + + > td { + border-bottom: 0 !important; + background-color: $o-gray-300; + } + .muted { color: $o-gray-400 !important } + .btn_debug { color: $o-gray-400 } + } + + @for $i from 2 through 16 { + .line_level_#{$i} { + $indentation: (($i + 1) * 8px) - 20px; // 20px are for the btn_foldable width + + > td { + color: $o-gray-700; + + &.line_name.unfoldable .wrapper { column-gap: calc(#{ $indentation }) } + &.line_name:not(.unfoldable) .wrapper { padding-left: $indentation } + } + } + } + + //------------------------------------------------------------------------------------------------------------------ + // Link + //------------------------------------------------------------------------------------------------------------------ + .link { color: $o-enterprise-action-color } + + //------------------------------------------------------------------------------------------------------------------ + // buttons + //------------------------------------------------------------------------------------------------------------------ + .btn_debug, .btn_dropdown, .btn_foldable, .btn_foldable_empty, .btn_sortable, .btn_ellipsis, + .btn_more, .btn_annotation, .btn_annotation_go, .btn_annotation_delete, .btn_action, .btn_edit { + border: none; + color: $o-gray-300; + font-size: inherit; + font-weight: normal; + padding: 0; + text-align: center; + width: 20px; + white-space: nowrap; + + &:hover { + color: $o-enterprise-action-color !important; + cursor: pointer; + } + } + + .btn_sortable > .fa-long-arrow-up, .btn_sortable > .fa-long-arrow-down { color: $o-enterprise-action-color } + .btn_foldable { color: $o-gray-500 } + .btn_foldable_empty:hover { cursor: default } + .btn_ellipsis > i { vertical-align: bottom } + .btn_more { opacity: 1 } + .btn_annotation { margin-left: 6px } + .btn_annotation_go { color: $o-gray-600 } + .btn_annotation_delete { + margin-left: 4px; + vertical-align: baseline; + } + .btn_action { + opacity: 0; + background-color: $o-view-background-color; + color: $o-gray-600; + width: auto; + padding: 0 0.25rem; + margin: 0 0.25rem; + border: 1px solid $o-gray-300; + border-radius: 0.25rem; + } + + //------------------------------------------------------------------------------------------------------------------ + // Dropdown + //------------------------------------------------------------------------------------------------------------------ + .dropdown { display: inline } + + //------------------------------------------------------------------------------------------------------------------ + // Annotation + //------------------------------------------------------------------------------------------------------------------ + .annotations { + border-top: 1px solid $o-gray-300; + font-size: 0.8rem; + padding: 24px 0; + + > li { + line-height: 24px; + margin-left: 24px; + &:hover > button { color: $o-enterprise-action-color } + } + } +} + +//---------------------------------------------------------------------------------------------------------------------- +// Dialogs +//---------------------------------------------------------------------------------------------------------------------- +.account_report_annotation_dialog { + textarea { + border: 1px solid $o-gray-300; + border-radius: 0.25rem; + height: 120px; + padding: .5rem; + } +} + +//---------------------------------------------------------------------------------------------------------------------- +// Popovers +//---------------------------------------------------------------------------------------------------------------------- +.account_report_popover_edit { + padding: .5rem 1rem; + box-sizing: content-box; + + .edit_popover_boolean label { padding: 0 12px 0 4px } + + .edit_popover_string { + width: 260px; + padding: 8px; + border-color: $o-gray-200; + } + + .btn { + color: $o-white; + background-color: $o-enterprise-action-color; + } +} + +.account_report_popover_ellipsis { + > p { + float: left; + margin: 1rem; + width: 360px; + } +} + +.account_report_btn_clone { + margin: 1rem 1rem 0 0; + border: none; + color: $o-gray-300; + font-size: inherit; + font-weight: normal; + padding: 0; + text-align: center; + width: 20px; + + &:hover { + color: $o-enterprise-action-color !important; + cursor: pointer; + } +} + +.account_report_popover_debug { + width: 350px; + overflow-x: auto; + + > .line_debug { + display: flex; + flex-direction: row; + padding: .25rem 1rem; + + &:first-child { padding-top: 1rem } + &:last-child { padding-bottom: 1rem } + + > span:first-child { + color: $o-gray-600; + max-width: 25%; //!\\ Not the same as 'width' because of 'display: flex' + min-width: 25%; //!\\ Not the same as 'width' because of 'display: flex' + white-space: nowrap; + margin-right: 10px; + } + > span:last-child { + color: $o-gray-800; + max-width: 75%; //!\\ Not the same as 'width' because of 'display: flex' + min-width: 75%; //!\\ Not the same as 'width' because of 'display: flex' + } + } + + > .totals_separator { margin: .25rem 1rem } + > .engine_separator { margin: 1rem } +} + +.carryover_popover { + margin: 12px; + width: 300px; +} + +.o_web_client:has(.annotation_popover) { + + .popover:has(.annotation_tooltip) { visibility: hidden; } + + .popover:has(.annotation_popover) { + max-height: 45%; + max-width: 60%; + white-space: pre-wrap; + overflow-y: auto; + + .annotation_popover { + overflow: scroll; + + .annotation_popover_line th{ + background-color: $o-white; + position: sticky; + top: 0; + z-index: 10; + } + + } + + .annotation_popover_line:nth-child(2n+2) { background: $o-gray-200; } + + .annotation_popover_line { + .o_datetime_input { + border: none; + } + } + + tr, th, td:not(:has(.btn_annotation_update)):not(:has(.btn_annotation_delete)) { + padding: .5rem 1rem .5rem .5rem; + vertical-align: top; + } + + .annotation_popover_editable_cell { + background-color: transparent; + border: 0; + box-shadow: none; + color: $o-gray-700; + resize: none; + width: 85px; + outline: none; + } + } +} + +label:focus-within input { border: 0; } + +.popover:has(.annotation_tooltip) { + + > .tooltip-inner { + padding: 0; + color: $o-white; + background-color: $o-white; + + > .annotation_tooltip { + color: $o-gray-700; + background-color: $o-white; + white-space: pre-wrap; + + > .annotation_tooltip_line:nth-child(2n+2) { background: $o-gray-200; } + + tr, th, td { + padding: .25rem .5rem .25rem .25rem; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: top; + } + } + + + .popover-arrow { + &.top-0::after { border-right-color: $o-white; } + &.bottom-0::after { border-left-color: $o-white; } + &.start-0::after { border-bottom-color: $o-white; } + &.end-0::after { border-top-color: $o-white; } + } + } +} diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/account_report.xml b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/account_report.xml new file mode 100644 index 0000000..cb3a036 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/account_report.xml @@ -0,0 +1,107 @@ + + + + + + + +
    + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + + +
    +
    +

    No data to display !

    +

    There is no data to display for the given filters.

    +
    +
    +
    +
    +
    + + diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/buttons_bar/buttons_bar.js b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/buttons_bar/buttons_bar.js new file mode 100644 index 0000000..a3c1e7b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/buttons_bar/buttons_bar.js @@ -0,0 +1,27 @@ +/** @odoo-module */ + +import { Component, useState } from "@odoo/owl"; + +export class AccountReportButtonsBar extends Component { + static template = "odex30_account_reports.AccountReportButtonsBar"; + static props = {}; + + setup() { + this.controller = useState(this.env.controller); + } + + //------------------------------------------------------------------------------------------------------------------ + // Buttons + //------------------------------------------------------------------------------------------------------------------ + get barButtons() { + const buttons = []; + + for (const button of this.controller.buttons) { + if (button.always_show) { + buttons.push(button); + } + } + + return buttons; + } +} diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/buttons_bar/buttons_bar.xml b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/buttons_bar/buttons_bar.xml new file mode 100644 index 0000000..47a5501 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/buttons_bar/buttons_bar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/cog_menu/cog_menu.js b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/cog_menu/cog_menu.js new file mode 100644 index 0000000..45d262d --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/cog_menu/cog_menu.js @@ -0,0 +1,31 @@ +/** @odoo-module **/ + +import {Component, useState} from "@odoo/owl"; +import { Dropdown } from "@web/core/dropdown/dropdown"; +import { DropdownItem } from "@web/core/dropdown/dropdown_item"; + + +export class AccountReportCogMenu extends Component { + static template = "odex30_account_reports.AccountReportCogMenu"; + static components = {Dropdown, DropdownItem}; + static props = {}; + + setup() { + this.controller = useState(this.env.controller); + } + + //------------------------------------------------------------------------------------------------------------------ + // Buttons + //------------------------------------------------------------------------------------------------------------------ + get cogButtons() { + const buttons = []; + + for (const button of this.controller.buttons) { + if (!button.always_show) { + buttons.push(button); + } + } + + return buttons; + } +} diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/cog_menu/cog_menu.xml b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/cog_menu/cog_menu.xml new file mode 100644 index 0000000..3efa3b1 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/cog_menu/cog_menu.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/controller.js b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/controller.js new file mode 100644 index 0000000..1d9623a --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/controller.js @@ -0,0 +1,820 @@ +/* global owl:readonly */ + +import { browser } from "@web/core/browser/browser"; +import { session } from "@web/session"; +import { useService } from "@web/core/utils/hooks"; + +import { removeTaxGroupingFromLineId } from "@odex30_account_reports/js/util"; + +export class AccountReportController { + constructor(action) { + this.action = action; + this.actionService = useService("action"); + this.dialog = useService("dialog"); + this.orm = useService("orm"); + } + + async load(env) { + this.env = env; + this.reportOptionsMap = {}; + this.reportInformationMap = {}; + this.lastOpenedSectionByReport = {}; + this.loadingCallNumberByCacheKey = new Proxy( + {}, + { + get(target, name) { + return name in target ? target[name] : 0; + }, + set(target, name, newValue) { + target[name] = newValue; + return true; + }, + } + ); + this.actionReportId = this.action.context.report_id; + const isOpeningReport = !this.action?.keep_journal_groups_options // true when opening the report, except when coming from the breadcrumb + const mainReportOptions = await this.loadReportOptions(this.actionReportId, false, this.action.params?.ignore_session, isOpeningReport); + const cacheKey = this.getCacheKey(mainReportOptions['sections_source_id'], mainReportOptions['report_id']); + + // We need the options to be set and saved in order for the loading to work properly + this.options = mainReportOptions; + this.reportOptionsMap[cacheKey] = mainReportOptions; + this.incrementCallNumber(cacheKey); + this.options["loading_call_number"] = this.loadingCallNumberByCacheKey[cacheKey]; + this.saveSessionOptions(mainReportOptions); + + const activeSectionPromise = this.displayReport(mainReportOptions['report_id']); + this.preLoadClosedSections(); + await activeSectionPromise; + } + + getCacheKey(sectionsSourceId, reportId) { + return `${sectionsSourceId}_${reportId}` + } + + incrementCallNumber(cacheKey = null) { + if (!cacheKey) { + cacheKey = this.getCacheKey(this.options['sections_source_id'], this.options['report_id']); + } + this.loadingCallNumberByCacheKey[cacheKey] += 1; + } + + async displayReport(reportId) { + const cacheKey = await this.loadReport(reportId); + const options = await this.reportOptionsMap[cacheKey]; + const informationMap = await this.reportInformationMap[cacheKey]; + if ( + options !== undefined + && this.loadingCallNumberByCacheKey[cacheKey] === options["loading_call_number"] + && (this.lastOpenedSectionByReport === {} || this.lastOpenedSectionByReport[options['selected_variant_id']] === options['selected_section_id']) + ) { + // the options gotten from the python correspond to the ones that called this displayReport + this.options = options; + + // informationMap might be undefined if the promise has been deleted by another call. + // Don't need to set data, the call that deleted it is coming to re-put data + if (informationMap !== undefined) { + this.data = informationMap; + // If there is a specific order for lines in the options, we want to use it by default + if (this.areLinesOrdered()) { + await this.sortLines(); + } + this.setLineVisibility(this.lines); + this.refreshVisibleAnnotations(); + this.saveSessionOptions(this.options); + } + + } + } + + async reload(optionPath, newOptions) { + const rootOptionKey = optionPath ? optionPath.split(".")[0] : ""; + + /* + When reloading the UI after setting an option filter, invalidate the cached options and data of all sections supporting this filter. + This way, those sections will be reloaded (either synchronously when the user tries to access them or asynchronously via the preloading + feature), and will then use the new filter value. This ensures the filters are always applied consistently to all sections. + */ + for (const [cacheKey, cachedOptionsPromise] of Object.entries(this.reportOptionsMap)) { + let cachedOptions = await cachedOptionsPromise; + + if (rootOptionKey === "" || cachedOptions.hasOwnProperty(rootOptionKey)) { + delete this.reportOptionsMap[cacheKey]; + delete this.reportInformationMap[cacheKey]; + } + } + + this.saveSessionOptions(newOptions); // The new options will be loaded from the session. Saving them now ensures the new filter is taken into account. + await this.displayReport(newOptions['report_id']); + } + + async preLoadClosedSections() { + let sectionLoaded = false; + for (const section of this.options['sections']) { + // Preload the first non-loaded section we find amongst this report's sections. + const cacheKey = this.getCacheKey(this.options['sections_source_id'], section.id); + if (section.id != this.options['report_id'] && !this.reportInformationMap[cacheKey]) { + await this.loadReport(section.id, true); + + sectionLoaded = true; + // Stop iterating and schedule next call. We don't go on in the loop in case the cache is reset and we need to restart preloading. + break; + } + } + + let nextCallDelay = (sectionLoaded) ? 100 : 1000; + + const self = this; + setTimeout(() => self.preLoadClosedSections(), nextCallDelay); + } + + async loadReport(reportId, preloading=false) { + const options = await this.loadReportOptions(reportId, preloading, false); // This also sets the promise in the cache + const reportToDisplayId = options['report_id']; // Might be different from reportId, in case the report to open uses sections + + const cacheKey = this.getCacheKey(options['sections_source_id'], reportToDisplayId) + if (!this.reportInformationMap[cacheKey]) { + this.reportInformationMap[cacheKey] = this.orm.call( + "account.report", + options.readonly_query ? "get_report_information_readonly" : "get_report_information", + [ + reportToDisplayId, + options, + ], + { + context: this.action.context, + }, + ); + } + + await this.reportInformationMap[cacheKey]; + + if (!preloading) { + if (options['sections'].length) + this.lastOpenedSectionByReport[options['sections_source_id']] = options['selected_section_id']; + } + + return cacheKey; + } + + async loadReportOptions(reportId, preloading=false, ignore_session=false, isOpeningReport=false) { + const loadOptions = (ignore_session || !this.hasSessionOptions()) ? (this.action.params?.options || {}) : this.sessionOptions(); + const cacheKey = this.getCacheKey(loadOptions['sections_source_id'] || reportId, reportId); + + if (!(cacheKey in this.loadingCallNumberByCacheKey)) { + this.incrementCallNumber(cacheKey); + } + loadOptions["loading_call_number"] = this.loadingCallNumberByCacheKey[cacheKey]; + + loadOptions["is_opening_report"] = isOpeningReport; + + if (!this.reportOptionsMap[cacheKey]) { + // The options for this section are not loaded nor loading. Let's load them ! + + if (preloading) + loadOptions['selected_section_id'] = reportId; + else { + /* Reopen the last opened section by default (cannot be done through regular caching, because composite reports' options are not + cached (since they always reroute). */ + if (this.lastOpenedSectionByReport[reportId]) + loadOptions['selected_section_id'] = this.lastOpenedSectionByReport[reportId]; + } + + this.reportOptionsMap[cacheKey] = this.orm.call( + "account.report", + "get_options", + [ + reportId, + loadOptions, + ], + { + context: this.action.context, + }, + ); + + // Wait for the result, and check the report hasn't been rerouted to a section or variant; fix the cache if it has + let reportOptions = await this.reportOptionsMap[cacheKey]; + + // In case of a reroute, also set the cached options into the reroute target's key + const loadedOptionsCacheKey = this.getCacheKey(reportOptions['sections_source_id'], reportOptions['report_id']); + if (loadedOptionsCacheKey !== cacheKey) { + /* We delete the rerouting report from the cache, to avoid redoing this reroute when reloading the cached options, as it would mean + route reports can never be opened directly if they open some variant by default.*/ + delete this.reportOptionsMap[cacheKey]; + this.reportOptionsMap[loadedOptionsCacheKey] = reportOptions; + + this.loadingCallNumberByCacheKey[loadedOptionsCacheKey] = 1; + delete this.loadingCallNumberByCacheKey[cacheKey]; + return reportOptions; + } + } + + return this.reportOptionsMap[cacheKey]; + } + + //------------------------------------------------------------------------------------------------------------------ + // Generic data getters + //------------------------------------------------------------------------------------------------------------------ + get buttons() { + return this.options.buttons; + } + + get caretOptions() { + return this.data.caret_options; + } + + get columnHeadersRenderData() { + return this.data.column_headers_render_data; + } + + get columnGroupsTotals() { + return this.data.column_groups_totals; + } + + get context() { + return this.data.context; + } + + get filters() { + return this.data.filters; + } + + get annotations() { + return this.data.annotations; + } + + get groups() { + return this.data.groups; + } + + get lines() { + return this.data.lines; + } + + get warnings() { + return this.data.warnings; + } + + get linesOrder() { + return this.data.lines_order; + } + + get report() { + return this.data.report; + } + + get visibleAnnotations() { + return this.data.visible_annotations; + } + + //------------------------------------------------------------------------------------------------------------------ + // Generic data setters + //------------------------------------------------------------------------------------------------------------------ + set annotations(value) { + this.data.annotations = value; + } + + set columnGroupsTotals(value) { + this.data.column_groups_totals = value; + } + + set lines(value) { + this.data.lines = value; + this.setLineVisibility(this.lines); + } + + set linesOrder(value) { + this.data.lines_order = value; + } + + set visibleAnnotations(value) { + this.data.visible_annotations = value; + } + + //------------------------------------------------------------------------------------------------------------------ + // Helpers + //------------------------------------------------------------------------------------------------------------------ + get needsColumnPercentComparison() { + return this.options.column_percent_comparison === "growth"; + } + + get hasCustomSubheaders() { + return this.columnHeadersRenderData.custom_subheaders.length > 0; + } + + get hasDebugColumn() { + return Boolean(this.options.show_debug_column); + } + + get hasStringDate() { + return "date" in this.options && "string" in this.options.date; + } + + get hasVisibleAnnotations() { + return Boolean(this.visibleAnnotations.length); + } + + //------------------------------------------------------------------------------------------------------------------ + // Options + //------------------------------------------------------------------------------------------------------------------ + async _updateOption(operationType, optionPath, optionValue=null, reloadUI=false) { + const optionKeys = optionPath.split("."); + + let currentOptionKey = null; + let option = this.options; + + while (optionKeys.length > 1) { + currentOptionKey = optionKeys.shift(); + option = option[currentOptionKey]; + + if (option === undefined) + throw new Error(`Invalid option key in _updateOption(): ${ currentOptionKey } (${ optionPath })`); + } + + switch (operationType) { + case "update": + option[optionKeys[0]] = optionValue; + break; + case "delete": + delete option[optionKeys[0]]; + break; + case "toggle": + option[optionKeys[0]] = !option[optionKeys[0]]; + break; + default: + throw new Error(`Invalid operation type in _updateOption(): ${ operationType }`); + } + + if (reloadUI) { + this.incrementCallNumber(); + await this.reload(optionPath, this.options); + } + } + + async updateOption(optionPath, optionValue, reloadUI=false) { + await this._updateOption('update', optionPath, optionValue, reloadUI); + } + + async deleteOption(optionPath, reloadUI=false) { + await this._updateOption('delete', optionPath, null, reloadUI); + } + + async toggleOption(optionPath, reloadUI=false) { + await this._updateOption('toggle', optionPath, null, reloadUI); + } + + async switchToSection(reportId) { + this.saveSessionOptions({...this.options, 'selected_section_id': reportId}); + this.displayReport(reportId); + } + + //------------------------------------------------------------------------------------------------------------------ + // Session options + //------------------------------------------------------------------------------------------------------------------ + sessionOptionsID() { + /* Options are stored by action report (so, the report that was targetted by the original action triggering this flow). + This allows a more intelligent reloading of the previous options during user navigation (especially concerning sections and variants; + you expect your report to open by default the same section as last time you opened it in this http session). + */ + return `account.report:${ this.actionReportId }:${ session.user_companies.current_company }`; + } + + hasSessionOptions() { + return Boolean(browser.sessionStorage.getItem(this.sessionOptionsID())) + } + + saveSessionOptions(options) { + browser.sessionStorage.setItem(this.sessionOptionsID(), JSON.stringify(options)); + } + + sessionOptions() { + return JSON.parse(browser.sessionStorage.getItem(this.sessionOptionsID())); + } + + //------------------------------------------------------------------------------------------------------------------ + // Lines + //------------------------------------------------------------------------------------------------------------------ + lineHasDebugData(lineIndex) { + return 'debug_popup_data' in this.lines[lineIndex]; + } + + lineHasGrowthComparisonData(lineIndex) { + return Boolean(this.lines[lineIndex].column_percent_comparison_data); + } + + isLineAncestorOf(ancestorLineId, lineId) { + return lineId.startsWith(`${ancestorLineId}|`); + } + + isLineChildOf(childLineId, lineId) { + return childLineId.startsWith(`${lineId}|`); + } + + isLineRelatedTo(relatedLineId, lineId) { + return this.isLineAncestorOf(relatedLineId, lineId) || this.isLineChildOf(relatedLineId, lineId); + } + + isNextLineChild(index, lineId) { + return index < this.lines.length && this.lines[index].id.startsWith(`${lineId}|`); + } + + isNextLineDirectChild(index, lineId) { + return index < this.lines.length && this.lines[index].parent_id === lineId; + } + + isTotalLine(lineIndex) { + return this.lines[lineIndex].id.includes("|total~~"); + } + + isLoadMoreLine(lineIndex) { + return this.lines[lineIndex].id.includes("|load_more~~"); + } + + isLoadedLine(lineIndex) { + const lineID = this.lines[lineIndex].id; + const nextLineIndex = lineIndex + 1; + + return this.isNextLineChild(nextLineIndex, lineID) && !this.isTotalLine(nextLineIndex) && !this.isLoadMoreLine(nextLineIndex); + } + + async replaceLineWith(replaceIndex, newLines) { + await this.insertLines(replaceIndex, 1, newLines); + } + + async insertLinesAfter(insertIndex, newLines) { + await this.insertLines(insertIndex + 1, 0, newLines); + } + + async insertLines(lineIndex, deleteCount, newLines) { + this.lines.splice(lineIndex, deleteCount, ...newLines); + } + + //------------------------------------------------------------------------------------------------------------------ + // Unfolded/Folded lines + //------------------------------------------------------------------------------------------------------------------ + async unfoldLoadedLine(lineIndex) { + const lineId = this.lines[lineIndex].id; + let nextLineIndex = lineIndex + 1; + + while (this.isNextLineChild(nextLineIndex, lineId)) { + if (this.isNextLineDirectChild(nextLineIndex, lineId)) { + const nextLine = this.lines[nextLineIndex]; + nextLine.visible = true; + if (!nextLine.unfoldable && this.isNextLineChild(nextLineIndex + 1, nextLine.id)) { + await this.unfoldLine(nextLineIndex); + } + } + nextLineIndex += 1; + } + return nextLineIndex; + } + + async unfoldNewLine(lineIndex) { + const options = await this.options; + const newLines = await this.orm.call( + "account.report", + options.readonly_query ? "get_expanded_lines_readonly" : "get_expanded_lines", + [ + this.options['report_id'], + this.options, + this.lines[lineIndex].id, + this.lines[lineIndex].groupby, + this.lines[lineIndex].expand_function, + this.lines[lineIndex].progress, + 0, + this.lines[lineIndex].horizontal_split_side, + ], + ); + + if (this.areLinesOrdered()) { + this.updateLinesOrderIndexes(lineIndex, newLines, false) + } + this.insertLinesAfter(lineIndex, newLines); + + const totalIndex = lineIndex + newLines.length + 1; + + if (this.filters.show_totals && this.lines[totalIndex] && this.isTotalLine(totalIndex)) + this.lines[totalIndex].visible = true; + + // Update options + this.options.unfolded_lines.push( + ...newLines.filter(line => line.unfolded).map(({ id }) => id) + ); + + this.saveSessionOptions(this.options); + + return totalIndex + } + + /** + * When unfolding a line of a sorted report, we need to update the linesOrder array by adding the new lines, + * which will require subsequent updates on the array. + * + * - lineOrderValue represents the line index before sorting the report. + * @param {Integer} lineIndex: Index of the current line + * @param {Array} newLines: Array of lines to be added + * @param {Boolean} replaceLine: Useful for the splice of the linesOrder array in case we want to replace some line + * example: With the load more, we want to replace the line with others + **/ + updateLinesOrderIndexes(lineIndex, newLines, replaceLine) { + let unfoldedLineIndex; + // The offset is useful because in case we use 'replaceLineWith' we want to replace the line at index + // unfoldedLineIndex with the new lines. + const offset = replaceLine ? 0 : 1; + for (const [lineOrderIndex, lineOrderValue] of Object.entries(this.linesOrder)) { + // Since we will have to add new lines into the linesOrder array, we have to update the index of the lines + // having a bigger index than the one we will unfold. + // deleteCount of 1 means that a line need to be replaced so the index need to be increase by 1 less than usual + if (lineOrderValue > lineIndex) { + this.linesOrder[lineOrderIndex] += newLines.length - replaceLine; + } + // The unfolded line is found, providing a reference for adding children in the 'linesOrder' array. + if (lineOrderValue === lineIndex) { + unfoldedLineIndex = parseInt(lineOrderIndex) + } + } + + const arrayOfNewIndex = Array.from({ length: newLines.length }, (dummy, index) => this.linesOrder[unfoldedLineIndex] + index + offset); + this.linesOrder.splice(unfoldedLineIndex + offset, replaceLine, ...arrayOfNewIndex); + } + + async unfoldLine(lineIndex) { + const targetLine = this.lines[lineIndex]; + let lastLineIndex = lineIndex + 1; + + if (this.isLoadedLine(lineIndex)) + lastLineIndex = await this.unfoldLoadedLine(lineIndex); + else if (targetLine.expand_function) { + lastLineIndex = await this.unfoldNewLine(lineIndex); + } + + this.setLineVisibility(this.lines.slice(lineIndex + 1, lastLineIndex)); + targetLine.unfolded = true; + this.refreshVisibleAnnotations(); + + // Update options + if (!this.options.unfolded_lines.includes(targetLine.id)) + this.options.unfolded_lines.push(targetLine.id); + + this.saveSessionOptions(this.options); + } + + foldLine(lineIndex) { + const targetLine = this.lines[lineIndex]; + + let foldedLinesIDs = new Set([targetLine.id]); + let nextLineIndex = lineIndex + 1; + + while (this.isNextLineChild(nextLineIndex, targetLine.id)) { + this.lines[nextLineIndex].unfolded = false; + this.lines[nextLineIndex].visible = false; + + foldedLinesIDs.add(this.lines[nextLineIndex].id); + + nextLineIndex += 1; + } + + targetLine.unfolded = false; + + this.refreshVisibleAnnotations(); + + // Update options + this.options.unfolded_lines = this.options.unfolded_lines.filter( + unfoldedLineID => !foldedLinesIDs.has(unfoldedLineID) + ); + + this.saveSessionOptions(this.options); + } + + //------------------------------------------------------------------------------------------------------------------ + // Ordered lines + //------------------------------------------------------------------------------------------------------------------ + linesCurrentOrderByColumn(columnIndex) { + if (this.areLinesOrderedByColumn(columnIndex)) + return this.options.order_column.direction; + + return "default"; + } + + areLinesOrdered() { + return this.linesOrder != null && this.options.order_column != null; + } + + areLinesOrderedByColumn(columnIndex) { + return this.areLinesOrdered() && this.options.order_column.expression_label === this.options.columns[columnIndex].expression_label; + } + + async sortLinesByColumnAsc(columnIndex) { + this.options.order_column = { + expression_label: this.options.columns[columnIndex].expression_label, + direction: "ASC", + }; + + await this.sortLines(); + this.saveSessionOptions(this.options); + } + + async sortLinesByColumnDesc(columnIndex) { + this.options.order_column = { + expression_label: this.options.columns[columnIndex].expression_label, + direction: "DESC", + }; + + await this.sortLines(); + this.saveSessionOptions(this.options); + } + + sortLinesByDefault() { + delete this.options.order_column; + delete this.data.lines_order; + + this.saveSessionOptions(this.options); + } + + async sortLines() { + this.linesOrder = await this.orm.call( + "account.report", + "sort_lines", + [ + this.lines, + this.options, + true, + ], + { + context: this.action.context, + }, + ); + } + + //------------------------------------------------------------------------------------------------------------------ + // Annotations + //------------------------------------------------------------------------------------------------------------------ + async refreshAnnotations() { + this.annotations = await this.orm.call("account.report", "get_annotations", [ + this.action.context.report_id, + this.options, + ]); + + this.refreshVisibleAnnotations(); + } + + //------------------------------------------------------------------------------------------------------------------ + // Visibility + //------------------------------------------------------------------------------------------------------------------ + + refreshVisibleAnnotations() { + const visibleAnnotations = new Proxy( + {}, + { + get(target, name) { + return name in target ? target[name] : []; + }, + set(target, name, newValue) { + target[name] = newValue; + return true; + }, + } + ); + + this.lines.forEach((line) => { + line["visible_annotations"] = []; + const lineWithoutTaxGrouping = removeTaxGroupingFromLineId(line.id); + if (line.visible && this.annotations[lineWithoutTaxGrouping]) { + for (const index in this.annotations[lineWithoutTaxGrouping]) { + const annotation = this.annotations[lineWithoutTaxGrouping][index]; + visibleAnnotations[lineWithoutTaxGrouping] = [ + ...visibleAnnotations[lineWithoutTaxGrouping], + { ...annotation }, + ]; + line["visible_annotations"].push({ + ...annotation, + }); + } + } + + if ( + line.visible_annotations && + (!this.annotations[lineWithoutTaxGrouping] || !line.visible) + ) { + delete line.visible_annotations; + } + }); + + this.visibleAnnotations = visibleAnnotations; + } + + /** + Defines which lines should be visible in the provided list of lines (depending on what is folded). + **/ + setLineVisibility(linesToAssign) { + let needHidingChildren = new Set(); + + linesToAssign.forEach((line) => { + line.visible = !needHidingChildren.has(line.parent_id); + + if (!line.visible || (line.unfoldable &! line.unfolded)) + needHidingChildren.add(line.id); + }); + + // If the hide 0 lines is activated we will go through the lines to set the visibility. + if (this.options.hide_0_lines) { + this.hideZeroLines(linesToAssign); + } + } + + /** + * Defines whether the line should be visible depending on its value and the ones of its children. + * For parent lines, it's visible if there is at least one child with a value different from zero + * or if a child is visible, indicating it's a parent line. + * For leaf nodes, it's visible if the value is different from zero. + * + * By traversing the 'lines' array in reverse, we can set the visibility of the lines easily by keeping + * a dict of visible lines for each parent. + * + * @param {Object} lines - The lines for which we want to determine visibility. + */ + hideZeroLines(lines) { + const hasVisibleChildren = new Set(); + const reversed_lines = [...lines].reverse() + + const number_figure_types = ['integer', 'float', 'monetary', 'percentage']; + reversed_lines.forEach((line) => { + const isZero = line.columns.every(column => !number_figure_types.includes(column.figure_type) || column.is_zero); + + // If the line has no visible children and all the columns are equals to zero then the line needs to be hidden + if (!hasVisibleChildren.has(line.id) && isZero) { + line.visible = false; + } + + // If the line has a parent_id and is not hidden then we fill the set 'hasVisibleChildren'. Each parent + // will have an array of his visible children + if (line.parent_id && line.visible) { + // This line allows the initialization of that list. + hasVisibleChildren.add(line.parent_id); + } + }) + } + + //------------------------------------------------------------------------------------------------------------------ + // Server calls + //------------------------------------------------------------------------------------------------------------------ + buttonAction(ev, button) { + // Might be overidden to add specific functionality to button + // For instance adding context to a call ... + this.reportAction(ev, button.error_action || button.action, button.action_param, true); + } + + async reportAction(ev, action, actionParam = null, callOnSectionsSource = false, actionContext=null) { + // 'ev' might be 'undefined' if event is not triggered from a button/anchor + ev?.preventDefault(); + ev?.stopPropagation(); + + let actionOptions = this.options; + if (callOnSectionsSource) { + // When calling the sections source, we want to keep track of all unfolded lines of all sections + const allUnfoldedLines = this.options.sections.length ? [] : [...this.options['unfolded_lines']] + + for (const sectionData of this.options['sections']) { + const cacheKey = this.getCacheKey(this.options['sections_source_id'], sectionData['id']); + const sectionOptions = await this.reportOptionsMap[cacheKey]; + if (sectionOptions) + allUnfoldedLines.push(...sectionOptions['unfolded_lines']); + } + + actionOptions = {...this.options, unfolded_lines: allUnfoldedLines}; + } + + const dispatchReportAction = await this.orm.call( + "account.report", + "dispatch_report_action", + [ + this.options['report_id'], + actionOptions, + action, + actionParam, + callOnSectionsSource, + ], + { + context: Object.assign({}, this.context, actionContext) + } + ); + if (dispatchReportAction?.help) { + dispatchReportAction.help = owl.markup(dispatchReportAction.help) + } + + return dispatchReportAction ? this.actionService.doAction(dispatchReportAction) : null; + } + + // ----------------------------------------------------------------------------------------------------------------- + // Budget + // ----------------------------------------------------------------------------------------------------------------- + + async openBudget(budget) { + this.actionService.doAction({ + type: "ir.actions.act_window", + res_model: "account.report.budget", + res_id: budget.id, + views: [[false, "form"]], + }); + } +} diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/ellipsis.js b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/ellipsis.js new file mode 100644 index 0000000..c448c09 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/ellipsis.js @@ -0,0 +1,64 @@ +/** @odoo-module **/ + +import { _t } from "@web/core/l10n/translation"; +import { localization } from "@web/core/l10n/localization"; +import { useService } from "@web/core/utils/hooks"; +import { Component, useState } from "@odoo/owl"; + +import { AccountReportEllipsisPopover } from "@odex30_account_reports/components/account_report/ellipsis/popover/ellipsis_popover"; + +export class AccountReportEllipsis extends Component { + static template = "odex30_account_reports.AccountReportEllipsis"; + static props = { + name: { type: String, optional: true }, + no_format: { optional: true }, + type: { type: String, optional: true }, + maxCharacters: Number, + }; + + setup() { + this.popover = useService("popover"); + this.notification = useService("notification"); + this.controller = useState(this.env.controller); + } + + //------------------------------------------------------------------------------------------------------------------ + // Ellipsis + //------------------------------------------------------------------------------------------------------------------ + get triggersEllipsis() { + if (this.props.name) + return this.props.name.length > this.props.maxCharacters; + + return false; + } + + copyEllipsisText() { + navigator.clipboard.writeText(this.props.name); + this.notification.add(_t("Text copied"), { type: 'success' }); + this.popoverCloseFn(); + this.popoverCloseFn = null; + } + + showEllipsisPopover(ev) { + ev.preventDefault(); + ev.stopPropagation(); + + if (this.popoverCloseFn) { + this.popoverCloseFn(); + this.popoverCloseFn = null; + } + + this.popoverCloseFn = this.popover.add( + ev.currentTarget, + AccountReportEllipsisPopover, + { + name: this.props.name, + copyEllipsisText: this.copyEllipsisText.bind(this), + }, + { + closeOnClickAway: true, + position: localization.direction === "rtl" ? "left" : "right", + }, + ); + } +} diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/ellipsis.xml b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/ellipsis.xml new file mode 100644 index 0000000..ffc0798 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/ellipsis.xml @@ -0,0 +1,28 @@ + + + + + + + + +
    + +
    + + + + +
    + +
    + +
    +
    +
    +
    diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/popover/ellipsis_popover.js b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/popover/ellipsis_popover.js new file mode 100644 index 0000000..2f73313 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/popover/ellipsis_popover.js @@ -0,0 +1,12 @@ +/** @odoo-module */ + +import { Component } from "@odoo/owl"; + +export class AccountReportEllipsisPopover extends Component { + static template = "odex30_account_reports.AccountReportEllipsisPopover"; + static props = { + close: Function, + name: String, + copyEllipsisText: Function, + }; +} diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/popover/ellipsis_popover.xml b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/popover/ellipsis_popover.xml new file mode 100644 index 0000000..a8f6f7f --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/ellipsis/popover/ellipsis_popover.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_account_type.xml b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_account_type.xml new file mode 100644 index 0000000..df0496b --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_account_type.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_aml_ir_filters.xml b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_aml_ir_filters.xml new file mode 100644 index 0000000..edc34ad --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_aml_ir_filters.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_analytic.xml b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_analytic.xml new file mode 100644 index 0000000..ef4a05f --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_analytic.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_analytic_groupby.xml b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_analytic_groupby.xml new file mode 100644 index 0000000..f26fb87 --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_analytic_groupby.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + diff --git a/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_budgets.xml b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_budgets.xml new file mode 100644 index 0000000..a5da3fa --- /dev/null +++ b/dev_odex30_accounting/odex30_account_reports/static/src/components/account_report/filters/filter_budgets.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + +