diff --git a/equipment.py b/equipment.py
index a46ba14..695e7dc 100644
--- a/equipment.py
+++ b/equipment.py
@@ -33,6 +33,8 @@ class OpticalEquipment(ModelSQL, ModelView):
'equipment','subscription', "Subscriptions",
states={'readonly': True})
+ current_subscription = fields.Many2One('sale.subscription')
+
@staticmethod
def get_origin():
return None
diff --git a/sale.py b/sale.py
index 0c8fe5e..a916ec3 100644
--- a/sale.py
+++ b/sale.py
@@ -1,6 +1,8 @@
from trytond.pool import Pool, PoolMeta
from trytond.model import ModelView, ModelSQL, fields
from trytond.pyson import Eval, Bool, If
+from trytond.transaction import Transaction
+
class SaleLine(metaclass=PoolMeta):
@@ -8,6 +10,65 @@ class SaleLine(metaclass=PoolMeta):
__name__ = 'sale.line'
address_equipment = fields.Many2One('party.address', "Direccion")
+ product_equipment = fields.Boolean("Product Equipment")
+ unit_digits = fields.Function(fields.Integer('Unit Digits'),
+ 'on_change_with_unit_digits')
+
+
+ def on_change_with_unit_digits(self, name=None):
+ if self.unit:
+ return self.unit.digits
+ return 2
+
+ @fields.depends('product', 'unit', 'quantity', 'sale',
+ '_parent_sale.party',
+ methods=['_get_tax_rule_pattern', '_get_context_sale_price',
+ 'on_change_with_amount'])
+ def on_change_product(self):
+ Product = Pool().get('product.product')
+ if not self.product:
+ self.product_equipment = False
+ return
+
+ party = None
+
+ if self.sale and self.sale.party:
+ self.product_equipment = False
+ party = self.sale.party
+
+ # Set taxes before unit_price to have taxes in context of sale price
+ taxes = []
+ pattern = self._get_tax_rule_pattern()
+ for tax in self.product.customer_taxes_used:
+ if party and party.customer_tax_rule:
+ tax_ids = party.customer_tax_rule.apply(tax, pattern)
+ if tax_ids:
+ taxes.extend(tax_ids)
+ continue
+ taxes.append(tax.id)
+
+ if party and party.customer_tax_rule:
+ tax_ids = party.customer_tax_rule.apply(None, pattern)
+ if tax_ids:
+ taxes.extend(tax_ids)
+ self.taxes = taxes
+
+ category = self.product.sale_uom.category
+ if not self.unit or self.unit.category != category:
+ self.unit = self.product.sale_uom
+ self.unit_digits = self.product.sale_uom.digits
+
+ with Transaction().set_context(self._get_context_sale_price()):
+ self.unit_price = Product.get_sale_price([self.product],
+ self.quantity or 0)[self.product.id]
+
+ if self.unit_price:
+ self.unit_price = self.unit_price.quantize(
+ Decimal(1) / 10 ** self.__class__.unit_price.digits[1])
+
+ self.type = 'line'
+ self.amount = self.on_change_with_amount()
+ self.product_equipment = True
@classmethod
@ModelView.button
@@ -24,7 +85,7 @@ class SaleLine(metaclass=PoolMeta):
def view_attributes(cls):
return super(SaleLine, cls).view_attributes() + [
('//page[@id="equipment"]', 'states', {
- 'invisible': ~Eval('lines.product.equipment'),
+ 'invisible': ~Eval('product_equipment', True),
})]
diff --git a/view/optical_equipment_form.xml b/view/optical_equipment_form.xml
index 39daa60..9c14628 100644
--- a/view/optical_equipment_form.xml
+++ b/view/optical_equipment_form.xml
@@ -20,6 +20,7 @@
+
@@ -38,6 +39,8 @@
+
+
diff --git a/view/sale_line_form.xml b/view/sale_line_form.xml
index 87e3bf8..4af72d0 100644
--- a/view/sale_line_form.xml
+++ b/view/sale_line_form.xml
@@ -8,4 +8,9 @@
+
+
+
+