From 519e93736fbe4ca074f902494b67c5a246a2f49e Mon Sep 17 00:00:00 2001 From: rpinset <12782314+rpinset@users.noreply.github.com> Date: Fri, 29 Nov 2024 21:54:19 +0100 Subject: [PATCH] update from sources : ven. 29 nov. 2024 21:54:19 CET --- README-merged.md | 50 +- README.md | 263 +++++---- account_analytic_tag/README.rst | 8 +- account_analytic_tag/__manifest__.py | 3 +- .../static/description/index.html | 13 +- .../views/account_move_line_views.xml | 18 + account_financial_report/README.rst | 114 ++-- account_financial_report/__manifest__.py | 2 +- .../report/general_ledger.py | 56 ++ .../report/general_ledger_xlsx.py | 5 +- .../report/templates/general_ledger.xml | 40 +- .../static/description/index.html | 2 +- account_invoice_inter_company/README.rst | 46 +- account_invoice_inter_company/__manifest__.py | 2 +- .../models/account_move.py | 1 + .../static/description/index.html | 2 +- .../tests/test_inter_company_invoice.py | 4 + account_invoice_pricelist/README.rst | 32 +- account_invoice_pricelist/__manifest__.py | 2 +- .../models/account_move.py | 14 +- .../static/description/index.html | 2 +- account_payment_order/README.rst | 60 +- account_payment_order/__manifest__.py | 2 +- account_payment_order/models/account_move.py | 20 +- .../static/description/index.html | 2 +- account_reconcile_oca/README.rst | 6 +- account_reconcile_oca/__manifest__.py | 2 +- .../models/account_bank_statement.py | 15 + .../models/account_bank_statement_line.py | 139 +++-- .../static/description/index.html | 2 +- .../static/src/scss/reconcile.scss | 6 + .../views/account_bank_statement.xml | 17 +- account_statement_base/README.rst | 16 +- account_statement_base/__manifest__.py | 2 +- .../models/account_bank_statement.py | 19 - .../models/account_bank_statement_line.py | 7 - .../static/description/index.html | 2 +- base_tier_validation/README.rst | 134 +++-- base_tier_validation/__manifest__.py | 3 +- base_tier_validation/data/cron_data.xml | 17 + base_tier_validation/data/mail_data.xml | 18 + .../i18n/base_tier_validation.pot | 43 +- base_tier_validation/i18n/es.po | 53 +- base_tier_validation/i18n/es_MX.po | 53 +- base_tier_validation/i18n/fr.po | 54 +- base_tier_validation/i18n/it.po | 61 +- base_tier_validation/i18n/nl_NL.po | 53 +- base_tier_validation/i18n/sv.po | 53 +- base_tier_validation/i18n/tr.po | 53 +- base_tier_validation/i18n/zh_CN.po | 53 +- base_tier_validation/models/res_users.py | 8 +- .../models/tier_definition.py | 39 ++ base_tier_validation/models/tier_review.py | 40 ++ .../models/tier_validation.py | 50 +- .../security/ir.model.access.csv | 2 +- .../static/description/index.html | 24 +- base_tier_validation/tests/__init__.py | 1 + base_tier_validation/tests/common.py | 2 +- .../tests/test_tier_validation.py | 11 + .../tests/test_tier_validation_reminder.py | 46 ++ .../views/tier_definition_view.xml | 2 + ddmrp/i18n/it.po | 8 +- delivery_package_number/README.rst | 112 ++++ delivery_package_number/__init__.py | 2 + delivery_package_number/__manifest__.py | 22 + .../data/paperformat_data.xml | 20 + .../i18n/delivery_package_number.pot | 164 ++++++ delivery_package_number/i18n/es.po | 171 ++++++ delivery_package_number/i18n/sl.po | 171 ++++++ delivery_package_number/models/__init__.py | 2 + .../models/stock_picking.py | 74 +++ .../models/stock_picking_type.py | 16 + delivery_package_number/pyproject.toml | 3 + .../readme/CONTRIBUTORS.md | 9 + delivery_package_number/readme/DESCRIPTION.md | 7 + delivery_package_number/readme/USAGE.md | 13 + .../reports/report_package_number.xml | 80 +++ .../security/ir.model.access.csv | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 463 +++++++++++++++ delivery_package_number/tests/__init__.py | 1 + .../tests/test_delivery_package_number.py | 79 +++ .../views/stock_picking_type_views.xml | 15 + .../views/stock_picking_views.xml | 16 + delivery_package_number/wizard/__init__.py | 2 + .../wizard/stock_backorder_confirmation.py | 15 + .../stock_number_package_validate_wiz.py | 79 +++ ...stock_number_package_validate_wiz_view.xml | 44 ++ fieldservice_agreement/README.rst | 136 +++++ fieldservice_agreement/__init__.py | 4 + fieldservice_agreement/__manifest__.py | 28 + fieldservice_agreement/i18n/de.po | 91 +++ fieldservice_agreement/i18n/es.po | 91 +++ fieldservice_agreement/i18n/es_AR.po | 103 ++++ fieldservice_agreement/i18n/es_CL.po | 91 +++ .../i18n/fieldservice_agreement.pot | 79 +++ fieldservice_agreement/i18n/it.po | 103 ++++ fieldservice_agreement/i18n/pt_BR.po | 91 +++ fieldservice_agreement/models/__init__.py | 6 + fieldservice_agreement/models/agreement.py | 62 +++ .../models/fsm_equipment.py | 10 + fieldservice_agreement/models/fsm_order.py | 10 + fieldservice_agreement/models/fsm_person.py | 37 ++ fieldservice_agreement/pyproject.toml | 3 + fieldservice_agreement/readme/CONFIGURE.md | 1 + fieldservice_agreement/readme/CONTRIBUTORS.md | 6 + fieldservice_agreement/readme/CREDITS.md | 3 + fieldservice_agreement/readme/DESCRIPTION.md | 7 + fieldservice_agreement/readme/ROADMAP.md | 1 + fieldservice_agreement/readme/USAGE.md | 8 + .../static/description/icon.png | Bin 0 -> 17808 bytes .../static/description/index.html | 464 +++++++++++++++ fieldservice_agreement/tests/__init__.py | 4 + .../tests/test_fsm_agreement.py | 85 +++ .../views/agreement_view.xml | 65 +++ .../views/fsm_equipment_view.xml | 39 ++ .../views/fsm_order_view.xml | 32 ++ fieldservice_agreement/views/fsm_person.xml | 26 + fieldservice_stage_validation/README.rst | 20 +- fieldservice_stage_validation/__manifest__.py | 7 +- .../models/fsm_stage.py | 1 - .../models/validate_utils.py | 2 +- .../security/ir.model.access.csv | 2 + .../static/description/index.html | 13 +- hr_attendance_reason/README.rst | 28 +- hr_attendance_reason/__manifest__.py | 6 +- .../hr_attendance_reason_demo.xml} | 0 .../static/description/index.html | 2 +- hr_expense_cancel/README.rst | 18 +- hr_expense_cancel/__manifest__.py | 2 +- .../static/description/index.html | 2 +- .../tests/test_hr_expense_cancel.py | 78 +-- hr_expense_invoice/README.rst | 44 +- hr_expense_invoice/__manifest__.py | 2 +- hr_expense_invoice/models/hr_expense_sheet.py | 4 +- .../static/description/index.html | 6 +- .../tests/test_hr_expense_invoice.py | 7 +- hr_expense_payment/README.rst | 10 +- hr_expense_payment/__manifest__.py | 2 +- .../static/description/index.html | 13 +- .../tests/test_hr_expense_payment.py | 74 +-- intrastat_product/i18n/it.po | 6 +- .../report/swissqr_no_amount_report.py | 7 +- l10n_ro_account/README.rst | 14 +- l10n_ro_account/__manifest__.py | 2 +- l10n_ro_account/i18n/ro.po | 8 +- l10n_ro_account/models/account_account.py | 11 +- l10n_ro_account/static/description/index.html | 13 +- l10n_ro_account_edit_currency_rate/README.rst | 20 +- .../__manifest__.py | 2 +- .../models/account_move.py | 2 +- .../static/description/index.html | 2 +- l10n_ro_stock_account_date/README.rst | 22 +- l10n_ro_stock_account_date/__manifest__.py | 2 +- .../models/stock_move.py | 4 +- .../static/description/index.html | 2 +- l10n_ro_stock_price_difference/README.rst | 12 +- .../__manifest__.py | 2 +- .../migrations/16.0.5.4.1/pre-migration.py | 31 +- .../static/description/index.html | 2 +- l10n_us_partner_legal_number/README.rst | 84 +++ l10n_us_partner_legal_number/__init__.py | 3 + l10n_us_partner_legal_number/__manifest__.py | 16 + .../i18n/l10n_us_partner_legal_number.pot | 53 ++ .../models/__init__.py | 4 + l10n_us_partner_legal_number/models/base.py | 43 ++ .../models/res_partner.py | 6 + l10n_us_partner_legal_number/pyproject.toml | 3 + .../readme/CONTRIBUTORS.md | 4 + .../readme/DESCRIPTION.md | 1 + l10n_us_partner_legal_number/readme/USAGE.md | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 431 ++++++++++++++ .../views/res_partner.xml | 13 + mgmtsystem_action/i18n/sv.po | 258 +++++---- mgmtsystem_audit/i18n/sv.po | 187 ++++--- mgmtsystem_manual/i18n/sv.po | 17 +- mgmtsystem_review/i18n/sv.po | 4 +- mrp_multi_level/README.rst | 161 +++--- mrp_multi_level/__manifest__.py | 2 +- mrp_multi_level/models/product_mrp_area.py | 21 +- mrp_multi_level/static/description/index.html | 9 +- mrp_multi_level/tests/test_mrp_multi_level.py | 22 +- partner_statement/i18n/it.po | 4 +- portal_sale_personal_data_only/README.rst | 102 ++++ portal_sale_personal_data_only/__init__.py | 1 + .../__manifest__.py | 16 + portal_sale_personal_data_only/hooks.py | 14 + portal_sale_personal_data_only/i18n/de.po | 0 portal_sale_personal_data_only/i18n/es.po | 0 portal_sale_personal_data_only/i18n/it.po | 0 .../i18n/portal_sale_personal_data_only.pot | 13 + portal_sale_personal_data_only/i18n/zh_CN.po | 0 portal_sale_personal_data_only/pyproject.toml | 3 + .../readme/CONTRIBUTORS.md | 8 + .../readme/DESCRIPTION.md | 7 + .../readme/USAGE.md | 7 + .../security/security.xml | 39 ++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 450 +++++++++++++++ .../tests/__init__.py | 1 + .../tests/test_partner_access.py | 78 +++ product_harmonized_system/i18n/it.po | 10 +- product_harmonized_system_stock/i18n/it.po | 6 +- remove_odoo_enterprise/README.rst | 14 +- remove_odoo_enterprise/__manifest__.py | 2 +- .../models/res_config_settings.py | 6 +- .../static/description/index.html | 2 +- report_qweb_pdf_watermark/README.rst | 164 ++++++ report_qweb_pdf_watermark/__init__.py | 4 + report_qweb_pdf_watermark/__manifest__.py | 24 + report_qweb_pdf_watermark/demo/report.xml | 27 + report_qweb_pdf_watermark/i18n/ca.po | 75 +++ report_qweb_pdf_watermark/i18n/da.po | 75 +++ report_qweb_pdf_watermark/i18n/de.po | 85 +++ report_qweb_pdf_watermark/i18n/el_GR.po | 76 +++ report_qweb_pdf_watermark/i18n/es.po | 91 +++ report_qweb_pdf_watermark/i18n/es_CO.po | 76 +++ report_qweb_pdf_watermark/i18n/fr.po | 79 +++ report_qweb_pdf_watermark/i18n/gl.po | 75 +++ report_qweb_pdf_watermark/i18n/hr.po | 78 +++ report_qweb_pdf_watermark/i18n/hr_HR.po | 85 +++ report_qweb_pdf_watermark/i18n/it.po | 87 +++ report_qweb_pdf_watermark/i18n/nb_NO.po | 76 +++ report_qweb_pdf_watermark/i18n/nl_NL.po | 79 +++ report_qweb_pdf_watermark/i18n/pl.po | 76 +++ report_qweb_pdf_watermark/i18n/pt.po | 75 +++ report_qweb_pdf_watermark/i18n/pt_BR.po | 76 +++ report_qweb_pdf_watermark/i18n/pt_PT.po | 80 +++ .../i18n/report_qweb_pdf_watermark.pot | 69 +++ report_qweb_pdf_watermark/i18n/sl.po | 76 +++ report_qweb_pdf_watermark/i18n/tr.po | 77 +++ report_qweb_pdf_watermark/i18n/tr_TR.po | 76 +++ report_qweb_pdf_watermark/models/__init__.py | 5 + report_qweb_pdf_watermark/models/report.py | 149 +++++ .../models/res_company.py | 10 + report_qweb_pdf_watermark/pyproject.toml | 3 + .../readme/CONTRIBUTORS.md | 8 + .../readme/DESCRIPTION.md | 5 + report_qweb_pdf_watermark/readme/HISTORY.md | 24 + report_qweb_pdf_watermark/readme/INSTALL.md | 3 + report_qweb_pdf_watermark/readme/ROADMAP.md | 3 + report_qweb_pdf_watermark/readme/USAGE.md | 23 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 526 ++++++++++++++++++ .../src/css/report_qweb_pdf_watermark.css | 3 + report_qweb_pdf_watermark/tests/__init__.py | 4 + .../tests/test_report_qweb_pdf_watermark.py | 63 +++ .../views/ir_actions_report_xml.xml | 25 + .../views/res_company.xml | 20 + requirements.txt | 2 + sale_order_general_discount/README.rst | 42 +- .../readme/CONTRIBUTORS.md | 5 + .../readme/CONTRIBUTORS.rst | 7 - .../readme/DESCRIPTION.md | 7 + .../readme/DESCRIPTION.rst | 6 - .../readme/{INSTALL.rst => INSTALL.md} | 3 +- sale_order_general_discount/readme/USAGE.md | 7 + sale_order_general_discount/readme/USAGE.rst | 8 - .../static/description/index.html | 26 +- sale_substate/README.rst | 93 ++++ sale_substate/__init__.py | 1 + sale_substate/__manifest__.py | 21 + sale_substate/data/sale_substate_data.xml | 19 + sale_substate/data/sale_substate_demo.xml | 48 ++ .../data/sale_substate_mail_template_data.xml | 63 +++ sale_substate/i18n/es.po | 210 +++++++ sale_substate/i18n/it.po | 211 +++++++ sale_substate/i18n/sale_substate.pot | 157 ++++++ sale_substate/models/__init__.py | 1 + sale_substate/models/sale_order.py | 17 + sale_substate/pyproject.toml | 3 + sale_substate/readme/CONTRIBUTORS.md | 2 + sale_substate/readme/DESCRIPTION.md | 5 + sale_substate/readme/USAGE.md | 7 + sale_substate/static/description/icon.png | Bin 0 -> 9455 bytes sale_substate/static/description/index.html | 445 +++++++++++++++ sale_substate/tests/__init__.py | 1 + sale_substate/tests/test_sale_substate.py | 68 +++ sale_substate/views/sale_views.xml | 59 ++ web_time_range_menu_custom/README.rst | 103 ++++ web_time_range_menu_custom/__init__.py | 1 + web_time_range_menu_custom/__manifest__.py | 23 + web_time_range_menu_custom/i18n/es.po | 87 +++ web_time_range_menu_custom/i18n/it.po | 87 +++ .../i18n/web_time_range_menu_custom.pot | 84 +++ web_time_range_menu_custom/pyproject.toml | 3 + .../readme/CONTRIBUTORS.md | 3 + .../readme/DESCRIPTION.md | 2 + web_time_range_menu_custom/readme/USAGE.md | 17 + .../description/custom_period_option.png | Bin 0 -> 254423 bytes .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 447 +++++++++++++++ .../static/src/js/date_selector.esm.js | 121 ++++ .../static/src/js/dates.esm.js | 363 ++++++++++++ .../static/src/js/search_bar_menu.esm.js | 13 + .../src/scss/web_time_range_menu_custom.scss | 8 + .../static/src/xml/date_selector.xml | 72 +++ .../static/src/xml/search_bar_menu.xml | 22 + website_event_questions_by_ticket/README.rst | 110 ++++ website_event_questions_by_ticket/__init__.py | 3 + .../__manifest__.py | 16 + website_event_questions_by_ticket/i18n/de.po | 37 ++ website_event_questions_by_ticket/i18n/es.po | 37 ++ website_event_questions_by_ticket/i18n/fr.po | 37 ++ website_event_questions_by_ticket/i18n/it.po | 46 ++ .../website_event_questions_by_ticket.pot | 34 ++ .../models/__init__.py | 3 + .../models/event_event.py | 36 ++ .../pyproject.toml | 3 + .../readme/CONFIGURE.md | 6 + .../readme/CONTRIBUTORS.md | 5 + .../readme/DESCRIPTION.md | 6 + .../readme/ROADMAP.md | 1 + .../readme/USAGE.md | 5 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 463 +++++++++++++++ .../tests/__init__.py | 1 + .../tests/test_ticket.py | 53 ++ .../views/event_event_views.xml | 35 ++ .../views/event_templates.xml | 40 ++ website_forum_subscription/README.rst | 92 +++ website_forum_subscription/__init__.py | 0 website_forum_subscription/__manifest__.py | 16 + website_forum_subscription/i18n/es.po | 47 ++ website_forum_subscription/i18n/it.po | 44 ++ .../i18n/website_forum_subscription.pot | 34 ++ website_forum_subscription/pyproject.toml | 3 + .../readme/CONTRIBUTORS.md | 4 + .../readme/DESCRIPTION.md | 1 + website_forum_subscription/readme/USAGE.md | 8 + .../static/description/icon.png | Bin 0 -> 8121 bytes .../static/description/index.html | 441 +++++++++++++++ .../templates/website_forum_templates.xml | 68 +++ website_membership_gamification/README.rst | 98 ++++ website_membership_gamification/__init__.py | 4 + .../__manifest__.py | 24 + website_membership_gamification/i18n/es.po | 110 ++++ website_membership_gamification/i18n/fr.po | 111 ++++ website_membership_gamification/i18n/it.po | 110 ++++ .../i18n/website_membership_gamification.pot | 105 ++++ .../models/__init__.py | 5 + .../models/gamification_badge.py | 13 + .../models/res_partner.py | 63 +++ .../pyproject.toml | 3 + .../readme/CONFIGURE.md | 6 + .../readme/CONTRIBUTORS.md | 5 + .../readme/DESCRIPTION.md | 2 + .../readme/USAGE.md | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 448 +++++++++++++++ .../views/badge.xml | 18 + .../views/res_partner_views.xml | 41 ++ .../views/website_partner_template.xml | 62 +++ .../wizard/gamification_badge_user_wizard.xml | 39 ++ website_sale_require_legal/README.rst | 152 +++++ website_sale_require_legal/__init__.py | 2 + website_sale_require_legal/__manifest__.py | 25 + .../controllers/__init__.py | 2 + .../controllers/main.py | 93 ++++ website_sale_require_legal/i18n/de.po | 43 ++ website_sale_require_legal/i18n/es.po | 44 ++ website_sale_require_legal/i18n/fi.po | 31 ++ website_sale_require_legal/i18n/hr.po | 40 ++ website_sale_require_legal/i18n/it.po | 44 ++ website_sale_require_legal/i18n/sl.po | 41 ++ .../i18n/website_sale_require_legal.pot | 31 ++ website_sale_require_legal/pyproject.toml | 3 + .../readme/CONFIGURE.md | 23 + website_sale_require_legal/readme/CONTEXT.md | 10 + .../readme/CONTRIBUTORS.md | 9 + .../readme/DESCRIPTION.md | 6 + website_sale_require_legal/readme/ROADMAP.md | 8 + website_sale_require_legal/readme/USAGE.md | 3 + .../static/description/address-enable.png | Bin 0 -> 72885 bytes .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 501 +++++++++++++++++ .../static/description/payment-enable.png | Bin 0 -> 46645 bytes .../src/scss/website_sale_require_legal.scss | 3 + .../static/tests/tours/tour.esm.js | 103 ++++ .../templates/website_sale.xml | 36 ++ website_sale_require_legal/tests/__init__.py | 3 + website_sale_require_legal/tests/test_ui.py | 87 +++ website_snippet_big_button/README.rst | 95 ++++ website_snippet_big_button/__init__.py | 0 website_snippet_big_button/__manifest__.py | 24 + website_snippet_big_button/i18n/ca.po | 44 ++ website_snippet_big_button/i18n/es.po | 59 ++ website_snippet_big_button/i18n/fr.po | 53 ++ website_snippet_big_button/i18n/hr.po | 40 ++ website_snippet_big_button/i18n/it.po | 42 ++ website_snippet_big_button/i18n/pt_BR.po | 61 ++ website_snippet_big_button/i18n/sl.po | 59 ++ .../i18n/website_snippet_big_button.pot | 30 + website_snippet_big_button/pyproject.toml | 3 + .../readme/CONTRIBUTORS.md | 4 + .../readme/DESCRIPTION.md | 3 + website_snippet_big_button/readme/USAGE.md | 7 + .../static/description/icon.png | Bin 0 -> 2297 bytes .../static/description/icon.svg | 101 ++++ .../static/description/index.html | 443 +++++++++++++++ .../src/scss/website_snippet_big_button.scss | 21 + .../templates/snippets.xml | 36 ++ 403 files changed, 17766 insertions(+), 1220 deletions(-) create mode 100644 account_analytic_tag/views/account_move_line_views.xml create mode 100644 base_tier_validation/data/cron_data.xml create mode 100644 base_tier_validation/tests/test_tier_validation_reminder.py create mode 100644 delivery_package_number/README.rst create mode 100644 delivery_package_number/__init__.py create mode 100644 delivery_package_number/__manifest__.py create mode 100644 delivery_package_number/data/paperformat_data.xml create mode 100644 delivery_package_number/i18n/delivery_package_number.pot create mode 100644 delivery_package_number/i18n/es.po create mode 100644 delivery_package_number/i18n/sl.po create mode 100644 delivery_package_number/models/__init__.py create mode 100644 delivery_package_number/models/stock_picking.py create mode 100644 delivery_package_number/models/stock_picking_type.py create mode 100644 delivery_package_number/pyproject.toml create mode 100644 delivery_package_number/readme/CONTRIBUTORS.md create mode 100644 delivery_package_number/readme/DESCRIPTION.md create mode 100644 delivery_package_number/readme/USAGE.md create mode 100644 delivery_package_number/reports/report_package_number.xml create mode 100644 delivery_package_number/security/ir.model.access.csv create mode 100644 delivery_package_number/static/description/icon.png create mode 100644 delivery_package_number/static/description/index.html create mode 100644 delivery_package_number/tests/__init__.py create mode 100644 delivery_package_number/tests/test_delivery_package_number.py create mode 100644 delivery_package_number/views/stock_picking_type_views.xml create mode 100644 delivery_package_number/views/stock_picking_views.xml create mode 100644 delivery_package_number/wizard/__init__.py create mode 100644 delivery_package_number/wizard/stock_backorder_confirmation.py create mode 100644 delivery_package_number/wizard/stock_number_package_validate_wiz.py create mode 100644 delivery_package_number/wizard/stock_number_package_validate_wiz_view.xml create mode 100644 fieldservice_agreement/README.rst create mode 100644 fieldservice_agreement/__init__.py create mode 100644 fieldservice_agreement/__manifest__.py create mode 100644 fieldservice_agreement/i18n/de.po create mode 100644 fieldservice_agreement/i18n/es.po create mode 100644 fieldservice_agreement/i18n/es_AR.po create mode 100644 fieldservice_agreement/i18n/es_CL.po create mode 100644 fieldservice_agreement/i18n/fieldservice_agreement.pot create mode 100644 fieldservice_agreement/i18n/it.po create mode 100644 fieldservice_agreement/i18n/pt_BR.po create mode 100644 fieldservice_agreement/models/__init__.py create mode 100644 fieldservice_agreement/models/agreement.py create mode 100644 fieldservice_agreement/models/fsm_equipment.py create mode 100644 fieldservice_agreement/models/fsm_order.py create mode 100644 fieldservice_agreement/models/fsm_person.py create mode 100644 fieldservice_agreement/pyproject.toml create mode 100644 fieldservice_agreement/readme/CONFIGURE.md create mode 100644 fieldservice_agreement/readme/CONTRIBUTORS.md create mode 100644 fieldservice_agreement/readme/CREDITS.md create mode 100644 fieldservice_agreement/readme/DESCRIPTION.md create mode 100644 fieldservice_agreement/readme/ROADMAP.md create mode 100644 fieldservice_agreement/readme/USAGE.md create mode 100644 fieldservice_agreement/static/description/icon.png create mode 100644 fieldservice_agreement/static/description/index.html create mode 100644 fieldservice_agreement/tests/__init__.py create mode 100644 fieldservice_agreement/tests/test_fsm_agreement.py create mode 100644 fieldservice_agreement/views/agreement_view.xml create mode 100644 fieldservice_agreement/views/fsm_equipment_view.xml create mode 100644 fieldservice_agreement/views/fsm_order_view.xml create mode 100644 fieldservice_agreement/views/fsm_person.xml create mode 100644 fieldservice_stage_validation/security/ir.model.access.csv rename hr_attendance_reason/{data/hr_attendance_reason_data.xml => demo/hr_attendance_reason_demo.xml} (100%) create mode 100644 l10n_us_partner_legal_number/README.rst create mode 100644 l10n_us_partner_legal_number/__init__.py create mode 100644 l10n_us_partner_legal_number/__manifest__.py create mode 100644 l10n_us_partner_legal_number/i18n/l10n_us_partner_legal_number.pot create mode 100644 l10n_us_partner_legal_number/models/__init__.py create mode 100644 l10n_us_partner_legal_number/models/base.py create mode 100644 l10n_us_partner_legal_number/models/res_partner.py create mode 100644 l10n_us_partner_legal_number/pyproject.toml create mode 100644 l10n_us_partner_legal_number/readme/CONTRIBUTORS.md create mode 100644 l10n_us_partner_legal_number/readme/DESCRIPTION.md create mode 100644 l10n_us_partner_legal_number/readme/USAGE.md create mode 100644 l10n_us_partner_legal_number/static/description/icon.png create mode 100644 l10n_us_partner_legal_number/static/description/index.html create mode 100644 l10n_us_partner_legal_number/views/res_partner.xml create mode 100644 portal_sale_personal_data_only/README.rst create mode 100644 portal_sale_personal_data_only/__init__.py create mode 100644 portal_sale_personal_data_only/__manifest__.py create mode 100644 portal_sale_personal_data_only/hooks.py create mode 100644 portal_sale_personal_data_only/i18n/de.po create mode 100644 portal_sale_personal_data_only/i18n/es.po create mode 100644 portal_sale_personal_data_only/i18n/it.po create mode 100644 portal_sale_personal_data_only/i18n/portal_sale_personal_data_only.pot create mode 100644 portal_sale_personal_data_only/i18n/zh_CN.po create mode 100644 portal_sale_personal_data_only/pyproject.toml create mode 100644 portal_sale_personal_data_only/readme/CONTRIBUTORS.md create mode 100644 portal_sale_personal_data_only/readme/DESCRIPTION.md create mode 100644 portal_sale_personal_data_only/readme/USAGE.md create mode 100644 portal_sale_personal_data_only/security/security.xml create mode 100644 portal_sale_personal_data_only/static/description/icon.png create mode 100644 portal_sale_personal_data_only/static/description/index.html create mode 100644 portal_sale_personal_data_only/tests/__init__.py create mode 100644 portal_sale_personal_data_only/tests/test_partner_access.py create mode 100644 report_qweb_pdf_watermark/README.rst create mode 100644 report_qweb_pdf_watermark/__init__.py create mode 100644 report_qweb_pdf_watermark/__manifest__.py create mode 100644 report_qweb_pdf_watermark/demo/report.xml create mode 100644 report_qweb_pdf_watermark/i18n/ca.po create mode 100644 report_qweb_pdf_watermark/i18n/da.po create mode 100644 report_qweb_pdf_watermark/i18n/de.po create mode 100644 report_qweb_pdf_watermark/i18n/el_GR.po create mode 100644 report_qweb_pdf_watermark/i18n/es.po create mode 100644 report_qweb_pdf_watermark/i18n/es_CO.po create mode 100644 report_qweb_pdf_watermark/i18n/fr.po create mode 100644 report_qweb_pdf_watermark/i18n/gl.po create mode 100644 report_qweb_pdf_watermark/i18n/hr.po create mode 100644 report_qweb_pdf_watermark/i18n/hr_HR.po create mode 100644 report_qweb_pdf_watermark/i18n/it.po create mode 100644 report_qweb_pdf_watermark/i18n/nb_NO.po create mode 100644 report_qweb_pdf_watermark/i18n/nl_NL.po create mode 100644 report_qweb_pdf_watermark/i18n/pl.po create mode 100644 report_qweb_pdf_watermark/i18n/pt.po create mode 100644 report_qweb_pdf_watermark/i18n/pt_BR.po create mode 100644 report_qweb_pdf_watermark/i18n/pt_PT.po create mode 100644 report_qweb_pdf_watermark/i18n/report_qweb_pdf_watermark.pot create mode 100644 report_qweb_pdf_watermark/i18n/sl.po create mode 100644 report_qweb_pdf_watermark/i18n/tr.po create mode 100644 report_qweb_pdf_watermark/i18n/tr_TR.po create mode 100644 report_qweb_pdf_watermark/models/__init__.py create mode 100644 report_qweb_pdf_watermark/models/report.py create mode 100644 report_qweb_pdf_watermark/models/res_company.py create mode 100644 report_qweb_pdf_watermark/pyproject.toml create mode 100644 report_qweb_pdf_watermark/readme/CONTRIBUTORS.md create mode 100644 report_qweb_pdf_watermark/readme/DESCRIPTION.md create mode 100644 report_qweb_pdf_watermark/readme/HISTORY.md create mode 100644 report_qweb_pdf_watermark/readme/INSTALL.md create mode 100644 report_qweb_pdf_watermark/readme/ROADMAP.md create mode 100644 report_qweb_pdf_watermark/readme/USAGE.md create mode 100644 report_qweb_pdf_watermark/static/description/icon.png create mode 100644 report_qweb_pdf_watermark/static/description/index.html create mode 100644 report_qweb_pdf_watermark/static/src/css/report_qweb_pdf_watermark.css create mode 100644 report_qweb_pdf_watermark/tests/__init__.py create mode 100644 report_qweb_pdf_watermark/tests/test_report_qweb_pdf_watermark.py create mode 100644 report_qweb_pdf_watermark/views/ir_actions_report_xml.xml create mode 100644 report_qweb_pdf_watermark/views/res_company.xml create mode 100644 sale_order_general_discount/readme/CONTRIBUTORS.md delete mode 100644 sale_order_general_discount/readme/CONTRIBUTORS.rst create mode 100644 sale_order_general_discount/readme/DESCRIPTION.md delete mode 100644 sale_order_general_discount/readme/DESCRIPTION.rst rename sale_order_general_discount/readme/{INSTALL.rst => INSTALL.md} (85%) create mode 100644 sale_order_general_discount/readme/USAGE.md delete mode 100644 sale_order_general_discount/readme/USAGE.rst create mode 100644 sale_substate/README.rst create mode 100644 sale_substate/__init__.py create mode 100644 sale_substate/__manifest__.py create mode 100644 sale_substate/data/sale_substate_data.xml create mode 100644 sale_substate/data/sale_substate_demo.xml create mode 100644 sale_substate/data/sale_substate_mail_template_data.xml create mode 100644 sale_substate/i18n/es.po create mode 100644 sale_substate/i18n/it.po create mode 100644 sale_substate/i18n/sale_substate.pot create mode 100644 sale_substate/models/__init__.py create mode 100644 sale_substate/models/sale_order.py create mode 100644 sale_substate/pyproject.toml create mode 100644 sale_substate/readme/CONTRIBUTORS.md create mode 100644 sale_substate/readme/DESCRIPTION.md create mode 100644 sale_substate/readme/USAGE.md create mode 100644 sale_substate/static/description/icon.png create mode 100644 sale_substate/static/description/index.html create mode 100644 sale_substate/tests/__init__.py create mode 100644 sale_substate/tests/test_sale_substate.py create mode 100644 sale_substate/views/sale_views.xml create mode 100644 web_time_range_menu_custom/README.rst create mode 100644 web_time_range_menu_custom/__init__.py create mode 100644 web_time_range_menu_custom/__manifest__.py create mode 100644 web_time_range_menu_custom/i18n/es.po create mode 100644 web_time_range_menu_custom/i18n/it.po create mode 100644 web_time_range_menu_custom/i18n/web_time_range_menu_custom.pot create mode 100644 web_time_range_menu_custom/pyproject.toml create mode 100644 web_time_range_menu_custom/readme/CONTRIBUTORS.md create mode 100644 web_time_range_menu_custom/readme/DESCRIPTION.md create mode 100644 web_time_range_menu_custom/readme/USAGE.md create mode 100644 web_time_range_menu_custom/static/description/custom_period_option.png create mode 100644 web_time_range_menu_custom/static/description/icon.png create mode 100644 web_time_range_menu_custom/static/description/index.html create mode 100644 web_time_range_menu_custom/static/src/js/date_selector.esm.js create mode 100644 web_time_range_menu_custom/static/src/js/dates.esm.js create mode 100644 web_time_range_menu_custom/static/src/js/search_bar_menu.esm.js create mode 100644 web_time_range_menu_custom/static/src/scss/web_time_range_menu_custom.scss create mode 100644 web_time_range_menu_custom/static/src/xml/date_selector.xml create mode 100644 web_time_range_menu_custom/static/src/xml/search_bar_menu.xml create mode 100644 website_event_questions_by_ticket/README.rst create mode 100644 website_event_questions_by_ticket/__init__.py create mode 100644 website_event_questions_by_ticket/__manifest__.py create mode 100644 website_event_questions_by_ticket/i18n/de.po create mode 100644 website_event_questions_by_ticket/i18n/es.po create mode 100644 website_event_questions_by_ticket/i18n/fr.po create mode 100644 website_event_questions_by_ticket/i18n/it.po create mode 100644 website_event_questions_by_ticket/i18n/website_event_questions_by_ticket.pot create mode 100644 website_event_questions_by_ticket/models/__init__.py create mode 100644 website_event_questions_by_ticket/models/event_event.py create mode 100644 website_event_questions_by_ticket/pyproject.toml create mode 100644 website_event_questions_by_ticket/readme/CONFIGURE.md create mode 100644 website_event_questions_by_ticket/readme/CONTRIBUTORS.md create mode 100644 website_event_questions_by_ticket/readme/DESCRIPTION.md create mode 100644 website_event_questions_by_ticket/readme/ROADMAP.md create mode 100644 website_event_questions_by_ticket/readme/USAGE.md create mode 100644 website_event_questions_by_ticket/static/description/icon.png create mode 100644 website_event_questions_by_ticket/static/description/index.html create mode 100644 website_event_questions_by_ticket/tests/__init__.py create mode 100644 website_event_questions_by_ticket/tests/test_ticket.py create mode 100644 website_event_questions_by_ticket/views/event_event_views.xml create mode 100644 website_event_questions_by_ticket/views/event_templates.xml create mode 100644 website_forum_subscription/README.rst create mode 100644 website_forum_subscription/__init__.py create mode 100644 website_forum_subscription/__manifest__.py create mode 100644 website_forum_subscription/i18n/es.po create mode 100644 website_forum_subscription/i18n/it.po create mode 100644 website_forum_subscription/i18n/website_forum_subscription.pot create mode 100644 website_forum_subscription/pyproject.toml create mode 100644 website_forum_subscription/readme/CONTRIBUTORS.md create mode 100644 website_forum_subscription/readme/DESCRIPTION.md create mode 100644 website_forum_subscription/readme/USAGE.md create mode 100644 website_forum_subscription/static/description/icon.png create mode 100644 website_forum_subscription/static/description/index.html create mode 100644 website_forum_subscription/templates/website_forum_templates.xml create mode 100644 website_membership_gamification/README.rst create mode 100644 website_membership_gamification/__init__.py create mode 100644 website_membership_gamification/__manifest__.py create mode 100644 website_membership_gamification/i18n/es.po create mode 100644 website_membership_gamification/i18n/fr.po create mode 100644 website_membership_gamification/i18n/it.po create mode 100644 website_membership_gamification/i18n/website_membership_gamification.pot create mode 100644 website_membership_gamification/models/__init__.py create mode 100644 website_membership_gamification/models/gamification_badge.py create mode 100644 website_membership_gamification/models/res_partner.py create mode 100644 website_membership_gamification/pyproject.toml create mode 100644 website_membership_gamification/readme/CONFIGURE.md create mode 100644 website_membership_gamification/readme/CONTRIBUTORS.md create mode 100644 website_membership_gamification/readme/DESCRIPTION.md create mode 100644 website_membership_gamification/readme/USAGE.md create mode 100644 website_membership_gamification/static/description/icon.png create mode 100644 website_membership_gamification/static/description/index.html create mode 100644 website_membership_gamification/views/badge.xml create mode 100644 website_membership_gamification/views/res_partner_views.xml create mode 100644 website_membership_gamification/views/website_partner_template.xml create mode 100644 website_membership_gamification/wizard/gamification_badge_user_wizard.xml create mode 100644 website_sale_require_legal/README.rst create mode 100644 website_sale_require_legal/__init__.py create mode 100644 website_sale_require_legal/__manifest__.py create mode 100644 website_sale_require_legal/controllers/__init__.py create mode 100644 website_sale_require_legal/controllers/main.py create mode 100644 website_sale_require_legal/i18n/de.po create mode 100644 website_sale_require_legal/i18n/es.po create mode 100644 website_sale_require_legal/i18n/fi.po create mode 100644 website_sale_require_legal/i18n/hr.po create mode 100644 website_sale_require_legal/i18n/it.po create mode 100644 website_sale_require_legal/i18n/sl.po create mode 100644 website_sale_require_legal/i18n/website_sale_require_legal.pot create mode 100644 website_sale_require_legal/pyproject.toml create mode 100644 website_sale_require_legal/readme/CONFIGURE.md create mode 100644 website_sale_require_legal/readme/CONTEXT.md create mode 100644 website_sale_require_legal/readme/CONTRIBUTORS.md create mode 100644 website_sale_require_legal/readme/DESCRIPTION.md create mode 100644 website_sale_require_legal/readme/ROADMAP.md create mode 100644 website_sale_require_legal/readme/USAGE.md create mode 100644 website_sale_require_legal/static/description/address-enable.png create mode 100644 website_sale_require_legal/static/description/icon.png create mode 100644 website_sale_require_legal/static/description/index.html create mode 100644 website_sale_require_legal/static/description/payment-enable.png create mode 100644 website_sale_require_legal/static/src/scss/website_sale_require_legal.scss create mode 100644 website_sale_require_legal/static/tests/tours/tour.esm.js create mode 100644 website_sale_require_legal/templates/website_sale.xml create mode 100644 website_sale_require_legal/tests/__init__.py create mode 100644 website_sale_require_legal/tests/test_ui.py create mode 100644 website_snippet_big_button/README.rst create mode 100644 website_snippet_big_button/__init__.py create mode 100644 website_snippet_big_button/__manifest__.py create mode 100644 website_snippet_big_button/i18n/ca.po create mode 100644 website_snippet_big_button/i18n/es.po create mode 100644 website_snippet_big_button/i18n/fr.po create mode 100644 website_snippet_big_button/i18n/hr.po create mode 100644 website_snippet_big_button/i18n/it.po create mode 100644 website_snippet_big_button/i18n/pt_BR.po create mode 100644 website_snippet_big_button/i18n/sl.po create mode 100644 website_snippet_big_button/i18n/website_snippet_big_button.pot create mode 100644 website_snippet_big_button/pyproject.toml create mode 100644 website_snippet_big_button/readme/CONTRIBUTORS.md create mode 100644 website_snippet_big_button/readme/DESCRIPTION.md create mode 100644 website_snippet_big_button/readme/USAGE.md create mode 100644 website_snippet_big_button/static/description/icon.png create mode 100644 website_snippet_big_button/static/description/icon.svg create mode 100644 website_snippet_big_button/static/description/index.html create mode 100644 website_snippet_big_button/static/src/scss/website_snippet_big_button.scss create mode 100644 website_snippet_big_button/templates/snippets.xml diff --git a/README-merged.md b/README-merged.md index 7cf286b85e..9125d1e957 100644 --- a/README-merged.md +++ b/README-merged.md @@ -27,7 +27,7 @@ addon | version | maintainers | summary [account_analytic_required](account_analytic_required/) | 17.0.1.0.0 | | Account Analytic Required [account_analytic_sequence](account_analytic_sequence/) | 17.0.1.0.0 | | Restore the analytic account sequence [account_analytic_spread_by_tag](account_analytic_spread_by_tag/) | 17.0.1.0.1 | | Account Analytic Spread by Tag -[account_analytic_tag](account_analytic_tag/) | 17.0.1.0.0 | | Account Analytic Tag +[account_analytic_tag](account_analytic_tag/) | 17.0.1.1.0 | | Account Analytic Tag [analytic_base_department](analytic_base_department/) | 17.0.1.0.0 | | Add relationship between Analytic and Department [analytic_partner](analytic_partner/) | 17.0.1.0.0 | | Search and group analytic entries by partner [hr_timesheet_analytic_tag](hr_timesheet_analytic_tag/) | 17.0.1.0.0 | [![victoralmau](https://github.com/victoralmau.png?size=30px)](https://github.com/victoralmau) | Hr Timesheet Analytic Tag @@ -283,7 +283,7 @@ Available addons ---------------- addon | version | maintainers | summary --- | --- | --- | --- -[account_financial_report](account_financial_report/) | 17.0.1.4.0 | | OCA Financial Reports +[account_financial_report](account_financial_report/) | 17.0.1.5.0 | | OCA Financial Reports [account_tax_balance](account_tax_balance/) | 17.0.1.0.0 | | Compute tax balances based on date range [mis_builder_cash_flow](mis_builder_cash_flow/) | 17.0.1.0.0 | [![jjscarafia](https://github.com/jjscarafia.png?size=30px)](https://github.com/jjscarafia) | MIS Builder Cash Flow [mis_template_financial_report](mis_template_financial_report/) | 17.0.1.0.0 | [![hbrunn](https://github.com/hbrunn.png?size=30px)](https://github.com/hbrunn) | Profit & Loss / Balance sheet MIS templates @@ -387,7 +387,7 @@ addon | version | maintainers | summary [account_invoice_blocking](account_invoice_blocking/) | 17.0.1.0.1 | | Set a blocking (No Follow-up) flag on invoices [account_invoice_crm_tag](account_invoice_crm_tag/) | 17.0.1.0.0 | | Account Invoice CRM Tag [account_invoice_fixed_discount](account_invoice_fixed_discount/) | 17.0.1.1.0 | | Allows to apply fixed amount discounts in invoices. -[account_invoice_pricelist](account_invoice_pricelist/) | 17.0.1.0.0 | | Add partner pricelist on invoices +[account_invoice_pricelist](account_invoice_pricelist/) | 17.0.1.0.1 | | Add partner pricelist on invoices [account_invoice_refund_link](account_invoice_refund_link/) | 17.0.1.0.1 | | Show links between refunds and their originator invoices. [account_invoice_section_sale_order](account_invoice_section_sale_order/) | 17.0.2.0.0 | | For invoices targetting multiple sale order addsections with sale order name. [account_invoice_transmit_method](account_invoice_transmit_method/) | 17.0.1.0.0 | [![alexis-via](https://github.com/alexis-via.png?size=30px)](https://github.com/alexis-via) | Configure invoice transmit method (email, post, portal, ...) @@ -838,7 +838,7 @@ addon | version | maintainers | summary [account_banking_sepa_credit_transfer](account_banking_sepa_credit_transfer/) | 17.0.1.0.3 | | Create SEPA XML files for Credit Transfers [account_banking_sepa_direct_debit](account_banking_sepa_direct_debit/) | 17.0.1.2.2 | | Create SEPA files for Direct Debit [account_payment_mode](account_payment_mode/) | 17.0.1.0.2 | | Account Payment Mode -[account_payment_order](account_payment_order/) | 17.0.1.6.0 | | Account Payment Order +[account_payment_order](account_payment_order/) | 17.0.1.6.1 | | Account Payment Order [account_payment_order_grouped_output](account_payment_order_grouped_output/) | 17.0.1.0.0 | | Account Payment Order - Generate grouped moves [account_payment_order_notification](account_payment_order_notification/) | 17.0.1.0.0 | [![victoralmau](https://github.com/victoralmau.png?size=30px)](https://github.com/victoralmau) | Account Payment Order Notification [account_payment_partner](account_payment_partner/) | 17.0.1.0.5 | | Adds payment mode on partners and invoices @@ -894,8 +894,8 @@ addon | version | maintainers | summary --- | --- | --- | --- [account_mass_reconcile](account_mass_reconcile/) | 17.0.1.0.1 | | Account Mass Reconcile [account_reconcile_model_oca](account_reconcile_model_oca/) | 17.0.1.0.1 | | This includes the logic moved from Odoo Community to Odoo Enterprise -[account_reconcile_oca](account_reconcile_oca/) | 17.0.1.3.5 | [![etobella](https://github.com/etobella.png?size=30px)](https://github.com/etobella) | Reconcile addons for Odoo CE accounting -[account_statement_base](account_statement_base/) | 17.0.1.4.0 | [![alexis-via](https://github.com/alexis-via.png?size=30px)](https://github.com/alexis-via) | Base module for Bank Statements +[account_reconcile_oca](account_reconcile_oca/) | 17.0.1.4.0 | [![etobella](https://github.com/etobella.png?size=30px)](https://github.com/etobella) | Reconcile addons for Odoo CE accounting +[account_statement_base](account_statement_base/) | 17.0.1.4.1 | [![alexis-via](https://github.com/alexis-via.png?size=30px)](https://github.com/alexis-via) | Base module for Bank Statements [//]: # (end addons) @@ -1651,6 +1651,7 @@ Available addons addon | version | maintainers | summary --- | --- | --- | --- [partner_sale_pivot](partner_sale_pivot/) | 17.0.1.0.0 | [![ernestotejeda](https://github.com/ernestotejeda.png?size=30px)](https://github.com/ernestotejeda) | Sales analysis from customer form view +[portal_sale_personal_data_only](portal_sale_personal_data_only/) | 17.0.1.0.0 | | Portal Sale Personal Data Only [product_form_sale_link](product_form_sale_link/) | 17.0.1.0.0 | | Adds a button on product forms to access Sale Lines [product_supplierinfo_for_customer_sale](product_supplierinfo_for_customer_sale/) | 17.0.1.0.0 | | Loads in every sale order line the customer code defined in the product [sale_advance_payment](sale_advance_payment/) | 17.0.1.0.0 | | Allow to add advance payments on sales and then use them on invoices @@ -1696,6 +1697,7 @@ addon | version | maintainers | summary [sale_stock_delivery_state](sale_stock_delivery_state/) | 17.0.1.0.0 | | Change the way to compute the delivery state [sale_stock_picking_blocking](sale_stock_picking_blocking/) | 17.0.1.1.0 | | Allow you to block the creation of deliveries from a sale order. [sale_stock_picking_note](sale_stock_picking_note/) | 17.0.1.0.0 | [![carlosdauden](https://github.com/carlosdauden.png?size=30px)](https://github.com/carlosdauden) [![victoralmau](https://github.com/victoralmau.png?size=30px)](https://github.com/victoralmau) [![chienandalu](https://github.com/chienandalu.png?size=30px)](https://github.com/chienandalu) [![EmilioPascual](https://github.com/EmilioPascual.png?size=30px)](https://github.com/EmilioPascual) | Add picking note in sale and purchase order +[sale_substate](sale_substate/) | 17.0.1.0.0 | | Sale Sub State [sale_tier_validation](sale_tier_validation/) | 17.0.1.0.0 | | Extends the functionality of Sale Orders to support a tier validation process. [sale_validity_auto_cancel](sale_validity_auto_cancel/) | 17.0.1.0.0 | [![JordiMForgeFlow](https://github.com/JordiMForgeFlow.png?size=30px)](https://github.com/JordiMForgeFlow) | Automatically cancel quotations after validity period. [sales_team_security](sales_team_security/) | 17.0.1.0.1 | [![pedrobaeza](https://github.com/pedrobaeza.png?size=30px)](https://github.com/pedrobaeza) [![ivantodorovich](https://github.com/ivantodorovich.png?size=30px)](https://github.com/ivantodorovich) | New group for seeing only sales channel's documents @@ -2083,6 +2085,7 @@ addon | version | maintainers | summary [event_registration_partner_unique](event_registration_partner_unique/) | 17.0.1.0.0 | | Enforces 1 registration per partner and event [partner_event](partner_event/) | 17.0.1.0.0 | | Link partner to events [website_event_membership_restriction](website_event_membership_restriction/) | 17.0.1.0.0 | | Restrict event registration to members only +[website_event_questions_by_ticket](website_event_questions_by_ticket/) | 17.0.1.0.0 | | Events Questions conditional to the chosen ticket [website_event_require_login](website_event_require_login/) | 17.0.1.0.0 | | Website Event Require Login [//]: # (end addons) @@ -2279,6 +2282,7 @@ addon | version | maintainers | summary [website_sale_hide_price](website_sale_hide_price/) | 17.0.1.1.1 | | Hide product prices on the shop [website_sale_product_description](website_sale_product_description/) | 17.0.1.0.0 | | Shows custom e-Commerce description for products [website_sale_product_reference_displayed](website_sale_product_reference_displayed/) | 17.0.1.0.0 | | Display product reference in e-commerce +[website_sale_require_legal](website_sale_require_legal/) | 17.0.1.0.0 | | Force the user to accept legal tems to buy in the web shop [website_sale_suggest_create_account](website_sale_suggest_create_account/) | 17.0.1.0.0 | | Suggest users to create an account when buying in the website [//]: # (end addons) @@ -2394,6 +2398,7 @@ addon | version | maintainers | summary [fieldservice_account](fieldservice_account/) | 17.0.1.0.0 | [![osimallen](https://github.com/osimallen.png?size=30px)](https://github.com/osimallen) [![brian10048](https://github.com/brian10048.png?size=30px)](https://github.com/brian10048) [![bodedra](https://github.com/bodedra.png?size=30px)](https://github.com/bodedra) | Track invoices linked to Field Service orders [fieldservice_account_analytic](fieldservice_account_analytic/) | 17.0.1.0.0 | [![osimallen](https://github.com/osimallen.png?size=30px)](https://github.com/osimallen) [![brian10048](https://github.com/brian10048.png?size=30px)](https://github.com/brian10048) [![bodedra](https://github.com/bodedra.png?size=30px)](https://github.com/bodedra) | Track analytic accounts on Field Service locations and orders [fieldservice_activity](fieldservice_activity/) | 17.0.1.0.1 | [![max3903](https://github.com/max3903.png?size=30px)](https://github.com/max3903) [![osi-scampbell](https://github.com/osi-scampbell.png?size=30px)](https://github.com/osi-scampbell) | Field Service Activities are a set of actions that need to be performed on a service order +[fieldservice_agreement](fieldservice_agreement/) | 17.0.1.0.0 | [![max3903](https://github.com/max3903.png?size=30px)](https://github.com/max3903) [![bodedra](https://github.com/bodedra.png?size=30px)](https://github.com/bodedra) [![smangukiya](https://github.com/smangukiya.png?size=30px)](https://github.com/smangukiya) [![osi-scampbell](https://github.com/osi-scampbell.png?size=30px)](https://github.com/osi-scampbell) [![patrickrwilson](https://github.com/patrickrwilson.png?size=30px)](https://github.com/patrickrwilson) | Manage Field Service agreements and contracts [fieldservice_calendar](fieldservice_calendar/) | 17.0.1.0.0 | [![hparfr](https://github.com/hparfr.png?size=30px)](https://github.com/hparfr) | Add calendar to FSM Orders [fieldservice_crm](fieldservice_crm/) | 17.0.1.0.0 | [![patrickrwilson](https://github.com/patrickrwilson.png?size=30px)](https://github.com/patrickrwilson) | Create Field Service orders from the CRM [fieldservice_equipment_stock](fieldservice_equipment_stock/) | 17.0.1.0.0 | [![brian10048](https://github.com/brian10048.png?size=30px)](https://github.com/brian10048) [![wolfhall](https://github.com/wolfhall.png?size=30px)](https://github.com/wolfhall) [![max3903](https://github.com/max3903.png?size=30px)](https://github.com/max3903) [![smangukiya](https://github.com/smangukiya.png?size=30px)](https://github.com/smangukiya) | Integrate stock operations with your field service equipments @@ -2408,7 +2413,7 @@ addon | version | maintainers | summary [fieldservice_sale_stock](fieldservice_sale_stock/) | 17.0.1.0.0 | [![wolfhall](https://github.com/wolfhall.png?size=30px)](https://github.com/wolfhall) [![max3903](https://github.com/max3903.png?size=30px)](https://github.com/max3903) [![brian10048](https://github.com/brian10048.png?size=30px)](https://github.com/brian10048) | Sell stockable items linked to field service orders. [fieldservice_size](fieldservice_size/) | 17.0.1.0.0 | [![brian10048](https://github.com/brian10048.png?size=30px)](https://github.com/brian10048) | Manage Sizes for Field Service Locations and Orders [fieldservice_stage_server_action](fieldservice_stage_server_action/) | 17.0.1.3.0 | [![wolfhall](https://github.com/wolfhall.png?size=30px)](https://github.com/wolfhall) [![max3903](https://github.com/max3903.png?size=30px)](https://github.com/max3903) [![osi-scampbell](https://github.com/osi-scampbell.png?size=30px)](https://github.com/osi-scampbell) | Execute server actions when reaching a Field Service stage -[fieldservice_stage_validation](fieldservice_stage_validation/) | 17.0.1.0.0 | [![brian10048](https://github.com/brian10048.png?size=30px)](https://github.com/brian10048) [![max3903](https://github.com/max3903.png?size=30px)](https://github.com/max3903) | Validate input data when reaching a Field Service stage +[fieldservice_stage_validation](fieldservice_stage_validation/) | 17.0.1.1.0 | [![brian10048](https://github.com/brian10048.png?size=30px)](https://github.com/brian10048) [![max3903](https://github.com/max3903.png?size=30px)](https://github.com/max3903) | Validate input data when reaching a Field Service stage [fieldservice_stock](fieldservice_stock/) | 17.0.1.0.0 | [![brian10048](https://github.com/brian10048.png?size=30px)](https://github.com/brian10048) [![wolfhall](https://github.com/wolfhall.png?size=30px)](https://github.com/wolfhall) [![max3903](https://github.com/max3903.png?size=30px)](https://github.com/max3903) [![smangukiya](https://github.com/smangukiya.png?size=30px)](https://github.com/smangukiya) | Integrate the logistics operations with Field Service [fieldservice_stock_request](fieldservice_stock_request/) | 17.0.1.0.0 | [![brian10048](https://github.com/brian10048.png?size=30px)](https://github.com/brian10048) [![wolfhall](https://github.com/wolfhall.png?size=30px)](https://github.com/wolfhall) [![max3903](https://github.com/max3903.png?size=30px)](https://github.com/max3903) [![smangukiya](https://github.com/smangukiya.png?size=30px)](https://github.com/smangukiya) | Integrate Stock Requests with Field Service Orders [fieldservice_vehicle](fieldservice_vehicle/) | 17.0.1.0.0 | [![wolfhall](https://github.com/wolfhall.png?size=30px)](https://github.com/wolfhall) [![max3903](https://github.com/max3903.png?size=30px)](https://github.com/max3903) | Manage Field Service vehicles and assign drivers @@ -2752,7 +2757,7 @@ addon | version | maintainers | summary --- | --- | --- | --- [hr_attendance_autoclose](hr_attendance_autoclose/) | 17.0.1.0.0 | | Close stale Attendances [hr_attendance_calendar_view](hr_attendance_calendar_view/) | 17.0.1.0.0 | | This module adds the calendar view as an option to display attendance -[hr_attendance_reason](hr_attendance_reason/) | 17.0.1.0.0 | | HR Attendance Reason +[hr_attendance_reason](hr_attendance_reason/) | 17.0.1.1.0 | | HR Attendance Reason [hr_attendance_report_theoretical_time](hr_attendance_report_theoretical_time/) | 17.0.1.1.0 | | Theoretical vs Attended Time Analysis [//]: # (end addons) @@ -2799,10 +2804,10 @@ Available addons ---------------- addon | version | maintainers | summary --- | --- | --- | --- -[hr_expense_cancel](hr_expense_cancel/) | 17.0.1.0.2 | | Hr expense cancel +[hr_expense_cancel](hr_expense_cancel/) | 17.0.1.0.3 | | Hr expense cancel [hr_expense_employee_analytic_default](hr_expense_employee_analytic_default/) | 17.0.1.0.0 | [![victoralmau](https://github.com/victoralmau.png?size=30px)](https://github.com/victoralmau) | Expense Employee Analytic Default -[hr_expense_invoice](hr_expense_invoice/) | 17.0.1.0.0 | | Supplier invoices on HR expenses -[hr_expense_payment](hr_expense_payment/) | 17.0.1.0.0 | | HR Expense Payment +[hr_expense_invoice](hr_expense_invoice/) | 17.0.1.0.2 | | Supplier invoices on HR expenses +[hr_expense_payment](hr_expense_payment/) | 17.0.1.0.1 | | HR Expense Payment [//]: # (end addons) @@ -2981,7 +2986,7 @@ Available addons ---------------- addon | version | maintainers | summary --- | --- | --- | --- -[account_invoice_inter_company](account_invoice_inter_company/) | 17.0.1.0.0 | | Intercompany invoice rules +[account_invoice_inter_company](account_invoice_inter_company/) | 17.0.1.0.1 | | Intercompany invoice rules [base_multi_company](base_multi_company/) | 17.0.1.0.1 | [![pedrobaeza](https://github.com/pedrobaeza.png?size=30px)](https://github.com/pedrobaeza) | Provides a base for adding multi-company support to models. [mail_multicompany](mail_multicompany/) | 17.0.1.0.0 | [![luisg123v](https://github.com/luisg123v.png?size=30px)](https://github.com/luisg123v) | Email Gateway Multi company [partner_multi_company](partner_multi_company/) | 17.0.1.0.0 | | Select individually the partner visibility on each company @@ -4430,7 +4435,7 @@ Available addons addon | version | maintainers | summary --- | --- | --- | --- [currency_rate_update_RO_BNR](currency_rate_update_RO_BNR/) | 17.0.1.5.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Currency Rate Update National Bank of Romania service -[l10n_ro_account](l10n_ro_account/) | 17.0.1.7.0 | [![dhongu](https://github.com/dhongu.png?size=30px)](https://github.com/dhongu) | Romania - Account +[l10n_ro_account](l10n_ro_account/) | 17.0.1.8.0 | [![dhongu](https://github.com/dhongu.png?size=30px)](https://github.com/dhongu) | Romania - Account [l10n_ro_account_anaf_sync](l10n_ro_account_anaf_sync/) | 17.0.1.5.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Romania - Account ANAF Sync [l10n_ro_account_bank_statement_import_mt940_alpha](l10n_ro_account_bank_statement_import_mt940_alpha/) | 17.0.0.1.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | MT940 Alpha Format Bank Statements Import [l10n_ro_account_bank_statement_import_mt940_base](l10n_ro_account_bank_statement_import_mt940_base/) | 17.0.0.1.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) [![dhongu](https://github.com/dhongu.png?size=30px)](https://github.com/dhongu) | Romania - MT940 Bank Statements Import @@ -4439,7 +4444,7 @@ addon | version | maintainers | summary [l10n_ro_account_bank_statement_import_mt940_ing](l10n_ro_account_bank_statement_import_mt940_ing/) | 17.0.0.2.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) [![dhongu](https://github.com/dhongu.png?size=30px)](https://github.com/dhongu) | MT940 ING Format Bank Statements Import [l10n_ro_account_bank_statement_import_mt940_rffsn](l10n_ro_account_bank_statement_import_mt940_rffsn/) | 17.0.0.1.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) [![dhongu](https://github.com/dhongu.png?size=30px)](https://github.com/dhongu) | Romania - Import bank statements from Raiffeisen [l10n_ro_account_bank_statement_report](l10n_ro_account_bank_statement_report/) | 17.0.1.2.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Romania - Bank Statement Report -[l10n_ro_account_edit_currency_rate](l10n_ro_account_edit_currency_rate/) | 17.0.0.1.0 | [![mcojocaru](https://github.com/mcojocaru.png?size=30px)](https://github.com/mcojocaru) | Romania - Invoice Edit Currency Rate +[l10n_ro_account_edit_currency_rate](l10n_ro_account_edit_currency_rate/) | 17.0.0.2.0 | [![mcojocaru](https://github.com/mcojocaru.png?size=30px)](https://github.com/mcojocaru) | Romania - Invoice Edit Currency Rate [l10n_ro_account_period_close](l10n_ro_account_period_close/) | 17.0.0.2.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Romania - Account Period Closing [l10n_ro_account_report_invoice](l10n_ro_account_report_invoice/) | 17.0.1.4.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Romania - Invoice Report [l10n_ro_city](l10n_ro_city/) | 17.0.1.3.0 | [![dhongu](https://github.com/dhongu.png?size=30px)](https://github.com/dhongu) | Romania - City @@ -4456,7 +4461,7 @@ addon | version | maintainers | summary [l10n_ro_pos](l10n_ro_pos/) | 17.0.1.2.0 | [![dhongu](https://github.com/dhongu.png?size=30px)](https://github.com/dhongu) | Romania - Point of Sale [l10n_ro_stock](l10n_ro_stock/) | 17.0.0.8.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Romania - Stock [l10n_ro_stock_account](l10n_ro_stock_account/) | 17.0.1.13.0 | [![dhongu](https://github.com/dhongu.png?size=30px)](https://github.com/dhongu) [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Romania - Stock Accounting -[l10n_ro_stock_account_date](l10n_ro_stock_account_date/) | 17.0.1.9.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Romania - Stock Accounting Date +[l10n_ro_stock_account_date](l10n_ro_stock_account_date/) | 17.0.1.10.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Romania - Stock Accounting Date [l10n_ro_stock_account_date_wizard](l10n_ro_stock_account_date_wizard/) | 17.0.1.3.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Romania - Stock Accounting Date Wizard [l10n_ro_stock_account_landed_cost](l10n_ro_stock_account_landed_cost/) | 17.0.1.2.0 | [![dhongu](https://github.com/dhongu.png?size=30px)](https://github.com/dhongu) [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Romania - Stock Accounting Landed Cost [l10n_ro_stock_account_notice](l10n_ro_stock_account_notice/) | 17.0.1.6.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) [![mcojocaru](https://github.com/mcojocaru.png?size=30px)](https://github.com/mcojocaru) [![dhongu](https://github.com/dhongu.png?size=30px)](https://github.com/dhongu) | Romania - Stock Accounting Notice @@ -4464,7 +4469,7 @@ addon | version | maintainers | summary [l10n_ro_stock_account_tracking](l10n_ro_stock_account_tracking/) | 17.0.1.5.0 | [![dhongu](https://github.com/dhongu.png?size=30px)](https://github.com/dhongu) [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Romania - Stock Accounting [l10n_ro_stock_picking_comment_template](l10n_ro_stock_picking_comment_template/) | 17.0.0.3.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | This model is going to add a a header and a footer at picking report depeding on the operation type. [l10n_ro_stock_picking_valued_report](l10n_ro_stock_picking_valued_report/) | 17.0.0.1.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Romania - Stock Picking Valued Report -[l10n_ro_stock_price_difference](l10n_ro_stock_price_difference/) | 17.0.0.3.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) [![mcojocaru](https://github.com/mcojocaru.png?size=30px)](https://github.com/mcojocaru) [![dhongu](https://github.com/dhongu.png?size=30px)](https://github.com/dhongu) | Romania - Stock Accounting Price Difference +[l10n_ro_stock_price_difference](l10n_ro_stock_price_difference/) | 17.0.0.4.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) [![mcojocaru](https://github.com/mcojocaru.png?size=30px)](https://github.com/mcojocaru) [![dhongu](https://github.com/dhongu.png?size=30px)](https://github.com/dhongu) | Romania - Stock Accounting Price Difference [l10n_ro_stock_report](l10n_ro_stock_report/) | 17.0.1.3.0 | [![dhongu](https://github.com/dhongu.png?size=30px)](https://github.com/dhongu) [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Romania - Stock Report (Fișă Magazie) [l10n_ro_vat_on_payment](l10n_ro_vat_on_payment/) | 17.0.1.3.0 | [![feketemihai](https://github.com/feketemihai.png?size=30px)](https://github.com/feketemihai) | Romania - VAT on Payment @@ -4937,6 +4942,7 @@ addon | version | maintainers | summary --- | --- | --- | --- [l10n_us_form_1099](l10n_us_form_1099/) | 17.0.1.0.0 | [![max3903](https://github.com/max3903.png?size=30px)](https://github.com/max3903) | Manage 1099 Types and Suppliers [l10n_us_mis_financial_report](l10n_us_mis_financial_report/) | 17.0.1.0.0 | [![Christian-RB](https://github.com/Christian-RB.png?size=30px)](https://github.com/Christian-RB) | Profit & Loss (US) / Balance sheet (US) MIS templates +[l10n_us_partner_legal_number](l10n_us_partner_legal_number/) | 17.0.1.0.0 | | Add Legal Number for North American Banking & Financials [//]: # (end addons) @@ -5070,6 +5076,7 @@ addon | version | maintainers | summary [delivery_carrier_account](delivery_carrier_account/) | 17.0.1.0.0 | | Delivery Carrier Account [delivery_carrier_info](delivery_carrier_info/) | 17.0.1.0.0 | | Add code on carrier [delivery_carrier_partner](delivery_carrier_partner/) | 17.0.1.0.0 | | Add a partner in the delivery carrier +[delivery_package_number](delivery_package_number/) | 17.0.1.0.0 | | Set or compute number of packages for a picking [delivery_roulier](delivery_roulier/) | 17.0.1.0.0 | [![florian-dacosta](https://github.com/florian-dacosta.png?size=30px)](https://github.com/florian-dacosta) | Integration of multiple carriers [delivery_roulier_option](delivery_roulier_option/) | 17.0.1.0.0 | [![florian-dacosta](https://github.com/florian-dacosta.png?size=30px)](https://github.com/florian-dacosta) | Add options to roulier modules [delivery_state](delivery_state/) | 17.0.1.0.0 | | Provides fields to be able to contemplate the tracking statesand also adds a global fields @@ -5551,7 +5558,7 @@ addon | version | maintainers | summary [mrp_bom_component_menu](mrp_bom_component_menu/) | 17.0.1.0.0 | | MRP BOM Component Menu [mrp_bom_tracking](mrp_bom_tracking/) | 17.0.1.0.0 | | Logs any change to a BoM in the chatter [mrp_mass_production_order](mrp_mass_production_order/) | 17.0.1.0.0 | [![peluko00](https://github.com/peluko00.png?size=30px)](https://github.com/peluko00) | Create multiple manufacturing orders in one step -[mrp_multi_level](mrp_multi_level/) | 17.0.1.2.3 | [![JordiBForgeFlow](https://github.com/JordiBForgeFlow.png?size=30px)](https://github.com/JordiBForgeFlow) [![LoisRForgeFlow](https://github.com/LoisRForgeFlow.png?size=30px)](https://github.com/LoisRForgeFlow) [![ChrisOForgeFlow](https://github.com/ChrisOForgeFlow.png?size=30px)](https://github.com/ChrisOForgeFlow) | Adds an MRP Scheduler +[mrp_multi_level](mrp_multi_level/) | 17.0.1.2.4 | [![JordiBForgeFlow](https://github.com/JordiBForgeFlow.png?size=30px)](https://github.com/JordiBForgeFlow) [![LoisRForgeFlow](https://github.com/LoisRForgeFlow.png?size=30px)](https://github.com/LoisRForgeFlow) [![ChrisOForgeFlow](https://github.com/ChrisOForgeFlow.png?size=30px)](https://github.com/ChrisOForgeFlow) | Adds an MRP Scheduler [mrp_multi_level_estimate](mrp_multi_level_estimate/) | 17.0.1.0.0 | [![LoisRForgeFlow](https://github.com/LoisRForgeFlow.png?size=30px)](https://github.com/LoisRForgeFlow) | Allows to consider demand estimates using MRP multi level. [mrp_production_note](mrp_production_note/) | 17.0.1.0.0 | | Notes in production orders [mrp_repair_order](mrp_repair_order/) | 17.0.1.0.0 | [![peluko00](https://github.com/peluko00.png?size=30px)](https://github.com/peluko00) | Create repair order from manufacturing order @@ -6623,6 +6630,7 @@ addon | version | maintainers | summary [report_layout_config](report_layout_config/) | 17.0.1.0.0 | | Add possibility to easily modify the global report layout [report_qweb_element_page_visibility](report_qweb_element_page_visibility/) | 17.0.1.0.0 | | Report Qweb Element Page Visibility [report_qweb_parameter](report_qweb_parameter/) | 17.0.1.0.1 | | Add new parameters for qweb templates in order to reduce field length and check minimal length +[report_qweb_pdf_watermark](report_qweb_pdf_watermark/) | 17.0.1.0.0 | | Add watermarks to your QWEB PDF reports [report_substitute](report_substitute/) | 17.0.1.0.0 | [![sbejaoui](https://github.com/sbejaoui.png?size=30px)](https://github.com/sbejaoui) | This module allows to create substitution rules for report actions. [report_wkhtmltopdf_param](report_wkhtmltopdf_param/) | 17.0.1.0.0 | | Add new parameters for a paper format to be used by wkhtmltopdf command as arguments. [report_xlsx](report_xlsx/) | 17.0.1.0.1 | | Base module to create xlsx report @@ -6996,7 +7004,7 @@ addon | version | maintainers | summary --- | --- | --- | --- [disable_odoo_online](disable_odoo_online/) | 17.0.1.0.0 | | Remove odoo.com Bindings [portal_odoo_debranding](portal_odoo_debranding/) | 17.0.1.0.0 | [![eLBati](https://github.com/eLBati.png?size=30px)](https://github.com/eLBati) [![ivantodorovich](https://github.com/ivantodorovich.png?size=30px)](https://github.com/ivantodorovich) | Remove Odoo Branding from Website -[remove_odoo_enterprise](remove_odoo_enterprise/) | 17.0.1.0.0 | | Remove enterprise modules and setting items +[remove_odoo_enterprise](remove_odoo_enterprise/) | 17.0.1.0.1 | | Remove enterprise modules and setting items [//]: # (end addons) @@ -7050,7 +7058,7 @@ addon | version | maintainers | summary [base_search_custom_field_filter](base_search_custom_field_filter/) | 17.0.1.0.0 | [![pedrobaeza](https://github.com/pedrobaeza.png?size=30px)](https://github.com/pedrobaeza) | Add custom filters for fields via UI [base_substate](base_substate/) | 17.0.1.0.0 | | Base Sub State [base_technical_features](base_technical_features/) | 17.0.1.0.1 | | Access to technical features without activating debug mode -[base_tier_validation](base_tier_validation/) | 17.0.2.2.1 | [![LoisRForgeFlow](https://github.com/LoisRForgeFlow.png?size=30px)](https://github.com/LoisRForgeFlow) | Implement a validation process based on tiers. +[base_tier_validation](base_tier_validation/) | 17.0.2.3.0 | [![LoisRForgeFlow](https://github.com/LoisRForgeFlow.png?size=30px)](https://github.com/LoisRForgeFlow) | Implement a validation process based on tiers. [base_tier_validation_formula](base_tier_validation_formula/) | 17.0.1.0.0 | | Formulas for Base tier validation [base_tier_validation_forward](base_tier_validation_forward/) | 17.0.1.0.0 | [![kittiu](https://github.com/kittiu.png?size=30px)](https://github.com/kittiu) | Forward option for base tiers [date_range](date_range/) | 17.0.1.2.1 | [![lmignon](https://github.com/lmignon.png?size=30px)](https://github.com/lmignon) | Manage all kind of date range @@ -7414,6 +7422,7 @@ addon | version | maintainers | summary [membership_extension](membership_extension/) | 17.0.1.0.3 | | Improves user experience of membership addon [membership_initial_fee](membership_initial_fee/) | 17.0.1.0.0 | [![rafaelbn](https://github.com/rafaelbn.png?size=30px)](https://github.com/rafaelbn) [![edlopen](https://github.com/edlopen.png?size=30px)](https://github.com/edlopen) | Initial fee for memberships [membership_variable_period](membership_variable_period/) | 17.0.1.0.1 | | Variable period for memberships +[website_membership_gamification](website_membership_gamification/) | 17.0.1.0.0 | | Show badges assigned to users on website [website_membership_random_order](website_membership_random_order/) | 17.0.1.0.0 | [![pedrobaeza](https://github.com/pedrobaeza.png?size=30px)](https://github.com/pedrobaeza) | Online Members Directory - Random order [//]: # (end addons) @@ -7899,6 +7908,7 @@ addon | version | maintainers | summary [web_remember_tree_column_width](web_remember_tree_column_width/) | 17.0.1.0.0 | [![frahikLV](https://github.com/frahikLV.png?size=30px)](https://github.com/frahikLV) [![luisg123v](https://github.com/luisg123v.png?size=30px)](https://github.com/luisg123v) [![cuongnmtm](https://github.com/cuongnmtm.png?size=30px)](https://github.com/cuongnmtm) | Remember the tree columns' widths across sessions. [web_responsive](web_responsive/) | 17.0.1.1.2 | [![Tardo](https://github.com/Tardo.png?size=30px)](https://github.com/Tardo) [![SplashS](https://github.com/SplashS.png?size=30px)](https://github.com/SplashS) | Responsive web client, community-supported [web_theme_classic](web_theme_classic/) | 17.0.1.0.0 | [![legalsylvain](https://github.com/legalsylvain.png?size=30px)](https://github.com/legalsylvain) | Contrasted style on fields to improve the UI. +[web_time_range_menu_custom](web_time_range_menu_custom/) | 17.0.1.0.0 | | Web Time Range Menu Custom [web_timeline](web_timeline/) | 17.0.1.0.1 | [![tarteo](https://github.com/tarteo.png?size=30px)](https://github.com/tarteo) | Interactive visualization chart to show events in time [web_tree_dynamic_colored_field](web_tree_dynamic_colored_field/) | 17.0.1.0.0 | | Allows you to dynamically color fields on tree views [web_tree_many2one_clickable](web_tree_many2one_clickable/) | 17.0.1.0.0 | | Open the linked resource when clicking on their name @@ -7959,9 +7969,11 @@ addon | version | maintainers | summary [website_cookiebot](website_cookiebot/) | 17.0.1.0.1 | | Ask for cookies consent connecting with Cookiebot [website_cookiefirst](website_cookiefirst/) | 17.0.1.0.0 | | Cookiefirst integration [website_form_require_legal](website_form_require_legal/) | 17.0.1.0.0 | | Add possibility to require confirm legal terms. +[website_forum_subscription](website_forum_subscription/) | 17.0.1.0.0 | | Adds a button to allow subscription from the website [website_google_tag_manager](website_google_tag_manager/) | 17.0.1.0.1 | | Add support for Google Tag Manager [website_odoo_debranding](website_odoo_debranding/) | 17.0.1.0.0 | | Remove Odoo Branding from Website [website_require_login](website_require_login/) | 17.0.1.0.0 | | Website Login Required +[website_snippet_big_button](website_snippet_big_button/) | 17.0.1.0.0 | | A snippet that adds two big buttons [//]: # (end addons) diff --git a/README.md b/README.md index 3df6f8feef..6ebab18ef9 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,10 @@ ## account-analytic From [https://github.com/OCA/account-analytic.git](https://github.com/OCA/account-analytic.git) -commit 9c3445abf408b9d063b63a8a35228352b6190007 -Author: Weblate -Date: Thu Nov 7 15:51:26 2024 +0000 +commit e37042c04a7205431d49339528e6e22b0c9a56e4 +Author: OCA-git-bot +Date: Thu Nov 28 09:18:45 2024 +0000 - Update translation files - - Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. - - Translation: account-analytic-17.0/account-analytic-17.0-pos_analytic_by_config - Translate-URL: https://translation.odoo-community.org/projects/account-analytic-17-0/account-analytic-17-0-pos_analytic_by_config/ + [BOT] post-merge updates ## account-budgeting @@ -60,9 +55,9 @@ Date: Tue Nov 19 09:16:45 2024 +0000 ## account-financial-reporting From [https://github.com/OCA/account-financial-reporting.git](https://github.com/OCA/account-financial-reporting.git) -commit 0e951819a53861f0d5ca9ddfd79f57fee2af360d +commit 1a060d82091c498068f84f7867aa5ab46d0f646a Author: OCA-git-bot -Date: Fri Nov 15 07:26:34 2024 +0000 +Date: Fri Nov 29 07:57:45 2024 +0000 [BOT] post-merge updates @@ -78,16 +73,11 @@ Date: Fri Oct 18 14:42:13 2024 +0000 ## account-invoicing From [https://github.com/OCA/account-invoicing.git](https://github.com/OCA/account-invoicing.git) -commit 74114fca081497686d51eb5762fc5d477ffdb78a -Author: Weblate -Date: Fri Nov 15 11:51:23 2024 +0000 +commit 3738d9530c60cd523347f0fd63f42e9492d8ae65 +Author: OCA-git-bot +Date: Tue Nov 26 18:15:03 2024 +0000 - Update translation files - - Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. - - Translation: account-invoicing-17.0/account-invoicing-17.0-portal_account_personal_data_only - Translate-URL: https://translation.odoo-community.org/projects/account-invoicing-17-0/account-invoicing-17-0-portal_account_personal_data_only/ + [BOT] post-merge updates ## account-fiscal-rule @@ -120,16 +110,16 @@ Date: Thu Oct 3 06:45:36 2024 +0000 ## intrastat From [https://github.com/OCA/intrastat.git](https://github.com/OCA/intrastat.git) -commit d0dd5f627af4f9f6d291258d361fb0708b9751c9 -Author: epanisset -Date: Fri Nov 8 16:45:51 2024 +0000 +commit fbb532e5eb92b88ae8883fede397d62757e7876f +Author: mymage +Date: Tue Nov 26 17:10:02 2024 +0000 - Translated using Weblate (French) + Translated using Weblate (Italian) - Currently translated at 100.0% (277 of 277 strings) + Currently translated at 100.0% (34 of 34 strings) - Translation: intrastat-extrastat-17.0/intrastat-extrastat-17.0-intrastat_product - Translate-URL: https://translation.odoo-community.org/projects/intrastat-extrastat-17-0/intrastat-extrastat-17-0-intrastat_product/fr/ + Translation: intrastat-extrastat-17.0/intrastat-extrastat-17.0-product_harmonized_system + Translate-URL: https://translation.odoo-community.org/projects/intrastat-extrastat-17-0/intrastat-extrastat-17-0-product_harmonized_system/it/ ## mis-builder @@ -180,18 +170,18 @@ Date: Sat Jul 6 17:24:49 2024 +0000 ## bank-payment From [https://github.com/OCA/bank-payment.git](https://github.com/OCA/bank-payment.git) -commit 8db07187081455eb166ba5e8a78a4f61521aeeb8 +commit 3cac380d8d75a52336982b4dafb5ba8e5fd5b74f Author: OCA-git-bot -Date: Fri Nov 22 11:28:53 2024 +0000 +Date: Thu Nov 28 10:15:39 2024 +0000 [BOT] post-merge updates ## account-reconcile From [https://github.com/OCA/account-reconcile.git](https://github.com/OCA/account-reconcile.git) -commit 38ad4e4ce921b2e3bb0505e23943e9b5d3f18236 +commit 1d00fe546420412b005d407d8873293a71bb478d Author: OCA-git-bot -Date: Wed Nov 20 07:57:02 2024 +0000 +Date: Thu Nov 28 07:27:26 2024 +0000 [BOT] post-merge updates @@ -352,11 +342,16 @@ Date: Sat Jul 6 17:23:31 2024 +0000 ## sale-workflow From [https://github.com/OCA/sale-workflow.git](https://github.com/OCA/sale-workflow.git) -commit 040ed517998286a9d822a97b00eddf24d579d6c8 -Author: OCA-git-bot -Date: Tue Nov 19 21:06:19 2024 +0000 +commit 88a1a860454279cded51c4c89b912f5a6e5a2155 +Author: Weblate +Date: Fri Nov 29 19:51:21 2024 +0000 - [BOT] post-merge updates + Update translation files + + Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. + + Translation: sale-workflow-17.0/sale-workflow-17.0-portal_sale_personal_data_only + Translate-URL: https://translation.odoo-community.org/projects/sale-workflow-17-0/sale-workflow-17-0-portal_sale_personal_data_only/ ## crm @@ -435,16 +430,11 @@ Date: Thu Oct 24 06:33:27 2024 +0000 ## event From [https://github.com/OCA/event.git](https://github.com/OCA/event.git) -commit ec389b670d7c7abd89c87c9d74e9348be0bb7d0c -Author: Weblate -Date: Thu Nov 21 15:52:41 2024 +0000 +commit fcac90b66e001c46718920cfcb57494ddaa83846 +Author: OCA-git-bot +Date: Tue Nov 26 08:03:55 2024 +0000 - Update translation files - - Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. - - Translation: event-17.0/event-17.0-website_event_membership_restriction - Translate-URL: https://translation.odoo-community.org/projects/event-17-0/event-17-0-website_event_membership_restriction/ + [BOT] post-merge updates ## survey @@ -481,11 +471,16 @@ Date: Tue Oct 29 12:16:43 2024 +0000 ## e-commerce From [https://github.com/OCA/e-commerce.git](https://github.com/OCA/e-commerce.git) -commit ef505774db0c744bd77bbc814bd2705ad0d84c00 -Author: OCA-git-bot -Date: Fri Nov 22 12:39:52 2024 +0000 +commit 7c72442fcb4323826960c732d72527033948eb5a +Author: Weblate +Date: Fri Nov 29 11:51:53 2024 +0000 - [BOT] post-merge updates + Update translation files + + Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. + + Translation: e-commerce-17.0/e-commerce-17.0-website_sale_require_legal + Translate-URL: https://translation.odoo-community.org/projects/e-commerce-17-0/e-commerce-17-0-website_sale_require_legal/ ## edi @@ -504,11 +499,16 @@ Date: Sat Oct 26 13:16:03 2024 +0000 ## field-service From [https://github.com/OCA/field-service.git](https://github.com/OCA/field-service.git) -commit 694d8b9ed1d16bc14886dc654a549f38f29565ee -Author: OCA-git-bot -Date: Wed Nov 6 16:49:13 2024 +0000 +commit 456378f42c1991ad4edaec8636fb46aa8b19c804 +Author: Weblate +Date: Fri Nov 29 15:51:42 2024 +0000 - [BOT] post-merge updates + Update translation files + + Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. + + Translation: field-service-17.0/field-service-17.0-fieldservice_agreement + Translate-URL: https://translation.odoo-community.org/projects/field-service-17-0/field-service-17-0-fieldservice_agreement/ ## margin-analysis @@ -572,30 +572,20 @@ Date: Wed Oct 30 19:21:51 2024 +0000 ## hr-attendance From [https://github.com/OCA/hr-attendance.git](https://github.com/OCA/hr-attendance.git) -commit 2f9a3c53d066c10a9b51e0d08a750821338c96df -Author: Víctor Martínez -Date: Wed Oct 30 07:09:52 2024 +0000 +commit 61bff915b0987a1739fa5fba12a9616838d799d5 +Author: OCA-git-bot +Date: Wed Nov 27 18:37:34 2024 +0000 - Translated using Weblate (Spanish) - - Currently translated at 100.0% (53 of 53 strings) - - Translation: hr-attendance-17.0/hr-attendance-17.0-hr_attendance_report_theoretical_time - Translate-URL: https://translation.odoo-community.org/projects/hr-attendance-17-0/hr-attendance-17-0-hr_attendance_report_theoretical_time/es/ + [BOT] post-merge updates ## hr-expense From [https://github.com/OCA/hr-expense.git](https://github.com/OCA/hr-expense.git) -commit 598eb416fd50d36661960f6c09760954488da7e6 -Author: mymage -Date: Thu Oct 3 06:53:06 2024 +0000 +commit 0bd51971fac047713aa722681fe12d2599630240 +Author: OCA-git-bot +Date: Wed Nov 27 11:25:25 2024 +0000 - Translated using Weblate (Italian) - - Currently translated at 100.0% (2 of 2 strings) - - Translation: hr-expense-17.0/hr-expense-17.0-hr_expense_employee_analytic_default - Translate-URL: https://translation.odoo-community.org/projects/hr-expense-17-0/hr-expense-17-0-hr_expense_employee_analytic_default/it/ + [BOT] post-merge updates ## hr-holidays @@ -632,16 +622,11 @@ Date: Sat Jul 6 17:22:27 2024 +0000 ## multi-company From [https://github.com/OCA/multi-company.git](https://github.com/OCA/multi-company.git) -commit 147b86a711858f7b7798bb472e256b943c885bf8 -Author: Weblate -Date: Thu Nov 21 15:52:40 2024 +0000 +commit 3c18e8809e684cdca2616b191767ff0c347e003c +Author: OCA-git-bot +Date: Thu Nov 28 11:42:31 2024 +0000 - Update translation files - - Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. - - Translation: multi-company-17.0/multi-company-17.0-product_multi_company - Translate-URL: https://translation.odoo-community.org/projects/multi-company-17-0/multi-company-17-0-product_multi_company/ + [BOT] post-merge updates ## l10n-argentina @@ -673,11 +658,11 @@ Date: Sat Jul 6 17:29:37 2024 +0000 ## l10n-belgium From [https://github.com/OCA/l10n-belgium.git](https://github.com/OCA/l10n-belgium.git) -commit cef11645cb1615d896ac09b9caed0f526185b2e5 -Author: OCA-git-bot -Date: Sat Aug 31 16:15:08 2024 +0000 +commit 8256ad7792bdf8abf865fccd4e0d0d2eacb03c71 +Author: Stéphane Bidoul +Date: Thu Nov 28 12:04:39 2024 +0100 - [BOT] post-merge updates + [FIX] remove pandoc deb ## l10n-cambodia @@ -944,16 +929,11 @@ Date: Sat Jul 6 17:35:13 2024 +0000 ## l10n-romania From [https://github.com/OCA/l10n-romania.git](https://github.com/OCA/l10n-romania.git) -commit 9dc628cffeb3cbf3024fc834aa65c5b8f1e9d9a9 -Author: Weblate -Date: Thu Nov 14 12:50:54 2024 +0000 +commit 66116335a7ff4a72c743168e6264f417e9e6a499 +Author: OCA-git-bot +Date: Thu Nov 28 21:36:54 2024 +0000 - Update translation files - - Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. - - Translation: l10n-romania-17.0/l10n-romania-17.0-l10n_ro_stock_account - Translate-URL: https://translation.odoo-community.org/projects/l10n-romania-17-0/l10n-romania-17-0-l10n_ro_stock_account/ + [BOT] post-merge updates ## l10n-russia @@ -985,11 +965,14 @@ Date: Sat Nov 23 10:42:34 2024 +0000 ## l10n-switzerland From [https://github.com/OCA/l10n-switzerland.git](https://github.com/OCA/l10n-switzerland.git) -commit 04645133223bb788d576c71badd43eae064cd968 -Author: oca-git-bot -Date: Sat Jul 6 17:37:23 2024 +0000 +commit fb02e515f89575eb89b4cd2ca8f76e1af76727b6 +Merge: 04645133 49ab08bb +Author: Thierry Ducrest +Date: Fri Nov 29 08:17:08 2024 +0100 - [IMP] update dotfiles + Merge pull request #745 from grindtildeath/17.0-fix-no_amount_qr + + [17.0][FIX] l10n_ch_qr_no_amount: Do not encode amount in QR code ## l10n-taiwan @@ -1039,9 +1022,9 @@ Date: Wed May 1 16:56:13 2024 +0000 ## l10n-usa From [https://github.com/OCA/l10n-usa.git](https://github.com/OCA/l10n-usa.git) -commit 94ad9ca3dccf9a79e2a8a8d2cfd0abcb389ed315 +commit d1cff60dd04a6871742d2d966a5d6e08ef1d209c Author: OCA-git-bot -Date: Tue Nov 19 15:43:59 2024 +0000 +Date: Fri Nov 29 14:53:27 2024 +0000 [BOT] post-merge updates @@ -1066,11 +1049,16 @@ Date: Wed May 1 16:57:14 2024 +0000 ## carrier-delivery From [https://github.com/OCA/carrier-delivery.git](https://github.com/OCA/carrier-delivery.git) -commit 8b09df54eb3775377e6e6fa6e1dc18de946eceb3 -Author: OCA-git-bot -Date: Fri Sep 20 08:21:35 2024 +0000 +commit a1cb184d288a0f94d013ea8e3f4c7866bc376270 +Author: Weblate +Date: Fri Nov 29 11:51:53 2024 +0000 - [BOT] post-merge updates + Update translation files + + Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. + + Translation: delivery-carrier-17.0/delivery-carrier-17.0-delivery_package_number + Translate-URL: https://translation.odoo-community.org/projects/delivery-carrier-17-0/delivery-carrier-17-0-delivery_package_number/ ## stock-logistics-barcode @@ -1144,16 +1132,16 @@ Date: Thu Oct 24 07:25:32 2024 +0000 ## ddmrp From [https://github.com/OCA/ddmrp.git](https://github.com/OCA/ddmrp.git) -commit 9145ad97a9fc33aca37420d4372fdd531040c471 +commit 20e50aba6d991cca36a973eac0c7e77b57f37ccf Author: mymage -Date: Mon Nov 11 11:09:08 2024 +0000 +Date: Tue Nov 26 17:35:35 2024 +0000 Translated using Weblate (Italian) - Currently translated at 100.0% (1 of 1 strings) + Currently translated at 100.0% (332 of 332 strings) - Translation: ddmrp-17.0/ddmrp-17.0-ddmrp_warning_as_job - Translate-URL: https://translation.odoo-community.org/projects/ddmrp-17-0/ddmrp-17-0-ddmrp_warning_as_job/it/ + Translation: ddmrp-17.0/ddmrp-17.0-ddmrp + Translate-URL: https://translation.odoo-community.org/projects/ddmrp-17-0/ddmrp-17-0-ddmrp/it/ ## wms @@ -1172,9 +1160,9 @@ Date: Mon Oct 14 15:55:22 2024 +0000 ## manufacture From [https://github.com/OCA/manufacture.git](https://github.com/OCA/manufacture.git) -commit aa1e505804c8b1bcbf0983cb789ae59f7226bc64 +commit 9e80ec847832f28a307f3b72d6a1a4c2155d1583 Author: OCA-git-bot -Date: Tue Nov 12 13:06:34 2024 +0000 +Date: Thu Nov 28 16:08:27 2024 +0000 [BOT] post-merge updates @@ -1190,16 +1178,16 @@ Date: Sun Aug 11 13:58:59 2024 +0200 ## management-system From [https://github.com/OCA/management-system.git](https://github.com/OCA/management-system.git) -commit e023e6f9e37c48624f455edcf4cc490883638f27 -Author: Weblate -Date: Mon Oct 14 14:51:24 2024 +0000 +commit b9dacf36f538c1b4daaed96b52406f2047526c88 +Author: jakobkrabbe +Date: Wed Nov 27 14:54:04 2024 +0000 - Update translation files + Translated using Weblate (Swedish) - Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. + Currently translated at 100.0% (120 of 120 strings) - Translation: management-system-17.0/management-system-17.0-mgmtsystem_audit - Translate-URL: https://translation.odoo-community.org/projects/management-system-17-0/management-system-17-0-mgmtsystem_audit/ + Translation: management-system-17.0/management-system-17.0-mgmtsystem_action + Translate-URL: https://translation.odoo-community.org/projects/management-system-17-0/management-system-17-0-mgmtsystem_action/sv/ ## pms @@ -1391,16 +1379,16 @@ Date: Wed May 1 17:18:12 2024 +0000 ## reporting-engine From [https://github.com/OCA/reporting-engine.git](https://github.com/OCA/reporting-engine.git) -commit d4fb306441ec6996cf1dfc46d686274f17410e2d +commit f193f8d481b771e10a9bf675bb948fe237ebdcc0 Author: mymage -Date: Mon Nov 25 08:17:28 2024 +0000 +Date: Wed Nov 27 09:52:37 2024 +0000 Translated using Weblate (Italian) - Currently translated at 100.0% (144 of 144 strings) + Currently translated at 100.0% (10 of 10 strings) - Translation: reporting-engine-17.0/reporting-engine-17.0-bi_sql_editor - Translate-URL: https://translation.odoo-community.org/projects/reporting-engine-17-0/reporting-engine-17-0-bi_sql_editor/it/ + Translation: reporting-engine-17.0/reporting-engine-17.0-report_qweb_pdf_watermark + Translate-URL: https://translation.odoo-community.org/projects/reporting-engine-17-0/reporting-engine-17-0-report_qweb_pdf_watermark/it/ ## report-print-send @@ -1469,20 +1457,25 @@ Date: Thu Aug 29 07:45:44 2024 +0000 ## server-brand From [https://github.com/OCA/server-brand.git](https://github.com/OCA/server-brand.git) -commit bdf76a9fabdc6b2c2dfbd6dd8772d920f006a995 +commit 905d131bfed43b59759352c152de2935dc62e148 Author: OCA-git-bot -Date: Mon Sep 30 13:38:17 2024 +0000 +Date: Thu Nov 28 08:35:17 2024 +0000 [BOT] post-merge updates ## server-ux From [https://github.com/OCA/server-ux.git](https://github.com/OCA/server-ux.git) -commit 7c23806b6a2491004614f394a4f73c8680054f04 -Author: OCA-git-bot -Date: Fri Oct 25 08:46:21 2024 +0000 +commit 0fe637e292f15fa83419e163f662ceea6ab436d1 +Author: mymage +Date: Tue Nov 26 17:15:56 2024 +0000 - [BOT] post-merge updates + Translated using Weblate (Italian) + + Currently translated at 100.0% (150 of 150 strings) + + Translation: server-ux-17.0/server-ux-17.0-base_tier_validation + Translate-URL: https://translation.odoo-community.org/projects/server-ux-17-0/server-ux-17-0-base_tier_validation/it/ ## community-data-files @@ -1546,9 +1539,9 @@ Date: Wed May 1 17:15:07 2024 +0000 ## vertical-association From [https://github.com/OCA/vertical-association.git](https://github.com/OCA/vertical-association.git) -commit a5dd59d6a5741149470a9c313ef0f9366c9f3ff6 +commit 9d3ea6d84fad8e171346e4d17840ad173d9ba878 Author: OCA-git-bot -Date: Mon Nov 18 08:45:42 2024 +0000 +Date: Thu Nov 28 08:38:17 2024 +0000 [BOT] post-merge updates @@ -1650,23 +1643,23 @@ Date: Wed May 1 17:36:18 2024 +0000 ## web From [https://github.com/OCA/web.git](https://github.com/OCA/web.git) -commit e27d14c5393ef5c09fcbf3c824ff09d239be5c0a +commit 520304ba5ac8066fee10b42aaea722cdffebb858 Author: Weblate -Date: Wed Nov 20 15:52:36 2024 +0000 +Date: Tue Nov 26 19:52:20 2024 +0000 Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. - Translation: web-17.0/web-17.0-web_editor_class_selector - Translate-URL: https://translation.odoo-community.org/projects/web-17-0/web-17-0-web_editor_class_selector/ + Translation: web-17.0/web-17.0-web_time_range_menu_custom + Translate-URL: https://translation.odoo-community.org/projects/web-17-0/web-17-0-web_time_range_menu_custom/ ## website From [https://github.com/OCA/website.git](https://github.com/OCA/website.git) -commit 650dbd0b986c6f2190f790c87c0a6756c179ad19 +commit ba10a009ba60e3a3b31bb8fa53fc99076cc0f0a3 Author: OCA-git-bot -Date: Thu Oct 10 10:15:17 2024 +0000 +Date: Thu Nov 28 16:04:30 2024 +0000 [BOT] post-merge updates diff --git a/account_analytic_tag/README.rst b/account_analytic_tag/README.rst index 6b03c89234..9cca43cb29 100644 --- a/account_analytic_tag/README.rst +++ b/account_analytic_tag/README.rst @@ -7,7 +7,7 @@ Account Analytic Tag !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:84763ff35b584b58efcbe8b1aab6e2d0e8e9b9c3cf6002ff655ee92313e9c899 + !! source digest: sha256:05ba5757128108b064acb3cde3157c60d2d451c38b457d38dc53a9e1b8695984 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -77,10 +77,10 @@ Authors Contributors ------------ -- `Tecnativa `__: +- `Tecnativa `__: - - Yadier Quesada - - Víctor Martínez + - Yadier Quesada + - Víctor Martínez Maintainers ----------- diff --git a/account_analytic_tag/__manifest__.py b/account_analytic_tag/__manifest__.py index bd45ff1e2f..3dd2e87c8a 100644 --- a/account_analytic_tag/__manifest__.py +++ b/account_analytic_tag/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Account Analytic Tag", - "version": "17.0.1.0.0", + "version": "17.0.1.1.0", "author": "Tecnativa, Odoo Community Association (OCA)", "category": "Account", "website": "https://github.com/OCA/account-analytic", @@ -13,6 +13,7 @@ "security/ir.model.access.csv", "views/account_analytic_line_views.xml", "views/account_analytic_tag_views.xml", + "views/account_move_line_views.xml", "views/account_move_views.xml", "views/res_config_settings_views.xml", ], diff --git a/account_analytic_tag/static/description/index.html b/account_analytic_tag/static/description/index.html index 0125e8b2f4..9de589f832 100644 --- a/account_analytic_tag/static/description/index.html +++ b/account_analytic_tag/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -366,7 +367,7 @@

Account Analytic Tag

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:84763ff35b584b58efcbe8b1aab6e2d0e8e9b9c3cf6002ff655ee92313e9c899 +!! source digest: sha256:05ba5757128108b064acb3cde3157c60d2d451c38b457d38dc53a9e1b8695984 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/account-analytic Translate me on Weblate Try me on Runboat

This module restores the account analytic tags as a method for @@ -433,7 +434,9 @@

Contributors

Maintainers

This module is maintained by the OCA.

-Odoo Community Association + +Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

diff --git a/account_analytic_tag/views/account_move_line_views.xml b/account_analytic_tag/views/account_move_line_views.xml new file mode 100644 index 0000000000..05c56f782a --- /dev/null +++ b/account_analytic_tag/views/account_move_line_views.xml @@ -0,0 +1,18 @@ + + + account.move.line.tree + account.move.line + + + + + + + + diff --git a/account_financial_report/README.rst b/account_financial_report/README.rst index 3671a17d1e..7d0431b47b 100644 --- a/account_financial_report/README.rst +++ b/account_financial_report/README.rst @@ -7,7 +7,7 @@ Account Financial Reports !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:4dd0964e1e5bccd75c7c56d0b89bd21f35a0f176bd7b9b69aaebb7db4f3bd729 + !! source digest: sha256:4d56adc35fff26b88020bebb3cd0fcb302b7c7c7483639925cfc4f9b850d8ac4 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -31,12 +31,12 @@ Account Financial Reports This module adds a set of financial reports. They are accessible under Invoicing / Reporting / OCA accounting reports. -- General ledger -- Trial Balance -- Open Items -- Aged Partner Balance -- VAT Report -- Journal Ledger +- General ledger +- Trial Balance +- Open Items +- Aged Partner Balance +- VAT Report +- Journal Ledger Currently General ledger, Trial Balance and Open Items are fully compatible with a foreign currency set up in account in order to display @@ -90,12 +90,12 @@ per company in: Known issues / Roadmap ====================== -- 'VAT Report' is valid only for cases where it's met that for each Tax - defined: all the "Account tags" of all the 'Repartition for Invoices' - or 'Repartition for Credit Notes' are different. -- It would be nice to have in reports a column indicating the state of - the entries when the option "All Entries" is selected in "Target - Moves" field in a wizard +- 'VAT Report' is valid only for cases where it's met that for each Tax + defined: all the "Account tags" of all the 'Repartition for Invoices' + or 'Repartition for Credit Notes' are different. +- It would be nice to have in reports a column indicating the state of + the entries when the option "All Entries" is selected in "Target + Moves" field in a wizard Changelog ========= @@ -103,22 +103,22 @@ Changelog 11.0.2.5.0 (2019-04-26) ----------------------- -- In the Trial Balance you have an option to hide parent hierarchy - levels +- In the Trial Balance you have an option to hide parent hierarchy + levels 11.0.2.4.1 (2019-01-08) ----------------------- -- Handle better multicompany behaviour -- Improve how title appears in the reports -- Improve performance in General Ledger +- Handle better multicompany behaviour +- Improve how title appears in the reports +- Improve performance in General Ledger 11.0.2.3.1 (2018-11-29) ----------------------- -- In the Trial Balance you can apply a filter by hierarchy levels -- In the General Ledger you can apply a filter by Analytic Tag -- In the Journal Ledger the field 'Journal' is now optional +- In the Trial Balance you can apply a filter by hierarchy levels +- In the General Ledger you can apply a filter by Analytic Tag +- In the Journal Ledger the field 'Journal' is now optional Bug Tracker =========== @@ -144,42 +144,42 @@ Authors Contributors ------------ -- Jordi Ballester -- Yannick Vaucher -- Simone Orsi -- Leonardo Pistone -- Damien Crier -- Andrea Stirpe -- Thomas Rehn -- Andrea Gallina <4everamd@gmail.com> -- Robert Rottermann -- Ciro Urselli -- Francesco Apruzzese -- Lorenzo Battistini -- Julien Coux -- Akim Juillerat -- Alexis de Lattre -- Mihai Fekete -- Miquel Ra??ch -- Joan Sisquella -- `Tecnativa `__: - - - Pedro M. Baeza - - Sergio Teruel - - Ernesto Tejeda - - Jo??o Marques - - Alexandre D. D??az - - V??ctor Mart??nez - - Carolina Fernandez - -- `Sygel `__: - - - Harald Panten - - Valentin Vinagre - -- Lois Rilo -- Saran Lim. -- Omar Casti??eira +- Jordi Ballester +- Yannick Vaucher +- Simone Orsi +- Leonardo Pistone +- Damien Crier +- Andrea Stirpe +- Thomas Rehn +- Andrea Gallina <4everamd@gmail.com> +- Robert Rottermann +- Ciro Urselli +- Francesco Apruzzese +- Lorenzo Battistini +- Julien Coux +- Akim Juillerat +- Alexis de Lattre +- Mihai Fekete +- Miquel Ra??ch +- Joan Sisquella +- `Tecnativa `__: + + - Pedro M. Baeza + - Sergio Teruel + - Ernesto Tejeda + - Jo??o Marques + - Alexandre D. D??az + - V??ctor Mart??nez + - Carolina Fernandez + +- `Sygel `__: + + - Harald Panten + - Valentin Vinagre + +- Lois Rilo +- Saran Lim. +- Omar Casti??eira Much of the work in this module was done at a sprint in Sorrento, Italy in April 2016. diff --git a/account_financial_report/__manifest__.py b/account_financial_report/__manifest__.py index 52f9eea129..2a0ffae532 100644 --- a/account_financial_report/__manifest__.py +++ b/account_financial_report/__manifest__.py @@ -6,7 +6,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { "name": "Account Financial Reports", - "version": "17.0.1.4.0", + "version": "17.0.1.5.0", "category": "Reporting", "summary": "OCA Financial Reports", "author": "Camptocamp," diff --git a/account_financial_report/report/general_ledger.py b/account_financial_report/report/general_ledger.py index a6ec3ba235..c1a2e36828 100644 --- a/account_financial_report/report/general_ledger.py +++ b/account_financial_report/report/general_ledger.py @@ -762,6 +762,7 @@ def _get_centralized_ml(self, account, date_to, grouped_by): list_centralized_ml += list(centralized_ml[jnl_id].values()) return list_centralized_ml + # flake8: noqa: C901 def _get_report_values(self, docids, data): wizard_id = data["wizard_id"] company = self.env["res.company"].browse(data["company_id"]) @@ -836,6 +837,61 @@ def _get_report_values(self, docids, data): account[grouped_by] = False del account["list_grouped"] general_ledger = sorted(general_ledger, key=lambda k: k["code"]) + # Set the bal_curr of the initial balance to 0 if it does not correspond + # (reducing the corresponding of the bal_curr of the initial balance). + for gl_item in general_ledger: + if not foreign_currency: + continue + if ( + not gl_item["currency_id"] + or gl_item["currency_id"] != company.currency_id + ): + gl_item["fin_bal"]["bal_curr"] -= gl_item["init_bal"]["bal_curr"] + gl_item["init_bal"]["bal_curr"] = 0 + if "list_grouped" in gl_item: + for lg_item in gl_item["list_grouped"]: + lg_item["fin_bal"]["bal_curr"] -= lg_item["init_bal"][ + "bal_curr" + ] + lg_item["init_bal"]["bal_curr"] = 0 + # Set the fin_bal_currency_id value if the account does not have it set + # and there are move lines in a currency different from that of + # the company (USD for example). + for gl_item in general_ledger: + fin_bal_currency_ids = [] + fin_bal_currency_id = gl_item["currency_id"] + if gl_item["currency_id"] or not foreign_currency: + continue + gl_item["fin_bal"]["bal_curr"] = gl_item["init_bal"]["bal_curr"] + if "move_lines" in gl_item: + for ml in gl_item["move_lines"]: + ml_currency_id = ( + ml["currency_id"][0] if ml["currency_id"] else False + ) + if ml_currency_id and ml_currency_id != company.currency_id.id: + gl_item["fin_bal"]["bal_curr"] += ml["bal_curr"] + if ml_currency_id not in fin_bal_currency_ids: + fin_bal_currency_ids.append(ml_currency_id) + elif "list_grouped" in gl_item: + fin_bal_currency_ids = [] + for lg_item in gl_item["list_grouped"]: + lg_item["fin_bal"]["bal_curr"] = lg_item["init_bal"]["bal_curr"] + for ml in lg_item["move_lines"]: + ml_currency_id = ( + ml["currency_id"][0] if ml["currency_id"] else False + ) + if ml_currency_id and ml_currency_id != company.currency_id.id: + lg_item["fin_bal"]["bal_curr"] += ml["bal_curr"] + gl_item["fin_bal"]["bal_curr"] += ml["bal_curr"] + if ml_currency_id not in fin_bal_currency_ids: + fin_bal_currency_ids.append(ml_currency_id) + # If there is only 1 currency, we set that one as fin_bal_currency_id + # The use of different move lines with different currencies (EUR + GBP) + # will be excluded. We use a different field to avoid showing the initial + # balance and/or distorting data. + if not gl_item["currency_id"] and len(fin_bal_currency_ids) == 1: + fin_bal_currency_id = fin_bal_currency_ids[0] + gl_item["fin_bal_currency_id"] = fin_bal_currency_id return { "doc_ids": [wizard_id], "doc_model": "general.ledger.report.wizard", diff --git a/account_financial_report/report/general_ledger_xlsx.py b/account_financial_report/report/general_ledger_xlsx.py index 39768653e1..0b7e375292 100644 --- a/account_financial_report/report/general_ledger_xlsx.py +++ b/account_financial_report/report/general_ledger_xlsx.py @@ -357,10 +357,11 @@ def _generate_report_content(self, workbook, report, data, report_data): "final_balance": account["fin_bal"]["balance"], } ) - if foreign_currency and account["currency_id"]: + if foreign_currency and account["fin_bal_currency_id"]: account.update( { - "final_bal_curr": account["fin_bal"]["bal_curr"], + "final_bal_curr": total_bal_curr, + "currency_id": account["fin_bal_currency_id"], } ) self.write_ending_balance_from_dict(account, report_data) diff --git a/account_financial_report/report/templates/general_ledger.xml b/account_financial_report/report/templates/general_ledger.xml index 24a27bde0a..ac2f1ef67a 100644 --- a/account_financial_report/report/templates/general_ledger.xml +++ b/account_financial_report/report/templates/general_ledger.xml @@ -24,7 +24,7 @@

@@ -35,9 +35,9 @@
@@ -62,7 +62,7 @@
From: - + To: - +
All posted entries @@ -381,7 +381,7 @@ view-type="form" > @@ -390,7 +390,7 @@ @@ -435,12 +435,12 @@ - +
@@ -486,13 +486,13 @@ view-type="form" > % @@ -506,7 +506,7 @@ @@ -645,9 +645,9 @@
- + - - +
Ending balance
@@ -672,21 +672,21 @@
@@ -702,10 +702,10 @@ /> - +
diff --git a/account_financial_report/static/description/index.html b/account_financial_report/static/description/index.html index 0021d8bce4..567a776dfb 100644 --- a/account_financial_report/static/description/index.html +++ b/account_financial_report/static/description/index.html @@ -367,7 +367,7 @@

Account Financial Reports

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:4dd0964e1e5bccd75c7c56d0b89bd21f35a0f176bd7b9b69aaebb7db4f3bd729 +!! source digest: sha256:4d56adc35fff26b88020bebb3cd0fcb302b7c7c7483639925cfc4f9b850d8ac4 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/account-financial-reporting Translate me on Weblate Try me on Runboat

This module adds a set of financial reports. They are accessible under diff --git a/account_invoice_inter_company/README.rst b/account_invoice_inter_company/README.rst index 1a453d6b39..90169959be 100644 --- a/account_invoice_inter_company/README.rst +++ b/account_invoice_inter_company/README.rst @@ -7,7 +7,7 @@ Inter Company Invoices !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:39d9c0262a39e4879e798c0a023f8f28ee8ac76c13a59e76f83f4bba0968a1e8 + !! source digest: sha256:397b0153f0663c7d3aa8875fdacb7a3c5661661ef03bb19394eb868d034304d3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -59,13 +59,13 @@ To customize products sharing don't hesitate to override Known issues / Roadmap ====================== - - This module cannot be fully used in combination with - remove_odoo_entreprise module. If you need both, uninstall - remove_odoo_entreprise, complete settings with - account_invoice_inter_company and then re-install - remove_odoo_entreprise. - - Product mapping: would be nice to have a matrix with the products - on the left side and on the top row the companies. + - This module cannot be fully used in combination with + remove_odoo_entreprise module. If you need both, uninstall + remove_odoo_entreprise, complete settings with + account_invoice_inter_company and then re-install + remove_odoo_entreprise. + - Product mapping: would be nice to have a matrix with the products + on the left side and on the top row the companies. Bug Tracker =========== @@ -89,26 +89,26 @@ Authors Contributors ------------ -- Odoo S.A. (original module inter_company_rules) -- Andrea Stirpe -- Adria Gil Sorribes -- Christopher Ormaza -- \`Akretion \`: +- Odoo S.A. (original module inter_company_rules) +- Andrea Stirpe +- Adria Gil Sorribes +- Christopher Ormaza +- \`Akretion \`: - - Chafique Delli - - Alexis de Lattre - - David Beal + - Chafique Delli + - Alexis de Lattre + - David Beal -- \`Tecnativa \`: +- \`Tecnativa \`: - - Jairo Llopis - - David Vidal - - Pedro M. Baeza + - Jairo Llopis + - David Vidal + - Pedro M. Baeza -- Isaac Gallart -- \`Komit \`: +- Isaac Gallart +- \`Komit \`: - - Cuong Nguyen Mtm + - Cuong Nguyen Mtm Maintainers ----------- diff --git a/account_invoice_inter_company/__manifest__.py b/account_invoice_inter_company/__manifest__.py index c01f677ec0..df42e42b3b 100644 --- a/account_invoice_inter_company/__manifest__.py +++ b/account_invoice_inter_company/__manifest__.py @@ -7,7 +7,7 @@ { "name": "Inter Company Invoices", "summary": "Intercompany invoice rules", - "version": "17.0.1.0.0", + "version": "17.0.1.0.1", "category": "Accounting & Finance", "website": "https://github.com/OCA/multi-company", "author": "Odoo SA, Akretion, Odoo Community Association (OCA)", diff --git a/account_invoice_inter_company/models/account_move.py b/account_invoice_inter_company/models/account_move.py index 32c199aa5c..8957052457 100644 --- a/account_invoice_inter_company/models/account_move.py +++ b/account_invoice_inter_company/models/account_move.py @@ -210,6 +210,7 @@ def _prepare_invoice_data(self, dest_company): "move_type": self._get_destination_invoice_type(), "partner_id": self.company_id.partner_id.id, "ref": self.name, + "payment_reference": self.payment_reference, "invoice_date": self.invoice_date, "invoice_origin": _("%(company_name)s - Invoice: %(invoice_name)s") % {"company_name": self.company_id.name, "invoice_name": self.name}, diff --git a/account_invoice_inter_company/static/description/index.html b/account_invoice_inter_company/static/description/index.html index 40fde662e0..522cb47093 100644 --- a/account_invoice_inter_company/static/description/index.html +++ b/account_invoice_inter_company/static/description/index.html @@ -367,7 +367,7 @@

Inter Company Invoices

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:39d9c0262a39e4879e798c0a023f8f28ee8ac76c13a59e76f83f4bba0968a1e8 +!! source digest: sha256:397b0153f0663c7d3aa8875fdacb7a3c5661661ef03bb19394eb868d034304d3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/multi-company Translate me on Weblate Try me on Runboat

This module is usefull if there are multiple companies in the same Odoo diff --git a/account_invoice_inter_company/tests/test_inter_company_invoice.py b/account_invoice_inter_company/tests/test_inter_company_invoice.py index 1ac704c8cf..0fbc954fab 100644 --- a/account_invoice_inter_company/tests/test_inter_company_invoice.py +++ b/account_invoice_inter_company/tests/test_inter_company_invoice.py @@ -358,6 +358,7 @@ def setUpClass(cls): ) cls.invoice_company_a.partner_id = cls.partner_company_b cls.invoice_company_a.journal_id = cls.sales_journal_company_a + cls.invoice_company_a.payment_reference = "Test Payment Ref" with cls.invoice_company_a.invoice_line_ids.new() as line_form: line_form.product_id = cls.product_consultant_multi_company @@ -419,6 +420,9 @@ def test03_confirm_invoice_and_cancel(self): invoices[0].company_id.partner_id, self.invoice_company_a.partner_id, ) + self.assertEqual( + invoices[0].payment_reference, self.invoice_company_a.payment_reference + ) self.assertEqual( len(invoices[0].invoice_line_ids), len(self.invoice_company_a.invoice_line_ids), diff --git a/account_invoice_pricelist/README.rst b/account_invoice_pricelist/README.rst index ca30c69cb5..f0a87932a0 100644 --- a/account_invoice_pricelist/README.rst +++ b/account_invoice_pricelist/README.rst @@ -7,7 +7,7 @@ Account - Pricelist on Invoices !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:30c317160b152f1735a547f560fb00c5cb2b54aee621208735160c05714b6198 + !! source digest: sha256:c90ee503f605bcc4d7018070471cf44e614b301dcb5ce38f3d976c44d32487b5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -28,17 +28,17 @@ Account - Pricelist on Invoices |badge1| |badge2| |badge3| |badge4| |badge5| -- Add a stored field pricelist on invoices, related to the partner - pricelist; -- Use this pricelist when manually adding invoice lines; -- Rules defined in pricelists applied in multicurrency context; -- Possibility to group by pricelist on account.invoice view; +- Add a stored field pricelist on invoices, related to the partner + pricelist; +- Use this pricelist when manually adding invoice lines; +- Rules defined in pricelists applied in multicurrency context; +- Possibility to group by pricelist on account.invoice view; |image| For further information, please visit: -- https://www.odoo.com/forum/help-1 +- https://www.odoo.com/forum/help-1 .. |image| image:: https://raw.githubusercontent.com/OCA/account-invoicing/17.0/account_invoice_pricelist/static/src/description/screenshot_group_by.png @@ -70,16 +70,16 @@ Authors Contributors ------------ -- Sylvain LE GAL (https://twitter.com/legalsylvain) -- Holger Brunn -- Sergio Teruel -- Raphaël Valyi -- Alberto Martín -- Nikul Chaudhary -- Manuel Regidor -- `APSL-Nagarro `__: +- Sylvain LE GAL (https://twitter.com/legalsylvain) +- Holger Brunn +- Sergio Teruel +- Raphaël Valyi +- Alberto Martín +- Nikul Chaudhary +- Manuel Regidor +- `APSL-Nagarro `__: - - Antoni Marroig + - Antoni Marroig Maintainers ----------- diff --git a/account_invoice_pricelist/__manifest__.py b/account_invoice_pricelist/__manifest__.py index b30a7cf640..c198a279d9 100644 --- a/account_invoice_pricelist/__manifest__.py +++ b/account_invoice_pricelist/__manifest__.py @@ -2,7 +2,7 @@ { "name": "Account - Pricelist on Invoices", - "version": "17.0.1.0.0", + "version": "17.0.1.0.1", "summary": "Add partner pricelist on invoices", "category": "Accounting & Finance", "author": "GRAP," "Therp BV," "Tecnativa," "Odoo Community Association (OCA)", diff --git a/account_invoice_pricelist/models/account_move.py b/account_invoice_pricelist/models/account_move.py index 8b4ce031fb..37ea1de88e 100644 --- a/account_invoice_pricelist/models/account_move.py +++ b/account_invoice_pricelist/models/account_move.py @@ -103,7 +103,7 @@ def _get_price_with_pricelist(self): self.tax_ids, self.company_id, ) - self.with_context(check_move_validity=False).discount = 0.0 + self._set_discount(0.0) return price_unit else: rule_id = self.env["product.pricelist.item"].browse(rule_id) @@ -123,7 +123,13 @@ def _get_price_with_pricelist(self): currency=self.currency_id, ) price_unit = max(base_price, final_price) - self.with_context( - check_move_validity=False - ).discount = self._calculate_discount(base_price, final_price) + self._set_discount(self._calculate_discount(base_price, final_price)) return price_unit + + def _set_discount(self, amount): + if self.env["account.move.line"]._fields.get("discount1", False): + # OCA/account_invoice_triple_discount is installed + fname = "discount1" + else: + fname = "discount" + self.with_context(check_move_validity=False)[fname] = amount diff --git a/account_invoice_pricelist/static/description/index.html b/account_invoice_pricelist/static/description/index.html index e66896a762..a54bf80d0d 100644 --- a/account_invoice_pricelist/static/description/index.html +++ b/account_invoice_pricelist/static/description/index.html @@ -367,7 +367,7 @@

Account - Pricelist on Invoices

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:30c317160b152f1735a547f560fb00c5cb2b54aee621208735160c05714b6198 +!! source digest: sha256:c90ee503f605bcc4d7018070471cf44e614b301dcb5ce38f3d976c44d32487b5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/account-invoicing Translate me on Weblate Try me on Runboat

    diff --git a/account_payment_order/README.rst b/account_payment_order/README.rst index 34cc1a9bcf..1d069b7687 100644 --- a/account_payment_order/README.rst +++ b/account_payment_order/README.rst @@ -7,7 +7,7 @@ Account Payment Order !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:538d2bc60a44af9190831089f5148760ed2c62fa7ac20cc53cdfe766d34e118a + !! source digest: sha256:04a6c00f26b7c500ad0a135829a5fc5a02a38da19178d944b39ffc4ba559f37a !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png @@ -40,9 +40,9 @@ Installation This module depends on: -- account_payment_partner -- base_iban -- document +- account_payment_partner +- base_iban +- document This modules is part of the OCA/bank-payment suite. @@ -91,40 +91,40 @@ Authors Contributors ------------ -- Stéphane Bidoul -- Alexis de Lattre -- Adrien Peiffer -- Stefan Rijnhart -- Laurent Mignon -- Alexandre Fayolle -- Danimar Ribeiro -- Erwin van der Ploeg -- Raphaël Valyi -- Sandy Carter -- Angel Moya -- Jose María Alzaga -- Meyomesse Gilles -- Denis Roussel -- `DynApps `__: +- Stéphane Bidoul +- Alexis de Lattre +- Adrien Peiffer +- Stefan Rijnhart +- Laurent Mignon +- Alexandre Fayolle +- Danimar Ribeiro +- Erwin van der Ploeg +- Raphaël Valyi +- Sandy Carter +- Angel Moya +- Jose María Alzaga +- Meyomesse Gilles +- Denis Roussel +- `DynApps `__: - - Raf Ven + - Raf Ven -- Andrea Stirpe -- `Jarsa `__: +- Andrea Stirpe +- `Jarsa `__: - - Alan Ramos + - Alan Ramos -- `Tecnativa `__: +- `Tecnativa `__: - - Pedro M. Baeza - - Carlos Dauden - - Carlos Roca + - Pedro M. Baeza + - Carlos Dauden + - Carlos Roca -- `Open Source Integrators `__: +- `Open Source Integrators `__: - - Ammar Officewala + - Ammar Officewala -- Marçal Isern +- Marçal Isern Maintainers ----------- diff --git a/account_payment_order/__manifest__.py b/account_payment_order/__manifest__.py index 94cc2aad37..a62f2b10de 100644 --- a/account_payment_order/__manifest__.py +++ b/account_payment_order/__manifest__.py @@ -9,7 +9,7 @@ { "name": "Account Payment Order", - "version": "17.0.1.6.0", + "version": "17.0.1.6.1", "license": "AGPL-3", "author": "ACSONE SA/NV, " "Therp BV, " diff --git a/account_payment_order/models/account_move.py b/account_payment_order/models/account_move.py index 5882aa85d2..9defc09f26 100644 --- a/account_payment_order/models/account_move.py +++ b/account_payment_order/models/account_move.py @@ -78,19 +78,17 @@ def _get_payment_order_communication_full(self): reference_moves |= self.reversal_move_id # Retrieve partial payments - e.g.: manual credit notes ( + # List of triplets + # (account.partial.reconcile record, amount, account.move.line record) invoice_partials, - exchange_diff_moves, + # List of account.move IDs + exchange_diff_move_ids, ) = self._get_reconciled_invoices_partials() - for ( - _x, - _y, - payment_move_line, - ) in invoice_partials + exchange_diff_moves: - payment_move = payment_move_line.move_id - if payment_move not in reference_moves: - references.append( - payment_move._get_payment_order_communication_direct() - ) + move_ids = [x[2].move_id.id for x in invoice_partials] + exchange_diff_move_ids + for move in self.browse(move_ids): + if move not in reference_moves: + references.append(move._get_payment_order_communication_direct()) + reference_moves |= move # Add references to communication from lines move if references: communication += " " + " ".join(references) diff --git a/account_payment_order/static/description/index.html b/account_payment_order/static/description/index.html index 575720265a..ea9aacb148 100644 --- a/account_payment_order/static/description/index.html +++ b/account_payment_order/static/description/index.html @@ -367,7 +367,7 @@

    Account Payment Order

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:538d2bc60a44af9190831089f5148760ed2c62fa7ac20cc53cdfe766d34e118a +!! source digest: sha256:04a6c00f26b7c500ad0a135829a5fc5a02a38da19178d944b39ffc4ba559f37a !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

    Mature License: AGPL-3 OCA/bank-payment Translate me on Weblate Try me on Runboat

    This module adds support for payment orders and debit orders.

    diff --git a/account_reconcile_oca/README.rst b/account_reconcile_oca/README.rst index 3cd12a4a24..f88661ea3a 100644 --- a/account_reconcile_oca/README.rst +++ b/account_reconcile_oca/README.rst @@ -7,7 +7,7 @@ Account Reconcile Oca !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:dcb5036258ed1a909c8df332f82e015b39a2d10c5a2a55d2f19dfe1917062e1d + !! source digest: sha256:9fb38104058260a10bc5e76b62ed9adb6fcc4b1d1c6ec5e5cd4182f3fcbac19b !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -57,7 +57,7 @@ Known issues / Roadmap The following bugs are already detected: -- Creation of activities on the chatter do show automatically +- Creation of activities on the chatter do show automatically Bug Tracker =========== @@ -81,7 +81,7 @@ Authors Contributors ------------ -- Enric Tobella +- Enric Tobella Maintainers ----------- diff --git a/account_reconcile_oca/__manifest__.py b/account_reconcile_oca/__manifest__.py index 1951568e3d..39a54a8dab 100644 --- a/account_reconcile_oca/__manifest__.py +++ b/account_reconcile_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Account Reconcile Oca", "summary": """ Reconcile addons for Odoo CE accounting""", - "version": "17.0.1.3.5", + "version": "17.0.1.4.0", "license": "AGPL-3", "author": "CreuBlanca,Dixmit,Odoo Community Association (OCA)", "maintainers": ["etobella"], diff --git a/account_reconcile_oca/models/account_bank_statement.py b/account_reconcile_oca/models/account_bank_statement.py index 19b9bec166..8ad1c39428 100644 --- a/account_reconcile_oca/models/account_bank_statement.py +++ b/account_reconcile_oca/models/account_bank_statement.py @@ -1,6 +1,7 @@ # Copyright 2024 Dixmit # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import models +from odoo.tools.safe_eval import safe_eval class AccountBankStatement(models.Model): @@ -13,3 +14,17 @@ def action_open_statement(self): ) action["res_id"] = self.id return action + + def action_open_statement_lines(self): + """Open in reconciling view directly""" + self.ensure_one() + if not self: + return {} + action = self.env["ir.actions.act_window"]._for_xml_id( + "account_reconcile_oca.action_bank_statement_line_reconcile" + ) + action["domain"] = [("statement_id", "=", self.id)] + action["context"] = safe_eval( + action["context"], locals_dict={"active_id": self._context.get("active_id")} + ) + return action diff --git a/account_reconcile_oca/models/account_bank_statement_line.py b/account_reconcile_oca/models/account_bank_statement_line.py index 4fff3d7f9e..eb8eee7203 100644 --- a/account_reconcile_oca/models/account_bank_statement_line.py +++ b/account_reconcile_oca/models/account_bank_statement_line.py @@ -282,6 +282,46 @@ def _check_line_changed(self, line): != line.get("partner_id") ) + def _get_manual_delete_vals(self): + return { + "manual_reference": False, + "manual_account_id": False, + "manual_amount": False, + "manual_exchange_counterpart": False, + "manual_in_currency_id": False, + "manual_in_currency": False, + "manual_name": False, + "manual_partner_id": False, + "manual_line_id": False, + "manual_move_id": False, + "manual_move_type": False, + "manual_kind": False, + "manual_original_amount": False, + "manual_currency_id": False, + "analytic_distribution": False, + } + + def _process_manual_reconcile_from_line(self, line): + self.manual_account_id = line["account_id"][0] + self.manual_amount = line["amount"] + self.manual_currency_id = line["currency_id"] + self.manual_in_currency_id = line.get("line_currency_id") + self.manual_in_currency = line.get("line_currency_id") and line[ + "currency_id" + ] != line.get("line_currency_id") + self.manual_amount_in_currency = line.get("currency_amount") + self.manual_name = line["name"] + self.manual_exchange_counterpart = line.get("is_exchange_counterpart", False) + self.manual_partner_id = line.get("partner_id") and line["partner_id"][0] + manual_line = self.env["account.move.line"].browse(line["id"]).exists() + self.manual_line_id = manual_line + self.analytic_distribution = line.get("analytic_distribution", {}) + if self.manual_line_id: + self.manual_move_id = self.manual_line_id.move_id + self.manual_move_type = self.manual_line_id.move_id.move_type + self.manual_kind = line["kind"] + self.manual_original_amount = line.get("original_amount", 0.0) + @api.onchange("manual_reference", "manual_delete") def _onchange_manual_reconcile_reference(self): self.ensure_one() @@ -302,53 +342,10 @@ def _onchange_manual_reconcile_reference(self): continue if line["reference"] == self.manual_reference: if self.manual_delete: - self.update( - { - "manual_reference": False, - "manual_account_id": False, - "manual_amount": False, - "manual_exchange_counterpart": False, - "manual_in_currency_id": False, - "manual_in_currency": False, - "manual_name": False, - "manual_partner_id": False, - "manual_line_id": False, - "manual_move_id": False, - "manual_move_type": False, - "manual_kind": False, - "manual_original_amount": False, - "manual_currency_id": False, - "analytic_distribution": False, - "manual_amount_in_currency": False, - } - ) + self.update(self._get_manual_delete_vals()) continue else: - self.manual_account_id = line["account_id"][0] - self.manual_amount = line["amount"] - self.manual_currency_id = line["currency_id"] - self.manual_in_currency_id = line.get("line_currency_id") - self.manual_in_currency = line.get("line_currency_id") and line[ - "currency_id" - ] != line.get("line_currency_id") - self.manual_amount_in_currency = line.get("currency_amount") - self.manual_name = line["name"] - self.manual_exchange_counterpart = line.get( - "is_exchange_counterpart", False - ) - self.manual_partner_id = ( - line.get("partner_id") and line["partner_id"][0] - ) - manual_line = ( - self.env["account.move.line"].browse(line["id"]).exists() - ) - self.manual_line_id = manual_line - self.analytic_distribution = line.get("analytic_distribution", {}) - if self.manual_line_id: - self.manual_move_id = self.manual_line_id.move_id - self.manual_move_type = self.manual_line_id.move_id.move_type - self.manual_kind = line["kind"] - self.manual_original_amount = line.get("original_amount", 0.0) + self._process_manual_reconcile_from_line(line) new_data.append(line) self.update({"manual_delete": False}) self.reconcile_data_info = self._recompute_suspense_line( @@ -369,6 +366,26 @@ def _onchange_manual_amount_in_currency(self): ) self._onchange_manual_reconcile_vals() + def _get_manual_reconcile_vals(self): + return { + "name": self.manual_name, + "partner_id": ( + self.manual_partner_id + and [self.manual_partner_id.id, self.manual_partner_id.display_name] + or (self.partner_name and (False, self.partner_name)) + or False + ), + "account_id": ( + [self.manual_account_id.id, self.manual_account_id.display_name] + if self.manual_account_id + else [False, _("Undefined")] + ), + "amount": self.manual_amount, + "credit": -self.manual_amount if self.manual_amount < 0 else 0.0, + "debit": self.manual_amount if self.manual_amount > 0 else 0.0, + "analytic_distribution": self.analytic_distribution, + } + @api.onchange( "manual_account_id", "manual_partner_id", @@ -383,35 +400,11 @@ def _onchange_manual_reconcile_vals(self): for line in data: if line["reference"] == self.manual_reference: if self._check_line_changed(line): - line.update( - { - "name": self.manual_name, - "partner_id": self.manual_partner_id - and [ - self.manual_partner_id.id, - self.manual_partner_id.display_name, - ] - or (self.partner_name and (False, self.partner_name)) - or False, - "account_id": [ - self.manual_account_id.id, - self.manual_account_id.display_name, - ] - if self.manual_account_id - else [False, _("Undefined")], - "amount": self.manual_amount, - "credit": -self.manual_amount - if self.manual_amount < 0 - else 0.0, - "debit": self.manual_amount - if self.manual_amount > 0 - else 0.0, - "analytic_distribution": self.analytic_distribution, - "kind": line["kind"] - if line["kind"] != "suspense" - else "other", - } + line_vals = self._get_manual_reconcile_vals() + line_vals["kind"] = ( + line["kind"] if line["kind"] != "suspense" else "other" ) + line.update(line_vals) if line["kind"] == "liquidity": self._update_move_partner() if self.manual_line_id and self.manual_line_id.id == line.get( diff --git a/account_reconcile_oca/static/description/index.html b/account_reconcile_oca/static/description/index.html index ea452d4015..d41768ea8c 100644 --- a/account_reconcile_oca/static/description/index.html +++ b/account_reconcile_oca/static/description/index.html @@ -367,7 +367,7 @@

    Account Reconcile Oca

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:dcb5036258ed1a909c8df332f82e015b39a2d10c5a2a55d2f19dfe1917062e1d +!! source digest: sha256:9fb38104058260a10bc5e76b62ed9adb6fcc4b1d1c6ec5e5cd4182f3fcbac19b !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

    Beta License: AGPL-3 OCA/account-reconcile Translate me on Weblate Try me on Runboat

    This addon allows to reconcile bank statements and account marked as diff --git a/account_reconcile_oca/static/src/scss/reconcile.scss b/account_reconcile_oca/static/src/scss/reconcile.scss index b430a1045c..c89632b5e0 100644 --- a/account_reconcile_oca/static/src/scss/reconcile.scss +++ b/account_reconcile_oca/static/src/scss/reconcile.scss @@ -11,6 +11,10 @@ opacity: 100; } } + .row { + // We need to add this in order to make remove horizontal scroll + margin: 0; + } margin: 0 0 0; min-width: fit-content; width: 100%; @@ -36,10 +40,12 @@ padding: 0; position: relative; border-right: 1px solid $o-gray-300; + overflow: auto; } .o_account_reconcile_oca_info { width: 70%; height: 100%; + overflow: auto; } .o_form_view { .o_form_statusbar.o_account_reconcile_oca_statusbar { diff --git a/account_reconcile_oca/views/account_bank_statement.xml b/account_reconcile_oca/views/account_bank_statement.xml index ac615d7f53..4f4af4a391 100644 --- a/account_reconcile_oca/views/account_bank_statement.xml +++ b/account_reconcile_oca/views/account_bank_statement.xml @@ -31,7 +31,22 @@ - + + account.bank.statement + + + + object + action_open_statement_lines + + + Edit Bank Statement account.bank.statement diff --git a/account_statement_base/README.rst b/account_statement_base/README.rst index 4b9b0354cd..b70bcc01fa 100644 --- a/account_statement_base/README.rst +++ b/account_statement_base/README.rst @@ -7,7 +7,7 @@ Bank Statement Base !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:b28cc8436e78d6e68d64f641d0edaafd28156fa93323635d72e98b03d52c29bf + !! source digest: sha256:d60e10ba742d1451f396681ed9a3b0adb0943800c293cdca508b719df09d6405 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png @@ -58,18 +58,18 @@ Authors Contributors ------------ -- `Akretion `__: +- `Akretion `__: - - Alexis de Lattre + - Alexis de Lattre -- `Tecnativa `__: +- `Tecnativa `__: - - Carlos Dauden - - Sergio Teruel + - Carlos Dauden + - Sergio Teruel -- `ForgeFlow `__: +- `ForgeFlow `__: - - Jordi Ballester + - Jordi Ballester Maintainers ----------- diff --git a/account_statement_base/__manifest__.py b/account_statement_base/__manifest__.py index 17c7bc6cc2..229232edbc 100644 --- a/account_statement_base/__manifest__.py +++ b/account_statement_base/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Bank Statement Base", - "version": "17.0.1.4.0", + "version": "17.0.1.4.1", "category": "Accounting", "license": "LGPL-3", "summary": "Base module for Bank Statements", diff --git a/account_statement_base/models/account_bank_statement.py b/account_statement_base/models/account_bank_statement.py index f41e90f167..1b292f8b53 100644 --- a/account_statement_base/models/account_bank_statement.py +++ b/account_statement_base/models/account_bank_statement.py @@ -4,25 +4,6 @@ class AccountBankStatement(models.Model): _inherit = "account.bank.statement" - # TODO: Delete if merged https://github.com/odoo/odoo/pull/182497 - def _compute_date_index(self): - """The super() method does not take into account lines that do not have - internal_index set yet, and causes sorted() to fail, we need to re-define - the method in these cases to avoid the error. - """ - _self = self - for stmt in self: - if any(not line.internal_index for line in stmt.line_ids): - _self -= stmt - sorted_lines = stmt.line_ids.filtered("internal_index").sorted( - "internal_index" - ) - stmt.first_line_index = sorted_lines[:1].internal_index - stmt.date = sorted_lines.filtered(lambda line: line.state == "posted")[ - -1: - ].date - return super(AccountBankStatement, _self)._compute_date_index() - def action_open_statement_lines(self): self.ensure_one() if not self: diff --git a/account_statement_base/models/account_bank_statement_line.py b/account_statement_base/models/account_bank_statement_line.py index 4199a73fd2..857619b91b 100644 --- a/account_statement_base/models/account_bank_statement_line.py +++ b/account_statement_base/models/account_bank_statement_line.py @@ -7,13 +7,6 @@ class AccountBankStatementLine(models.Model): _inherit = "account.bank.statement.line" - # TODO: Delete if merged https://github.com/odoo/odoo/pull/182497 - def _compute_running_balance(self): - # We need to set value to all records because super() does not do it using sql. - for item in self: - item.running_balance = item.running_balance - return super()._compute_running_balance() - def action_open_journal_entry(self): self.ensure_one() if not self: diff --git a/account_statement_base/static/description/index.html b/account_statement_base/static/description/index.html index 6859e56c59..10ccf93073 100644 --- a/account_statement_base/static/description/index.html +++ b/account_statement_base/static/description/index.html @@ -367,7 +367,7 @@

    Bank Statement Base

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:b28cc8436e78d6e68d64f641d0edaafd28156fa93323635d72e98b03d52c29bf +!! source digest: sha256:d60e10ba742d1451f396681ed9a3b0adb0943800c293cdca508b719df09d6405 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

    Mature License: LGPL-3 OCA/account-reconcile Translate me on Weblate Try me on Runboat

    This is a technical module that adds the views of the Bank Statement diff --git a/base_tier_validation/README.rst b/base_tier_validation/README.rst index fd4c43df05..76c440e713 100644 --- a/base_tier_validation/README.rst +++ b/base_tier_validation/README.rst @@ -7,7 +7,7 @@ Base Tier Validation !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:1d286dc389232f0cc60fd6012ae72c5eaf918284c9e7ef73da914cd6691cf822 + !! source digest: sha256:9d45fb0cb0dd64489508d2963bbd948c59b466f16618469b6e86e3d606511aeb !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png @@ -66,16 +66,16 @@ To configure this module, you need to: **Note:** -- If check *Notify Reviewers on Creation*, all possible reviewers will - be notified by email when this definition is triggered. -- If check *Notify reviewers on reaching pending* if you want to send a - notification when pending status is reached. This is usefull in a - approve by sequence scenario to only notify reviewers when it is - their turn in the sequence. -- If check *Comment*, reviewers can comment after click Validate or - Reject. -- If check *Approve by sequence*, reviewers is forced to review by - specified sequence. +- If check *Notify Reviewers on Creation*, all possible reviewers will + be notified by email when this definition is triggered. +- If check *Notify reviewers on reaching pending* if you want to send a + notification when pending status is reached. This is usefull in a + approve by sequence scenario to only notify reviewers when it is their + turn in the sequence. +- If check *Comment*, reviewers can comment after click Validate or + Reject. +- If check *Approve by sequence*, reviewers is forced to review by + specified sequence. To configure Tier Validation Exceptions, you need to: @@ -90,16 +90,14 @@ To configure Tier Validation Exceptions, you need to: **Note:** -- If you don't create any exception, the Validated record will be - readonly and cannot be modified. -- If check *Write under Validation*, records will be able to be - modified only in the defined fields when the Validation process is - ongoing. -- If check *Write after Validation*, records will be able to be - modified only in the defined fields when the Validation process is - finished. -- If check *Write after Validation* and *Write under Validation*, - records will be able to be modified defined fields always. +- If you don't create any exception, the Validated record will be + readonly and cannot be modified. +- If check *Write under Validation*, records will be able to be modified + only in the defined fields when the Validation process is ongoing. +- If check *Write after Validation*, records will be able to be modified + only in the defined fields when the Validation process is finished. +- If check *Write after Validation* and *Write under Validation*, + records will be able to be modified defined fields always. Known issues / Roadmap ====================== @@ -107,25 +105,25 @@ Known issues / Roadmap This is the list of known issues for this module. Any proposal for improvement will be very valuable. -- **Issue:** +- **Issue:** - When using approve_sequence option in any tier.definition there can - be inconsistencies in the systray notifications. + When using approve_sequence option in any tier.definition there can be + inconsistencies in the systray notifications. - **Description:** + **Description:** - Field can_review in tier.review is used to filter out, in the systray - notifications, the reviews a user can approve. This can_review field - is updated **in the database** in method review_user_count, this can - make it very inconsistent for databases with a lot of users and - recurring updates that can change the expected behavior. + Field can_review in tier.review is used to filter out, in the systray + notifications, the reviews a user can approve. This can_review field + is updated **in the database** in method review_user_count, this can + make it very inconsistent for databases with a lot of users and + recurring updates that can change the expected behavior. -- **Migration to 15.0:** +- **Migration to 15.0:** - The parameter \_tier_validation_manual_config will become False, on - 14.0, the default value is True, as the change is applied after the - migration. In order to use the new behavior we need to modify the - value on our expected model. + The parameter \_tier_validation_manual_config will become False, on + 14.0, the default value is True, as the change is applied after the + migration. In order to use the new behavior we need to modify the + value on our expected model. Changelog ========= @@ -147,69 +145,69 @@ Migrated to Odoo 14. Fixes: -- When using approve_sequence option in any tier.definition there can - be inconsistencies in the systray notifications -- When using approve_sequence, still not approve only the needed - sequence, but also other sequence for the same approver +- When using approve_sequence option in any tier.definition there can be + inconsistencies in the systray notifications +- When using approve_sequence, still not approve only the needed + sequence, but also other sequence for the same approver 12.0.3.3.1 (2019-12-02) ----------------------- Fixes: -- Show comment on Reviews Table. -- Edit notification with approve_sequence. +- Show comment on Reviews Table. +- Edit notification with approve_sequence. 12.0.3.3.0 (2019-11-27) ----------------------- New features: -- Add comment on Reviews Table. -- Approve by sequence. +- Add comment on Reviews Table. +- Approve by sequence. 12.0.3.2.1 (2019-11-26) ----------------------- Fixes: -- Remove message_subscribe_users +- Remove message_subscribe_users 12.0.3.2.0 (2019-11-25) ----------------------- New features: -- Notify reviewers +- Notify reviewers 12.0.3.1.0 (2019-07-08) ----------------------- Fixes: -- Singleton error +- Singleton error 12.0.3.0.0 (2019-12-02) ----------------------- Fixes: -- Edit Reviews Table +- Edit Reviews Table 12.0.2.1.0 (2019-05-29) ----------------------- Fixes: -- Edit drop-down style width and position +- Edit drop-down style width and position 12.0.2.0.0 (2019-05-28) ----------------------- New features: -- Pass parameters as functions. -- Add Systray. +- Pass parameters as functions. +- Add Systray. 12.0.1.0.0 (2019-02-18) ----------------------- @@ -252,24 +250,24 @@ Authors Contributors ------------ -- Lois Rilo -- Naglis Jonaitis -- Adrià Gil Sorribes -- Pimolnat Suntian -- Pedro Gonzalez -- Kitti U. -- Saran Lim. -- Carlos Lopez -- Javier Colmeiro -- bosd -- Evan Soh -- Manuel Regidor -- Eduardo de Miguel -- `XCG Consulting `__: - - - Houzéfa Abbasbhay - -- Stefan Rijnhart +- Lois Rilo +- Naglis Jonaitis +- Adrià Gil Sorribes +- Pimolnat Suntian +- Pedro Gonzalez +- Kitti U. +- Saran Lim. +- Carlos Lopez +- Javier Colmeiro +- bosd +- Evan Soh +- Manuel Regidor +- Eduardo de Miguel +- `XCG Consulting `__: + + - Houzéfa Abbasbhay + +- Stefan Rijnhart Maintainers ----------- diff --git a/base_tier_validation/__manifest__.py b/base_tier_validation/__manifest__.py index 00f1be7bc2..6cb0c87ea5 100644 --- a/base_tier_validation/__manifest__.py +++ b/base_tier_validation/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Tier Validation", "summary": "Implement a validation process based on tiers.", - "version": "17.0.2.2.1", + "version": "17.0.2.3.0", "development_status": "Mature", "maintainers": ["LoisRForgeFlow"], "category": "Tools", @@ -14,6 +14,7 @@ "installable": True, "depends": ["mail"], "data": [ + "data/cron_data.xml", "data/mail_data.xml", "security/ir.model.access.csv", "security/tier_validation_security.xml", diff --git a/base_tier_validation/data/cron_data.xml b/base_tier_validation/data/cron_data.xml new file mode 100644 index 0000000000..09f776af74 --- /dev/null +++ b/base_tier_validation/data/cron_data.xml @@ -0,0 +1,17 @@ + + + + Send Tier Review Reminder + 1 + days + -1 + + + + model._cron_send_review_reminder() + code + + diff --git a/base_tier_validation/data/mail_data.xml b/base_tier_validation/data/mail_data.xml index 8207bc4c77..fc155345ce 100644 --- a/base_tier_validation/data/mail_data.xml +++ b/base_tier_validation/data/mail_data.xml @@ -40,4 +40,22 @@ + + Tier Validation Reminder + + + + + + Tier Validation Reminder + fa-bell + diff --git a/base_tier_validation/i18n/base_tier_validation.pot b/base_tier_validation/i18n/base_tier_validation.pot index bfd6432569..f666046238 100644 --- a/base_tier_validation/i18n/base_tier_validation.pot +++ b/base_tier_validation/i18n/base_tier_validation.pot @@ -56,6 +56,13 @@ msgstr "" msgid "A record to be reviewed has been created by %s." msgstr "" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." +msgstr "" + #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -115,6 +122,11 @@ msgstr "" msgid "All" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids msgid "Allowed groups to use this Tier Validation Exception" @@ -395,6 +407,11 @@ msgstr "" msgid "It's in the validation process" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -490,6 +507,13 @@ msgstr "" msgid "Notify Reviewers on reaching Pending" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -627,6 +651,16 @@ msgstr "" msgid "Reviews" msgstr "" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 @@ -674,7 +708,8 @@ msgstr "" #: code:addons/base_tier_validation/models/tier_validation.py:0 #, python-format msgid "" -"This action needs to be validated for at least one record. \n" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" "Please request a validation." msgstr "" @@ -733,6 +768,12 @@ msgstr "" msgid "Tier Validation Rejected Notification" msgstr "" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" diff --git a/base_tier_validation/i18n/es.po b/base_tier_validation/i18n/es.po index d6e4a5e0ec..a201adb4e0 100644 --- a/base_tier_validation/i18n/es.po +++ b/base_tier_validation/i18n/es.po @@ -71,6 +71,13 @@ msgstr "" msgid "A record to be reviewed has been created by %s." msgstr "Un registro a revisar ha sido creado por %s." +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." +msgstr "" + #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -130,6 +137,11 @@ msgstr "Actividades" msgid "All" msgstr "Todos" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids msgid "Allowed groups to use this Tier Validation Exception" @@ -426,6 +438,11 @@ msgstr "" msgid "It's in the validation process" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -521,6 +538,13 @@ msgstr "Notificar a los Revisores al Reiniciar" msgid "Notify Reviewers on reaching Pending" msgstr "Notificar a los Revisores sobre la recepción de Pendientes" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -660,6 +684,16 @@ msgstr "Revisores" msgid "Reviews" msgstr "Revisiones" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 @@ -707,11 +741,10 @@ msgstr "Este %s necesita ser validado" #: code:addons/base_tier_validation/models/tier_validation.py:0 #, python-format msgid "" -"This action needs to be validated for at least one record. \n" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" "Please request a validation." msgstr "" -"Esta acción necesita ser validada para algún registro.\n" -"Por favor, solicita una validación." #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence @@ -768,6 +801,12 @@ msgstr "" msgid "Tier Validation Rejected Notification" msgstr "Validación de nivel Notificación rechazada" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -925,6 +964,14 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "ej. Validación de Nivel por..." +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "Esta acción necesita ser validada para algún registro.\n" +#~ "Por favor, solicita una validación." + #, python-format #~ msgid "The operation is under validation." #~ msgstr "Esta operación está en proceso de validación." diff --git a/base_tier_validation/i18n/es_MX.po b/base_tier_validation/i18n/es_MX.po index 89c2c751bf..cd9eb19384 100644 --- a/base_tier_validation/i18n/es_MX.po +++ b/base_tier_validation/i18n/es_MX.po @@ -59,6 +59,13 @@ msgstr "" msgid "A record to be reviewed has been created by %s." msgstr "" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." +msgstr "" + #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -119,6 +126,11 @@ msgstr "" msgid "All" msgstr "Todos" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids msgid "Allowed groups to use this Tier Validation Exception" @@ -403,6 +415,11 @@ msgstr "" msgid "It's in the validation process" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -498,6 +515,13 @@ msgstr "" msgid "Notify Reviewers on reaching Pending" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -635,6 +659,16 @@ msgstr "Revisores" msgid "Reviews" msgstr "Comentarios" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 @@ -682,11 +716,10 @@ msgstr "" #: code:addons/base_tier_validation/models/tier_validation.py:0 #, python-format msgid "" -"This action needs to be validated for at least one record. \n" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" "Please request a validation." msgstr "" -"Esta acción debe validarse para al menos un registro.\n" -"Solicite una validación." #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence @@ -743,6 +776,12 @@ msgstr "" msgid "Tier Validation Rejected Notification" msgstr "Notificación de rechazo de validación de nivel" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -900,6 +939,14 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "p.ej. Validación de nivel para ..." +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "Esta acción debe validarse para al menos un registro.\n" +#~ "Solicite una validación." + #, python-format #~ msgid "The operation is under validation." #~ msgstr "La operación está en proceso de validación." diff --git a/base_tier_validation/i18n/fr.po b/base_tier_validation/i18n/fr.po index 2156807597..ac8f9d6319 100644 --- a/base_tier_validation/i18n/fr.po +++ b/base_tier_validation/i18n/fr.po @@ -59,6 +59,13 @@ msgstr "" msgid "A record to be reviewed has been created by %s." msgstr "" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." +msgstr "" + #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -120,6 +127,11 @@ msgstr "Activité" msgid "All" msgstr "Tout" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids msgid "Allowed groups to use this Tier Validation Exception" @@ -404,6 +416,11 @@ msgstr "" msgid "It's in the validation process" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -499,6 +516,13 @@ msgstr "" msgid "Notify Reviewers on reaching Pending" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -638,6 +662,16 @@ msgstr "Réviseurs" msgid "Reviews" msgstr "Revues" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 @@ -685,11 +719,10 @@ msgstr "%s : Cet enregistrement requiert une validation" #: code:addons/base_tier_validation/models/tier_validation.py:0 #, python-format msgid "" -"This action needs to be validated for at least one record. \n" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" "Please request a validation." msgstr "" -"Cette action requiert une validation pour au moins un des enregistrements. \n" -"Veuillez demander cette validation." #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence @@ -746,6 +779,12 @@ msgstr "" msgid "Tier Validation Rejected Notification" msgstr "Validation par niveau - Notification - Rejetée" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -903,6 +942,15 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "par ex Niveau de validation pour..." +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "Cette action requiert une validation pour au moins un des " +#~ "enregistrements. \n" +#~ "Veuillez demander cette validation." + #, python-format #~ msgid "The operation is under validation." #~ msgstr "Cette opération est en cours de validation." diff --git a/base_tier_validation/i18n/it.po b/base_tier_validation/i18n/it.po index 4827c61760..7c58f7b28e 100644 --- a/base_tier_validation/i18n/it.po +++ b/base_tier_validation/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-07-29 08:58+0000\n" +"PO-Revision-Date: 2024-11-26 20:06+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -72,6 +72,13 @@ msgstr "" msgid "A record to be reviewed has been created by %s." msgstr "Un record a revisionare è stato creato da %s." +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." +msgstr "Una revisione è stata richiesta %s giorni fa." + #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -131,6 +138,11 @@ msgstr "Attività" msgid "All" msgstr "Tutto" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "Permetti scrittura ai revisori" + #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids msgid "Allowed groups to use this Tier Validation Exception" @@ -429,6 +441,11 @@ msgstr "Completamente validato" msgid "It's in the validation process" msgstr "È nel processo di validazione" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Data ultimo promemoria" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -524,6 +541,15 @@ msgstr "Notifica revisori al riavvio" msgid "Notify Reviewers on reaching Pending" msgstr "Notifica i revisori quando passa a \"In sospeso\"" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Numero di giorni dopo i quali un messaggio deve essere inviato per ricordare " +"della valutazione in attesa (0 = nessun promemoria)" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -665,6 +691,16 @@ msgstr "Revisori" msgid "Reviews" msgstr "Revisioni" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "Invia promemoria revisione livello" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Invia messaggio promemoria per le revisioni in attesa" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 @@ -712,11 +748,14 @@ msgstr "Questo %s deve essere approvato" #: code:addons/base_tier_validation/models/tier_validation.py:0 #, python-format msgid "" -"This action needs to be validated for at least one record. \n" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" "Please request a validation." msgstr "" -"Questa azione richiede di essere approvata per almeno un record.\n" -"Prego richiedere un'approvazione." +"Quest'azione deve essere approvata per almeno un record. Approvazioni in " +"sospeso:\n" +" - %s \n" +"Richiedere un'approvazione." #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence @@ -773,6 +812,12 @@ msgstr "Eccezioni validazione livello" msgid "Tier Validation Rejected Notification" msgstr "Notifica Rifiuto Livello Approvazione" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Promemoria valutazione livello" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -940,6 +985,14 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "es. Validazione livello per ..." +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "Questa azione richiede di essere approvata per almeno un record.\n" +#~ "Prego richiedere un'approvazione." + #~ msgid "Model" #~ msgstr "Modello" diff --git a/base_tier_validation/i18n/nl_NL.po b/base_tier_validation/i18n/nl_NL.po index 897344dd05..09be3c8070 100644 --- a/base_tier_validation/i18n/nl_NL.po +++ b/base_tier_validation/i18n/nl_NL.po @@ -72,6 +72,13 @@ msgstr "" msgid "A record to be reviewed has been created by %s." msgstr "Een record dat dient te worden beoordeeld, is aangemaakt door %s." +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." +msgstr "" + #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -131,6 +138,11 @@ msgstr "Activiteit" msgid "All" msgstr "Alle" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids msgid "Allowed groups to use this Tier Validation Exception" @@ -417,6 +429,11 @@ msgstr "" msgid "It's in the validation process" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -512,6 +529,13 @@ msgstr "" msgid "Notify Reviewers on reaching Pending" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -651,6 +675,16 @@ msgstr "Beoordelaars" msgid "Reviews" msgstr "Beoordelingen" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 @@ -698,11 +732,10 @@ msgstr "Dit %s dient te worden beoordeeld" #: code:addons/base_tier_validation/models/tier_validation.py:0 #, python-format msgid "" -"This action needs to be validated for at least one record. \n" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" "Please request a validation." msgstr "" -"Deze actie moet voor ten minste één record gevalideerd worden.\n" -"Vraag een validatie aan." #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence @@ -759,6 +792,12 @@ msgstr "" msgid "Tier Validation Rejected Notification" msgstr "Tier-validatie (abstract)" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -916,6 +955,14 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "bijv. Tier validatie voor..." +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "Deze actie moet voor ten minste één record gevalideerd worden.\n" +#~ "Vraag een validatie aan." + #, python-format #~ msgid "The operation is under validation." #~ msgstr "De bewerking is onder validatie." diff --git a/base_tier_validation/i18n/sv.po b/base_tier_validation/i18n/sv.po index a58a6a002f..a1511fd477 100644 --- a/base_tier_validation/i18n/sv.po +++ b/base_tier_validation/i18n/sv.po @@ -71,6 +71,13 @@ msgstr "" msgid "A record to be reviewed has been created by %s." msgstr "En post som ska granskas har skapats av %s." +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." +msgstr "" + #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -130,6 +137,11 @@ msgstr "Aktivitet" msgid "All" msgstr "Alla" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids msgid "Allowed groups to use this Tier Validation Exception" @@ -427,6 +439,11 @@ msgstr "" msgid "It's in the validation process" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -522,6 +539,13 @@ msgstr "Meddela granskare vid omstart" msgid "Notify Reviewers on reaching Pending" msgstr "Meddela granskare om att nå Pending" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -661,6 +685,16 @@ msgstr "Granskare" msgid "Reviews" msgstr "Granskningar" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 @@ -708,11 +742,10 @@ msgstr "Denna %s måste bekräftas" #: code:addons/base_tier_validation/models/tier_validation.py:0 #, python-format msgid "" -"This action needs to be validated for at least one record. \n" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" "Please request a validation." msgstr "" -"Denna åtgärd måste bekräftas för minst en post.\n" -"Vänligen begär en validering." #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence @@ -769,6 +802,12 @@ msgstr "" msgid "Tier Validation Rejected Notification" msgstr "Meddelande vid nekad attestering" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -926,6 +965,14 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "t.ex. attestvalidering för..." +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "Denna åtgärd måste bekräftas för minst en post.\n" +#~ "Vänligen begär en validering." + #, python-format #~ msgid "The operation is under validation." #~ msgstr "Åtgärden håller på att bekräftas." diff --git a/base_tier_validation/i18n/tr.po b/base_tier_validation/i18n/tr.po index 49099ee259..94092850c1 100644 --- a/base_tier_validation/i18n/tr.po +++ b/base_tier_validation/i18n/tr.po @@ -59,6 +59,13 @@ msgstr "" msgid "A record to be reviewed has been created by %s." msgstr "" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." +msgstr "" + #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -118,6 +125,11 @@ msgstr "Aktivite" msgid "All" msgstr "Bütün" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids msgid "Allowed groups to use this Tier Validation Exception" @@ -402,6 +414,11 @@ msgstr "" msgid "It's in the validation process" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -497,6 +514,13 @@ msgstr "" msgid "Notify Reviewers on reaching Pending" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -634,6 +658,16 @@ msgstr "İnceleyenler" msgid "Reviews" msgstr "İncelemeler" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 @@ -681,11 +715,10 @@ msgstr "Bu %s 'nin doğrulanması gerekiyor" #: code:addons/base_tier_validation/models/tier_validation.py:0 #, python-format msgid "" -"This action needs to be validated for at least one record. \n" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" "Please request a validation." msgstr "" -"Bu eylemin en az bir kayıt için doğrulanması gerekir.\n" -"Lütfen doğrulama isteğinde bulunun." #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence @@ -742,6 +775,12 @@ msgstr "" msgid "Tier Validation Rejected Notification" msgstr "Seviye Doğrulaması Reddedildi Bildirimi" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -899,6 +938,14 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "ör. Şunun için Seviye Doğrulaması..." +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "Bu eylemin en az bir kayıt için doğrulanması gerekir.\n" +#~ "Lütfen doğrulama isteğinde bulunun." + #, python-format #~ msgid "The operation is under validation." #~ msgstr "İşlem doğrulama aşamasındadır." diff --git a/base_tier_validation/i18n/zh_CN.po b/base_tier_validation/i18n/zh_CN.po index 43717d93ff..86cbfb3b9e 100644 --- a/base_tier_validation/i18n/zh_CN.po +++ b/base_tier_validation/i18n/zh_CN.po @@ -59,6 +59,13 @@ msgstr "" msgid "A record to be reviewed has been created by %s." msgstr "" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." +msgstr "" + #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -118,6 +125,11 @@ msgstr "" msgid "All" msgstr "所有" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids msgid "Allowed groups to use this Tier Validation Exception" @@ -398,6 +410,11 @@ msgstr "" msgid "It's in the validation process" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -493,6 +510,13 @@ msgstr "" msgid "Notify Reviewers on reaching Pending" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -630,6 +654,16 @@ msgstr "审批者" msgid "Reviews" msgstr "审批" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 @@ -677,11 +711,10 @@ msgstr "" #: code:addons/base_tier_validation/models/tier_validation.py:0 #, python-format msgid "" -"This action needs to be validated for at least one record. \n" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" "Please request a validation." msgstr "" -"此操作需要至少对一条记录进行审批。\n" -"请发起审批申请。" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence @@ -740,6 +773,12 @@ msgstr "" msgid "Tier Validation Rejected Notification" msgstr "多层级审批(抽象)" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -897,6 +936,14 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "例如:审批层级用于..." +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "此操作需要至少对一条记录进行审批。\n" +#~ "请发起审批申请。" + #, python-format #~ msgid "The operation is under validation." #~ msgstr "该操作正在审批中。" diff --git a/base_tier_validation/models/res_users.py b/base_tier_validation/models/res_users.py index ce56998341..c8e116d6a1 100644 --- a/base_tier_validation/models/res_users.py +++ b/base_tier_validation/models/res_users.py @@ -20,11 +20,13 @@ def review_user_count(self): review_groups = self.env["tier.review"].read_group(domain, ["model"], ["model"]) for review_group in review_groups: model = review_group["model"] + Model = self.env[model] reviews = self.env["tier.review"].search(review_group.get("__domain")) - if reviews: + # Skip Models not having Tier Validation enabled (example: was unistalled) + if reviews and hasattr(Model, "can_review"): records = ( - self.env[model] - .with_user(self.env.user) + Model.with_user(self.env.user) + .with_context(active_test=False) .search([("id", "in", reviews.mapped("res_id"))]) .filtered(lambda x: not x.rejected and x.can_review) ) diff --git a/base_tier_validation/models/tier_definition.py b/base_tier_validation/models/tier_definition.py index 96b6528d99..dee45f6518 100644 --- a/base_tier_validation/models/tier_definition.py +++ b/base_tier_validation/models/tier_definition.py @@ -38,6 +38,10 @@ def _get_tier_validation_model_names(self): ("field", "Field in related record"), ], ) + allow_write_for_reviewer = fields.Boolean( + string="Allow Write For Reviewers", + default=False, + ) reviewer_id = fields.Many2one(comodel_name="res.users", string="Reviewer") reviewer_group_id = fields.Many2one( comodel_name="res.groups", string="Reviewer group" @@ -90,6 +94,11 @@ def _get_tier_validation_model_names(self): "to this definition are restarted.", ) has_comment = fields.Boolean(string="Comment", default=False) + notify_reminder_delay = fields.Integer( + string="Send reminder message on pending reviews", + help="Number of days after which a message must be posted to remind about " + "pending validation (0 = no reminder)", + ) approve_sequence = fields.Boolean( string="Approve by sequence", default=False, @@ -113,3 +122,33 @@ def _compute_domain_reviewer_field(self): .sudo() .search([("model", "=", rec.model), ("relation", "=", "res.users")]) ) + + def _get_review_needing_reminder(self): + """Return all the reviews that have the reminder setup.""" + self.ensure_one() + if not self.notify_reminder_delay: + return self.env["tier.review"] + review_date = fields.Datetime.subtract( + fields.Datetime.now(), days=self.notify_reminder_delay + ) + return self.env["tier.review"].search( + [ + ("definition_id", "=", self.id), + ("status", "in", ["waiting", "pending"]), + "|", + "&", + ("create_date", "<", review_date), + ("last_reminder_date", "=", False), + ("last_reminder_date", "<", review_date), + ], + limit=1, + ) + + def _cron_send_review_reminder(self): + definition_with_reminder = self.env["tier.definition"].search( + [("notify_reminder_delay", ">", 0)] + ) + for record in definition_with_reminder: + review_to_remind = record._get_review_needing_reminder() + if review_to_remind: + review_to_remind._send_review_reminder() diff --git a/base_tier_validation/models/tier_review.py b/base_tier_validation/models/tier_review.py index 087ffdce18..054c1c225e 100644 --- a/base_tier_validation/models/tier_review.py +++ b/base_tier_validation/models/tier_review.py @@ -1,11 +1,15 @@ # Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import logging + import pytz from odoo import _, api, fields, models from odoo.exceptions import ValidationError +_logger = logging.getLogger(__name__) + class TierReview(models.Model): _name = "tier.review" @@ -65,6 +69,7 @@ class TierReview(models.Model): approve_sequence_bypass = fields.Boolean( related="definition_id.approve_sequence_bypass", readonly=True ) + last_reminder_date = fields.Datetime(readonly=True) @api.depends("status") def _compute_display_status(self): @@ -159,3 +164,38 @@ def _notify_pending_status(self, review_ids): """Method to call and reuse abstract notification method""" resource = self.env[self.model].browse(self.res_id) resource._notify_review_available(review_ids) + + def _get_reminder_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_reminder" + + def _get_reminder_activity_type(self): + return "base_tier_validation.mail_act_tier_validation_reminder" + + def _notify_review_reminder_body(self): + delay = (fields.Datetime.now() - self.create_date).days + return _("A review has been requested %s days ago.") % (delay) + + def _send_review_reminder(self): + record = self.env[self.model].browse(self.res_id) + # Only schedule activity if reviewer is a single user and model has activities + if len(self.reviewer_ids) == 1 and hasattr(record, "activity_ids"): + self._schedule_review_reminder_activity(record) + elif hasattr(record, "message_post"): + self._notify_review_reminder(record) + else: + msg = "Could not send reminder for record %s" % record + _logger.exception(msg) + self.last_reminder_date = fields.Datetime.now() + + def _notify_review_reminder(self, record): + record.message_post( + subtype_xmlid=self._get_reminder_notification_subtype(), + body=self._notify_review_reminder_body(), + ) + + def _schedule_review_reminder_activity(self, record): + record.activity_schedule( + act_type_xmlid=self._get_reminder_activity_type(), + note=self._notify_review_reminder_body(), + user_id=self.reviewer_ids.id, + ) diff --git a/base_tier_validation/models/tier_validation.py b/base_tier_validation/models/tier_validation.py index 28cfd02a74..81c948b0cc 100644 --- a/base_tier_validation/models/tier_validation.py +++ b/base_tier_validation/models/tier_validation.py @@ -128,19 +128,25 @@ def _compute_reviewer_ids(self): def _search_validated(self, operator, value): assert operator in ("=", "!="), "Invalid domain operator" assert value in (True, False), "Invalid domain value" - pos = self.search( - [(self._state_field, "in", self._state_from), ("review_ids", "!=", False)] - ).filtered(lambda r: r.validated == value) - return [("id", "in", pos.ids)] + pos = self.search([(self._state_field, "in", self._state_from)]).filtered( + lambda r: r.validated + ) + if value: + return [("id", "in", pos.ids)] + else: + return [("id", "not in", pos.ids)] @api.model def _search_rejected(self, operator, value): assert operator in ("=", "!="), "Invalid domain operator" assert value in (True, False), "Invalid domain value" - pos = self.search( - [(self._state_field, "in", self._state_from), ("review_ids", "!=", False)] - ).filtered(lambda r: r.rejected == value) - return [("id", "in", pos.ids)] + pos = self.search([(self._state_field, "in", self._state_from)]).filtered( + lambda r: r.rejected + ) + if value: + return [("id", "in", pos.ids)] + else: + return [("id", "not in", pos.ids)] @api.model def _search_reviewer_ids(self, operator, value): @@ -304,7 +310,13 @@ def _get_after_validation_exceptions(self): def _check_allow_write_under_validation(self, vals): """Allow to add exceptions for fields that are allowed to be written - even when the record is under validation.""" + or for reviewers for all fields, even when the record is under + validation.""" + if ( + all(self.review_ids.mapped("definition_id.allow_write_for_reviewer")) + and self.env.user in self.reviewer_ids + ): + return True exceptions = self._get_under_validation_exceptions() for val in vals: if val not in exceptions: @@ -341,6 +353,15 @@ def _get_fields_to_write_validation(self, vals, records_exception_function): allowed_field_names.append(fld_data["string"]) return allowed_field_names, not_allowed_field_names + def _check_tier_state_transition(self, vals): + """ + Check we are in origin state and not destination state + """ + self.ensure_one() + return getattr(self, self._state_field) in self._state_from and vals.get( + self._state_field + ) not in (self._state_to + [self._cancel_state]) + def write(self, vals): self._tier_validation_check_state_on_write(vals) self._tier_validation_check_write_allowed(vals) @@ -382,11 +403,16 @@ def _tier_validation_check_state_on_write(self, vals): reviews = rec.request_validation() rec._validate_tier(reviews) if not self._calc_reviews_validated(reviews): + pending_reviews = reviews.filtered( + lambda r: r.status == "pending" + ).mapped("name") raise ValidationError( _( "This action needs to be validated for at least " - "one record. \nPlease request a validation." + "one record. Reviews pending:\n - %s " + "\nPlease request a validation." ) + % "\n - ".join(pending_reviews) ) if rec.review_ids and not rec.validated: raise ValidationError( @@ -401,9 +427,7 @@ def _tier_validation_check_write_allowed(self, vals): # Write under validation if ( rec.review_ids - and getattr(rec, self._state_field) in self._state_from - and vals.get(self._state_field) - not in (self._state_to + [self._cancel_state]) + and rec._check_tier_state_transition(vals) and not rec._check_allow_write_under_validation(vals) and not rec._context.get("skip_validation_check") ): diff --git a/base_tier_validation/security/ir.model.access.csv b/base_tier_validation/security/ir.model.access.csv index 9e4eeb5393..d789382d34 100644 --- a/base_tier_validation/security/ir.model.access.csv +++ b/base_tier_validation/security/ir.model.access.csv @@ -5,7 +5,7 @@ access_tier_review_group_portal,access_tier_review_group_portal,model_tier_revie access_tier_definition_group_portal,access_tier_definition_group_portal,model_tier_definition,base.group_portal,1,0,0,0 access_tier_review,access.tier.review,model_tier_review,base.group_user,1,1,1,1 access_tier_definition_all,tier.definition.all,model_tier_definition,base.group_user,1,0,0,0 -access_tier_definition_settings,tier.definition.settings,model_tier_definition,base.group_system,1,1,1,1 +access_tier_definition_settings,tier.definition.settings,model_tier_definition,base.group_erp_manager,1,1,1,1 access_comment_wizard,access.comment.wizard,model_comment_wizard,base.group_user,1,1,1,1 access_tier_validation_exceptions_all,tier.validation.exceptions,model_tier_validation_exception,,1,0,0,0 access_tier_validation_exceptions_settings,tier.validation.exceptions,model_tier_validation_exception,base.group_system,1,1,1,1 diff --git a/base_tier_validation/static/description/index.html b/base_tier_validation/static/description/index.html index e2c8b72f59..54037aa0c6 100644 --- a/base_tier_validation/static/description/index.html +++ b/base_tier_validation/static/description/index.html @@ -367,7 +367,7 @@

    Base Tier Validation

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:1d286dc389232f0cc60fd6012ae72c5eaf918284c9e7ef73da914cd6691cf822 +!! source digest: sha256:9d45fb0cb0dd64489508d2963bbd948c59b466f16618469b6e86e3d606511aeb !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

    Mature License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

    Validating some operations is a common need across different areas in a @@ -433,8 +433,8 @@

    Configuration

    be notified by email when this definition is triggered.
  • If check Notify reviewers on reaching pending if you want to send a notification when pending status is reached. This is usefull in a -approve by sequence scenario to only notify reviewers when it is -their turn in the sequence.
  • +approve by sequence scenario to only notify reviewers when it is their +turn in the sequence.
  • If check Comment, reviewers can comment after click Validate or Reject.
  • If check Approve by sequence, reviewers is forced to review by @@ -455,12 +455,10 @@

    Configuration

    • If you don’t create any exception, the Validated record will be readonly and cannot be modified.
    • -
    • If check Write under Validation, records will be able to be -modified only in the defined fields when the Validation process is -ongoing.
    • -
    • If check Write after Validation, records will be able to be -modified only in the defined fields when the Validation process is -finished.
    • +
    • If check Write under Validation, records will be able to be modified +only in the defined fields when the Validation process is ongoing.
    • +
    • If check Write after Validation, records will be able to be modified +only in the defined fields when the Validation process is finished.
    • If check Write after Validation and Write under Validation, records will be able to be modified defined fields always.
    @@ -471,8 +469,8 @@

    Known issues / Roadmap

    improvement will be very valuable.

    • Issue:

      -

      When using approve_sequence option in any tier.definition there can -be inconsistencies in the systray notifications.

      +

      When using approve_sequence option in any tier.definition there can be +inconsistencies in the systray notifications.

      Description:

      Field can_review in tier.review is used to filter out, in the systray notifications, the reviews a user can approve. This can_review field @@ -504,8 +502,8 @@

      14.0.1.0.0 (2020-11-19)

      13.0.1.2.2 (2020-08-30)

      Fixes:

        -
      • When using approve_sequence option in any tier.definition there can -be inconsistencies in the systray notifications
      • +
      • When using approve_sequence option in any tier.definition there can be +inconsistencies in the systray notifications
      • When using approve_sequence, still not approve only the needed sequence, but also other sequence for the same approver
      diff --git a/base_tier_validation/tests/__init__.py b/base_tier_validation/tests/__init__.py index c5d19b1934..0cbb7c32cc 100644 --- a/base_tier_validation/tests/__init__.py +++ b/base_tier_validation/tests/__init__.py @@ -2,3 +2,4 @@ from . import common from . import test_tier_validation +from . import test_tier_validation_reminder diff --git a/base_tier_validation/tests/common.py b/base_tier_validation/tests/common.py index 0017110976..0b79deb752 100644 --- a/base_tier_validation/tests/common.py +++ b/base_tier_validation/tests/common.py @@ -96,7 +96,7 @@ def setUpClass(cls): # Create tier definitions: cls.tier_def_obj = cls.env["tier.definition"] - cls.tier_def_obj.create( + cls.tier_definition = cls.tier_def_obj.create( { "model_id": cls.tester_model.id, "review_type": "individual", diff --git a/base_tier_validation/tests/test_tier_validation.py b/base_tier_validation/tests/test_tier_validation.py index 0bb65a4f3c..660a97f8b1 100644 --- a/base_tier_validation/tests/test_tier_validation.py +++ b/base_tier_validation/tests/test_tier_validation.py @@ -999,6 +999,17 @@ def test_26_computed_state_field(self): self.assertFalse(self.test_record_computed.review_ids) self.test_record_computed.invalidate_recordset() + def test_27_allow_write_for_reviewers(self): + reviews = self.test_record.with_user(self.test_user_2.id).request_validation() + record = self.test_record.with_user(self.test_user_1.id) + record.invalidate_recordset() + with self.assertRaises(ValidationError): + record.with_user(self.test_user_1.id).write({"test_field": 0.3}) + reviews.definition_id.with_user(self.test_user_1.id).write( + {"allow_write_for_reviewer": True} + ) + record.with_user(self.test_user_1.id).write({"test_field": 0.3}) + @tagged("at_install") class TierTierValidationView(CommonTierValidation): diff --git a/base_tier_validation/tests/test_tier_validation_reminder.py b/base_tier_validation/tests/test_tier_validation_reminder.py new file mode 100644 index 0000000000..08979a58da --- /dev/null +++ b/base_tier_validation/tests/test_tier_validation_reminder.py @@ -0,0 +1,46 @@ +# Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from freezegun import freeze_time + +from odoo import fields +from odoo.tests.common import tagged + +from .common import CommonTierValidation + + +@tagged("post_install", "-at_install") +class TierTierValidation(CommonTierValidation): + def test_validation_reminder(self): + """Check the posting of reminder to reviews.""" + tier_definition = self.tier_definition + tier_definition.notify_reminder_delay = 3 + + # Request a review today + self.test_record.with_user(self.test_user_2.id).request_validation() + review = self.env["tier.review"].search( + [("definition_id", "=", tier_definition.id)] + ) + self.assertTrue(review) + self.assertEqual(review.last_reminder_date, False) + + # 2 days later no reminder should be posted + in_2_days = fields.Datetime.add(fields.Datetime.now(), days=2) + with freeze_time(in_2_days): + tier_definition._cron_send_review_reminder() + self.assertEqual(review.last_reminder_date, False) + # 4 days later first reminder + in_4_days = fields.Datetime.add(fields.Datetime.now(), days=4) + with freeze_time(in_4_days): + self.tier_definition._cron_send_review_reminder() + self.assertEqual(review.last_reminder_date, in_4_days) + # 5 days later no new reminder + in_6_days = fields.Datetime.add(fields.Datetime.now(), days=6) + with freeze_time(in_6_days): + self.tier_definition._cron_send_review_reminder() + self.assertEqual(review.last_reminder_date, in_4_days) + # 9 days later second reminder + in_9_days = fields.Datetime.add(fields.Datetime.now(), days=9) + with freeze_time(in_9_days): + self.tier_definition._cron_send_review_reminder() + self.assertEqual(review.last_reminder_date, in_9_days) diff --git a/base_tier_validation/views/tier_definition_view.xml b/base_tier_validation/views/tier_definition_view.xml index 2935f4fc9d..78d5308398 100644 --- a/base_tier_validation/views/tier_definition_view.xml +++ b/base_tier_validation/views/tier_definition_view.xml @@ -55,6 +55,7 @@ + + diff --git a/ddmrp/i18n/it.po b/ddmrp/i18n/it.po index ec4865d109..04402c2a11 100644 --- a/ddmrp/i18n/it.po +++ b/ddmrp/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-07-08 08:59+0000\n" +"PO-Revision-Date: 2024-11-26 20:06+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -308,7 +308,7 @@ msgid "" msgstr "" "Modifica l'ubicazione di inventario che è considerata nel calcolo quando un " "prodotto è a socrta o meno.\n" -" Questo potenziamente cambia il valore del lead time " +" Questo potenzialmente cambia il valore del lead time " "disaccoppiato (DLT).\n" " La modifica è solo informativa e non influisce in alcun " "processo o dimensione della scorta e raccomandazione." @@ -1834,7 +1834,7 @@ msgstr "Trasferimento" msgid "" "Transfer status changes can trigger the update of relevant buffer's NFP." msgstr "" -"La modifiche dello stato trasferimento possono attivare l'aggiornamento ddi " +"La modifiche dello stato trasferimento possono attivare l'aggiornamento di " "buffer dell' NFP rilevanti." #. module: ddmrp @@ -1871,7 +1871,7 @@ msgstr "UdM" #: model:ir.model.fields,field_description:ddmrp.field_res_company__ddmrp_auto_update_nfp #: model:ir.model.fields,field_description:ddmrp.field_res_config_settings__ddmrp_auto_update_nfp msgid "Update NFP on Stock Buffers on relevant events." -msgstr "Aggiorna NFP nei bufferi di materiale negli eventi rilevanti." +msgstr "Aggiorna NFP nei buffer di materiale negli eventi rilevanti." #. module: ddmrp #: model:ir.model.fields,field_description:ddmrp.field_res_config_settings__module_ddmrp_packaging diff --git a/delivery_package_number/README.rst b/delivery_package_number/README.rst new file mode 100644 index 0000000000..bb3a8bd380 --- /dev/null +++ b/delivery_package_number/README.rst @@ -0,0 +1,112 @@ +============================ +Stock Picking Package Number +============================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:a11704398060fb7a09c7964e7653f3c5e98d222a404dec84e8dfe64a2908985e + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github + :target: https://github.com/OCA/delivery-carrier/tree/17.0/delivery_package_number + :alt: OCA/delivery-carrier +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/delivery-carrier-17-0/delivery-carrier-17-0-delivery_package_number + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/delivery-carrier&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module recovers the number of packages field that was present in +previous versions of Odoo, that can be either be set manually by the +user, but also allows to be computed when the delivery packages flow is +used. + +This field can be used by delivery carrier extensions that need such +info to rate the shipment, print the labels, etc. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +If no delivery packages are used: + +1. Go to an open picking and click in the *Additional Info* tab. +2. In the *Delivey Information* section you'll find a **Number of + packages** field that you can edit. + +If delivey packages are used: + +1. The field will be recomputed depending on the delivery packages used + in the picking although can be edited at convenience later. + +When the picking is confirmed, the user has the chance to change the +number of packages in the confirmation wizard. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__: + + - Pedro M. Baeza + - David Vidal + - Marçal Isern + - Carlos Roca + +.. + + - `Sygel `__: + + .. + + - Ángel García de la Chica Herrera + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/delivery-carrier `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/delivery_package_number/__init__.py b/delivery_package_number/__init__.py new file mode 100644 index 0000000000..9b4296142f --- /dev/null +++ b/delivery_package_number/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizard diff --git a/delivery_package_number/__manifest__.py b/delivery_package_number/__manifest__.py new file mode 100644 index 0000000000..6679a860a3 --- /dev/null +++ b/delivery_package_number/__manifest__.py @@ -0,0 +1,22 @@ +# Copyright 2020 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Stock Picking Package Number", + "summary": "Set or compute number of packages for a picking", + "version": "17.0.1.0.0", + "category": "Delivery", + "website": "https://github.com/OCA/delivery-carrier", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "installable": True, + "application": False, + "depends": ["stock_delivery"], + "data": [ + "security/ir.model.access.csv", + "data/paperformat_data.xml", + "reports/report_package_number.xml", + "views/stock_picking_type_views.xml", + "views/stock_picking_views.xml", + "wizard/stock_number_package_validate_wiz_view.xml", + ], +} diff --git a/delivery_package_number/data/paperformat_data.xml b/delivery_package_number/data/paperformat_data.xml new file mode 100644 index 0000000000..10bea1a68a --- /dev/null +++ b/delivery_package_number/data/paperformat_data.xml @@ -0,0 +1,20 @@ + + + + + Number of package label + + custom + 100 + 50 + Portrait + 0 + 0 + 5 + 5 + + 0 + 150 + + + diff --git a/delivery_package_number/i18n/delivery_package_number.pot b/delivery_package_number/i18n/delivery_package_number.pot new file mode 100644 index 0000000000..767f6e0e32 --- /dev/null +++ b/delivery_package_number/i18n/delivery_package_number.pot @@ -0,0 +1,164 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * delivery_package_number +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \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: delivery_package_number +#: model_terms:ir.ui.view,arch_db:delivery_package_number.view_number_package_validate +msgid "Apply" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_picking__ask_number_of_packages +msgid "Ask Number Of Packages" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_backorder_confirmation +msgid "Backorder Confirmation" +msgstr "" + +#. module: delivery_package_number +#: model_terms:ir.ui.view,arch_db:delivery_package_number.view_number_package_validate +msgid "Cancel" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__create_uid +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__create_uid +msgid "Created by" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__create_date +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__create_date +msgid "Created on" +msgstr "" + +#. module: delivery_package_number +#: model:ir.actions.report,name:delivery_package_number.action_delivery_package_number_report +msgid "Delivery package number" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__display_name +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__display_name +msgid "Display Name" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_picking_type__force_set_number_of_packages +msgid "Force Set Number Of Packages" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__id +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__id +msgid "ID" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__write_uid +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__write_date +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__number_of_packages +msgid "Number Of Packages" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__number_of_packages +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_picking__number_of_packages +msgid "Number of Packages" +msgstr "" + +#. module: delivery_package_number +#: model_terms:ir.ui.view,arch_db:delivery_package_number.view_picking_type_form +msgid "Number of packages" +msgstr "" + +#. module: delivery_package_number +#: model_terms:ir.ui.view,arch_db:delivery_package_number.delivery_package_number_document +msgid "Number of packages:" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__pick_ids +msgid "Pick" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__picking_id +msgid "Picking" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_picking_type +msgid "Picking Type" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__print_package_label +msgid "Print Package Label" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_picking_type__report_number_of_packages +msgid "Report Number Of Packages" +msgstr "" + +#. module: delivery_package_number +#. odoo-python +#: code:addons/delivery_package_number/models/stock_picking.py:0 +#: model_terms:ir.ui.view,arch_db:delivery_package_number.view_number_package_validate +#, python-format +msgid "Set number of packages" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,help:delivery_package_number.field_stock_number_package_validate_wizard__number_of_packages +msgid "Set the number of packages for this picking(s)" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_number_package_validate_line_wizard +msgid "Stock Number Package Lines Wizard" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__stock_number_package_validation_line_ids +msgid "Stock Number Package Validation Line" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_picking +msgid "Transfer" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__wiz_id +msgid "Wiz" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_number_package_validate_wizard +msgid "Wizard to force set number of pickings when validate" +msgstr "" diff --git a/delivery_package_number/i18n/es.po b/delivery_package_number/i18n/es.po new file mode 100644 index 0000000000..df1e36b7b0 --- /dev/null +++ b/delivery_package_number/i18n/es.po @@ -0,0 +1,171 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * delivery_package_number +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-08-16 08:40+0000\n" +"PO-Revision-Date: 2022-08-16 10:40+0200\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"X-Generator: Poedit 2.3\n" + +#. module: delivery_package_number +#: model_terms:ir.ui.view,arch_db:delivery_package_number.view_number_package_validate +msgid "Apply" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_picking__ask_number_of_packages +msgid "Ask Number Of Packages" +msgstr "Preguntar número de Bultos" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_backorder_confirmation +msgid "Backorder Confirmation" +msgstr "" + +#. module: delivery_package_number +#: model_terms:ir.ui.view,arch_db:delivery_package_number.view_number_package_validate +msgid "Cancel" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__create_uid +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__create_uid +msgid "Created by" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__create_date +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__create_date +msgid "Created on" +msgstr "" + +#. module: delivery_package_number +#: model:ir.actions.report,name:delivery_package_number.action_delivery_package_number_report +msgid "Delivery package number" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__display_name +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__display_name +msgid "Display Name" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_picking_type__force_set_number_of_packages +msgid "Force Set Number Of Packages" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__id +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__id +msgid "ID" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__write_uid +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__write_date +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__number_of_packages +msgid "Number Of Packages" +msgstr "Número de Bultos" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__number_of_packages +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_picking__number_of_packages +msgid "Number of Packages" +msgstr "Número de Bultos" + +#. module: delivery_package_number +#: model_terms:ir.ui.view,arch_db:delivery_package_number.view_picking_type_form +msgid "Number of packages" +msgstr "" + +#. module: delivery_package_number +#: model_terms:ir.ui.view,arch_db:delivery_package_number.delivery_package_number_document +msgid "Number of packages:" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__pick_ids +msgid "Pick" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__picking_id +msgid "Picking" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_picking_type +msgid "Picking Type" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__print_package_label +msgid "Print Package Label" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_picking_type__report_number_of_packages +msgid "Report Number Of Packages" +msgstr "" + +#. module: delivery_package_number +#. odoo-python +#: code:addons/delivery_package_number/models/stock_picking.py:0 +#: model_terms:ir.ui.view,arch_db:delivery_package_number.view_number_package_validate +#, python-format +msgid "Set number of packages" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,help:delivery_package_number.field_stock_number_package_validate_wizard__number_of_packages +msgid "Set the number of packages for this picking(s)" +msgstr "Establezca el número de bultos para esto(s) albaran(es)" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_number_package_validate_line_wizard +msgid "Stock Number Package Lines Wizard" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__stock_number_package_validation_line_ids +msgid "Stock Number Package Validation Line" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_picking +msgid "Transfer" +msgstr "Albarán" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__wiz_id +msgid "Wiz" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_number_package_validate_wizard +msgid "Wizard to force set number of pickings when validate" +msgstr "" + +#~ msgid "Immediate Transfer" +#~ msgstr "Transferencia inmediata" diff --git a/delivery_package_number/i18n/sl.po b/delivery_package_number/i18n/sl.po new file mode 100644 index 0000000000..9d3abca286 --- /dev/null +++ b/delivery_package_number/i18n/sl.po @@ -0,0 +1,171 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * delivery_package_number +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-08-11 10:59+0000\n" +"Last-Translator: Matjaz Mozetic \n" +"Language-Team: none\n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3;\n" +"X-Generator: Weblate 3.10\n" + +#. module: delivery_package_number +#: model_terms:ir.ui.view,arch_db:delivery_package_number.view_number_package_validate +msgid "Apply" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_picking__ask_number_of_packages +msgid "Ask Number Of Packages" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_backorder_confirmation +msgid "Backorder Confirmation" +msgstr "" + +#. module: delivery_package_number +#: model_terms:ir.ui.view,arch_db:delivery_package_number.view_number_package_validate +msgid "Cancel" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__create_uid +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__create_uid +msgid "Created by" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__create_date +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__create_date +msgid "Created on" +msgstr "" + +#. module: delivery_package_number +#: model:ir.actions.report,name:delivery_package_number.action_delivery_package_number_report +msgid "Delivery package number" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__display_name +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__display_name +msgid "Display Name" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_picking_type__force_set_number_of_packages +msgid "Force Set Number Of Packages" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__id +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__id +msgid "ID" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__write_uid +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__write_date +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__number_of_packages +msgid "Number Of Packages" +msgstr "Število pakiranj" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__number_of_packages +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_picking__number_of_packages +msgid "Number of Packages" +msgstr "Število pakiranj" + +#. module: delivery_package_number +#: model_terms:ir.ui.view,arch_db:delivery_package_number.view_picking_type_form +msgid "Number of packages" +msgstr "" + +#. module: delivery_package_number +#: model_terms:ir.ui.view,arch_db:delivery_package_number.delivery_package_number_document +msgid "Number of packages:" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__pick_ids +msgid "Pick" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__picking_id +msgid "Picking" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_picking_type +msgid "Picking Type" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__print_package_label +msgid "Print Package Label" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_picking_type__report_number_of_packages +msgid "Report Number Of Packages" +msgstr "" + +#. module: delivery_package_number +#. odoo-python +#: code:addons/delivery_package_number/models/stock_picking.py:0 +#: model_terms:ir.ui.view,arch_db:delivery_package_number.view_number_package_validate +#, python-format +msgid "Set number of packages" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,help:delivery_package_number.field_stock_number_package_validate_wizard__number_of_packages +msgid "Set the number of packages for this picking(s)" +msgstr "Nastavi število pakiranj za te zbirnike" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_number_package_validate_line_wizard +msgid "Stock Number Package Lines Wizard" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_wizard__stock_number_package_validation_line_ids +msgid "Stock Number Package Validation Line" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_picking +msgid "Transfer" +msgstr "Premestitev" + +#. module: delivery_package_number +#: model:ir.model.fields,field_description:delivery_package_number.field_stock_number_package_validate_line_wizard__wiz_id +msgid "Wiz" +msgstr "" + +#. module: delivery_package_number +#: model:ir.model,name:delivery_package_number.model_stock_number_package_validate_wizard +msgid "Wizard to force set number of pickings when validate" +msgstr "" + +#~ msgid "Immediate Transfer" +#~ msgstr "Takojšnja premestitev" diff --git a/delivery_package_number/models/__init__.py b/delivery_package_number/models/__init__.py new file mode 100644 index 0000000000..f6db7b252c --- /dev/null +++ b/delivery_package_number/models/__init__.py @@ -0,0 +1,2 @@ +from . import stock_picking_type +from . import stock_picking diff --git a/delivery_package_number/models/stock_picking.py b/delivery_package_number/models/stock_picking.py new file mode 100644 index 0000000000..423274d8b3 --- /dev/null +++ b/delivery_package_number/models/stock_picking.py @@ -0,0 +1,74 @@ +# Copyright 2020 Tecnativa - David Vidal +# Copyright 2023 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import _, api, fields, models +from odoo.tools import config + + +class StockPicking(models.Model): + _inherit = "stock.picking" + + number_of_packages = fields.Integer( + string="Number of Packages", + compute="_compute_number_of_packages", + readonly=False, + store=True, + default=0, + copy=False, + ) + ask_number_of_packages = fields.Boolean(compute="_compute_ask_number_of_packages") + + @api.depends("package_ids") + def _compute_number_of_packages(self): + for picking in self: + if picking.package_ids: + picking.number_of_packages = len(picking.package_ids) + + def _action_generate_number_of_packages_wizard(self): + view = self.env.ref("delivery_package_number.view_number_package_validate") + return { + "name": _("Set number of packages"), + "type": "ir.actions.act_window", + "view_mode": "form", + "res_model": "stock.number.package.validate.wizard", + "views": [(view.id, "form")], + "view_id": view.id, + "target": "new", + "context": dict( + self.env.context, default_pick_ids=[(4, p.id) for p in self] + ), + } + + def _compute_ask_number_of_packages(self): + """To Know if is needed raise wizard to ask user by package number""" + for picking in self: + picking.ask_number_of_packages = bool( + picking.carrier_id + and not picking.package_ids + or picking.picking_type_id.force_set_number_of_packages + ) + + def _get_pickings_to_set_number_of_packages(self): + """Get pickings that needed raise wizard to fill number of packages""" + pickings_to_set_number_of_packages = self.browse() + for picking in self: + if not picking.number_of_packages: + pickings_to_set_number_of_packages |= picking + return pickings_to_set_number_of_packages + + def _pre_action_done_hook(self): + res = super()._pre_action_done_hook() + test_condition = not config["test_enable"] or self.env.context.get( + "test_delivery_package_number" + ) + if ( + res + and test_condition + and isinstance(res, bool) + and any(picking.ask_number_of_packages for picking in self) + and not self.env.context.get("bypass_set_number_of_packages") + ): + pickings_to_set_nop = self._get_pickings_to_set_number_of_packages() + if pickings_to_set_nop: + return pickings_to_set_nop._action_generate_number_of_packages_wizard() + return res diff --git a/delivery_package_number/models/stock_picking_type.py b/delivery_package_number/models/stock_picking_type.py new file mode 100644 index 0000000000..615cf68d46 --- /dev/null +++ b/delivery_package_number/models/stock_picking_type.py @@ -0,0 +1,16 @@ +# Copyright 2023 Tecnativa - Carlos Roca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class StockPickingType(models.Model): + _inherit = "stock.picking.type" + + force_set_number_of_packages = fields.Boolean() + report_number_of_packages = fields.Many2one( + "ir.actions.report", + default=lambda self: self.env.ref( + "delivery_package_number.action_delivery_package_number_report", + raise_if_not_found=False, + ), + ) diff --git a/delivery_package_number/pyproject.toml b/delivery_package_number/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/delivery_package_number/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/delivery_package_number/readme/CONTRIBUTORS.md b/delivery_package_number/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..d2b9e0c182 --- /dev/null +++ b/delivery_package_number/readme/CONTRIBUTORS.md @@ -0,0 +1,9 @@ +- [Tecnativa](https://www.tecnativa.com): + - Pedro M. Baeza + - David Vidal + - Marçal Isern + - Carlos Roca + +> - [Sygel](https://www.sygel.es): +> +> > - Ángel García de la Chica Herrera \<\> diff --git a/delivery_package_number/readme/DESCRIPTION.md b/delivery_package_number/readme/DESCRIPTION.md new file mode 100644 index 0000000000..4ab3733921 --- /dev/null +++ b/delivery_package_number/readme/DESCRIPTION.md @@ -0,0 +1,7 @@ +This module recovers the number of packages field that was present in +previous versions of Odoo, that can be either be set manually by the +user, but also allows to be computed when the delivery packages flow is +used. + +This field can be used by delivery carrier extensions that need such +info to rate the shipment, print the labels, etc. diff --git a/delivery_package_number/readme/USAGE.md b/delivery_package_number/readme/USAGE.md new file mode 100644 index 0000000000..866e410f6e --- /dev/null +++ b/delivery_package_number/readme/USAGE.md @@ -0,0 +1,13 @@ +If no delivery packages are used: + +1. Go to an open picking and click in the *Additional Info* tab. +2. In the *Delivey Information* section you'll find a **Number of + packages** field that you can edit. + +If delivey packages are used: + +1. The field will be recomputed depending on the delivery packages used + in the picking although can be edited at convenience later. + +When the picking is confirmed, the user has the chance to change the +number of packages in the confirmation wizard. diff --git a/delivery_package_number/reports/report_package_number.xml b/delivery_package_number/reports/report_package_number.xml new file mode 100644 index 0000000000..741a79b134 --- /dev/null +++ b/delivery_package_number/reports/report_package_number.xml @@ -0,0 +1,80 @@ + + + + + + Delivery package number + stock.picking + + qweb-pdf + delivery_package_number.delivery_package_number_report + delivery_package_number.delivery_package_number_report + + + diff --git a/delivery_package_number/security/ir.model.access.csv b/delivery_package_number/security/ir.model.access.csv new file mode 100644 index 0000000000..0b2bba6d8e --- /dev/null +++ b/delivery_package_number/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_stock_number_package_validate_wizard,access.stock.number.package.validate.wizard,model_stock_number_package_validate_wizard,stock.group_stock_user,1,1,1,0 +access_stock_number_package_validate_line_wizard,access.stock.number.package.validate.line.wizard,model_stock_number_package_validate_line_wizard,stock.group_stock_user,1,1,1,0 diff --git a/delivery_package_number/static/description/icon.png b/delivery_package_number/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/delivery_package_number/static/description/index.html b/delivery_package_number/static/description/index.html new file mode 100644 index 0000000000..82ff1af3c9 --- /dev/null +++ b/delivery_package_number/static/description/index.html @@ -0,0 +1,463 @@ + + + + + +Stock Picking Package Number + + + +
      +

      Stock Picking Package Number

      + + +

      Beta License: AGPL-3 OCA/delivery-carrier Translate me on Weblate Try me on Runboat

      +

      This module recovers the number of packages field that was present in +previous versions of Odoo, that can be either be set manually by the +user, but also allows to be computed when the delivery packages flow is +used.

      +

      This field can be used by delivery carrier extensions that need such +info to rate the shipment, print the labels, etc.

      +

      Table of contents

      + +
      +

      Usage

      +

      If no delivery packages are used:

      +
        +
      1. Go to an open picking and click in the Additional Info tab.
      2. +
      3. In the Delivey Information section you’ll find a Number of +packages field that you can edit.
      4. +
      +

      If delivey packages are used:

      +
        +
      1. The field will be recomputed depending on the delivery packages used +in the picking although can be edited at convenience later.
      2. +
      +

      When the picking is confirmed, the user has the chance to change the +number of packages in the confirmation wizard.

      +
      +
      +

      Bug Tracker

      +

      Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

      +

      Do not contact contributors directly about support or help with technical issues.

      +
      +
      +

      Credits

      +
      +

      Authors

      +
        +
      • Tecnativa
      • +
      +
      +
      +

      Contributors

      +
        +
      • Tecnativa:
          +
        • Pedro M. Baeza
        • +
        • David Vidal
        • +
        • Marçal Isern
        • +
        • Carlos Roca
        • +
        +
      • +
      + +
      + + +
      + +
      +
      +
      +
      +

      Maintainers

      +

      This module is maintained by the OCA.

      + +Odoo Community Association + +

      OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

      +

      This module is part of the OCA/delivery-carrier project on GitHub.

      +

      You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

      +
      +
      +
      + + diff --git a/delivery_package_number/tests/__init__.py b/delivery_package_number/tests/__init__.py new file mode 100644 index 0000000000..6ec07498ac --- /dev/null +++ b/delivery_package_number/tests/__init__.py @@ -0,0 +1 @@ +from . import test_delivery_package_number diff --git a/delivery_package_number/tests/test_delivery_package_number.py b/delivery_package_number/tests/test_delivery_package_number.py new file mode 100644 index 0000000000..aa1f891323 --- /dev/null +++ b/delivery_package_number/tests/test_delivery_package_number.py @@ -0,0 +1,79 @@ +# Copyright 2020 Tecnativa - David Vidal +# Copyright 2023 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo.tests import Form +from odoo.tests.common import TransactionCase + + +class TestDeliveryPackageNumber(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.product = cls.env["product.product"].create( + {"name": "Test product", "type": "product"} + ) + cls.partner = cls.env["res.partner"].create({"name": "Test partner"}) + cls.wh1 = cls.env["stock.warehouse"].create( + {"name": "TEST WH1", "code": "TST1"} + ) + cls.picking = cls.env["stock.picking"].create( + { + "location_id": cls.wh1.lot_stock_id.id, + "location_dest_id": cls.wh1.wh_output_stock_loc_id.id, + "picking_type_id": cls.wh1.int_type_id.id, + } + ) + cls.move_line_obj = cls.env["stock.move.line"] + cls.ml1 = cls.move_line_obj.create( + { + "product_id": cls.product.id, + "product_uom_id": cls.product.uom_id.id, + "quantity": 5, + "location_id": cls.wh1.lot_stock_id.id, + "location_dest_id": cls.wh1.wh_output_stock_loc_id.id, + "picking_id": cls.picking.id, + } + ) + cls.ml2 = cls.ml1.copy({"quantity": 0}) + + def test_number_of_packages(self): + # By default it's computed to 0 + self.assertEqual(self.picking.number_of_packages, 0) + # We can edit the number of packages as there aren't delivery packages + picking_form = Form(self.picking) + picking_form.number_of_packages = 3 + picking_form.save() + self.assertEqual(self.picking.number_of_packages, 3) + # We add a package and it recalculates + self.picking.action_put_in_pack() + self.assertEqual(self.picking.number_of_packages, 1) + self.ml2.quantity = 5 + self.picking.action_put_in_pack() + self.assertEqual(self.picking.number_of_packages, 2) + # We can later set it manually if we want to + picking_form.number_of_packages = 3 + picking_form.save() + self.assertEqual(self.picking.number_of_packages, 3) + + def test_backorder(self): + order_form = Form(self.env["sale.order"]) + order_form.partner_id = self.partner + with order_form.order_line.new() as line_form: + line_form.product_id = self.product + line_form.product_uom_qty = 10 + order = order_form.save() + order.action_confirm() + picking = order.picking_ids + picking.move_ids.quantity = 2 + picking.number_of_packages = 2 + action = picking.with_context( + test_delivery_package_number=True + ).button_validate() + backorder_wizard = Form( + self.env[action["res_model"]].with_context(**action["context"]) + ).save() + backorder_wizard.process() + done_picking = order.picking_ids.filtered(lambda x: x.state == "done") + new_picking = order.picking_ids - done_picking + self.assertEqual(done_picking.number_of_packages, 2) + self.assertEqual(new_picking.number_of_packages, 0) diff --git a/delivery_package_number/views/stock_picking_type_views.xml b/delivery_package_number/views/stock_picking_type_views.xml new file mode 100644 index 0000000000..88bfdcab72 --- /dev/null +++ b/delivery_package_number/views/stock_picking_type_views.xml @@ -0,0 +1,15 @@ + + + + stock.picking.type + + + + + + + + + + + diff --git a/delivery_package_number/views/stock_picking_views.xml b/delivery_package_number/views/stock_picking_views.xml new file mode 100644 index 0000000000..36d2c8e2fb --- /dev/null +++ b/delivery_package_number/views/stock_picking_views.xml @@ -0,0 +1,16 @@ + + + + stock.picking + + + + + + + + + diff --git a/delivery_package_number/wizard/__init__.py b/delivery_package_number/wizard/__init__.py new file mode 100644 index 0000000000..42886abb47 --- /dev/null +++ b/delivery_package_number/wizard/__init__.py @@ -0,0 +1,2 @@ +from . import stock_backorder_confirmation +from . import stock_number_package_validate_wiz diff --git a/delivery_package_number/wizard/stock_backorder_confirmation.py b/delivery_package_number/wizard/stock_backorder_confirmation.py new file mode 100644 index 0000000000..ea868b3f77 --- /dev/null +++ b/delivery_package_number/wizard/stock_backorder_confirmation.py @@ -0,0 +1,15 @@ +# Copyright 2023 Ángel García de la Chica Herrera +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models + + +class StockBackorderConfirmation(models.TransientModel): + _inherit = "stock.backorder.confirmation" + + def process(self): + # put context key for avoiding `base_delivery_carrier_label` + # auto-packaging feature + return super( + StockBackorderConfirmation, self.with_context(set_default_package=False) + ).process() diff --git a/delivery_package_number/wizard/stock_number_package_validate_wiz.py b/delivery_package_number/wizard/stock_number_package_validate_wiz.py new file mode 100644 index 0000000000..c97dbbbd76 --- /dev/null +++ b/delivery_package_number/wizard/stock_number_package_validate_wiz.py @@ -0,0 +1,79 @@ +# Copyright 2023 Tecnativa - Carlos Roca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class StockNumberPackageValidateWiz(models.TransientModel): + _name = "stock.number.package.validate.wizard" + _description = "Wizard to force set number of pickings when validate" + + pick_ids = fields.Many2many("stock.picking", "stock_picking_number_package_rel") + number_of_packages = fields.Integer( + help="Set the number of packages for this picking(s)", + ) + stock_number_package_validation_line_ids = fields.One2many( + comodel_name="stock.number.package.validate.line.wizard", + inverse_name="wiz_id", + compute="_compute_stock_number_package_validation_line_ids", + readonly=False, + store=True, + ) + print_package_label = fields.Boolean( + compute="_compute_print_package_label", readonly=False, store=True + ) + + @api.depends("pick_ids") + def _compute_print_package_label(self): + for item in self: + item.print_package_label = item.pick_ids.picking_type_id.print_label + + @api.depends("pick_ids") + def _compute_stock_number_package_validation_line_ids(self): + for wiz in self: + if len(wiz.pick_ids) <= 1: + wiz.stock_number_package_validation_line_ids = False + else: + wiz.stock_number_package_validation_line_ids = [ + fields.Command.create({"picking_id": picking.id}) + for picking in wiz.pick_ids + ] + + def process(self): + if self.number_of_packages: + self.pick_ids.write({"number_of_packages": self.number_of_packages}) + # put context key for avoiding `base_delivery_carrier_label` + # auto-packaging feature + self.pick_ids.with_context( + set_default_package=False, bypass_set_number_of_packages=True + ).button_validate() + if self.print_package_label: + return self._print_package_label() + + def _print_package_label(self): + """Method to be inherited by other modules and allow print the report in + the background without breaking the chain of returned values. + For example, you can use base_report_to_printer to send the report directly to + printer. + """ + report = ( + self.pick_ids.picking_type_id.report_number_of_packages + or self.env.ref( + "delivery_package_number.action_delivery_package_number_report" + ) + ) + report_action = report.report_action(self.pick_ids) + report_action.update({"close_on_report_download": True}) + return report_action + + +class StockNumberPackageValidateLineWizLine(models.TransientModel): + _name = "stock.number.package.validate.line.wizard" + _description = "Stock Number Package Lines Wizard" + + wiz_id = fields.Many2one( + comodel_name="stock.number.package.validate.wizard", readonly=True + ) + picking_id = fields.Many2one(comodel_name="stock.picking") + number_of_packages = fields.Integer( + related="picking_id.number_of_packages", readonly=False + ) diff --git a/delivery_package_number/wizard/stock_number_package_validate_wiz_view.xml b/delivery_package_number/wizard/stock_number_package_validate_wiz_view.xml new file mode 100644 index 0000000000..78f888c9c2 --- /dev/null +++ b/delivery_package_number/wizard/stock_number_package_validate_wiz_view.xml @@ -0,0 +1,44 @@ + + + + stock.number.package.validate.wizard + stock.number.package.validate.wizard + +
      + + + + + + + + + + +
      +
      + +
      +
      +
      diff --git a/fieldservice_agreement/README.rst b/fieldservice_agreement/README.rst new file mode 100644 index 0000000000..99a77e09c8 --- /dev/null +++ b/fieldservice_agreement/README.rst @@ -0,0 +1,136 @@ +========================== +Field Service - Agreements +========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:9866be5d1301479673349d10499c98b13c54b509b272b9a58a450f1aa5098d78 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ffield--service-lightgray.png?logo=github + :target: https://github.com/OCA/field-service/tree/17.0/fieldservice_agreement + :alt: OCA/field-service +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/field-service-17-0/field-service-17-0-fieldservice_agreement + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/field-service&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Odoo Agreement App does not provide an easy way to access field service +orders related to an agreement. Some organizations needs to have a quick +access to field service orders to track the performance of an agreement. + +This module allows you to link a field service order to an agreement and +adds a smart button on the agreement to look at the list of related +field service orders. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + + + +Usage +===== + +To use this module: + +- Go to Field Service > Operations > Orders +- Select or create a field service order and set the agreement +- Go to Agreement > Agreements +- Open the previous agreement +- Click on the smart button "Service Orders" to see the list of related + field service orders + +Known issues / Roadmap +====================== + + + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Open Source Integrators + +Contributors +------------ + +- Bhavesh Odedra +- Sandip Mangukiya +- Serpent Consulting Services Pvt. Ltd. +- Patrick Wilson +- Italo Lopes +- Iván Todorovich + +Other credits +------------- + +The development of this module has been financially supported by: + +- Open Source Integrators + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-max3903| image:: https://github.com/max3903.png?size=40px + :target: https://github.com/max3903 + :alt: max3903 +.. |maintainer-bodedra| image:: https://github.com/bodedra.png?size=40px + :target: https://github.com/bodedra + :alt: bodedra +.. |maintainer-smangukiya| image:: https://github.com/smangukiya.png?size=40px + :target: https://github.com/smangukiya + :alt: smangukiya +.. |maintainer-osi-scampbell| image:: https://github.com/osi-scampbell.png?size=40px + :target: https://github.com/osi-scampbell + :alt: osi-scampbell +.. |maintainer-patrickrwilson| image:: https://github.com/patrickrwilson.png?size=40px + :target: https://github.com/patrickrwilson + :alt: patrickrwilson + +Current `maintainers `__: + +|maintainer-max3903| |maintainer-bodedra| |maintainer-smangukiya| |maintainer-osi-scampbell| |maintainer-patrickrwilson| + +This module is part of the `OCA/field-service `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fieldservice_agreement/__init__.py b/fieldservice_agreement/__init__.py new file mode 100644 index 0000000000..631bd4893a --- /dev/null +++ b/fieldservice_agreement/__init__.py @@ -0,0 +1,4 @@ +# Copyright (C) 2018 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models diff --git a/fieldservice_agreement/__manifest__.py b/fieldservice_agreement/__manifest__.py new file mode 100644 index 0000000000..b2d1b0bfe9 --- /dev/null +++ b/fieldservice_agreement/__manifest__.py @@ -0,0 +1,28 @@ +# Copyright (C) 2018 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Field Service - Agreements", + "summary": "Manage Field Service agreements and contracts", + "author": "Open Source Integrators, " "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/field-service", + "category": "Field Service", + "license": "AGPL-3", + "version": "17.0.1.0.0", + "depends": ["fieldservice", "agreement"], + "data": [ + "views/fsm_order_view.xml", + "views/fsm_equipment_view.xml", + "views/agreement_view.xml", + "views/fsm_person.xml", + ], + "installable": True, + "development_status": "Beta", + "maintainers": [ + "max3903", + "bodedra", + "smangukiya", + "osi-scampbell", + "patrickrwilson", + ], +} diff --git a/fieldservice_agreement/i18n/de.po b/fieldservice_agreement/i18n/de.po new file mode 100644 index 0000000000..f63c98f064 --- /dev/null +++ b/fieldservice_agreement/i18n/de.po @@ -0,0 +1,91 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_agreement +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-11-26 17:58+0000\n" +"Last-Translator: Maria Sparenberg \n" +"Language-Team: none\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.8\n" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__equipment_count +msgid "# Equipments" +msgstr "# Equipment" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__service_order_count +msgid "# Service Orders" +msgstr "# Service-Aufträge" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_person__agreement_count +msgid "# of Agreements" +msgstr "# Vereinbarungen" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Equipments" +msgstr "Equipment" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_equipment__agreement_id +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_order__agreement_id +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_equipment_form_view +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_equipment_search_view +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_order_search_view +msgid "Agreement" +msgstr "Vereinbarung" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_person_form +msgid "Agreements" +msgstr "Vereinbarungen" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__fsm_location_id +msgid "FSM Location" +msgstr "Field-Service-Ort" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Field Service" +msgstr "Field-Service" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_equipment +msgid "Field Service Equipment" +msgstr "Service-Equipment" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_order +msgid "Field Service Order" +msgstr "Field-Service-Auftrag" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_person +msgid "Field Service Worker" +msgstr "Service-Mitarbeiter" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Service Orders" +msgstr "Service-Aufträge" + +#~ msgid "Field Service Location" +#~ msgstr "Field-Service-Ort" + +#~ msgid "Service Profile" +#~ msgstr "Service-Profil" + +#~ msgid "Service Profiles" +#~ msgstr "Service-Profile" diff --git a/fieldservice_agreement/i18n/es.po b/fieldservice_agreement/i18n/es.po new file mode 100644 index 0000000000..701310dd18 --- /dev/null +++ b/fieldservice_agreement/i18n/es.po @@ -0,0 +1,91 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_agreement +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-03-25 17:13+0000\n" +"Last-Translator: Nelson Ramírez Sánchez \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__equipment_count +msgid "# Equipments" +msgstr "# de Equipos" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__service_order_count +msgid "# Service Orders" +msgstr "# Ordenes de Servicio" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_person__agreement_count +msgid "# of Agreements" +msgstr "# de Acuerdos" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Equipments" +msgstr "Equipos" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_equipment__agreement_id +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_order__agreement_id +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_equipment_form_view +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_equipment_search_view +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_order_search_view +msgid "Agreement" +msgstr "Acuerdo" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_person_form +msgid "Agreements" +msgstr "Acuerdos" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__fsm_location_id +msgid "FSM Location" +msgstr "Ubicación SC" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Field Service" +msgstr "Servicio de Campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_equipment +msgid "Field Service Equipment" +msgstr "Equipo de Servicio de Campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_order +msgid "Field Service Order" +msgstr "Pedido de Servicio de Campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_person +msgid "Field Service Worker" +msgstr "Trabajador de Servicio de Campo" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Service Orders" +msgstr "Ordenes de Servicio" + +#~ msgid "Field Service Location" +#~ msgstr "Ubicación de Servicio de Campo" + +#~ msgid "Service Profile" +#~ msgstr "Perfil de Servicio" + +#~ msgid "Service Profiles" +#~ msgstr "Perfiles de Servicio" diff --git a/fieldservice_agreement/i18n/es_AR.po b/fieldservice_agreement/i18n/es_AR.po new file mode 100644 index 0000000000..65c8265ac3 --- /dev/null +++ b/fieldservice_agreement/i18n/es_AR.po @@ -0,0 +1,103 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_agreement +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-10-29 04:36+0000\n" +"Last-Translator: Ignacio Buioli \n" +"Language-Team: none\n" +"Language: es_AR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__equipment_count +msgid "# Equipments" +msgstr "# Equipos" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__service_order_count +msgid "# Service Orders" +msgstr "# Pedidos de Servicio" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_person__agreement_count +msgid "# of Agreements" +msgstr "# de Acuerdos" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Equipments" +msgstr "Equipos" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_equipment__agreement_id +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_order__agreement_id +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_equipment_form_view +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_equipment_search_view +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_order_search_view +msgid "Agreement" +msgstr "Acuerdo" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_person_form +msgid "Agreements" +msgstr "Acuerdos" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__fsm_location_id +msgid "FSM Location" +msgstr "Ubicación del FSM" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Field Service" +msgstr "Servicio de Campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_equipment +msgid "Field Service Equipment" +msgstr "Equipo del Servicio de Campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_order +msgid "Field Service Order" +msgstr "Pedido de Servicio de Campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_person +msgid "Field Service Worker" +msgstr "Trabajador de Servicio de Campo" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Service Orders" +msgstr "Pedidos de Servicio" + +#~ msgid "Display Name" +#~ msgstr "Mostrar Nombre" + +#~ msgid "Field Service Location" +#~ msgstr "Ubicación del Servicio de Campo" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificación el" + +#~ msgid "Order" +#~ msgstr "Pedido" + +#~ msgid "Service Profile" +#~ msgstr "Perfil del Servicio" + +#~ msgid "Service Profiles" +#~ msgstr "Perfiles de Servicio" diff --git a/fieldservice_agreement/i18n/es_CL.po b/fieldservice_agreement/i18n/es_CL.po new file mode 100644 index 0000000000..63b34931b6 --- /dev/null +++ b/fieldservice_agreement/i18n/es_CL.po @@ -0,0 +1,91 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_agreement +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-11-21 20:35+0000\n" +"Last-Translator: Nelson Ramírez Sánchez \n" +"Language-Team: none\n" +"Language: es_CL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.8\n" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__equipment_count +msgid "# Equipments" +msgstr "# de Equipos" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__service_order_count +msgid "# Service Orders" +msgstr "# Ordenes de Servicio" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_person__agreement_count +msgid "# of Agreements" +msgstr "# de Acuerdos" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Equipments" +msgstr "Equipos" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_equipment__agreement_id +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_order__agreement_id +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_equipment_form_view +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_equipment_search_view +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_order_search_view +msgid "Agreement" +msgstr "Acuerdo" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_person_form +msgid "Agreements" +msgstr "Acuerdos" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__fsm_location_id +msgid "FSM Location" +msgstr "Ubicación FSM" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Field Service" +msgstr "Servicio de Campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_equipment +msgid "Field Service Equipment" +msgstr "Equipo de Servicio de Campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_order +msgid "Field Service Order" +msgstr "Orden de Servicio de Campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_person +msgid "Field Service Worker" +msgstr "Trabajador de Servicio de Campo" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Service Orders" +msgstr "Ordenes de Servicio" + +#~ msgid "Field Service Location" +#~ msgstr "Ubicación de Servicio de Campo" + +#~ msgid "Service Profile" +#~ msgstr "Perfil de Servicio" + +#~ msgid "Service Profiles" +#~ msgstr "Perfiles de Servicio" diff --git a/fieldservice_agreement/i18n/fieldservice_agreement.pot b/fieldservice_agreement/i18n/fieldservice_agreement.pot new file mode 100644 index 0000000000..8903d23827 --- /dev/null +++ b/fieldservice_agreement/i18n/fieldservice_agreement.pot @@ -0,0 +1,79 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_agreement +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \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: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__equipment_count +msgid "# Equipments" +msgstr "" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__service_order_count +msgid "# Service Orders" +msgstr "" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_person__agreement_count +msgid "# of Agreements" +msgstr "" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Equipments" +msgstr "" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_equipment__agreement_id +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_order__agreement_id +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_equipment_form_view +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_equipment_search_view +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_order_search_view +msgid "Agreement" +msgstr "" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_person_form +msgid "Agreements" +msgstr "" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__fsm_location_id +msgid "FSM Location" +msgstr "" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Field Service" +msgstr "" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_equipment +msgid "Field Service Equipment" +msgstr "" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_order +msgid "Field Service Order" +msgstr "" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_person +msgid "Field Service Worker" +msgstr "" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Service Orders" +msgstr "" diff --git a/fieldservice_agreement/i18n/it.po b/fieldservice_agreement/i18n/it.po new file mode 100644 index 0000000000..54283cf586 --- /dev/null +++ b/fieldservice_agreement/i18n/it.po @@ -0,0 +1,103 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_agreement +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2022-10-27 08:43+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.14.1\n" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__equipment_count +msgid "# Equipments" +msgstr "N° attrezzature" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__service_order_count +msgid "# Service Orders" +msgstr "N° ordini di servizio" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_person__agreement_count +msgid "# of Agreements" +msgstr "N° di accordi" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Equipments" +msgstr "Attrezzature" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_equipment__agreement_id +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_order__agreement_id +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_equipment_form_view +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_equipment_search_view +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_order_search_view +msgid "Agreement" +msgstr "Accordo" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_person_form +msgid "Agreements" +msgstr "Accordi" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__fsm_location_id +msgid "FSM Location" +msgstr "Località FSM" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Field Service" +msgstr "Assistenza sul campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_equipment +msgid "Field Service Equipment" +msgstr "Attrezzatura assistenza sul campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_order +msgid "Field Service Order" +msgstr "Ordine assistenza sul campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_person +msgid "Field Service Worker" +msgstr "Lavoratore assistenza sul campo" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Service Orders" +msgstr "Ordini di servizio" + +#~ msgid "Display Name" +#~ msgstr "Nome visualizzato" + +#~ msgid "Field Service Location" +#~ msgstr "Località assistenza sul campo" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" + +#~ msgid "Order" +#~ msgstr "Ordine" + +#~ msgid "Service Profile" +#~ msgstr "Profilo servizio" + +#~ msgid "Service Profiles" +#~ msgstr "Profili servizio" diff --git a/fieldservice_agreement/i18n/pt_BR.po b/fieldservice_agreement/i18n/pt_BR.po new file mode 100644 index 0000000000..8af0737bc8 --- /dev/null +++ b/fieldservice_agreement/i18n/pt_BR.po @@ -0,0 +1,91 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_agreement +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-06-17 22:19+0000\n" +"Last-Translator: Fernando Colus \n" +"Language-Team: none\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__equipment_count +msgid "# Equipments" +msgstr "# Equipamentos" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__service_order_count +msgid "# Service Orders" +msgstr "# Ordens de Serviço" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_person__agreement_count +msgid "# of Agreements" +msgstr "# de Contratos" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Equipments" +msgstr "Equipamentos" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_equipment__agreement_id +#: model:ir.model.fields,field_description:fieldservice_agreement.field_fsm_order__agreement_id +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_equipment_form_view +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_equipment_search_view +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_order_search_view +msgid "Agreement" +msgstr "Acordo" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.fsm_person_form +msgid "Agreements" +msgstr "Acordos" + +#. module: fieldservice_agreement +#: model:ir.model.fields,field_description:fieldservice_agreement.field_agreement__fsm_location_id +msgid "FSM Location" +msgstr "Localização do FSM" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Field Service" +msgstr "Serviço de Campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_equipment +msgid "Field Service Equipment" +msgstr "Equipamento Usados em Serviços de Campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_order +msgid "Field Service Order" +msgstr "Pedido de Serviço de Campo" + +#. module: fieldservice_agreement +#: model:ir.model,name:fieldservice_agreement.model_fsm_person +msgid "Field Service Worker" +msgstr "Trabalhador de Serviço de Campo" + +#. module: fieldservice_agreement +#: model_terms:ir.ui.view,arch_db:fieldservice_agreement.agreement_form +msgid "Service Orders" +msgstr "Ordens de Serviço" + +#~ msgid "Field Service Location" +#~ msgstr "Localização do Serviço de Campo" + +#~ msgid "Service Profile" +#~ msgstr "Perfil de Serviço" + +#~ msgid "Service Profiles" +#~ msgstr "Perfis de Serviço" diff --git a/fieldservice_agreement/models/__init__.py b/fieldservice_agreement/models/__init__.py new file mode 100644 index 0000000000..d5a0db88f6 --- /dev/null +++ b/fieldservice_agreement/models/__init__.py @@ -0,0 +1,6 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import agreement +from . import fsm_equipment +from . import fsm_order +from . import fsm_person diff --git a/fieldservice_agreement/models/agreement.py b/fieldservice_agreement/models/agreement.py new file mode 100644 index 0000000000..edd6e90dce --- /dev/null +++ b/fieldservice_agreement/models/agreement.py @@ -0,0 +1,62 @@ +# Copyright (C) 2018 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class Agreement(models.Model): + _inherit = "agreement" + + service_order_count = fields.Integer( + compute="_compute_service_order_count", string="# Service Orders" + ) + equipment_count = fields.Integer("# Equipments", compute="_compute_equipment_count") + fsm_location_id = fields.Many2one("fsm.location", string="FSM Location") + + def _compute_service_order_count(self): + data = self.env["fsm.order"]._read_group( + [("agreement_id", "in", self.ids)], + ["agreement_id"], + ["__count"], + ) + counts = {rec.id: count for rec, count in data} + for rec in self: + rec.service_order_count = counts.get(rec.id, 0) + + def _compute_equipment_count(self): + data = self.env["fsm.equipment"]._read_group( + [("agreement_id", "in", self.ids)], + ["agreement_id"], + ["__count"], + ) + counts = {rec.id: count for rec, count in data} + for rec in self: + rec.equipment_count = counts.get(rec.id, 0) + + def action_view_service_order(self): + action = self.env["ir.actions.act_window"]._for_xml_id( + "fieldservice.action_fsm_operation_order" + ) + orders = self.env["fsm.order"].search([("agreement_id", "in", self.ids)]) + if len(orders) == 1: + action["views"] = [(self.env.ref("fieldservice.fsm_order_form").id, "form")] + action["res_id"] = orders.id + else: + action["domain"] = [("id", "in", orders.ids)] + return action + + def action_view_fsm_equipment(self): + action = self.env["ir.actions.act_window"]._for_xml_id( + "fieldservice.action_fsm_equipment" + ) + equipments = self.env["fsm.equipment"].search( + [("agreement_id", "in", self.ids)] + ) + if len(equipments) == 1: + action["views"] = [ + (self.env.ref("fieldservice.fsm_equipment_form_view").id, "form") + ] + action["res_id"] = equipments.id + else: + action["domain"] = [("id", "in", equipments.ids)] + return action diff --git a/fieldservice_agreement/models/fsm_equipment.py b/fieldservice_agreement/models/fsm_equipment.py new file mode 100644 index 0000000000..8ff8d7f374 --- /dev/null +++ b/fieldservice_agreement/models/fsm_equipment.py @@ -0,0 +1,10 @@ +# Copyright (C) 2018 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class FSMEquipment(models.Model): + _inherit = "fsm.equipment" + + agreement_id = fields.Many2one("agreement", string="Agreement") diff --git a/fieldservice_agreement/models/fsm_order.py b/fieldservice_agreement/models/fsm_order.py new file mode 100644 index 0000000000..1138f20ce4 --- /dev/null +++ b/fieldservice_agreement/models/fsm_order.py @@ -0,0 +1,10 @@ +# Copyright (C) 2018 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class FSMOrder(models.Model): + _inherit = "fsm.order" + + agreement_id = fields.Many2one("agreement", string="Agreement") diff --git a/fieldservice_agreement/models/fsm_person.py b/fieldservice_agreement/models/fsm_person.py new file mode 100644 index 0000000000..3182bd1d17 --- /dev/null +++ b/fieldservice_agreement/models/fsm_person.py @@ -0,0 +1,37 @@ +# Copyright (C) 2019 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class FSMPerson(models.Model): + _inherit = "fsm.person" + + agreement_count = fields.Integer( + string="# of Agreements", + compute="_compute_agreement_count", + ) + + def _compute_agreement_count(self): + data = self.env["agreement"]._read_group( + [("partner_id", "in", self.partner_id.ids)], + ["partner_id"], + ["__count"], + ) + counts = {rec.id: count for rec, count in data} + for rec in self: + rec.agreement_count = counts.get(rec.partner_id.id, 0) + + def action_view_agreements(self): + action = self.env["ir.actions.act_window"]._for_xml_id( + "agreement.agreement_action" + ) + records = self.env["agreement"].search( + [("partner_id", "in", self.partner_id.ids)] + ) + if len(records) == 1: + action["views"] = [(self.env.ref("agreement.agreement_form").id, "form")] + action["res_id"] = records.id + else: + action["domain"] = [("id", "in", records.ids)] + return action diff --git a/fieldservice_agreement/pyproject.toml b/fieldservice_agreement/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/fieldservice_agreement/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/fieldservice_agreement/readme/CONFIGURE.md b/fieldservice_agreement/readme/CONFIGURE.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/fieldservice_agreement/readme/CONFIGURE.md @@ -0,0 +1 @@ + diff --git a/fieldservice_agreement/readme/CONTRIBUTORS.md b/fieldservice_agreement/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..2cd827c901 --- /dev/null +++ b/fieldservice_agreement/readme/CONTRIBUTORS.md @@ -0,0 +1,6 @@ +- Bhavesh Odedra \<\> +- Sandip Mangukiya \<\> +- Serpent Consulting Services Pvt. Ltd. \<\> +- Patrick Wilson \<\> +- Italo Lopes \<\> +- Iván Todorovich \<\> diff --git a/fieldservice_agreement/readme/CREDITS.md b/fieldservice_agreement/readme/CREDITS.md new file mode 100644 index 0000000000..f276e4261e --- /dev/null +++ b/fieldservice_agreement/readme/CREDITS.md @@ -0,0 +1,3 @@ +The development of this module has been financially supported by: + +- Open Source Integrators diff --git a/fieldservice_agreement/readme/DESCRIPTION.md b/fieldservice_agreement/readme/DESCRIPTION.md new file mode 100644 index 0000000000..eced13c0e0 --- /dev/null +++ b/fieldservice_agreement/readme/DESCRIPTION.md @@ -0,0 +1,7 @@ +Odoo Agreement App does not provide an easy way to access field service +orders related to an agreement. Some organizations needs to have a quick +access to field service orders to track the performance of an agreement. + +This module allows you to link a field service order to an agreement and +adds a smart button on the agreement to look at the list of related +field service orders. diff --git a/fieldservice_agreement/readme/ROADMAP.md b/fieldservice_agreement/readme/ROADMAP.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/fieldservice_agreement/readme/ROADMAP.md @@ -0,0 +1 @@ + diff --git a/fieldservice_agreement/readme/USAGE.md b/fieldservice_agreement/readme/USAGE.md new file mode 100644 index 0000000000..ef70ef822f --- /dev/null +++ b/fieldservice_agreement/readme/USAGE.md @@ -0,0 +1,8 @@ +To use this module: + +- Go to Field Service \> Operations \> Orders +- Select or create a field service order and set the agreement +- Go to Agreement \> Agreements +- Open the previous agreement +- Click on the smart button "Service Orders" to see the list of related + field service orders diff --git a/fieldservice_agreement/static/description/icon.png b/fieldservice_agreement/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..955674d8f0b8c47de3ffa9db25cb109fbe4a1091 GIT binary patch literal 17808 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 literal 0 HcmV?d00001 diff --git a/fieldservice_agreement/static/description/index.html b/fieldservice_agreement/static/description/index.html new file mode 100644 index 0000000000..558e2666dd --- /dev/null +++ b/fieldservice_agreement/static/description/index.html @@ -0,0 +1,464 @@ + + + + + +Field Service - Agreements + + + +
      +

      Field Service - Agreements

      + + +

      Beta License: AGPL-3 OCA/field-service Translate me on Weblate Try me on Runboat

      +

      Odoo Agreement App does not provide an easy way to access field service +orders related to an agreement. Some organizations needs to have a quick +access to field service orders to track the performance of an agreement.

      +

      This module allows you to link a field service order to an agreement and +adds a smart button on the agreement to look at the list of related +field service orders.

      +

      Table of contents

      + + +
      +

      Usage

      +

      To use this module:

      +
        +
      • Go to Field Service > Operations > Orders
      • +
      • Select or create a field service order and set the agreement
      • +
      • Go to Agreement > Agreements
      • +
      • Open the previous agreement
      • +
      • Click on the smart button “Service Orders” to see the list of related +field service orders
      • +
      +
      + +
      +

      Bug Tracker

      +

      Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

      +

      Do not contact contributors directly about support or help with technical issues.

      +
      +
      +

      Credits

      +
      +

      Authors

      +
        +
      • Open Source Integrators
      • +
      +
      +
      +

      Contributors

      + +
      +
      +

      Other credits

      +

      The development of this module has been financially supported by:

      +
        +
      • Open Source Integrators
      • +
      +
      +
      +

      Maintainers

      +

      This module is maintained by the OCA.

      + +Odoo Community Association + +

      OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

      +

      Current maintainers:

      +

      max3903 bodedra smangukiya osi-scampbell patrickrwilson

      +

      This module is part of the OCA/field-service project on GitHub.

      +

      You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

      +
      +
      +
      + + diff --git a/fieldservice_agreement/tests/__init__.py b/fieldservice_agreement/tests/__init__.py new file mode 100644 index 0000000000..d7abc9fc1f --- /dev/null +++ b/fieldservice_agreement/tests/__init__.py @@ -0,0 +1,4 @@ +# Copyright (C) 2019 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import test_fsm_agreement diff --git a/fieldservice_agreement/tests/test_fsm_agreement.py b/fieldservice_agreement/tests/test_fsm_agreement.py new file mode 100644 index 0000000000..b9f94433bb --- /dev/null +++ b/fieldservice_agreement/tests/test_fsm_agreement.py @@ -0,0 +1,85 @@ +# Copyright (C) 2019 - TODAY, Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields +from odoo.tests.common import TransactionCase + + +class FSMOrder(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.Order = cls.env["fsm.order"] + cls.Agreement = cls.env["agreement"] + cls.Equipment = cls.env["fsm.equipment"] + cls.test_location = cls.env.ref("fieldservice.test_location") + cls.agreement_type = cls.env["agreement.type"].create( + {"name": "Test Agreement Type"} + ) + cls.test_person = cls.env.ref("fieldservice.test_person") + cls.service = cls.env.ref("product.product_product_1_product_template") + + def test_fsm_agreement(self): + """ + By create new order and equipment and link to an agreement, I expect, + - Agreement count and link to the order/equipment is corrrect + - Location's service profile display correctly + - Person (partner) can relate back to agreement correctly + """ + # Create agreement and assign to test location + agreement = self.Agreement.create( + { + "name": "Test Agreement", + "agreement_type_id": self.agreement_type.id, + "code": "TestAgreement", + "start_date": fields.Date.today(), + "end_date": fields.Date.today(), + "fsm_location_id": self.test_location.id, + "partner_id": self.test_person.partner_id.id, + } + ) + # Create 2 Orders, that link to this agreement + vals = { + "name": "Order1", + "location_id": self.test_location.id, + "agreement_id": agreement.id, + } + order1 = self.Order.create(vals) + agreement._compute_service_order_count() + self.assertEqual(agreement.service_order_count, 1) + self.assertEqual(order1.id, agreement.action_view_service_order()["res_id"]) + vals = { + "name": "Order2", + "location_id": self.test_location.id, + "agreement_id": agreement.id, + } + order2 = self.Order.create(vals) + agreement._compute_service_order_count() + self.assertEqual(agreement.service_order_count, 2) + self.assertEqual( + [order1.id, order2.id], + agreement.action_view_service_order()["domain"][0][2], + ) + # Create 3 equipment, that link to this agreement + vals = { + "name": "EQ1", + "current_location_id": self.test_location.id, + "agreement_id": agreement.id, + } + equipment1 = self.Equipment.create(vals) + agreement._compute_service_order_count() + self.assertEqual(agreement.equipment_count, 1) + self.assertEqual(equipment1.id, agreement.action_view_fsm_equipment()["res_id"]) + equipment2 = equipment1.copy({"name": "EQ2"}) + equipment3 = equipment1.copy({"name": "EQ3"}) + agreement._compute_equipment_count() + self.assertEqual(agreement.equipment_count, 3) + self.assertEqual( + [equipment1.id, equipment2.id, equipment3.id], + agreement.action_view_fsm_equipment()["domain"][0][2], + ) + # Person (partner) can relate back to agreement correctly + self.assertEqual(self.test_person.agreement_count, 1) + self.assertEqual( + self.test_person.action_view_agreements()["res_id"], agreement.id + ) diff --git a/fieldservice_agreement/views/agreement_view.xml b/fieldservice_agreement/views/agreement_view.xml new file mode 100644 index 0000000000..592bcc0847 --- /dev/null +++ b/fieldservice_agreement/views/agreement_view.xml @@ -0,0 +1,65 @@ + + + + + agreement + + +
      + + +
      + + + + + + + + + + +
      +
      + + + agreement + search + + + + + + + + +
      diff --git a/fieldservice_agreement/views/fsm_equipment_view.xml b/fieldservice_agreement/views/fsm_equipment_view.xml new file mode 100644 index 0000000000..4d4fa60471 --- /dev/null +++ b/fieldservice_agreement/views/fsm_equipment_view.xml @@ -0,0 +1,39 @@ + + + + + fsm.equipment + + + + + + + + + + + + + + + + + fsm.equipment + + + + + + + + + diff --git a/fieldservice_agreement/views/fsm_order_view.xml b/fieldservice_agreement/views/fsm_order_view.xml new file mode 100644 index 0000000000..4f05f84d23 --- /dev/null +++ b/fieldservice_agreement/views/fsm_order_view.xml @@ -0,0 +1,32 @@ + + + + + fsm.order + + + + + + + + + + fsm.order + + + + + + + + + diff --git a/fieldservice_agreement/views/fsm_person.xml b/fieldservice_agreement/views/fsm_person.xml new file mode 100644 index 0000000000..c50bec2994 --- /dev/null +++ b/fieldservice_agreement/views/fsm_person.xml @@ -0,0 +1,26 @@ + + + + + fsm.person + + +
      + +
      +
      +
      + +
      diff --git a/fieldservice_stage_validation/README.rst b/fieldservice_stage_validation/README.rst index 5d03a71cc1..6922f6970a 100644 --- a/fieldservice_stage_validation/README.rst +++ b/fieldservice_stage_validation/README.rst @@ -7,7 +7,7 @@ FSM Stage Validation !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:1ced40d5e26a6495ac55732e9d6ba749aa76729869fa24363ba8b7d8ccaa03b1 + !! source digest: sha256:7fa9a31f4e7c1c88e82c034446dde98d5561190967fd4b8274010856ad8fcc46 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -47,16 +47,16 @@ is available to be applied to each document type. Configuration ============= -- Go to Field Service > Configuration > Stages -- Create or select a stage -- Select one or more fields to be validated +- Go to Field Service > Configuration > Stages +- Create or select a stage +- Select one or more fields to be validated Usage ===== -- Follow steps outlined in Configuration. -- User will receive validation error if a field is not set when - attempting to move to a new stage. +- Follow steps outlined in Configuration. +- User will receive validation error if a field is not set when + attempting to move to a new stage. Known issues / Roadmap ====================== @@ -85,10 +85,10 @@ Authors Contributors ------------ -- Brian McMaster -- `APSL `__: +- Brian McMaster +- `APSL `__: - - Antoni Marroig + - Antoni Marroig Maintainers ----------- diff --git a/fieldservice_stage_validation/__manifest__.py b/fieldservice_stage_validation/__manifest__.py index a4414d775a..4d5dbc75e4 100644 --- a/fieldservice_stage_validation/__manifest__.py +++ b/fieldservice_stage_validation/__manifest__.py @@ -3,12 +3,15 @@ { "name": "FSM Stage Validation", "summary": "Validate input data when reaching a Field Service stage", - "version": "17.0.1.0.0", + "version": "17.0.1.1.0", "category": "Field Service", "author": "Brian McMaster, Odoo Community Association (OCA)", "website": "https://github.com/OCA/field-service", "depends": ["fieldservice"], - "data": ["views/fsm_stage.xml"], + "data": [ + "security/ir.model.access.csv", + "views/fsm_stage.xml", + ], "license": "AGPL-3", "development_status": "Beta", "maintainers": ["brian10048", "max3903"], diff --git a/fieldservice_stage_validation/models/fsm_stage.py b/fieldservice_stage_validation/models/fsm_stage.py index 5063f41880..915afe0610 100644 --- a/fieldservice_stage_validation/models/fsm_stage.py +++ b/fieldservice_stage_validation/models/fsm_stage.py @@ -11,7 +11,6 @@ class FSMStage(models.Model): string="Fields to Validate", help="Select fields which must be set on the document in this stage", ) - stage_type_model_id = fields.Many2one( "ir.model", compute="_compute_stage_model", diff --git a/fieldservice_stage_validation/models/validate_utils.py b/fieldservice_stage_validation/models/validate_utils.py index 04894793e2..309fed806c 100644 --- a/fieldservice_stage_validation/models/validate_utils.py +++ b/fieldservice_stage_validation/models/validate_utils.py @@ -8,7 +8,7 @@ def validate_stage_fields(records): for rec in records: stage = rec.stage_id - field_ids = stage.validate_field_ids + field_ids = stage.sudo().validate_field_ids field_names = [x.name for x in field_ids] values = rec.read(field_names) diff --git a/fieldservice_stage_validation/security/ir.model.access.csv b/fieldservice_stage_validation/security/ir.model.access.csv new file mode 100644 index 0000000000..dcd7291bb9 --- /dev/null +++ b/fieldservice_stage_validation/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_ir_model_field,ir_model_fields fsm,base.model_ir_model_fields,fieldservice.group_fsm_user_own,1,0,0,0 diff --git a/fieldservice_stage_validation/static/description/index.html b/fieldservice_stage_validation/static/description/index.html index 9a7ff5ae10..825447f8b8 100644 --- a/fieldservice_stage_validation/static/description/index.html +++ b/fieldservice_stage_validation/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -366,7 +367,7 @@

      FSM Stage Validation

      !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:1ced40d5e26a6495ac55732e9d6ba749aa76729869fa24363ba8b7d8ccaa03b1 +!! source digest: sha256:7fa9a31f4e7c1c88e82c034446dde98d5561190967fd4b8274010856ad8fcc46 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

      Beta License: AGPL-3 OCA/field-service Translate me on Weblate Try me on Runboat

      As the stage of a field service document progresses, it may be important @@ -442,7 +443,9 @@

      Contributors

      Maintainers

      This module is maintained by the OCA.

      -Odoo Community Association + +Odoo Community Association +

      OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

      diff --git a/hr_attendance_reason/README.rst b/hr_attendance_reason/README.rst index 6be2d720c3..488c92f002 100644 --- a/hr_attendance_reason/README.rst +++ b/hr_attendance_reason/README.rst @@ -7,7 +7,7 @@ HR Attendance Reason !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:1efc21ca72875c847f215f0527a36c5bf1bef11334f475fa794486791eea004f + !! source digest: sha256:5ea4fe894b4098b9134c10e80ef832306fa6323b8147d81753bf62f7c54061ed !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -31,9 +31,9 @@ HR Attendance Reason This module allows to define reasons why the attendance is not what expected. Some example reasons are -- Could not access the system: Visit a customer -- Leave soon to pick up children -- The Hr manager amended the attendance and needs to tell +- Could not access the system: Visit a customer +- Leave soon to pick up children +- The Hr manager amended the attendance and needs to tell **Table of contents** @@ -70,18 +70,18 @@ Authors Contributors ------------ -- Odoo S.A. -- Aaron Henriquez -- Damien Crier -- Saran Lim. -- David Alonso -- Juany Davila -- `Tecnativa `__: +- Odoo S.A. +- Aaron Henriquez +- Damien Crier +- Saran Lim. +- David Alonso +- Juany Davila +- `Tecnativa `__: - - Víctor Martínez - - Carlos Lopez + - Víctor Martínez + - Carlos Lopez -- Dhara Solanki +- Dhara Solanki Maintainers ----------- diff --git a/hr_attendance_reason/__manifest__.py b/hr_attendance_reason/__manifest__.py index f209df7675..5872b88432 100644 --- a/hr_attendance_reason/__manifest__.py +++ b/hr_attendance_reason/__manifest__.py @@ -4,7 +4,7 @@ { "name": "HR Attendance Reason", - "version": "17.0.1.0.0", + "version": "17.0.1.1.0", "category": "Human Resources", "website": "https://github.com/OCA/hr-attendance", "author": "Odoo S.A., Tecnativa, Odoo Community Association (OCA)", @@ -12,13 +12,15 @@ "installable": True, "depends": ["hr_attendance"], "data": [ - "data/hr_attendance_reason_data.xml", "security/ir.model.access.csv", "security/security.xml", "views/hr_attendance_reason_view.xml", "views/hr_attendance_view.xml", "views/res_config_settings_view.xml", ], + "demo": [ + "demo/hr_attendance_reason_demo.xml", + ], "assets": { "web.assets_backend": [ "hr_attendance_reason/static/src/**/*", diff --git a/hr_attendance_reason/data/hr_attendance_reason_data.xml b/hr_attendance_reason/demo/hr_attendance_reason_demo.xml similarity index 100% rename from hr_attendance_reason/data/hr_attendance_reason_data.xml rename to hr_attendance_reason/demo/hr_attendance_reason_demo.xml diff --git a/hr_attendance_reason/static/description/index.html b/hr_attendance_reason/static/description/index.html index cf463aa25c..e8232df9a8 100644 --- a/hr_attendance_reason/static/description/index.html +++ b/hr_attendance_reason/static/description/index.html @@ -367,7 +367,7 @@

      HR Attendance Reason

      !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:1efc21ca72875c847f215f0527a36c5bf1bef11334f475fa794486791eea004f +!! source digest: sha256:5ea4fe894b4098b9134c10e80ef832306fa6323b8147d81753bf62f7c54061ed !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

      Beta License: LGPL-3 OCA/hr-attendance Translate me on Weblate Try me on Runboat

      This module allows to define reasons why the attendance is not what diff --git a/hr_expense_cancel/README.rst b/hr_expense_cancel/README.rst index 1e966932ab..d989256294 100644 --- a/hr_expense_cancel/README.rst +++ b/hr_expense_cancel/README.rst @@ -7,7 +7,7 @@ Hr expense cancel !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:33354bbac2fe7f2f76e1fd239d91948850c11e90e289f70e91d3e1ed3ae4e838 + !! source digest: sha256:659127f8c6e5f2db749db28e1d7681511ae898c25356a3293ea5094ba6c89b88 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -87,16 +87,16 @@ Authors Contributors ------------ -- `Tecnativa `__: +- `Tecnativa `__: - - Pedro M. Baeza - - Ernesto Tejeda - - Stefan Ungureanu + - Pedro M. Baeza + - Ernesto Tejeda + - Stefan Ungureanu -- Danh Vo -- Saran Lim. -- Manuel Regidor -- Italo LOPES +- Danh Vo +- Saran Lim. +- Manuel Regidor +- Italo LOPES Maintainers ----------- diff --git a/hr_expense_cancel/__manifest__.py b/hr_expense_cancel/__manifest__.py index 882bce9ab2..6f0c009979 100644 --- a/hr_expense_cancel/__manifest__.py +++ b/hr_expense_cancel/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Hr expense cancel", - "version": "17.0.1.0.2", + "version": "17.0.1.0.3", "author": "Tecnativa, Odoo Community Association (OCA)", "website": "https://github.com/OCA/hr-expense", "license": "AGPL-3", diff --git a/hr_expense_cancel/static/description/index.html b/hr_expense_cancel/static/description/index.html index 60f9788bfa..88a87bcbed 100644 --- a/hr_expense_cancel/static/description/index.html +++ b/hr_expense_cancel/static/description/index.html @@ -367,7 +367,7 @@

      Hr expense cancel

      !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:33354bbac2fe7f2f76e1fd239d91948850c11e90e289f70e91d3e1ed3ae4e838 +!! source digest: sha256:659127f8c6e5f2db749db28e1d7681511ae898c25356a3293ea5094ba6c89b88 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

      Beta License: AGPL-3 OCA/hr-expense Translate me on Weblate Try me on Runboat

      This module allows you to cancel and correct expenses. It adds a cancel diff --git a/hr_expense_cancel/tests/test_hr_expense_cancel.py b/hr_expense_cancel/tests/test_hr_expense_cancel.py index 7a454b48e2..4ceaa34945 100644 --- a/hr_expense_cancel/tests/test_hr_expense_cancel.py +++ b/hr_expense_cancel/tests/test_hr_expense_cancel.py @@ -1,70 +1,45 @@ # Copyright 2019 Tecnativa - Ernesto Tejeda +# Copyright 2024 Tecnativa - Víctor Martínez # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo.exceptions import UserError -from odoo.tests.common import Form, TransactionCase +from odoo.tests.common import Form, tagged +from odoo.addons.hr_expense.tests.common import TestExpenseCommon -class TestHrExpenseCancel(TransactionCase): - def setUp(self): - super().setUp() - self.partner = self.env["res.partner"].create({"name": "Test partner"}) - self.payment_obj = self.env["account.payment"] - self.account_payment_register = self.env["account.payment.register"] - self.payment_journal = self.env["account.journal"].search( - [("type", "in", ["cash", "bank"])], limit=1 - ) - - self.main_company = company = self.env.ref("base.main_company") - self.expense_journal = self.env["account.journal"].create( - { - "name": "Purchase Journal - Test", - "code": "HRTPJ", - "type": "purchase", - "company_id": company.id, - } - ) - self.expense = self.env["hr.expense"].create( - { - "name": "Expense test", - "employee_id": self.ref("hr.employee_admin"), - "product_id": self.ref( - "hr_expense.expense_product_travel_accommodation" - ), - "total_amount": 10, - } - ) - self.expense.action_submit_expenses() - - self.expense_sheet = self.expense.sheet_id - self.expense_sheet.journal_id = self.expense_journal - self.expense_sheet.action_approve_expense_sheets() +@tagged("-at_install", "post_install") +class TestHrExpenseCancel(TestExpenseCommon): + @classmethod + def setUpClass(cls, chart_template_ref=None): + super().setUpClass(chart_template_ref=chart_template_ref) + # Create expense + sheet + approve + cls.expense = cls.create_expense(cls) + res = cls.expense.action_submit_expenses() + cls.expense_sheet = cls.env[res["res_model"]].browse(res["res_id"]) + cls.expense_sheet.action_approve_expense_sheets() - def _get_payment_wizard(self, expense_sheet): - action = expense_sheet.action_register_payment() - ctx = action.get("context") - with Form( - self.account_payment_register.with_context(**ctx), - view="account.view_account_payment_register_form", - ) as f: - f.amount = expense_sheet.total_amount - register_payment = f.save() - return register_payment + def _get_payment_wizard(self): + res = self.expense_sheet.action_register_payment() + register_form = Form(self.env[res["res_model"]].with_context(**res["context"])) + register_form.journal_id = self.company_data["default_journal_bank"] + register_form.amount = self.expense_sheet.total_amount + return register_form.save() def test_action_cancel_posted(self): self.expense_sheet.action_sheet_move_create() - self.assertFalse(len(self.expense_sheet.payment_ids), 1) self.assertTrue(self.expense_sheet.account_move_ids) self.expense_sheet.action_cancel() - self.assertFalse(self.expense_sheet.payment_ids) self.assertFalse(self.expense_sheet.account_move_ids) def test_action_cancel_no_update_posted(self): - journals = self.payment_journal | self.expense_journal + journals = ( + self.company_data["default_journal_bank"] + | self.company_data["default_journal_purchase"] + ) journals.write({"restrict_mode_hash_table": True}) with self.assertRaises(UserError): self.test_action_cancel_company_account() @@ -73,7 +48,7 @@ def test_action_cancel_no_update_posted(self): def test_action_cancel_company_account(self): self.expense.payment_mode = "company_account" - self.expense_sheet.journal_id = self.payment_journal + self.expense_sheet.journal_id = self.company_data["default_journal_bank"] self.expense_sheet.action_sheet_move_create() self.assertTrue(self.expense_sheet.account_move_ids) self.expense_sheet.action_cancel() @@ -81,11 +56,8 @@ def test_action_cancel_company_account(self): def test_action_cancel_own_account(self): self.expense_sheet.action_sheet_move_create() - - payment_wizard = self._get_payment_wizard(self.expense_sheet) + payment_wizard = self._get_payment_wizard() payment_wizard.action_create_payments() - self.assertTrue(self.expense_sheet.payment_ids) - self.expense_sheet.action_cancel() # assertFalse(payment.exist) self.assertFalse(self.expense_sheet.payment_ids.state != "cancel") diff --git a/hr_expense_invoice/README.rst b/hr_expense_invoice/README.rst index 69d5b9bd51..0da5c2c2cb 100644 --- a/hr_expense_invoice/README.rst +++ b/hr_expense_invoice/README.rst @@ -7,7 +7,7 @@ Supplier invoices on HR expenses !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:4d1693cd87b2441295e43eeb618d44f2125d6b9fafa1085112ec9031d8532e48 + !! source digest: sha256:28f0dbce01ce71ed07dc7e9b2013aa443af728b5f9ef8c208b3ab2af15ef6bd2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -49,27 +49,27 @@ Usage **Reference one invoice to an expense** -- Create an expense sheet. -- Add an expense line to sheet with an invoice_id selected or create - one new. -- Process expense sheet. -- On paying expense sheet, you are reconciling supplier invoice too. +- Create an expense sheet. +- Add an expense line to sheet with an invoice_id selected or create one + new. +- Process expense sheet. +- On paying expense sheet, you are reconciling supplier invoice too. **Create one invoice to multiple expenses** -- Create an expense sheet with one or multiple expense lines -- After approved, click button "Create Vendor Bill" -- Select multiple expense to create an invoice, and process it. -- New invoice will be create and link to the selected expense lines. -- Validate newly create invoice. -- On paying expense sheet, you are reconciling supplier invoice(s) too. +- Create an expense sheet with one or multiple expense lines +- After approved, click button "Create Vendor Bill" +- Select multiple expense to create an invoice, and process it. +- New invoice will be create and link to the selected expense lines. +- Validate newly create invoice. +- On paying expense sheet, you are reconciling supplier invoice(s) too. Known issues / Roadmap ====================== -- Multiple payment terms for a supplier invoice are not handled - correctly. -- Partial reconcile supplier invoices are also not correctly handled. +- Multiple payment terms for a supplier invoice are not handled + correctly. +- Partial reconcile supplier invoices are also not correctly handled. Bug Tracker =========== @@ -92,15 +92,15 @@ Authors Contributors ------------ -- `Tecnativa `__: +- `Tecnativa `__: - - Pedro M. Baeza - - Vicent Cubells - - Víctor Martínez + - Pedro M. Baeza + - Vicent Cubells + - Víctor Martínez -- Kitti Upariphutthiphong -- Rattapong Chokmasermkul -- Saran Lim. +- Kitti Upariphutthiphong +- Rattapong Chokmasermkul +- Saran Lim. Maintainers ----------- diff --git a/hr_expense_invoice/__manifest__.py b/hr_expense_invoice/__manifest__.py index 295b5e4ef8..b7ce10c0cf 100644 --- a/hr_expense_invoice/__manifest__.py +++ b/hr_expense_invoice/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Supplier invoices on HR expenses", - "version": "17.0.1.0.0", + "version": "17.0.1.0.2", "category": "Human Resources", "author": "Tecnativa, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/hr_expense_invoice/models/hr_expense_sheet.py b/hr_expense_invoice/models/hr_expense_sheet.py index 6ab00809e2..a74840d377 100644 --- a/hr_expense_invoice/models/hr_expense_sheet.py +++ b/hr_expense_invoice/models/hr_expense_sheet.py @@ -36,8 +36,8 @@ def _do_create_moves(self): lambda x: x.display_type == "payment_term" ) transfer_line = move.line_ids.filtered( - lambda x: x.partner_id - == self.expense_line_ids.invoice_id.partner_id + lambda x, partner=expense.invoice_id.partner_id: x.partner_id + == partner ) (ap_lines + transfer_line).reconcile() return res diff --git a/hr_expense_invoice/static/description/index.html b/hr_expense_invoice/static/description/index.html index b4cfb88286..6b7927add4 100644 --- a/hr_expense_invoice/static/description/index.html +++ b/hr_expense_invoice/static/description/index.html @@ -367,7 +367,7 @@

      Supplier invoices on HR expenses

      !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:4d1693cd87b2441295e43eeb618d44f2125d6b9fafa1085112ec9031d8532e48 +!! source digest: sha256:28f0dbce01ce71ed07dc7e9b2013aa443af728b5f9ef8c208b3ab2af15ef6bd2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

      Beta License: AGPL-3 OCA/hr-expense Translate me on Weblate Try me on Runboat

      This module should be used when a supplier invoice is paid by an @@ -399,8 +399,8 @@

      Usage

      Reference one invoice to an expense

      • Create an expense sheet.
      • -
      • Add an expense line to sheet with an invoice_id selected or create -one new.
      • +
      • Add an expense line to sheet with an invoice_id selected or create one +new.
      • Process expense sheet.
      • On paying expense sheet, you are reconciling supplier invoice too.
      diff --git a/hr_expense_invoice/tests/test_hr_expense_invoice.py b/hr_expense_invoice/tests/test_hr_expense_invoice.py index afa8c2f9e0..6ab27fb102 100644 --- a/hr_expense_invoice/tests/test_hr_expense_invoice.py +++ b/hr_expense_invoice/tests/test_hr_expense_invoice.py @@ -4,7 +4,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). import base64 -from odoo import Command, fields +from odoo import fields from odoo.exceptions import UserError, ValidationError from odoo.tests import tagged from odoo.tests.common import Form @@ -35,11 +35,6 @@ def setUpClass(cls, chart_template_ref=None): "invoice_date": fields.Date.today(), } ) - cls.expense_employee.bank_account_id = Command.create( - { - "acc_number": "FR20 1242 1242 1242 1242 1242 124", - } - ) cls.expense = cls.env["hr.expense"].create( { "name": "Expense test", diff --git a/hr_expense_payment/README.rst b/hr_expense_payment/README.rst index 99c5d122f3..bc8ae504ce 100644 --- a/hr_expense_payment/README.rst +++ b/hr_expense_payment/README.rst @@ -7,7 +7,7 @@ HR Expense Payment !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:e988ec70c2c94d8ed3ab8467996d975021f8a4a9ce5cb3912611e58c93df7eb9 + !! source digest: sha256:7ae568d53f95d5b826ffe0feb3e191fbe8ac980927e6639e90d3021b4ad60d36 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -58,11 +58,11 @@ Authors Contributors ------------ -- Saran Lim. -- Manuel Regidor -- ``APSL ``\ \_\_: +- Saran Lim. +- Manuel Regidor +- ``APSL ``\ \_\_: - - Antoni Marroig + - Antoni Marroig Maintainers ----------- diff --git a/hr_expense_payment/__manifest__.py b/hr_expense_payment/__manifest__.py index dac4b953ec..62f878f04c 100644 --- a/hr_expense_payment/__manifest__.py +++ b/hr_expense_payment/__manifest__.py @@ -4,7 +4,7 @@ { "name": "HR Expense Payment", - "version": "17.0.1.0.0", + "version": "17.0.1.0.1", "category": "Human Resources", "author": "Tecnativa, Ecosoft, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/hr_expense_payment/static/description/index.html b/hr_expense_payment/static/description/index.html index 73e9d29f93..8256ead532 100644 --- a/hr_expense_payment/static/description/index.html +++ b/hr_expense_payment/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -366,7 +367,7 @@

      HR Expense Payment

      !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:e988ec70c2c94d8ed3ab8467996d975021f8a4a9ce5cb3912611e58c93df7eb9 +!! source digest: sha256:7ae568d53f95d5b826ffe0feb3e191fbe8ac980927e6639e90d3021b4ad60d36 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

      Beta License: AGPL-3 OCA/hr-expense Translate me on Weblate Try me on Runboat

      This module allow payment link to expense. After you register payment on @@ -414,7 +415,9 @@

      Contributors

      Maintainers

      This module is maintained by the OCA.

      -Odoo Community Association + +Odoo Community Association +

      OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

      diff --git a/hr_expense_payment/tests/test_hr_expense_payment.py b/hr_expense_payment/tests/test_hr_expense_payment.py index 9d671f0397..268a40ee07 100644 --- a/hr_expense_payment/tests/test_hr_expense_payment.py +++ b/hr_expense_payment/tests/test_hr_expense_payment.py @@ -1,85 +1,51 @@ # Copyright 2019 Tecnativa - Ernesto Tejeda # Copyright 2021 Ecosoft Co., Ltd (http://ecosoft.co.th/) +# Copyright 2024 Tecnativa - Víctor Martínez # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo.tests.common import Form, TransactionCase +from odoo.tests import Form, tagged + +from odoo.addons.hr_expense.tests.common import TestExpenseCommon from ..hooks import post_init_hook -class TestHrExpensePayment(TransactionCase): +@tagged("-at_install", "post_install") +class TestHrExpensePayment(TestExpenseCommon): @classmethod - def setUpClass(cls): - super().setUpClass() - cls.account_payment_register = cls.env["account.payment.register"] - cls.payment_journal = cls.env["account.journal"].search( - [("type", "in", ["cash", "bank"])], limit=1 - ) - - company = cls.env.ref("base.main_company") - cls.expense_journal = cls.env["account.journal"].create( - { - "name": "Purchase Journal - Test", - "code": "HRTPJ", - "type": "purchase", - "company_id": company.id, - } - ) - - cls.expense_sheet = cls.env["hr.expense.sheet"].create( - { - "employee_id": cls.env.ref("hr.employee_admin").id, - "name": "Expense test", - "journal_id": cls.expense_journal.id, - } - ) + def setUpClass(cls, chart_template_ref=None): + super().setUpClass(chart_template_ref=chart_template_ref) + # Create expense + sheet + approve + cls.expense = cls.create_expense(cls) + res = cls.expense.action_submit_expenses() + cls.expense_sheet = cls.env[res["res_model"]].browse(res["res_id"]) cls.expense_sheet.action_approve_expense_sheets() - cls.expense = cls.env["hr.expense"].create( - { - "name": "Expense test", - "employee_id": cls.env.ref("hr.employee_admin").id, - "product_id": cls.env.ref("hr_expense.expense_product_meal").id, - "total_amount": 1000, - "sheet_id": cls.expense_sheet.id, - } - ) - - def _get_payment_wizard(self, expense_sheet): - action = expense_sheet.action_register_payment() - ctx = action.get("context") - with Form( - self.account_payment_register.with_context(**ctx), - view="account.view_account_payment_register_form", - ) as f: - f.journal_id = self.payment_journal - f.amount = self.expense_sheet.total_amount - register_payment = f.save() - return register_payment + def _get_payment_wizard(self): + res = self.expense_sheet.action_register_payment() + register_form = Form(self.env[res["res_model"]].with_context(**res["context"])) + register_form.journal_id = self.company_data["default_journal_bank"] + register_form.amount = self.expense_sheet.total_amount + return register_form.save() def test_post_init_hook(self): self.expense_sheet.action_sheet_move_create() - payment_wizard = self._get_payment_wizard(self.expense_sheet) + payment_wizard = self._get_payment_wizard() payment_wizard.action_create_payments() - payment = self.expense_sheet.payment_ids - self.assertEqual(len(payment), 1) self.assertEqual(len(payment.expense_sheet_ids), 1) - payment.expense_sheet_ids = False # Recompute many2one payment = self.expense_sheet.payment_ids - self.assertFalse(payment) self.assertFalse(payment.expense_sheet_ids) post_init_hook(self.env) - self.assertEqual(len(self.expense_sheet.payment_ids), 1) def test_get_payment_vals(self): self.expense_sheet.action_sheet_move_create() - payment_wizard = self._get_payment_wizard(self.expense_sheet) + payment_wizard = self._get_payment_wizard() self.assertFalse(self.expense_sheet.payment_ids) payment_wizard.action_create_payments() self.assertEqual(len(self.expense_sheet.payment_ids), 1) diff --git a/intrastat_product/i18n/it.po b/intrastat_product/i18n/it.po index cade5509ba..42f120125f 100644 --- a/intrastat_product/i18n/it.po +++ b/intrastat_product/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 17.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-10-09 10:06+0000\n" +"PO-Revision-Date: 2024-11-26 20:06+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -686,12 +686,12 @@ msgstr "Raggruppa per" #. module: intrastat_product #: model:ir.model,name:intrastat_product.model_hs_code msgid "H.S. Code" -msgstr "Codice H.S." +msgstr "Codice S.A." #. module: intrastat_product #: model:ir.ui.menu,name:intrastat_product.intrastat_code_menu msgid "H.S. Codes" -msgstr "Codici H.S." +msgstr "Codici S.A." #. module: intrastat_product #: model_terms:ir.ui.view,arch_db:intrastat_product.report_invoice_document_intrastat_product diff --git a/l10n_ch_qr_no_amount/report/swissqr_no_amount_report.py b/l10n_ch_qr_no_amount/report/swissqr_no_amount_report.py index 2718de9a45..1a550f070d 100644 --- a/l10n_ch_qr_no_amount/report/swissqr_no_amount_report.py +++ b/l10n_ch_qr_no_amount/report/swissqr_no_amount_report.py @@ -1,7 +1,12 @@ -from odoo import models +from odoo import api, models class ReportSwissNoAmountQR(models.AbstractModel): _name = "report.l10n_ch_qr_no_amount.qr_no_amount_report_main" _inherit = "report.l10n_ch.qr_report_main" _description = "QR-No-Amount-bill" + + @api.model + def _get_report_values(self, docids, data=None): + self = self.with_context(_no_amount_qr_code=True) + return super()._get_report_values(docids, data) diff --git a/l10n_ro_account/README.rst b/l10n_ro_account/README.rst index b710716c62..82e8066d94 100644 --- a/l10n_ro_account/README.rst +++ b/l10n_ro_account/README.rst @@ -7,7 +7,7 @@ Romania - Account !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:053353c49fddec8b67add6c5c336993b23cf694d1d8d8d31622045fca8530aa2 + !! source digest: sha256:bc2deca9d819032d09ccf079f26bd30b72162ee0dcb34073b26373bcea4b19f2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -28,11 +28,11 @@ Romania - Account |badge1| |badge2| |badge3| |badge4| |badge5| -- Funcționalități: +- Funcționalități: - - limitare încasare numerar - - afișare conturi în format scurt - - corecție traducere încasare + - limitare încasare numerar + - afișare conturi în format scurt + - corecție traducere încasare **Table of contents** @@ -60,9 +60,9 @@ Authors Contributors ------------ -- `Terrabit `__: +- `Terrabit `__: - - Dorin Hongu + - Dorin Hongu Do not contact contributors directly about support or help with technical issues. diff --git a/l10n_ro_account/__manifest__.py b/l10n_ro_account/__manifest__.py index 09e67a584f..8f931e8f9e 100644 --- a/l10n_ro_account/__manifest__.py +++ b/l10n_ro_account/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Romania - Account", - "version": "17.0.1.7.0", + "version": "17.0.1.8.0", "summary": "Romania - Account", "countries": ["ro"], "license": "AGPL-3", diff --git a/l10n_ro_account/i18n/ro.po b/l10n_ro_account/i18n/ro.po index 8de5902109..1bce172071 100644 --- a/l10n_ro_account/i18n/ro.po +++ b/l10n_ro_account/i18n/ro.po @@ -26,22 +26,22 @@ msgstr "Cont" #: model:ir.model.fields,field_description:l10n_ro_account.field_account_payment__is_l10n_ro_record #: model:ir.model.fields,field_description:l10n_ro_account.field_account_payment_register__is_l10n_ro_record msgid "Is Romanian Record" -msgstr "Este record românesc" +msgstr "Este înregistrare românească" #. module: l10n_ro_account #: model:ir.model.fields,field_description:l10n_ro_account.field_account_account__l10n_ro_external_code msgid "L10N Ro External Code" -msgstr "L10N Ro Cod Extern" +msgstr "Cod extern" #. module: l10n_ro_account #: model:ir.model,name:l10n_ro_account.model_account_payment msgid "Payments" -msgstr "Plăți" +msgstr "Încasări" #. module: l10n_ro_account #: model:ir.model,name:l10n_ro_account.model_account_payment_register msgid "Register Payment" -msgstr "Înregistrează Plată" +msgstr "Registru încasări" #. module: l10n_ro_account #. odoo-python diff --git a/l10n_ro_account/models/account_account.py b/l10n_ro_account/models/account_account.py index 7860fce7b1..4e54830250 100644 --- a/l10n_ro_account/models/account_account.py +++ b/l10n_ro_account/models/account_account.py @@ -29,17 +29,16 @@ def external_code_to_internal(self, code): return account_id def internal_to_external(self): + if self.code and not self.code.isdigit(): + return self.code if not self.code or len(self.code) < 4: return self.code cont = self.code[:4] while cont and cont[-1] == "0": cont = cont[:-1] - try: - analitic = int(self.code[4:]) - except Exception: - analitic = self.code[4:] - if analitic: - cont += "." + str(analitic) + + analytic = int(self.code[4:]) + cont += "." + str(analytic) return cont def _compute_display_name(self): diff --git a/l10n_ro_account/static/description/index.html b/l10n_ro_account/static/description/index.html index 3e357b0fa7..957b4adda7 100644 --- a/l10n_ro_account/static/description/index.html +++ b/l10n_ro_account/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -366,7 +367,7 @@

      Romania - Account

      !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:053353c49fddec8b67add6c5c336993b23cf694d1d8d8d31622045fca8530aa2 +!! source digest: sha256:bc2deca9d819032d09ccf079f26bd30b72162ee0dcb34073b26373bcea4b19f2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

      Beta License: AGPL-3 OCA/l10n-romania Translate me on Weblate Try me on Runboat

        @@ -419,7 +420,9 @@

        Contributors

        Maintainers

        This module is maintained by the OCA.

        -Odoo Community Association + +Odoo Community Association +

        OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

        diff --git a/l10n_ro_account_edit_currency_rate/README.rst b/l10n_ro_account_edit_currency_rate/README.rst index 68f2234f31..e837a70df3 100644 --- a/l10n_ro_account_edit_currency_rate/README.rst +++ b/l10n_ro_account_edit_currency_rate/README.rst @@ -7,7 +7,7 @@ Romania - Invoice Edit Currency Rate !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:5348c4a91268473f08a4318c72f0410a4de86194bef14793462d9087be21cf92 + !! source digest: sha256:98bf0ef474b79e3cf50912f03720a189602c00ee08aaa4d15e07b841c8ea7189 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png @@ -41,12 +41,12 @@ Installation To install this module, you need to: -- clone the branch 14.0 of the repository - https://github.com/OCA/l10n-romania -- add the path to this repository in your configuration (addons-path) -- update the module list -- search for "Romania - Invoice Edit Currency Rate" in your addons -- install the module +- clone the branch 14.0 of the repository + https://github.com/OCA/l10n-romania +- add the path to this repository in your configuration (addons-path) +- update the module list +- search for "Romania - Invoice Edit Currency Rate" in your addons +- install the module Bug Tracker =========== @@ -69,10 +69,10 @@ Authors Contributors ------------ -- `NextERP Romania `__: +- `NextERP Romania `__: - - Fekete Mihai - - Cojocaru Marcel + - Fekete Mihai + - Cojocaru Marcel Do not contact contributors directly about support or help with technical issues. diff --git a/l10n_ro_account_edit_currency_rate/__manifest__.py b/l10n_ro_account_edit_currency_rate/__manifest__.py index c89fd3c827..20ef0b3b02 100644 --- a/l10n_ro_account_edit_currency_rate/__manifest__.py +++ b/l10n_ro_account_edit_currency_rate/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Romania - Invoice Edit Currency Rate", "summary": "Romania - Invoice Edit Currency Rate", - "version": "17.0.0.1.0", + "version": "17.0.0.2.0", "category": "Localization", "author": "NextERP Romania," "Odoo Community Association (OCA)", "website": "https://github.com/OCA/l10n-romania", diff --git a/l10n_ro_account_edit_currency_rate/models/account_move.py b/l10n_ro_account_edit_currency_rate/models/account_move.py index 26e9795a74..f05236e7ea 100644 --- a/l10n_ro_account_edit_currency_rate/models/account_move.py +++ b/l10n_ro_account_edit_currency_rate/models/account_move.py @@ -8,7 +8,7 @@ class Currency(models.Model): _inherit = "res.currency" # pylint: disable=W0622 - def _convert(self, from_amount, to_currency, company, date, round=True): + def _convert(self, from_amount, to_currency, company=None, date=None, round=True): if self._context.get("l10n_ro_force_currency_rate"): self, to_currency = self or to_currency, to_currency or self assert self, "convert amount from unknown currency" diff --git a/l10n_ro_account_edit_currency_rate/static/description/index.html b/l10n_ro_account_edit_currency_rate/static/description/index.html index 3a2e17cc9b..d18130b01a 100644 --- a/l10n_ro_account_edit_currency_rate/static/description/index.html +++ b/l10n_ro_account_edit_currency_rate/static/description/index.html @@ -367,7 +367,7 @@

        Romania - Invoice Edit Currency Rate

        !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:5348c4a91268473f08a4318c72f0410a4de86194bef14793462d9087be21cf92 +!! source digest: sha256:98bf0ef474b79e3cf50912f03720a189602c00ee08aaa4d15e07b841c8ea7189 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

        Mature License: AGPL-3 OCA/l10n-romania Translate me on Weblate Try me on Runboat

        This module allows to edit the currency rate used to compute the diff --git a/l10n_ro_stock_account_date/README.rst b/l10n_ro_stock_account_date/README.rst index 3ddb6052ab..4d87d28bd3 100644 --- a/l10n_ro_stock_account_date/README.rst +++ b/l10n_ro_stock_account_date/README.rst @@ -7,7 +7,7 @@ Romania - Stock Accounting Date !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:70f8c28994b483e1662c4f82ad327c64f860a456db2f5ce16692a23bddae8e5a + !! source digest: sha256:09adcac16fcbc89fceed582d06c55a2c2c4861e8713fc538f1d99e39378c5336 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png @@ -40,12 +40,12 @@ Installation To install this module, you need to: -- clone the branch 16.0 of the repository - https://github.com/OCA/l10n-romania -- add the path to this repository in your configuration (addons-path) -- update the module list -- search for "Romania - Stock Account Date" in your addons -- install the module +- clone the branch 16.0 of the repository + https://github.com/OCA/l10n-romania +- add the path to this repository in your configuration (addons-path) +- update the module list +- search for "Romania - Stock Account Date" in your addons +- install the module Bug Tracker =========== @@ -68,11 +68,11 @@ Authors Contributors ------------ -- `NextERP Romania `__: +- `NextERP Romania `__: - - Fekete Mihai - - Alexandru Teodor - - Cojocaru Marcel + - Fekete Mihai + - Alexandru Teodor + - Cojocaru Marcel Do not contact contributors directly about support or help with technical issues. diff --git a/l10n_ro_stock_account_date/__manifest__.py b/l10n_ro_stock_account_date/__manifest__.py index fa1d3b4fbb..ba45512311 100644 --- a/l10n_ro_stock_account_date/__manifest__.py +++ b/l10n_ro_stock_account_date/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { "name": "Romania - Stock Accounting Date", - "version": "17.0.1.9.0", + "version": "17.0.1.10.0", "category": "Localization", "countries": ["ro"], "summary": "Romania - Stock Accounting Date", diff --git a/l10n_ro_stock_account_date/models/stock_move.py b/l10n_ro_stock_account_date/models/stock_move.py index a1a020baac..b6af483d53 100644 --- a/l10n_ro_stock_account_date/models/stock_move.py +++ b/l10n_ro_stock_account_date/models/stock_move.py @@ -24,9 +24,9 @@ def l10n_ro_get_move_date(self): new_date = self.date elif "raw_material_production_id" in self._fields: if self.raw_material_production_id: - new_date = self.raw_material_production_id.date_planned_start + new_date = self.raw_material_production_id.date_start elif self.production_id: - new_date = self.production_id.date_planned_start + new_date = self.production_id.date_start if not new_date: new_date = fields.date.today() restrict_date_last_month = ( diff --git a/l10n_ro_stock_account_date/static/description/index.html b/l10n_ro_stock_account_date/static/description/index.html index 040773282f..21e692ef01 100644 --- a/l10n_ro_stock_account_date/static/description/index.html +++ b/l10n_ro_stock_account_date/static/description/index.html @@ -367,7 +367,7 @@

        Romania - Stock Accounting Date

        !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:70f8c28994b483e1662c4f82ad327c64f860a456db2f5ce16692a23bddae8e5a +!! source digest: sha256:09adcac16fcbc89fceed582d06c55a2c2c4861e8713fc538f1d99e39378c5336 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

        Mature License: AGPL-3 OCA/l10n-romania Translate me on Weblate Try me on Runboat

        This module allows you to select “Accounting Date” for stock operations.

        diff --git a/l10n_ro_stock_price_difference/README.rst b/l10n_ro_stock_price_difference/README.rst index b8c0b9df17..d26087f239 100644 --- a/l10n_ro_stock_price_difference/README.rst +++ b/l10n_ro_stock_price_difference/README.rst @@ -7,7 +7,7 @@ Romania - Stock Accounting Price Difference !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:4814191eeb5d8709cf4c8a022964449f080b60cd69d5e1e611f4f99dae8d1f71 + !! source digest: sha256:219cbaf8b28f0842a721a8eb29fa707c6c41507339b421ef7db09d0b2c5e870e !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png @@ -59,14 +59,14 @@ Authors Contributors ------------ -- `NextERP Romania `__: +- `NextERP Romania `__: - - Fekete Mihai - - Cojocaru Marcel + - Fekete Mihai + - Cojocaru Marcel -- `Terrabit `__: +- `Terrabit `__: - - Dorin Hongu + - Dorin Hongu Do not contact contributors directly about support or help with technical issues. diff --git a/l10n_ro_stock_price_difference/__manifest__.py b/l10n_ro_stock_price_difference/__manifest__.py index b1fac69785..2daba4f82c 100644 --- a/l10n_ro_stock_price_difference/__manifest__.py +++ b/l10n_ro_stock_price_difference/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { "name": "Romania - Stock Accounting Price Difference", - "version": "17.0.0.3.0", + "version": "17.0.0.4.0", "category": "Localization", "summary": "Romania - Stock Accounting Price Difference", "author": "NextERP Romania," "Dorin Hongu," "Odoo Community Association (OCA)", diff --git a/l10n_ro_stock_price_difference/migrations/16.0.5.4.1/pre-migration.py b/l10n_ro_stock_price_difference/migrations/16.0.5.4.1/pre-migration.py index ae71f12872..6c27c8283c 100644 --- a/l10n_ro_stock_price_difference/migrations/16.0.5.4.1/pre-migration.py +++ b/l10n_ro_stock_price_difference/migrations/16.0.5.4.1/pre-migration.py @@ -1,21 +1,28 @@ # Copyright (C) 2023 NextERP Romania # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import logging + from openupgradelib import openupgrade +_logger = logging.getLogger(__name__) + def migrate(cr, version): if not version: return - openupgrade.logged_query( - cr, - """ - UPDATE stock_valuation_layer svl set - l10n_ro_invoice_id = lsvl.l10n_ro_invoice_id, - l10n_ro_invoice_line_id = lsvl.l10n_ro_invoice_line_id - FROM stock_valuation_layer lsvl - WHERE - svl.stock_valuation_layer_id = lsvl.id and - svl.description like '%Price Difference%' - """, - ) + try: + openupgrade.logged_query( + cr, + """ + UPDATE stock_valuation_layer svl set + l10n_ro_invoice_id = lsvl.l10n_ro_invoice_id, + l10n_ro_invoice_line_id = lsvl.l10n_ro_invoice_line_id + FROM stock_valuation_layer lsvl + WHERE + svl.stock_valuation_layer_id = lsvl.id and + svl.description like '%Price Difference%' + """, + ) + except Exception as e: + _logger.error("Failed to update stock_valuation_layer: %s", str(e)) diff --git a/l10n_ro_stock_price_difference/static/description/index.html b/l10n_ro_stock_price_difference/static/description/index.html index daa70e2409..861bf1919e 100644 --- a/l10n_ro_stock_price_difference/static/description/index.html +++ b/l10n_ro_stock_price_difference/static/description/index.html @@ -367,7 +367,7 @@

        Romania - Stock Accounting Price Difference

        !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:4814191eeb5d8709cf4c8a022964449f080b60cd69d5e1e611f4f99dae8d1f71 +!! source digest: sha256:219cbaf8b28f0842a721a8eb29fa707c6c41507339b421ef7db09d0b2c5e870e !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

        Mature License: AGPL-3 OCA/l10n-romania Translate me on Weblate Try me on Runboat

        The module is managing price diferences between invoices and receptions. diff --git a/l10n_us_partner_legal_number/README.rst b/l10n_us_partner_legal_number/README.rst new file mode 100644 index 0000000000..11592c85fa --- /dev/null +++ b/l10n_us_partner_legal_number/README.rst @@ -0,0 +1,84 @@ +======================================================== +Add Legal Number for North American Banking & Financials +======================================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:3dac96147bcb832c6f2de7bdba9791c8fd3647373ea94ff4686f5b4877ca3cbe + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--usa-lightgray.png?logo=github + :target: https://github.com/OCA/l10n-usa/tree/17.0/l10n_us_partner_legal_number + :alt: OCA/l10n-usa +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/l10n-usa-17-0/l10n-usa-17-0-l10n_us_partner_legal_number + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-usa&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Add Legal Number for North American Banking & Financials + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Add Legal Number Field + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Open Source Integrators + +Contributors +------------ + +- Chankya Soni +- Maxime Chambreuil +- Serpent Consulting Services Pvt. Ltd. +- Levent Karakas + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/l10n-usa `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/l10n_us_partner_legal_number/__init__.py b/l10n_us_partner_legal_number/__init__.py new file mode 100644 index 0000000000..83e553ac46 --- /dev/null +++ b/l10n_us_partner_legal_number/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/l10n_us_partner_legal_number/__manifest__.py b/l10n_us_partner_legal_number/__manifest__.py new file mode 100644 index 0000000000..4370917b7a --- /dev/null +++ b/l10n_us_partner_legal_number/__manifest__.py @@ -0,0 +1,16 @@ +# Copyright 2021 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Add Legal Number for North American Banking & Financials", + "summary": "Add Legal Number for North American Banking & Financials", + "version": "17.0.1.0.0", + "license": "AGPL-3", + "author": "Open Source Integrators, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/l10n-usa", + "category": "Banking addons", + "depends": ["account"], + "data": ["views/res_partner.xml"], + "installable": True, + "external_dependencies": {"python": ["python-stdnum"]}, +} diff --git a/l10n_us_partner_legal_number/i18n/l10n_us_partner_legal_number.pot b/l10n_us_partner_legal_number/i18n/l10n_us_partner_legal_number.pot new file mode 100644 index 0000000000..629b12c57f --- /dev/null +++ b/l10n_us_partner_legal_number/i18n/l10n_us_partner_legal_number.pot @@ -0,0 +1,53 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_us_partner_legal_number +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \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: l10n_us_partner_legal_number +#. odoo-python +#: code:addons/l10n_us_partner_legal_number/models/base.py:0 +#, python-format +msgid "%s is not a valid EIN / SSN / Canadian Business Number" +msgstr "" + +#. module: l10n_us_partner_legal_number +#: model:ir.model,name:l10n_us_partner_legal_number.model_res_partner +msgid "Contact" +msgstr "" + +#. module: l10n_us_partner_legal_number +#: model:ir.model,name:l10n_us_partner_legal_number.model_countinghouse_legal_id_number +msgid "Counting House Legal Id Number" +msgstr "" + +#. module: l10n_us_partner_legal_number +#: model_terms:ir.ui.view,arch_db:l10n_us_partner_legal_number.view_partner_legal_id_number +msgid "EIN / SSN / BN" +msgstr "" + +#. module: l10n_us_partner_legal_number +#: model:ir.model.fields,help:l10n_us_partner_legal_number.field_countinghouse_legal_id_number__legal_id_number +#: model:ir.model.fields,help:l10n_us_partner_legal_number.field_res_partner__legal_id_number +#: model:ir.model.fields,help:l10n_us_partner_legal_number.field_res_users__legal_id_number +msgid "" +"For US entities, enter valid EIN or Social Security Number.\n" +" Canadian entities, enter Canadian Business Number.\n" +" " +msgstr "" + +#. module: l10n_us_partner_legal_number +#: model:ir.model.fields,field_description:l10n_us_partner_legal_number.field_countinghouse_legal_id_number__legal_id_number +#: model:ir.model.fields,field_description:l10n_us_partner_legal_number.field_res_partner__legal_id_number +#: model:ir.model.fields,field_description:l10n_us_partner_legal_number.field_res_users__legal_id_number +msgid "Legal ID" +msgstr "" diff --git a/l10n_us_partner_legal_number/models/__init__.py b/l10n_us_partner_legal_number/models/__init__.py new file mode 100644 index 0000000000..5315c06531 --- /dev/null +++ b/l10n_us_partner_legal_number/models/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import base +from . import res_partner diff --git a/l10n_us_partner_legal_number/models/base.py b/l10n_us_partner_legal_number/models/base.py new file mode 100644 index 0000000000..0786a7c433 --- /dev/null +++ b/l10n_us_partner_legal_number/models/base.py @@ -0,0 +1,43 @@ +from stdnum.ca import bn +from stdnum.us import ein, ssn + +from odoo import _, api, fields, models +from odoo.exceptions import UserError + + +class LegalIDNumber(models.AbstractModel): + """ + Odoo's VAT field validation prevents it from being used + for EIN / GST / SSN, etc. + + Use generic ID and apply validation depending on the Country field. + """ + + _name = "countinghouse.legal_id_number" + _description = "Counting House Legal Id Number" + + legal_id_number = fields.Char( + string="Legal ID", + required=False, + help="""For US entities, enter valid EIN or Social Security Number. + Canadian entities, enter Canadian Business Number. + """, + ) + + @api.constrains("legal_id_number") + def validate_legal_id_number(self): + if not self.legal_id_number: + return + valid = False + for v in (ssn, ein, bn): + try: + v.validate(self.legal_id_number) + valid = True + break + except Exception: + continue + if not valid: + raise UserError( + _("%s is not a valid EIN / SSN / Canadian Business Number") + % self.legal_id_number + ) diff --git a/l10n_us_partner_legal_number/models/res_partner.py b/l10n_us_partner_legal_number/models/res_partner.py new file mode 100644 index 0000000000..594c720d46 --- /dev/null +++ b/l10n_us_partner_legal_number/models/res_partner.py @@ -0,0 +1,6 @@ +from odoo import models + + +class ResPartner(models.Model): + _name = "res.partner" + _inherit = ["countinghouse.legal_id_number", "res.partner"] diff --git a/l10n_us_partner_legal_number/pyproject.toml b/l10n_us_partner_legal_number/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/l10n_us_partner_legal_number/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/l10n_us_partner_legal_number/readme/CONTRIBUTORS.md b/l10n_us_partner_legal_number/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..7fc73d9ab8 --- /dev/null +++ b/l10n_us_partner_legal_number/readme/CONTRIBUTORS.md @@ -0,0 +1,4 @@ +- Chankya Soni \<\> +- Maxime Chambreuil \<\> +- Serpent Consulting Services Pvt. Ltd. \<\> +- Levent Karakas \<\> diff --git a/l10n_us_partner_legal_number/readme/DESCRIPTION.md b/l10n_us_partner_legal_number/readme/DESCRIPTION.md new file mode 100644 index 0000000000..e1a2fc53c4 --- /dev/null +++ b/l10n_us_partner_legal_number/readme/DESCRIPTION.md @@ -0,0 +1 @@ +Add Legal Number for North American Banking & Financials diff --git a/l10n_us_partner_legal_number/readme/USAGE.md b/l10n_us_partner_legal_number/readme/USAGE.md new file mode 100644 index 0000000000..b11b7ffaaa --- /dev/null +++ b/l10n_us_partner_legal_number/readme/USAGE.md @@ -0,0 +1 @@ +Add Legal Number Field diff --git a/l10n_us_partner_legal_number/static/description/icon.png b/l10n_us_partner_legal_number/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/l10n_us_partner_legal_number/static/description/index.html b/l10n_us_partner_legal_number/static/description/index.html new file mode 100644 index 0000000000..2a72cc1f53 --- /dev/null +++ b/l10n_us_partner_legal_number/static/description/index.html @@ -0,0 +1,431 @@ + + + + + +Add Legal Number for North American Banking & Financials + + + +

        + + diff --git a/l10n_us_partner_legal_number/views/res_partner.xml b/l10n_us_partner_legal_number/views/res_partner.xml new file mode 100644 index 0000000000..251faec0ab --- /dev/null +++ b/l10n_us_partner_legal_number/views/res_partner.xml @@ -0,0 +1,13 @@ + + + + Partner Legal ID Number + res.partner + + + + + + + + diff --git a/mgmtsystem_action/i18n/sv.po b/mgmtsystem_action/i18n/sv.po index fa470fdf22..944c2c0d75 100644 --- a/mgmtsystem_action/i18n/sv.po +++ b/mgmtsystem_action/i18n/sv.po @@ -9,14 +9,15 @@ msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-15 18:09+0000\n" -"PO-Revision-Date: 2018-01-15 18:09+0000\n" -"Last-Translator: OCA Transbot , 2018\n" +"PO-Revision-Date: 2024-11-27 14:58+0000\n" +"Last-Translator: jakobkrabbe \n" "Language-Team: Swedish (https://www.transifex.com/oca/teams/23907/sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" #. module: mgmtsystem_action #: model:mail.template,body_html:mgmtsystem_action.action_email_template_reminder_action @@ -42,6 +43,26 @@ msgid "" " \n" " " msgstr "" +"\n" +" \n" +"

        Hej ,

        \n" +"\n" +"

        \n" +"Detta är ett automatiserat meddelande för att påminna dig om att\n" +"följande åtgärd ska slutföras inom 10 dagar ():\n" +"\n" +"\n" +"

        \n" +"\n" +"

        \n" +"Tack och ha en trevlig dag.
        \n" +"--
        \n" +"Odoo\n" +"

        \n" +" \n" +" " #. module: mgmtsystem_action #: model:mail.template,body_html:mgmtsystem_action.email_template_new_action_reminder @@ -64,48 +85,65 @@ msgid "" " \n" " " msgstr "" +"\n" +" \n" +"

        Hej ,

        \n" +"\n" +"

        En ny åtgärd har tilldelats dig:

        \n" +"

        Slutdatum:

        \n" +"\n" +"

        Använd handlingsstegen och meddelandena för att logga framsteg.

        \n" +"\n" +"

        \n" +"Tack så mycket
        .\n" +"--
        \n" +"Odoo\n" +"

        \n" +" \n" +" " #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_report__number_of_actions msgid "# of actions" -msgstr "" +msgstr "# Antal åtgärder" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__number_of_days_to_close #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_report__number_of_days_to_close msgid "# of days to close" -msgstr "" +msgstr "# Antal dagar till stängning" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__number_of_days_to_open #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_report__number_of_days_to_open msgid "# of days to open" -msgstr "" +msgstr "# Antal dagar att öppna" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_report__number_of_exceedings_days msgid "# of exceedings days" -msgstr "" +msgstr "# Antal överskridanden dagar" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_kanban msgid "#0000ff" -msgstr "" +msgstr "#0000ff" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_kanban msgid "#00ff00" -msgstr "" +msgstr "#00ff00" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_kanban msgid "#ffa500" -msgstr "" +msgstr "#ffa500" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_kanban msgid "#ffffff" -msgstr "" +msgstr "#ffffff" #. module: mgmtsystem_action #: model:ir.model,name:mgmtsystem_action.model_mgmtsystem_action @@ -117,30 +155,27 @@ msgstr "Åtgärd" #. module: mgmtsystem_action #: model:mail.template,name:mgmtsystem_action.email_template_new_action_reminder msgid "Action Assigned" -msgstr "" +msgstr "Åtgärd Tilldelad" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__message_needaction -#, fuzzy msgid "Action Needed" -msgstr "Åtgärd" +msgstr "Åtgärd behövs" #. module: mgmtsystem_action #: model:ir.model,name:mgmtsystem_action.model_mgmtsystem_action_stage -#, fuzzy msgid "Action Stage" -msgstr "Åtgärd" +msgstr "Åtgärds steg" #. module: mgmtsystem_action #: model:ir.model,name:mgmtsystem_action.model_mgmtsystem_action_tag -#, fuzzy msgid "Action Tags" -msgstr "Åtgärder" +msgstr "Åtgärdstaggar" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_form msgid "Action title..." -msgstr "" +msgstr "Handlingens titel..." #. module: mgmtsystem_action #: model:ir.actions.act_window,name:mgmtsystem_action.open_mgmtsystem_action_list @@ -155,64 +190,62 @@ msgstr "Åtgärder" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__active msgid "Active" -msgstr "" +msgstr "Aktiv" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__activity_ids msgid "Activities" -msgstr "" +msgstr "Aktiviteter" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__activity_exception_decoration msgid "Activity Exception Decoration" -msgstr "" +msgstr "Aktivitet Undantag Dekoration" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__activity_state -#, fuzzy msgid "Activity State" -msgstr "Åtgärd" +msgstr "Åtgärdstillstånd" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__activity_type_icon msgid "Activity Type Icon" -msgstr "" +msgstr "Aktivitetstyp Ikon" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_stage_form -#, fuzzy msgid "Add a description..." -msgstr "Beskrivnig" +msgstr "Lägg till en beskrivning..." #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_report__age msgid "Age" -msgstr "" +msgstr "Ålder" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_filter msgid "Archived" -msgstr "" +msgstr "Arkiverad" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__message_attachment_count msgid "Attachment Count" -msgstr "" +msgstr "Antal bifogade filer" #. module: mgmtsystem_action #: model:mgmtsystem.action.stage,name:mgmtsystem_action.stage_cancel msgid "Cancelled" -msgstr "" +msgstr "Avbruten" #. module: mgmtsystem_action #: model_terms:ir.actions.act_window,help:mgmtsystem_action.project_tags_action msgid "Click to add a new tag." -msgstr "" +msgstr "Klicka för att lägga till en ny tagg." #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_report__date_closed msgid "Close Date" -msgstr "" +msgstr "Stängningsdatum" #. module: mgmtsystem_action #: model:mgmtsystem.action.stage,name:mgmtsystem_action.stage_close @@ -222,18 +255,18 @@ msgstr "Stängd" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__date_closed msgid "Closed Date" -msgstr "" +msgstr "Stängt datum" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_tag__color msgid "Color Index" -msgstr "" +msgstr "Färgindex" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__company_id #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_filter msgid "Company" -msgstr "" +msgstr "Företag" #. module: mgmtsystem_action #: model:ir.model.fields.selection,name:mgmtsystem_action.selection__mgmtsystem_action__type_action__correction @@ -244,21 +277,21 @@ msgstr "Korrigeringsåtgärd" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_report__create_date msgid "Create Date" -msgstr "" +msgstr "Skapa datum" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__create_uid #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_stage__create_uid #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_tag__create_uid msgid "Created by" -msgstr "" +msgstr "Skapad av" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__create_date #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_stage__create_date #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_tag__create_date msgid "Created on" -msgstr "" +msgstr "Skapad på" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__date_deadline @@ -269,7 +302,7 @@ msgstr "Slutdatum" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_kanban msgid "Delete" -msgstr "" +msgstr "Radera" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__description @@ -284,77 +317,77 @@ msgstr "Beskrivnig" #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_stage__display_name #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_tag__display_name msgid "Display Name" -msgstr "" +msgstr "Visningsnamn" #. module: mgmtsystem_action #: model:mgmtsystem.action.stage,name:mgmtsystem_action.stage_draft msgid "Draft" -msgstr "" +msgstr "Utkast" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_kanban msgid "Dropdown menu" -msgstr "" +msgstr "Rullgardinsmeny" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_kanban msgid "Edit Task" -msgstr "" +msgstr "Redigera uppgift" #. module: mgmtsystem_action #: model:ir.actions.server,name:mgmtsystem_action.ir_cron_mgmtsystem_action_reminder_ir_actions_server msgid "Email Action Reminders 10 days before due date." -msgstr "" +msgstr "Påminnelser om åtgärder via e-post 10 dagar före förfallodagen." #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_stage__is_ending msgid "Ending stage" -msgstr "" +msgstr "Avslutande skede" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_form msgid "Extra Information" -msgstr "" +msgstr "Extra information" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_stage__fold msgid "Folded in Kanban" -msgstr "" +msgstr "Fälld i Kanban" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__message_follower_ids msgid "Followers" -msgstr "" +msgstr "Följare" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__message_partner_ids msgid "Followers (Partners)" -msgstr "" +msgstr "Följare (Partners)" #. module: mgmtsystem_action #: model:ir.model.fields,help:mgmtsystem_action.field_mgmtsystem_action__activity_type_icon msgid "Font awesome icon e.g. fa-tasks" -msgstr "" +msgstr "Font awesome-ikon, t.ex. fa-tasks" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_filter msgid "Future Activities" -msgstr "" +msgstr "Framtida aktiviteter" #. module: mgmtsystem_action #: model:ir.model.fields,help:mgmtsystem_action.field_mgmtsystem_action__sequence msgid "Gives the sequence order when displaying a list of actions." -msgstr "" +msgstr "Anger ordningsföljden vid visning av en lista med åtgärder." #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_filter msgid "Group By" -msgstr "" +msgstr "Grupp av" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__has_message msgid "Has Message" -msgstr "" +msgstr "Har meddelande" #. module: mgmtsystem_action #: model_terms:ir.actions.act_window,help:mgmtsystem_action.action_report_mgmtsystem_action @@ -362,6 +395,8 @@ msgid "" "Have a general overview of all actions processed in the system by sorting " "them with specific criteria." msgstr "" +"Få en allmän överblick över alla åtgärder som behandlas i systemet genom att " +"sortera dem efter specifika kriterier." #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__id @@ -374,23 +409,23 @@ msgstr "ID" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__activity_exception_icon msgid "Icon" -msgstr "" +msgstr "Ikon" #. module: mgmtsystem_action #: model:ir.model.fields,help:mgmtsystem_action.field_mgmtsystem_action__activity_exception_icon msgid "Icon to indicate an exception activity." -msgstr "" +msgstr "Ikon för att indikera en undantagsaktivitet." #. module: mgmtsystem_action #: model:ir.model.fields,help:mgmtsystem_action.field_mgmtsystem_action__message_needaction msgid "If checked, new messages require your attention." -msgstr "" +msgstr "Om den är markerad kräver nya meddelanden din uppmärksamhet." #. module: mgmtsystem_action #: model:ir.model.fields,help:mgmtsystem_action.field_mgmtsystem_action__message_has_error #: model:ir.model.fields,help:mgmtsystem_action.field_mgmtsystem_action__message_has_sms_error msgid "If checked, some messages have a delivery error." -msgstr "" +msgstr "Om kryssrutan är markerad får vissa meddelanden ett leveransfel." #. module: mgmtsystem_action #: model:ir.model.fields.selection,name:mgmtsystem_action.selection__mgmtsystem_action__type_action__immediate @@ -407,140 +442,139 @@ msgstr "Förbättringsmöjlighet" #. module: mgmtsystem_action #: model:mgmtsystem.action.stage,name:mgmtsystem_action.stage_open msgid "In Progress" -msgstr "" +msgstr "Pågående" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__message_is_follower msgid "Is Follower" -msgstr "" +msgstr "Är följare" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__write_uid #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_stage__write_uid #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_tag__write_uid msgid "Last Updated by" -msgstr "" +msgstr "Senast uppdaterad av" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__write_date #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_stage__write_date #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_tag__write_date msgid "Last Updated on" -msgstr "" +msgstr "Senast uppdaterad den" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_filter msgid "Late Activities" -msgstr "" +msgstr "Sena aktiviteter" #. module: mgmtsystem_action #: model:ir.model.fields.selection,name:mgmtsystem_action.selection__mgmtsystem_action__priority__0 msgid "Low" -msgstr "" +msgstr "Låg" #. module: mgmtsystem_action #: model:ir.model,name:mgmtsystem_action.model_mgmtsystem_action_report msgid "Management System Action Report" -msgstr "" +msgstr "Rapport om åtgärder för ledningssystemet" #. module: mgmtsystem_action #: model:ir.actions.act_window,name:mgmtsystem_action.action_report_mgmtsystem_action msgid "Management System Analysis" -msgstr "" +msgstr "Analys av ledningssystem" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__message_has_error msgid "Message Delivery error" -msgstr "" +msgstr "Fel vid leverans av meddelande" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__message_ids msgid "Messages" -msgstr "" +msgstr "Meddelanden" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_filter -#, fuzzy msgid "My Actions" -msgstr "Åtgärder" +msgstr "Mina åtgärder" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_filter msgid "My Activities" -msgstr "" +msgstr "Mina aktiviteter" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__my_activity_date_deadline msgid "My Activity Deadline" -msgstr "" +msgstr "Min aktivitet Deadline" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_filter msgid "My Followed Actions" -msgstr "" +msgstr "Mina följda åtgärder" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_tag__name msgid "Name" -msgstr "" +msgstr "Namn" #. module: mgmtsystem_action #. odoo-python #: code:addons/mgmtsystem_action/models/mgmtsystem_action.py:0 #, python-format msgid "New" -msgstr "" +msgstr "Ny" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__activity_date_deadline msgid "Next Activity Deadline" -msgstr "" +msgstr "Deadline för nästa aktivitet" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__activity_summary msgid "Next Activity Summary" -msgstr "" +msgstr "Nästa aktivitetsöversikt" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__activity_type_id msgid "Next Activity Type" -msgstr "" +msgstr "Nästa aktivitetstyp" #. module: mgmtsystem_action #: model:ir.model.fields.selection,name:mgmtsystem_action.selection__mgmtsystem_action__priority__1 msgid "Normal" -msgstr "" +msgstr "Normal" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__message_needaction_counter msgid "Number of Actions" -msgstr "" +msgstr "Antal åtgärder" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__message_has_error_counter msgid "Number of errors" -msgstr "" +msgstr "Antal fel" #. module: mgmtsystem_action #: model:ir.model.fields,help:mgmtsystem_action.field_mgmtsystem_action__message_needaction_counter msgid "Number of messages requiring action" -msgstr "" +msgstr "Antal meddelanden som kräver åtgärder" #. module: mgmtsystem_action #: model:ir.model.fields,help:mgmtsystem_action.field_mgmtsystem_action__message_has_error_counter msgid "Number of messages with delivery error" -msgstr "" +msgstr "Antal meddelanden med leveransfel" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__date_open #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_report__date_open msgid "Opening Date" -msgstr "" +msgstr "Öppningsdatum" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_filter msgid "Pending" -msgstr "" +msgstr "Avvaktande" #. module: mgmtsystem_action #: model:ir.model.fields.selection,name:mgmtsystem_action.selection__mgmtsystem_action__type_action__prevention @@ -551,7 +585,7 @@ msgstr "Förebyggande Åtgärd" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__priority msgid "Priority" -msgstr "" +msgstr "Prioritet" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__reference @@ -561,18 +595,18 @@ msgstr "Referens" #. module: mgmtsystem_action #: model:mail.template,subject:mgmtsystem_action.action_email_template_reminder_action msgid "Reminder on Action: \"{{object.name}}\"" -msgstr "" +msgstr "Påminnelse om åtgärd: \"{{object.name}}\"" #. module: mgmtsystem_action #: model:mail.template,name:mgmtsystem_action.action_email_template_reminder_action msgid "Reminder to Responsible" -msgstr "" +msgstr "Påminnelse till ansvarig" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__type_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_report__type_action msgid "Response Type" -msgstr "" +msgstr "Typ av svar" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__user_id @@ -581,21 +615,20 @@ msgstr "Ansvarig" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__activity_user_id -#, fuzzy msgid "Responsible User" -msgstr "Ansvarig" +msgstr "Ansvarig användare" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__message_has_sms_error msgid "SMS Delivery error" -msgstr "" +msgstr "Fel vid leverans av SMS" #. module: mgmtsystem_action #. odoo-python #: code:addons/mgmtsystem_action/tests/test_create_action.py:0 #, python-format msgid "SampleReference" -msgstr "" +msgstr "ExempelReference" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__sequence @@ -606,7 +639,7 @@ msgstr "Sekvens" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_filter msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "Visa alla poster som har nästa åtgärdsdatum före idag" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__stage_id @@ -618,18 +651,18 @@ msgstr "Läge" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_stage__name msgid "Stage Name" -msgstr "" +msgstr "Scenens namn" #. module: mgmtsystem_action #: model:ir.actions.act_window,name:mgmtsystem_action.mgmtsystem_action_stage_action #: model:ir.ui.menu,name:mgmtsystem_action.menu_mgmtsystem_action_stages msgid "Stages" -msgstr "" +msgstr "Stadier" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_stage__is_starting msgid "Starting stage" -msgstr "" +msgstr "Startfas" #. module: mgmtsystem_action #: model:ir.model.fields,help:mgmtsystem_action.field_mgmtsystem_action__activity_state @@ -639,22 +672,26 @@ msgid "" "Today: Activity date is today\n" "Planned: Future activities." msgstr "" +"Status baserad på aktiviteter\n" +"Försenad: Förfallodatumet har redan passerats\n" +"Idag: Aktivitetsdatumet är idag\n" +"Planerad: Framtida aktiviteter." #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__name msgid "Subject" -msgstr "" +msgstr "Ämne" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action__system_id #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_report__system_id msgid "System" -msgstr "" +msgstr "System" #. module: mgmtsystem_action #: model:ir.model.constraint,message:mgmtsystem_action.constraint_mgmtsystem_action_tag_name_uniq msgid "Tag name already exists !" -msgstr "" +msgstr "Taggens namn finns redan!" #. module: mgmtsystem_action #: model:ir.actions.act_window,name:mgmtsystem_action.mgmtsystem_action_tag_action @@ -663,13 +700,12 @@ msgstr "" #: model:ir.ui.menu,name:mgmtsystem_action.menu_mgmtsystem_action_tags #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.project_tags_form_view msgid "Tags" -msgstr "" +msgstr "Etiketter" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_stage_form -#, fuzzy msgid "Task Stage" -msgstr "Läge" +msgstr "Uppgiftsstadiet" #. module: mgmtsystem_action #: model:ir.model.fields,help:mgmtsystem_action.field_mgmtsystem_action_stage__fold @@ -677,11 +713,13 @@ msgid "" "This stage is folded in the kanban view when there are no records in that " "stage to display." msgstr "" +"Detta steg viks i kanbanvyn när det inte finns några poster i det steget att " +"visa." #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_filter msgid "Today Activities" -msgstr "" +msgstr "Aktiviteter idag" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_filter @@ -691,13 +729,13 @@ msgstr "Typ" #. module: mgmtsystem_action #: model:ir.model.fields,help:mgmtsystem_action.field_mgmtsystem_action__activity_exception_decoration msgid "Type of the exception activity on record." -msgstr "" +msgstr "Typ av undantagsaktivitet som registreras." #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_filter #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_kanban msgid "Unread Messages" -msgstr "" +msgstr "Olästa meddelanden" #. module: mgmtsystem_action #: model:ir.model.fields,field_description:mgmtsystem_action.field_mgmtsystem_action_report__user_id @@ -710,14 +748,14 @@ msgstr "Användare" #: code:addons/mgmtsystem_action/models/mgmtsystem_action.py:0 #, python-format msgid "We cannot bring back the action to draft stage" -msgstr "" +msgstr "Vi kan inte föra tillbaka handlingen till utkaststadiet" #. module: mgmtsystem_action #: model_terms:ir.ui.view,arch_db:mgmtsystem_action.view_mgmtsystem_action_kanban msgid "oe_kanban_text_red" -msgstr "" +msgstr "oe_kanban_text_röd" #. module: mgmtsystem_action #: model:mail.template,subject:mgmtsystem_action.email_template_new_action_reminder msgid "{{object.name}}" -msgstr "" +msgstr "{{object.name}}" diff --git a/mgmtsystem_audit/i18n/sv.po b/mgmtsystem_audit/i18n/sv.po index dcc7cb8233..b1a4d630b6 100644 --- a/mgmtsystem_audit/i18n/sv.po +++ b/mgmtsystem_audit/i18n/sv.po @@ -9,14 +9,15 @@ msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-15 18:09+0000\n" -"PO-Revision-Date: 2018-01-15 18:09+0000\n" -"Last-Translator: OCA Transbot , 2018\n" +"PO-Revision-Date: 2024-11-27 14:58+0000\n" +"Last-Translator: jakobkrabbe \n" "Language-Team: Swedish (https://www.transifex.com/oca/teams/23907/sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" #. module: mgmtsystem_audit #: model:mail.template,body_html:mgmtsystem_audit.template_email_send_verification_list @@ -40,6 +41,24 @@ msgid "" " \n" " " msgstr "" +"\n" +" \n" +"

        Hej!

        \n" +"\n" +"

        \n" +"Gransningen är planerad till 1 vecka.\n" +"Vänligen avsluta verifieringslistan och skicka den till de granskade:\n" +"\n" +"Länk\n" +"

        \n" +"\n" +"

        \n" +"Vänligen.\n" +"--\n" +"Odoo\n" +"

        \n" +" \n" +" " #. module: mgmtsystem_audit #: model:mail.template,body_html:mgmtsystem_audit.template_email_prepare_to_audit @@ -63,76 +82,94 @@ msgid "" " \n" " " msgstr "" +"\n" +" \n" +"

        Hej!

        \n" +"\n" +"

        \n" +"Gransningen är planerad till 2 veckor.\n" +"Vänligen avsluta verifieringslistan:\n" +"\n" +"Länk\n" +"

        \n" +"\n" +"

        \n" +"Vänligen.\n" +"--\n" +"Odoo\n" +"

        \n" +" \n" +" " #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__number_of_audits msgid "# of audits" -msgstr "" +msgstr "antal granskningar" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__number_of_days_to_close msgid "# of days to close" -msgstr "" +msgstr "antal dagar att stänga" #. module: mgmtsystem_audit #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.audit_report msgid "Audit Report" -msgstr "" +msgstr "Granskningsrapport" #. module: mgmtsystem_audit #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.audit_report msgid "Improvement opportunities:" -msgstr "" +msgstr "Förbättringsmöjligheter:" #. module: mgmtsystem_audit #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.audit_report msgid "Nonconformities:" -msgstr "" +msgstr "Avvikelser:" #. module: mgmtsystem_audit #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.audit_report msgid "Points To Improve:" -msgstr "" +msgstr "Poäng att förbättra:" #. module: mgmtsystem_audit #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.audit_report msgid "Strong points:" -msgstr "" +msgstr "Starka poäng:" #. module: mgmtsystem_audit #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.verification_report msgid "Verification List" -msgstr "" +msgstr "Verifieringslista" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__message_needaction msgid "Action Needed" -msgstr "" +msgstr "Åtgärd behövs" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__activity_ids msgid "Activities" -msgstr "" +msgstr "Aktiviteter" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__activity_exception_decoration msgid "Activity Exception Decoration" -msgstr "" +msgstr "Aktivitet Undantagsdekoration" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__activity_state msgid "Activity State" -msgstr "" +msgstr "Aktivitetsläge" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__activity_type_icon msgid "Activity Type Icon" -msgstr "" +msgstr "Ikon för aktivitetstyp" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__message_attachment_count msgid "Attachment Count" -msgstr "" +msgstr "Antal bilagor" #. module: mgmtsystem_audit #: model:ir.model,name:mgmtsystem_audit.model_mgmtsystem_audit @@ -147,19 +184,19 @@ msgstr "Revision" #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__user_id #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.view_mgmtsystem_audit_form msgid "Audit Manager" -msgstr "" +msgstr "Revisionschef" #. module: mgmtsystem_audit #. odoo-python #: code:addons/mgmtsystem_audit/models/mgmtsystem_audit.py:0 #, python-format msgid "Audit closed" -msgstr "" +msgstr "Granskning stängd" #. module: mgmtsystem_audit #: model:ir.actions.report,name:mgmtsystem_audit.audit_report_mgmtsystem_audit msgid "Audit report" -msgstr "" +msgstr "Revisionsberättelse" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__auditee_user_ids @@ -212,12 +249,12 @@ msgstr "Stängd" #. module: mgmtsystem_audit #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.view_mgmtsystem_audit_filter msgid "Closed Audits" -msgstr "" +msgstr "Avslutade revisioner" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__closing_date msgid "Closing Date" -msgstr "" +msgstr "Slutdatum" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_verification_line__comments @@ -229,17 +266,17 @@ msgstr "Kommentarer" #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__company_id #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_verification_line__company_id msgid "Company" -msgstr "" +msgstr "Bolag" #. module: mgmtsystem_audit #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.verification_report msgid "Confidentiality:" -msgstr "" +msgstr "Sekretess:" #. module: mgmtsystem_audit #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.audit_report msgid "Confidentially:" -msgstr "" +msgstr "Konfidentiellt:" #. module: mgmtsystem_audit #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.verification_report @@ -258,14 +295,14 @@ msgstr "Kopiera Verifieringsrader" #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__create_uid #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_verification_line__create_uid msgid "Created by" -msgstr "" +msgstr "Skapad av" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_copy_verification_lines__create_date #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__create_date #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_verification_line__create_date msgid "Created on" -msgstr "" +msgstr "Skapat den" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__date @@ -281,44 +318,44 @@ msgstr "Datum:" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__days_since_last_update msgid "Days Since Last Update" -msgstr "" +msgstr "Dagar sedan senaste uppdatering" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_copy_verification_lines__display_name #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__display_name #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_verification_line__display_name msgid "Display Name" -msgstr "" +msgstr "Visningsnamn" #. module: mgmtsystem_audit #: model:base.automation,name:mgmtsystem_audit.rule_set_prepare_to_audit msgid "Email all auditors 2 weeks before audit." -msgstr "" +msgstr "Mejla alla revisorer 2 veckor före revision." #. module: mgmtsystem_audit #: model:base.automation,name:mgmtsystem_audit.rule_set_send_verification_list msgid "Email all followers 1 week before audit." -msgstr "" +msgstr "Mejla alla följare 1 vecka före revision." #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__message_follower_ids msgid "Followers" -msgstr "" +msgstr "Följare" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__message_partner_ids msgid "Followers (Partners)" -msgstr "" +msgstr "Följare (partners)" #. module: mgmtsystem_audit #: model:ir.model.fields,help:mgmtsystem_audit.field_mgmtsystem_audit__activity_type_icon msgid "Font awesome icon e.g. fa-tasks" -msgstr "" +msgstr "Typsnitt fantastisk ikon t.ex. fa-tasks" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__has_message msgid "Has Message" -msgstr "" +msgstr "Har meddelande" #. module: mgmtsystem_audit #: model_terms:ir.actions.act_window,help:mgmtsystem_audit.action_report_mgmtsystem_audit @@ -326,6 +363,8 @@ msgid "" "Have a general overview of all audits processed in the system by sorting " "them with specific criteria." msgstr "" +"Ha en allmän översikt över alla revisioner som behandlas i systemet genom " +"att sortera dem med specifika kriterier." #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_copy_verification_lines__id @@ -337,23 +376,23 @@ msgstr "ID" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__activity_exception_icon msgid "Icon" -msgstr "" +msgstr "Ikon" #. module: mgmtsystem_audit #: model:ir.model.fields,help:mgmtsystem_audit.field_mgmtsystem_audit__activity_exception_icon msgid "Icon to indicate an exception activity." -msgstr "" +msgstr "Ikon för att indikera en undantagsaktivitet." #. module: mgmtsystem_audit #: model:ir.model.fields,help:mgmtsystem_audit.field_mgmtsystem_audit__message_needaction msgid "If checked, new messages require your attention." -msgstr "" +msgstr "Om markerad, nya meddelanden kräver din uppmärksamhet." #. module: mgmtsystem_audit #: model:ir.model.fields,help:mgmtsystem_audit.field_mgmtsystem_audit__message_has_error #: model:ir.model.fields,help:mgmtsystem_audit.field_mgmtsystem_audit__message_has_sms_error msgid "If checked, some messages have a delivery error." -msgstr "" +msgstr "Om markerat, vissa meddelanden har ett leveransfel." #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__imp_opp_ids @@ -365,51 +404,51 @@ msgstr "Förbättringsmöjligheter" #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.audit_report #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.verification_report msgid "Internal" -msgstr "" +msgstr "Inre" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_verification_line__is_conformed msgid "Is Conformed" -msgstr "" +msgstr "Är bekräftad" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__message_is_follower msgid "Is Follower" -msgstr "" +msgstr "Är följare" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_copy_verification_lines__write_uid #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__write_uid #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_verification_line__write_uid msgid "Last Updated by" -msgstr "" +msgstr "Senast uppdaterad av" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_copy_verification_lines__write_date #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__write_date #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_verification_line__write_date msgid "Last Updated on" -msgstr "" +msgstr "Senast uppdaterad den" #. module: mgmtsystem_audit #: model:ir.actions.act_window,name:mgmtsystem_audit.action_report_mgmtsystem_audit msgid "Management System Audit Analysis" -msgstr "" +msgstr "Management System revisionsanalys" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__message_has_error msgid "Message Delivery error" -msgstr "" +msgstr "Meddelande leveransfel" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__message_ids msgid "Messages" -msgstr "" +msgstr "Meddelande" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__my_activity_date_deadline msgid "My Activity Deadline" -msgstr "" +msgstr "Återkoppling för min aktivitet" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__name @@ -419,27 +458,27 @@ msgstr "Namn" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__activity_date_deadline msgid "Next Activity Deadline" -msgstr "" +msgstr "Återkoppling för nästa aktivitet" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__activity_summary msgid "Next Activity Summary" -msgstr "" +msgstr "Nästa aktivitetssammanfattning" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__activity_type_id msgid "Next Activity Type" -msgstr "" +msgstr "Nästa aktivitetstyp" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__non_conformity_ids msgid "Non Conformity" -msgstr "" +msgstr "Icke överensstämmelse" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__non_conformity_count msgid "Non Conformity Count" -msgstr "" +msgstr "Antal avvikelser" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__nonconformity_ids @@ -455,37 +494,37 @@ msgstr "Avvikelse" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__number_of_nonconformities msgid "Number Of Nonconformities" -msgstr "" +msgstr "Antal avvikelser" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__number_of_questions_in_verification_list msgid "Number Of Questions In Verification List" -msgstr "" +msgstr "Antal frågor i verifieringslistan" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__message_needaction_counter msgid "Number of Actions" -msgstr "" +msgstr "Antal åtgärder" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__message_has_error_counter msgid "Number of errors" -msgstr "" +msgstr "Antal fel" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__number_of_improvements_opportunity msgid "Number of improvements Opportunities" -msgstr "" +msgstr "Antal förbättringsmöjligheter" #. module: mgmtsystem_audit #: model:ir.model.fields,help:mgmtsystem_audit.field_mgmtsystem_audit__message_needaction_counter msgid "Number of messages requiring action" -msgstr "" +msgstr "Antal meddelanden som kräver åtgärd" #. module: mgmtsystem_audit #: model:ir.model.fields,help:mgmtsystem_audit.field_mgmtsystem_audit__message_has_error_counter msgid "Number of messages with delivery error" -msgstr "" +msgstr "Antal meddelanden med leveransfel" #. module: mgmtsystem_audit #: model:ir.model.fields.selection,name:mgmtsystem_audit.selection__mgmtsystem_audit__state__open @@ -506,12 +545,12 @@ msgstr "Punkter att Förbättra" #. module: mgmtsystem_audit #: model:mail.template,subject:mgmtsystem_audit.template_email_prepare_to_audit msgid "Prepare to Audit: \"{{object.name}}\"" -msgstr "" +msgstr "Förbered för granskning: \"{{object.name}}\"" #. module: mgmtsystem_audit #: model:mail.template,name:mgmtsystem_audit.template_email_prepare_to_audit msgid "Prepare to audit" -msgstr "" +msgstr "Förbered för granskning" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_verification_line__procedure_id @@ -533,33 +572,33 @@ msgstr "Referens" #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.audit_report #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.verification_report msgid "Reference:" -msgstr "Referens" +msgstr "Referens:" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_nonconformity__audit_ids #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.view_mgmtsystem_nonconformity_form msgid "Related Audits" -msgstr "" +msgstr "Relaterade revisioner" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__activity_user_id msgid "Responsible User" -msgstr "" +msgstr "Ansvarig användare" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__message_has_sms_error msgid "SMS Delivery error" -msgstr "" +msgstr "SMS leveransfel" #. module: mgmtsystem_audit #: model:mail.template,name:mgmtsystem_audit.template_email_send_verification_list msgid "Send Verification List" -msgstr "" +msgstr "Skicka verifieringslista" #. module: mgmtsystem_audit #: model:mail.template,subject:mgmtsystem_audit.template_email_send_verification_list msgid "Send Verification List: \"{{object.name}}\"" -msgstr "" +msgstr "Skicka verifieringslista: \"{{object.name}}\"" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_verification_line__seq @@ -579,6 +618,10 @@ msgid "" "Today: Activity date is today\n" "Planned: Future activities." msgstr "" +"Status baserad på aktiviteter\n" +"Försenad: Förfallodatumet är redan passerat\n" +"Idag: Aktivitetsdatum är idag\n" +"Planerad: Framtida aktiviteter." #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__strong_points @@ -589,7 +632,7 @@ msgstr "Starka punkter" #. module: mgmtsystem_audit #: model:ir.model.fields,field_description:mgmtsystem_audit.field_mgmtsystem_audit__system_id msgid "System" -msgstr "" +msgstr "System" #. module: mgmtsystem_audit #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.view_mgmtsystem_audit_form @@ -599,14 +642,14 @@ msgstr "Att Förbättra Poäng" #. module: mgmtsystem_audit #: model:ir.model.fields,help:mgmtsystem_audit.field_mgmtsystem_audit__activity_exception_decoration msgid "Type of the exception activity on record." -msgstr "" +msgstr "Typ av undantagsaktivitet som registrerats." #. module: mgmtsystem_audit #. odoo-python #: code:addons/mgmtsystem_audit/models/mgmtsystem_audit.py:0 #, python-format msgid "Undefined" -msgstr "" +msgstr "Odefinierad" #. module: mgmtsystem_audit #: model:ir.model,name:mgmtsystem_audit.model_mgmtsystem_verification_line @@ -629,7 +672,7 @@ msgstr "VerifieringsLista" #. module: mgmtsystem_audit #: model:ir.actions.report,name:mgmtsystem_audit.verification_report_mgmtsystem_audit msgid "Verification list report" -msgstr "" +msgstr "Verifieringslista rapport" #. module: mgmtsystem_audit #: model_terms:ir.ui.view,arch_db:mgmtsystem_audit.copy_verification_lines_form_view diff --git a/mgmtsystem_manual/i18n/sv.po b/mgmtsystem_manual/i18n/sv.po index 01eee2f0b8..e28a94bf23 100644 --- a/mgmtsystem_manual/i18n/sv.po +++ b/mgmtsystem_manual/i18n/sv.po @@ -9,25 +9,26 @@ msgstr "" "Project-Id-Version: management-system (9.0)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-03-05 01:40+0000\n" -"PO-Revision-Date: 2016-03-04 19:39+0000\n" -"Last-Translator: OCA Transbot \n" -"Language-Team: Swedish (http://www.transifex.com/oca/OCA-management-" -"system-9-0/language/sv/)\n" +"PO-Revision-Date: 2024-11-27 14:58+0000\n" +"Last-Translator: jakobkrabbe \n" +"Language-Team: Swedish (http://www.transifex.com/oca/" +"OCA-management-system-9-0/language/sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" #. module: mgmtsystem_manual #: model:ir.ui.menu,name:mgmtsystem_manual.menu_mgmtsystem_categories msgid "Categories" -msgstr "" +msgstr "Kategorier" #. module: mgmtsystem_manual #: model:ir.model.fields,field_description:mgmtsystem_manual.field_mgmtsystem_system__manual_id msgid "Manual" -msgstr "" +msgstr "Manual" #. module: mgmtsystem_manual #: model:ir.actions.act_window,name:mgmtsystem_manual.action_manuals @@ -43,4 +44,4 @@ msgstr "Manualer för ditt Ledningssystem." #. module: mgmtsystem_manual #: model:ir.model,name:mgmtsystem_manual.model_mgmtsystem_system msgid "System" -msgstr "" +msgstr "System" diff --git a/mgmtsystem_review/i18n/sv.po b/mgmtsystem_review/i18n/sv.po index dcfc50b3af..6b29269862 100644 --- a/mgmtsystem_review/i18n/sv.po +++ b/mgmtsystem_review/i18n/sv.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-17 02:42+0000\n" -"PO-Revision-Date: 2024-09-11 10:06+0000\n" +"PO-Revision-Date: 2024-11-27 14:58+0000\n" "Last-Translator: jakobkrabbe \n" "Language-Team: Swedish (https://www.transifex.com/oca/teams/23907/sv/)\n" "Language: sv\n" @@ -422,7 +422,7 @@ msgstr "Granskningar" #. module: mgmtsystem_review #: model:ir.model.fields,field_description:mgmtsystem_review.field_mgmtsystem_review__message_has_sms_error msgid "SMS Delivery error" -msgstr "" +msgstr "SMS Leveransfel" #. module: mgmtsystem_review #: model:ir.model.fields,field_description:mgmtsystem_review.field_mgmtsystem_review__state diff --git a/mrp_multi_level/README.rst b/mrp_multi_level/README.rst index cd9011f803..e53f3f1b9d 100644 --- a/mrp_multi_level/README.rst +++ b/mrp_multi_level/README.rst @@ -7,7 +7,7 @@ MRP Multi Level !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:14bcb1aa2b225a613ba9c2b4e4270818dc513683cfb0739d3335449d4719d444 + !! source digest: sha256:8077fdbc72076d571034b0fddd5c3c1e1c042fd46053a72224baa2e0c82e4d5c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png @@ -38,16 +38,16 @@ and explodes this down to the lowest level. Key Features ------------ -- MRP parameters set by product variant MRP area pairs. -- Cron job to calculate the MRP demand. -- Manually calculate the MRP demand. -- Confirm the calculated MRP demand and create PO's, or MO's. -- Able to see the products for which action is needed throught Planned - Orders. -- Integration with `Stock Demand - Estimates `__ - system. Note: You need to install `mrp_multi_level_estimate - module `__. +- MRP parameters set by product variant MRP area pairs. +- Cron job to calculate the MRP demand. +- Manually calculate the MRP demand. +- Confirm the calculated MRP demand and create PO's, or MO's. +- Able to see the products for which action is needed throught Planned + Orders. +- Integration with `Stock Demand + Estimates `__ + system. Note: You need to install `mrp_multi_level_estimate + module `__. **Table of contents** @@ -60,14 +60,14 @@ Configuration MRP Areas --------- -- Go to *Manufacturing > Configuration > MRP Areas* and define or edit - any existing area. You can specify the working hours for every area. +- Go to *Manufacturing > Configuration > MRP Areas* and define or edit + any existing area. You can specify the working hours for every area. Product MRP Area Parameters --------------------------- -- Go to *Manufacturing > Master Data > Product MRP Area Parameters* and - set the MRP parameters for a given product and area. +- Go to *Manufacturing > Master Data > Product MRP Area Parameters* and + set the MRP parameters for a given product and area. Usage ===== @@ -93,124 +93,123 @@ Changelog **Features** -- Show *Run MRP Multi Level* menu only to a specific new security group - *Run MRP Manually*. - (`#492 `__) +- Show *Run MRP Multi Level* menu only to a specific new security group + *Run MRP Manually*. + (`#492 `__) 13.0.1.4.0 (2020-03-26) ----------------------- - - Add menu entry for planned orders - - Add button to navigate from planned orders to linked manufacturing - orders - - Add action to convert planned orders to fixed - - When changing the due date in a planned order the release date is - recomputed + - Add menu entry for planned orders + - Add button to navigate from planned orders to linked manufacturing + orders + - Add action to convert planned orders to fixed + - When changing the due date in a planned order the release date is + recomputed 13.0.1.3.0 (2020-03-02) ----------------------- -- [IMP] Minor changes" - (`#470 `__). +- [IMP] Minor changes" + (`#470 `__). - - Planned Order release and due date become required. - - Add button to Product MRP Area to update MOQ from Supplier Info. - - Link Manufacturing Orders with Planned Orders. - - Allow Mrp Inventory Procure Wizard to be used from other models. - - Make MRP Inventory creation more extensible. - - Main Supplier computation (v13 requires explicit False - definitions) + - Planned Order release and due date become required. + - Add button to Product MRP Area to update MOQ from Supplier Info. + - Link Manufacturing Orders with Planned Orders. + - Allow Mrp Inventory Procure Wizard to be used from other models. + - Make MRP Inventory creation more extensible. + - Main Supplier computation (v13 requires explicit False definitions) 13.0.1.2.0 (2020-02-20) ----------------------- -- [IMP] Minor changes - (`#468 `__). +- [IMP] Minor changes + (`#468 `__). - - Planned Orders become fixed on manual creation by default - - Released Quantity becomes readonly - - Add product reference if Planned Order name is not defined on bom - explosion + - Planned Orders become fixed on manual creation by default + - Released Quantity becomes readonly + - Add product reference if Planned Order name is not defined on bom + explosion 13.0.1.1.0 (2020-02-21) ----------------------- -- [FIX] Minor changes - (`#469 `__). +- [FIX] Minor changes + (`#469 `__). - - Fix Main supplier computation in multi company - - Drop Triplicated field in search view + - Fix Main supplier computation in multi company + - Drop Triplicated field in search view -- [IMP] Minor changes - (`#463 `__). +- [IMP] Minor changes + (`#463 `__). - - Show supply method on MRP Inventory - - Allow no-MRP users to look into Products + - Show supply method on MRP Inventory + - Allow no-MRP users to look into Products 13.0.1.0.0 (2019-12-18) ----------------------- -- [MIG] Migration to v13. +- [MIG] Migration to v13. 12.0.1.0.0 (2019-08-05) ----------------------- -- [MIG] Migration to v12: +- [MIG] Migration to v12: - - Estimates as a forecasting mechanism is moved to a new module - (mrp_multi_level_estimate). + - Estimates as a forecasting mechanism is moved to a new module + (mrp_multi_level_estimate). 11.0.3.0.0 (2019-05-22) ----------------------- -- [REW/IMP] Rework to include Planned Orders. - (`#365 `__). -- [IMP] Able to procure from a different location than the area's - location. +- [REW/IMP] Rework to include Planned Orders. + (`#365 `__). +- [IMP] Able to procure from a different location than the area's + location. 11.0.2.2.0 (2019-05-02) ----------------------- -- [IMP] Able to run MRP only for selected areas. - (`#360 `__). +- [IMP] Able to run MRP only for selected areas. + (`#360 `__). 11.0.2.1.0 (2019-04-02) ----------------------- -- [IMP] Implement *Nbr. Days* functionality to be able to group demand - when generating supply proposals. - (`#345 `__). +- [IMP] Implement *Nbr. Days* functionality to be able to group demand + when generating supply proposals. + (`#345 `__). 11.0.2.0.0 (2018-11-20) ----------------------- -- [REW] Refactor MRP Area. - (`#322 `__): +- [REW] Refactor MRP Area. + (`#322 `__): - - MRP product concept dropped in favor of *Product MRP Area - Parameters*. This allow to set different MRP parameters for the - same product in different areas. - - Menu items reordering. + - MRP product concept dropped in favor of *Product MRP Area + Parameters*. This allow to set different MRP parameters for the same + product in different areas. + - Menu items reordering. 11.0.1.1.0 (2018-08-30) ----------------------- -- [FIX] Consider *Qty Multiple* on product to propose the quantity to - procure. (`#297 `__) +- [FIX] Consider *Qty Multiple* on product to propose the quantity to + procure. (`#297 `__) 11.0.1.0.1 (2018-08-03) ----------------------- -- [FIX] User and system locales doesn't break MRP calculation. - (`#290 `__) -- [FIX] Working Hours are now defined only at Warehouse level and - displayed as a related on MRP Areas. - (`#290 `__) +- [FIX] User and system locales doesn't break MRP calculation. + (`#290 `__) +- [FIX] Working Hours are now defined only at Warehouse level and + displayed as a related on MRP Areas. + (`#290 `__) 11.0.1.0.0 (2018-07-09) ----------------------- -- Start of the history. +- Start of the history. Bug Tracker =========== @@ -234,13 +233,13 @@ Authors Contributors ------------ -- Wim Audenaert -- Jordi Ballester -- Lois Rilo -- Héctor Villarreal -- Christopher Ormaza -- Joan Sisquella -- Alexandre Fayolle +- Wim Audenaert +- Jordi Ballester +- Lois Rilo +- Héctor Villarreal +- Christopher Ormaza +- Joan Sisquella +- Alexandre Fayolle Maintainers ----------- diff --git a/mrp_multi_level/__manifest__.py b/mrp_multi_level/__manifest__.py index 3eed7dff7b..4870e82e60 100644 --- a/mrp_multi_level/__manifest__.py +++ b/mrp_multi_level/__manifest__.py @@ -4,7 +4,7 @@ { "name": "MRP Multi Level", - "version": "17.0.1.2.3", + "version": "17.0.1.2.4", "development_status": "Production/Stable", "license": "LGPL-3", "author": "Ucamco, ForgeFlow, Odoo Community Association (OCA)", diff --git a/mrp_multi_level/models/product_mrp_area.py b/mrp_multi_level/models/product_mrp_area.py index ce8a2c9097..e6153a005d 100644 --- a/mrp_multi_level/models/product_mrp_area.py +++ b/mrp_multi_level/models/product_mrp_area.py @@ -206,18 +206,19 @@ def _compute_supply_method(self): boms_by_product = self.env["mrp.bom"]._bom_find(self.mapped("product_id")) for rec in self: rule = rec._get_rule() - if not rule: + bom = boms_by_product.get(rec.product_id, self.env["mrp.bom"]) + if bom.type == "phantom": + rec.supply_method = "phantom" + rec.supply_bom_id = bom + elif not rule: rec.supply_method = "none" rec.supply_bom_id = False - continue - # Determine the supply method based on the final rule. - bom = boms_by_product.get(rec.product_id, self.env["mrp.bom"]) - rec.supply_method = ( - "phantom" - if rule.action == "manufacture" and bom.type == "phantom" - else rule.action - ) - rec.supply_bom_id = bom + elif rule.action == "manufacture": + rec.supply_method = rule.action + rec.supply_bom_id = bom + else: + rec.supply_method = rule.action + rec.supply_bom_id = False @api.depends( "mrp_area_id", "supply_method", "product_id.route_ids", "product_id.seller_ids" diff --git a/mrp_multi_level/static/description/index.html b/mrp_multi_level/static/description/index.html index ff01e6f49d..824e7ba68f 100644 --- a/mrp_multi_level/static/description/index.html +++ b/mrp_multi_level/static/description/index.html @@ -367,7 +367,7 @@

        MRP Multi Level

        !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:14bcb1aa2b225a613ba9c2b4e4270818dc513683cfb0739d3335449d4719d444 +!! source digest: sha256:8077fdbc72076d571034b0fddd5c3c1e1c042fd46053a72224baa2e0c82e4d5c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

        Production/Stable License: LGPL-3 OCA/manufacture Translate me on Weblate Try me on Runboat

        This module allows you to calculate, based in known inventory, demand, @@ -464,8 +464,7 @@

        13.0.1.3.0 (2020-03-02)

      • Link Manufacturing Orders with Planned Orders.
      • Allow Mrp Inventory Procure Wizard to be used from other models.
      • Make MRP Inventory creation more extensible.
      • -
      • Main Supplier computation (v13 requires explicit False -definitions)
      • +
      • Main Supplier computation (v13 requires explicit False definitions)
    @@ -546,8 +545,8 @@

    11.0.2.0.0 (2018-11-20)

  • [REW] Refactor MRP Area. (#322):
    • MRP product concept dropped in favor of Product MRP Area -Parameters. This allow to set different MRP parameters for the -same product in different areas.
    • +Parameters. This allow to set different MRP parameters for the same +product in different areas.
    • Menu items reordering.
  • diff --git a/mrp_multi_level/tests/test_mrp_multi_level.py b/mrp_multi_level/tests/test_mrp_multi_level.py index 8db2b70466..dcff742300 100644 --- a/mrp_multi_level/tests/test_mrp_multi_level.py +++ b/mrp_multi_level/tests/test_mrp_multi_level.py @@ -444,11 +444,31 @@ def test_17_supply_method(self): self.fp_4.route_ids = [(4, self.env.ref("mrp.route_warehouse0_manufacture").id)] product_mrp_area._compute_supply_method() self.assertEqual(product_mrp_area.supply_method, "manufacture") + # because of the issue discussed here https://github.com/odoo/odoo/pull/188846 + # we need to apply routes explicitly in the proper order (by sequence) self.fp_4.route_ids = [ - (4, self.env.ref("purchase_stock.route_warehouse0_buy").id) + ( + 6, + 0, + ( + self.env.ref("stock.route_warehouse0_mto") + + self.env.ref("purchase_stock.route_warehouse0_buy") + + self.env.ref("mrp.route_warehouse0_manufacture") + ).ids, + ) ] product_mrp_area._compute_supply_method() self.assertEqual(product_mrp_area.supply_method, "buy") + kit_bom = self.mrp_bom_obj.create( + { + "product_tmpl_id": self.fp_4.product_tmpl_id.id, + "product_id": self.fp_4.id, + "type": "phantom", + } + ) + product_mrp_area._compute_supply_method() + self.assertEqual(product_mrp_area.supply_method, "phantom") + self.assertEqual(product_mrp_area.supply_bom_id, kit_bom) def test_18_priorize_safety_stock(self): now = datetime.now() diff --git a/partner_statement/i18n/it.po b/partner_statement/i18n/it.po index 0cbda304af..5aff260013 100644 --- a/partner_statement/i18n/it.po +++ b/partner_statement/i18n/it.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-12-22 23:13+0000\n" -"PO-Revision-Date: 2024-11-04 16:06+0000\n" +"PO-Revision-Date: 2024-11-28 23:06+0000\n" "Last-Translator: mymage \n" "Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n" "Language: it\n" @@ -53,7 +53,7 @@ msgstr "1 - 30 Giorni" #: code:addons/partner_statement/report/report_statement_common.py:0 #, python-format msgid "1 Month" -msgstr "1 Mese" +msgstr "1 mese" #. module: partner_statement #. odoo-python diff --git a/portal_sale_personal_data_only/README.rst b/portal_sale_personal_data_only/README.rst new file mode 100644 index 0000000000..98d6bf94f7 --- /dev/null +++ b/portal_sale_personal_data_only/README.rst @@ -0,0 +1,102 @@ +============================== +Portal Sale Personal Data Only +============================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:e61f135c57f854a198e8c1d4c6a0329d256a7e6582b0251e88886f04bbd509cf + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/sale-workflow/tree/17.0/portal_sale_personal_data_only + :alt: OCA/sale-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/sale-workflow-17-0/sale-workflow-17-0-portal_sale_personal_data_only + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/sale-workflow&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +By default, portal users are allowed to see all the sale orders in which +a member of their organization are followers. That could cause a leaking +of documents between members and departments and of the organization +that should stay private. + +This module restricts that behaviour so the portal users only see their +own documents. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +1. Create some portal users belonging to the same company. +2. Place some orders for several of these users. +3. Log in with each portal user credential. +4. Only the sale orders belonging to the logged in user's partner or his + descendants should be accessible. +5. Invoices associated to a partner's sale order will be visible as + well. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Tecnativa + +Contributors +------------ + +- Harald Panten +- `Tecnativa `__: + + - David Vidal + - Víctor Martínez + - Stefan Ungureanu + +- Moaad Bourhim +- Jairo Llopis (`Moduon `__) +- SodexisTeam + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/sale-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/portal_sale_personal_data_only/__init__.py b/portal_sale_personal_data_only/__init__.py new file mode 100644 index 0000000000..9a27b1fcab --- /dev/null +++ b/portal_sale_personal_data_only/__init__.py @@ -0,0 +1 @@ +from .hooks import post_init_hook, uninstall_hook diff --git a/portal_sale_personal_data_only/__manifest__.py b/portal_sale_personal_data_only/__manifest__.py new file mode 100644 index 0000000000..3f937644a8 --- /dev/null +++ b/portal_sale_personal_data_only/__manifest__.py @@ -0,0 +1,16 @@ +# Copyright 2018-19 Tecnativa S.L. - David Vidal +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + "name": "Portal Sale Personal Data Only", + "version": "17.0.1.0.0", + "category": "Sale", + "author": "Tecnativa, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/sale-workflow", + "license": "AGPL-3", + "depends": ["sale", "portal_account_personal_data_only"], + "auto_install": True, + "data": ["security/security.xml"], + "installable": True, + "post_init_hook": "post_init_hook", + "uninstall_hook": "uninstall_hook", +} diff --git a/portal_sale_personal_data_only/hooks.py b/portal_sale_personal_data_only/hooks.py new file mode 100644 index 0000000000..5236c338e9 --- /dev/null +++ b/portal_sale_personal_data_only/hooks.py @@ -0,0 +1,14 @@ +# Copyright 2019 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +def post_init_hook(env): + """Archive the ir.rules we want to override""" + env.ref("sale.sale_order_rule_portal").active = False + env.ref("sale.sale_order_line_rule_portal").active = False + + +def uninstall_hook(env): + """Unarchive the overriden ir.rules""" + env.ref("sale.sale_order_rule_portal").active = True + env.ref("sale.sale_order_line_rule_portal").active = True diff --git a/portal_sale_personal_data_only/i18n/de.po b/portal_sale_personal_data_only/i18n/de.po new file mode 100644 index 0000000000..e69de29bb2 diff --git a/portal_sale_personal_data_only/i18n/es.po b/portal_sale_personal_data_only/i18n/es.po new file mode 100644 index 0000000000..e69de29bb2 diff --git a/portal_sale_personal_data_only/i18n/it.po b/portal_sale_personal_data_only/i18n/it.po new file mode 100644 index 0000000000..e69de29bb2 diff --git a/portal_sale_personal_data_only/i18n/portal_sale_personal_data_only.pot b/portal_sale_personal_data_only/i18n/portal_sale_personal_data_only.pot new file mode 100644 index 0000000000..716a0702d8 --- /dev/null +++ b/portal_sale_personal_data_only/i18n/portal_sale_personal_data_only.pot @@ -0,0 +1,13 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \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" diff --git a/portal_sale_personal_data_only/i18n/zh_CN.po b/portal_sale_personal_data_only/i18n/zh_CN.po new file mode 100644 index 0000000000..e69de29bb2 diff --git a/portal_sale_personal_data_only/pyproject.toml b/portal_sale_personal_data_only/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/portal_sale_personal_data_only/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/portal_sale_personal_data_only/readme/CONTRIBUTORS.md b/portal_sale_personal_data_only/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..ee580bee48 --- /dev/null +++ b/portal_sale_personal_data_only/readme/CONTRIBUTORS.md @@ -0,0 +1,8 @@ +- Harald Panten \<\> +- [Tecnativa](https://www.tecnativa.com): + - David Vidal + - Víctor Martínez + - Stefan Ungureanu +- Moaad Bourhim \<\> +- Jairo Llopis ([Moduon](https://www.moduon.team/)) +- SodexisTeam \<\> \ No newline at end of file diff --git a/portal_sale_personal_data_only/readme/DESCRIPTION.md b/portal_sale_personal_data_only/readme/DESCRIPTION.md new file mode 100644 index 0000000000..59e12f0eb8 --- /dev/null +++ b/portal_sale_personal_data_only/readme/DESCRIPTION.md @@ -0,0 +1,7 @@ +By default, portal users are allowed to see all the sale orders in which +a member of their organization are followers. That could cause a leaking +of documents between members and departments and of the organization +that should stay private. + +This module restricts that behaviour so the portal users only see their +own documents. diff --git a/portal_sale_personal_data_only/readme/USAGE.md b/portal_sale_personal_data_only/readme/USAGE.md new file mode 100644 index 0000000000..6b0f6bb78b --- /dev/null +++ b/portal_sale_personal_data_only/readme/USAGE.md @@ -0,0 +1,7 @@ +1. Create some portal users belonging to the same company. +2. Place some orders for several of these users. +3. Log in with each portal user credential. +4. Only the sale orders belonging to the logged in user's partner or + his descendants should be accessible. +5. Invoices associated to a partner's sale order will be visible as + well. diff --git a/portal_sale_personal_data_only/security/security.xml b/portal_sale_personal_data_only/security/security.xml new file mode 100644 index 0000000000..d3c6ffc36f --- /dev/null +++ b/portal_sale_personal_data_only/security/security.xml @@ -0,0 +1,39 @@ + + + + Portal Only Personal Quotations/Sales + + [('message_partner_ids','child_of', [user.partner_id.id])] + + + + Portal Only Personal Sales Orders Line + + [('order_id.message_partner_ids','child_of', [user.partner_id.id])] + + + + Portal display personal invoices linked to personal sale orders + + + [('invoice_line_ids.sale_line_ids.order_id.message_partner_ids', 'child_of', [user.partner_id.id])] + + + + + Portal display personal invoice lines linked to personal sale orders + + + [('sale_line_ids.order_id.message_partner_ids', 'child_of', [user.partner_id.id])] + + + + diff --git a/portal_sale_personal_data_only/static/description/icon.png b/portal_sale_personal_data_only/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/portal_sale_personal_data_only/static/description/index.html b/portal_sale_personal_data_only/static/description/index.html new file mode 100644 index 0000000000..7da19031b5 --- /dev/null +++ b/portal_sale_personal_data_only/static/description/index.html @@ -0,0 +1,450 @@ + + + + + +Portal Sale Personal Data Only + + + +
    +

    Portal Sale Personal Data Only

    + + +

    Beta License: AGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runboat

    +

    By default, portal users are allowed to see all the sale orders in which +a member of their organization are followers. That could cause a leaking +of documents between members and departments and of the organization +that should stay private.

    +

    This module restricts that behaviour so the portal users only see their +own documents.

    +

    Table of contents

    + +
    +

    Usage

    +
      +
    1. Create some portal users belonging to the same company.
    2. +
    3. Place some orders for several of these users.
    4. +
    5. Log in with each portal user credential.
    6. +
    7. Only the sale orders belonging to the logged in user’s partner or his +descendants should be accessible.
    8. +
    9. Invoices associated to a partner’s sale order will be visible as +well.
    10. +
    +
    +
    +

    Bug Tracker

    +

    Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

    +

    Do not contact contributors directly about support or help with technical issues.

    +
    +
    +

    Credits

    +
    +

    Authors

    +
      +
    • Tecnativa
    • +
    +
    +
    +

    Contributors

    + +
    +
    +

    Maintainers

    +

    This module is maintained by the OCA.

    + +Odoo Community Association + +

    OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

    +

    This module is part of the OCA/sale-workflow project on GitHub.

    +

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    +
    +
    +
    + + diff --git a/portal_sale_personal_data_only/tests/__init__.py b/portal_sale_personal_data_only/tests/__init__.py new file mode 100644 index 0000000000..dee9ff1c83 --- /dev/null +++ b/portal_sale_personal_data_only/tests/__init__.py @@ -0,0 +1 @@ +from . import test_partner_access diff --git a/portal_sale_personal_data_only/tests/test_partner_access.py b/portal_sale_personal_data_only/tests/test_partner_access.py new file mode 100644 index 0000000000..99ed93de42 --- /dev/null +++ b/portal_sale_personal_data_only/tests/test_partner_access.py @@ -0,0 +1,78 @@ +# Copyright 2021 Tecnativa - Víctor Martínez +# Copyright 2022 Moduon +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + +from odoo.tests.common import Form, tagged + +from odoo.addons.account.tests.common import AccountTestInvoicingCommon + + +@tagged("post_install", "-at_install") +class TestPartnerAccess(AccountTestInvoicingCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.group_portal = cls.env.ref("base.group_portal") + cls.user_a = cls._create_user(cls, "A") + cls.user_b = cls._create_user(cls, "B") + cls.user_c = cls._create_user(cls, "C") + cls.partner_a = cls._create_partner(cls, cls.user_a) + cls.partner_b = cls._create_partner(cls, cls.user_b) + cls.partner_c = cls._create_partner(cls, cls.user_c) + cls.product = cls.env["product.product"].create( + { + "name": "Test product", + "type": "service", + "lst_price": 10, + "invoice_policy": "order", + } + ) + cls.order_a = cls._create_sale_order(cls, cls.partner_a) + cls.order_b = cls._create_sale_order(cls, cls.partner_b) + cls.order_c = cls._create_sale_order(cls, cls.partner_c) + + def _create_user(self, letter): + return self.env["res.users"].create( + { + "name": "User %s" % letter, + "login": "user_%s" % letter, + "groups_id": [(6, 0, [self.group_portal.id])], + } + ) + + def _create_partner(self, user): + return self.env["res.partner"].create( + { + "name": user.name, + "user_ids": [(6, 0, [user.id])], + } + ) + + def _create_sale_order(self, partner): + sale_form = Form(self.env["sale.order"]) + sale_form.partner_id = partner + with sale_form.order_line.new() as line_form: + line_form.product_id = self.product + sale = sale_form.save() + sale.action_confirm() + sale._create_invoices() + return sale + + def test_access_sale_order(self): + orders_a = self.env["sale.order"].with_user(self.user_a).search([]) + self.assertTrue(self.order_a in orders_a) + self.assertTrue(self.order_b not in orders_a) + self.assertTrue(self.order_c not in orders_a) + orders_b = self.env["sale.order"].with_user(self.user_b).search([]) + self.assertTrue(self.order_a not in orders_b) + self.assertTrue(self.order_b in orders_b) + self.assertTrue(self.order_c not in orders_b) + orders_c = self.env["sale.order"].with_user(self.user_c).search([]) + self.assertTrue(self.order_a not in orders_c) + self.assertTrue(self.order_b not in orders_c) + self.assertTrue(self.order_c in orders_c) + + def test_access_sale_order_followers(self): + self.order_a.message_subscribe(partner_ids=self.partner_b.ids) + orders_b = self.env["sale.order"].with_user(self.user_b).search([]) + self.assertTrue(self.order_a in orders_b) diff --git a/product_harmonized_system/i18n/it.po b/product_harmonized_system/i18n/it.po index 3130287e6d..914b8a1840 100644 --- a/product_harmonized_system/i18n/it.po +++ b/product_harmonized_system/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-02-08 10:43+0000\n" +"PO-Revision-Date: 2024-11-26 20:06+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.17\n" +"X-Generator: Weblate 5.6.2\n" #. module: product_harmonized_system #: model_terms:ir.ui.view,arch_db:product_harmonized_system.hs_code_view_form @@ -99,12 +99,12 @@ msgstr "Nome visualizzato" #: model:ir.model.fields,field_description:product_harmonized_system.field_product_template__hs_code_id #: model_terms:ir.ui.view,arch_db:product_harmonized_system.product_template_search_view msgid "H.S. Code" -msgstr "Codice H.S." +msgstr "Codice S.A." #. module: product_harmonized_system #: model:ir.actions.act_window,name:product_harmonized_system.hs_code_action msgid "H.S. Codes" -msgstr "Codici H.S." +msgstr "Codici S.A." #. module: product_harmonized_system #: model:ir.model.fields,help:product_harmonized_system.field_product_category__hs_code_id @@ -206,7 +206,7 @@ msgstr "Prodotti" #. module: product_harmonized_system #: model:ir.model.fields,help:product_harmonized_system.field_hs_code__description msgid "Short text description of the H.S. category" -msgstr "Breve descrizione testuale della categoria H.S." +msgstr "Breve descrizione testuale della categoria S.A." #. module: product_harmonized_system #: model:hs.code,description:product_harmonized_system.84717050 diff --git a/product_harmonized_system_stock/i18n/it.po b/product_harmonized_system_stock/i18n/it.po index 99c15b33c4..f105a0bdad 100644 --- a/product_harmonized_system_stock/i18n/it.po +++ b/product_harmonized_system_stock/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-04-10 08:35+0000\n" +"PO-Revision-Date: 2024-11-26 20:06+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -14,9 +14,9 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.17\n" +"X-Generator: Weblate 5.6.2\n" #. module: product_harmonized_system_stock #: model:ir.ui.menu,name:product_harmonized_system_stock.hs_code_menu msgid "H.S. Codes" -msgstr "Codici H.S." +msgstr "Codici S.A." diff --git a/remove_odoo_enterprise/README.rst b/remove_odoo_enterprise/README.rst index 67f9a4ae4b..d4b736165a 100644 --- a/remove_odoo_enterprise/README.rst +++ b/remove_odoo_enterprise/README.rst @@ -7,7 +7,7 @@ Remove Odoo Enterprise !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:5a1f12d8590afb4f5c4e395ad3ef44a2368993dd60e0d4d94c5b20e2aaf5120b + !! source digest: sha256:dd890517c70e1030028c22c2e87267e68ba5a89647febe4edb070b451c4d4b7d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -61,12 +61,12 @@ Authors Contributors ------------ -- Brett Wood -- Michell Stuttgart -- Andrea Stirpe -- Levent Karakaş -- Dennis Sluijk -- remi-filament +- Brett Wood +- Michell Stuttgart +- Andrea Stirpe +- Levent Karakaş +- Dennis Sluijk +- remi-filament Maintainers ----------- diff --git a/remove_odoo_enterprise/__manifest__.py b/remove_odoo_enterprise/__manifest__.py index fc30b89f69..16ba5addfe 100644 --- a/remove_odoo_enterprise/__manifest__.py +++ b/remove_odoo_enterprise/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Remove Odoo Enterprise", "summary": "Remove enterprise modules and setting items", - "version": "17.0.1.0.0", + "version": "17.0.1.0.1", "category": "Maintenance", "author": "Eska, Onestein, Odoo Community Association (OCA)", "website": "https://github.com/OCA/server-brand", diff --git a/remove_odoo_enterprise/models/res_config_settings.py b/remove_odoo_enterprise/models/res_config_settings.py index 9030c5b1f5..3602c2cf9a 100644 --- a/remove_odoo_enterprise/models/res_config_settings.py +++ b/remove_odoo_enterprise/models/res_config_settings.py @@ -16,7 +16,11 @@ def get_views(self, views, options=None): ret_val = super().get_views(views, options) form_view = self.env["ir.ui.view"].browse(ret_val["views"]["form"]["id"]) - if not form_view.xml_id == "base.res_config_settings_view_form": + view_xml_ids = ( + form_view.xml_id, + form_view.inherit_id.xml_id, + ) + if "base.res_config_settings_view_form" not in view_xml_ids: return ret_val doc = etree.XML(ret_val["views"]["form"]["arch"]) diff --git a/remove_odoo_enterprise/static/description/index.html b/remove_odoo_enterprise/static/description/index.html index c01b7166e9..869723eadf 100644 --- a/remove_odoo_enterprise/static/description/index.html +++ b/remove_odoo_enterprise/static/description/index.html @@ -367,7 +367,7 @@

    Remove Odoo Enterprise

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:5a1f12d8590afb4f5c4e395ad3ef44a2368993dd60e0d4d94c5b20e2aaf5120b +!! source digest: sha256:dd890517c70e1030028c22c2e87267e68ba5a89647febe4edb070b451c4d4b7d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

    Beta License: AGPL-3 OCA/server-brand Translate me on Weblate Try me on Runboat

    This module removes enterprise-only apps and features from all settings diff --git a/report_qweb_pdf_watermark/README.rst b/report_qweb_pdf_watermark/README.rst new file mode 100644 index 0000000000..6fb31694dc --- /dev/null +++ b/report_qweb_pdf_watermark/README.rst @@ -0,0 +1,164 @@ +============= +Pdf watermark +============= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:2899f6892a8958f127587a702a753350d236d01ca0aa1cbe42ccc9557cf912b4 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Freporting--engine-lightgray.png?logo=github + :target: https://github.com/OCA/reporting-engine/tree/17.0/report_qweb_pdf_watermark + :alt: OCA/reporting-engine +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/reporting-engine-17-0/reporting-engine-17-0-report_qweb_pdf_watermark + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/reporting-engine&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module was written to add watermarks (backgrounds) to PDF reports. +Because of the way wkhtmltopdf handles headers and footers in the +current versions, it is quite impossible to have a background for the +complete page using HTML and CSS. That is why this module inserts the +image at the PDF level. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +As PyPDF is not supported in python3, you need to install PyPDF2: + +:: + + $ pip install pypdf2 + +Usage +===== + +To use this module, you need to: + +1. go to your report +2. select a PDF or image to use as watermark. Note that resolutions and + size must match, otherwise you'll have funny results +3. You can also fill in an expression that returns the data (base64 + encoded) to be used as watermark + +To use the Company watermark, you need to: + +1. go to settings --> company --> update info +2. upload an pdf watermark +3. go to settings --> technical --> reporting --> reports +4. Select the report where you want to use it. +5. On the 'Advanced Properties' tab of the notebook check 'use company + watermark' + +### Demo And demo report is available (if you have demo data installed) +on the users form view. + +1. go to Configuration --> users +2. Select an users +3. Click the print button --> Watermark Demo report. + +Known issues / Roadmap +====================== + +This module depends on support for transparent backgrounds in +Wkhtmltopdf, which has been flaky in the past. This module has been +reported to work with Wkhtmltopdf 0.12.4. + +Changelog +========= + +12.0.1.0.0 (2019-11-18) +----------------------- + +- [MIG] Migration to V12. + +13.0.1.0.0 (2021-01-27) +----------------------- + +- [MIG] Migration to V13. + +14.0.1.0.0 (2021-01-29) +----------------------- + +- [MIG] Migration to V14. + +15.0.1.0.0 (2022-01-11) +----------------------- + +- [MIG] Migration to V15. +- Define pdf watermark in company settings + +16.0.1.0.0 (2023-03-13) +----------------------- + +- [MIG] Migration to V16. + +17.0.1.0.0 (2024-01-12) +----------------------- + +- [MIG] Migration to V17. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Therp BV + +Contributors +------------ + +- Holger Brunn +- Stefan Rijnhart +- Rod Schouteden +- Robin Goots +- Foram Shah +- Emiel van Bokhoven +- Sander Lienaerts +- Anjeel Haria + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/reporting-engine `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/report_qweb_pdf_watermark/__init__.py b/report_qweb_pdf_watermark/__init__.py new file mode 100644 index 0000000000..5c170507d8 --- /dev/null +++ b/report_qweb_pdf_watermark/__init__.py @@ -0,0 +1,4 @@ +# © 2016 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/report_qweb_pdf_watermark/__manifest__.py b/report_qweb_pdf_watermark/__manifest__.py new file mode 100644 index 0000000000..4c40df09d3 --- /dev/null +++ b/report_qweb_pdf_watermark/__manifest__.py @@ -0,0 +1,24 @@ +# © 2016 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + "name": "Pdf watermark", + "version": "17.0.1.0.0", + "author": "Therp BV, " "Odoo Community Association (OCA)", + "license": "AGPL-3", + "category": "Technical Settings", + "development_status": "Production/Stable", + "summary": "Add watermarks to your QWEB PDF reports", + "website": "https://github.com/OCA/reporting-engine", + "depends": ["web"], + "data": [ + "views/ir_actions_report_xml.xml", + "views/res_company.xml", + ], + "assets": { + "web.report_assets_pdf": [ + "/report_qweb_pdf_watermark/static/src/css/report_qweb_pdf_watermark.css" + ], + }, + "demo": ["demo/report.xml"], + "installable": True, +} diff --git a/report_qweb_pdf_watermark/demo/report.xml b/report_qweb_pdf_watermark/demo/report.xml new file mode 100644 index 0000000000..9e58bd395a --- /dev/null +++ b/report_qweb_pdf_watermark/demo/report.xml @@ -0,0 +1,27 @@ + + + + Watermark Demo report + res.users + qweb-pdf + report_qweb_pdf_watermark.demo_report_view + report_qweb_pdf_watermark.demo_report_view + + docs[:1].company_id.logo + + report + + + diff --git a/report_qweb_pdf_watermark/i18n/ca.po b/report_qweb_pdf_watermark/i18n/ca.po new file mode 100644 index 0000000000..c48d2ec762 --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/ca.po @@ -0,0 +1,75 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Carles Antoli , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2017-01-10 03:40+0000\n" +"Last-Translator: Carles Antoli , 2017\n" +"Language-Team: Catalan (https://www.transifex.com/oca/teams/23907/ca/)\n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Informe" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" diff --git a/report_qweb_pdf_watermark/i18n/da.po b/report_qweb_pdf_watermark/i18n/da.po new file mode 100644 index 0000000000..7b7a3b3bb9 --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/da.po @@ -0,0 +1,75 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Hans Henrik Gabelgaard , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2017-01-10 03:40+0000\n" +"Last-Translator: Hans Henrik Gabelgaard , 2017\n" +"Language-Team: Danish (https://www.transifex.com/oca/teams/23907/da/)\n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Rapport" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" diff --git a/report_qweb_pdf_watermark/i18n/de.po b/report_qweb_pdf_watermark/i18n/de.po new file mode 100644 index 0000000000..b99cc63179 --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/de.po @@ -0,0 +1,85 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# OCA Transbot , 2017 +# Rudolf Schnapka , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-03-04 05:58+0000\n" +"PO-Revision-Date: 2017-03-04 05:58+0000\n" +"Last-Translator: Rudolf Schnapka , 2017\n" +"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" +"Ein Ausdruck der base64-geschlüsselte Daten, zur Verwendung als " +"Wasserzeichen, liefert.\n" +"Sie haben die Variablen 'env' und 'docs' zur Verfügung" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Bericht" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "Wasserzeichen" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "Wasserzeichnen-Ausdruck" + +#~ msgid "Demo report" +#~ msgstr "Beispielbericht" + +#~ msgid "ir.actions.report" +#~ msgstr "ir.actions.report" diff --git a/report_qweb_pdf_watermark/i18n/el_GR.po b/report_qweb_pdf_watermark/i18n/el_GR.po new file mode 100644 index 0000000000..dca96ae3a2 --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/el_GR.po @@ -0,0 +1,76 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Kostas Goutoudis , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2017-01-10 03:40+0000\n" +"Last-Translator: Kostas Goutoudis , 2017\n" +"Language-Team: Greek (Greece) (https://www.transifex.com/oca/teams/23907/" +"el_GR/)\n" +"Language: el_GR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Αναφορά" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" diff --git a/report_qweb_pdf_watermark/i18n/es.po b/report_qweb_pdf_watermark/i18n/es.po new file mode 100644 index 0000000000..ba9dd8abdf --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/es.po @@ -0,0 +1,91 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Pedro M. Baeza , 2017 +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2023-09-02 20:42+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" +"Una expresión que obtenga los datos codificados en base64 a ser usada como " +"marca de agua.\n" +"Tiene acceso a las variables `env` y `docs`" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "Compañías" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +msgid "Report Action" +msgstr "Informar Acción" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" +"Cargue un archivo pdf para utilizarlo como marca de agua de la compañía. " +"Debe activar la opción \"utilizar marca de agua de la compañía\" en los " +"informes en los que desee utilizarla." + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" +"Cargue un archivo pdf para utilizarlo como marca de agua en este informe." + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "Utilizar la marca de agua de la compañía" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" +"Utilice la marca de agua pdf definida globalmente en la configuración de la " +"compañía." + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "Marca de agua" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "Informe de demostración de marca de agua" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "Expresión para la marca de agua" + +#~ msgid "Demo report" +#~ msgstr "Informe demo" + +#~ msgid "ir.actions.report" +#~ msgstr "ir.actions.report" diff --git a/report_qweb_pdf_watermark/i18n/es_CO.po b/report_qweb_pdf_watermark/i18n/es_CO.po new file mode 100644 index 0000000000..47d77030fa --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/es_CO.po @@ -0,0 +1,76 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# John Toro , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2017-01-10 03:40+0000\n" +"Last-Translator: John Toro , 2017\n" +"Language-Team: Spanish (Colombia) (https://www.transifex.com/oca/teams/23907/" +"es_CO/)\n" +"Language: es_CO\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Iforme" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" diff --git a/report_qweb_pdf_watermark/i18n/fr.po b/report_qweb_pdf_watermark/i18n/fr.po new file mode 100644 index 0000000000..1f8b8f520b --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/fr.po @@ -0,0 +1,79 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Yannick Vaucher , 2017 +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2017-01-10 03:40+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Rapport" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" + +#~ msgid "ir.actions.report" +#~ msgstr "ir.actions.report" diff --git a/report_qweb_pdf_watermark/i18n/gl.po b/report_qweb_pdf_watermark/i18n/gl.po new file mode 100644 index 0000000000..2373ba42a5 --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/gl.po @@ -0,0 +1,75 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Alejandro Santana , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2017-01-10 03:40+0000\n" +"Last-Translator: Alejandro Santana , 2017\n" +"Language-Team: Galician (https://www.transifex.com/oca/teams/23907/gl/)\n" +"Language: gl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Informe" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" diff --git a/report_qweb_pdf_watermark/i18n/hr.po b/report_qweb_pdf_watermark/i18n/hr.po new file mode 100644 index 0000000000..bb8a1cc164 --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/hr.po @@ -0,0 +1,78 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Bole , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2017-01-10 03:40+0000\n" +"Last-Translator: Bole , 2017\n" +"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +msgid "Report Action" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" + +#~ msgid "ir.actions.report" +#~ msgstr "ir.actions.report" diff --git a/report_qweb_pdf_watermark/i18n/hr_HR.po b/report_qweb_pdf_watermark/i18n/hr_HR.po new file mode 100644 index 0000000000..24024e2e9e --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/hr_HR.po @@ -0,0 +1,85 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Bole , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-13 02:42+0000\n" +"PO-Revision-Date: 2017-07-13 02:42+0000\n" +"Last-Translator: Bole , 2017\n" +"Language-Team: Croatian (Croatia) (https://www.transifex.com/oca/teams/23907/" +"hr_HR/)\n" +"Language: hr_HR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" +"Izraz koji polučuje base46 kodirane podatke koji se koriste kao vodeni žig.\n" +"Imate pristup varijablama 'env' i 'docs'" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Izvještaj" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "Vodeni žig" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "Izraz vodenog žiga" + +#~ msgid "Demo report" +#~ msgstr "Demo izvještaj" + +#~ msgid "ir.actions.report" +#~ msgstr "ir.actions.report" diff --git a/report_qweb_pdf_watermark/i18n/it.po b/report_qweb_pdf_watermark/i18n/it.po new file mode 100644 index 0000000000..3678cfe3ae --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/it.po @@ -0,0 +1,87 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Paolo Valier , 2017 +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2024-11-27 12:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" +"Una espressione che restituisce il dato codificato base 64 da utilizzare " +"come watermark.\n" +"Si ha accesso alle variabili `env` e `docs`" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +msgid "Report Action" +msgstr "Azione resoconto" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" +"Caricare un file PDF da utilizzare come watermark dell'azienda. Bisogna " +"attivare le impostationi 'usare watermark azienda' nei resoconti dove lo si " +"vuole usare." + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" +"Caricare un file PDF da utilizzare come watermark da utilizzare in questo " +"resoconto." + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "Usare watermark azienda" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "Usare il watermark PDF definito globalmente nelle impostazioni azienda." + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "Watermark" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "Resoconto esempio watermark" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "Espressione watermark" + +#~ msgid "ir.actions.report" +#~ msgstr "ir.actions.report" diff --git a/report_qweb_pdf_watermark/i18n/nb_NO.po b/report_qweb_pdf_watermark/i18n/nb_NO.po new file mode 100644 index 0000000000..56408c1cd4 --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/nb_NO.po @@ -0,0 +1,76 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Imre Kristoffer Eilertsen , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2017-01-10 03:40+0000\n" +"Last-Translator: Imre Kristoffer Eilertsen , 2017\n" +"Language-Team: Norwegian Bokmål (Norway) (https://www.transifex.com/oca/" +"teams/23907/nb_NO/)\n" +"Language: nb_NO\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Rapport" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" diff --git a/report_qweb_pdf_watermark/i18n/nl_NL.po b/report_qweb_pdf_watermark/i18n/nl_NL.po new file mode 100644 index 0000000000..9efefc5d9e --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/nl_NL.po @@ -0,0 +1,79 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Peter Hageman , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-23 00:28+0000\n" +"PO-Revision-Date: 2017-06-23 00:28+0000\n" +"Last-Translator: Peter Hageman , 2017\n" +"Language-Team: Dutch (Netherlands) (https://www.transifex.com/oca/" +"teams/23907/nl_NL/)\n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Rapport" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" + +#~ msgid "ir.actions.report" +#~ msgstr "ir.actions.report" diff --git a/report_qweb_pdf_watermark/i18n/pl.po b/report_qweb_pdf_watermark/i18n/pl.po new file mode 100644 index 0000000000..9b8fa07b75 --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/pl.po @@ -0,0 +1,76 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2017-01-10 03:40+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Polish (https://www.transifex.com/oca/teams/23907/pl/)\n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Raport" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" diff --git a/report_qweb_pdf_watermark/i18n/pt.po b/report_qweb_pdf_watermark/i18n/pt.po new file mode 100644 index 0000000000..6b76e599a4 --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/pt.po @@ -0,0 +1,75 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2017-01-10 03:40+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Portuguese (https://www.transifex.com/oca/teams/23907/pt/)\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Relatório" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" diff --git a/report_qweb_pdf_watermark/i18n/pt_BR.po b/report_qweb_pdf_watermark/i18n/pt_BR.po new file mode 100644 index 0000000000..4d87d8bf16 --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/pt_BR.po @@ -0,0 +1,76 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Armando Vulcano Junior , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2017-01-10 03:40+0000\n" +"Last-Translator: Armando Vulcano Junior , 2017\n" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/" +"teams/23907/pt_BR/)\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Relatório" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" diff --git a/report_qweb_pdf_watermark/i18n/pt_PT.po b/report_qweb_pdf_watermark/i18n/pt_PT.po new file mode 100644 index 0000000000..c96f0aea60 --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/pt_PT.po @@ -0,0 +1,80 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# OCA Transbot , 2017 +# Carla Berjano , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-14 06:07+0000\n" +"PO-Revision-Date: 2017-01-14 06:07+0000\n" +"Last-Translator: Carla Berjano , 2017\n" +"Language-Team: Portuguese (Portugal) (https://www.transifex.com/oca/" +"teams/23907/pt_PT/)\n" +"Language: pt_PT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Relatório" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" + +#~ msgid "ir.actions.report" +#~ msgstr "ir.actions.report" diff --git a/report_qweb_pdf_watermark/i18n/report_qweb_pdf_watermark.pot b/report_qweb_pdf_watermark/i18n/report_qweb_pdf_watermark.pot new file mode 100644 index 0000000000..b1752f0e83 --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/report_qweb_pdf_watermark.pot @@ -0,0 +1,69 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \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: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +msgid "Report Action" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" diff --git a/report_qweb_pdf_watermark/i18n/sl.po b/report_qweb_pdf_watermark/i18n/sl.po new file mode 100644 index 0000000000..149c2034d0 --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/sl.po @@ -0,0 +1,76 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Matjaž Mozetič , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2017-01-10 03:40+0000\n" +"Last-Translator: Matjaž Mozetič , 2017\n" +"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Poročilo" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" diff --git a/report_qweb_pdf_watermark/i18n/tr.po b/report_qweb_pdf_watermark/i18n/tr.po new file mode 100644 index 0000000000..099d2fd63f --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/tr.po @@ -0,0 +1,77 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Ahmet Altinisik , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2017-01-10 03:40+0000\n" +"Last-Translator: Ahmet Altinisik , 2017\n" +"Language-Team: Turkish (https://www.transifex.com/oca/teams/23907/tr/)\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +msgid "Report Action" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" + +#~ msgid "ir.actions.report" +#~ msgstr "ir.actions.report" diff --git a/report_qweb_pdf_watermark/i18n/tr_TR.po b/report_qweb_pdf_watermark/i18n/tr_TR.po new file mode 100644 index 0000000000..94bee3134b --- /dev/null +++ b/report_qweb_pdf_watermark/i18n/tr_TR.po @@ -0,0 +1,76 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * report_qweb_pdf_watermark +# +# Translators: +# Ozge Altinisik , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 9.0c\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-10 03:40+0000\n" +"PO-Revision-Date: 2017-01-10 03:40+0000\n" +"Last-Translator: Ozge Altinisik , 2017\n" +"Language-Team: Turkish (Turkey) (https://www.transifex.com/oca/teams/23907/" +"tr_TR/)\n" +"Language: tr_TR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "" +"An expression yielding the base64 encoded data to be used as watermark. \n" +"You have access to variables `env` and `docs`" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_res_company +msgid "Companies" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model,name:report_qweb_pdf_watermark.model_ir_actions_report +#, fuzzy +msgid "Report Action" +msgstr "Rapor" + +#. module: report_qweb_pdf_watermark +#: model_terms:ir.ui.view,arch_db:report_qweb_pdf_watermark.view_company_form +msgid "" +"Upload an pdf file to use as an Company watermark. You need to activate the " +"setting 'use company watermark' on the reports where you want to use it." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +msgid "Upload an pdf file to use as an watermark on this report." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use Company Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,help:report_qweb_pdf_watermark.field_ir_actions_report__use_company_watermark +msgid "Use the pdf watermark defined globally in the company settings." +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_res_company__pdf_watermark +msgid "Watermark" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.actions.report,name:report_qweb_pdf_watermark.demo_report +msgid "Watermark Demo report" +msgstr "" + +#. module: report_qweb_pdf_watermark +#: model:ir.model.fields,field_description:report_qweb_pdf_watermark.field_ir_actions_report__pdf_watermark_expression +msgid "Watermark expression" +msgstr "" diff --git a/report_qweb_pdf_watermark/models/__init__.py b/report_qweb_pdf_watermark/models/__init__.py new file mode 100644 index 0000000000..a305da9003 --- /dev/null +++ b/report_qweb_pdf_watermark/models/__init__.py @@ -0,0 +1,5 @@ +# © 2016 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import res_company +from . import report diff --git a/report_qweb_pdf_watermark/models/report.py b/report_qweb_pdf_watermark/models/report.py new file mode 100644 index 0000000000..40ecd027cc --- /dev/null +++ b/report_qweb_pdf_watermark/models/report.py @@ -0,0 +1,149 @@ +# © 2016 Therp BV +# Copyright 2023 Onestein - Anjeel Haria +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from base64 import b64decode +from io import BytesIO +from logging import getLogger + +from PIL import Image + +from odoo import api, fields, models +from odoo.tools.safe_eval import safe_eval + +logger = getLogger(__name__) + +try: + # we need this to be sure PIL has loaded PDF support + from PIL import PdfImagePlugin # noqa: F401 +except ImportError: + logger.error("ImportError: The PdfImagePlugin could not be imported") + +try: + from PyPDF2 import PdfFileReader, PdfFileWriter # pylint: disable=W0404 + from PyPDF2.utils import PdfReadError # pylint: disable=W0404 +except ImportError: + logger.debug("Can not import PyPDF2") + + +class Report(models.Model): + _inherit = "ir.actions.report" + + use_company_watermark = fields.Boolean( + default=False, + help="Use the pdf watermark defined globally in the company settings.", + ) + pdf_watermark = fields.Binary( + "Watermark", help="Upload an pdf file to use as an watermark on this report." + ) + pdf_watermark_expression = fields.Char( + "Watermark expression", + help="An expression yielding the base64 " + "encoded data to be used as watermark. \n" + "You have access to variables `env` and `docs`", + ) + + def _render_qweb_pdf(self, report_ref, res_ids=None, data=None): + if not self.env.context.get("res_ids"): + return ( + super() + .with_context(res_ids=res_ids) + ._render_qweb_pdf(report_ref, res_ids=res_ids, data=data) + ) + return super()._render_qweb_pdf(report_ref, res_ids=res_ids, data=data) + + @staticmethod + def pdf_has_usable_pages(numpages): + if numpages < 1: + logger.error("Your watermark pdf does not contain any pages") + return False + if numpages > 1: + logger.debug( + "Your watermark pdf contains more than one page, " + "all but the first one will be ignored" + ) + return True + + @api.model + def _run_wkhtmltopdf( + self, + bodies, + report_ref=False, + header=None, + footer=None, + landscape=False, + specific_paperformat_args=None, + set_viewport_size=False, + ): + result = super()._run_wkhtmltopdf( + bodies, + report_ref=report_ref, + header=header, + footer=footer, + landscape=landscape, + specific_paperformat_args=specific_paperformat_args, + set_viewport_size=set_viewport_size, + ) + + docids = self.env.context.get("res_ids", False) + report_sudo = self._get_report(report_ref) + watermark = None + if self.pdf_watermark or report_sudo.pdf_watermark: + watermark = b64decode(self.pdf_watermark or report_sudo.pdf_watermark) + elif ( + self.use_company_watermark or report_sudo.use_company_watermark + ) and self.env.company.pdf_watermark: + watermark = b64decode(self.env.company.pdf_watermark) + elif docids: + watermark = safe_eval( + self.pdf_watermark_expression + or report_sudo.pdf_watermark_expression + or "None", + dict( + env=self.env, + docs=self.env[self.model or report_sudo.model].browse(docids), + ), + ) + if watermark: + watermark = b64decode(watermark) + + if not watermark: + return result + + pdf = PdfFileWriter() + pdf_watermark = None + try: + pdf_watermark = PdfFileReader(BytesIO(watermark)) + except PdfReadError: + # let's see if we can convert this with pillow + try: + Image.init() + image = Image.open(BytesIO(watermark)) + pdf_buffer = BytesIO() + if image.mode != "RGB": + image = image.convert("RGB") + resolution = image.info.get("dpi", self.paperformat_id.dpi or 90) + if isinstance(resolution, tuple): + resolution = resolution[0] + image.save(pdf_buffer, "pdf", resolution=resolution) + pdf_watermark = PdfFileReader(pdf_buffer) + except Exception as e: + logger.exception("Failed to load watermark", e) + + if not pdf_watermark: + logger.error("No usable watermark found, got %s...", watermark[:100]) + return result + + if not self.pdf_has_usable_pages(pdf_watermark.numPages): + return result + + for page in PdfFileReader(BytesIO(result)).pages: + watermark_page = pdf.addBlankPage( + page.mediaBox.getWidth(), page.mediaBox.getHeight() + ) + watermark_page.mergePage(pdf_watermark.getPage(0)) + watermark_page.mergePage(page) + + pdf_content = BytesIO() + pdf.write(pdf_content) + + return pdf_content.getvalue() diff --git a/report_qweb_pdf_watermark/models/res_company.py b/report_qweb_pdf_watermark/models/res_company.py new file mode 100644 index 0000000000..a7bbf87f17 --- /dev/null +++ b/report_qweb_pdf_watermark/models/res_company.py @@ -0,0 +1,10 @@ +# Copyright 2022 360 ERP () +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + pdf_watermark = fields.Binary("Watermark") diff --git a/report_qweb_pdf_watermark/pyproject.toml b/report_qweb_pdf_watermark/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/report_qweb_pdf_watermark/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/report_qweb_pdf_watermark/readme/CONTRIBUTORS.md b/report_qweb_pdf_watermark/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..86a50f5c5a --- /dev/null +++ b/report_qweb_pdf_watermark/readme/CONTRIBUTORS.md @@ -0,0 +1,8 @@ +- Holger Brunn \<\> +- Stefan Rijnhart \<\> +- Rod Schouteden \<\> +- Robin Goots \<\> +- Foram Shah \<\> +- Emiel van Bokhoven \<\> +- Sander Lienaerts \<\> +- Anjeel Haria diff --git a/report_qweb_pdf_watermark/readme/DESCRIPTION.md b/report_qweb_pdf_watermark/readme/DESCRIPTION.md new file mode 100644 index 0000000000..5579135f4f --- /dev/null +++ b/report_qweb_pdf_watermark/readme/DESCRIPTION.md @@ -0,0 +1,5 @@ +This module was written to add watermarks (backgrounds) to PDF reports. +Because of the way wkhtmltopdf handles headers and footers in the +current versions, it is quite impossible to have a background for the +complete page using HTML and CSS. That is why this module inserts the +image at the PDF level. diff --git a/report_qweb_pdf_watermark/readme/HISTORY.md b/report_qweb_pdf_watermark/readme/HISTORY.md new file mode 100644 index 0000000000..cd00602e50 --- /dev/null +++ b/report_qweb_pdf_watermark/readme/HISTORY.md @@ -0,0 +1,24 @@ +## 12.0.1.0.0 (2019-11-18) + +- \[MIG\] Migration to V12. + +## 13.0.1.0.0 (2021-01-27) + +- \[MIG\] Migration to V13. + +## 14.0.1.0.0 (2021-01-29) + +- \[MIG\] Migration to V14. + +## 15.0.1.0.0 (2022-01-11) + +- \[MIG\] Migration to V15. +- Define pdf watermark in company settings + +## 16.0.1.0.0 (2023-03-13) + +- \[MIG\] Migration to V16. + +## 17.0.1.0.0 (2024-01-12) + +- \[MIG\] Migration to V17. diff --git a/report_qweb_pdf_watermark/readme/INSTALL.md b/report_qweb_pdf_watermark/readme/INSTALL.md new file mode 100644 index 0000000000..9c0fa342f6 --- /dev/null +++ b/report_qweb_pdf_watermark/readme/INSTALL.md @@ -0,0 +1,3 @@ +As PyPDF is not supported in python3, you need to install PyPDF2: + + $ pip install pypdf2 diff --git a/report_qweb_pdf_watermark/readme/ROADMAP.md b/report_qweb_pdf_watermark/readme/ROADMAP.md new file mode 100644 index 0000000000..e848ba42f2 --- /dev/null +++ b/report_qweb_pdf_watermark/readme/ROADMAP.md @@ -0,0 +1,3 @@ +This module depends on support for transparent backgrounds in +Wkhtmltopdf, which has been flaky in the past. This module has been +reported to work with Wkhtmltopdf 0.12.4. diff --git a/report_qweb_pdf_watermark/readme/USAGE.md b/report_qweb_pdf_watermark/readme/USAGE.md new file mode 100644 index 0000000000..3e6c269a76 --- /dev/null +++ b/report_qweb_pdf_watermark/readme/USAGE.md @@ -0,0 +1,23 @@ +To use this module, you need to: + +1. go to your report +2. select a PDF or image to use as watermark. Note that resolutions and + size must match, otherwise you'll have funny results +3. You can also fill in an expression that returns the data (base64 + encoded) to be used as watermark + +To use the Company watermark, you need to: + +1. go to settings --\> company --\> update info +2. upload an pdf watermark +3. go to settings --\> technical --\> reporting --\> reports +4. Select the report where you want to use it. +5. On the 'Advanced Properties' tab of the notebook check 'use company + watermark' + +\### Demo And demo report is available (if you have demo data installed) +on the users form view. + +1. go to Configuration --\> users +2. Select an users +3. Click the print button --\> Watermark Demo report. diff --git a/report_qweb_pdf_watermark/static/description/icon.png b/report_qweb_pdf_watermark/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/report_qweb_pdf_watermark/static/description/index.html b/report_qweb_pdf_watermark/static/description/index.html new file mode 100644 index 0000000000..40f342e541 --- /dev/null +++ b/report_qweb_pdf_watermark/static/description/index.html @@ -0,0 +1,526 @@ + + + + + +Pdf watermark + + + +

    +

    Pdf watermark

    + + +

    Production/Stable License: AGPL-3 OCA/reporting-engine Translate me on Weblate Try me on Runboat

    +

    This module was written to add watermarks (backgrounds) to PDF reports. +Because of the way wkhtmltopdf handles headers and footers in the +current versions, it is quite impossible to have a background for the +complete page using HTML and CSS. That is why this module inserts the +image at the PDF level.

    +

    Table of contents

    + +
    +

    Installation

    +

    As PyPDF is not supported in python3, you need to install PyPDF2:

    +
    +$ pip install pypdf2
    +
    +
    +
    +

    Usage

    +

    To use this module, you need to:

    +
      +
    1. go to your report
    2. +
    3. select a PDF or image to use as watermark. Note that resolutions and +size must match, otherwise you’ll have funny results
    4. +
    5. You can also fill in an expression that returns the data (base64 +encoded) to be used as watermark
    6. +
    +

    To use the Company watermark, you need to:

    +
      +
    1. go to settings –> company –> update info
    2. +
    3. upload an pdf watermark
    4. +
    5. go to settings –> technical –> reporting –> reports
    6. +
    7. Select the report where you want to use it.
    8. +
    9. On the ‘Advanced Properties’ tab of the notebook check ‘use company +watermark’
    10. +
    +

    ### Demo And demo report is available (if you have demo data installed) +on the users form view.

    +
      +
    1. go to Configuration –> users
    2. +
    3. Select an users
    4. +
    5. Click the print button –> Watermark Demo report.
    6. +
    +
    +
    +

    Known issues / Roadmap

    +

    This module depends on support for transparent backgrounds in +Wkhtmltopdf, which has been flaky in the past. This module has been +reported to work with Wkhtmltopdf 0.12.4.

    +
    +
    +

    Changelog

    +
    +

    12.0.1.0.0 (2019-11-18)

    +
      +
    • [MIG] Migration to V12.
    • +
    +
    +
    +

    13.0.1.0.0 (2021-01-27)

    +
      +
    • [MIG] Migration to V13.
    • +
    +
    +
    +

    14.0.1.0.0 (2021-01-29)

    +
      +
    • [MIG] Migration to V14.
    • +
    +
    +
    +

    15.0.1.0.0 (2022-01-11)

    +
      +
    • [MIG] Migration to V15.
    • +
    • Define pdf watermark in company settings
    • +
    +
    +
    +

    16.0.1.0.0 (2023-03-13)

    +
      +
    • [MIG] Migration to V16.
    • +
    +
    +
    +

    17.0.1.0.0 (2024-01-12)

    +
      +
    • [MIG] Migration to V17.
    • +
    +
    +
    +
    +

    Bug Tracker

    +

    Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

    +

    Do not contact contributors directly about support or help with technical issues.

    +
    +
    +

    Credits

    +
    +

    Authors

    +
      +
    • Therp BV
    • +
    +
    +
    +

    Contributors

    + +
    +
    +

    Maintainers

    +

    This module is maintained by the OCA.

    + +Odoo Community Association + +

    OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

    +

    This module is part of the OCA/reporting-engine project on GitHub.

    +

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    +
    +
    +
    + + diff --git a/report_qweb_pdf_watermark/static/src/css/report_qweb_pdf_watermark.css b/report_qweb_pdf_watermark/static/src/css/report_qweb_pdf_watermark.css new file mode 100644 index 0000000000..83cc2eb021 --- /dev/null +++ b/report_qweb_pdf_watermark/static/src/css/report_qweb_pdf_watermark.css @@ -0,0 +1,3 @@ +body { + background: transparent !important; +} diff --git a/report_qweb_pdf_watermark/tests/__init__.py b/report_qweb_pdf_watermark/tests/__init__.py new file mode 100644 index 0000000000..1934090dee --- /dev/null +++ b/report_qweb_pdf_watermark/tests/__init__.py @@ -0,0 +1,4 @@ +# © 2016 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import test_report_qweb_pdf_watermark diff --git a/report_qweb_pdf_watermark/tests/test_report_qweb_pdf_watermark.py b/report_qweb_pdf_watermark/tests/test_report_qweb_pdf_watermark.py new file mode 100644 index 0000000000..a4af8be91d --- /dev/null +++ b/report_qweb_pdf_watermark/tests/test_report_qweb_pdf_watermark.py @@ -0,0 +1,63 @@ +# © 2016 Therp BV +# Copyright 2023 Onestein - Anjeel Haria +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from PIL import Image + +from odoo.tests.common import HttpCase + + +class TestReportQwebPdfWatermark(HttpCase): + def test_report_qweb_pdf_watermark(self): + Image.init() + # with our image, we have three + self._test_report_images(3) + + self.env.ref("report_qweb_pdf_watermark.demo_report").write( + {"pdf_watermark_expression": False} + ) + # without, we have two + self._test_report_images(2) + + self.env.ref("report_qweb_pdf_watermark.demo_report").write( + {"pdf_watermark": self.env.user.company_id.logo} + ) + # and now we should have three again + self._test_report_images(3) + + # test use company watermark + self.env.ref("report_qweb_pdf_watermark.demo_report").write( + {"pdf_watermark": False} + ) + self.env.ref("report_qweb_pdf_watermark.demo_report").write( + {"use_company_watermark": True} + ) + self.env.ref("base.main_company").write( + {"pdf_watermark": self.env.user.company_id.logo} + ) + self._test_report_images(3) + + def _test_report_images(self, number): + pdf, _ = ( + self.env["ir.actions.report"] + .with_context(force_report_rendering=True) + ._render_qweb_pdf( + "report_qweb_pdf_watermark.demo_report", + self.env["res.users"].search([]).ids, + ) + ) + self.assertEqual(pdf.count(b"/Subtype /Image"), number) + + def test_pdf_has_usable_pages(self): + # test 0 + numpages = 0 + # pdf_has_usable_pages(self, pdf_watermark) + with self.assertLogs(level="ERROR"): + self.assertFalse( + self.env["ir.actions.report"].pdf_has_usable_pages(numpages) + ) + # test 1 + numpages = 1 + self.assertTrue(self.env["ir.actions.report"].pdf_has_usable_pages(numpages)) + # test 2 + numpages = 2 + self.assertTrue(self.env["ir.actions.report"].pdf_has_usable_pages(numpages)) diff --git a/report_qweb_pdf_watermark/views/ir_actions_report_xml.xml b/report_qweb_pdf_watermark/views/ir_actions_report_xml.xml new file mode 100644 index 0000000000..5b9cdd3c39 --- /dev/null +++ b/report_qweb_pdf_watermark/views/ir_actions_report_xml.xml @@ -0,0 +1,25 @@ + + + + ir.actions.report + + + + + + + + + + diff --git a/report_qweb_pdf_watermark/views/res_company.xml b/report_qweb_pdf_watermark/views/res_company.xml new file mode 100644 index 0000000000..66a55d4876 --- /dev/null +++ b/report_qweb_pdf_watermark/views/res_company.xml @@ -0,0 +1,20 @@ + + + + + res.company + + + + + + + + + + + diff --git a/requirements.txt b/requirements.txt index c26d40fdaa..83031d8069 100644 --- a/requirements.txt +++ b/requirements.txt @@ -159,6 +159,8 @@ zeep # From [https://github.com/OCA/l10n-united-kingdom.git](https://github.com/OCA/l10n-united-kingdom.git) # From [https://github.com/OCA/l10n-uruguay.git](https://github.com/OCA/l10n-uruguay.git) # From [https://github.com/OCA/l10n-usa.git](https://github.com/OCA/l10n-usa.git) +# generated from manifests external_dependencies +python-stdnum # From [https://github.com/OCA/l10n-venezuela.git](https://github.com/OCA/l10n-venezuela.git) # From [https://github.com/OCA/l10n-vietnam.git](https://github.com/OCA/l10n-vietnam.git) # From [https://github.com/OCA/carrier-delivery.git](https://github.com/OCA/carrier-delivery.git) diff --git a/sale_order_general_discount/README.rst b/sale_order_general_discount/README.rst index 2456cf2434..1c4674b004 100644 --- a/sale_order_general_discount/README.rst +++ b/sale_order_general_discount/README.rst @@ -7,7 +7,7 @@ Sale Order General Discount !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:a4eeadfa3e2fc4ad9f54244dc002a32d12938c91207c4f729001730ca727a156 + !! source digest: sha256:dae30a736c327172b8cf10b83644dc4e2e475ea9f9f02596c3c201ab4143e52c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png @@ -28,12 +28,14 @@ Sale Order General Discount |badge1| |badge2| |badge3| |badge4| |badge5| -This module allows to set a general discount in a sales order. This general -discount is set to each line order in the standard `discount` field. +This module allows to set a general discount in a sales order. This +general discount is set to each line order in the standard discount +field. You can configure: - * a default general discount on customers - * On each product define if general discount is applied + +- a default general discount on customers +- On each product define if general discount is applied **Table of contents** @@ -43,19 +45,19 @@ You can configure: Installation ============ -You need to install sale_management module for accessing the needed menus. +You need to install sale_management module for accessing the needed +menus. Usage ===== To use this module, you need to: -#. Create a sale order and set a discount, - this discount will be set in all lines. -#. You can set a discount in a partner. -#. On product you can define if you - apply general discount on sale order line - linked to that product +1. Create a sale order and set a discount, this discount will be set in + all lines. +2. You can set a discount in a partner. +3. On product you can define if you apply general discount on sale order + line linked to that product Bug Tracker =========== @@ -71,23 +73,23 @@ Credits ======= Authors -~~~~~~~ +------- * Tecnativa Contributors -~~~~~~~~~~~~ +------------ -* `Tecnativa `_: +- `Tecnativa `__: - * Sergio Teruel - * Stefan Ungureanu + - Sergio Teruel + - Stefan Ungureanu -* Raf Ven -* Sudhir Arya +- Raf Ven +- Sudhir Arya Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. diff --git a/sale_order_general_discount/readme/CONTRIBUTORS.md b/sale_order_general_discount/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..88f7cbcfcb --- /dev/null +++ b/sale_order_general_discount/readme/CONTRIBUTORS.md @@ -0,0 +1,5 @@ +- [Tecnativa](https://www.tecnativa.com): + - Sergio Teruel \<\> + - Stefan Ungureanu \<\> +- Raf Ven \<\> +- Sudhir Arya \<\> diff --git a/sale_order_general_discount/readme/CONTRIBUTORS.rst b/sale_order_general_discount/readme/CONTRIBUTORS.rst deleted file mode 100644 index ef09abf24b..0000000000 --- a/sale_order_general_discount/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1,7 +0,0 @@ -* `Tecnativa `_: - - * Sergio Teruel - * Stefan Ungureanu - -* Raf Ven -* Sudhir Arya diff --git a/sale_order_general_discount/readme/DESCRIPTION.md b/sale_order_general_discount/readme/DESCRIPTION.md new file mode 100644 index 0000000000..f9539cbb76 --- /dev/null +++ b/sale_order_general_discount/readme/DESCRIPTION.md @@ -0,0 +1,7 @@ +This module allows to set a general discount in a sales order. This +general discount is set to each line order in the standard discount +field. + +You can configure: +- a default general discount on customers +- On each product define if general discount is applied diff --git a/sale_order_general_discount/readme/DESCRIPTION.rst b/sale_order_general_discount/readme/DESCRIPTION.rst deleted file mode 100644 index 88bd66fae3..0000000000 --- a/sale_order_general_discount/readme/DESCRIPTION.rst +++ /dev/null @@ -1,6 +0,0 @@ -This module allows to set a general discount in a sales order. This general -discount is set to each line order in the standard `discount` field. - -You can configure: - * a default general discount on customers - * On each product define if general discount is applied diff --git a/sale_order_general_discount/readme/INSTALL.rst b/sale_order_general_discount/readme/INSTALL.md similarity index 85% rename from sale_order_general_discount/readme/INSTALL.rst rename to sale_order_general_discount/readme/INSTALL.md index 4da360f7c8..5e1d649b89 100644 --- a/sale_order_general_discount/readme/INSTALL.rst +++ b/sale_order_general_discount/readme/INSTALL.md @@ -1 +1,2 @@ -You need to install sale_management module for accessing the needed menus. +You need to install sale_management module for accessing the needed +menus. diff --git a/sale_order_general_discount/readme/USAGE.md b/sale_order_general_discount/readme/USAGE.md new file mode 100644 index 0000000000..db909f04a1 --- /dev/null +++ b/sale_order_general_discount/readme/USAGE.md @@ -0,0 +1,7 @@ +To use this module, you need to: + +1. Create a sale order and set a discount, this discount will be set in + all lines. +2. You can set a discount in a partner. +3. On product you can define if you apply general discount on sale + order line linked to that product diff --git a/sale_order_general_discount/readme/USAGE.rst b/sale_order_general_discount/readme/USAGE.rst deleted file mode 100644 index 2c58d32789..0000000000 --- a/sale_order_general_discount/readme/USAGE.rst +++ /dev/null @@ -1,8 +0,0 @@ -To use this module, you need to: - -#. Create a sale order and set a discount, - this discount will be set in all lines. -#. You can set a discount in a partner. -#. On product you can define if you - apply general discount on sale order line - linked to that product diff --git a/sale_order_general_discount/static/description/index.html b/sale_order_general_discount/static/description/index.html index baa03fd443..e77a41b180 100644 --- a/sale_order_general_discount/static/description/index.html +++ b/sale_order_general_discount/static/description/index.html @@ -367,19 +367,17 @@

    Sale Order General Discount

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:a4eeadfa3e2fc4ad9f54244dc002a32d12938c91207c4f729001730ca727a156 +!! source digest: sha256:dae30a736c327172b8cf10b83644dc4e2e475ea9f9f02596c3c201ab4143e52c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

    Production/Stable License: AGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runboat

    -

    This module allows to set a general discount in a sales order. This general -discount is set to each line order in the standard discount field.

    -
    -
    You can configure:
    -
      +

      This module allows to set a general discount in a sales order. This +general discount is set to each line order in the standard discount +field.

      +

      You can configure:

      +
      • a default general discount on customers
      • On each product define if general discount is applied
      -
    -

    Table of contents

      @@ -396,18 +394,18 @@

      Sale Order General Discount

    Installation

    -

    You need to install sale_management module for accessing the needed menus.

    +

    You need to install sale_management module for accessing the needed +menus.

    Usage

    To use this module, you need to:

      -
    1. Create a sale order and set a discount, -this discount will be set in all lines.
    2. +
    3. Create a sale order and set a discount, this discount will be set in +all lines.
    4. You can set a discount in a partner.
    5. -
    6. On product you can define if you -apply general discount on sale order line -linked to that product
    7. +
    8. On product you can define if you apply general discount on sale order +line linked to that product
    diff --git a/sale_substate/README.rst b/sale_substate/README.rst new file mode 100644 index 0000000000..be2d69d8be --- /dev/null +++ b/sale_substate/README.rst @@ -0,0 +1,93 @@ +============== +Sale Sub State +============== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:27ee2f0bb5e10f298583dd5d40392621dd01590b77f02879021f9479fa696c62 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/sale-workflow/tree/17.0/sale_substate + :alt: OCA/sale-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/sale-workflow-17-0/sale-workflow-17-0-sale_substate + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/sale-workflow&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to add a substate to sale order. For each sale order +state you can define a substate. With this module substates can be +defined allowing to extend the sales workflow. For example, you can add +substate "waiting for legal documents" if the order cannot be validated +without this document (sell a car for example). + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +1. | Go to \*\* Settings > Technical > Sub State Configuration \*\* and + Add "Base Substate". + | If necessary you can add "Target State values" (ex define a + substate for "cancel" state). Substate sequence is very important. + +2. Create a sale order and check if the substate are displayed on the + header of form view. Check if you can't set substate defined for sale + if sate is a quotation. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Akretion + +Contributors +------------ + +- Mourad EL HADJ MIMOUNE +- Alexei Rivera (migration to 15.0) + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/sale-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_substate/__init__.py b/sale_substate/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/sale_substate/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sale_substate/__manifest__.py b/sale_substate/__manifest__.py new file mode 100644 index 0000000000..11a91ef8cf --- /dev/null +++ b/sale_substate/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright 2019 Akretion () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Sale Sub State", + "version": "17.0.1.0.0", + "category": "Tools", + "author": "Akretion, " "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/sale-workflow", + "license": "AGPL-3", + "depends": ["base_substate", "sale_management"], + "data": [ + "views/sale_views.xml", + "data/sale_substate_mail_template_data.xml", + "data/sale_substate_data.xml", + ], + "demo": [ + "data/sale_substate_demo.xml", + ], + "installable": True, +} diff --git a/sale_substate/data/sale_substate_data.xml b/sale_substate/data/sale_substate_data.xml new file mode 100644 index 0000000000..9b363b4fed --- /dev/null +++ b/sale_substate/data/sale_substate_data.xml @@ -0,0 +1,19 @@ + + + + Sale order Substate + sale.order + state + + + + Quotation + + draft + + + Sale + + sale + + diff --git a/sale_substate/data/sale_substate_demo.xml b/sale_substate/data/sale_substate_demo.xml new file mode 100644 index 0000000000..0ed01fcc4b --- /dev/null +++ b/sale_substate/data/sale_substate_demo.xml @@ -0,0 +1,48 @@ + + + + + + In negotiation + 1 + + + + Won + 2 + + + + Lost + 3 + + + + Waiting for legal documents + 4 + + + + + To validate legal documents + 5 + + + + In delivering + 6 + + + + + Delivered + 7 + + + diff --git a/sale_substate/data/sale_substate_mail_template_data.xml b/sale_substate/data/sale_substate_mail_template_data.xml new file mode 100644 index 0000000000..b68de6b6c0 --- /dev/null +++ b/sale_substate/data/sale_substate_mail_template_data.xml @@ -0,0 +1,63 @@ + + + + + Waiting for legal documents + + Reception of {{object.name}} + + +
    +

    + Dear + customer +
    +
    + Thank you for your order. +
    + In order to validate your order we need the legal documentation. +
    +
    + Thank you, +
    + +
    + + +

    +
    +
    + {{ object.partner_id.lang }} + +
    + + In delivery + + Reception of {{object.name}} + + +
    +

    + Dear + customer +
    + Thank you for your order. +
    + You order is being prepared for delivery. + You will receive a delivery tracking link to follow it. +
    +
    + + Thank you, +
    + +
    + + +

    +
    +
    + {{ object.partner_id.lang }} + +
    +
    diff --git a/sale_substate/i18n/es.po b/sale_substate/i18n/es.po new file mode 100644 index 0000000000..5225ac67f3 --- /dev/null +++ b/sale_substate/i18n/es.po @@ -0,0 +1,210 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_substate +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-09-02 18:13+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: sale_substate +#: model:mail.template,body_html:sale_substate.mail_template_data_sale_substate_wait_docs +msgid "" +"
    \n" +"

    \n" +" Dear\n" +" customer\n" +"
    \n" +"
    \n" +" Thank you for your order.\n" +"
    \n" +" In order to validate your order we need the legal documentation.\n" +"
    \n" +"
    \n" +" Thank you,\n" +"
    \n" +" \n" +"
    \n" +" \n" +"
    \n" +"

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

    \n" +" Estimado/a\n" +" customer\n" +"
    \n" +"
    \n" +" Gracias por su pedido.\n" +"
    \n" +" IPara validar su pedido necesitamos la documentación legal..\n" +"
    \n" +"
    \n" +" Gracias,\n" +"
    \n" +" \n" +"
    \n" +" \n" +"
    \n" +"

    \n" +"
    \n" +" " + +#. module: sale_substate +#: model:mail.template,body_html:sale_substate.mail_template_data_sale_substate_delivery +msgid "" +"
    \n" +"

    \n" +" Dear\n" +" customer\n" +"
    \n" +" Thank you for your order.\n" +"
    \n" +" You order is being prepared for delivery.\n" +" You will receive a delivery tracking link to follow it.\n" +"
    \n" +"
    \n" +"\n" +" Thank you,\n" +"
    \n" +" \n" +"
    \n" +" \n" +"
    \n" +"

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

    \n" +" Querido/a\n" +" customer\n" +"
    \n" +" Gracias por su pedido.\n" +"
    \n" +" Su pedido se está preparando para la entrega. \n" +" Usted recibirá un enlace de seguimiento de la entrega para " +"seguirla .\n" +"
    \n" +"
    \n" +"\n" +" Gracias,\n" +"
    \n" +" \n" +"
    \n" +" \n" +"
    \n" +"

    \n" +"
    \n" +" " + +#. module: sale_substate +#: model:ir.model.fields,field_description:sale_substate.field_base_substate_type__model +msgid "Apply on" +msgstr "Aplicar sobre" + +#. module: sale_substate +#: model:ir.model,name:sale_substate.model_base_substate_type +msgid "Base Substate Type" +msgstr "Tipo de subestado base" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_delivered +msgid "Delivered" +msgstr "Entregado" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_in_delivery +msgid "In delivering" +msgstr "En entrega" + +#. module: sale_substate +#: model:mail.template,name:sale_substate.mail_template_data_sale_substate_delivery +msgid "In delivery" +msgstr "En entrega" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_under_nego +msgid "In negotiation" +msgstr "En negociación" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_lost +msgid "Lost" +msgstr "Perdido" + +#. module: sale_substate +#: model:target.state.value,name:sale_substate.target_state_value_draft +msgid "Quotation" +msgstr "Cotización" + +#. module: sale_substate +#: model:mail.template,subject:sale_substate.mail_template_data_sale_substate_delivery +#: model:mail.template,subject:sale_substate.mail_template_data_sale_substate_wait_docs +msgid "Reception of {{object.name}}" +msgstr "Recepción de {{object.name}}" + +#. module: sale_substate +#: model:target.state.value,name:sale_substate.target_state_value_sale +msgid "Sale" +msgstr "Venta" + +#. module: sale_substate +#: model:ir.model.fields.selection,name:sale_substate.selection__base_substate_type__model__sale_order +msgid "Sale order" +msgstr "Pedido de venta" + +#. module: sale_substate +#: model:base.substate.type,name:sale_substate.base_substate_type_sale +msgid "Sale order Substate" +msgstr "Subestado de orden de venta" + +#. module: sale_substate +#: model:ir.model,name:sale_substate.model_sale_order +msgid "Sales Order" +msgstr "Órdenes de Venta" + +#. module: sale_substate +#: model:ir.model.fields,field_description:sale_substate.field_sale_order__substate_id +msgid "Sub State" +msgstr "Sub estado" + +#. module: sale_substate +#: model_terms:ir.ui.view,arch_db:sale_substate.view_sales_order_filter +msgid "Substate" +msgstr "Subestado" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_valid_docs +msgid "To validate legal documents" +msgstr "Para validar documentos legales" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_wait_docs +#: model:mail.template,name:sale_substate.mail_template_data_sale_substate_wait_docs +msgid "Waiting for legal documents" +msgstr "A la espera de documentos legales" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_won +msgid "Won" +msgstr "Ganado" + +#, python-format +#~ msgid "" +#~ "The substate %(name)s is not defined for the state %(state)s but for " +#~ "%(target_state)s " +#~ msgstr "" +#~ "El subestado %(name)s no está definido para el estado %(state)s sino para " +#~ "%(target_state)s " diff --git a/sale_substate/i18n/it.po b/sale_substate/i18n/it.po new file mode 100644 index 0000000000..f5e4823a7b --- /dev/null +++ b/sale_substate/i18n/it.po @@ -0,0 +1,211 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_substate +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-01-05 10:38+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: sale_substate +#: model:mail.template,body_html:sale_substate.mail_template_data_sale_substate_wait_docs +msgid "" +"
    \n" +"

    \n" +" Dear\n" +" customer\n" +"
    \n" +"
    \n" +" Thank you for your order.\n" +"
    \n" +" In order to validate your order we need the legal documentation.\n" +"
    \n" +"
    \n" +" Thank you,\n" +"
    \n" +" \n" +"
    \n" +" \n" +"
    \n" +"

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

    \n" +" Spettabile\n" +" cliente\n" +"
    \n" +"
    \n" +" grazie per il suo odine.\n" +"
    \n" +" Per poter validare il suo ordine abbiamo bisgno della documentazione " +"legale.\n" +"
    \n" +"
    \n" +" grazie,\n" +"
    \n" +" \n" +"
    \n" +" \n" +"
    \n" +"

    \n" +"
    \n" +" " + +#. module: sale_substate +#: model:mail.template,body_html:sale_substate.mail_template_data_sale_substate_delivery +msgid "" +"
    \n" +"

    \n" +" Dear\n" +" customer\n" +"
    \n" +" Thank you for your order.\n" +"
    \n" +" You order is being prepared for delivery.\n" +" You will receive a delivery tracking link to follow it.\n" +"
    \n" +"
    \n" +"\n" +" Thank you,\n" +"
    \n" +" \n" +"
    \n" +" \n" +"
    \n" +"

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

    \n" +" Spettabile\n" +" cliente\n" +"
    \n" +" grazie per il vosto ordine.\n" +"
    \n" +" Il vostro ordine è in preparazione per la consegna.\n" +" Riceverete un collegamwnto di tracciamento della consegna per " +"seguirlo.\n" +"
    \n" +"
    \n" +"\n" +" grazie,\n" +"
    \n" +" \n" +"
    \n" +" \n" +"
    \n" +"

    \n" +"
    \n" +" " + +#. module: sale_substate +#: model:ir.model.fields,field_description:sale_substate.field_base_substate_type__model +msgid "Apply on" +msgstr "Applica a" + +#. module: sale_substate +#: model:ir.model,name:sale_substate.model_base_substate_type +msgid "Base Substate Type" +msgstr "Tipo substato base" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_delivered +msgid "Delivered" +msgstr "Consegnato" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_in_delivery +msgid "In delivering" +msgstr "In consegna" + +#. module: sale_substate +#: model:mail.template,name:sale_substate.mail_template_data_sale_substate_delivery +msgid "In delivery" +msgstr "In cnsegna" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_under_nego +msgid "In negotiation" +msgstr "In contrattazione" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_lost +msgid "Lost" +msgstr "Persa" + +#. module: sale_substate +#: model:target.state.value,name:sale_substate.target_state_value_draft +msgid "Quotation" +msgstr "Preventivo" + +#. module: sale_substate +#: model:mail.template,subject:sale_substate.mail_template_data_sale_substate_delivery +#: model:mail.template,subject:sale_substate.mail_template_data_sale_substate_wait_docs +msgid "Reception of {{object.name}}" +msgstr "Ricezione di {{object.name}}" + +#. module: sale_substate +#: model:target.state.value,name:sale_substate.target_state_value_sale +msgid "Sale" +msgstr "Vendita" + +#. module: sale_substate +#: model:ir.model.fields.selection,name:sale_substate.selection__base_substate_type__model__sale_order +msgid "Sale order" +msgstr "Ordini di vendita" + +#. module: sale_substate +#: model:base.substate.type,name:sale_substate.base_substate_type_sale +msgid "Sale order Substate" +msgstr "Substato ordine di vendita" + +#. module: sale_substate +#: model:ir.model,name:sale_substate.model_sale_order +msgid "Sales Order" +msgstr "Ordine di vendita" + +#. module: sale_substate +#: model:ir.model.fields,field_description:sale_substate.field_sale_order__substate_id +msgid "Sub State" +msgstr "Substato" + +#. module: sale_substate +#: model_terms:ir.ui.view,arch_db:sale_substate.view_sales_order_filter +msgid "Substate" +msgstr "Substato" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_valid_docs +msgid "To validate legal documents" +msgstr "Documenti legali da validare" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_wait_docs +#: model:mail.template,name:sale_substate.mail_template_data_sale_substate_wait_docs +msgid "Waiting for legal documents" +msgstr "Attesa documenti legali" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_won +msgid "Won" +msgstr "Vinta" + +#, python-format +#~ msgid "" +#~ "The substate %(name)s is not defined for the state %(state)s but for " +#~ "%(target_state)s " +#~ msgstr "" +#~ "il substato %(name)s non è definito per lo sato %(state)s ma per " +#~ "%(target_state)s " diff --git a/sale_substate/i18n/sale_substate.pot b/sale_substate/i18n/sale_substate.pot new file mode 100644 index 0000000000..f1d570488c --- /dev/null +++ b/sale_substate/i18n/sale_substate.pot @@ -0,0 +1,157 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_substate +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \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: sale_substate +#: model:mail.template,body_html:sale_substate.mail_template_data_sale_substate_wait_docs +msgid "" +"
    \n" +"

    \n" +" Dear\n" +" customer\n" +"
    \n" +"
    \n" +" Thank you for your order.\n" +"
    \n" +" In order to validate your order we need the legal documentation.\n" +"
    \n" +"
    \n" +" Thank you,\n" +"
    \n" +" \n" +"
    \n" +" \n" +"
    \n" +"

    \n" +"
    \n" +" " +msgstr "" + +#. module: sale_substate +#: model:mail.template,body_html:sale_substate.mail_template_data_sale_substate_delivery +msgid "" +"
    \n" +"

    \n" +" Dear\n" +" customer\n" +"
    \n" +" Thank you for your order.\n" +"
    \n" +" You order is being prepared for delivery.\n" +" You will receive a delivery tracking link to follow it.\n" +"
    \n" +"
    \n" +"\n" +" Thank you,\n" +"
    \n" +" \n" +"
    \n" +" \n" +"
    \n" +"

    \n" +"
    \n" +" " +msgstr "" + +#. module: sale_substate +#: model:ir.model.fields,field_description:sale_substate.field_base_substate_type__model +msgid "Apply on" +msgstr "" + +#. module: sale_substate +#: model:ir.model,name:sale_substate.model_base_substate_type +msgid "Base Substate Type" +msgstr "" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_delivered +msgid "Delivered" +msgstr "" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_in_delivery +msgid "In delivering" +msgstr "" + +#. module: sale_substate +#: model:mail.template,name:sale_substate.mail_template_data_sale_substate_delivery +msgid "In delivery" +msgstr "" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_under_nego +msgid "In negotiation" +msgstr "" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_lost +msgid "Lost" +msgstr "" + +#. module: sale_substate +#: model:target.state.value,name:sale_substate.target_state_value_draft +msgid "Quotation" +msgstr "" + +#. module: sale_substate +#: model:mail.template,subject:sale_substate.mail_template_data_sale_substate_delivery +#: model:mail.template,subject:sale_substate.mail_template_data_sale_substate_wait_docs +msgid "Reception of {{object.name}}" +msgstr "" + +#. module: sale_substate +#: model:target.state.value,name:sale_substate.target_state_value_sale +msgid "Sale" +msgstr "" + +#. module: sale_substate +#: model:ir.model.fields.selection,name:sale_substate.selection__base_substate_type__model__sale_order +msgid "Sale order" +msgstr "" + +#. module: sale_substate +#: model:base.substate.type,name:sale_substate.base_substate_type_sale +msgid "Sale order Substate" +msgstr "" + +#. module: sale_substate +#: model:ir.model,name:sale_substate.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: sale_substate +#: model:ir.model.fields,field_description:sale_substate.field_sale_order__substate_id +msgid "Sub State" +msgstr "" + +#. module: sale_substate +#: model_terms:ir.ui.view,arch_db:sale_substate.view_sales_order_filter +msgid "Substate" +msgstr "" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_valid_docs +msgid "To validate legal documents" +msgstr "" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_wait_docs +#: model:mail.template,name:sale_substate.mail_template_data_sale_substate_wait_docs +msgid "Waiting for legal documents" +msgstr "" + +#. module: sale_substate +#: model:base.substate,name:sale_substate.base_substate_won +msgid "Won" +msgstr "" diff --git a/sale_substate/models/__init__.py b/sale_substate/models/__init__.py new file mode 100644 index 0000000000..6aacb75313 --- /dev/null +++ b/sale_substate/models/__init__.py @@ -0,0 +1 @@ +from . import sale_order diff --git a/sale_substate/models/sale_order.py b/sale_substate/models/sale_order.py new file mode 100644 index 0000000000..66409eb8a4 --- /dev/null +++ b/sale_substate/models/sale_order.py @@ -0,0 +1,17 @@ +# Copyright 2019 Akretion +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class BaseSubstateType(models.Model): + _inherit = "base.substate.type" + + model = fields.Selection( + selection_add=[("sale.order", "Sale order")], ondelete={"sale.order": "cascade"} + ) + + +class SaleOrder(models.Model): + _inherit = ["sale.order", "base.substate.mixin"] + _name = "sale.order" diff --git a/sale_substate/pyproject.toml b/sale_substate/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/sale_substate/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/sale_substate/readme/CONTRIBUTORS.md b/sale_substate/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..16fd199216 --- /dev/null +++ b/sale_substate/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- Mourad EL HADJ MIMOUNE \<\> +- Alexei Rivera \<\> (migration to 15.0) diff --git a/sale_substate/readme/DESCRIPTION.md b/sale_substate/readme/DESCRIPTION.md new file mode 100644 index 0000000000..0d00e7fd4e --- /dev/null +++ b/sale_substate/readme/DESCRIPTION.md @@ -0,0 +1,5 @@ +This module allows to add a substate to sale order. For each sale order +state you can define a substate. With this module substates can be +defined allowing to extend the sales workflow. For example, you can add +substate "waiting for legal documents" if the order cannot be validated +without this document (sell a car for example). diff --git a/sale_substate/readme/USAGE.md b/sale_substate/readme/USAGE.md new file mode 100644 index 0000000000..1ed654c611 --- /dev/null +++ b/sale_substate/readme/USAGE.md @@ -0,0 +1,7 @@ +1. Go to \*\* Settings \> Technical \> Sub State Configuration \*\* and Add "Base Substate". + If necessary you can add "Target State values" (ex define a substate + for "cancel" state). Substate sequence is very important. + +2. Create a sale order and check if the substate are displayed on the + header of form view. Check if you can't set substate defined for + sale if sate is a quotation. diff --git a/sale_substate/static/description/icon.png b/sale_substate/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/sale_substate/static/description/index.html b/sale_substate/static/description/index.html new file mode 100644 index 0000000000..c4e86b3085 --- /dev/null +++ b/sale_substate/static/description/index.html @@ -0,0 +1,445 @@ + + + + + +Sale Sub State + + + +
    +

    Sale Sub State

    + + +

    Beta License: AGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runboat

    +

    This module allows to add a substate to sale order. For each sale order +state you can define a substate. With this module substates can be +defined allowing to extend the sales workflow. For example, you can add +substate “waiting for legal documents” if the order cannot be validated +without this document (sell a car for example).

    +

    Table of contents

    + +
    +

    Usage

    +
      +
    1. +
      Go to ** Settings > Technical > Sub State Configuration ** and +Add “Base Substate”.
      +
      If necessary you can add “Target State values” (ex define a +substate for “cancel” state). Substate sequence is very important.
      +
      +
    2. +
    3. Create a sale order and check if the substate are displayed on the +header of form view. Check if you can’t set substate defined for sale +if sate is a quotation.

      +
    4. +
    +
    +
    +

    Bug Tracker

    +

    Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

    +

    Do not contact contributors directly about support or help with technical issues.

    +
    +
    +

    Credits

    +
    +

    Authors

    +
      +
    • Akretion
    • +
    +
    +
    +

    Contributors

    + +
    +
    +

    Maintainers

    +

    This module is maintained by the OCA.

    + +Odoo Community Association + +

    OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

    +

    This module is part of the OCA/sale-workflow project on GitHub.

    +

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    +
    +
    +
    + + diff --git a/sale_substate/tests/__init__.py b/sale_substate/tests/__init__.py new file mode 100644 index 0000000000..ec06184eaf --- /dev/null +++ b/sale_substate/tests/__init__.py @@ -0,0 +1 @@ +from . import test_sale_substate diff --git a/sale_substate/tests/test_sale_substate.py b/sale_substate/tests/test_sale_substate.py new file mode 100644 index 0000000000..b363e37256 --- /dev/null +++ b/sale_substate/tests/test_sale_substate.py @@ -0,0 +1,68 @@ +# Copyright 2019 Akretion Mourad EL HADJ MIMOUNE +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo.exceptions import ValidationError +from odoo.tests.common import TransactionCase + + +class TestBaseSubstate(TransactionCase): + def setUp(self): + super().setUp() + self.substate_test_sale = self.env["sale.order"] + self.substate_test_sale_line = self.env["sale.order.line"] + + self.substate_under_nego = self.env.ref( + "sale_substate.base_substate_under_nego" + ) + self.substate_won = self.env.ref("sale_substate.base_substate_won") + self.substate_wait_docs = self.env.ref("sale_substate.base_substate_wait_docs") + self.substate_valid_docs = self.env.ref( + "sale_substate.base_substate_valid_docs" + ) + self.substate_in_delivery = self.env.ref( + "sale_substate.base_substate_in_delivery" + ) + self.product_1 = self.env["product.product"].create( + { + "name": "Test Product 1", + "type": "service", + } + ) + + def test_sale_order_substate(self): + partner = self.env.ref("base.res_partner_1") + so_test1 = self.substate_test_sale.create( + { + "name": "Test base substate to basic sale", + "partner_id": partner.id, + "order_line": [ + ( + 0, + 0, + { + "product_id": self.product_1.id, + "product_uom_qty": 2, + "product_uom": self.product_1.uom_id.id, + "name": "line test", + "price_unit": 120.0, + }, + ) + ], + } + ) + self.assertTrue(so_test1.state == "draft") + self.assertTrue(so_test1.substate_id == self.substate_under_nego) + + # Block substate not corresponding to draft state + with self.assertRaises(ValidationError): + so_test1.substate_id = self.substate_valid_docs + # Test that validation of sale order change substate_id + so_test1.action_confirm() + self.assertTrue(so_test1.state == "sale") + self.assertTrue(so_test1.substate_id == self.substate_valid_docs) + + # Test that substate_id is set to false if + # there is not substate corresponding to state + so_test1._action_cancel() + self.assertTrue(so_test1.state == "cancel") + self.assertTrue(not so_test1.substate_id) diff --git a/sale_substate/views/sale_views.xml b/sale_substate/views/sale_views.xml new file mode 100644 index 0000000000..6ca7ad3690 --- /dev/null +++ b/sale_substate/views/sale_views.xml @@ -0,0 +1,59 @@ + + + + + sale.order + + + +
    + +
    +
    +
    +
    + + + sale.order + + + + + + + + + + sale.order + + + + + + + + + + sale.order + + + + + + + + + + + +
    diff --git a/web_time_range_menu_custom/README.rst b/web_time_range_menu_custom/README.rst new file mode 100644 index 0000000000..b00903b271 --- /dev/null +++ b/web_time_range_menu_custom/README.rst @@ -0,0 +1,103 @@ +========================== +Web Time Range Menu Custom +========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:b8f576a232543e626ea63750f61ea280b120dc0aa96313e37982039805a68eb6 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/17.0/web_time_range_menu_custom + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-17-0/web-17-0-web_time_range_menu_custom + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Extend period and comparison period options for the date and datetime +fields filted menu adding a new option called "Custom Period". + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To see this module working: + +1. Navigate to any menu that supports date-based filters. +2. Open **Custom period** tab. +3. Add new date filter with the provided options. + +|Custom Period Option| + +For the pivots, on the comparison tab you can see the same option to +make the comparison with the provided filter, taking th reference from +the set filter. + +**Note:** For "days," it functions as a range; for example, "Last 7 +days" returns the period from 7 days ago up to today. However, for other +options, it provides the range for the selected period. For instance, +"Last 1 month" returns the period from the first day of the previous +month to the last day of the previous month. + +.. |Custom Period Option| image:: https://raw.githubusercontent.com/web_time_range_menu_custom/static/src/description/custom_period_option.png + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__: + + - Alexandre D. Díaz + - Carlos Roca + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_time_range_menu_custom/__init__.py b/web_time_range_menu_custom/__init__.py new file mode 100644 index 0000000000..ef5ae3587f --- /dev/null +++ b/web_time_range_menu_custom/__init__.py @@ -0,0 +1 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). diff --git a/web_time_range_menu_custom/__manifest__.py b/web_time_range_menu_custom/__manifest__.py new file mode 100644 index 0000000000..666572dec4 --- /dev/null +++ b/web_time_range_menu_custom/__manifest__.py @@ -0,0 +1,23 @@ +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +{ + "name": "Web Time Range Menu Custom", + "version": "17.0.1.0.0", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "website": "https://github.com/OCA/web", + "depends": ["web"], + "installable": True, + "auto_install": False, + "assets": { + "web.assets_backend": [ + ( + "after", + "/web/static/src/search/utils/dates.js", + "/web_time_range_menu_custom/static/src/js/*.esm.js", + ), + "/web_time_range_menu_custom/static/src/scss/*.scss", + "/web_time_range_menu_custom/static/src/xml/*.xml", + ], + }, +} diff --git a/web_time_range_menu_custom/i18n/es.po b/web_time_range_menu_custom/i18n/es.po new file mode 100644 index 0000000000..e0742b46ec --- /dev/null +++ b/web_time_range_menu_custom/i18n/es.po @@ -0,0 +1,87 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_time_range_menu_custom +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-19 19:33+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Add" +msgstr "Añadir" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Custom period" +msgstr "Período personalizado" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Day" +msgstr "Día" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Month" +msgstr "Mes" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Week" +msgstr "Semana" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Year" +msgstr "Año" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "day" +msgstr "" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "month" +msgstr "" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "week" +msgstr "" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "year" +msgstr "" diff --git a/web_time_range_menu_custom/i18n/it.po b/web_time_range_menu_custom/i18n/it.po new file mode 100644 index 0000000000..e985bd2435 --- /dev/null +++ b/web_time_range_menu_custom/i18n/it.po @@ -0,0 +1,87 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_time_range_menu_custom +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-11-20 13:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Add" +msgstr "Aggiungi" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Custom period" +msgstr "Periodo predefinito" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Day" +msgstr "Giorno" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Month" +msgstr "Mese" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Week" +msgstr "Settimana" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Year" +msgstr "Anno" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "day" +msgstr "giorno" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "month" +msgstr "mese" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "week" +msgstr "settimana" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "year" +msgstr "anno" diff --git a/web_time_range_menu_custom/i18n/web_time_range_menu_custom.pot b/web_time_range_menu_custom/i18n/web_time_range_menu_custom.pot new file mode 100644 index 0000000000..ffaef2f466 --- /dev/null +++ b/web_time_range_menu_custom/i18n/web_time_range_menu_custom.pot @@ -0,0 +1,84 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_time_range_menu_custom +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \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: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Add" +msgstr "" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Custom period" +msgstr "" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Day" +msgstr "" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Month" +msgstr "" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Week" +msgstr "" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "Year" +msgstr "" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "day" +msgstr "" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "month" +msgstr "" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "week" +msgstr "" + +#. module: web_time_range_menu_custom +#. odoo-javascript +#: code:addons/web_time_range_menu_custom/static/src/xml/date_selector.xml:0 +#, python-format +msgid "year" +msgstr "" diff --git a/web_time_range_menu_custom/pyproject.toml b/web_time_range_menu_custom/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/web_time_range_menu_custom/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/web_time_range_menu_custom/readme/CONTRIBUTORS.md b/web_time_range_menu_custom/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..2ddacdb2d8 --- /dev/null +++ b/web_time_range_menu_custom/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Tecnativa](https://www.tecnativa.com): + - Alexandre D. Díaz + - Carlos Roca diff --git a/web_time_range_menu_custom/readme/DESCRIPTION.md b/web_time_range_menu_custom/readme/DESCRIPTION.md new file mode 100644 index 0000000000..df76463aec --- /dev/null +++ b/web_time_range_menu_custom/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +Extend period and comparison period options for the date and datetime +fields filted menu adding a new option called "Custom Period". diff --git a/web_time_range_menu_custom/readme/USAGE.md b/web_time_range_menu_custom/readme/USAGE.md new file mode 100644 index 0000000000..703ff8b4e0 --- /dev/null +++ b/web_time_range_menu_custom/readme/USAGE.md @@ -0,0 +1,17 @@ +To see this module working: + +1. Navigate to any menu that supports date-based filters. +2. Open **Custom period** tab. +3. Add new date filter with the provided options. + +![Custom Period Option](/web_time_range_menu_custom/static/src/description/custom_period_option.png) + +For the pivots, on the comparison tab you can see the same option to +make the comparison with the provided filter, taking th reference from +the set filter. + +**Note:** For "days," it functions as a range; for example, "Last 7 +days" returns the period from 7 days ago up to today. However, for other +options, it provides the range for the selected period. For instance, +"Last 1 month" returns the period from the first day of the previous +month to the last day of the previous month. diff --git a/web_time_range_menu_custom/static/description/custom_period_option.png b/web_time_range_menu_custom/static/description/custom_period_option.png new file mode 100644 index 0000000000000000000000000000000000000000..c19c93488adbcf8da30acc808ac51f9752537bac GIT binary patch literal 254423 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�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 z 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