diff --git a/docsource/modules170-180.rst b/docsource/modules170-180.rst index b8792912a176..6c6a0ded0cca 100644 --- a/docsource/modules170-180.rst +++ b/docsource/modules170-180.rst @@ -6,9 +6,9 @@ Module coverage 17.0 -> 18.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | Module | Status + Extra Information | +===================================================+======================+=================================================+ -| account | | | +| account | Done | | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| |del| account_audit_trail | |Merged into account. | +| |del| account_audit_trail | Done |Merged into account. | +---------------------------------------------------+----------------------+-------------------------------------------------+ | account_check_printing | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ @@ -24,11 +24,11 @@ Module coverage 17.0 -> 18.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | account_fleet | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| |del| account_lock | |Merged into account. | +| |del| account_lock | Done |Merged into account. | +---------------------------------------------------+----------------------+-------------------------------------------------+ | account_payment | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| |del| account_payment_term | |Merged into account. | +| |del| account_payment_term | Done |Merged into account. | +---------------------------------------------------+----------------------+-------------------------------------------------+ | account_peppol | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ diff --git a/openupgrade_scripts/scripts/account/18.0.1.3/post-migration.py b/openupgrade_scripts/scripts/account/18.0.1.3/post-migration.py new file mode 100644 index 000000000000..f667838cb6b9 --- /dev/null +++ b/openupgrade_scripts/scripts/account/18.0.1.3/post-migration.py @@ -0,0 +1,181 @@ +# Copyright 2025 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from openupgradelib import openupgrade, openupgrade_180 + + +def replace_period_lock_date(env): + openupgrade.logged_query( + env.cr, + """ + UPDATE res_company + SET sale_lock_date = period_lock_date, purchase_lock_date = period_lock_date + WHERE period_lock_date IS NOT NULL""", + ) + + +def link_payments_to_moves(env): + openupgrade.logged_query( + env.cr, + """ + INSERT INTO account_move__account_payment (invoice_id, payment_id) + SELECT am.id, ap.id + FROM account_payment ap + JOIN account_move am ON ap.move_id = am.id + """, + ) + + +def convert_company_dependent(env): + openupgrade_180.convert_company_dependent( + env, "account.cash.rounding", "loss_account_id" + ) + openupgrade_180.convert_company_dependent( + env, "account.cash.rounding", "profit_account_id" + ) + openupgrade_180.convert_company_dependent( + env, "product.category", "property_account_expense_categ_id" + ) + openupgrade_180.convert_company_dependent( + env, "product.category", "property_account_income_categ_id" + ) + openupgrade_180.convert_company_dependent( + env, "product.template", "property_account_expense_id" + ) + openupgrade_180.convert_company_dependent( + env, "product.template", "property_account_income_id" + ) + openupgrade_180.convert_company_dependent(env, "res.partner", "credit_limit") + openupgrade_180.convert_company_dependent( + env, "res.partner", "property_account_payable_id" + ) + openupgrade_180.convert_company_dependent( + env, "res.partner", "property_account_position_id" + ) + openupgrade_180.convert_company_dependent( + env, "res.partner", "property_account_receivable_id" + ) + openupgrade_180.convert_company_dependent( + env, "res.partner", "property_payment_term_id" + ) + openupgrade_180.convert_company_dependent( + env, "res.partner", "property_supplier_payment_term_id" + ) + openupgrade_180.convert_company_dependent(env, "res.partner", "trust") + + +def fill_res_partner_property_x_payment_method_line_id(env): + if not openupgrade.column_exists( + env.cr, "account_move", "preferred_payment_method_id" + ): + return + # having account_check_printing module + env.cr.execute( + """ + SELECT id FROM ir_model_fields + WHERE model = 'res.partner' + AND name = 'property_payment_method_id'""" + ) + old_field_id = env.cr.fetchone()[0] + openupgrade.logged_query( + env.cr, + f""" + UPDATE res_partner + SET property_outbound_payment_method_line_id=ir_property_by_company.value + FROM ( + SELECT + SPLIT_PART(ip.res_id, ',', 2)::integer res_id, + JSON_OBJECT_AGG(ip.company_id, sub.id) value + FROM ir_property ip + JOIN LATERAL ( + SELECT * + FROM account_payment_method_line apml + WHERE apml.payment_method_id = SPLIT_PART( + ip.value_reference, ',', 2)::integer + LIMIT 1 + ) as sub ON TRUE + WHERE ip.fields_id={old_field_id} AND ip.res_id IS NOT NULL + AND ip.company_id IS NOT NULL AND sub.id IS NOT NULL + GROUP BY res_id + ) ir_property_by_company + WHERE res_partner.id=ir_property_by_company.res_id + """, + ) + env.cr.execute( + f""" + SELECT ip.company_id, sub.id + FROM ir_property ip + JOIN LATERAL ( + SELECT * + FROM account_payment_method_line apml + WHERE apml.payment_method_id = SPLIT_PART( + ip.value_reference, ',', 2)::integer + LIMIT 1 + ) as sub ON TRUE + WHERE ip.fields_id={old_field_id} AND res_id IS NULL AND sub.id IS NOT NULL + """ + ) + for company_id, value in env.cr.fetchall(): + env["ir.default"].set( + "res.partner", + "property_outbound_payment_method_line_id", + value, + company_id=company_id, + ) + + +def account_account_code_fields(env): + """ + Fill account.account#code_store from company_id and code + """ + env.cr.execute( + """ + UPDATE account_account + SET code_store=json_build_object(company_id, code) + """ + ) + + +@openupgrade.migrate() +def migrate(env, version): + replace_period_lock_date(env) + link_payments_to_moves(env) + account_account_code_fields(env) + openupgrade.m2o_to_x2m( + env.cr, env["account.account"], "account_account", "company_ids", "company_id" + ) + convert_company_dependent(env) + fill_res_partner_property_x_payment_method_line_id(env) + openupgrade.load_data(env, "account", "18.0.1.3/noupdate_changes.xml") + openupgrade.delete_record_translations( + env.cr, "account", ["email_template_edi_invoice"] + ) + openupgrade.delete_record_translations( + env.cr, + "account", + ["account_payment_method_manual_in", "account_payment_method_manual_out"], + ["name"], + ) + openupgrade.delete_record_translations( + env.cr, + "account", + [ + "onboarding_onboarding_step_chart_of_accounts", + "onboarding_onboarding_step_company_data", + "onboarding_onboarding_step_fiscal_year", + ], + ["title"], + ) + openupgrade.delete_records_safely_by_xml_id( + env, + [ + "account.default_followup_trust", + "account.account_move_send_rule_group_invoice", + "account.account_root_comp_rule", + "count.onboarding_onboarding_account_invoice", + "account.onboarding_onboarding_step_bank_account", + "account.onboarding_onboarding_step_create_invoice", + "account.onboarding_onboarding_step_default_taxes", + "account.onboarding_onboarding_step_setup_bill", + ], + ) diff --git a/openupgrade_scripts/scripts/account/18.0.1.3/pre-migration.py b/openupgrade_scripts/scripts/account/18.0.1.3/pre-migration.py new file mode 100644 index 000000000000..f44914c7c3fe --- /dev/null +++ b/openupgrade_scripts/scripts/account/18.0.1.3/pre-migration.py @@ -0,0 +1,199 @@ +# Copyright 2025 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from openupgradelib import openupgrade + +field_renames = [ + ("account.move", "account_move", "payment_id", "origin_payment_id"), + ("account.move", "account_move", "reversal_move_id", "reversal_move_ids"), + ("account.move", "account_move", "send_and_print_values", "sending_data"), + ( + "account.payment", + "account_payment", + "journal_id", + "old_journal_id", + ), # to avoid conflict in ir.model.fields + ("account.payment", "account_payment", "destination_journal_id", "journal_id"), +] + +field_renames_l10n_dk_bookkeeping = [ + ( + "account.move", + "account_move", + "l10n_dk_currency_rate_at_transaction", + "invoice_currency_rate", + ), +] + +_new_columns = [ + ("account.bank.statement.line", "company_id", "many2one"), + ("account.bank.statement.line", "journal_id", "many2one"), + ("account.journal", "autocheck_on_post", "boolean", True), + ("account.move", "amount_untaxed_in_currency_signed", "float"), + ("account.move", "checked", "boolean"), + ("account.move", "preferred_payment_method_line_id", "many2one"), + ("account.reconcile.model", "counterpart_type", "selection", "general"), + ("account.tax", "price_include_override", "selection", "tax_excluded"), + ("account.payment", "name", "char"), + ("account.payment", "date", "date"), + ("account.payment", "memo", "char"), + ("account.payment", "state", "selection"), + ("account.payment", "is_sent", "boolean"), +] + + +def rename_selection_option(env): + openupgrade.logged_query( + env.cr, + """ + UPDATE account_account + SET internal_group = 'off' + WHERE internal_group = 'off_balance'""", + ) + openupgrade.logged_query( + env.cr, + """ + UPDATE account_report + SET default_opening_date_filter = 'last_' || substr( + default_opening_date_filter, 10) + WHERE left(default_opening_date_filter, 9) = 'previous_'""", + ) + openupgrade.logged_query( + env.cr, + """ + UPDATE account_report_expression + SET date_scope = 'strict_range' + WHERE date_scope = 'normal'""", + ) + openupgrade.logged_query( + env.cr, + """ + UPDATE account_tax + SET price_include_override = 'tax_included' + WHERE price_include""", + ) + + +def update_account_move_amount_untaxed_in_currency_signed(env): + openupgrade.logged_query( + env.cr, + """ + UPDATE account_move + SET amount_untaxed_in_currency_signed = CASE + WHEN move_type IN ('out_invoice', 'in_refund', 'out_receipt') + THEN COALESCE(amount_untaxed, 0.0) + ELSE (-1) * COALESCE(amount_untaxed, 0.0) END""", + ) + + +def update_account_move_checked(env): + openupgrade.logged_query( + env.cr, + """ + UPDATE account_move + SET checked = TRUE + WHERE to_check IS DISTINCT FROM TRUE""", + ) + + +def fill_account_move_preferred_payment_method_line_id(env): + if openupgrade.column_exists(env.cr, "account_move", "preferred_payment_method_id"): + # having account_check_printing module + openupgrade.logged_query( + env.cr, + """ + UPDATE account_move am2 + SET preferred_payment_method_line_id = COALESCE(apml.id, apml2.id) + FROM account_move am + JOIN account_payment_method apm ON + apm.id = am.preferred_payment_method_id + LEFT JOIN account_payment_method_line apml ON + apml.payment_method_id = apm.id AND apml.journal_id = am.journal_id + LEFT JOIN account_payment_method_line apml2 ON + apml2.payment_method_id = apm.id AND apml2.journal_id IS NULL + WHERE am.id = am2.id""", + ) + + +def adapt_account_move_sending_data(env): + # sp_partner_id -> author_partner_id: + openupgrade.logged_query( + env.cr, + """ + UPDATE account_move + SET sending_data = jsonb_set(sending_data::jsonb - 'sp_partner_id', + '{author_partner_id}', sending_data::jsonb->'sp_partner_id') + WHERE sending_data IS NOT NULL AND sending_data::jsonb ? 'sp_partner_id'""", + ) + # sp_user_id -> author_user_id: + openupgrade.logged_query( + env.cr, + """ + UPDATE account_move + SET sending_data = jsonb_set(sending_data::jsonb - 'sp_user_id', + '{author_user_id}', sending_data::jsonb->'sp_user_id') + WHERE sending_data IS NOT NULL AND sending_data::jsonb ? 'sp_user_id'""", + ) + # send_mail: True -> 'sending_methods': {"email"}: + openupgrade.logged_query( + env.cr, + """ + UPDATE account_move + SET sending_data = jsonb_set(sending_data::jsonb - 'send_mail', + '{sending_methods}', '["email"]'::jsonb) + WHERE sending_data IS NOT NULL + AND sending_data::jsonb @> '{"send_mail": "true"}'::jsonb""", + ) + + +def fill_account_payment(env): + openupgrade.logged_query( + env.cr, + """ + UPDATE account_payment ap + SET memo = am.ref, + state= CASE WHEN am.state = 'cancel' THEN 'canceled' + WHEN am.payment_state = 'paid' THEN 'paid' + WHEN am.state = 'posted' THEN 'in_process' + ELSE am.state END, + is_sent = am.is_move_sent, + name = CASE WHEN am.name != '/' THEN am.name + ELSE 'Draft Payment' END, + date = am.date, + journal_id = CASE WHEN ap.journal_id IS NULL + AND aj.type in ('bank', 'cash', 'credit') + THEN am.journal_id ELSE ap.journal_id END + FROM account_move am + LEFT JOIN account_journal aj ON am.journal_id = aj.id + WHERE ap.move_id = am.id""", + ) + + +@openupgrade.migrate() +def migrate(env, version): + if openupgrade.column_exists( + env.cr, "account_move", "l10n_dk_currency_rate_at_transaction" + ): + openupgrade.rename_fields(env, field_renames_l10n_dk_bookkeeping) + openupgrade.rename_fields(env, field_renames) + openupgrade.add_columns(env, _new_columns) + update_account_move_amount_untaxed_in_currency_signed(env) + update_account_move_checked(env) + fill_account_move_preferred_payment_method_line_id(env) + adapt_account_move_sending_data(env) + rename_selection_option(env) + fill_account_payment(env) + openupgrade.convert_field_to_html( + env.cr, + "account_tax", + "description", + "description", + verbose=False, + translate=True, + ) + openupgrade.delete_records_safely_by_xml_id( + env, + [ + "account.action_account_unreconcile", + ], + ) diff --git a/openupgrade_scripts/scripts/account/18.0.1.3/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/account/18.0.1.3/upgrade_analysis_work.txt new file mode 100644 index 000000000000..d8cffa543635 --- /dev/null +++ b/openupgrade_scripts/scripts/account/18.0.1.3/upgrade_analysis_work.txt @@ -0,0 +1,377 @@ +---Models in module 'account'--- +obsolete model account.tour.upload.bill [transient] +obsolete model account.tour.upload.bill.email.confirm [transient] +obsolete model account.unreconcile [transient] +new model account.autopost.bills.wizard [transient] +new model account.code.mapping [sql_view] +new model account.lock_exception +new model account.merge.wizard [transient] +new model account.merge.wizard.line [transient] +new model account.move.send.batch.wizard [transient] +new model account.move.send.wizard [transient] +new model account.secure.entries.wizard [transient] +# NOTHING TO DO + +---Fields in module 'account'--- +account / account.account / _order : _order is now 'code, placeholder_code' ('code, company_id') +account / account.account / code_mapping_ids (one2many) : NEW relation: account.code.mapping +# NOTHING TO DO + +account / account.account / code (char) : not stored anymore +account / account.account / code (char) : now a function +account / account.account / code_store (char) : NEW +# DONE: post-migration: fill code_store from code and company_id + +account / account.account / company_currency_id (many2one): not related anymore +account / account.account / company_currency_id (many2one): now a function +# NOTHING TO DO + +account / account.account / company_id (many2one) : DEL relation: res.company, required +account / account.account / company_ids (many2many) : NEW relation: res.company, required, hasdefault: default +# DONE: post-migration: many2one to many2many + +account / account.account / display_mapping_tab (boolean) : NEW hasdefault: default, stored: False +# NOTHING TO DO: store = False + +account / account.account / group_id (many2one) : not stored anymore +account / account.account / include_initial_balance (boolean): not stored anymore +account / account.account / internal_group (selection) : not stored anymore +account / account.account / root_id (many2one) : not stored anymore +# NOTHING TO DO + +account / account.account / internal_group (selection) : selection_keys is now '['asset', 'equity', 'expense', 'income', 'liability', 'off']' ('['asset', 'equity', 'expense', 'income', 'liability', 'off_balance']') +# DONE: pre-migration: rename 'off_balance' to 'off' + +account / account.bank.statement.line / company_id (many2one) : is now stored +account / account.bank.statement.line / company_id (many2one) : now required +# DONE: pre-migration: pre-created and filled + +account / account.bank.statement.line / journal_id (many2one) : is now stored +# DONE: pre-migration: pre-created and filled + +account / account.cash.rounding / loss_account_id (many2one) : needs conversion to v18-style company dependent +account / account.cash.rounding / profit_account_id (many2one) : needs conversion to v18-style company dependent +# DONE: post-migration: used openupgrade_180.convert_company_dependent + +account / account.group / parent_path (char) : DEL +# NOTHING TO DO + +account / account.journal / autocheck_on_post (boolean) : NEW hasdefault: default +# DONE: pre-migration: pre-created and filled + +account / account.journal / sale_activity_note (text) : DEL +account / account.journal / sale_activity_type_id (many2one): DEL relation: mail.activity.type +account / account.journal / sale_activity_user_id (many2one): DEL relation: res.users +# NOTHING TO DO: https://github.com/odoo/odoo/commit/ab3c81b680a1019ff33aabf87cf533af7bfe8cfa + +account / account.journal / secure_sequence_id (many2one) : DEL relation: ir.sequence +# NOTHING TO DO: https://github.com/odoo/odoo/commit/9a1b320255766f4c7c72e9bbf50c1d50615ab397 + +account / account.journal / type (selection) : selection_keys is now '['bank', 'cash', 'credit', 'general', 'purchase', 'sale']' ('['bank', 'cash', 'general', 'purchase', 'sale']') +# NOTHING TO DO: new 'credit' option + +account / account.lock_exception / active (boolean) : NEW hasdefault: default +account / account.lock_exception / company_id (many2one) : NEW relation: res.company, required +account / account.lock_exception / company_lock_date (date) : NEW +account / account.lock_exception / end_datetime (datetime) : NEW +account / account.lock_exception / lock_date (date) : NEW +account / account.lock_exception / lock_date_field (selection) : NEW required, selection_keys: ['fiscalyear_lock_date', 'purchase_lock_date', 'sale_lock_date', 'tax_lock_date'] +account / account.lock_exception / reason (char) : NEW +account / account.lock_exception / user_id (many2one) : NEW relation: res.users, hasdefault: default +# NOTHING TO DO: new feature + +account / account.move / amount_untaxed_in_currency_signed (float): NEW isfunction: function, stored +# DONE: pre-migration: pre-created and filled + +account / account.move / audit_trail_message_ids (one2many): NEW relation: mail.message +# NOTHING TO DO + +account / account.move / checked (boolean) : NEW +account / account.move / to_check (boolean) : DEL +# DONE: pre-migration: pre-created and filled + +account / account.move / invoice_currency_rate (float) : NEW isfunction: function, stored +l10n_dk_bookkeeping / account.move / l10n_dk_currency_rate_at_transaction (float): DEL +# DONE: pre-migration: rename field + +account / account.move / is_manually_modified (boolean): NEW +# NOTHING TO DO: new feature for account.autopost.bills.wizard + +account / account.move / journal_group_id (many2one) : NEW relation: account.journal.group, stored: False +# NOTHING TO DO: store = False + +account / account.move / made_sequence_gap (boolean) : NEW isfunction: function, stored +# NOTHING TO DO: will be computed by ORM + +account / account.move / origin_payment_id (many2one) : NEW relation: account.payment +account / account.move / payment_id (many2one) : DEL relation: account.payment +# DONE: pre-migration: rename field + +account / account.move / payment_state (selection) : selection_keys is now '['blocked', 'in_payment', 'invoicing_legacy', 'not_paid', 'paid', 'partial', 'reversed']' ('['in_payment', 'invoicing_legacy', 'not_paid', 'paid', 'partial', 'reversed']') +# NOTHING TO DO: new 'blocked' option + +account / account.move / preferred_payment_method_line_id (many2one): NEW relation: account.payment.method.line, hasdefault: compute +# DONE: pre-migration: pre-created and fill using old preferred_payment_method_id (from account_check_printing) + +account / account.move / reversal_move_id (one2many) : DEL relation: account.move +account / account.move / reversal_move_ids (one2many) : NEW relation: account.move +# DONE: pre-migration: rename field + +account / account.move / send_and_print_values (json) : DEL +account / account.move / sending_data (json) : NEW +# DONE: pre-migration: rename field (and adapt json values) + +account / account.move.line / account_root_id (many2one) : not stored anymore +account / account.move.line / analytic_distribution_search (json): DEL stored: False +# NOTHING TO DO + +account / account.move.line / blocked (boolean) : DEL +# NOTHING TO DO: https://github.com/odoo/odoo/commit/67dc71588751c9f115e09959d774686c2207a1f9 + +account / account.move.line / is_imported (boolean) : NEW +# NOTHING TO DO? + +account / account.move.line / journal_group_id (many2one) : NEW relation: account.journal.group, stored: False +# NOTHING TO DO: store = False + +account / account.move / matched_payment_ids (many2many): NEW relation: account.payment +account / account.payment / invoice_ids (many2many) : NEW relation: account.move +account / account.payment / _inherits : DEL _inherits: {'account.move': 'move_id'}, stored: False +# DONE: post-migration: link payments to moves + +account / account.payment / attachment_ids (one2many) : is now stored +account / account.payment / attachment_ids (one2many) : not related anymore +account / account.payment / company_id (many2one) : is now stored +account / account.payment / company_id (many2one) : not related anymore +account / account.payment / company_id (many2one) : now required +account / account.payment / date (date) : is now stored +account / account.payment / date (date) : not related anymore +account / account.payment / destination_journal_id (many2one): DEL relation: account.journal +account / account.payment / is_internal_transfer (boolean): DEL +account / account.payment / is_sent (boolean) : NEW +account / account.payment / journal_id (many2one) : is now stored +account / account.payment / journal_id (many2one) : not related anymore +account / account.payment / memo (char) : NEW +account / account.payment / name (char) : is now stored +account / account.payment / name (char) : not related anymore +account / account.payment / name (char) : now a function +account / account.payment / state (selection) : is now stored +account / account.payment / state (selection) : not related anymore +account / account.payment / state (selection) : selection_keys is now '['canceled', 'draft', 'in_process', 'paid', 'rejected']' ('function') +# DONE: pre-migration: pre-create account.move fields and fill them + +account / account.payment.term.line / delay_type (selection) : selection_keys is now '['days_after', 'days_after_end_of_month', 'days_after_end_of_next_month', 'days_end_of_month_on_the']' ('['days_after', 'days_after_end_of_month', 'days_after_end_of_next_month']') +account_payment_term / account.payment.term.line / delay_type (False) : DEL selection_keys: ['days_after', 'days_after_end_of_month', 'days_after_end_of_next_month', 'days_end_of_month_on_the'], mode: modify +# NOTHING TO DO + +account / account.reconcile.model / counterpart_type (selection) : NEW selection_keys: ['general', 'purchase', 'sale'], hasdefault: default +# DONE: pre-migration: pre-created and filled + +account / account.reconcile.model.line / analytic_distribution_search (json): DEL stored: False +# NOTHING TO DO + +account / account.report / currency_translation (selection): NEW selection_keys: ['cta', 'current'], hasdefault: compute +account / account.report / filter_budgets (boolean) : NEW hasdefault: compute +# NOTHING TO DO + +account / account.report / default_opening_date_filter (selection): selection_keys is now '['previous_month', 'previous_quarter', 'previous_tax_period', 'previous_year', 'this_month', 'this_quarter', 'this_tax_period', 'this_year', 'today']' ('['last_month', 'last_quarter', 'last_tax_period', 'last_year', 'this_month', 'this_quarter', 'this_tax_period', 'this_year', 'today']') +# DONE: pre-migration: renamed options + + +account / account.report / integer_rounding (selection) : NEW selection_keys: ['DOWN', 'HALF-UP', 'UP'] +account / account.report.line / horizontal_split_side (selection): NEW selection_keys: ['left', 'right'], hasdefault: compute +# NOTHING TO DO + +account / account.report.expression / date_scope (selection) : selection_keys is now '['from_beginning', 'from_fiscalyear', 'previous_tax_period', 'strict_range', 'to_beginning_of_fiscalyear', 'to_beginning_of_period']' ('['from_beginning', 'from_fiscalyear', 'normal', 'previous_tax_period', 'strict_range', 'to_beginning_of_fiscalyear', 'to_beginning_of_period']') +# DONE: pre-migration: removed 'normal' option, changed to 'strict_range' + +account / account.tax / description (char) : type is now 'html' ('char') +# DONE: pre-migration: use openupgradelib convert_field_to_html + +account / account.tax / invoice_legal_notes (html) : NEW +# NOTHING TO DO + +account / account.tax / price_include (boolean) : not stored anymore +account / account.tax / price_include (boolean) : now a function +account / account.tax / price_include_override (selection): NEW selection_keys: ['tax_excluded', 'tax_included'] +# DONE: pre-migration: price_include_override pre-created and filled using old price_include + +account / account.tax.group / pos_receipt_label (char) : NEW +account / ir.actions.report / is_invoice_report (boolean) : NEW +# NOTHING TO DO + +account / product.category / property_account_expense_categ_id (many2one): needs conversion to v18-style company dependent +account / product.category / property_account_income_categ_id (many2one): needs conversion to v18-style company dependent +account / product.template / property_account_expense_id (many2one): needs conversion to v18-style company dependent +account / product.template / property_account_income_id (many2one): needs conversion to v18-style company dependent +# DONE: post-migration: used openupgrade_180.convert_company_dependent + +account / res.company / account_journal_payment_credit_account_id (many2one): DEL relation: account.account +account / res.company / account_journal_payment_debit_account_id (many2one): DEL relation: account.account +# NOTHING TO DO + +account / res.company / account_price_include (selection): NEW required, selection_keys: ['tax_excluded', 'tax_included'], hasdefault: default +account / res.company / autopost_bills (boolean) : NEW hasdefault: default +account / res.company / batch_payment_sequence_id (many2one): NEW relation: ir.sequence +account / res.company / display_invoice_tax_company_currency (boolean): NEW hasdefault: default +# NOTHING TO DO: new features + +account / res.company / country_code (char) : module is now 'base' ('account') +# NOTHING TO DO + +account / res.company / invoice_is_download (boolean) : DEL +account / res.company / invoice_is_email (boolean) : DEL +# NOTHING TO DO: https://github.com/odoo/odoo/commit/9e769e1b11f22890e5245859053bc8dd31e42634 + +account / res.company / hard_lock_date (date) : NEW +account / res.company / period_lock_date (date) : DEL +account / res.company / purchase_lock_date (date) : NEW +account / res.company / sale_lock_date (date) : NEW +# DONE: post-migration: filled sale_lock_date and purchase_lock_date with period_lock_date + +account / res.currency / fiscal_country_codes (char) : not a function anymore +NOTHING TO DO (still store=False) + +account / res.partner / autopost_bills (selection) : NEW required, selection_keys: ['always', 'ask', 'never'], hasdefault: default +account / res.partner / display_invoice_edi_format (boolean): NEW hasdefault: default, stored: False +account / res.partner / display_invoice_template_pdf_report_id (boolean): NEW hasdefault: default, stored: False +account / res.partner / ignore_abnormal_invoice_amount (boolean): NEW +account / res.partner / ignore_abnormal_invoice_date (boolean): NEW +account / res.partner / invoice_edi_format_store (char): NEW +account / res.partner / invoice_sending_method (selection): NEW selection_keys: ['email', 'manual'] +account / res.partner / invoice_template_pdf_report_id (many2one): NEW relation: ir.actions.report +NOTHING TO DO: new features + +account / res.partner / last_time_entries_checked (datetime): DEL +# NOTHING TO DO: https://github.com/odoo/odoo/commit/3cec797886e5179cc0efd9e70ab267a215f6dced + +account / res.partner / property_inbound_payment_method_line_id (many2one): NEW relation: account.payment.method.line +account / res.partner / property_outbound_payment_method_line_id (many2one): NEW relation: account.payment.method.line +# post-migration: use old property_payment_method_id (from account_check_printing) to fill property_outbound_payment_method_line_id + +account / res.partner / credit_limit (float) : needs conversion to v18-style company dependent +account / res.partner / property_account_payable_id (many2one): needs conversion to v18-style company dependent +account / res.partner / property_account_position_id (many2one): needs conversion to v18-style company dependent +account / res.partner / property_account_receivable_id (many2one): needs conversion to v18-style company dependent +account / res.partner / property_payment_term_id (many2one): needs conversion to v18-style company dependent +account / res.partner / property_supplier_payment_term_id (many2one): needs conversion to v18-style company dependent +account / res.partner / trust (selection) : needs conversion to v18-style company dependent +# DONE: post-migration: used openupgrade_180.convert_company_dependent + +account_audit_trail / mail.mail / account_audit_log_preview (html): type is now 'text' ('html') +account_audit_trail / mail.message / account_audit_log_preview (html): type is now 'text' ('html') +# NOTHING TO DO (still store=False) + +---XML records in module 'account'--- +NEW account.payment.term: account.account_payment_term_90days_on_the_10th (noupdate) +NEW digest.tip: account.digest_tip_account_1 +NEW ir.actions.act_window: account.account_merge_wizard_action +NEW ir.actions.act_window: account.action_account_audit_trail_report [renamed from account_audit_trail module] +NEW ir.actions.act_window: account.action_amounts_to_settle +NEW ir.actions.act_window: account.action_base_document_layout_configurator +NEW ir.actions.act_window: account.action_credit_statement_tree +NEW ir.actions.act_window: account.action_move_in_invoice +NEW ir.actions.act_window: account.action_move_out_invoice +NEW ir.actions.act_window: account.action_view_account_secure_entries_wizard +# NOTHING TO DO + +DEL ir.actions.act_window: account.action_account_unreconcile +NEW ir.actions.server: account.action_account_unreconcile +# DONE: pre-migration: deleted old one to avoid conflict + +DEL ir.actions.act_window: account.action_open_payment_items +DEL ir.actions.act_window: account.action_open_sale_payment_items +DEL ir.actions.act_window: account_audit_trail.action_account_audit_trail_report [renamed to account module] +NEW ir.actions.server: account.action_move_block_payment +NEW ir.actions.server: account.action_move_force_register_payment +NEW ir.actions.server: account.action_unmerge_accounts +DEL ir.actions.server: account.action_account_invoice_from_list +DEL ir.actions.server: account.invoice_send +NEW ir.model.access: account.access_account_autopost_bills_wizard +NEW ir.model.access: account.access_account_code_mapping +NEW ir.model.access: account.access_account_code_mapping_manager +NEW ir.model.access: account.access_account_group_basic +NEW ir.model.access: account.access_account_lock_exception +NEW ir.model.access: account.access_account_lock_exception_manager +NEW ir.model.access: account.access_account_merge_wizard_line_manager +NEW ir.model.access: account.access_account_merge_wizard_manager +NEW ir.model.access: account.access_account_move_send_batch_wizard +NEW ir.model.access: account.access_account_move_send_wizard +NEW ir.model.access: account.access_account_payment_term_portal +NEW ir.model.access: account.access_account_report_basic +NEW ir.model.access: account.access_account_report_column_basic +NEW ir.model.access: account.access_account_report_expression_basic +NEW ir.model.access: account.access_account_report_line_basic +NEW ir.model.access: account.access_account_secure_entries_wizard +DEL ir.model.access: account.access_account_move_send +DEL ir.model.access: account.access_account_tour_upload_bill +DEL ir.model.access: account.access_account_tour_upload_bill_email_confirm +DEL ir.model.access: account.access_account_unreconcile +# NOTHING TO DO + +DEL ir.property: account.default_followup_trust (noupdate) +# DONE: post-migration: delete old property safely (now it's an ir.default record created by ORM) + +NEW ir.rule: account.account_move_send_batch_rule_group_invoice (noupdate) +NEW ir.rule: account.account_move_send_single_rule_group_invoice (noupdate) +DEL ir.rule: account.account_move_send_rule_group_invoice (noupdate) +DEL ir.rule: account.account_root_comp_rule (noupdate) +# DONE: post-migration: delete old rules safely + +NEW ir.sequence: account.seq_account_payment (noupdate) +NEW ir.ui.menu: account.account_audit_trail_menu [renamed from account_audit_trail module] +NEW ir.ui.menu: account.account_reports_partners_reports_menu +NEW ir.ui.menu: account.menu_action_secure_entries +DEL ir.ui.menu: account.menu_account_supplier_accounts +DEL ir.ui.menu: account.menu_finance_entries_accounting_miscellaneous +DEL ir.ui.menu: account.menu_finance_entries_actions +DEL ir.ui.menu: account.menu_finance_entries_generate_entries +DEL ir.ui.menu: account.menu_finance_entries_management +DEL ir.ui.menu: account_audit_trail.account_audit_trail_menu [renamed to account module] +NEW ir.ui.view: account.account_merge_wizard_form +NEW ir.ui.view: account.account_move_send_batch_wizard_form +NEW ir.ui.view: account.account_move_send_wizard_form +NEW ir.ui.view: account.autopost_bills_wizard +NEW ir.ui.view: account.email_template_mail_gateway_failed (noupdate) +NEW ir.ui.view: account.ir_actions_report_form_inherit_account +NEW ir.ui.view: account.partner_missing_account_list_view +NEW ir.ui.view: account.portal_my_details_fields +NEW ir.ui.view: account.product_product_view_form_normalized_account +NEW ir.ui.view: account.product_view_search_catalog +NEW ir.ui.view: account.report_invoice_document_preview +NEW ir.ui.view: account.report_invoice_wizard_iframe +NEW ir.ui.view: account.res_partner_view_tree +NEW ir.ui.view: account.tests_shared_js_python +NEW ir.ui.view: account.view_account_bill_filter +NEW ir.ui.view: account.view_account_lock_exception_form +NEW ir.ui.view: account.view_account_move_with_gaps_in_sequence_filter +NEW ir.ui.view: account.view_account_payment_method_line_kanban_mobile +NEW ir.ui.view: account.view_account_secure_entries_wizard +NEW ir.ui.view: account.view_base_document_layout +NEW ir.ui.view: account.view_duplicated_moves_tree_js +NEW ir.ui.view: account.view_message_tree_audit_log +NEW ir.ui.view: account.view_message_tree_audit_log_search +NEW ir.ui.view: account.view_move_tree_multi_edit +DEL ir.ui.view: account.account_move_send_form +DEL ir.ui.view: account.account_tour_upload_bill +DEL ir.ui.view: account.account_tour_upload_bill_email_confirm +DEL ir.ui.view: account.account_unreconcile_view +DEL ir.ui.view: account.tax_groups_totals +DEL ir.ui.view: account.view_account_payment_method_line_kanban +DEL ir.ui.view: account_audit_trail.res_config_settings_view_form_inherit_account_audit_trail +DEL ir.ui.view: account_audit_trail.view_message_tree_audit_log +DEL ir.ui.view: account_audit_trail.view_message_tree_audit_log_search +DEL ir.ui.view: account_payment_term.account_payment_term_form +DEL ir.ui.view: l10n_dk_bookkeeping.view_move_form_l10n_dk +DEL ir.ui.view: l10n_dk_bookkeeping.view_move_line_tree_l10n_dk +NEW res.groups: account.group_account_basic +NEW res.groups: account.group_account_secured +NEW web_tour.tour: account.account_tour +# NOTHING TO DO + +DEL onboarding.onboarding: account.onboarding_onboarding_account_invoice (noupdate) +DEL onboarding.onboarding.step: account.onboarding_onboarding_step_bank_account (noupdate) +DEL onboarding.onboarding.step: account.onboarding_onboarding_step_create_invoice (noupdate) +DEL onboarding.onboarding.step: account.onboarding_onboarding_step_default_taxes (noupdate) +DEL onboarding.onboarding.step: account.onboarding_onboarding_step_setup_bill (noupdate) +# DONE: post-migration: safely delete diff --git a/openupgrade_scripts/scripts/account/tests/data.py b/openupgrade_scripts/scripts/account/tests/data.py new file mode 100644 index 000000000000..9b088680aa9a --- /dev/null +++ b/openupgrade_scripts/scripts/account/tests/data.py @@ -0,0 +1,19 @@ +env = locals().get("env") +# call sending wizard on some moves asynchronously +action = ( + env["account.move"] + .search( + [ + ("move_type", "=", "out_invoice"), + ("state", "=", "posted"), + ("company_id", "=", env.ref("base.main_company").id), + ] + ) + .action_send_and_print() +) +env[action["res_model"]].with_context(**action["context"]).create( + { + "checkbox_download": False, + } +).action_send_and_print() +env.cr.commit() diff --git a/openupgrade_scripts/scripts/account/tests/test_migration.py b/openupgrade_scripts/scripts/account/tests/test_migration.py new file mode 100644 index 000000000000..e9d14568d468 --- /dev/null +++ b/openupgrade_scripts/scripts/account/tests/test_migration.py @@ -0,0 +1,25 @@ +from odoo.tests import TransactionCase + +from odoo.addons.openupgrade_framework import openupgrade_test + + +@openupgrade_test +class TestAccountMigration(TransactionCase): + def test_sending_data(self): + """ + Test that me migrate send_and_print_values correctly to sending_data + """ + moves_with_sending_data = self.env["account.move"].search( + [ + ("sending_data", "!=", False), + ] + ) + self.assertTrue(moves_with_sending_data) + self.assertEqual( + moves_with_sending_data[0].sending_data["author_user_id"], + self.env.user.id, + ) + self.assertEqual( + moves_with_sending_data[0].sending_data["author_partner_id"], + self.env.user.partner_id.id, + )