From ec0a0cbd465dc3f605b6c6523564e0700e5d00d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phan=20Sainl=C3=A9ger?= Date: Fri, 6 Feb 2026 11:31:18 +0100 Subject: [PATCH] [IMP] add migrations script to use bank-payment-alternative addons in 18.0 --- versions/18.0/post_upgrade.sh | 156 +++++++++++++++++++++++++++++++++- versions/18.0/pre_upgrade.sh | 77 +++++++++++++++++ 2 files changed, 232 insertions(+), 1 deletion(-) diff --git a/versions/18.0/post_upgrade.sh b/versions/18.0/post_upgrade.sh index 5fc085c..4821164 100755 --- a/versions/18.0/post_upgrade.sh +++ b/versions/18.0/post_upgrade.sh @@ -3,4 +3,158 @@ set -euo pipefail echo "Post migration to 18.0..." -#compose --debug run ou18 -u base --stop-after-init --no-http +# ============================================================================ +# BANK-PAYMENT -> BANK-PAYMENT-ALTERNATIVE DATA MIGRATION +# Source PR: https://github.com/OCA/bank-payment-alternative/pull/42 +# ============================================================================ +BANK_PAYMENT_POST_SQL=$(cat <<'EOF' +DO $$ +DECLARE + mode_rec RECORD; + new_line_id INTEGER; + journal_rec RECORD; +BEGIN + IF NOT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'account_payment_mode') THEN + RAISE NOTICE 'No account_payment_mode table found, skipping bank-payment migration'; + RETURN; + END IF; + + RAISE NOTICE 'Starting bank-payment to bank-payment-alternative migration...'; + + ALTER TABLE account_payment_method_line + ADD COLUMN IF NOT EXISTS old_payment_mode_id INT, + ADD COLUMN IF NOT EXISTS old_refund_payment_mode_id INT; + + FOR mode_rec IN + SELECT id, name, company_id, payment_method_id, + fixed_journal_id AS journal_id, bank_account_link, + create_date, create_uid, write_date, write_uid, + show_bank_account, refund_payment_mode_id, active + FROM account_payment_mode + LOOP + INSERT INTO account_payment_method_line ( + name, payment_method_id, bank_account_link, journal_id, + selectable, company_id, create_uid, create_date, + write_uid, write_date, show_bank_account, + old_payment_mode_id, old_refund_payment_mode_id, active + ) VALUES ( + to_jsonb(mode_rec.name), + mode_rec.payment_method_id, + mode_rec.bank_account_link, + mode_rec.journal_id, + true, + mode_rec.company_id, + mode_rec.create_uid, + mode_rec.create_date, + mode_rec.write_uid, + mode_rec.write_date, + mode_rec.show_bank_account, + mode_rec.id, + mode_rec.refund_payment_mode_id, + mode_rec.active + ) RETURNING id INTO new_line_id; + + IF mode_rec.bank_account_link = 'variable' THEN + FOR journal_rec IN + SELECT rel.journal_id + FROM account_payment_mode_variable_journal_rel rel + WHERE rel.payment_mode_id = mode_rec.id + LOOP + INSERT INTO account_payment_method_line_journal_rel + (account_payment_method_line_id, account_journal_id) + VALUES (new_line_id, journal_rec.journal_id) + ON CONFLICT DO NOTHING; + END LOOP; + END IF; + + RAISE NOTICE 'Migrated payment mode % -> payment method line %', mode_rec.id, new_line_id; + END LOOP; + + UPDATE account_payment_method_line apml + SET refund_payment_method_line_id = apml2.id + FROM account_payment_method_line apml2 + WHERE apml.old_refund_payment_mode_id IS NOT NULL + AND apml.old_refund_payment_mode_id = apml2.old_payment_mode_id; + + UPDATE account_move am + SET preferred_payment_method_line_id = apml.id + FROM account_payment_mode apm, account_payment_method_line apml + WHERE am.payment_mode_id = apm.id + AND apm.id = apml.old_payment_mode_id + AND am.preferred_payment_method_line_id IS NULL; + + RAISE NOTICE 'account_payment_base_oca migration completed'; +END $$; +EOF +) +echo "Executing bank-payment base migration..." +query_postgres_container "$BANK_PAYMENT_POST_SQL" ou18 || exit 1 + +BANK_PAYMENT_BATCH_SQL=$(cat <<'EOF' +DO $$ +BEGIN + IF NOT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'account_payment_mode') THEN + RETURN; + END IF; + + IF NOT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'account_payment_order') THEN + RAISE NOTICE 'No account_payment_order table, skipping batch migration'; + RETURN; + END IF; + + RAISE NOTICE 'Starting account_payment_batch_oca migration...'; + + IF EXISTS (SELECT FROM information_schema.columns + WHERE table_name = 'account_payment_method' AND column_name = 'payment_order_only') THEN + UPDATE account_payment_method + SET payment_order_ok = payment_order_only + WHERE payment_order_only IS NOT NULL; + END IF; + + UPDATE account_payment_method_line apml + SET payment_order_ok = apm.payment_order_ok, + no_debit_before_maturity = apm.no_debit_before_maturity, + default_payment_mode = apm.default_payment_mode, + default_invoice = apm.default_invoice, + default_target_move = apm.default_target_move, + default_date_type = apm.default_date_type, + default_date_prefered = apm.default_date_prefered, + group_lines = apm.group_lines + FROM account_payment_mode apm + WHERE apml.old_payment_mode_id IS NOT NULL + AND apm.id = apml.old_payment_mode_id; + + IF EXISTS (SELECT FROM information_schema.tables + WHERE table_name = 'account_journal_account_payment_method_line_rel') THEN + DELETE FROM account_journal_account_payment_method_line_rel + WHERE account_payment_method_line_id IN ( + SELECT id FROM account_payment_method_line WHERE old_payment_mode_id IS NOT NULL + ); + + INSERT INTO account_journal_account_payment_method_line_rel + (account_payment_method_line_id, account_journal_id) + SELECT apml.id, rel.account_journal_id + FROM account_journal_account_payment_mode_rel rel + JOIN account_payment_method_line apml ON rel.account_payment_mode_id = apml.old_payment_mode_id + ON CONFLICT DO NOTHING; + END IF; + + UPDATE account_payment_order apo + SET payment_method_line_id = apml.id, + payment_method_code = apm_method.code + FROM account_payment_method_line apml, + account_payment_mode apm, + account_payment_method apm_method + WHERE apo.payment_mode_id = apm.id + AND apml.old_payment_mode_id = apm.id + AND apm_method.id = apml.payment_method_id; + + RAISE NOTICE 'account_payment_batch_oca migration completed'; + RAISE NOTICE 'NOTE: Payment lots for open orders must be generated manually via Odoo UI or script'; +END $$; +EOF +) +echo "Executing bank-payment batch migration..." +query_postgres_container "$BANK_PAYMENT_BATCH_SQL" ou18 || exit 1 + +echo "Post migration to 18.0 completed!" diff --git a/versions/18.0/pre_upgrade.sh b/versions/18.0/pre_upgrade.sh index b2c66d2..13bc857 100755 --- a/versions/18.0/pre_upgrade.sh +++ b/versions/18.0/pre_upgrade.sh @@ -6,6 +6,83 @@ echo "Prepare migration to 18.0..." # Copy database copy_database ou17 ou18 ou18 || exit 1 +# ============================================================================ +# BANK-PAYMENT -> BANK-PAYMENT-ALTERNATIVE MODULE RENAMING +# Migration from OCA/bank-payment to OCA/bank-payment-alternative +# Source PR: https://github.com/OCA/bank-payment-alternative/pull/42 +# +# This renaming MUST be done BEFORE OpenUpgrade runs, so that the migration +# scripts in the new modules (account_payment_base_oca, account_payment_batch_oca) +# can properly migrate the data. +# ============================================================================ +BANK_PAYMENT_RENAME_SQL=$(cat <<'EOF' +DO $$ +DECLARE + renamed_modules TEXT[][] := ARRAY[ + ['account_payment_mode', 'account_payment_base_oca'], + ['account_banking_pain_base', 'account_payment_sepa_base'], + ['account_banking_sepa_credit_transfer', 'account_payment_sepa_credit_transfer'], + ['account_payment_order', 'account_payment_batch_oca'] + ]; + merged_modules TEXT[][] := ARRAY[ + ['account_payment_partner', 'account_payment_base_oca'] + ]; + old_name TEXT; + new_name TEXT; + old_module_id INTEGER; + deleted_count INTEGER; +BEGIN + FOR i IN 1..array_length(renamed_modules, 1) LOOP + old_name := renamed_modules[i][1]; + new_name := renamed_modules[i][2]; + + SELECT id INTO old_module_id FROM ir_module_module WHERE name = old_name; + IF old_module_id IS NOT NULL THEN + RAISE NOTICE 'Renaming module: % -> %', old_name, new_name; + UPDATE ir_module_module SET name = new_name WHERE name = old_name; + UPDATE ir_model_data SET module = new_name WHERE module = old_name; + UPDATE ir_module_module_dependency SET name = new_name WHERE name = old_name; + END IF; + END LOOP; + + FOR i IN 1..array_length(merged_modules, 1) LOOP + old_name := merged_modules[i][1]; + new_name := merged_modules[i][2]; + + SELECT id INTO old_module_id FROM ir_module_module WHERE name = old_name; + IF old_module_id IS NOT NULL THEN + RAISE NOTICE 'Merging module: % -> %', old_name, new_name; + + DELETE FROM ir_model_data + WHERE module = old_name + AND name IN (SELECT name FROM ir_model_data WHERE module = new_name); + GET DIAGNOSTICS deleted_count = ROW_COUNT; + IF deleted_count > 0 THEN + RAISE NOTICE ' Deleted % duplicate ir_model_data records', deleted_count; + END IF; + + UPDATE ir_model_data SET module = new_name WHERE module = old_name; + UPDATE ir_module_module_dependency SET name = new_name WHERE name = old_name; + UPDATE ir_module_module SET state = 'uninstalled' WHERE name = old_name; + DELETE FROM ir_module_module WHERE name = old_name; + END IF; + END LOOP; +END $$; +EOF +) +echo "Executing bank-payment module renaming..." +query_postgres_container "$BANK_PAYMENT_RENAME_SQL" ou18 || exit 1 + +BANK_PAYMENT_PRE_SQL=$(cat <<'EOF' +UPDATE ir_model_data +SET noupdate = false +WHERE module = 'account_payment_base_oca' +AND name = 'view_account_invoice_report_search'; +EOF +) +echo "Executing bank-payment pre-migration..." +query_postgres_container "$BANK_PAYMENT_PRE_SQL" ou18 || exit 1 + # Execute SQL pre-migration commands PRE_MIGRATE_SQL=$(cat <<'EOF' UPDATE account_analytic_plan SET default_applicability=NULL WHERE default_applicability='optional';