This question has been flagged
2 Replies
3829 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

Avatar
Discard
Best Answer

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.

Avatar
Discard
Author Best Answer

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

Avatar
Discard

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.

Author

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

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.