From fbb48b893ca6930c71607ce9e451b70839a2921d Mon Sep 17 00:00:00 2001 From: "admin.suherdy" Date: Wed, 19 Nov 2025 16:13:23 +0700 Subject: [PATCH] fix the _ error --- __manifest__.py | 42 +- __pycache__/__init__.cpython-310.pyc | Bin 0 -> 218 bytes __pycache__/__init__.cpython-312.pyc | Bin 0 -> 196 bytes models/__init__.py | 2 +- models/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 281 bytes models/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 260 bytes .../account_payment.cpython-310.pyc | Bin 0 -> 5749 bytes .../account_payment.cpython-312.pyc | Bin 0 -> 10443 bytes .../account_payment_register.cpython-310.pyc | Bin 0 -> 2696 bytes .../account_payment_register.cpython-312.pyc | Bin 0 -> 4451 bytes models/account_payment.py | 422 +++++++++--------- models/account_payment_register.py | 186 ++++---- views/account_payment_views.xml | 50 +-- 13 files changed, 351 insertions(+), 351 deletions(-) create mode 100644 __pycache__/__init__.cpython-310.pyc create mode 100644 __pycache__/__init__.cpython-312.pyc create mode 100644 models/__pycache__/__init__.cpython-310.pyc create mode 100644 models/__pycache__/__init__.cpython-312.pyc create mode 100644 models/__pycache__/account_payment.cpython-310.pyc create mode 100644 models/__pycache__/account_payment.cpython-312.pyc create mode 100644 models/__pycache__/account_payment_register.cpython-310.pyc create mode 100644 models/__pycache__/account_payment_register.cpython-312.pyc diff --git a/__manifest__.py b/__manifest__.py index 2fb2123..d7c165d 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -1,22 +1,22 @@ -{ - 'name': 'Vendor Payment with Misc Journals', - 'version': '17.0.1.0.0', - 'category': 'Accounting', - 'summary': 'Allow using misc journals for vendor bill payments', - 'description': """ - This module extends the vendor payment functionality to allow using misc journals - for registering payments of vendor bills. When a misc journal is selected, - the payment entry will use the default account of the selected journal. - """, - 'author': 'Suherdy Yacob', - 'depends': [ - 'account', - 'purchase', - ], - 'data': [ - 'views/account_payment_views.xml', - ], - 'installable': True, - 'auto_install': False, - 'license': 'LGPL-3', +{ + 'name': 'Vendor Payment with Misc Journals', + 'version': '17.0.1.0.0', + 'category': 'Accounting', + 'summary': 'Allow using misc journals for vendor bill payments', + 'description': """ + This module extends the vendor payment functionality to allow using misc journals + for registering payments of vendor bills. When a misc journal is selected, + the payment entry will use the default account of the selected journal. + """, + 'author': 'Suherdy Yacob', + 'depends': [ + 'account', + 'purchase', + ], + 'data': [ + 'views/account_payment_views.xml', + ], + 'installable': True, + 'auto_install': False, + 'license': 'LGPL-3', } \ No newline at end of file diff --git a/__pycache__/__init__.cpython-310.pyc b/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fa846de3b0f61d8e65f1412309abb3f3588009f GIT binary patch literal 218 zcmYjLu?oU45KXFx2n7d!qDzC5i%7pf1UCmm%mrF#awSQHe1l)&FLiZtaTX`9PCmHz zcnA01VV*A-;r4phE7Hek{*jTXXu^^R81R-^e&U=#c4Wom$!T5iVP+9b8}>yuFhAbh znV*vU=yMh|S|dVV8xN^WO5>%ns#C7iST-OIDc0yTWe5bs^+xDEM6?P3T@Y8}0KM!~ fvc^Seo1lf1jccNmWtWEemg@V~?8a}xSifXnt-d*; literal 0 HcmV?d00001 diff --git a/__pycache__/__init__.cpython-312.pyc b/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75c143dda9ccc950c71d7412ab081716921816ad GIT binary patch literal 196 zcmX@j%ge<81l{j`WQYLi#~=<2FhLog1%Qm{3@HpLj5!Rsj8Tk?43$ip%r6;%!kUb? z*mCnzQge#^G?{KO6fpzERx*4B>HOuGVii+RS(1^Tmkd-9lb@2GZ)hHqTv}X`pPQJH zlAl)`QSl3x^GkXV_UnpYB^n^~M36Ca$A!^e>)-7l)e~CPe*Si z6M9R%1NBhyK*18AA|TrBm7P;2ZvZGH^@0H?{1Ia&5P5=M^ literal 0 HcmV?d00001 diff --git a/models/__pycache__/__init__.cpython-312.pyc b/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b22e7e66834a038467855f067e07cbac11cb031 GIT binary patch literal 260 zcmX@j%ge<81Y5rS$Z!SHk3k$5V1hC}%K#bE8B!Qh7;_kM8KW2(L2M=CkvE&jyhmy%xuvm-t? zvp6{>7pOR=I3_+mGcU6wK3=b&@)m~;P_Q&7)vkyWXfViy#oR#R12ZEd<6Q>Xdkktt H>_9#MK_*E& literal 0 HcmV?d00001 diff --git a/models/__pycache__/account_payment.cpython-310.pyc b/models/__pycache__/account_payment.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2836babaa6e4f55897642f72895be4d6ff0d9681 GIT binary patch literal 5749 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 YcMRjB4=(F_k7#?3`~&{Gz?Q^+0~k6x5C8xG literal 0 HcmV?d00001 diff --git a/models/account_payment.py b/models/account_payment.py index 4e98f25..bef1a2b 100644 --- a/models/account_payment.py +++ b/models/account_payment.py @@ -1,212 +1,212 @@ -from odoo import models, fields, api -from odoo.exceptions import UserError - - -class AccountPayment(models.Model): - _inherit = 'account.payment' - - @api.depends('payment_type', 'partner_type') - def _compute_available_journal_ids(self): - """ - Override to include misc journals for vendor payments - """ - # Call the parent method to get the original computation with bank/cash journals - super()._compute_available_journal_ids() - - # Then extend with general journals for supplier payments - for pay in self: - if pay.partner_type == 'supplier': - # Include all general journals (not just those with payment methods) - # We'll handle payment method availability separately - all_general_journals = self.env['account.journal'].search([ - '|', - ('company_id', 'parent_of', self.env.company.id), - ('company_id', 'child_of', self.env.company.id), - ('type', '=', 'general'), - ]) - - pay.available_journal_ids |= all_general_journals - - @api.depends('payment_type', 'journal_id', 'currency_id') - def _compute_payment_method_line_fields(self): - """ - Override to include payment methods for general journals - """ - for pay in self: - available_payment_method_lines = pay.journal_id._get_available_payment_method_lines(pay.payment_type) - - # For general journals, if no payment methods are available, provide defaults - if pay.journal_id.type == 'general' and not available_payment_method_lines: - # Get the manual payment methods (these work with general journals) - if pay.payment_type == 'outbound': - manual_out = self.env.ref('account.account_payment_method_manual_out', raise_if_not_found=False) - if manual_out: - # Create a payment method line for this journal if it doesn't exist - method_line = self.env['account.payment.method.line'].search([ - ('journal_id', '=', pay.journal_id.id), - ('payment_method_id', '=', manual_out.id) - ], limit=1) - - if not method_line: - method_line = self.env['account.payment.method.line'].create({ - 'name': 'Manual (Outbound)', - 'payment_method_id': manual_out.id, - 'journal_id': pay.journal_id.id, - }) - - available_payment_method_lines = method_line - elif pay.payment_type == 'inbound': - manual_in = self.env.ref('account.account_payment_method_manual_in', raise_if_not_found=False) - if manual_in: - # Create a payment method line for this journal if it doesn't exist - method_line = self.env['account.payment.method.line'].search([ - ('journal_id', '=', pay.journal_id.id), - ('payment_method_id', '=', manual_in.id) - ], limit=1) - - if not method_line: - method_line = self.env['account.payment.method.line'].create({ - 'name': 'Manual (Inbound)', - 'payment_method_id': manual_in.id, - 'journal_id': pay.journal_id.id, - }) - - available_payment_method_lines = method_line - - pay.available_payment_method_line_ids = available_payment_method_lines - to_exclude = pay._get_payment_method_codes_to_exclude() - if to_exclude: - pay.available_payment_method_line_ids = pay.available_payment_method_line_ids.filtered(lambda x: x.code not in to_exclude) - - @api.depends('available_payment_method_line_ids') - def _compute_payment_method_line_id(self): - """ - Override to ensure payment method is selected for general journals - """ - for pay in self: - available_payment_method_lines = pay.available_payment_method_line_ids - - # Select the first available one by default. - if pay.payment_method_line_id in available_payment_method_lines: - pay.payment_method_line_id = pay.payment_method_line_id - elif available_payment_method_lines: - pay.payment_method_line_id = available_payment_method_lines[0]._origin - else: - # For general journals, we might need to handle this differently - # But we'll let the constraint handle validation - pay.payment_method_line_id = False - - def _synchronize_from_moves(self, changed_fields): - """ - Override to allow general journals for payments - """ - # Remove the check that restricts journals to only bank/cash types - if self._context.get('skip_account_move_synchronization'): - return - - for pay in self.with_context(skip_account_move_synchronization=True): - - # After the migration to 14.0, the journal entry could be shared between the account.payment and the - # account.bank.statement.line. In that case, the synchronization will only be made with the statement line. - if pay.move_id.statement_line_id: - continue - - move = pay.move_id - move_vals_to_write = {} - payment_vals_to_write = {} - - if 'journal_id' in changed_fields: - # Remove the original restriction - allow general journals too - if pay.journal_id.type not in ('bank', 'cash', 'general'): - raise UserError(_("A payment must belongs to a bank, cash, or general journal.")) - - # Continue with the rest of the original method - if 'line_ids' in changed_fields: - all_lines = move.line_ids - liquidity_lines, counterpart_lines, writeoff_lines = pay._seek_for_lines() - - if len(liquidity_lines) != 1: - raise UserError(_( - "Journal Entry %s is not valid. In order to proceed, the journal items must " - "include one and only one outstanding payments/receipts account.", - move.display_name, - )) - - if len(counterpart_lines) != 1: - raise UserError(_( - "Journal Entry %s is not valid. In order to proceed, the journal items must " - "include one and only one receivable/payable account (with an exception of " - "internal transfers).", - move.display_name, - )) - - if any(line.currency_id != all_lines[0].currency_id for line in all_lines): - raise UserError(_( - "Journal Entry %s is not valid. In order to proceed, the journal items must " - "share the same currency.", - move.display_name, - )) - - if any(line.partner_id != all_lines[0].partner_id for line in all_lines): - raise UserError(_( - "Journal Entry %s is not valid. In order to proceed, the journal items must " - "share the same partner.", - move.display_name, - )) - - if counterpart_lines.account_id.account_type == 'asset_receivable': - partner_type = 'customer' - else: - partner_type = 'supplier' - - liquidity_amount = liquidity_lines.amount_currency - - move_vals_to_write.update({ - 'currency_id': liquidity_lines.currency_id.id, - 'partner_id': liquidity_lines.partner_id.id, - }) - payment_vals_to_write.update({ - 'amount': abs(liquidity_amount), - 'partner_type': partner_type, - 'currency_id': liquidity_lines.currency_id.id, - 'destination_account_id': counterpart_lines.account_id.id, - 'partner_id': liquidity_lines.partner_id.id, - }) - if liquidity_amount > 0.0: - payment_vals_to_write.update({'payment_type': 'inbound'}) - elif liquidity_amount < 0.0: - payment_vals_to_write.update({'payment_type': 'outbound'}) - - move.write(move._cleanup_write_orm_values(move, move_vals_to_write)) - pay.write(move._cleanup_write_orm_values(pay, payment_vals_to_write)) - - @api.depends('journal_id', 'payment_type', 'payment_method_line_id') - def _compute_outstanding_account_id(self): - """ - Override to use the default account of misc journal when selected - """ - for pay in self: - # If using a general/misc journal, use its default account - if pay.journal_id.type == 'general': - if pay.journal_id.default_account_id: - pay.outstanding_account_id = pay.journal_id.default_account_id - else: - # Fallback to the original logic if no default account is set - if pay.payment_type == 'inbound': - pay.outstanding_account_id = (pay.payment_method_line_id.payment_account_id - or pay.journal_id.company_id.account_journal_payment_debit_account_id) - elif pay.payment_type == 'outbound': - pay.outstanding_account_id = (pay.payment_method_line_id.payment_account_id - or pay.journal_id.company_id.account_journal_payment_credit_account_id) - else: - pay.outstanding_account_id = False - else: - # For bank/cash journals, use the original logic - if pay.payment_type == 'inbound': - pay.outstanding_account_id = (pay.payment_method_line_id.payment_account_id - or pay.journal_id.company_id.account_journal_payment_debit_account_id) - elif pay.payment_type == 'outbound': - pay.outstanding_account_id = (pay.payment_method_line_id.payment_account_id - or pay.journal_id.company_id.account_journal_payment_credit_account_id) - else: +from odoo import models, fields, api, _ +from odoo.exceptions import UserError + + +class AccountPayment(models.Model): + _inherit = 'account.payment' + + @api.depends('payment_type', 'partner_type') + def _compute_available_journal_ids(self): + """ + Override to include misc journals for vendor payments + """ + # Call the parent method to get the original computation with bank/cash journals + super()._compute_available_journal_ids() + + # Then extend with general journals for supplier payments + for pay in self: + if pay.partner_type == 'supplier': + # Include all general journals (not just those with payment methods) + # We'll handle payment method availability separately + all_general_journals = self.env['account.journal'].search([ + '|', + ('company_id', 'parent_of', self.env.company.id), + ('company_id', 'child_of', self.env.company.id), + ('type', '=', 'general'), + ]) + + pay.available_journal_ids |= all_general_journals + + @api.depends('payment_type', 'journal_id', 'currency_id') + def _compute_payment_method_line_fields(self): + """ + Override to include payment methods for general journals + """ + for pay in self: + available_payment_method_lines = pay.journal_id._get_available_payment_method_lines(pay.payment_type) + + # For general journals, if no payment methods are available, provide defaults + if pay.journal_id.type == 'general' and not available_payment_method_lines: + # Get the manual payment methods (these work with general journals) + if pay.payment_type == 'outbound': + manual_out = self.env.ref('account.account_payment_method_manual_out', raise_if_not_found=False) + if manual_out: + # Create a payment method line for this journal if it doesn't exist + method_line = self.env['account.payment.method.line'].search([ + ('journal_id', '=', pay.journal_id.id), + ('payment_method_id', '=', manual_out.id) + ], limit=1) + + if not method_line: + method_line = self.env['account.payment.method.line'].create({ + 'name': 'Manual (Outbound)', + 'payment_method_id': manual_out.id, + 'journal_id': pay.journal_id.id, + }) + + available_payment_method_lines = method_line + elif pay.payment_type == 'inbound': + manual_in = self.env.ref('account.account_payment_method_manual_in', raise_if_not_found=False) + if manual_in: + # Create a payment method line for this journal if it doesn't exist + method_line = self.env['account.payment.method.line'].search([ + ('journal_id', '=', pay.journal_id.id), + ('payment_method_id', '=', manual_in.id) + ], limit=1) + + if not method_line: + method_line = self.env['account.payment.method.line'].create({ + 'name': 'Manual (Inbound)', + 'payment_method_id': manual_in.id, + 'journal_id': pay.journal_id.id, + }) + + available_payment_method_lines = method_line + + pay.available_payment_method_line_ids = available_payment_method_lines + to_exclude = pay._get_payment_method_codes_to_exclude() + if to_exclude: + pay.available_payment_method_line_ids = pay.available_payment_method_line_ids.filtered(lambda x: x.code not in to_exclude) + + @api.depends('available_payment_method_line_ids') + def _compute_payment_method_line_id(self): + """ + Override to ensure payment method is selected for general journals + """ + for pay in self: + available_payment_method_lines = pay.available_payment_method_line_ids + + # Select the first available one by default. + if pay.payment_method_line_id in available_payment_method_lines: + pay.payment_method_line_id = pay.payment_method_line_id + elif available_payment_method_lines: + pay.payment_method_line_id = available_payment_method_lines[0]._origin + else: + # For general journals, we might need to handle this differently + # But we'll let the constraint handle validation + pay.payment_method_line_id = False + + def _synchronize_from_moves(self, changed_fields): + """ + Override to allow general journals for payments + """ + # Remove the check that restricts journals to only bank/cash types + if self._context.get('skip_account_move_synchronization'): + return + + for pay in self.with_context(skip_account_move_synchronization=True): + + # After the migration to 14.0, the journal entry could be shared between the account.payment and the + # account.bank.statement.line. In that case, the synchronization will only be made with the statement line. + if pay.move_id.statement_line_id: + continue + + move = pay.move_id + move_vals_to_write = {} + payment_vals_to_write = {} + + if 'journal_id' in changed_fields: + # Remove the original restriction - allow general journals too + if pay.journal_id.type not in ('bank', 'cash', 'general'): + raise UserError(_("A payment must belongs to a bank, cash, or general journal.")) + + # Continue with the rest of the original method + if 'line_ids' in changed_fields: + all_lines = move.line_ids + liquidity_lines, counterpart_lines, writeoff_lines = pay._seek_for_lines() + + if len(liquidity_lines) != 1: + raise UserError(_( + "Journal Entry %s is not valid. In order to proceed, the journal items must " + "include one and only one outstanding payments/receipts account.", + move.display_name, + )) + + if len(counterpart_lines) != 1: + raise UserError(_( + "Journal Entry %s is not valid. In order to proceed, the journal items must " + "include one and only one receivable/payable account (with an exception of " + "internal transfers).", + move.display_name, + )) + + if any(line.currency_id != all_lines[0].currency_id for line in all_lines): + raise UserError(_( + "Journal Entry %s is not valid. In order to proceed, the journal items must " + "share the same currency.", + move.display_name, + )) + + if any(line.partner_id != all_lines[0].partner_id for line in all_lines): + raise UserError(_( + "Journal Entry %s is not valid. In order to proceed, the journal items must " + "share the same partner.", + move.display_name, + )) + + if counterpart_lines.account_id.account_type == 'asset_receivable': + partner_type = 'customer' + else: + partner_type = 'supplier' + + liquidity_amount = liquidity_lines.amount_currency + + move_vals_to_write.update({ + 'currency_id': liquidity_lines.currency_id.id, + 'partner_id': liquidity_lines.partner_id.id, + }) + payment_vals_to_write.update({ + 'amount': abs(liquidity_amount), + 'partner_type': partner_type, + 'currency_id': liquidity_lines.currency_id.id, + 'destination_account_id': counterpart_lines.account_id.id, + 'partner_id': liquidity_lines.partner_id.id, + }) + if liquidity_amount > 0.0: + payment_vals_to_write.update({'payment_type': 'inbound'}) + elif liquidity_amount < 0.0: + payment_vals_to_write.update({'payment_type': 'outbound'}) + + move.write(move._cleanup_write_orm_values(move, move_vals_to_write)) + pay.write(move._cleanup_write_orm_values(pay, payment_vals_to_write)) + + @api.depends('journal_id', 'payment_type', 'payment_method_line_id') + def _compute_outstanding_account_id(self): + """ + Override to use the default account of misc journal when selected + """ + for pay in self: + # If using a general/misc journal, use its default account + if pay.journal_id.type == 'general': + if pay.journal_id.default_account_id: + pay.outstanding_account_id = pay.journal_id.default_account_id + else: + # Fallback to the original logic if no default account is set + if pay.payment_type == 'inbound': + pay.outstanding_account_id = (pay.payment_method_line_id.payment_account_id + or pay.journal_id.company_id.account_journal_payment_debit_account_id) + elif pay.payment_type == 'outbound': + pay.outstanding_account_id = (pay.payment_method_line_id.payment_account_id + or pay.journal_id.company_id.account_journal_payment_credit_account_id) + else: + pay.outstanding_account_id = False + else: + # For bank/cash journals, use the original logic + if pay.payment_type == 'inbound': + pay.outstanding_account_id = (pay.payment_method_line_id.payment_account_id + or pay.journal_id.company_id.account_journal_payment_debit_account_id) + elif pay.payment_type == 'outbound': + pay.outstanding_account_id = (pay.payment_method_line_id.payment_account_id + or pay.journal_id.company_id.account_journal_payment_credit_account_id) + else: pay.outstanding_account_id = False \ No newline at end of file diff --git a/models/account_payment_register.py b/models/account_payment_register.py index 85a6bdd..4187afe 100644 --- a/models/account_payment_register.py +++ b/models/account_payment_register.py @@ -1,94 +1,94 @@ -from odoo import models, api - - -class AccountPaymentRegister(models.TransientModel): - _inherit = 'account.payment.register' - - @api.depends('payment_type', 'partner_type') - def _compute_available_journal_ids(self): - """ - Override to include misc journals for vendor payments in the register payment wizard - """ - # Call the parent method to get the original computation with bank/cash journals - super()._compute_available_journal_ids() - - # Then extend with general journals for supplier payments - for pay in self: - if pay.partner_type == 'supplier': - # Include all general journals for supplier payments - all_general_journals = self.env['account.journal'].search([ - '|', - ('company_id', 'parent_of', self.env.company.id), - ('company_id', 'child_of', self.env.company.id), - ('type', '=', 'general'), - ]) - - pay.available_journal_ids |= all_general_journals - - @api.depends('payment_type', 'journal_id', 'currency_id') - def _compute_payment_method_line_fields(self): - """ - Override to include payment methods for general journals in register payment wizard - """ - for pay in self: - available_payment_method_lines = pay.journal_id._get_available_payment_method_lines(pay.payment_type) - - # For general journals, if no payment methods are available, provide defaults - if pay.journal_id.type == 'general' and not available_payment_method_lines: - # Get the manual payment methods (these work with general journals) - if pay.payment_type == 'outbound': - manual_out = self.env.ref('account.account_payment_method_manual_out', raise_if_not_found=False) - if manual_out: - # Create a payment method line for this journal if it doesn't exist - method_line = self.env['account.payment.method.line'].search([ - ('journal_id', '=', pay.journal_id.id), - ('payment_method_id', '=', manual_out.id) - ], limit=1) - - if not method_line: - method_line = self.env['account.payment.method.line'].create({ - 'name': 'Manual (Outbound)', - 'payment_method_id': manual_out.id, - 'journal_id': pay.journal_id.id, - }) - - available_payment_method_lines = method_line - elif pay.payment_type == 'inbound': - manual_in = self.env.ref('account.account_payment_method_manual_in', raise_if_not_found=False) - if manual_in: - # Create a payment method line for this journal if it doesn't exist - method_line = self.env['account.payment.method.line'].search([ - ('journal_id', '=', pay.journal_id.id), - ('payment_method_id', '=', manual_in.id) - ], limit=1) - - if not method_line: - method_line = self.env['account.payment.method.line'].create({ - 'name': 'Manual (Inbound)', - 'payment_method_id': manual_in.id, - 'journal_id': pay.journal_id.id, - }) - - available_payment_method_lines = method_line - - pay.available_payment_method_line_ids = available_payment_method_lines - # Note: account.payment.register doesn't have _get_payment_method_codes_to_exclude method - # So we skip the exclusion logic for this model - - @api.depends('available_payment_method_line_ids') - def _compute_payment_method_line_id(self): - """ - Override to ensure payment method is selected for general journals in register payment wizard - """ - for pay in self: - available_payment_method_lines = pay.available_payment_method_line_ids - - # Select the first available one by default. - if pay.payment_method_line_id in available_payment_method_lines: - pay.payment_method_line_id = pay.payment_method_line_id - elif available_payment_method_lines: - pay.payment_method_line_id = available_payment_method_lines[0]._origin - else: - # For general journals, we might need to handle this differently - # But we'll let the constraint handle validation +from odoo import models, api + + +class AccountPaymentRegister(models.TransientModel): + _inherit = 'account.payment.register' + + @api.depends('payment_type', 'partner_type') + def _compute_available_journal_ids(self): + """ + Override to include misc journals for vendor payments in the register payment wizard + """ + # Call the parent method to get the original computation with bank/cash journals + super()._compute_available_journal_ids() + + # Then extend with general journals for supplier payments + for pay in self: + if pay.partner_type == 'supplier': + # Include all general journals for supplier payments + all_general_journals = self.env['account.journal'].search([ + '|', + ('company_id', 'parent_of', self.env.company.id), + ('company_id', 'child_of', self.env.company.id), + ('type', '=', 'general'), + ]) + + pay.available_journal_ids |= all_general_journals + + @api.depends('payment_type', 'journal_id', 'currency_id') + def _compute_payment_method_line_fields(self): + """ + Override to include payment methods for general journals in register payment wizard + """ + for pay in self: + available_payment_method_lines = pay.journal_id._get_available_payment_method_lines(pay.payment_type) + + # For general journals, if no payment methods are available, provide defaults + if pay.journal_id.type == 'general' and not available_payment_method_lines: + # Get the manual payment methods (these work with general journals) + if pay.payment_type == 'outbound': + manual_out = self.env.ref('account.account_payment_method_manual_out', raise_if_not_found=False) + if manual_out: + # Create a payment method line for this journal if it doesn't exist + method_line = self.env['account.payment.method.line'].search([ + ('journal_id', '=', pay.journal_id.id), + ('payment_method_id', '=', manual_out.id) + ], limit=1) + + if not method_line: + method_line = self.env['account.payment.method.line'].create({ + 'name': 'Manual (Outbound)', + 'payment_method_id': manual_out.id, + 'journal_id': pay.journal_id.id, + }) + + available_payment_method_lines = method_line + elif pay.payment_type == 'inbound': + manual_in = self.env.ref('account.account_payment_method_manual_in', raise_if_not_found=False) + if manual_in: + # Create a payment method line for this journal if it doesn't exist + method_line = self.env['account.payment.method.line'].search([ + ('journal_id', '=', pay.journal_id.id), + ('payment_method_id', '=', manual_in.id) + ], limit=1) + + if not method_line: + method_line = self.env['account.payment.method.line'].create({ + 'name': 'Manual (Inbound)', + 'payment_method_id': manual_in.id, + 'journal_id': pay.journal_id.id, + }) + + available_payment_method_lines = method_line + + pay.available_payment_method_line_ids = available_payment_method_lines + # Note: account.payment.register doesn't have _get_payment_method_codes_to_exclude method + # So we skip the exclusion logic for this model + + @api.depends('available_payment_method_line_ids') + def _compute_payment_method_line_id(self): + """ + Override to ensure payment method is selected for general journals in register payment wizard + """ + for pay in self: + available_payment_method_lines = pay.available_payment_method_line_ids + + # Select the first available one by default. + if pay.payment_method_line_id in available_payment_method_lines: + pay.payment_method_line_id = pay.payment_method_line_id + elif available_payment_method_lines: + pay.payment_method_line_id = available_payment_method_lines[0]._origin + else: + # For general journals, we might need to handle this differently + # But we'll let the constraint handle validation pay.payment_method_line_id = False \ No newline at end of file diff --git a/views/account_payment_views.xml b/views/account_payment_views.xml index d67a79e..a4e9960 100644 --- a/views/account_payment_views.xml +++ b/views/account_payment_views.xml @@ -1,26 +1,26 @@ - - - - - account.payment.form.inherit.vendor.payment.misc - account.payment - - - - - - - - - - - account.register.payment.form.inherit.vendor.payment.misc - account.payment.register - - - - - - - + + + + + account.payment.form.inherit.vendor.payment.misc + account.payment + + + + + + + + + + + account.register.payment.form.inherit.vendor.payment.misc + account.payment.register + + + + + + + \ No newline at end of file