Odoo Help

Welcome!

This community is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.

0

Workflow in XML file

By
Selverine
on 12/13/13, 6:53 AM 965 views

Hi everybody,

I would like to modify the workflow of the sale_order.

My goal is to have a intermediaire state between quotation and sale_order. When I use my function , I have this error:

  • "The value "int" for the field "sale_order.state" is not in the selection

I add this code in the XML file:

   <record id="act_int" model="workflow.activity">
        <field name="wkf_id" ref="wkf_sale"/>
        <field name="name">int</field>
        <field name="kind">function</field>
        <field name="action">write({'state':'int'})</field>
    </record>  

    <record id="trans_int_sent" model="workflow.transition">
        <field name="act_from" ref="act_draft"/>
        <field name="act_to" ref="act_int"/>
        <field name="signal">int_sent</field>
    </record>

Someone have an idea how it works?

Thanks a lot,

Selverine

0

René Schuster

--René Schuster--
1560
| 5 5 8
Weinheim, Germany
--René Schuster--

Challenge Everything!

René Schuster
On 12/13/13, 7:15 AM

You have not modified the selection field 'states' of the sale_order model.

'state': fields.selection([
        ('draft', 'Draft Quotation'),
        ('sent', 'Quotation Sent'),
        ('cancel', 'Cancelled'),
        ('waiting_date', 'Waiting Schedule'),
        ('progress', 'Sales Order'),
        ('manual', 'Sale to Invoice'),
        ('invoice_except', 'Invoice Exception'),
        ('done', 'Done'),
        ], 'Status', readonly=True, track_visibility='onchange',)

Add

 ('int', 'Intermediate State'),

to the selection.

EDIT: You may also need another transition from int state to sent state.

EDIT2: In detail: Your intermediate state needs two transitions. From "Draft" to "Int", and from "Int" to "Sent".

<record id="trans_draft_int" model="workflow.transition">
        <field name="act_from" ref="act_draft"/>
        <field name="act_to" ref="act_int"/>
</record>

<record id="trans_int_sent" model="workflow.transition">
        <field name="act_from" ref="act_int"/>
        <field name="act_to" ref="act_sent"/>
</record>

But I highly recommend modifing the module by creation your own module and inherit from sale_oder.

0
Selverine
On 12/19/13, 6:34 AM

Dear rené,

Thank you for your help. I add the new state into the selection. Now i don't receive any error message, but the state is still lock into the state 'sent'.

Is it normal?

Thank you,

Edit : My code:

        <record id="trans_draft_int" model="workflow.transition">
        <field name="act_from" ref="act_draft"/>
        <field name="act_to" ref="act_int"/>
        <field name="signal">int_sent</field>
    </record>
    <record id="trans_int_sent" model="workflow.transition">
        <field name="act_from" ref="act_int"/>
        <field name="act_to" ref="act_sent"/>
    </record>  


        <record id="act_int" model="workflow.activity">
        <field name="wkf_id" ref="wkf_sale"/>
        <field name="name">int</field>
        <field name="kind">function</field>
        <field name="action">write({'state':'int'})</field>
    </record>  

    def print_BAT(self, cr, uid, ids, context=None):
    '''
    This function prints the sales order and mark it as sent, so that we can see more easily the next step of the workflow
    '''
    for o in self.browse(cr, uid, ids):
        if not o.devis_accept_by_client:
            raise osv.except_osv(_('Error!'),_('The client needs to accept the quotation first'))
    assert len(ids) == 1, 'This option should only be used for a single id at a time'
    wf_service = netsvc.LocalService("workflow")
    wf_service.trg_validate(uid, 'sale.order', ids[0], 'int_sent', cr)
    datas = {
             'model': 'sale.order',
             'ids': ids,
             'form': self.read(cr, uid, ids[0], context=context),
    }
    return {'type': 'ir.actions.report.xml', 'report_name': 'sale.BAT', 'datas': datas, 'nodestroy': True}

        'state': fields.selection([
        ('draft', 'Draft Quotation'),
        ('sent', 'Quotation Sent'),
        ('int', 'Bat Sent'),
        ('cancel', 'Cancelled'),
        ('waiting_date', 'Waiting Schedule'),
        ('progress', 'Sales Order'),
        ('manual', 'Sale to Invoice'),
        ('invoice_except', 'Invoice Exception'),
        ('done', 'Done'),
        ], 'Status', readonly=True, track_visibility='onchange',

Selverine

I've edited my answer.

As mentioned before: You need two transitions: One to enter the state, and one to leave it. The latter one is missing in your code.

Hope that helps.

René Schuster
on 12/19/13, 7:00 AM

Dear René, Thank again for your help. I edit my answer in order to give you more information. It still not works :-(.

Selverine
on 12/19/13, 8:53 AM

The transitions need to be fired.

The signal field of the transition defines which action will start the transition.

You can either use the localservice in a python function to call the transition signal, or use a button in the view.

From what I can see the Int-Sent-Transition does not have any signal, so this state can't be left without changing the state directly.

René Schuster
on 12/19/13, 9:09 AM

Your Answer

Please try to give a substantial answer. If you wanted to comment on the question or answer, just use the commenting tool. Please remember that you can always revise your answers - no need to answer the same question twice. Also, please don't forget to vote - it really helps to select the best questions and answers!

About This Community

This community is for professionals and enthusiasts of our products and services. Read Guidelines

Question tools

0 follower(s)

Stats

Asked: 12/13/13, 6:53 AM
Seen: 965 times
Last updated: 3/16/15, 8:10 AM