67
67
return tuple(list_key)
69
# compute what the new orders should contain
73
for porder in [order for order in self.browse(cr, uid, ids, context=context) if order.state == 'draft']:
74
order_key = make_key(porder, ('partner_id', 'user_id', 'type', 'account_id', 'currency_id', 'journal_id', 'company_id'))
75
new_order = new_orders.setdefault(order_key, ({}, []))
76
new_order[1].append(porder.id)
77
order_infos = new_order[0]
80
'origin': '%s' % (porder.origin or '',),
81
'partner_id': porder.partner_id.id,
82
'journal_id': porder.journal_id.id,
83
'user_id': porder.user_id.id,
84
'currency_id': porder.currency_id.id,
85
'company_id': porder.company_id.id,
87
'account_id': porder.account_id.id,
69
# compute what the new invoices should contain
73
for account_invoice in [invoice for invoice in self.browse(cr, uid, ids, context=context) if invoice.state == 'draft']:
74
invoice_key = make_key(account_invoice, ('partner_id', 'user_id', 'type', 'account_id', 'currency_id', 'journal_id', 'company_id'))
75
new_invoice = new_invoices.setdefault(invoice_key, ({}, []))
76
new_invoice[1].append(account_invoice.id)
77
invoice_infos = new_invoice[0]
79
invoice_infos.update({
80
'origin': '%s' % (account_invoice.origin or '',),
81
'partner_id': account_invoice.partner_id.id,
82
'journal_id': account_invoice.journal_id.id,
83
'user_id': account_invoice.user_id.id,
84
'currency_id': account_invoice.currency_id.id,
85
'company_id': account_invoice.company_id.id,
86
'type': account_invoice.type,
87
'account_id': account_invoice.account_id.id,
89
89
'invoice_line': {},
90
'reference': '%s' % (porder.reference or '',),
91
'name': '%s' % (porder.name or '',),
92
'fiscal_position': porder.fiscal_position and porder.fiscal_position.id or False,
93
'period_id': porder.period_id and porder.period_id.id or False,
90
'reference': '%s' % (account_invoice.reference or '',),
91
'name': '%s' % (account_invoice.name or '',),
92
'fiscal_position': account_invoice.fiscal_position and account_invoice.fiscal_position.id or False,
93
'period_id': account_invoice.period_id and account_invoice.period_id.id or False,
97
order_infos['name'] = (order_infos['name'] or '') + (' %s' % (porder.name,))
99
order_infos['origin'] = (order_infos['origin'] or '') + ' ' + porder.origin
101
order_infos['reference'] = (order_infos['reference'] or '') + (' %s' % (porder.reference,))
96
if account_invoice.name:
97
invoice_infos['name'] = (invoice_infos['name'] or '') + (' %s' % (account_invoice.name,))
98
if account_invoice.origin:
99
invoice_infos['origin'] = (invoice_infos['origin'] or '') + ' ' + account_invoice.origin
100
if account_invoice.reference:
101
invoice_infos['reference'] = (invoice_infos['reference'] or '') + (' %s' % (account_invoice.reference,))
103
for order_line in porder.invoice_line:
104
line_key = make_key(order_line, ('name', 'origin', 'discount', 'invoice_line_tax_id', 'price_unit', 'product_id', 'account_id', 'account_analytic_id'))
105
o_line = order_infos['invoice_line'].setdefault(line_key, {})
103
for invoice_line in account_invoice.invoice_line:
104
line_key = make_key(invoice_line, ('name', 'origin', 'discount', 'invoice_line_tax_id', 'price_unit', 'product_id', 'account_id', 'account_analytic_id'))
105
o_line = invoice_infos['invoice_line'].setdefault(line_key, {})
107
107
# merge the line with an existing line
108
o_line['quantity'] += order_line.quantity * order_line.uos_id.factor / o_line['uom_factor']
108
o_line['quantity'] += invoice_line.quantity * invoice_line.uos_id.factor / o_line['uom_factor']
110
110
# append a new "standalone" line
111
111
for field in ('quantity', 'uos_id'):
112
field_val = getattr(order_line, field)
112
field_val = getattr(invoice_line, field)
113
113
if isinstance(field_val, browse_record):
114
114
field_val = field_val.id
115
115
o_line[field] = field_val
116
o_line['uom_factor'] = order_line.uos_id and order_line.uos_id.factor or 1.0
116
o_line['uom_factor'] = invoice_line.uos_id and invoice_line.uos_id.factor or 1.0
120
for order_key, (order_data, old_ids) in new_orders.iteritems():
121
# skip merges with only one order
120
for invoice_key, (invoice_data, old_ids) in new_invoices.iteritems():
121
# skip merges with only one invoice
122
122
if len(old_ids) < 2:
123
allorders += (old_ids or [])
123
allinvoices += (old_ids or [])
126
# cleanup order line data
127
for key, value in order_data['invoice_line'].iteritems():
126
# cleanup invoice line data
127
for key, value in invoice_data['invoice_line'].iteritems():
128
128
del value['uom_factor']
129
129
value.update(dict(key))
130
order_data['invoice_line'] = [(0, 0, value) for value in order_data['invoice_line'].itervalues()]
132
# create the new order
133
neworder_id = self.create(cr, uid, order_data)
134
orders_info.update({neworder_id: old_ids})
135
allorders.append(neworder_id)
137
# make triggers pointing to the old orders point to the new order
130
invoice_data['invoice_line'] = [(0, 0, value) for value in invoice_data['invoice_line'].itervalues()]
132
# create the new invoice
133
newinvoice_id = self.create(cr, uid, invoice_data)
134
invoices_info.update({newinvoice_id: old_ids})
135
allinvoices.append(newinvoice_id)
137
# make triggers pointing to the old invoices point to the new invoice
138
138
for old_id in old_ids:
139
wf_service.trg_redirect(uid, 'account.invoice', old_id, neworder_id, cr)
139
wf_service.trg_redirect(uid, 'account.invoice', old_id, newinvoice_id, cr)
140
140
wf_service.trg_validate(uid, 'account.invoice', old_id, 'invoice_cancel', cr)
142
142
# make link between original sale order or purchase order
143
143
so_obj = self.pool.get('sale.order')
144
144
po_obj = self.pool.get('purchase.order')
145
for new_order in orders_info:
146
todo_ids = so_obj.search(cr, uid, [('invoice_ids', 'in', orders_info[new_order])], context=context)
145
for new_invoice in invoices_info:
146
todo_ids = so_obj.search(cr, uid, [('invoice_ids', 'in', invoices_info[new_invoice])], context=context)
147
147
for org_order in so_obj.browse(cr, uid, todo_ids, context=context):
148
so_obj.write(cr, uid, [org_order.id], {'invoice_ids': [(4, new_order)]}, context)
149
todo_ids = po_obj.search(cr, uid, [('invoice_ids', 'in', orders_info[new_order])], context=context)
148
so_obj.write(cr, uid, [org_order.id], {'invoice_ids': [(4, new_invoice)]}, context)
149
todo_ids = po_obj.search(cr, uid, [('invoice_ids', 'in', invoices_info[new_invoice])], context=context)
150
150
for org_order in po_obj.browse(cr, uid, todo_ids, context=context):
151
po_obj.write(cr, uid, [org_order.id], {'invoice_ids': [(4, new_order)]}, context)
151
po_obj.write(cr, uid, [org_order.id], {'invoice_ids': [(4, new_invoice)]}, context)
152
# print invoices_info
155
155
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: