~unifield-team/unifield-wm/us-826

« back to all changes in this revision

Viewing changes to partner_modification/partner_modification.py

  • Committer: jf
  • Date: 2011-03-23 13:23:55 UTC
  • Revision ID: jf@tempo4-20110323132355-agyf1soy7m5ewatr
Initial Import

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# -*- coding: utf-8 -*-
2
 
##############################################################################
3
 
#
4
 
#    Copyright (C) 2011 MSF, TeMPO Consulting
5
 
#
6
 
#    This program is free software: you can redistribute it and/or modify
7
 
#    it under the terms of the GNU Affero General Public License as
8
 
#    published by the Free Software Foundation, either version 3 of the
9
 
#    License, or (at your option) any later version.
10
 
#
11
 
#    This program is distributed in the hope that it will be useful,
12
 
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 
#    GNU Affero General Public License for more details.
15
 
#
16
 
#    You should have received a copy of the GNU Affero General Public License
17
 
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
 
#
19
 
##############################################################################
20
 
 
21
 
from datetime import datetime, timedelta, date
22
 
from dateutil.relativedelta import relativedelta, relativedelta
23
 
from osv import osv, fields
24
 
from osv.orm import browse_record, browse_null
25
 
from tools.translate import _
26
 
 
27
 
import decimal_precision as dp
28
 
import netsvc
29
 
import pooler
30
 
import time
31
 
 
32
 
from msf_order_date import TRANSPORT_TYPE
33
 
from msf_order_date import ZONE_SELECTION
34
 
 
35
 
NUMBER_OF_CHOICE = 3
36
 
 
37
 
class product_template(osv.osv):
38
 
    _inherit = 'product.template'
39
 
 
40
 
    def _get_delay_for_supplier(self, cr, uid, ids, fields, arg, context=None):
41
 
        if not context:
42
 
            context = {}
43
 
        ret = {}
44
 
        if 'delay_supplier_id' not in context:
45
 
            for id in ids:
46
 
                ret[id] = False
47
 
            return ret
48
 
    
49
 
        partner_obj = self.pool.get('res.partner')
50
 
        for prod in self.browse(cr, uid, ids):
51
 
            ret[prod.id] = False
52
 
            for seller in prod.seller_ids:
53
 
                if context['delay_supplier_id'] == seller.name.id:
54
 
                    ret[prod.id] = seller.delay
55
 
                    break
56
 
            if not ret[prod.id]:
57
 
                ret[prod.id] = int(partner_obj.read(cr, uid, context['delay_supplier_id'], ['default_delay'])['default_delay'])
58
 
        return ret
59
 
 
60
 
    
61
 
    _columns = {
62
 
        'delay_for_supplier': fields.function(_get_delay_for_supplier, type='integer', string='Default delay for a supplier', method=True) 
63
 
    }
64
 
    
65
 
product_template()
66
 
 
67
 
 
68
 
class res_partner(osv.osv):
69
 
    _description='Partner'
70
 
    _inherit = "res.partner"
71
 
    
72
 
    def _calc_dellay(self, cr, uid, ids, fields, arg, context=None):
73
 
        result = {}
74
 
        for partner in self.browse(cr, uid, ids, context=context):
75
 
            result[partner.id] = {}
76
 
            for field in fields:
77
 
                result[partner.id].update({field:0})
78
 
                
79
 
            # get the default transport, the smallest sequence
80
 
            value_list = self.read(cr, uid, [partner.id], ['transport_0', 'transport_0_lt',], context=context)
81
 
            if not value_list:
82
 
                continue
83
 
            
84
 
            # it's a list, get the first element
85
 
            value = value_list[0]
86
 
            # preferred transport values
87
 
            transport_0 = value['transport_0']
88
 
            transport_0_lt = value['transport_0_lt']
89
 
            # no favorite transport selected, return 0
90
 
            if transport_0 == '':
91
 
                continue
92
 
            # the default transport lead time
93
 
            result[partner.id]['default_delay'] = transport_0_lt + partner.procurement_lt
94
 
            
95
 
        return result
96
 
    
97
 
    def get_transport_lead_time(self, cr, uid, ids, transport_name, context=None):
98
 
        '''
99
 
        for a given transport name (road, air, sea), 
100
 
        '''
101
 
        if not ids:
102
 
            return 0.0
103
 
        if ids and isinstance(ids, (int, long)):
104
 
            ids = [ids]
105
 
        # result values
106
 
        result = {}
107
 
        # get corresponding lt
108
 
        for partner in self.browse(cr, uid, ids, context=context):
109
 
            result[partner.id] = 0
110
 
            if transport_name:
111
 
                for i in range(NUMBER_OF_CHOICE):
112
 
                    if getattr(partner, 'transport_%s'%i) == transport_name:
113
 
                        val = getattr(partner, 'transport_%s_lt'%i)
114
 
                        result[partner.id] = val
115
 
                    
116
 
        return result
117
 
    
118
 
    def on_change_lead_time(self, cr, uid, ids, transport_0_lt, procurement_lt, context=None):
119
 
        '''
120
 
        change supplier_lt and customer_lt according to preferred lead time and internal lead time
121
 
        '''
