Simplify workflow engine

review256001
This commit is contained in:
Cédric Krier committed 2012-03-25 00:18:13 +01:00
1 parent ddc708d439
commit 73494dff5a
5 files changed
+237 -721

No files matched your search

-1
View File
@@ -139,7 +139,6 @@ Biedt mogelijkheden tot:
'account',
'product',
'account_invoice',
'workflow',
'res',
'ir',
'currency',
+18 -3
View File
@@ -1,9 +1,10 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from trytond.model import ModelView, ModelSQL, fields
from trytond.model import Model, fields
from trytond.pool import Pool
class Invoice(ModelSQL, ModelView):
class Invoice(Model):
_name = 'account.invoice'
sales = fields.Many2Many('sale.sale-account.invoice',
@@ -16,10 +17,24 @@ class Invoice(ModelSQL, ModelView):
default.setdefault('sales', False)
return super(Invoice, self).copy(ids, default=default)
def paid(self, ids):
pool = Pool()
sale_obj = pool.get('sale.sale')
super(Invoice, self).paid(ids)
invoices = self.browse(ids)
sale_obj.process(s.id for i in invoices for s in i.sales)
def cancel(self, ids):
pool = Pool()
sale_obj = pool.get('sale.sale')
super(Invoice, self).cancel(ids)
invoices = self.browse(ids)
sale_obj.process(s.id for i in invoices for s in i.sales)
Invoice()
class InvoiceLine(ModelSQL, ModelView):
class InvoiceLine(Model):
_name = 'account.invoice.line'
sale_lines = fields.Many2Many('sale.line-account.invoice.line',
+168 -300
View File
@@ -5,7 +5,7 @@ from decimal import Decimal
import datetime
from itertools import groupby
from functools import partial
from trytond.model import ModelWorkflow, ModelView, ModelSQL, fields
from trytond.model import Workflow, ModelView, ModelSQL, fields
from trytond.modules.company import CompanyReport
from trytond.wizard import Wizard, StateAction, StateView, StateTransition, \
Button
@@ -16,7 +16,7 @@ from trytond.pool import Pool
from trytond.config import CONFIG
class Sale(ModelWorkflow, ModelSQL, ModelView):
class Sale(Workflow, ModelSQL, ModelView):
'Sale'
_name = 'sale.sale'
_rec_name = 'reference'
@@ -121,21 +121,17 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
},
depends=['state'])
invoice_state = fields.Selection([
('none', 'None'),
('waiting', 'Waiting'),
('paid', 'Paid'),
('exception', 'Exception'),
], 'Invoice State', readonly=True, required=True)
('none', 'None'),
('waiting', 'Waiting'),
('paid', 'Paid'),
('exception', 'Exception'),
], 'Invoice State', readonly=True, required=True)
invoices = fields.Many2Many('sale.sale-account.invoice',
'sale', 'invoice', 'Invoices', readonly=True)
invoices_ignored = fields.Many2Many('sale.sale-ignored-account.invoice',
'sale', 'invoice', 'Ignored Invoices', readonly=True)
invoices_recreated = fields.Many2Many('sale.sale-recreated-account.invoice',
'sale', 'invoice', 'Recreated Invoices', readonly=True)
invoice_paid = fields.Function(fields.Boolean('Invoices Paid'),
'get_function_fields')
invoice_exception = fields.Function(fields.Boolean('Invoices Exception'),
'get_function_fields')
shipment_method = fields.Selection([
('manual', 'Manual'),
('order', 'On Order Processed'),
@@ -146,19 +142,15 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
},
depends=['state'])
shipment_state = fields.Selection([
('none', 'None'),
('waiting', 'Waiting'),
('sent', 'Sent'),
('exception', 'Exception'),
], 'Shipment State', readonly=True, required=True)
('none', 'None'),
('waiting', 'Waiting'),
('sent', 'Sent'),
('exception', 'Exception'),
], 'Shipment State', readonly=True, required=True)
shipments = fields.Function(fields.One2Many('stock.shipment.out', None,
'Shipments'), 'get_function_fields')
moves = fields.Function(fields.One2Many('stock.move', None, 'Moves'),
'get_function_fields')
shipment_done = fields.Function(fields.Boolean('Shipment Done'),
'get_function_fields')
shipment_exception = fields.Function(fields.Boolean('Shipments Exception'),
'get_function_fields')
def __init__(self):
super(Sale, self).__init__()
@@ -176,6 +168,36 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
'missing_account_receivable': 'It misses '
'an "Account Receivable" on the party "%s"!',
})
self._transitions |= set((
('draft', 'quotation'),
('quotation', 'confirmed'),
('confirmed', 'processing'),
('processing', 'processing'),
('draft', 'cancel'),
('quotation', 'cancel'),
('quotation', 'draft'),
))
self._buttons.update({
'cancel': {
'invisible': ((Eval('state') == 'cancel')
| (~Eval('state').in_(['draft', 'quotation'])
& (Eval('invoice_state') != 'exception')
& (Eval('shipment_state') != 'exception'))),
},
'draft': {
'invisible': Eval('state') != 'quotation',
},
'quote': {
'invisible': Eval('state') != 'draft',
'readonly': ~Eval('lines', []),
},
'confirm': {
'invisible': Eval('state') != 'quotation',
},
'process': {
'invisible': Eval('state') != 'confirmed',
},
})
# The states where amounts are cached
self._states_cached = ['confirmed', 'processing', 'done', 'cancel']
@@ -425,18 +447,10 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
res['currency_digits'] = self.get_currency_digits(sales)
if 'party_lang' in names:
res['party_lang'] = self.get_party_lang(sales)
if 'invoice_paid' in names:
res['invoice_paid'] = self.get_invoice_paid(sales)
if 'invoice_exception' in names:
res['invoice_exception'] = self.get_invoice_exception(sales)
if 'shipments' in names:
res['shipments'] = self.get_shipments(sales)
if 'moves' in names:
res['moves'] = self.get_moves(sales)
if 'shipment_done' in names:
res['shipment_done'] = self.get_shipment_done(sales)
if 'shipment_exception' in names:
res['shipment_exception'] = self.get_shipment_exception(sales)
return res
def get_untaxed_amount(self, ids, name):
@@ -506,47 +520,31 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
sale.untaxed_amount + sale.tax_amount)
return amounts
def get_invoice_paid(self, sales):
def get_invoice_state(self, sale):
'''
Return if all invoices have been paid for each sales
Return the invoice state for the sale.
'''
skip_ids = set(x.id for x in sale.invoices_ignored)
skip_ids.update(x.id for x in sale.invoices_recreated)
invoices = [i for i in sale.invoices if i.id not in skip_ids]
if invoices:
if any(i.state == 'cancel' for i in invoices):
return 'exception'
elif all(i.state == 'paid' for i in invoices):
return 'paid'
else:
return 'waiting'
return 'none'
:param sales: a BrowseRecordList of sales
:return: a dictionary with sale id as key and
a boolean as value
def set_invoice_state(self, sale):
'''
res = {}
for sale in sales:
val = True
skip_ids = set(x.id for x in sale.invoices_ignored)
skip_ids.update(x.id for x in sale.invoices_recreated)
for invoice in sale.invoices:
if invoice.state != 'paid' \
and invoice.id not in skip_ids:
val = False
break
res[sale.id] = val
return res
def get_invoice_exception(self, sales):
Set the invoice state.
'''
Return if there is an invoice exception for each sales
:param sales: a BrowseRecordList of sales
:return: a dictionary with sale id as key and
a boolean as value
'''
res = {}
for sale in sales:
val = False
skip_ids = set(x.id for x in sale.invoices_ignored)
skip_ids.update(x.id for x in sale.invoices_recreated)
for invoice in sale.invoices:
if invoice.state == 'cancel' \
and invoice.id not in skip_ids:
val = True
break
res[sale.id] = val
return res
state = self.get_invoice_state(sale)
if sale.invoice_state != state:
self.write(sale.id, {
'invoice_state': state,
})
def get_shipments(self, sales):
'''
@@ -581,41 +579,28 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
res[sale.id].extend([x.id for x in line.moves])
return res
def get_shipment_done(self, sales):
def get_shipment_state(self, sale):
'''
Return if all the shipments have been done for each sales
Return the shipment state for the sale.
'''
if sale.moves:
if any(l.move_exception for l in sale.lines):
return 'exception'
elif all(l.move_done for l in sale.lines):
return 'sent'
else:
return 'waiting'
return 'none'
:param sales: a BrowseRecordList of sales
:return: a dictionary with sale id as key and
a boolean as value
def set_shipment_state(self, sale):
'''
res = {}
for sale in sales:
val = True
for line in sale.lines:
if not line.move_done:
val = False
break
res[sale.id] = val
return res
def get_shipment_exception(self, sales):
Set the shipment state.
'''
Return if there is a shipment exception for each sales
:param sales: a BrowseRecordList of sales
:return: a dictionary with sale id as key and
a boolean as value
'''
res = {}
for sale in sales:
val = False
for line in sale.lines:
if line.move_exception:
val = True
break
res[sale.id] = val
return res
state = self.get_shipment_state(sale)
if sale.shipment_state != state:
self.write(sale.id, {
'shipment_state': state,
})
def check_method(self, ids):
'''
@@ -659,48 +644,49 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
default.setdefault('sale_date', False)
return super(Sale, self).copy(ids, default=default)
def check_for_quotation(self, sale_id):
sale = self.browse(sale_id)
if not sale.invoice_address or not sale.shipment_address:
self.raise_user_error('addresses_required')
for line in sale.lines:
if (not line.from_location
and line.product
and line.product.type in ('goods', 'assets')):
self.raise_user_error('warehouse_required')
return True
def check_for_quotation(self, ids):
sales = self.browse(ids)
for sale in sales:
if not sale.invoice_address or not sale.shipment_address:
self.raise_user_error('addresses_required')
for line in sale.lines:
if (not line.from_location
and line.product
and line.product.type in ('goods', 'assets')):
self.raise_user_error('warehouse_required')
def set_reference(self, sale_id):
def set_reference(self, ids):
'''
Fill the reference field with the sale sequence
:param sale_id: the id of the sale
:return: True if succeed
'''
sequence_obj = Pool().get('ir.sequence')
config_obj = Pool().get('sale.configuration')
sale = self.browse(sale_id)
if sale.reference:
return True
config = config_obj.browse(1)
reference = sequence_obj.get_id(config.sale_sequence.id)
self.write(sale_id, {
'reference': reference,
})
return True
def set_sale_date(self, sale):
date_obj = Pool().get('ir.date')
if not sale.sale_date:
sales = self.browse(ids)
for sale in sales:
if sale.reference:
continue
reference = sequence_obj.get_id(config.sale_sequence.id)
self.write(sale.id, {
'sale_date': date_obj.today(),
'reference': reference,
})
def set_sale_date(self, ids):
date_obj = Pool().get('ir.date')
for sale in self.browse(ids):
if not sale.sale_date:
self.write(sale.id, {
'sale_date': date_obj.today(),
})
def store_cache(self, ids):
for sale in self.browse(ids):
self.write(sale.id, {
'untaxed_amount_cache': sale.untaxed_amount,
'tax_amount_cache': sale.tax_amount,
'total_amount_cache': sale.total_amount,
})
return True
def _get_invoice_line_sale_line(self, sale):
'''
@@ -749,21 +735,15 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
}
return res
def create_invoice(self, sale_id):
def create_invoice(self, sale):
'''
Create an invoice for the sale
:param sale_id: the sale id
:return: the created invoice id or None
Create an invoice for the sale and return the id
'''
pool = Pool()
invoice_obj = pool.get('account.invoice')
invoice_line_obj = pool.get('account.invoice.line')
sale_line_obj = pool.get('sale.line')
sale = self.browse(sale_id)
if not sale.party.account_receivable:
self.raise_user_error('missing_account_receivable',
error_args=(sale.party.rec_name,))
@@ -791,7 +771,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
with Transaction().set_user(0, set_context=True):
invoice_obj.update_taxes([invoice_id])
self.write(sale_id, {
self.write(sale.id, {
'invoices': [('add', invoice_id)],
})
return invoice_id
@@ -831,21 +811,16 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
('warehouse', line.warehouse.id),
)
def create_shipment(self, sale_id):
def create_shipment(self, sale):
'''
Create a shipment for the sale
:param sale_id: the sale id
:return: the list of created shipment id or None
and return the list of created shipment ids
'''
pool = Pool()
shipment_obj = pool.get('stock.shipment.out')
move_obj = pool.get('stock.move')
sale_line_obj = pool.get('sale.line')
sale = self.browse(sale_id)
moves = self._get_move_sale_line(sale)
if not moves:
return
@@ -871,158 +846,51 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
sale_line_obj.write(line_id, {
'moves': [('add', move_id)],
})
shipment_obj.workflow_trigger_validate(shipment_id, 'waiting')
shipment_obj.wait(shipments)
return shipments
def wkf_draft(self, sale):
self.write(sale.id, {'state': 'draft'})
def is_done(self, sale):
return sale.invoice_state == 'paid' and sale.shipment_state == 'sent'
def wkf_quotation(self, sale):
self.check_for_quotation(sale.id)
self.set_reference(sale.id)
self.write(sale.id, {'state': 'quotation'})
@ModelView.button
@Workflow.transition('cancel')
def cancel(self, ids):
self.store_cache(ids)
def wkf_confirmed(self, sale):
self.set_sale_date(sale)
self.write(sale.id, {
'state': 'confirmed',
'untaxed_amount_cache': sale.untaxed_amount,
'tax_amount_cache': sale.tax_amount,
'total_amount_cache': sale.total_amount,
})
@ModelView.button
@Workflow.transition('draft')
def draft(self, ids):
pass
def wkf_processing(self, sale):
self.write(sale.id, {'state': 'processing'})
@ModelView.button
@Workflow.transition('quotation')
def quote(self, ids):
self.check_for_quotation(ids)
self.set_reference(ids)
def wkf_waiting_invoice_sale(self, sale):
self.create_invoice(sale.id)
self.write(sale.id, {'invoice_state': 'waiting'})
@ModelView.button
@Workflow.transition('confirmed')
def confirm(self, ids):
self.set_sale_date(ids)
self.store_cache(ids)
def wkf_invoice_sale_exception(self, sale):
self.write(sale.id, {'invoice_state': 'exception'})
def wkf_invoice_sale_done(self, sale):
self.write(sale.id, {'invoice_state': 'paid'})
def wkf_shipment_invoice(self, sale):
self.create_shipment(sale.id)
def wkf_waiting_shipment_invoice(self, sale):
self.write(sale.id, {'shipment_state': 'waiting'})
self.create_shipment(sale.id)
def wkf_shipment_invoice_exception(self, sale):
self.write(sale.id, {'shipment_state': 'exception'})
def wkf_shipment_invoice_done(self, sale):
self.write(sale.id, {'shipment_state': 'sent'})
def wkf_shipment(self, sale):
self.create_shipment(sale.id)
def wkf_waiting_shipment(self, sale):
self.write(sale.id, {'shipment_state': 'waiting'})
self.create_shipment(sale.id)
def wkf_shipment_exception(self, sale):
self.write(sale.id, {'shipment_state': 'exception'})
def wkf_invoice_shipment(self, sale):
self.create_invoice(sale.id)
self.write(sale.id, {'invoice_state': 'waiting'})
def wkf_waiting_invoice_shipment(self, sale):
self.write(sale.id,
{'invoice_state': 'waiting', 'shipment_state': 'sent'})
def wkf_invoice_shipment_exception(self, sale):
self.write(sale.id, {'invoice_state': 'exception'})
def wkf_invoice_shipment_done(self, sale):
self.write(sale.id, {'invoice_state': 'paid'})
def wkf_invoice_shipment_method_done(self, sale):
self.write(sale.id, {'shipment_state': 'sent'})
def wkf_done(self, sale):
self.write(sale.id, {'state': 'done'})
def wkf_cancel(self, sale):
self.write(sale.id, {
'state': 'cancel',
'untaxed_amount_cache': sale.untaxed_amount,
'tax_amount_cache': sale.tax_amount,
'total_amount_cache': sale.total_amount,
})
def wkf_draft2quotation(self, sale):
return bool(sale.lines)
def wkf_invoice_method2waiting_invoice_sale(self, sale):
return sale.invoice_method == 'order'
def wkf_invoice_method2invoice_method_done(self, sale):
return sale.invoice_method != 'order'
def wkf_triggered_invoices(self, sale):
return [x.id for x in sale.invoices]
def wkf_waiting_invoice_sale2invoice_sale_exception(self, sale):
return sale.invoice_exception
def wkf_waiting_invoice_sale2invoice_sale_done(self, sale):
return sale.invoice_paid
def wkf_shipment_invoice_method2shipment_invoice_method_done(self, sale):
return sale.shipment_method != 'invoice'
def wkf_shipment_invoice_method2shipment_invoice(self, sale):
return self.shipment_method == 'invoice'
def wkf_triggered_shipments(self, sale):
return [x.id for x in sale.shipments]
def wkf_waiting_shipment_invoice2shipment_invoice_exception(self, sale):
return sale.shipment_exception
def wkf_waiting_shipment_invoice2shipment_invoice_done(self, sale):
return sale.shipment_done
def wkf_shipment_method2shipment_method_done(self, sale):
return sale.shipment_method != 'order'
def wkf_shipment_method2shipment(self, sale):
return sale.shipment_method == 'order'
def wkf_waiting_shipment2shipment_exception(self, sale):
return sale.shipment_exception
def wkf_waiting_shipment2invoice_shipment_method(self, sale):
return not sale.shipment_exception
def wkf_waiting_shipment2invoice_shipment_method_nosignal(self, sale):
return sale.shipment_done
def wkf_invoice_shipment_method2invoice_shipment(self, sale):
return sale.invoice_method == 'shipment'
def wkf_invoice_shipment_method2invoice_shipment_method_done(self, sale):
return sale.invoice_method != 'shipment' and sale.shipment_done
def wkf_invoice_shipment_method2waiting_shipment(self, sale):
return sale.invoice_method != 'shipment' and not sale.shipment_done
def wkf_invoice_shipment2waiting_shipment(self, sale):
return not sale.shipment_done
def wkf_invoice_shipment2waiting_invoice_shipment(self, sale):
return sale.shipment_done
def wkf_waiting_invoice_shipment2invoice_shipment_exception(self, sale):
return sale.invoice_exception
def wkf_waiting_invoice_shipment2invoice_shipment_done(self, sale):
return sale.invoice_paid
@ModelView.button
@Workflow.transition('processing')
def process(self, ids):
done = []
for sale in self.browse(ids):
if sale.state in ('done', 'cancel'):
continue
self.create_invoice(sale)
self.set_invoice_state(sale)
self.create_shipment(sale)
self.set_shipment_state(sale)
if self.is_done(sale):
done.append(sale.id)
if done:
self.write(done, {
'state': 'done',
})
Sale()
@@ -1764,7 +1632,8 @@ class ShipmentOut(ModelSQL, ModelView):
if sale_line.sale.id not in sale_ids:
sale_ids.append(sale_line.sale.id)
sale_obj.workflow_trigger_validate(sale_ids, 'shipment_update')
with Transaction().set_user(0, set_context=True):
sale_obj.process(sale_ids)
return res
def button_draft(self, ids):
@@ -1832,8 +1701,8 @@ class Move(ModelSQL, ModelView):
for sale_line in sale_line_obj.browse(sale_line_ids):
sale_ids.add(sale_line.sale.id)
if sale_ids:
sale_obj.workflow_trigger_validate(list(sale_ids),
'shipment_update')
with Transaction().set_user(0, set_context=True):
sale_obj.process(list(sale_ids))
return res
def delete(self, ids):
@@ -1854,8 +1723,8 @@ class Move(ModelSQL, ModelView):
for sale_line in sale_line_obj.browse(sale_line_ids):
sale_ids.add(sale_line.sale.id)
if sale_ids:
sale_obj.workflow_trigger_validate(list(sale_ids),
'shipment_update')
with Transaction().set_user(0, set_context=True):
sale_obj.process(list(sale_ids))
return res
Move()
@@ -1879,7 +1748,8 @@ class Invoice(ModelSQL, ModelView):
'an invoice generated by a sale.',
})
def button_draft(self, ids):
@Workflow.transition('draft')
def draft(self, ids):
sale_obj = Pool().get('sale.sale')
sale_ids = sale_obj.search([
('invoices', 'in', ids),
@@ -1888,7 +1758,7 @@ class Invoice(ModelSQL, ModelView):
if sale_ids:
self.raise_user_error('reset_invoice_sale')
return super(Invoice, self).button_draft(ids)
return super(Invoice, self).draft(ids)
def get_sale_exception_state(self, ids, name):
sale_obj = Pool().get('sale.sale')
@@ -2033,8 +1903,7 @@ class HandleShipmentException(Wizard):
'moves_ignored': [('add', moves_ignored)],
'moves_recreated': [('add', moves_recreated)],
})
sale_obj.workflow_trigger_validate(sale.id, 'shipment_ok')
sale_obj.process([sale.id])
return 'end'
HandleShipmentException()
@@ -2106,8 +1975,7 @@ class HandleInvoiceException(Wizard):
'invoices_ignored': [('add', invoices_ignored)],
'invoices_recreated': [('add', invoices_recreated)],
})
sale_obj.workflow_trigger_validate(sale.id, 'invoice_ok')
sale_obj.process([sale.id])
return 'end'
HandleInvoiceException()
+50 -416
View File
@@ -89,14 +89,11 @@ this repository contains the full copyright notices and license terms. -->
<label name="total_amount" xalign="1.0" xexpand="1"/>
<field name="total_amount" xalign="1.0" xexpand="0"/>
<group col="7" colspan="2" id="buttons">
<button name="cancel" string="Cancel"
states="{'invisible': Or(Equal(Eval('state'), 'cancel'), And(Not(In(Eval('state'), ['draft', 'quotation'])), Not(Equal(Eval('invoice_state'), 'exception')), Not(Equal(Eval('shipment_state'), 'exception')))), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
<button name="cancel" type="object" string="Cancel"
icon="tryton-cancel"/>
<button name="draft" string="Draft"
states="{'invisible': Not(Equal(Eval('state'), 'quotation')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
<button name="draft" type="object" string="Draft"
icon="tryton-go-previous"/>
<button name="quotation" string="Quotation"
states="{'invisible': Not(Equal(Eval('state'), 'draft')), 'readonly': Or(Not(Bool(Eval('lines'))), Not(In(%(group_sale)d, Eval('groups', []))))}"
<button name="quote" type="object" string="Quote"
icon="tryton-go-next"/>
<button name="%(wizard_invoice_handle_exception)d"
string="Handle Invoice Exception"
@@ -108,11 +105,9 @@ this repository contains the full copyright notices and license terms. -->
string="Handle Shipment Exception"
states="{'invisible': Or(Not(Equal(Eval('shipment_state'), 'exception')), Equal(Eval('state'), 'cancel')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
icon="tryton-go-next"/>
<button name="confirm" string="Confirm"
states="{'invisible': Not(Equal(Eval('state'), 'quotation')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
<button name="confirm" type="object" string="Confirm"
icon="tryton-go-next"/>
<button name="process" string="Process"
states="{'invisible': Not(Equal(Eval('state'), 'confirmed')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
<button name="process" type="object" string="Process"
icon="tryton-go-next"/>
</group>
</group>
@@ -335,6 +330,51 @@ this repository contains the full copyright notices and license terms. -->
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.button" id="sale_cancel_button">
<field name="name">cancel</field>
<field name="model" search="[('model', '=', 'sale.sale')]"/>
</record>
<record model="ir.model.button-res.group" id="sale_cancel_button_group_sale">
<field name="button" ref="sale_cancel_button"/>
<field name="group" ref="group_sale"/>
</record>
<record model="ir.model.button" id="sale_draft_button">
<field name="name">draft</field>
<field name="model" search="[('model', '=', 'sale.sale')]"/>
</record>
<record model="ir.model.button-res.group" id="sale_draft_button_group_sale">
<field name="button" ref="sale_draft_button"/>
<field name="group" ref="group_sale"/>
</record>
<record model="ir.model.button" id="sale_quote_button">
<field name="name">quote</field>
<field name="model" search="[('model', '=', 'sale.sale')]"/>
</record>
<record model="ir.model.button-res.group" id="sale_quote_button_group_sale">
<field name="button" ref="sale_quote_button"/>
<field name="group" ref="group_sale"/>
</record>
<record model="ir.model.button" id="sale_confirm_button">
<field name="name">confirm</field>
<field name="model" search="[('model', '=', 'sale.sale')]"/>
</record>
<record model="ir.model.button-res.group" id="sale_confirm_button_group_sale">
<field name="button" ref="sale_confirm_button"/>
<field name="group" ref="group_sale"/>
</record>
<record model="ir.model.button" id="sale_process_button">
<field name="name">process</field>
<field name="model" search="[('model', '=', 'sale.sale')]"/>
</record>
<record model="ir.model.button-res.group" id="sale_process_button_group_sale">
<field name="button" ref="sale_process_button"/>
<field name="group" ref="group_sale"/>
</record>
<record model="ir.sequence.type" id="sequence_type_sale">
<field name="name">Sale</field>
<field name="code">sale.sale</field>
@@ -355,412 +395,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="code">sale.sale</field>
</record>
<record model="workflow" id="sale_workflow">
<field name="name">Sale workflow</field>
<field name="model">sale.sale</field>
<field name="on_create" eval="True"/>
</record>
<record model="workflow.activity" id="sale_activity_draft">
<field name="name">Draft</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_draft</field>
<field name="flow_start" eval="True"/>
</record>
<record model="workflow.activity" id="sale_activity_quotation">
<field name="name">Quotation</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_quotation</field>
</record>
<record model="workflow.activity" id="sale_activity_confirmed">
<field name="name">Confirmed</field>
<field name="workflow" ref="sale_workflow"/>
<field name="split_mode">XOR</field>
<field name="method">wkf_confirmed</field>
</record>
<record model="workflow.activity" id="sale_activity_processing">
<field name="name">Processing</field>
<field name="workflow" ref="sale_workflow"/>
<field name="split_mode">AND</field>
<field name="method">wkf_processing</field>
</record>
<record model="workflow.activity" id="sale_activity_invoice_method">
<field name="name">Invoice Method</field>
<field name="workflow" ref="sale_workflow"/>
<field name="split_mode">OR</field>
</record>
<record model="workflow.activity" id="sale_activity_waiting_invoice_sale">
<field name="name">Waiting Invoice</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_waiting_invoice_sale</field>
</record>
<record model="workflow.activity" id="sale_activity_invoice_sale_exception">
<field name="name">Invoice Exception</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_invoice_sale_exception</field>
</record>
<record model="workflow.activity" id="sale_activity_invoice_sale_done">
<field name="name">Invoice Done</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_invoice_sale_done</field>
</record>
<record model="workflow.activity" id="sale_activity_shipment_invoice_method">
<field name="name">Shipment Invoice Method</field>
<field name="workflow" ref="sale_workflow"/>
<field name="split_mode">OR</field>
</record>
<record model="workflow.activity" id="sale_activity_shipment_invoice">
<field name="name">Shipment Invoice</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_shipment_invoice</field>
</record>
<record model="workflow.activity" id="sale_activity_waiting_shipment_invoice">
<field name="name">Waiting Shipment Invoice</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_waiting_shipment_invoice</field>
</record>
<record model="workflow.activity" id="sale_activity_shipment_invoice_exception">
<field name="name">Shipment Invoice Exception</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_shipment_invoice_exception</field>
</record>
<record model="workflow.activity" id="sale_activity_shipment_invoice_done">
<field name="name">Shipment Invoice Done</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_shipment_invoice_done</field>
</record>
<record model="workflow.activity" id="sale_activity_shipment_invoice_method_done">
<field name="name">Shipment Invoice Method Done</field>
<field name="workflow" ref="sale_workflow"/>
</record>
<record model="workflow.activity" id="sale_activity_invoice_method_done">
<field name="name">Invoice Method Done</field>
<field name="workflow" ref="sale_workflow"/>
</record>
<record model="workflow.activity" id="sale_activity_shipment_method">
<field name="name">Shipment Method</field>
<field name="workflow" ref="sale_workflow"/>
</record>
<record model="workflow.activity" id="sale_activity_shipment">
<field name="name">Shipment</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_shipment</field>
</record>
<record model="workflow.activity" id="sale_activity_waiting_shipment">
<field name="name">Waiting Shipment</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_waiting_shipment</field>
</record>
<record model="workflow.activity" id="sale_activity_shipment_exception">
<field name="name">Shipment Exception</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_shipment_exception</field>
</record>
<record model="workflow.activity" id="sale_activity_invoice_shipment_method">
<field name="name">Invoice Shipment Method</field>
<field name="workflow" ref="sale_workflow"/>
<field name="split_mode">OR</field>
</record>
<record model="workflow.activity" id="sale_activity_invoice_shipment">
<field name="name">Invoice Shipment</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_invoice_shipment</field>
</record>
<record model="workflow.activity" id="sale_activity_waiting_invoice_shipment">
<field name="name">Waiting Invoice Shipment</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_waiting_invoice_shipment</field>
</record>
<record model="workflow.activity" id="sale_activity_invoice_shipment_exception">
<field name="name">Invoice Shipment Exception</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_invoice_shipment_exception</field>
</record>
<record model="workflow.activity" id="sale_activity_invoice_shipment_done">
<field name="name">Invoice Shipment Done</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_invoice_shipment_done</field>
</record>
<record model="workflow.activity" id="sale_activity_invoice_shipment_method_done">
<field name="name">Invoice Shipment Method Done</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_invoice_shipment_method_done</field>
</record>
<record model="workflow.activity" id="sale_activity_shipment_method_done">
<field name="name">Shipment Method Done</field>
<field name="workflow" ref="sale_workflow"/>
</record>
<record model="workflow.activity" id="sale_activity_done">
<field name="name">Done</field>
<field name="workflow" ref="sale_workflow"/>
<field name="join_mode">AND</field>
<field name="method">wkf_done</field>
<field name="flow_stop" eval="True"/>
</record>
<record model="workflow.activity" id="sale_activity_cancel">
<field name="name">Canceled</field>
<field name="workflow" ref="sale_workflow"/>
<field name="method">wkf_cancel</field>
<field name="flow_stop" eval="True"/>
</record>
<record model="workflow.transition" id="sale_transition_draft_quotation">
<field name="act_from" ref="sale_activity_draft"/>
<field name="act_to" ref="sale_activity_quotation"/>
<field name="condition">wkf_draft2quotation</field>
<field name="signal">quotation</field>
<field name="group" ref="group_sale"/>
</record>
<record model="workflow.transition" id="sale_transition_draft_cancel">
<field name="act_from" ref="sale_activity_draft"/>
<field name="act_to" ref="sale_activity_cancel"/>
<field name="signal">cancel</field>
<field name="group" ref="group_sale"/>
</record>
<record model="workflow.transition" id="sale_transition_quotation_draft">
<field name="act_from" ref="sale_activity_quotation"/>
<field name="act_to" ref="sale_activity_draft"/>
<field name="signal">draft</field>
<field name="group" ref="group_sale"/>
</record>
<record model="workflow.transition" id="sale_transition_quotation_confirmed">
<field name="act_from" ref="sale_activity_quotation"/>
<field name="act_to" ref="sale_activity_confirmed"/>
<field name="signal">confirm</field>
<field name="group" ref="group_sale"/>
</record>
<record model="workflow.transition" id="sale_transition_confirmed_processing">
<field name="act_from" ref="sale_activity_confirmed"/>
<field name="act_to" ref="sale_activity_processing"/>
<field name="signal">process</field>
<field name="group" ref="group_sale"/>
</record>
<record model="workflow.transition" id="sale_transition_quotation_cancel">
<field name="act_from" ref="sale_activity_quotation"/>
<field name="act_to" ref="sale_activity_cancel"/>
<field name="signal">cancel</field>
<field name="group" ref="group_sale"/>
</record>
<record model="workflow.transition" id="sale_transition_processing_invoice_method">
<field name="act_from" ref="sale_activity_processing"/>
<field name="act_to" ref="sale_activity_invoice_method"/>
</record>
<record model="workflow.transition" id="sale_transition_invoice_method_waiting_invoice_sale">
<field name="act_from" ref="sale_activity_invoice_method"/>
<field name="act_to" ref="sale_activity_waiting_invoice_sale"/>
<field name="condition">wkf_invoice_method2waiting_invoice_sale</field>
</record>
<record model="workflow.transition" id="sale_transition_invoice_method_invoice_method_done">
<field name="act_from" ref="sale_activity_invoice_method"/>
<field name="act_to" ref="sale_activity_invoice_method_done"/>
<field name="condition">wkf_invoice_method2invoice_method_done</field>
</record>
<record model="workflow.transition" id="sale_transition_waiting_invoice_sale_invoice_sale_exception">
<field name="act_from" ref="sale_activity_waiting_invoice_sale"/>
<field name="act_to" ref="sale_activity_invoice_sale_exception"/>
<field name="trigger_model">account.invoice</field>
<field name="trigger_ids">wkf_triggered_invoices</field>
<field
name="condition">wkf_waiting_invoice_sale2invoice_sale_exception</field>
</record>
<record model="workflow.transition" id="sale_transition_invoice_sale_exception_invoice_sale">
<field name="act_from" ref="sale_activity_invoice_sale_exception"/>
<field name="act_to" ref="sale_activity_waiting_invoice_sale"/>
<field name="signal">invoice_ok</field>
<field name="group" ref="group_sale"/>
</record>
<record model="workflow.transition" id="sale_transition_invoice_sale_exception_cancel">
<field name="act_from" ref="sale_activity_invoice_sale_exception"/>
<field name="act_to" ref="sale_activity_cancel"/>
<field name="signal">cancel</field>
<field name="group" ref="group_sale"/>
</record>
<record model="workflow.transition" id="sale_transition_waiting_invoice_sale_invoic_sale_done">
<field name="act_from" ref="sale_activity_waiting_invoice_sale"/>
<field name="act_to" ref="sale_activity_invoice_sale_done"/>
<field name="trigger_model">account.invoice</field>
<field name="trigger_ids">wkf_triggered_invoices</field>
<field name="condition">wkf_waiting_invoice_sale2invoice_sale_done</field>
</record>
<record model="workflow.transition" id="sale_transition_invoice_sale_done">
<field name="act_from" ref="sale_activity_invoice_sale_done"/>
<field name="act_to" ref="sale_activity_shipment_invoice_method"/>
</record>
<record model="workflow.transition" id="sale_transition_shipment_invoice_method_shipment_invoice_method_done">
<field name="act_from" ref="sale_activity_shipment_invoice_method"/>
<field name="act_to" ref="sale_activity_shipment_invoice_method_done"/>
<field
name="condition">wkf_shipment_invoice_method2shipment_invoice_method_done</field>
</record>
<record model="workflow.transition" id="sale_transition_shipment_invoice_method_shipment_invoice">
<field name="act_from" ref="sale_activity_shipment_invoice_method"/>
<field name="act_to" ref="sale_activity_shipment_invoice"/>
<field
name="condition">wkf_shipment_invoice_method2shipment_invoice</field>
</record>
<record model="workflow.transition" id="sale_transition_shipment_invoice_waiting_shipment_invoice">
<field name="act_from" ref="sale_activity_shipment_invoice"/>
<field name="act_to" ref="sale_activity_waiting_shipment_invoice"/>
</record>
<record model="workflow.transition" id="sale_transition_shipment_invoice_shipment_invoice_exception">
<field name="act_from" ref="sale_activity_waiting_shipment_invoice"/>
<field name="act_to" ref="sale_activity_shipment_invoice_exception"/>
<field name="trigger_model">stock.shipment.out</field>
<field name="trigger_ids">wkf_triggered_shipments</field>
<field
name="condition">wkf_waiting_shipment_invoice2shipment_invoice_exception</field>
</record>
<record model="workflow.transition" id="sale_transition_shipment_invoice_exception_cancel">
<field name="act_from" ref="sale_activity_shipment_invoice_exception"/>
<field name="act_to" ref="sale_activity_cancel"/>
<field name="signal">cancel</field>
<field name="group" ref="group_sale"/>
</record>
<record model="workflow.transition" id="sale_transition_shipment_invoice_exception_waiting_shipment_invoice">
<field name="act_from" ref="sale_activity_shipment_invoice_exception"/>
<field name="act_to" ref="sale_activity_waiting_shipment_invoice"/>
<field name="signal">shipment_ok</field>
<field name="group" ref="group_sale"/>
</record>
<record model="workflow.transition" id="sale_transition_shipment_waiting_shipment_invoice_shipment_invoice_done">
<field name="act_from" ref="sale_activity_waiting_shipment_invoice"/>
<field name="act_to" ref="sale_activity_shipment_invoice_done"/>
<field name="trigger_model">stock.shipment.out</field>
<field name="trigger_ids">wkf_triggered_shipments</field>
<field
name="condition">wkf_waiting_shipment_invoice2shipment_invoice_done</field>
</record>
<record model="workflow.transition" id="sale_transition_shipment_invoice_done_shipment_invoice_method_done">
<field name="act_from" ref="sale_activity_shipment_invoice_done"/>
<field name="act_to" ref="sale_activity_shipment_invoice_method_done"/>
</record>
<record model="workflow.transition" id="sale_transition_shipment_invoice_method_done_invoice_method_done">
<field name="act_from" ref="sale_activity_shipment_invoice_method_done"/>
<field name="act_to" ref="sale_activity_invoice_method_done"/>
</record>
<record model="workflow.transition" id="sale_transition_invoice_method_done_done">
<field name="act_from" ref="sale_activity_invoice_method_done"/>
<field name="act_to" ref="sale_activity_done"/>
</record>
<record model="workflow.transition" id="sale_transition_processing_shipment_method">
<field name="act_from" ref="sale_activity_processing"/>
<field name="act_to" ref="sale_activity_shipment_method"/>
</record>
<record model="workflow.transition" id="sale_transition_shipment_method_shipment_method_done">
<field name="act_from" ref="sale_activity_shipment_method"/>
<field name="act_to" ref="sale_activity_shipment_method_done"/>
<field name="condition">wkf_shipment_method2shipment_method_done</field>
</record>
<record model="workflow.transition" id="sale_transition_shipment_method_shipment">
<field name="act_from" ref="sale_activity_shipment_method"/>
<field name="act_to" ref="sale_activity_shipment"/>
<field name="condition">wkf_shipment_method2shipment</field>
</record>
<record model="workflow.transition" id="sale_transition_shipment_waiting_shipment">
<field name="act_from" ref="sale_activity_shipment"/>
<field name="act_to" ref="sale_activity_waiting_shipment"/>
</record>
<record model="workflow.transition" id="sale_transition_waiting_shipment_shipment_exception">
<field name="act_from" ref="sale_activity_waiting_shipment"/>
<field name="act_to" ref="sale_activity_shipment_exception"/>
<field name="signal">shipment_update</field>
<field name="condition">wkf_waiting_shipment2shipment_exception</field>
</record>
<record model="workflow.transition" id="sale_transition_shipment_exception_cancel">
<field name="act_from" ref="sale_activity_shipment_exception"/>
<field name="act_to" ref="sale_activity_cancel"/>
<field name="signal">cancel</field>
<field name="group" ref="group_sale"/>
</record>
<record model="workflow.transition" id="sale_transition_shipment_exception_waiting_shipment">
<field name="act_from" ref="sale_activity_shipment_exception"/>
<field name="act_to" ref="sale_activity_waiting_shipment"/>
<field name="signal">shipment_ok</field>
<field name="group" ref="group_sale"/>
</record>
<record model="workflow.transition" id="sale_transition_waiting_shipment_invoice_shipment_method">
<field name="act_from" ref="sale_activity_waiting_shipment"/>
<field name="act_to" ref="sale_activity_invoice_shipment_method"/>
<field name="signal">shipment_update</field>
<field
name="condition">wkf_waiting_shipment2invoice_shipment_method</field>
</record>
<record model="workflow.transition" id="sale_transition_waiting_shipment_invoice_shipment_method2">
<field name="act_from" ref="sale_activity_waiting_shipment"/>
<field name="act_to" ref="sale_activity_invoice_shipment_method"/>
<field
name="condition">wkf_waiting_shipment2invoice_shipment_method_nosignal</field>
</record>
<record model="workflow.transition" id="sale_transition_invoice_shipment_method_invoice_shipment">
<field name="act_from" ref="sale_activity_invoice_shipment_method"/>
<field name="act_to" ref="sale_activity_invoice_shipment"/>
<field
name="condition">wkf_invoice_shipment_method2invoice_shipment</field>
</record>
<record model="workflow.transition" id="sale_transition_invoice_shipment_method_invoice_shipment_method_done">
<field name="act_from" ref="sale_activity_invoice_shipment_method"/>
<field name="act_to" ref="sale_activity_invoice_shipment_method_done"/>
<field
name="condition">wkf_invoice_shipment_method2invoice_shipment_method_done</field>
</record>
<record model="workflow.transition" id="sale_transition_invoice_shipment_method_waiting_shipment">
<field name="act_from" ref="sale_activity_invoice_shipment_method"/>
<field name="act_to" ref="sale_activity_waiting_shipment"/>
<field
name="condition">wkf_invoice_shipment_method2waiting_shipment</field>
</record>
<record model="workflow.transition" id="sale_transition_invoice_shipment_waiting_shipment">
<field name="act_from" ref="sale_activity_invoice_shipment"/>
<field name="act_to" ref="sale_activity_waiting_shipment"/>
<field name="condition">wkf_invoice_shipment2waiting_shipment</field>
</record>
<record model="workflow.transition" id="sale_transition_invoice_shipment_waiting_invoice_shipment">
<field name="act_from" ref="sale_activity_invoice_shipment"/>
<field name="act_to" ref="sale_activity_waiting_invoice_shipment"/>
<field
name="condition">wkf_invoice_shipment2waiting_invoice_shipment</field>
</record>
<record model="workflow.transition" id="sale_transition_waiting_invoice_shipment_invoice_shipment_exception">
<field name="act_from" ref="sale_activity_waiting_invoice_shipment"/>
<field name="act_to" ref="sale_activity_invoice_shipment_exception"/>
<field name="trigger_model">account.invoice</field>
<field name="trigger_ids">wkf_triggered_invoices</field>
<field
name="condition">wkf_waiting_invoice_shipment2invoice_shipment_exception</field>
</record>
<record model="workflow.transition" id="sale_transition_invoice_shipment_exception_cancel">
<field name="act_from" ref="sale_activity_invoice_shipment_exception"/>
<field name="act_to" ref="sale_activity_cancel"/>
<field name="signal">cancel</field>
<field name="group" ref="group_sale"/>
</record>
<record model="workflow.transition" id="sale_transition_invoice_shipment_exception_waiting_invoice_shipment">
<field name="act_from" ref="sale_activity_invoice_shipment_exception"/>
<field name="act_to" ref="sale_activity_waiting_invoice_shipment"/>
<field name="signal">invoice_ok</field>
<field name="group" ref="group_sale"/>
</record>
<record model="workflow.transition" id="sale_transition_waiting_invoice_shipment_invoice_shipment_done">
<field name="act_from" ref="sale_activity_waiting_invoice_shipment"/>
<field name="act_to" ref="sale_activity_invoice_shipment_done"/>
<field name="trigger_model">account.invoice</field>
<field name="trigger_ids">wkf_triggered_invoices</field>
<field
name="condition">wkf_waiting_invoice_shipment2invoice_shipment_done</field>
</record>
<record model="workflow.transition" id="sale_transition_invoice_shipment_done_invoice_shipment_method_done">
<field name="act_from" ref="sale_activity_invoice_shipment_done"/>
<field name="act_to" ref="sale_activity_invoice_shipment_method_done"/>
</record>
<record model="workflow.transition" id="sale_transition_invoice_shipment_method_done_shipment_method_done">
<field name="act_from" ref="sale_activity_invoice_shipment_method_done"/>
<field name="act_to" ref="sale_activity_shipment_method_done"/>
</record>
<record model="workflow.transition" id="sale_transition_shipment_method_done_done">
<field name="act_from" ref="sale_activity_shipment_method_done"/>
<field name="act_to" ref="sale_activity_done"/>
</record>
<record model="ir.action.report" id="report_sale">
<field name="name">Sale</field>
<field name="model">sale.sale</field>
+1 -1
View File
@@ -12,7 +12,7 @@ minor_version = int(minor_version)
requires = []
for dep in info.get('depends', []):
if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
if not re.match(r'(ir|res|webdav)(\W|$)', dep):
requires.append('trytond_%s >= %s.%s, < %s.%s' %
(dep, major_version, minor_version, major_version,
minor_version + 1))