From 2a2b1ad9d8b12945b05608fdca659e99aa5b7f37 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Tue, 4 Feb 2020 15:36:10 +0100 Subject: [PATCH] [RFR] Apply a mapping instead of separate queries --- .isort.cfg | 2 +- account_tax_balance/hooks.py | 97 ++++++++++++------------------------ 2 files changed, 34 insertions(+), 65 deletions(-) diff --git a/.isort.cfg b/.isort.cfg index baba7071..abead222 100644 --- a/.isort.cfg +++ b/.isort.cfg @@ -9,4 +9,4 @@ line_length=88 known_odoo=odoo known_odoo_addons=odoo.addons sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER -known_third_party=dateutil +known_third_party=dateutil,psycopg2 diff --git a/account_tax_balance/hooks.py b/account_tax_balance/hooks.py index 2fa89e8e..1fafad71 100644 --- a/account_tax_balance/hooks.py +++ b/account_tax_balance/hooks.py @@ -1,7 +1,10 @@ -# © 2020 Opener B.V. +# Copyright 2020 Opener B.V. +# Copyright 2020 Tecnativa - Pedro M. Baeza # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). import logging +from psycopg2 import sql + def pre_init_hook(cr): """ Precreate move_type and fill with appropriate values to prevent @@ -10,66 +13,32 @@ def pre_init_hook(cr): important as one move can have move lines on accounts of multiple types and the move type is set in the order of precedence. """ logger = logging.getLogger(__name__) - logger.info('Add account_move.move_type column if it does not yet exist') - cr.execute( - "ALTER TABLE account_move ADD COLUMN IF NOT EXISTS move_type VARCHAR") - cr.execute( - """ - UPDATE account_move am SET move_type = 'liquidity' - FROM account_move_line aml - WHERE aml.account_id IN ( - SELECT id FROM account_account - WHERE internal_type = 'liquidity') - AND aml.move_id = am.id AND am.move_type IS NULL - """) - logger.info('%s move set to type liquidity', cr.rowcount) - cr.execute( - """ - UPDATE account_move am SET move_type = 'payable' - FROM account_move_line aml - WHERE aml.account_id IN ( - SELECT id FROM account_account - WHERE internal_type = 'payable') - AND aml.move_id = am.id AND am.move_type IS NULL - AND aml.balance < 0 - """) - logger.info('%s move set to type payable', cr.rowcount) - cr.execute( - """ - UPDATE account_move am SET move_type = 'payable_refund' - FROM account_move_line aml - WHERE aml.account_id IN ( - SELECT id FROM account_account - WHERE internal_type = 'payable') - AND aml.move_id = am.id AND am.move_type IS NULL - AND aml.balance >= 0 - """) - logger.info('%s move set to type payable_refund', cr.rowcount) - cr.execute( - """ - UPDATE account_move am SET move_type = 'receivable' - FROM account_move_line aml - WHERE aml.account_id IN ( - SELECT id FROM account_account - WHERE internal_type = 'receivable') - AND aml.move_id = am.id AND am.move_type IS NULL - AND aml.balance > 0 - """) - logger.info('%s move set to type receivable', cr.rowcount) - cr.execute( - """ - UPDATE account_move am SET move_type = 'receivable_refund' - FROM account_move_line aml - WHERE aml.account_id IN ( - SELECT id FROM account_account - WHERE internal_type = 'receivable') - AND aml.move_id = am.id AND am.move_type IS NULL - AND aml.balance <= 0 - """) - logger.info('%s move set to type receivable_refund', cr.rowcount) - cr.execute( - """ - UPDATE account_move am SET move_type = 'other' - WHERE am.move_type IS NULL - """) - logger.info('%s move set to type other', cr.rowcount) + logger.info("Add account_move.move_type column if it does not yet exist") + cr.execute("ALTER TABLE account_move ADD COLUMN IF NOT EXISTS move_type VARCHAR") + MAPPING = [ + ("liquidity", "liquidity", False), + ("payable", "payable", "AND aml.balance < 0"), + ("payable_refund", "payable", "AND aml.balance >= 0"), + ("receivable", "receivable", "AND aml.balance < 0"), + ("receivable_refund", "receivable", "AND aml.balance >= 0"), + ("other", False, False), + ] + for move_type, internal_type, extra_where in MAPPING: + args = [move_type] + query = sql.SQL("UPDATE account_move am SET move_type = %s") + if internal_type: + query += sql.SQL( + """FROM account_move_line aml + WHERE aml.account_id IN ( + SELECT id FROM account_account + WHERE internal_type = %s) + AND aml.move_id = am.id AND am.move_type IS NULL + """ + ) + args.append(internal_type) + else: + query += sql.SQL("WHERE am.move_type IS NULL") + if extra_where: + query += sql.SQL(extra_where) + cr.execute(query, tuple(args)) + logger.info("%s move set to type %s", move_type, cr.rowcount)