80 lines
3.2 KiB
Python
80 lines
3.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2024-2025 Nexa Systems Inc.
|
|
# License OPL-1 (Odoo Proprietary License v1.0)
|
|
# Part of the Fusion Claim Assistant product family.
|
|
|
|
from odoo import models, fields, api
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class AccountPaymentRegister(models.TransientModel):
|
|
_inherit = 'account.payment.register'
|
|
|
|
x_fc_card_last_four = fields.Char(
|
|
string='Card Last 4 Digits',
|
|
size=4,
|
|
help='Enter last 4 digits of the card used for payment (required for card payments)',
|
|
)
|
|
|
|
x_fc_payment_note = fields.Char(
|
|
string='Payment Note',
|
|
help='Additional note for this payment',
|
|
)
|
|
|
|
x_fc_is_card_payment = fields.Boolean(
|
|
string='Is Card Payment',
|
|
compute='_compute_is_card_payment',
|
|
help='True if payment method is Credit Card or Debit Card',
|
|
)
|
|
|
|
@api.depends('payment_method_line_id', 'payment_method_line_id.x_fc_requires_card_digits')
|
|
def _compute_is_card_payment(self):
|
|
"""Check if the selected payment method requires card digits.
|
|
|
|
Uses the x_fc_requires_card_digits flag on payment method line.
|
|
Falls back to keyword matching if field not set.
|
|
"""
|
|
card_keywords = ['credit', 'debit', 'visa', 'mastercard', 'amex']
|
|
for wizard in self:
|
|
is_card = False
|
|
if wizard.payment_method_line_id:
|
|
# First check the explicit flag
|
|
if hasattr(wizard.payment_method_line_id, 'x_fc_requires_card_digits'):
|
|
is_card = wizard.payment_method_line_id.x_fc_requires_card_digits
|
|
# Fallback to keyword matching if flag not explicitly set
|
|
if not is_card and wizard.payment_method_line_id.name:
|
|
method_name = wizard.payment_method_line_id.name.lower()
|
|
is_card = any(keyword in method_name for keyword in card_keywords)
|
|
wizard.x_fc_is_card_payment = is_card
|
|
|
|
def action_create_payments(self):
|
|
"""Override to validate card number is entered for card payments."""
|
|
# Validate card number for card payments
|
|
if self.x_fc_is_card_payment and not self.x_fc_card_last_four:
|
|
raise UserError(
|
|
"Card Last 4 Digits is required for Credit Card and Debit Card payments.\n\n"
|
|
"Please enter the last 4 digits of the card used for this payment."
|
|
)
|
|
|
|
# Validate card number format (must be exactly 4 digits)
|
|
if self.x_fc_card_last_four:
|
|
if not self.x_fc_card_last_four.isdigit() or len(self.x_fc_card_last_four) != 4:
|
|
raise UserError(
|
|
"Card Last 4 Digits must be exactly 4 numeric digits.\n\n"
|
|
"Example: 1234"
|
|
)
|
|
|
|
return super().action_create_payments()
|
|
|
|
def _create_payment_vals_from_wizard(self, batch_result):
|
|
"""Override to add card info to payment values."""
|
|
vals = super()._create_payment_vals_from_wizard(batch_result)
|
|
|
|
# Add our custom fields
|
|
if self.x_fc_card_last_four:
|
|
vals['x_fc_card_last_four'] = self.x_fc_card_last_four
|
|
if self.x_fc_payment_note:
|
|
vals['x_fc_payment_note'] = self.x_fc_payment_note
|
|
|
|
return vals
|