from trytond.pool import Pool, PoolMeta from trytond.model import ( ModelSQL, ModelView, Workflow, fields) from trytond.pyson import Eval from trytond.modules.company.model import set_employee from trytond.exceptions import UserError from trytond.wizard import ( Button, StateAction, StateTransition, StateView, Wizard) class Subscription(metaclass=PoolMeta): __name__ = 'sale.subscription' equipments = fields.Many2Many('sale.subscription-optical_equipment.equipment', 'subscription', 'equipment', "Equipments", domain=[['OR', ('state', '=', 'registred'), ('state', '=', 'uncontrated')] ]) @classmethod @ModelView.button @Workflow.transition('running') @set_employee('run_by') def run(cls, subscriptions): pool = Pool() Line = pool.get('sale.subscription.line') lines = [] pool = Pool() Equipments = pool.get('optical_equipment.equipment') for subscription in subscriptions: if not subscription.next_invoice_date: subscription.next_invoice_date = ( subscription.compute_next_invoice_date()) for line in subscription.lines: if (line.next_consumption_date is None and not line.consumed_until): line.next_consumption_date = ( line.compute_next_consumption_date()) lines.extend(subscription.lines) for equipment in subscription.equipments: equipment.state = "contrated" equipment.save() Line.save(lines) cls.save(subscriptions) class CreateSubscriptionInvoice(Wizard): "Create Subscription Invoice" __name__ = 'sale.subscription.create_invoice' start = StateView( 'sale.subscription.create_invoice.start', 'sale_subscription.create_invoice_start_view_form', [ Button("Cancel", 'end', 'tryton-cancel'), Button("Create", 'create_', 'tryton-ok', default=True), ]) create_ = StateTransition() def generate_invoice(self, date=None): pool = Pool() Date = pool.get('ir.date') Configuration = pool.get('account.configuration') Config = Configuration(1) Journals = pool.get('account.journal') Invoice = pool.get('account.invoice') InvoiceLine = pool.get('account.invoice.line') subscription = self.records[0] invoice_lines = [] if date is None: date = Date.today() for subscription in self.records: for line in subscription.lines: invoice_lines.append( InvoiceLine( origin=line, product=line.service, account=line.service.product.account_revenue_used, quantity=line.quantity, unit=line.unit, unit_price=line.unit_price, ) ) invoice = Invoice( type='out', journal=Journals.search(['type', '=', 'revenue'])[0], account=Config.default_account_receivable, party=subscription.party, invoice_date=date, invoice_address=subscription.invoice_address, lines=invoice_lines, ) invoice.save() def transition_create_(self): pool = Pool() Subscription = pool.get('sale.subscription') self.generate_invoice(date=self.start.date) return 'end' class SubscriptionEquipment(ModelSQL): 'Optical Equipment - Subscription' __name__ = 'sale.subscription-optical_equipment.equipment' subscription = fields.Many2One('sale.subscription', 'Subscription', select=True) equipment = fields.Many2One('optical_equipment.equipment', 'Equipment', select=True)