diff --git a/addons/mrp_repair/mrp_repair.py b/addons/mrp_repair/mrp_repair.py index 4409374d42f..033bbd8a4d9 100644 --- a/addons/mrp_repair/mrp_repair.py +++ b/addons/mrp_repair/mrp_repair.py @@ -125,9 +125,46 @@ class mrp_repair(osv.osv): self.write(cr, uid, [o.id], {'state': 'confirmed'}) elif (o.invoice_method == 'b4repair'): self.write(cr, uid, [o.id], {'state': '2binvoiced'}) + elif (o.invoice_method == 'after_repair'): + self.write(cr, uid, [o.id], {'state': 'confirmed'}) + self.pool.get('mrp.repair.lines').write(cr, uid, ids, {'state':'confirmed'}) return True + + def action_invoice_create(self, cr, uid, ids, grouped=False, states=['confirmed','done']): + res = False + invoices = {} + invoice_ids = [] - def action_confirm(self, cr, uid, ids, *args): + for o in self.browse(cr,uid,ids): + lines = [] + for line in o.operations: + if (line.state in states) and not line.invoiced: + lines.append(line.id) +# created_lines = self.pool.get('sale.order.line').invoice_line_create(cr, uid, lines) +# if created_lines: +# invoices.setdefault(o.partner_id.id, []).append((o, created_lines)) + + picking_obj=self.pool.get('stock.picking') + for val in invoices.values(): + if grouped: + res = self._make_invoice(cr, uid, val[0][0], reduce(lambda x,y: x + y, [l for o,l in val], [])) + for o,l in val: + self.write(cr, uid, [o.id], {'state' : 'progress'}) + if o.order_policy=='picking': + picking_obj.write(cr,uid,map(lambda x:x.id,o.picking_ids),{'invoice_state':'invoiced'}) + cr.execute('insert into sale_order_invoice_rel (order_id,invoice_id) values (%d,%d)', (o.id, res)) + else: + for order, il in val: + res = self._make_invoice(cr, uid, order, il) + invoice_ids.append(res) + self.write(cr, uid, [order.id], {'state' : 'progress'}) + if order.order_policy=='picking': + picking_obj.write(cr,uid,map(lambda x:x.id,order.picking_ids),{'invoice_state':'invoiced'}) + cr.execute('insert into sale_order_invoice_rel (order_id,invoice_id) values (%d,%d)', (order.id, res)) + return res + + + def action_ship_create(self, cr, uid, ids, *args): picking_id=False company = self.pool.get('res.users').browse(cr, uid, uid).company_id for repair in self.browse(cr, uid, ids, context={}): @@ -182,7 +219,7 @@ class mrp_repair(osv.osv): }) wf_service = netsvc.LocalService("workflow") wf_service.trg_validate(uid, 'mrp.procurement', proc_id, 'button_confirm', cr) - + self.pool.get('mrp.repair.lines').write(cr, uid, [line.id], {'procurement_id': proc_id}) elif line.product_id and line.product_id.product_tmpl_id.type=='service': proc_id = self.pool.get('mrp.procurement').create(cr, uid, { 'name': line.name or 'Repair', @@ -196,7 +233,7 @@ class mrp_repair(osv.osv): }) wf_service = netsvc.LocalService("workflow") wf_service.trg_validate(uid, 'mrp.procurement', proc_id, 'button_confirm', cr) - + self.pool.get('mrp.repair.lines').write(cr, uid, [line.id], {'procurement_id': proc_id}) else: # # No procurement because no product in the sale.order.line. @@ -208,6 +245,54 @@ class mrp_repair(osv.osv): wf_service = netsvc.LocalService("workflow") wf_service.trg_validate(uid, 'stock.picking', picking_id, 'button_confirm', cr) self.write(cr, uid, [repair.id], val) + + return True + + def procurement_lines_get(self, cr, uid, ids, *args): + res = [] + for order in self.browse(cr, uid, ids, context={}): + for line in order.operations: + if line.procurement_id: + res.append(line.procurement_id.id) + return res + + def test_state(self, cr, uid, ids, mode, *args): + assert mode in ('finished', 'canceled'), _("invalid mode for test_state") + finished = True + canceled = False + write_done_ids = [] + write_cancel_ids = [] + for order in self.browse(cr, uid, ids, context={}): + for line in order.operations: + if line.procurement_id and (line.procurement_id.state != 'done') and (line.state!='done'): + finished = False + if line.procurement_id and line.procurement_id.state == 'cancel': + canceled = True + # if a line is finished (ie its procuremnt is done or it has not procuremernt and it + # is not already marked as done, mark it as being so... + if ((not line.procurement_id) or line.procurement_id.state == 'done') and line.state != 'done': + write_done_ids.append(line.id) + # ... same for canceled lines + if line.procurement_id and line.procurement_id.state == 'cancel' and line.state != 'cancel': + write_cancel_ids.append(line.id) + if write_done_ids: + self.pool.get('mrp.repair.lines').write(cr, uid, write_done_ids, {'state': 'done'}) + if write_cancel_ids: + self.pool.get('mrp.repair.liness').write(cr, uid, write_cancel_ids, {'state': 'cancel'}) + + if mode=='finished': + return finished + elif mode=='canceled': + return canceled + + def action_ship_end(self, cr, uid, ids, context={}): + for order in self.browse(cr, uid, ids): + val = {} + if (order.invoice_method=='after_repair'): + val['state'] = '2binvoiced' + else: + val['state'] = 'confirmed' + self.write(cr, uid, [order.id], val) return True mrp_repair() diff --git a/addons/mrp_repair/mrp_repair_workflow.xml b/addons/mrp_repair/mrp_repair_workflow.xml index 899f0bee1f4..fb272a6797d 100644 --- a/addons/mrp_repair/mrp_repair_workflow.xml +++ b/addons/mrp_repair/mrp_repair_workflow.xml @@ -20,103 +20,229 @@ action_wait() OR - + - True - draft - OR + wait_invoice - + - confirmed - function - action_confirm() -write({'state':'confirmed'}) - - - - - 2binvoiced - function - write({'state':'2binvoiced'}) + wait_ship done + True function write({'state':'done'}) + AND - - - - done - function - write({'state':'done'}) - - cancel - write({'state':'cancel'}) True stopall + action_cancel() + + + + cancel2 + True + stopall + action_cancel() + + + + cancel3 + True + stopall + action_cancel() + + + + + invoice + subflow + + action_invoice_create() + + + + invoice_except + function + action_invoice_cancel() + + + + invoice_end + dummy + + + + invoice_cancel + True + stopall + action_cancel() + + + + + ship + function + action_ship_create() + + + + + ship_except + function + write({'state':'shipping_except'}) + + + + ship_end + function + action_ship_end() + + + + ship_cancel + True + stopall + action_cancel() + + + + + repair_confirm - - - - (invoice_method=='none') - - - - - - (invoice_method=='b4repair') - - - - - - (invoice_method=='after_repair') - - cancel - - - - repair_done + + + + all_lines - - - + + + + True + + + + + + + + + + + + + + + cancel - - - - make_invoice + + + + cancel - - - - cancel + + + + (invoice_method=='after_repair' or invoice_method=='none') + + + + + + (invoice_method=='b4repair') + + + + + + manual_invoice + + + + + + subflow.paid + + + + + subflow.cancel + + + + + invoice_recreate + + + + + invoice_corrected + + + + + invoice_cancel + + + + + + + + + + mrp.procurement + procurement_lines_get() + test_state('finished') + + + + + + test_state('canceled') + + + + + ship_recreate + + + + + ship_corrected + + + + + ship_cancel