1
##############################################################################
3
# Copyright (c) 2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
7
# WARNING: This program as such is intended to be used by professional
8
# programmers who take the whole responsability of assessing all potential
9
# consequences resulting from its eventual inadequacies and bugs
10
# End users who are looking for a ready-to-use solution with commercial
11
# garantees and support are strongly adviced to contract a Free Software
14
# This program is Free Software; you can redistribute it and/or
15
# modify it under the terms of the GNU General Public License
16
# as published by the Free Software Foundation; either version 2
17
# of the License, or (at your option) any later version.
19
# This program is distributed in the hope that it will be useful,
20
# but WITHOUT ANY WARRANTY; without even the implied warranty of
21
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
# GNU General Public License for more details.
24
# You should have received a copy of the GNU General Public License
25
# along with this program; if not, write to the Free Software
26
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28
##############################################################################
35
from osv.orm import browse_record
37
merge_form = """<?xml version="1.0"?>
38
<form string="Merge orders">
39
<separator string="Are you sure you want to merge these orders ?"/>
41
<label string="Please note that orders will only be merged if they are to the same partner and going to the same location, and lines will only be merged if they are exactly the same except for the quantity and unit."/>
48
ack_form = """<?xml version="1.0"?>
49
<form string="Merge orders">
50
<separator string="Orders merged"/>
55
def _mergeOrders(self, cr, uid, data, context):
56
order_obj = pooler.get_pool(cr.dbname).get('purchase.order')
58
def make_key(br, fields):
61
field_val = getattr(br, field)
62
if isinstance(field_val, browse_record):
63
field_val = field_val.id
64
elif isinstance(field_val, list):
65
field_val = ((6, 0, tuple([v.id for v in field_val])),)
66
list_key.append((field, field_val))
68
return tuple(list_key)
70
# compute what the new orders should contain
72
for porder in [order for order in order_obj.browse(cr, uid, data['ids']) if order.state == 'draft']:
73
order_key = make_key(porder, ('partner_id', 'location_id'))
74
new_order = new_orders.setdefault(order_key, ({}, []))
75
new_order[1].append(porder.id)
76
order_infos = new_order[0]
79
'origin': porder.origin,
80
'date_order': time.strftime('%Y-%m-%d'),
81
'partner_id': porder.partner_id.id,
82
'partner_address_id': porder.partner_address_id.id,
83
'dest_address_id': porder.dest_address_id.id,
84
'warehouse_id': porder.warehouse_id.id,
85
'location_id': porder.location_id.id,
86
'project_id': porder.project_id.id,
87
'pricelist_id': porder.pricelist_id.id,
90
'notes': '%s' % (porder.notes,),
93
#order_infos['name'] += ', %s' % porder.name
94
order_infos['notes'] += ('\n%s' % (porder.notes,))
96
for order_line in porder.order_line:
97
line_key = make_key(order_line, ('name', 'date_planned', 'taxes_id', 'price_unit', 'notes', 'product_id', 'move_dest_id'))
98
o_line = order_infos['order_line'].setdefault(line_key, {})
100
# merge the line with an existing line
101
o_line['product_qty'] += order_line.product_qty * order_line.product_uom.factor / o_line['uom_factor']
103
# append a new "standalone" line
104
for field in ('product_qty', 'product_uom'):
105
field_val = getattr(order_line, field)
106
if isinstance(field_val, browse_record):
107
field_val = field_val.id
108
o_line[field] = field_val
109
o_line['uom_factor'] = order_line.product_uom and order_line.product_uom.factor or 1.0
111
wf_service = netsvc.LocalService("workflow")
114
for order_key, (order_data, old_ids) in new_orders.iteritems():
115
# skip merges with only one order
117
allorders += (old_ids or [])
120
# cleanup order line data
121
for key, value in order_data['order_line'].iteritems():
122
del value['uom_factor']
123
value.update(dict(key))
124
order_data['order_line'] = [(0, 0, value) for value in order_data['order_line'].itervalues()]
126
# create the new order
127
neworder_id = order_obj.create(cr, uid, order_data)
128
allorders.append(neworder_id)
130
# make triggers pointing to the old orders point to the new order
131
for old_id in old_ids:
132
wf_service.trg_redirect(uid, 'purchase.order', old_id, neworder_id, cr)
133
wf_service.trg_validate(uid, 'purchase.order', old_id, 'purchase_cancel', cr)
136
'domain': "[('id','in', ["+','.join(map(str,allorders))+"])]",
137
'name': 'Purchase Orders',
139
'view_mode': 'tree,form',
140
'res_model': 'purchase.order',
142
'type': 'ir.actions.act_window'
145
class merge_orders(wizard.interface):
149
'result' : {'type' : 'form', 'arch' : merge_form, 'fields' : merge_fields, 'state' : [('end', 'Cancel'),('merge', 'Merge orders') ]}
153
'result' : {'type':'action', 'action':_mergeOrders, 'state':'end'}
156
merge_orders("purchase.order.merge")