122
 
        return {'value': {'supplier_lt': transport_0_lt + procurement_lt,
123
 
                          'customer_lt': transport_0_lt + procurement_lt}}
124
 
    
125
 
    _columns = {'zone': fields.selection(selection=ZONE_SELECTION, string='Zone', required=True),
126
 
                'customer_lt': fields.integer('Customer Lead Time'),
127
 
                'supplier_lt': fields.integer('Supplier Lead Time'),
128
 
                'procurement_lt': fields.integer('Internal Lead Time'),
129
 
                'transport_0_lt': fields.integer('1st Transport Lead Time'),
130
 
                'transport_0': fields.selection(selection=TRANSPORT_TYPE, string='1st (favorite) Mode of Transport',),
131
 
                'transport_1_lt': fields.integer('2nd Transport Lead Time'),
132
 
                'transport_1': fields.selection(selection=TRANSPORT_TYPE, string='2nd Mode of Transport'),
133
 
                'transport_2_lt': fields.integer('3rd Transport Lead Time'),
134
 
                'transport_2': fields.selection(selection=TRANSPORT_TYPE, string='3nd Mode of Transport'),
135
 
                'default_delay': fields.function(_calc_dellay, method=True, type='integer', string='Supplier Lead Time (computed)', multi="seller_delay"),
136
 
                'po_by_project': fields.selection([
137
 
                                            ('all', 'All requirements'), 
138
 
                                            ('project', 'Requirements by Project'),
139
 
                                            ('category', 'Requirements by Category'),
140
 
                                            ('category_project', 'Requirements by Category and Project'),
141
 
                                            ('isolated', 'Requirements by Order')], 
142
 
                                            string='Order creation mode',
143
 
                                              help='''When option “All requirements” is set for 
144
 
                                            a given supplier, the system will create a PO that merge all requirements
145
 
                                            for this supplier. 
146
 
                                            If option “Requirements by Project” is set, the POs will
147
 
                                            be created by original requestor (customer of the SO origin), meaning
148
 
                                            system creates one PO by project for this supplier.
149
 
                                            If option "Requirements by Category" is set, the system will create a PO
150
 
                                            that merge all requirements by category for this supplier.
151
 
                                            If option "Requirements by Category and Project" is set, the system
152
 
                                            will create a PO that merge only the requirements of one customer
153
 
                                            and one category.
154
 
                                            If option "Requirements by Order" is set, the system will create a PO
155
 
                                            that merge lines coming from the same FO/IR.'''),
156
 
                }
157
 
    
158
 
    _defaults = {'zone': 'national',
159
 
                 'customer_lt': 0,
160
 
                 'supplier_lt': 0,
161
 
                 'procurement_lt': 0,
162
 
                 'transport_0': TRANSPORT_TYPE[0][0], # empty
163
 
                 'transport_0_lt': 0,
164
 
                 'transport_1': TRANSPORT_TYPE[0][0], # empty
165
 
                 'transport_1_lt': 0,
166
 
                 'transport_2': TRANSPORT_TYPE[0][0], # empty
167
 
                 'transport_2_lt': 0,
168
 
                 'po_by_project': lambda *a: 'all',
169
 
                 }
170
 
 
171
 
res_partner()
172
 
 
173
 
 
174
 
class purchase_order_line(osv.osv):
175
 
    '''
176
 
    this modify the onchange function for product, set the date_planned value
177
 
    '''
178
 
    _inherit = 'purchase.order.line'
179
 
    
180
 
    def product_id_change(self, cr, uid, ids, pricelist, product, qty, uom,
181
 
            partner_id, date_order=False, fiscal_position=False, date_planned=False,
182
 
            name=False, price_unit=False, notes=False):
183
 
        
184
 
        res = super(purchase_order_line, self).product_id_change(cr, uid, ids, pricelist, product, qty, uom,
185
 
                                                           partner_id, date_order, fiscal_position, date_planned,
186
 
                                                           name, price_unit, notes)
187
 
        
188
 
        if product:
189
 
            # product obj
190
 
            product_obj = self.pool.get('product.product')
191
 
            # product
192
 
            product = product_obj.browse(cr, uid, product)
193
 
            
194
 
            lt_date = (datetime.now() + relativedelta(days=int(product.seller_delay))).strftime('%Y-%m-%d')
195
 
            res.update(date_planned=lt_date)
196
 
        
197
 
        return res
198
 
    
199
 
purchase_order_line()
200
 
 
201
 
 
202
 
class product_supplierinfo(osv.osv):
203
 
    _name = 'product.supplierinfo'
204
 
    _inherit = 'product.supplierinfo'
205
 
 
206
 
    def onchange_supplier_id(self, cr, uid, ids, name):
207
 
        '''
208
 
        set the default delay value
209
 
        '''
210
 
        if name:
211
 
            # supplier object
212
 
            partner_obj = self.pool.get('res.partner')
213
 
            # partner
214
 
            partner = partner_obj.browse(cr, uid, name)
215
 
            
216
 
            return {'value': {'delay': partner.default_delay}}
217
 
        else:
218
 
            return {'value': {'delay': False}}
219
 
        
220
 
product_supplierinfo()
221