~technofluid-team/openobject-addons/technofluid_multiple_installations

« back to all changes in this revision

Viewing changes to purchase/wizard/wizard_group.py

  • Committer: pinky
  • Date: 2006-12-07 13:41:40 UTC
  • Revision ID: pinky-dedd7f8a42bd4557112a0513082691b8590ad6cc
New trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
##############################################################################
 
2
#
 
3
# Copyright (c) 2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
 
4
#
 
5
# $Id$
 
6
#
 
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
 
12
# Service Company
 
13
#
 
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.
 
18
#
 
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.
 
23
#
 
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.
 
27
#
 
28
##############################################################################
 
29
 
 
30
import time
 
31
 
 
32
import wizard
 
33
import netsvc
 
34
import pooler
 
35
from osv.orm import browse_record
 
36
 
 
37
merge_form = """<?xml version="1.0"?>
 
38
<form string="Merge orders">
 
39
        <separator string="Are you sure you want to merge these orders ?"/>
 
40
        <newline/>
 
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."/>
 
42
</form>
 
43
"""
 
44
 
 
45
merge_fields = {
 
46
}
 
47
 
 
48
ack_form = """<?xml version="1.0"?>
 
49
<form string="Merge orders">
 
50
        <separator string="Orders merged"/>
 
51
</form>"""
 
52
 
 
53
ack_fields = {}
 
54
 
 
55
def _mergeOrders(self, cr, uid, data, context):
 
56
        order_obj = pooler.get_pool(cr.dbname).get('purchase.order')
 
57
 
 
58
        def make_key(br, fields):
 
59
                list_key = []
 
60
                for field in 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))
 
67
                list_key.sort()
 
68
                return tuple(list_key)
 
69
                
 
70
        # compute what the new orders should contain
 
71
        new_orders = {}
 
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]
 
77
                if not order_infos:
 
78
                        order_infos.update({
 
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,
 
88
                                'state': 'draft',
 
89
                                'order_line': {},
 
90
                                'notes': '%s' % (porder.notes,),
 
91
                        })
 
92
                else:
 
93
                        #order_infos['name'] += ', %s' % porder.name
 
94
                        order_infos['notes'] += ('\n%s' % (porder.notes,))
 
95
 
 
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, {})
 
99
                        if o_line:
 
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']
 
102
                        else:
 
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
 
110
 
 
111
        wf_service = netsvc.LocalService("workflow")
 
112
 
 
113
        allorders = []
 
114
        for order_key, (order_data, old_ids) in new_orders.iteritems():
 
115
                # skip merges with only one order
 
116
                if len(old_ids) < 2:
 
117
                        allorders += (old_ids or [])
 
118
                        continue
 
119
 
 
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()]
 
125
                
 
126
                # create the new order
 
127
                neworder_id = order_obj.create(cr, uid, order_data)
 
128
                allorders.append(neworder_id)
 
129
 
 
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)
 
134
 
 
135
        return {
 
136
                'domain': "[('id','in', ["+','.join(map(str,allorders))+"])]",
 
137
                'name': 'Purchase Orders',
 
138
                'view_type': 'form',
 
139
                'view_mode': 'tree,form',
 
140
                'res_model': 'purchase.order',
 
141
                'view_id': False,
 
142
                'type': 'ir.actions.act_window'
 
143
        }
 
144
 
 
145
class merge_orders(wizard.interface):
 
146
        states = {
 
147
                'init' : {
 
148
                        'actions' : [],
 
149
                        'result' : {'type' : 'form', 'arch' : merge_form, 'fields' : merge_fields, 'state' : [('end', 'Cancel'),('merge', 'Merge orders') ]}
 
150
                },
 
151
                'merge' : {
 
152
                        'actions' : [],
 
153
                        'result' : {'type':'action', 'action':_mergeOrders, 'state':'end'}
 
154
                },
 
155
        }
 
156
merge_orders("purchase.order.merge")