Rename advance payment conditions into lines

Closes #12854
This commit is contained in:
Cédric Krier
2025-11-22 15:37:31 +01:00
parent 1093f7caa7
commit 9c783419cf
9 changed files with 70 additions and 60 deletions
+1
View File
@@ -1,3 +1,4 @@
* Rename advance payment conditions into lines
Version 7.6.0 - 2025-04-28
--------------------------
+6 -6
View File
@@ -49,11 +49,11 @@ class Invoice(metaclass=PoolMeta):
def get_sales(self, name):
pool = Pool()
AdvancePaymentCondition = pool.get('sale.advance_payment.condition')
Line = pool.get('sale.advance_payment.line')
sales = set(super().get_sales(name))
for line in self.lines:
if isinstance(line.origin, AdvancePaymentCondition):
if isinstance(line.origin, Line):
sales.add(line.origin.sale.id)
return list(sales)
@@ -63,7 +63,7 @@ class Invoice(metaclass=PoolMeta):
return ['OR',
domain,
('lines.origin.sale' + clause[0][len(name):],
*clause[1:3], 'sale.advance_payment.condition', *clause[3:]),
*clause[1:3], 'sale.advance_payment.line', *clause[3:]),
]
@@ -84,16 +84,16 @@ class InvoiceLine(metaclass=PoolMeta):
@property
def origin_name(self):
pool = Pool()
Condition = pool.get('sale.advance_payment.condition')
Line = pool.get('sale.advance_payment.line')
name = super().origin_name
if isinstance(self.origin, Condition) and self.origin.id >= 0:
if isinstance(self.origin, Line) and self.origin.id >= 0:
name = self.origin.sale.rec_name
return name
@classmethod
def _get_origin(cls):
return (super()._get_origin()
+ ['sale.advance_payment.condition'])
+ ['sale.advance_payment.line'])
@classmethod
def copy(cls, lines, default=None):
+47 -38
View File
@@ -5,6 +5,7 @@ from itertools import chain
from simpleeval import simple_eval
from trytond import backend, config
from trytond.i18n import gettext
from trytond.model import (
DeactivableMixin, ModelSQL, ModelView, Workflow, fields)
@@ -33,14 +34,14 @@ class AdvancePaymentTerm(
'untaxed_amount': sale.untaxed_amount,
}
def get_conditions(self, sale):
conditions = []
def get_lines(self, sale):
lines = []
term_context = self.get_advance_payment_context(sale)
for line in self.lines:
condition = line.get_condition(sale.currency, **term_context)
if condition.amount > 0:
conditions.append(condition)
return conditions
for sale_line in self.lines:
line = sale_line.get_line(sale.currency, **term_context)
if line.amount > 0:
lines.append(line)
return lines
class AdvancePaymentTermLine(ModelView, ModelSQL, CompanyMultiValueMixin):
@@ -109,11 +110,11 @@ class AdvancePaymentTermLine(ModelView, ModelSQL, CompanyMultiValueMixin):
context = self.get_compute_amount_context(**names)
return simple_eval(decistmt(self.formula), **context)
def get_condition(self, currency, **context):
def get_line(self, currency, **context):
pool = Pool()
AdvancePaymentCondition = pool.get('sale.advance_payment.condition')
Line = pool.get('sale.advance_payment.line')
return AdvancePaymentCondition(
return Line(
block_supply=self.block_supply,
block_shipping=self.block_shipping,
amount=currency.round(self.compute_amount(**context)),
@@ -139,8 +140,8 @@ class AdvancePaymentTermLineAccount(ModelSQL, CompanyValueMixin):
])
class AdvancePaymentCondition(ModelSQL, ModelView):
__name__ = 'sale.advance_payment.condition'
class AdvancePaymentLine(ModelSQL, ModelView):
__name__ = 'sale.advance_payment.line'
_rec_name = 'description'
_states = {
@@ -187,6 +188,16 @@ class AdvancePaymentCondition(ModelSQL, ModelView):
cls._order.insert(0, ('amount', 'ASC'))
cls.__access__.add('sale')
@classmethod
def __register__(cls, module):
# Migration from 7.0: rename condition into line
backend.TableHandler.table_rename(
config.get(
'table', 'sale.advance_payment.condition',
default='sale_advance_payment_condition'),
cls._table)
super().__register__(module)
@classmethod
def get_sale_states(cls):
pool = Pool()
@@ -207,13 +218,13 @@ class AdvancePaymentCondition(ModelSQL, ModelView):
return self.sale.currency if self.sale else None
@classmethod
def copy(cls, conditions, default=None):
def copy(cls, lines, default=None):
if default is None:
default = {}
else:
default = default.copy()
default.setdefault('invoice_lines', [])
return super().copy(conditions, default)
return super().copy(lines, default)
def create_invoice(self):
invoice = self.sale._get_invoice()
@@ -277,9 +288,8 @@ class Sale(metaclass=PoolMeta):
ondelete='RESTRICT', states={
'readonly': Eval('state') != 'draft',
})
advance_payment_conditions = fields.One2Many(
'sale.advance_payment.condition', 'sale',
'Advance Payment Conditions',
advance_payment_lines = fields.One2Many(
'sale.advance_payment.line', 'sale', "Advance Payment Lines",
states={
'readonly': Eval('state') != 'draft',
})
@@ -303,12 +313,12 @@ class Sale(metaclass=PoolMeta):
@Workflow.transition('quotation')
def quote(cls, sales):
pool = Pool()
AdvancePaymentCondition = pool.get('sale.advance_payment.condition')
AdvancePaymentLine = pool.get('sale.advance_payment.line')
super().quote(sales)
AdvancePaymentCondition.delete(
list(chain(*(s.advance_payment_conditions for s in sales))))
AdvancePaymentLine.delete(
list(chain(*(s.advance_payment_lines for s in sales))))
for sale in sales:
sale.set_advance_payment_term()
@@ -320,7 +330,7 @@ class Sale(metaclass=PoolMeta):
default = {}
else:
default = default.copy()
default.setdefault('advance_payment_conditions', None)
default.setdefault('advance_payment_lines', None)
return super().copy(sales, default=default)
def set_advance_payment_term(self):
@@ -333,20 +343,19 @@ class Sale(metaclass=PoolMeta):
self.advance_payment_term.id)
else:
advance_payment_term = self.advance_payment_term
self.advance_payment_conditions = \
advance_payment_term.get_conditions(self)
self.advance_payment_lines = advance_payment_term.get_lines(self)
def get_advance_payment_invoices(self, name):
invoices = set()
for condition in self.advance_payment_conditions:
for invoice_line in condition.invoice_lines:
for line in self.advance_payment_lines:
for invoice_line in line.invoice_lines:
if invoice_line.invoice:
invoices.add(invoice_line.invoice.id)
return list(invoices)
@classmethod
def search_advance_payment_invoices(cls, name, clause):
return [('advance_payment_conditions.invoice_lines.invoice'
return [('advance_payment_lines.invoice_lines.invoice'
+ clause[0][len(name):], *clause[1:])]
@property
@@ -360,7 +369,7 @@ class Sale(metaclass=PoolMeta):
recall_lines = []
advance_lines = [
l
for c in self.advance_payment_conditions
for c in self.advance_payment_lines
for l in c.invoice_lines
if l.type == 'line' and l.invoice.state == 'paid']
for advance_line in advance_lines:
@@ -391,8 +400,8 @@ class Sale(metaclass=PoolMeta):
for sale in sales:
if (sale.advance_payment_eligible()
and not sale.advance_payment_completed):
for condition in sale.advance_payment_conditions:
invoice = condition.create_invoice()
for line in sale.advance_payment_lines:
invoice = line.create_invoice()
if invoice:
invoices.append(invoice)
Invoice.save(invoices)
@@ -416,31 +425,31 @@ class Sale(metaclass=PoolMeta):
of the sale's advance payment.
"""
return bool((shipment_type == 'out' or shipment_type is None)
and self.advance_payment_conditions)
and self.advance_payment_lines)
@property
def advance_payment_completed(self):
"""
Returns True when the advance payment process is completed
"""
return (bool(self.advance_payment_conditions)
and all(c.completed for c in self.advance_payment_conditions))
return (bool(self.advance_payment_lines)
and all(c.completed for c in self.advance_payment_lines))
@property
def supply_blocked(self):
for condition in self.advance_payment_conditions:
if not condition.block_supply:
for line in self.advance_payment_lines:
if not line.block_supply:
continue
if not condition.completed:
if not line.completed:
return True
return False
@property
def shipping_blocked(self):
for condition in self.advance_payment_conditions:
if not condition.block_shipping:
for line in self.advance_payment_lines:
if not line.block_shipping:
continue
if not condition.completed:
if not line.completed:
return True
return False
+6 -6
View File
@@ -9,15 +9,15 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">sale_form</field>
</record>
<record model="ir.ui.view" id="advance_payment_condition_form">
<field name="model">sale.advance_payment.condition</field>
<record model="ir.ui.view" id="advance_payment_line_form">
<field name="model">sale.advance_payment.line</field>
<field name="type">form</field>
<field name="name">advance_payment_condition_form</field>
<field name="name">advance_payment_line_form</field>
</record>
<record model="ir.ui.view" id="advance_payment_condition_list">
<field name="model">sale.advance_payment.condition</field>
<record model="ir.ui.view" id="advance_payment_line_list">
<field name="model">sale.advance_payment.line</field>
<field name="type">tree</field>
<field name="name">advance_payment_condition_list</field>
<field name="name">advance_payment_line_list</field>
</record>
<record model="ir.ui.view" id="advance_payment_term_form">
@@ -147,8 +147,8 @@ Create a sale with advance payment::
>>> line.quantity = 5
>>> sale.advance_payment_term = advance_payment_term
>>> sale.click('quote')
>>> condition, = sale.advance_payment_conditions
>>> condition.amount
>>> line, = sale.advance_payment_lines
>>> line.amount
Decimal('10.00')
>>> sale.click('confirm')
>>> sale.click('process')
@@ -221,8 +221,8 @@ Create a sale with advance payment::
>>> line.quantity = 6
>>> sale.advance_payment_term = advance_payment_term_no_pack
>>> sale.click('quote')
>>> condition, = sale.advance_payment_conditions
>>> condition.amount
>>> line, = sale.advance_payment_lines
>>> line.amount
Decimal('12.00')
>>> sale.click('confirm')
>>> sale.click('process')
@@ -321,7 +321,7 @@ There is now a purchase request of the desired quantity::
>>> purchase_request.quantity
10.0
Testing advance payment conditions exception handling
Testing advance payment lines exception handling
-----------------------------------------------------
Create a sale with this term::
@@ -334,8 +334,8 @@ Create a sale with this term::
>>> line.quantity = 5
>>> sale.advance_payment_term = advance_payment_term
>>> sale.click('quote')
>>> condition1, = sale.advance_payment_conditions
>>> condition1.amount
>>> line1, = sale.advance_payment_lines
>>> line1.amount
Decimal('10.00')
>>> sale.click('confirm')
>>> sale.click('process')
+1 -1
View File
@@ -28,7 +28,7 @@ model:
sale.AdvancePaymentTerm
sale.AdvancePaymentTermLine
sale.AdvancePaymentTermLineAccount
sale.AdvancePaymentCondition
sale.AdvancePaymentLine
sale.Sale
sale.SaleLine
wizard:
@@ -3,10 +3,10 @@
this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="//page[@id='sale']" position="after">
<page name="advance_payment_term">
<page string="Advance Payment" id="advance_payment">
<label name="advance_payment_term"/>
<field name="advance_payment_term"/>
<field name="advance_payment_conditions" colspan="4"/>
<field name="advance_payment_lines" colspan="4"/>
</page>
</xpath>
</data>