48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
import re
|
|
from odoo import api, models, _
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class SaleOrder(models.Model):
|
|
_inherit = "sale.order"
|
|
|
|
def write(self, values):
|
|
# We compute the l10n_fi/SaleOrder.reference from itself the same way
|
|
# we compute the l10n_fi/AccountMove.invoice_payment_ref from its name.
|
|
reference = values.get('reference', False)
|
|
if reference:
|
|
values['reference'] = self.compute_payment_reference_finnish(reference)
|
|
return super().write(values)
|
|
|
|
@api.model
|
|
def number2numeric(self, number):
|
|
so_number = re.sub(r'\D', '', number)
|
|
if so_number == '' or so_number is False:
|
|
raise UserError(_('Reference must contain numeric characters'))
|
|
|
|
# Make sure the base number is 3...19 characters long
|
|
if len(so_number) < 3:
|
|
so_number = ('11' + so_number)[-3:]
|
|
elif len(so_number) > 19:
|
|
so_number = so_number[:19]
|
|
|
|
return so_number
|
|
|
|
@api.model
|
|
def get_finnish_check_digit(self, base_number):
|
|
# Multiply digits from end to beginning with 7, 3 and 1 and
|
|
# calculate the sum of the products
|
|
total = sum((7, 3, 1)[idx % 3] * int(val) for idx, val in
|
|
enumerate(base_number[::-1]))
|
|
# Subtract the sum from the next decade. 10 = 0
|
|
return str((10 - (total % 10)) % 10)
|
|
|
|
@api.model
|
|
def compute_payment_reference_finnish(self, number):
|
|
# Drop all non-numeric characters
|
|
so_number = self.number2numeric(number)
|
|
# Calculate the Finnish check digit
|
|
check_digit = self.get_finnish_check_digit(so_number)
|
|
return so_number + check_digit
|