#This file is part of Tryton. The COPYRIGHT file at the top level of #txhis repository contains the full copyright notices and license terms from trytond.pool import Pool, PoolMeta from trytond.model import ( ModelView, ModelSQL, Workflow, fields) from trytond.modules.product import price_digits, round_price from trytond.pyson import Eval, If, Bool from trytond.exceptions import UserError from trytond.i18n import gettext from trytond.transaction import Transaction class Purchase(metaclass=PoolMeta): "Purchase Equipment" __name__ = 'purchase.purchase' equipment_create = fields.Boolean("Equipments Creates", readonly=True) @classmethod def __setup__(cls): super(Purchase, cls).__setup__() cls._buttons.update({ 'create_equipments': { 'invisible': If(Eval('invoice_state') == 'none', True) | If(Bool(Eval('equipment_create')), True), 'depends': ['invoice_state'],}}) @classmethod def copy(cls, purchases, default=None): if default is None: default = {} else: default = default.copy() default.setdefault('number', None) default.setdefault('invoice_state', 'none') default.setdefault('invoices_ignored', None) default.setdefault('moves', None) default.setdefault('shipment_state', 'none') default.setdefault('purchase_date', None) default.setdefault('quoted_by') default.setdefault('confirmed_by') default.setdefault('equipment_create', None) return super(Purchase, cls).copy(purchases, default=default) @classmethod @ModelView.button def create_equipments(cls, purchases): if len(purchases) == 1: pool = Pool() Equipment = pool.get('optical_equipment.equipment') Config = pool.get('optical_equipment.configuration') config = Config(1) purchase = purchases[0] for line in purchase.lines: if line.product.equipment: for i in range(0,int(line.quantity)): equipment = Equipment( company=line.company, location=line.to_location, equipment_type=line.product.equipment_type, propietary=line.company.party, propietary_address=line.address_equipment, product=line.product, model_category=line.product.model_category, mark_category=line.product.mark_category, reference_category=line.product.reference_category, useful_life=line.product.useful_life if line.product.useful_life else 0, calibration=True if line.product.calibration else False, warranty=line.product.warranty if line.product.warranty else 0, risk=line.product.risk, origin_country=line.product.origin_country, use=line.product.use, biomedical_class=line.product.biomedical_class, refurbish=line.refurbish, serial=None if line.quantity > 1 else line.serial_equipment, health_register=line.health_register, software_version=line.product.software_version if line.product.software_required else "No Aplica", maintenance_frequency="none", purchase_origin=line, ) equipment.save() else: continue purchase.equipment_create = True cls.save(purchases) else: raise UserError(str("NĂºmero de Compras Invalido.")) class Line(metaclass=PoolMeta): "Purchase Line Equipment" __name__ = 'purchase.line' origin_country = fields.Many2One('country.country',"Origin Country") address_equipment = fields.Many2One('party.address', "Direccion", required=True) serial_equipment = fields.Char("Serial", size=None, states={'invisible': If(Eval('quantity') > 1, True)}) refurbish = fields.Boolean("Refurbish") product_equipment = fields.Boolean("Product Equipment", states={'readonly': True}) software_version = fields.Char("Software version") health_register = fields.Char("Health Register", states={'required': Eval('product_equipment', True)}) @classmethod def default_address_equipment(cls): pool = Pool() Company = pool.get('company.company') company = Transaction().context.get('company') if company: company = Company(company) return company.party.addresses[0].id @fields.depends( 'product', 'quantity', methods=['_get_context_purchase_price']) def on_change_quantity(self): Product = Pool().get('product.product') if self.quantity > 1 or self.quantity < 1: self.serial_equipment = None if not self.product: self.serial_equipment = None return with Transaction().set_context(self._get_context_purchase_price()): self.unit_price = Product.get_purchase_price([self.product], abs(self.quantity or 0))[self.product.id] if self.unit_price: self.unit_price = round_price(self.unit_price) @fields.depends('product', 'unit', 'purchase', '_parent_purchase.party', '_parent_purchase.invoice_party', 'product_supplier', 'product_equipment', 'serial_equipment', 'software_version', 'health_register', 'refurbish', methods=['compute_taxes', 'compute_unit_price', '_get_product_supplier_pattern']) def on_change_product(self): if not self.product: self.product_equipment = False self.address_equipment = None self.serial_equipment = None self.software_version = None self.health_register = None self.refurbish = None self.quantity = None self.unit_price = None self.unit = None return party = None if self.purchase: party = self.purchase.invoice_party or self.purchase.party # Set taxes before unit_price to have taxes in context of purchase # price self.taxes = self.compute_taxes(party) category = self.product.purchase_uom.category if not self.unit or self.unit.category != category: self.unit = self.product.purchase_uom product_suppliers = list(self.product.product_suppliers_used( **self._get_product_supplier_pattern())) if len(product_suppliers) == 1: self.product_supplier, = product_suppliers elif (self.product_supplier and self.product_supplier not in product_suppliers): self.product_supplier = None self.unit_price = self.compute_unit_price() self.type = 'line' self.amount = self.on_change_with_amount() if self.product.equipment: self.product_equipment = True self.address_equipment = self.default_address_equipment() if self.product.software_required: self.software_version = self.product.software_version @classmethod def view_attributes(cls): return super(Line, cls).view_attributes() + [ ('//page[@id="equipment"]', 'states', { 'invisible': ~Eval('product_equipment', True), })]