120 lines
4.2 KiB
Python
120 lines
4.2 KiB
Python
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)
|