From f482d93b97012e0b72ddd6e98c3f69a341af464f Mon Sep 17 00:00:00 2001 From: "admin.suherdy" Date: Fri, 5 Dec 2025 19:38:25 +0700 Subject: [PATCH] fix some journal movement --- .../account_payment.cpython-312.pyc | Bin 3610 -> 4992 bytes models/account_payment.py | 21 ++++++ ...ate_advance_payment_wizard.cpython-312.pyc | Bin 7908 -> 10836 bytes wizard/create_advance_payment_wizard.py | 70 +++++++++++++++++- .../create_advance_payment_wizard_views.xml | 2 + 5 files changed, 92 insertions(+), 1 deletion(-) diff --git a/models/__pycache__/account_payment.cpython-312.pyc b/models/__pycache__/account_payment.cpython-312.pyc index 57fa516cf3a6f316b13d26e02986aa4e96c78f92..aab8361238842ffe0ee33c93cc2160029bed2b0f 100644 GIT binary patch delta 1960 zcmZ`(U2GIp6uvXF|Ltx|yIYnmlmYDi2>5 z_uTKCd%kn;N1JC8p&x_60D`f&us3(L zlGr+6H|QLE%bx@AW#(P?6;x#U(Hq|&be1i$6SZ)4JCMw*B%w1GB2VyP>wFSxd`hcW zGFRu+Q$!Q>iPgMh*Cx;=XqxLrk(F7xwt{h%djf)cEdu`-2Ozk5i1Y4wcabxnafN+T z3>@x!bz)v@2$#;efg}%*v_gPa_QlXySJ4HIH;b+bhwsPORHOL4@PFZ37cv@G*5*A$ zba4x;uGSGK^3P-sPhmoGGUg?MMFaDO#$#145X?`C)1^FC4Iz(>aZMJKoQj2<%;$7o z(g?wlp-l5SHuzDE@S;2=s*-eFzL|t`HB{qBwKVB!_0zqICW(sP z2TIj(8${P>xBNYeKHXN?-feB~F83U&^qjQdxBcWST82e5_!})m%4c(9*swXQPT8Ij zqMg>U&1(f?1S%>Ers9j1e4{zVzy!-S3oN+x!XzfPry4%xwOu+^Ms5ETBmso$hV7!N z?X59qhicTth*BHwPL+@hQ8ZnJ%9LK?8t(5G5+)yC9T4*&cdsc~_9e+iI2^QF zfk@+`js=aF25b1q1~8{Mk}&^ZJDQ2ZG3AeUN@fmouQ5sUGj1nKHr}?lpE)<#3ajQ# z@3u}71dSx9h=BmU3bJPVfpxfLM9hgn+v4v-La+DxbK_zp%1Z6eYEA{B5VlHJsh zHh=Yr?IaGmPTvxTJ1T1Qb(v%SE@t=bkNs~l%trIyz?~5%`D#jbgD4p}O%*0J-FTdu z9Tp0cGQ1{&jA12bIB!SF<;1l)f}x>mSFIY^RgGMW*>AQrZe@;|`x=J=w16pga4@yO z{GhS#WqNSi`=X{PSX8S4=_75oru*#H0l delta 639 zcmXw0y>AmS6u0m4ahK#SU0FFkUPec;v3j;bz0#sjg~EPjD*`vDJ~qZ^3VBI{?XWgb>1*9Yk$CW&HSbp zMV_TYLV43#Yzrq~2>ZJ@>Jc==j|U`5XhqV6PNH2Ym-?|V`y`P?iU*>wMdOEz2t9}r zae*IL=lN61tBBH0oYDw~DDe4SVTr%DZqEr_@`M)nZi&{UBt5Ib9B)4lR+Avc&_k`+C|vrLG5m-AuF!d>9|$?q1MKk zdhuo)hXhA6!@NWYBaV6xaMUNXE{}9xg%wq>PR8qzFht0OH1kvca$`1NQ9)HuJ+L9) zbJqC}$CI<#b?=t4&v3`a^+D{XA!*Zfd8Y)Ja`~-82!Dd*uVDFaVGY9i!Mzuolg)oX Ie{}gA$cbF2 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 bHe^Op@ihmULvKg-vom|ynZG2lq`dq;5A$HE diff --git a/wizard/create_advance_payment_wizard.py b/wizard/create_advance_payment_wizard.py index 16865ef..4497430 100644 --- a/wizard/create_advance_payment_wizard.py +++ b/wizard/create_advance_payment_wizard.py @@ -27,6 +27,20 @@ class CreateAdvancePaymentWizard(models.TransientModel): domain=[('type', 'in', ['bank', 'cash'])] ) + payment_method_line_id = fields.Many2one( + 'account.payment.method.line', + string='Payment Method', + domain="[('id', 'in', available_payment_method_line_ids)]", + help='Manual: Pay by any method outside of Odoo.\n' + 'Check: Pay by check and print it from Odoo.\n' + 'Batch Deposit: Collect several checks at once.' + ) + + available_payment_method_line_ids = fields.Many2many( + 'account.payment.method.line', + compute='_compute_available_payment_method_line_ids' + ) + amount = fields.Monetary( string='Amount', required=True, @@ -67,6 +81,32 @@ class CreateAdvancePaymentWizard(models.TransientModel): res['memo'] = f'Advance payment for {po.name}' return res + @api.depends('journal_id') + def _compute_available_payment_method_line_ids(self): + """Compute available payment methods based on selected journal""" + for wizard in self: + if wizard.journal_id: + wizard.available_payment_method_line_ids = wizard.journal_id.outbound_payment_method_line_ids + else: + wizard.available_payment_method_line_ids = False + + @api.onchange('journal_id') + def _onchange_journal_id(self): + """Reset payment method when journal changes""" + if self.journal_id: + # Auto-select the first available payment method (usually 'manual') + available_methods = self.journal_id.outbound_payment_method_line_ids + if available_methods: + # Prefer 'manual' payment method + manual_method = available_methods.filtered( + lambda l: l.payment_method_id.code == 'manual' + )[:1] + self.payment_method_line_id = manual_method or available_methods[:1] + else: + self.payment_method_line_id = False + else: + self.payment_method_line_id = False + @api.depends('purchase_order_id') def _compute_expense_account(self): """Get expense account from default advance payment product""" @@ -118,15 +158,38 @@ class CreateAdvancePaymentWizard(models.TransientModel): f"Outstanding Payments Account" ) + # Use the selected payment method line or get the appropriate one + payment_method_line = self.payment_method_line_id + + if not payment_method_line: + # Fallback: try to get manual payment method + payment_method_line = self.journal_id.outbound_payment_method_line_ids.filtered( + lambda l: l.payment_method_id.code == 'manual' + )[:1] + + if not payment_method_line: + # Fallback to first available outbound payment method + payment_method_line = self.journal_id.outbound_payment_method_line_ids[:1] + + if not payment_method_line: + raise UserError( + f"No outbound payment method is configured for journal '{self.journal_id.name}'.\n" + f"Please configure a payment method in: Accounting > Configuration > Journals > " + f"{self.journal_id.name} > Outgoing Payments tab" + ) + # Create payment + # CRITICAL: Set payment_type and partner_type FIRST, then journal_id, then payment_method_line_id + # This ensures Odoo's onchange logic correctly filters and sets the payment method payment_vals = { 'payment_type': 'outbound', 'partner_type': 'supplier', 'partner_id': self.partner_id.id, + 'journal_id': self.journal_id.id, + 'payment_method_line_id': payment_method_line.id, 'amount': self.amount, 'currency_id': self.currency_id.id, 'date': self.date, - 'journal_id': self.journal_id.id, 'ref': self.memo or f'Advance payment for {self.purchase_order_id.name}', 'purchase_order_id': self.purchase_order_id.id, 'is_advance_payment': True, @@ -134,6 +197,11 @@ class CreateAdvancePaymentWizard(models.TransientModel): payment = self.env['account.payment'].create(payment_vals) + # Force recompute of payment method line to ensure it's correctly set + # This is necessary because Odoo might have changed it during create + if payment.payment_method_line_id != payment_method_line: + payment.write({'payment_method_line_id': payment_method_line.id}) + # Create deposit line in purchase order immediately self._create_deposit_line() diff --git a/wizard/create_advance_payment_wizard_views.xml b/wizard/create_advance_payment_wizard_views.xml index 0e6acbf..c73f8e3 100644 --- a/wizard/create_advance_payment_wizard_views.xml +++ b/wizard/create_advance_payment_wizard_views.xml @@ -12,6 +12,8 @@ + +