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

« back to all changes in this revision

Viewing changes to msf_order_date/order_dates.py

  • Committer: jf
  • Date: 2014-03-14 16:56:51 UTC
  • mfrom: (2004.1.38 unifield-wm)
  • Revision ID: jfb@tempo-consulting.fr-20140314165651-kxeadsxm2nw4srwf
REF-37 [IMP] Improve performance on sourcing 'from stock'
lp:~qt-tempo-consulting/unifield-wm/ref_wm_qt @2042

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
##############################################################################
3
3
#
4
4
#    OpenERP, Open Source Management Solution
5
 
#    Copyright (C) 2011 TeMPO Consulting, MSF 
 
5
#    Copyright (C) 2011 TeMPO Consulting, MSF
6
6
#
7
7
#    This program is free software: you can redistribute it and/or modify
8
8
#    it under the terms of the GNU Affero General Public License as
37
37
class res_partner(osv.osv):
38
38
    _name = 'res.partner'
39
39
    _inherit = 'res.partner'
40
 
    
 
40
 
41
41
    _columns = {
42
42
        'leadtime': fields.integer(string='Lead Time'),
43
43
    }
44
 
    
 
44
 
45
45
    _defaults = {
46
46
        'leadtime': lambda *a: 2,
47
47
    }
48
 
    
 
48
 
49
49
res_partner()
50
50
 
51
51
fields_date = ['date_order', 'delivery_requested_date', 'delivery_confirmed_date',
62
62
        return 'so'
63
63
    if self._name == 'purchase.order':
64
64
        return 'po'
65
 
    
 
65
 
66
66
    return False
67
67
 
68
68
def get_field_description(self, cr, uid, field, context=None):
75
75
    field_ids = field_obj.search(cr, uid, [('model', '=', self._name), ('name', '=', field)])
76
76
    if not field_ids:
77
77
        return field
78
 
    
 
78
 
79
79
    return field_obj.browse(cr, uid, field_ids[0]).field_description
80
80
 
81
81
def check_date_order(self, cr, uid, date=False, context=None):
82
82
    '''
83
83
    Checks if the creation date of the order is in an opened period
84
 
    
 
84
 
85
85
    @param : date : Creation date
86
86
    @return True if the date is in an opened period, False if not
87
 
    
 
87
 
88
88
    deprecated
89
89
    '''
90
90
    if context is None:
91
91
        context = {}
92
92
    if not date:
93
93
        return True
94
 
            
 
94
 
95
95
    if isinstance(date, datetime):
96
96
        date = date.strftime('%Y-%m-%d')
97
 
    
 
97
 
98
98
    res = False
99
 
    
 
99
 
100
100
    period_obj = self.pool.get('account.period')
101
 
    ## TODO: See if the period state changed in financial part of Unifiedl
 
101
    # # TODO: See if the period state changed in financial part of Unifiedl
102
102
    period_ids = period_obj.search(cr, uid, [('state', '=', 'draft')], context=context)
103
103
    for p in period_obj.browse(cr, uid, period_ids, context=context):
104
104
        if date >= p.date_start and date <= p.date_stop:
105
105
            return True
106
 
            
 
106
 
107
107
    return res
108
108
 
109
109
def check_delivery_requested(self, date=False, context=None):
110
110
    '''
111
111
    Checks if the delivery requested date is equal of a date between today and today + 24 months
112
 
    
 
112
 
113
113
    @param: Date to test (Delivery requested date)
114
114
    @return : False if the date is not in the scale
115
 
    
 
115
 
116
116
    deprecated
117
117
    '''
118
118
    if context is None:
121
121
        return True
122
122
 
123
123
    return True
124
 
    
 
124
 
125
125
    if isinstance(date, datetime):
126
126
        date = date.strftime('%Y-%m-%d')
127
 
    
 
127
 
128
128
    res = False
129
129
    two_years = (datetime.now() + relativedelta(years=2)).strftime('%Y-%m-%d')
130
130
    if date >= (datetime.now()).strftime('%Y-%m-%d') and date <= two_years:
131
131
        res = True
132
 
        
 
132
 
133
133
    return res
134
134
 
135
135
def check_delivery_confirmed(self, confirmed_date=False, date_order=False, context=None):
136
136
    '''
137
137
    Checks if the delivery confirmed date is older than the creation date
138
 
    
 
138
 
139
139
    @param: Date to test (Delivery requested date)
140
140
    @return : False if the date is not in the scale
141
 
    
 
141
 
142
142
    deprecated
143
143
    '''
144
144
    if context is None:
147
147
        return True
148
148
 
149
149
    return True
150
 
    
 
150
 
151
151
    if isinstance(confirmed_date, datetime):
152
152
        confirmed_date = confirmed_date.strftime('%Y-%m-%d')
153
 
        
 
153
 
154
154
    if isinstance(date_order, datetime):
155
155
        date_order = date_order.strftime('%Y-%m-%d')
156
 
    
 
156
 
157
157
    res = False
158
158
    if confirmed_date > date_order:
159
159
        res = True
160
 
        
161
 
    return res 
 
160
 
 
161
    return res
162
162
 
163
163
def check_dates(self, cr, uid, data, context=None):
164
164
    '''
165
165
    Runs all tests on dates
166
 
    
 
166
 
167
167
    deprecated
168
168
    '''
169
169
    if context is None:
170
170
        context = {}
171
171
    # Comment this line if you would check date on PO/SO creation/write
172
172
    return True
173
 
    
 
173
 
174
174
    date_order = data.get('date_order', False)
175
175
    requested_date = data.get('delivery_requested_date', False)
176
176
    confirmed_date = data.get('delivery_confirmed_date', False)
184
184
        raise osv.except_osv(_('Error'), _('The Delivery Confirmed Date should be older than the Creation date !'))
185
185
    if not check_delivery_confirmed(self, ready_to_ship, date_order, context=context):
186
186
        raise osv.except_osv(_('Error'), _('The Ready to Ship Date should be older than the Creation date !'))
187
 
    
 
187
 
188
188
    return True
189
189
 
190
190
def common_internal_type_change(self, cr, uid, ids, internal_type, rts, shipment_date, context=None):
191
191
    '''
192
192
    Common function when type of order is changing
193
 
    
 
193
 
194
194
    deprecated
195
195
    '''
196
196
    if context is None:
198
198
    v = {}
199
199
#    if internal_type == 'international' and rts and not shipment_date:
200
200
#        v.update({'shipment_date': rts})
201
 
        
 
201
 
202
202
    return v
203
 
    
 
203
 
204
204
def common_ready_to_ship_change(self, cr, uid, ids, ready_to_ship, date_order, shipment, context=None):
205
205
    '''
206
206
    Common function when ready_to_ship date is changing
207
 
    
 
207
 
208
208
    deprecated
209
209
    '''
210
210
    if context is None:
213
213
    v = {}
214
214
    if not ready_to_ship or not date_order:
215
215
        return {}
216
 
    
 
216
 
217
217
    # Set the message if the user enter a wrong ready to ship date
218
218
#    if not check_delivery_confirmed(self, ready_to_ship, date_order, context=context):
219
219
#        message = {'title': _('Warning'),
223
223
#            v.update({'shipment_date': ready_to_ship})
224
224
    if not shipment:
225
225
        v.update({'shipment_date': ready_to_ship})
226
 
        
 
226
 
227
227
    return {'warning': message, 'value': v}
228
228
 
229
229
def compute_rts(self, cr, uid, requested_date=False, transport_lt=0, type=False, context=None):
246
246
        rts = rts - relativedelta(days=shipment_lt or 0)
247
247
        rts = rts.strftime('%Y-%m-%d')
248
248
        return rts
249
 
    
 
249
 
250
250
    return False
251
251
 
252
252
def compute_requested_date(self, cr, uid, part=False, date_order=False, type=False, context=None):
253
253
    '''
254
254
    compute requested date according to type
255
 
    
 
255
 
256
256
    SPRINT3 validated - yaml test ok
257
257
    '''
258
258
    if context is None:
267
267
            requested_date = requested_date + relativedelta(days=partner.supplier_lt)
268
268
        requested_date = requested_date.strftime('%Y-%m-%d')
269
269
        return requested_date
270
 
    
 
270
 
271
271
    return False
272
272
 
273
273
def compute_transport_type(self, cr, uid, part=False, type=False, context=None):
281
281
        partner_obj = self.pool.get('res.partner')
282
282
        res = partner_obj.read(cr, uid, [part], [field], context=context)[0][field]
283
283
        return res
284
 
        
 
284
 
285
285
    return False
286
286
 
287
287
def compute_internal_type(self, cr, uid, part=False, type=False, context=None):
295
295
        partner_obj = self.pool.get('res.partner')
296
296
        res = partner_obj.read(cr, uid, [part], [field], context=context)[0][field]
297
297
        return res
298
 
        
 
298
 
299
299
    return False
300
300
 
301
301
def compute_partner_type(self, cr, uid, part=False, type=False, context=None):
309
309
        partner_obj = self.pool.get('res.partner')
310
310
        res = partner_obj.read(cr, uid, [part], [field], context=context)[0][field]
311
311
        return res
312
 
        
 
312
 
313
313
    return False
314
314
 
315
315
def common_requested_date_change(self, cr, uid, ids, part=False, date_order=False, requested_date=False, transport_lt=0, type=False, res=None, context=None):
337
337
        # if < supplier_lt, display warning
338
338
        if delta.days < partner.supplier_lt:
339
339
            res.setdefault('warning', {}).update({'title': _('Warning'),
340
 
                                                  'message': _('The number of days between Creation Date and Delivery Expected Date (%s) is less than the supplier lead-time (%s).')%(delta.days,partner.supplier_lt,)})
341
 
            
 
340
                                                  'message': _('The number of days between Creation Date and Delivery Expected Date (%s) is less than the supplier lead-time (%s).') % (delta.days, partner.supplier_lt,)})
 
341
 
342
342
    return res
343
343
 
344
344
def common_onchange_transport_lt(self, cr, uid, ids, requested_date=False, transport_lt=0, type=False, res=None, context=None):
371
371
    # if part, we get a dictionary from get_transport_lead_time
372
372
    if lead_time:
373
373
        lead_time = lead_time.get(part)
374
 
    res.setdefault('value', {}).update({'est_transport_lead_time': lead_time,})
 
374
    res.setdefault('value', {}).update({'est_transport_lead_time': lead_time, })
375
375
    # call onchange_transport_lt and update **VALUE** of res
376
376
    res_transport_lt = self.onchange_transport_lt(cr, uid, ids, requested_date=requested_date, transport_lt=res['value']['est_transport_lead_time'], context=None)
377
377
    res.setdefault('value', {}).update(res_transport_lt.setdefault('value', {}))
380
380
def common_onchange_date_order(self, cr, uid, ids, part=False, date_order=False, transport_lt=0, type=False, res=None, context=None,):
381
381
    '''
382
382
    Common function when the Creation date (order_date) is changed
383
 
    
 
383
 
384
384
    - modify requested date
385
385
    - call on_change_requested_date
386
386
    '''
394
394
    # call onchange_requested_date and update **VALUE** of res
395
395
    res_requested_date = self.onchange_requested_date(cr, uid, ids, part=part, date_order=date_order, requested_date=res['value']['delivery_requested_date'], transport_lt=transport_lt, context=context)
396
396
    res.setdefault('value', {}).update(res_requested_date.setdefault('value', {}))
397
 
    
 
397
 
398
398
    return res
399
399
 
400
400
def common_onchange_partner_id(self, cr, uid, ids, part=False, order_type=False, date_order=False, transport_lt=0, type=False, res=None, context=None):
413
413
    res.setdefault('value', {}).update(res_requested_date.setdefault('value', {}))
414
414
    # compute transport type
415
415
    transport_type = compute_transport_type(self, cr, uid, part=part, type=type, context=context)
416
 
    res.setdefault('value', {}).update({'transport_type': transport_type,})
 
416
    res.setdefault('value', {}).update({'transport_type': transport_type, })
417
417
    # call onchange_transport_type and update **VALUE** of res
418
418
    res_transport_type = self.onchange_transport_type(cr, uid, ids, part=part, transport_type=res['value']['transport_type'], requested_date=res['value']['delivery_requested_date'], context=context)
419
419
    res.setdefault('value', {}).update(res_transport_type.setdefault('value', {}))
420
420
    # reset confirmed date
421
 
    res.setdefault('value', {}).update({'delivery_confirmed_date': False,})
 
421
    res.setdefault('value', {}).update({'delivery_confirmed_date': False, })
422
422
    # compute partner type
423
423
    partner_type = compute_partner_type(self, cr, uid, part=part, type=type, context=context)
424
 
    res.setdefault('value', {}).update({'partner_type': partner_type,})
 
424
    res.setdefault('value', {}).update({'partner_type': partner_type, })
425
425
    # internal type
426
426
    internal_type = compute_internal_type(self, cr, uid, part=part, type=type, context=context)
427
 
    res.setdefault('value', {}).update({'internal_type': internal_type,})
428
 
    
 
427
    res.setdefault('value', {}).update({'internal_type': internal_type, })
 
428
 
429
429
    return res
430
 
    
 
430
 
431
431
def common_dates_change_on_line(self, cr, uid, ids, requested_date, confirmed_date, parent_class, context=None):
432
432
    '''
433
433
    Checks if dates are later than header dates
434
 
    
 
434
 
435
435
    deprecated
436
436
    '''
437
437
    if context is None:
438
438
        context = {}
439
439
    min_confirmed = min_requested = False
440
 
    
 
440
 
441
441
    order_id = context.get('active_id', [])
442
442
    if isinstance(order_id, (int, long)):
443
443
        order_id = [order_id]
444
 
        
 
444
 
445
445
    if order_id:
446
446
        min_confirmed = self.pool.get(parent_class).browse(cr, uid, order_id[0]).delivery_confirmed_date
447
447
        min_requested = self.pool.get(parent_class).browse(cr, uid, order_id[0]).delivery_requested_date
448
 
    
 
448
 
449
449
    for line in self.browse(cr, uid, ids, context=context):
450
450
        min_confirmed = line.order_id.delivery_confirmed_date
451
451
        min_requested = line.order_id.delivery_requested_date
452
 
         
453
 
    return {'value': {'date_planned': requested_date,}}
 
452
 
 
453
    return {'value': {'date_planned': requested_date, }}
454
454
#                      'confirmed_delivery_date': confirmed_date}}
455
455
 
456
456
def common_create(self, cr, uid, data, type, context=None):
464
464
    if data.get('partner_id', False):
465
465
        partner = self.pool.get('res.partner').browse(cr, uid, data.get('partner_id'), context=context)
466
466
        # partner type - always set
467
 
        data.update({'partner_type': partner.partner_type,})
 
467
        data.update({'partner_type': partner.partner_type, })
468
468
        # internal type (zone) - always set
469
 
        data.update({'internal_type': partner.zone,})
 
469
        data.update({'internal_type': partner.zone, })
470
470
        # transport type - only if not present (can be modified by user to False)
471
471
        if 'transport_type' not in data:
472
 
            data.update({'transport_type': partner.transport_0,})
 
472
            data.update({'transport_type': partner.transport_0, })
473
473
        # est_transport_lead_time - only if not present (can be modified by user to False)
474
474
        if 'est_transport_lead_time' not in data:
475
 
            data.update({'est_transport_lead_time': partner.transport_0_lt,})
476
 
        # by default delivery requested date is equal to today + supplier lead time - filled for compatibility because requested date is now mandatory    
 
475
            data.update({'est_transport_lead_time': partner.transport_0_lt, })
 
476
        # by default delivery requested date is equal to today + supplier lead time - filled for compatibility because requested date is now mandatory
477
477
        if not data.get('delivery_requested_date', False):
478
478
            # PO - supplier lead time / SO - customer lead time
479
479
            if type == 'so':
481
481
            if type == 'po':
482
482
                requested_date = (datetime.today() + relativedelta(days=partner.supplier_lt)).strftime('%Y-%m-%d')
483
483
            data['delivery_requested_date'] = requested_date
484
 
        
 
484
 
485
485
    return data
486
 
        
 
486
 
487
487
 
488
488
class purchase_order(osv.osv):
489
489
    _name = 'purchase.order'
490
 
    _inherit= 'purchase.order'
491
 
    
 
490
    _inherit = 'purchase.order'
 
491
 
492
492
    def write(self, cr, uid, ids, data, context=None):
493
493
        '''
494
494
        Checks if dates are good before writing
497
497
            context = {}
498
498
        if isinstance(ids, (int, long)):
499
499
            ids = [ids]
500
 
            
 
500
 
501
501
        if not 'date_order' in data:
502
502
            data.update({'date_order': self.browse(cr, uid, ids[0]).date_order})
503
 
            
 
503
 
504
504
        # fill partner_type and zone
505
505
        if data.get('partner_id', False):
506
506
            partner = self.pool.get('res.partner').browse(cr, uid, data.get('partner_id'), context=context)
507
507
            # partner type - always set
508
 
            data.update({'partner_type': partner.partner_type,})
 
508
            data.update({'partner_type': partner.partner_type, })
509
509
            # internal type (zone) - always set
510
 
            data.update({'internal_type': partner.zone,})
 
510
            data.update({'internal_type': partner.zone, })
511
511
            # erase delivery_confirmed_date if partner_type is internal or section and the date is not filled by synchro - considered updated by synchro by default
512
512
            if partner.partner_type in ('internal', 'section') and not data.get('confirmed_date_by_synchro', True):
513
 
                data.update({'delivery_confirmed_date': False,})
514
 
        
 
513
                data.update({'delivery_confirmed_date': False, })
 
514
 
515
515
        check_dates(self, cr, uid, data, context=context)
516
 
        
 
516
 
517
517
        return super(purchase_order, self).write(cr, uid, ids, data, context=context)
518
 
    
 
518
 
519
519
    def create(self, cr, uid, data, context=None):
520
520
        '''
521
521
        Checks if dates are good before creation
522
 
        
 
522
 
523
523
        Delivery Requested Date: creation date + supplier lead time from partner (supplier_lt)
524
524
        '''
525
525
        if context is None:
531
531
            partner = self.pool.get('res.partner').browse(cr, uid, data.get('partner_id'), context=context)
532
532
            # erase delivery_confirmed_date if partner_type is internal or section and the date is not filled by synchro - considered updated by synchro by default
533
533
            if partner.partner_type in ('internal', 'section') and not data.get('confirmed_date_by_synchro', True):
534
 
                data.update({'delivery_confirmed_date': False,})
 
534
                data.update({'delivery_confirmed_date': False, })
535
535
        # deprecated ?
536
536
        check_dates(self, cr, uid, data, context=context)
537
537
 
538
538
        return super(purchase_order, self).create(cr, uid, data, context=context)
539
 
    
 
539
 
540
540
    def _get_receipt_date(self, cr, uid, ids, field_name, arg, context=None):
541
541
        '''
542
542
        Returns the date of the first picking for the the PO
545
545
            context = {}
546
546
        res = {}
547
547
        pick_obj = self.pool.get('stock.picking')
548
 
        
 
548
 
549
549
        for order in self.browse(cr, uid, ids, context=context):
550
550
            pick_ids = pick_obj.search(cr, uid, [('purchase_id', '=', order.id)], offset=0, limit=1, order='date_done', context=context)
551
551
            if not pick_ids:
554
554
                res[order.id] = pick_obj.browse(cr, uid, pick_ids[0]).date_done
555
555
 
556
556
        return res
557
 
    
 
557
 
558
558
    def _get_vals_order_dates(self, cr, uid, ids, field_name, arg, context=None):
559
559
        '''
560
560
        Return function values
563
563
            context = {}
564
564
        res = {}
565
565
        pick_obj = self.pool.get('stock.picking')
566
 
        
 
566
 
567
567
        if isinstance(field_name, str):
568
 
            field_name = [field_name] 
569
 
        
 
568
            field_name = [field_name]
 
569
 
570
570
        for obj in self.browse(cr, uid, ids, context=context):
571
571
            # default dic
572
572
            res[obj.id] = {}
577
577
            if obj.partner_id:
578
578
                partner_type = obj.partner_id.partner_type
579
579
                res[obj.id]['partner_type'] = partner_type
580
 
            
 
580
 
581
581
        return res
582
 
    
 
582
 
583
583
    _columns = {
584
584
                'delivery_requested_date': fields.date(string='Delivery Requested Date', required=True),
585
585
                'delivery_confirmed_date': fields.date(string='Delivery Confirmed Date'),
586
586
                'ready_to_ship_date': fields.date(string='Ready To Ship Date'),
587
587
                'shipment_date': fields.date(string='Shipment Date', help='Date on which picking is created at supplier'),
588
588
                'arrival_date': fields.date(string='Arrival date in the country', help='Date of the arrival of the goods at custom'),
589
 
                'receipt_date': fields.function(_get_receipt_date, type='date', method=True, store=True, 
 
589
                'receipt_date': fields.function(_get_receipt_date, type='date', method=True, store=True,
590
590
                                                string='Receipt Date', help='for a PO, date of the first godd receipt.'),
591
591
                # BETA - to know if the delivery_confirmed_date can be erased - to be confirmed
592
592
                'confirmed_date_by_synchro': fields.boolean(string='Confirmed Date by Synchro'),
595
595
                'transport_type': fields.selection(selection=TRANSPORT_TYPE, string='Transport Mode',
596
596
                        help='Number of days this field has to be associated with a transport mode selection'),
597
597
                # not a function because can be modified by user - **ONLY IN CREATE only if not in vals**
598
 
                'est_transport_lead_time': fields.float(digits=(16,2), string='Est. Transport Lead Time',
 
598
                'est_transport_lead_time': fields.float(digits=(16, 2), string='Est. Transport Lead Time',
599
599
                        help="Estimated Transport Lead-Time in weeks"),
600
600
                # not a function because a function value is only filled when saved, not with on change of partner id
601
601
                # from partner_id object
604
604
                # from partner_id object
605
605
                'internal_type': fields.selection(string='Type', selection=ZONE_SELECTION, readonly=True,),
606
606
                }
607
 
    
 
607
 
608
608
    _defaults = {
609
609
        'date_order': lambda *a: time.strftime('%Y-%m-%d'),
610
610
        'confirmed_date_by_synchro': False,
611
611
    }
612
 
    
 
612
 
613
613
    def copy(self, cr, uid, id, default=None, context=None):
614
614
        new_id = super(purchase_order, self).copy(cr, uid, id, default, context)
615
615
        if new_id:
636
636
            if ftd in res:
637
637
                del(res[ftd])
638
638
        return res
639
 
    
 
639
 
640
640
    def internal_type_change(self, cr, uid, ids, internal_type, rts, shipment_date, context=None):
641
641
        '''
642
642
        Set the shipment date if the internal_type == international
643
 
        
 
643
 
644
644
        deprecated
645
645
        '''
646
646
        if context is None:
647
647
            context = {}
648
648
        return {}
649
649
        return {'value': common_internal_type_change(self, cr, uid, ids, internal_type, rts, shipment_date, context=context)}
650
 
        
 
650
 
651
651
    def ready_to_ship_change(self, cr, uid, ids, ready_to_ship, date_order, shipment, context=None):
652
652
        '''
653
653
        Checks the entered value
654
 
        
 
654
 
655
655
        deprecated
656
656
        '''
657
657
        if context is None:
658
658
            context = {}
659
659
        return {}
660
660
        return common_ready_to_ship_change(self, cr, uid, ids, ready_to_ship, date_order, shipment, context=context)
661
 
    
 
661
 
662
662
    def onchange_requested_date(self, cr, uid, ids, part=False, date_order=False, requested_date=False, transport_lt=0, order_type=False, context=None):
663
663
        '''
664
664
        Set the confirmed date with the requested date if the first is not fill
675
675
        # compute ready to ship date
676
676
        res = common_requested_date_change(self, cr, uid, ids, part=part, date_order=date_order, requested_date=requested_date, transport_lt=transport_lt, type=get_type(self), res=res, context=context)
677
677
        return res
678
 
    
 
678
 
679
679
    def onchange_internal_type(self, cr, uid, ids, order_type, partner_id, categ, dest_partner_id=False, warehouse_id=False, delivery_requested_date=False):
680
680
        """
681
681
        Set the delivery_confirmed_date if order_type == 'purchase_list'
691
691
        else:
692
692
            res['value'].update({'delivery_confirmed_date': False})
693
693
        return res
694
 
    
 
694
 
695
695
    def onchange_transport_lt(self, cr, uid, ids, requested_date=False, transport_lt=0, context=None):
696
696
        '''
697
697
        Fills the Ready to ship date
698
 
        
 
698
 
699
699
        SPRINT3 validated - YAML ok
700
700
        '''
701
701
        if context is None:
704
704
        # compute ready to ship date
705
705
        res = common_onchange_transport_lt(self, cr, uid, ids, requested_date=requested_date, transport_lt=transport_lt, type=get_type(self), res=res, context=context)
706
706
        return res
707
 
    
 
707
 
708
708
    def onchange_date_order(self, cr, uid, ids, part=False, date_order=False, transport_lt=0, context=None):
709
709
        '''
710
710
        date_order is changed (creation date)
715
715
        # compute requested date
716
716
        res = common_onchange_date_order(self, cr, uid, ids, part=part, date_order=date_order, transport_lt=transport_lt, type=get_type(self), res=res, context=context)
717
717
        return res
718
 
    
 
718
 
719
719
    def onchange_transport_type(self, cr, uid, ids, part=False, transport_type=False, requested_date=False, context=None):
720
720
        '''
721
721
        transport type changed
722
722
        requested date is in the signature because it is needed for children on_change call
723
 
        
 
723
 
724
724
        '''
725
725
        if context is None:
726
726
            context = {}
731
731
    def onchange_partner_id(self, cr, uid, ids, part=False, date_order=False, transport_lt=0, context=None):
732
732
        '''
733
733
        Fills the Requested and Confirmed delivery dates
734
 
        
 
734
 
735
735
        SPRINT3 validated - YAML ok
736
736
        '''
737
737
        if isinstance(ids, (int, long)):
742
742
        # compute requested date and transport type
743
743
        res = common_onchange_partner_id(self, cr, uid, ids, part=part, date_order=date_order, transport_lt=transport_lt, type=get_type(self), res=res, context=context)
744
744
        return res
745
 
    
 
745
 
746
746
    def requested_data(self, cr, uid, ids, context=None):
747
747
        '''
748
748
        data for requested
749
749
        '''
750
750
        if context is None:
751
751
            context = {}
752
 
        return {'name': _('Do you want to update the Requested Date of all order lines ?'),}
753
 
    
 
752
        return {'name': _('Do you want to update the Requested Date of all order lines ?'), }
 
753
 
754
754
    def confirmed_data(self, cr, uid, ids, context=None):
755
755
        '''
756
756
        data for confirmed
757
757
        '''
758
758
        if context is None:
759
759
            context = {}
760
 
        return {'name': _('Do you want to update the Confirmed Delivery Date of all order lines ?'),}
761
 
    
 
760
        return {'name': _('Do you want to update the Confirmed Delivery Date of all order lines ?'), }
 
761
 
762
762
    def update_date(self, cr, uid, ids, context=None):
763
763
        '''
764
764
        open the update lines wizard
777
777
        wiz_obj = self.pool.get('wizard')
778
778
        # open the selected wizard
779
779
        return wiz_obj.open_wizard(cr, uid, ids, name=name, model=model, context=context)
780
 
    
781
 
    
 
780
 
 
781
 
782
782
purchase_order()
783
783
 
784
784
 
785
785
class purchase_order_line(osv.osv):
786
 
    _name= 'purchase.order.line'
 
786
    _name = 'purchase.order.line'
787
787
    _inherit = 'purchase.order.line'
788
 
    
 
788
 
789
789
    def _vals_get_order_date(self, cr, uid, ids, fields, arg, context=None):
790
790
        '''
791
791
        get values for functions
794
794
            context = {}
795
795
        if isinstance(fields, str):
796
796
            fields = [fields]
797
 
            
 
797
 
798
798
        result = {}
799
799
        for obj in self.browse(cr, uid, ids, context=context):
800
800
            result[obj.id] = {}
804
804
            result[obj.id]['po_state_stored'] = obj.order_id.state
805
805
            # po partner type
806
806
            result[obj.id]['po_partner_type_stored'] = obj.order_id.partner_type
807
 
        
 
807
 
808
808
        return result
809
 
    
 
809
 
810
810
    def _get_line_ids_from_po_ids(self, cr, uid, ids, context=None):
811
811
        '''
812
812
        self is purchase.order
815
815
            context = {}
816
816
        result = self.pool.get('purchase.order.line').search(cr, uid, [('order_id', 'in', ids)], context=context)
817
817
        return result
818
 
    
 
818
 
819
819
    def _get_planned_date(self, cr, uid, context=None):
820
820
        '''
821
821
        Returns planned_date
822
 
        
 
822
 
823
823
        SPRINT3 validated
824
824
        '''
825
825
        if context is None:
826
826
            context = {}
827
 
        order_obj= self.pool.get('purchase.order')
 
827
        order_obj = self.pool.get('purchase.order')
828
828
        res = (datetime.now() + relativedelta(days=+2)).strftime('%Y-%m-%d')
829
 
        
 
829
 
830
830
        if context.get('purchase_id', False):
831
831
            po = order_obj.browse(cr, uid, context.get('purchase_id'), context=context)
832
832
            res = po.delivery_requested_date
833
 
        
 
833
 
834
834
        return res
835
835
 
836
836
    def _get_confirmed_date(self, cr, uid, context=None):
837
837
        '''
838
838
        Returns confirmed date
839
 
        
 
839
 
840
840
        SPRINT3 validated
841
841
        '''
842
842
        if context is None:
843
843
            context = {}
844
 
        order_obj= self.pool.get('purchase.order')
845
 
        #The PO counterpart created should get for all line a delivery confirmed date blank
 
844
        order_obj = self.pool.get('purchase.order')
 
845
        # The PO counterpart created should get for all line a delivery confirmed date blank
846
846
        if context.get('is_a_counterpart') or context.get('purchase_id', False) and order_obj.browse(cr, uid, context.get('purchase_id'), context=context).is_a_counterpart:
847
847
            return
848
848
        res = (datetime.now() + relativedelta(days=+2)).strftime('%Y-%m-%d')
849
 
       
 
849
 
850
850
        if context.get('purchase_id', False):
851
851
            po = order_obj.browse(cr, uid, context.get('purchase_id'), context=context)
852
852
            res = po.delivery_confirmed_date
853
 
        
 
853
 
854
854
        return res
855
 
    
 
855
 
856
856
    def _get_default_state(self, cr, uid, context=None):
857
857
        '''
858
858
        default value for state fields.related
859
 
        
 
859
 
860
860
        why, beacause if we try to pass state in the context,
861
861
        the context is simply reset without any values specified...
862
862
        '''
863
863
        if context is None:
864
 
            context= {}
 
864
            context = {}
865
865
        if context.get('purchase_id', False):
866
 
            order_obj= self.pool.get('purchase.order')
 
866
            order_obj = self.pool.get('purchase.order')
867
867
            po = order_obj.browse(cr, uid, context.get('purchase_id'), context=context)
868
868
            return po.state
869
 
        
 
869
 
870
870
        return False
871
 
    
 
871
 
872
872
    _columns = {'date_planned': fields.date(string='Delivery Requested Date', required=True, select=True,
873
873
                                            help='Header level dates has to be populated by default with the possibility of manual updates'),
874
874
                'confirmed_delivery_date': fields.date(string='Delivery Confirmed Date',
877
877
                'po_state_stored': fields.related('order_id', 'state', type='selection', selection=PURCHASE_ORDER_STATE_SELECTION, string='Po State', readonly=True,),
878
878
                'po_partner_type_stored': fields.related('order_id', 'partner_type', type='selection', selection=PARTNER_TYPE, string='Po Partner Type', readonly=True,),
879
879
                }
880
 
    
 
880
 
881
881
    _defaults = {'po_state_stored': _get_default_state,
882
882
                 'po_partner_type_stored': lambda obj, cr, uid, c: c and c.get('partner_type', False),
883
883
                 'date_planned': _get_planned_date,
884
884
                 'confirmed_delivery_date': _get_confirmed_date,
885
885
                 }
886
 
    
 
886
 
887
887
    def copy_data(self, cr, uid, id, default=None, context=None):
888
888
        '''
889
889
        erase dates
898
898
            if 'date_planned' not in default:
899
899
                default['date_planned'] = (datetime.now() + relativedelta(days=+2)).strftime('%Y-%m-%d')
900
900
        return super(purchase_order_line, self).copy_data(cr, uid, id, default=default, context=context)
901
 
    
 
901
 
902
902
    def dates_change(self, cr, uid, ids, requested_date, confirmed_date, context=None):
903
903
        '''
904
904
        Checks if dates are later than header dates
905
 
        
 
905
 
906
906
        deprecated
907
907
        '''
908
908
        if context is None:
915
915
class sale_order(osv.osv):
916
916
    _name = 'sale.order'
917
917
    _inherit = 'sale.order'
918
 
    
 
918
 
919
919
    def write(self, cr, uid, ids, data, context=None):
920
920
        '''
921
921
        Checks if dates are good before writing
924
924
            context = {}
925
925
        if isinstance(ids, (int, long)):
926
926
            ids = [ids]
927
 
            
 
927
 
928
928
        for order in self.browse(cr, uid, ids, context=context):
929
929
            # Fill partner type
930
930
            partner = self.pool.get('res.partner').browse(cr, uid, data.get('partner_id', order.partner_id.id), context=context)
931
931
            # partner type - always set
932
 
            data.update({'partner_type': partner.partner_type,})
933
 
        
 
932
            data.update({'partner_type': partner.partner_type, })
 
933
 
934
934
        if not 'date_order' in data:
935
935
            data.update({'date_order': self.browse(cr, uid, ids[0]).date_order})
936
 
            
 
936
 
937
937
        check_dates(self, cr, uid, data, context=context)
938
 
        
 
938
 
939
939
        return super(sale_order, self).write(cr, uid, ids, data, context=context)
940
 
    
 
940
 
941
941
    def create(self, cr, uid, data, context=None):
942
942
        '''
943
943
        Checks if dates are good before creation
950
950
        # ready_to_ship_date only mandatory for so
951
951
        if 'ready_to_ship_date' not in data:
952
952
            rts = compute_rts(self, cr, uid, data.get('delivery_requested_date'), data.get('est_transport_lead_time'), type=get_type(self), context=context)
953
 
            data.update({'ready_to_ship_date': rts,})
 
953
            data.update({'ready_to_ship_date': rts, })
954
954
        # deprecated ?
955
955
        check_dates(self, cr, uid, data, context=context)
956
 
        
 
956
 
957
957
        return super(sale_order, self).create(cr, uid, data, context=context)
958
 
    
 
958
 
959
959
    def copy_data(self, cr, uid, id, default=None, context=None):
960
960
        '''
961
961
        erase dates
964
964
            default = {}
965
965
        if context is None:
966
966
            context = {}
967
 
        default.update({'shipment_date': False,})
 
967
        default.update({'shipment_date': False, })
968
968
        fields_to_reset = ['delivery_requested_date', 'ready_to_ship_date', 'date_order', 'delivery_confirmed_date', 'arrival_date']
969
969
        to_del = []
970
970
        for ftr in fields_to_reset:
975
975
            if ftd in res:
976
976
                del(res[ftd])
977
977
        return res
978
 
    
 
978
 
979
979
    def _get_receipt_date(self, cr, uid, ids, field_name, arg, context=None):
980
980
        '''
981
981
        Returns the date of the first picking for the the PO
984
984
            context = {}
985
985
        res = {}
986
986
        pick_obj = self.pool.get('stock.picking')
987
 
        
 
987
 
988
988
        for order in self.browse(cr, uid, ids, context=context):
989
989
            pick_ids = pick_obj.search(cr, uid, [('sale_id', '=', order.id)], offset=0, limit=1, order='date_done', context=context)
990
990
            if not pick_ids:
991
991
                res[order.id] = False
992
992
            else:
993
993
                res[order.id] = pick_obj.browse(cr, uid, pick_ids[0]).date_done
994
 
            
 
994
 
995
995
        return res
996
 
    
 
996
 
997
997
    _columns = {
998
998
        'date_order':fields.date(string='Creation Date', required=True, select=True, readonly=True, help="Date on which this document has been created.", states={'draft': [('readonly', False)]}),
999
999
        'delivery_requested_date': fields.date(string='Delivery Requested Date', required=True),
1001
1001
        'ready_to_ship_date': fields.date(string='Ready To Ship Date', required=True),
1002
1002
        'shipment_date': fields.date(string='Shipment Date', readonly=True, help='Date on which picking is created at supplier'),
1003
1003
        'arrival_date': fields.date(string='Arrival date in the country', help='Date of the arrival of the goods at custom'),
1004
 
        'receipt_date': fields.function(_get_receipt_date, type='date', method=True, store=True, 
 
1004
        'receipt_date': fields.function(_get_receipt_date, type='date', method=True, store=True,
1005
1005
                                    string='Receipt Date', help='for a PO, date of the first godd receipt.'),
1006
1006
        # BETA - to know if the delivery_confirmed_date can be erased - to be confirmed
1007
1007
        'confirmed_date_by_synchro': fields.boolean(string='Confirmed Date by Synchro'),
1010
1010
        'transport_type': fields.selection(selection=TRANSPORT_TYPE, string='Transport Mode',
1011
1011
                        help='Number of days this field has to be associated with a transport mode selection'),
1012
1012
        # not a function because can be modified by user - **ONLY IN CREATE only if not in vals**
1013
 
        'est_transport_lead_time': fields.float(digits=(16,2), string='Est. Transport Lead Time', help="Estimated Transport Lead-Time in weeks"),
 
1013
        'est_transport_lead_time': fields.float(digits=(16, 2), string='Est. Transport Lead Time', help="Estimated Transport Lead-Time in weeks"),
1014
1014
        # not a function because a function value is only filled when saved, not with on change of partner id
1015
1015
        # from partner_id object
1016
1016
        'partner_type': fields.selection(string='Partner Type', selection=PARTNER_TYPE, readonly=True,),
1018
1018
        # from partner_id object
1019
1019
        'internal_type': fields.selection(string='Type', selection=ZONE_SELECTION, readonly=True,),
1020
1020
    }
1021
 
    
 
1021
 
1022
1022
    _defaults = {
1023
1023
        'date_order': lambda *a: time.strftime('%Y-%m-%d'),
1024
1024
        'confirmed_date_by_synchro': False,
1025
1025
    }
1026
 
    
 
1026
 
1027
1027
    def internal_type_change(self, cr, uid, ids, internal_type, rts, shipment_date, context=None):
1028
1028
        '''
1029
1029
        Set the shipment date if the internal_type == international
1030
 
        
 
1030
 
1031
1031
        deprecated
1032
1032
        '''
1033
1033
        if context is None:
1034
1034
            context = {}
1035
1035
        return {}
1036
1036
        return {'value': common_internal_type_change(self, cr, uid, ids, internal_type, rts, shipment_date, context=context)}
1037
 
        
 
1037
 
1038
1038
    def ready_to_ship_change(self, cr, uid, ids, ready_to_ship, date_order, shipment, context=None):
1039
1039
        '''
1040
1040
        Checks the entered value
1041
 
        
 
1041
 
1042
1042
        deprecated
1043
1043
        '''
1044
1044
        if context is None:
1045
1045
            context = {}
1046
1046
        return {}
1047
1047
        return common_ready_to_ship_change(self, cr, uid, ids, ready_to_ship, date_order, shipment, context=context)
1048
 
    
 
1048
 
1049
1049
    def onchange_requested_date(self, cr, uid, ids, part=False, date_order=False, requested_date=False, transport_lt=0, context=None):
1050
1050
        '''
1051
1051
        Set the confirmed date with the requested date if the first is not fill
1060
1060
    def onchange_transport_lt(self, cr, uid, ids, requested_date=False, transport_lt=0, context=None):
1061
1061
        '''
1062
1062
        Fills the Ready to ship date
1063
 
        
 
1063
 
1064
1064
        SPRINT3 validated - YAML ok
1065
1065
        '''
1066
1066
        if context is None:
1069
1069
        # compute ready to ship date
1070
1070
        res = common_onchange_transport_lt(self, cr, uid, ids, requested_date=requested_date, transport_lt=transport_lt, type=get_type(self), res=res, context=context)
1071
1071
        return res
1072
 
    
 
1072
 
1073
1073
    def onchange_transport_type(self, cr, uid, ids, part=False, transport_type=False, requested_date=False, context=None):
1074
1074
        '''
1075
1075
        transport type changed
1076
1076
        requested date is in the signature because it is needed for children on_change call
1077
 
        
 
1077
 
1078
1078
        SPRINT3 validated - YAML ok
1079
1079
        '''
1080
1080
        if context is None:
1082
1082
        res = {}
1083
1083
        res = common_onchange_transport_type(self, cr, uid, ids, part=part, transport_type=transport_type, requested_date=requested_date, type=get_type(self), res=res, context=context)
1084
1084
        return res
1085
 
    
 
1085
 
1086
1086
    def onchange_partner_id(self, cr, uid, ids, part=False, order_type=False, date_order=False, transport_lt=0, context=None):
1087
1087
        '''
1088
1088
        Fills the Requested and Confirmed delivery dates
1089
 
        
 
1089
 
1090
1090
        SPRINT3 validated - YAML ok
1091
1091
        '''
1092
1092
        if isinstance(ids, (int, long)):
1096
1096
        res = super(sale_order, self).onchange_partner_id(cr, uid, ids, part, order_type)
1097
1097
        # compute requested date and transport type
1098
1098
        res = common_onchange_partner_id(self, cr, uid, ids, part=part, order_type=order_type, date_order=date_order, transport_lt=transport_lt, type=get_type(self), res=res, context=context)
1099
 
        
 
1099
 
1100
1100
        if res.get('value', {}).get('pricelist_id') and part:
1101
1101
            if ids:
1102
1102
                if isinstance(ids, (int, long)):
1103
1103
                    ids = [ids]
1104
 
            
 
1104
 
1105
1105
                order = self.pool.get('sale.order').browse(cr, uid, ids[0])
1106
1106
                partner = self.pool.get('res.partner').browse(cr, uid, part)
1107
1107
                pricelist_ids = self.pool.get('product.pricelist').search(cr, uid, [('type', '=', 'sale'), ('in_search', '=', partner.partner_type)])
1110
1110
                    res.update({'warning': {'title': 'Warning',
1111
1111
                                            'message': 'The currency used currently on the order is not compatible with the new partner. Please change the currency to choose a compatible currency.'}})
1112
1112
        return res
1113
 
    
 
1113
 
1114
1114
    def onchange_date_order(self, cr, uid, ids, part=False, date_order=False, transport_lt=0, context=None):
1115
1115
        '''
1116
1116
        date_order is changed (creation date)
1117
 
        
 
1117
 
1118
1118
        SPRINT3 validated - YAML ok
1119
1119
        '''
1120
1120
        if context is None:
1123
1123
        # compute requested date
1124
1124
        res = common_onchange_date_order(self, cr, uid, ids, part=part, date_order=date_order, transport_lt=transport_lt, type=get_type(self), res=res, context=context)
1125
1125
        return res
1126
 
    
 
1126
 
1127
1127
    def requested_data(self, cr, uid, ids, context=None):
1128
1128
        '''
1129
1129
        data for requested for change line wizard
1130
1130
        '''
1131
1131
        if context is None:
1132
1132
            context = {}
1133
 
        return {'name': _('Do you want to update the Requested Date of all order lines ?'),}
1134
 
    
 
1133
        return {'name': _('Do you want to update the Requested Date of all order lines ?'), }
 
1134
 
1135
1135
    def confirmed_data(self, cr, uid, ids, context=None):
1136
1136
        '''
1137
1137
        data for confirmed for change line wizard
1138
1138
        '''
1139
1139
        if context is None:
1140
1140
            context = {}
1141
 
        return {'name': _('Do you want to update the Confirmed Delivery Date of all order lines ?'),}
1142
 
    
 
1141
        return {'name': _('Do you want to update the Confirmed Delivery Date of all order lines ?'), }
 
1142
 
1143
1143
    def update_date(self, cr, uid, ids, context=None):
1144
1144
        '''
1145
1145
        open the update lines wizard
1158
1158
        wiz_obj = self.pool.get('wizard')
1159
1159
        # open the selected wizard
1160
1160
        return wiz_obj.open_wizard(cr, uid, ids, name=name, model=model, context=context)
1161
 
    
1162
 
    def _hook_ship_create_stock_move(self, cr, uid, ids, context=None, *args, **kwargs):
1163
 
        '''
1164
 
        Please copy this to your module's method also.
1165
 
        This hook belongs to the action_ship_create method from sale>sale.py
1166
 
        
1167
 
        - allow to modify the data for stock move creation
1168
 
        '''
1169
 
        if context is None:
1170
 
            context = {}
1171
 
        # objects
1172
 
        date_tools = self.pool.get('date.tools')
1173
 
        fields_tools = self.pool.get('fields.tools')
1174
 
        db_date_format = date_tools.get_db_date_format(cr, uid, context=context)
1175
 
        # call super
1176
 
        move_data = super(sale_order, self)._hook_ship_create_stock_move(cr, uid, ids, context=context, *args, **kwargs)
1177
 
        order = kwargs['order']
1178
 
        # get shipment lead time
1179
 
        shipment_lt = fields_tools.get_field_from_company(cr, uid, object=self._name, field='shipment_lead_time', context=context)
1180
 
        # date = rts of so - by default, a picking is created
1181
 
        rts = order.ready_to_ship_date
1182
 
        # date, date_expected
1183
 
        move_data.update({'date': rts,'date_expected': rts})
1184
 
        
1185
 
        return move_data
1186
 
    
1187
 
    def _hook_ship_create_procurement_order(self, cr, uid, ids, context=None, *args, **kwargs):
1188
 
        '''
1189
 
        Please copy this to your module's method also.
1190
 
        This hook belongs to the action_ship_create method from sale>sale.py
1191
 
        
1192
 
        - allow to modify the data for procurement order creation
1193
 
        '''
1194
 
        if context is None:
1195
 
            context = {}
1196
 
        # objects
1197
 
        date_tools = self.pool.get('date.tools')
1198
 
        fields_tools = self.pool.get('fields.tools')
1199
 
        db_date_format = date_tools.get_db_date_format(cr, uid, context=context)
1200
 
        # call to super
1201
 
        result = super(sale_order, self)._hook_ship_create_procurement_order(cr, uid, ids, context=context, *args, **kwargs)
1202
 
        # date_planned = rts - company.prep_lt
1203
 
        order = kwargs['order']
1204
 
        # get value from company
1205
 
        prep_lt = fields_tools.get_field_from_company(cr, uid, object=self._name, field='preparation_lead_time', context=context)
1206
 
        # rts - prep_lt
1207
 
        rts = datetime.strptime(order.ready_to_ship_date, db_date_format)
1208
 
        rts = rts - relativedelta(days=prep_lt or 0)
1209
 
        rts = rts.strftime(db_date_format)
1210
 
        result['date_planned'] = rts
1211
 
        # update from yml flag
1212
 
        result['from_yml_test'] = order.from_yml_test
1213
 
        
1214
 
        return result
1215
 
    
 
1161
 
1216
1162
sale_order()
1217
1163
 
1218
1164
 
1219
1165
class sale_order_line(osv.osv):
1220
 
    _name= 'sale.order.line'
 
1166
    _name = 'sale.order.line'
1221
1167
    _inherit = 'sale.order.line'
1222
 
    
 
1168
 
1223
1169
    def _get_planned_date(self, cr, uid, context=None):
1224
1170
        '''
1225
1171
            Returns planned_date
1226
1172
        '''
1227
1173
        if context is None:
1228
1174
            context = {}
1229
 
        order_obj= self.pool.get('sale.order')
 
1175
        order_obj = self.pool.get('sale.order')
1230
1176
        res = (datetime.now() + relativedelta(days=+2)).strftime('%Y-%m-%d')
1231
 
        
 
1177
 
1232
1178
        if context.get('sale_id', False):
1233
1179
            so = order_obj.browse(cr, uid, context.get('sale_id'), context=context)
1234
1180
            res = so.delivery_requested_date
1235
 
        
 
1181
 
1236
1182
        return res
1237
1183
 
1238
1184
    def _get_confirmed_date(self, cr, uid, context=None):
1241
1187
        '''
1242
1188
        if context is None:
1243
1189
            context = {}
1244
 
        order_obj= self.pool.get('sale.order')
 
1190
        order_obj = self.pool.get('sale.order')
1245
1191
        res = (datetime.now() + relativedelta(days=+2)).strftime('%Y-%m-%d')
1246
 
        
 
1192
 
1247
1193
        if context.get('sale_id', False):
1248
1194
            so = order_obj.browse(cr, uid, context.get('sale_id'), context=context)
1249
 
            res = so.delivery_confirmed_date    
1250
 
        
 
1195
            res = so.delivery_confirmed_date
 
1196
 
1251
1197
        return res
1252
 
    
 
1198
 
1253
1199
    def _get_default_state(self, cr, uid, context=None):
1254
1200
        '''
1255
1201
        default value for state fields.related
1256
 
        
 
1202
 
1257
1203
        why, beacause if we try to pass state in the context,
1258
1204
        the context is simply reset without any values specified...
1259
1205
        '''
1260
1206
        if context is None:
1261
 
            context= {}
 
1207
            context = {}
1262
1208
        if context.get('sale_id', False):
1263
 
            order_obj= self.pool.get('sale.order')
 
1209
            order_obj = self.pool.get('sale.order')
1264
1210
            so = order_obj.browse(cr, uid, context.get('sale_id'), context=context)
1265
1211
            return so.state
1266
 
        
 
1212
 
1267
1213
        return False
1268
1214
 
1269
1215
    def _get_uom_def(self, cr, uid, context=None):
1270
1216
        if context is None:
1271
 
            context= {}
 
1217
            context = {}
1272
1218
        try:
1273
1219
            ids = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'product', 'product_uom_unit')
1274
1220
        except ValueError:
1306
1252
            if 'date_planned' not in default:
1307
1253
                default['date_planned'] = (datetime.now() + relativedelta(days=+2)).strftime('%Y-%m-%d')
1308
1254
        return super(sale_order_line, self).copy_data(cr, uid, id, default=default, context=context)
1309
 
    
 
1255
 
1310
1256
    def dates_change(self, cr, uid, ids, requested_date, confirmed_date, context=None):
1311
1257
        '''
1312
 
        Checks if dates are later than header dates 
1313
 
        
 
1258
        Checks if dates are later than header dates
 
1259
 
1314
1260
        deprecated
1315
1261
        '''
1316
1262
        if context is None:
1317
1263
            context = {}
1318
1264
        return common_dates_change_on_line(self, cr, uid, ids, requested_date, confirmed_date, 'sale.order', context=context)
1319
 
    
 
1265
 
1320
1266
sale_order_line()
1321
1267
 
1322
1268
 
1325
1271
    date modifications
1326
1272
    '''
1327
1273
    _inherit = 'procurement.order'
1328
 
    
 
1274
 
1329
1275
    def po_line_values_hook(self, cr, uid, ids, context=None, *args, **kwargs):
1330
1276
        '''
1331
1277
        Please copy this to your module's method also.
1332
1278
        This hook belongs to the make_po method from purchase>purchase.py>procurement_order
1333
 
        
 
1279
 
1334
1280
        - allow to modify the data for purchase order line creation
1335
1281
        '''
1336
1282
        if context is None:
1339
1285
        procurement = kwargs['procurement']
1340
1286
        # date_planned (requested date) = date_planned from procurement order (rts - prepartion lead time)
1341
1287
        # confirmed_delivery_date (confirmed date) = False
1342
 
        line.update({'date_planned': procurement.date_planned, 'confirmed_delivery_date': False,})
 
1288
        line.update({'date_planned': procurement.date_planned, 'confirmed_delivery_date': False, })
1343
1289
        return line
1344
 
    
 
1290
 
1345
1291
    def po_values_hook(self, cr, uid, ids, context=None, *args, **kwargs):
1346
1292
        '''
1347
1293
        Please copy this to your module's method also.
1348
1294
        This hook belongs to the make_po method from purchase>purchase.py>procurement_order
1349
 
        
 
1295
 
1350
1296
        - allow to modify the data for purchase order creation
1351
1297
        '''
1352
1298
        if context is None:
1358
1304
        values['from_yml_test'] = procurement.from_yml_test
1359
1305
        # date_planned (requested date) = date_planned from procurement order (rts - prepartion lead time)
1360
1306
        # confirmed_delivery_date (confirmed date) = False
1361
 
        # both values are taken from line 
1362
 
        values.update({'delivery_requested_date': line['date_planned'], 'delivery_confirmed_date': line['confirmed_delivery_date'],})
1363
 
        return values  
 
1307
        # both values are taken from line
 
1308
        values.update({'delivery_requested_date': line['date_planned'], 'delivery_confirmed_date': line['confirmed_delivery_date'], })
 
1309
        return values
1364
1310
 
1365
1311
procurement_order()
1366
1312
 
1368
1314
class stock_picking(osv.osv):
1369
1315
    _name = 'stock.picking'
1370
1316
    _inherit = 'stock.picking'
1371
 
    
 
1317
 
1372
1318
    def get_min_max_date(self, cr, uid, ids, field_name, arg, context=None):
1373
1319
        '''
1374
1320
        call super - modify logic for min_date (Expected receipt date)
1404
1350
                        # today
1405
1351
                        today = time.strftime(db_date_format)
1406
1352
                        result.setdefault(obj.id, {}).update({'min_date': today})
1407
 
                    
 
1353
 
1408
1354
        return result
1409
 
    
 
1355
 
1410
1356
    def _set_minimum_date(self, cr, uid, ids, name, value, arg, context=None):
1411
1357
        '''
1412
1358
        set the manual conterpart of min_date
1415
1361
            context = {}
1416
1362
        if isinstance(ids, (int, long)):
1417
1363
            ids = [ids]
1418
 
        
 
1364
 
1419
1365
        self.write(cr, uid, ids, {'manual_min_date_stock_picking': value}, context=context)
1420
1366
        return True
1421
1367
 
1427
1373
                'manual_min_date_stock_picking': fields.datetime(string='Manual Date'),
1428
1374
                'min_date_manually': fields.boolean(string='change manually')
1429
1375
                }
1430
 
    
 
1376
 
1431
1377
    _defaults = {'manual_min_date_stock_picking': False,
1432
 
                 'min_date_manually': False,}
1433
 
    
 
1378
                 'min_date_manually': False, }
 
1379
 
1434
1380
    def change_min_date(self, cr, uid, ids, context=None):
1435
1381
        return {'value': {'min_date_manually': True}}
1436
 
    
 
1382
 
1437
1383
    def create(self, cr, uid, vals, context=None):
1438
1384
        if not vals.get('purchase id') or not vals.get('sale_id'):
1439
1385
            vals['manual_min_date_stock_picking'] = vals.get('min_date')
1440
1386
        return super(stock_picking, self).create(cr, uid, vals, context=context)
1441
 
    
 
1387
 
1442
1388
    def write(self, cr, uid, ids, vals, context=None):
1443
1389
        '''
1444
1390
        Update all stock moves if the min_date of the picking was changed manually
1449
1395
                vals.update({'manual_min_date_stock_picking': vals.get('min_date', vals.get('manual_min_date_stock_picking'))})
1450
1396
                move_ids = move_obj.search(cr, uid, [('picking_id', '=', pick.id), ('state', 'not in', ('done', 'cancel'))], context=context)
1451
1397
                move_obj.write(cr, uid, move_ids, {'date_expected': vals.get('min_date', vals.get('manual_min_date_stock_picking'))}, context=context)
1452
 
                
 
1398
 
1453
1399
        return super(stock_picking, self).write(cr, uid, ids, vals, context=context)
1454
1400
 
1455
1401
    # @@@override stock>stock.py>stock_picking>do_partial
1472
1418
                today = time.strftime(date_format)
1473
1419
                today_db = time.strftime(db_date_format)
1474
1420
                so_obj.write(cr, uid, [sale_id], {'shipment_date': today_db})
1475
 
                so_obj.log(cr, uid, sale_id, _("Shipment Date of the Field Order '%s' has been updated to %s.")%(picking.sale_id.name, today))
 
1421
                so_obj.log(cr, uid, sale_id, _("Shipment Date of the Field Order '%s' has been updated to %s.") % (picking.sale_id.name, today))
1476
1422
        return res
1477
1423
 
1478
1424
stock_picking()
1483
1429
    shipment date of sale order is updated
1484
1430
    '''
1485
1431
    _inherit = 'stock.move'
1486
 
    
 
1432
 
1487
1433
    def default_get(self, cr, uid, fields, context=None):
1488
1434
        if not context:
1489
1435
            context = {}
1490
 
            
 
1436
 
1491
1437
        res = super(stock_move, self).default_get(cr, uid, fields, context=context)
1492
1438
        res['date'] = res['date_expected'] = context.get('date_expected', time.strftime('%Y-%m-%d %H:%M:%S'))
1493
 
        
 
1439
 
1494
1440
        return res
1495
 
    
 
1441
 
1496
1442
    def do_partial(self, cr, uid, ids, partial_datas, context=None):
1497
1443
        '''
1498
1444
        update shipment date and logged
1501
1447
            context = {}
1502
1448
        date_tools = self.pool.get('date.tools')
1503
1449
        res = super(stock_move, self).do_partial(cr, uid, ids, partial_datas, context=context)
1504
 
        
 
1450
 
1505
1451
        so_obj = self.pool.get('sale.order')
1506
1452
 
1507
1453
        for obj in self.browse(cr, uid, ids, context=context):
1512
1458
                today = time.strftime(date_format)
1513
1459
                today_db = time.strftime(db_date_format)
1514
1460
                so_obj.write(cr, uid, [sale_id], {'shipment_date': today_db})
1515
 
                so_obj.log(cr, uid, sale_id, _("Shipment Date of the Field Order '%s' has been updated to %s.")%(obj.picking_id.sale_id.name, today))
 
1461
                so_obj.log(cr, uid, sale_id, _("Shipment Date of the Field Order '%s' has been updated to %s.") % (obj.picking_id.sale_id.name, today))
1516
1462
        return res
1517
 
    
 
1463
 
1518
1464
stock_move()
1519
1465
 
1520
1466
 
1523
1469
    add time related fields
1524
1470
    '''
1525
1471
    _inherit = 'res.company'
1526
 
    
1527
 
    _columns = {'shipment_lead_time': fields.float(digits=(16,2), string='Shipment Lead Time'),
1528
 
                'preparation_lead_time': fields.float(digits=(16,2), string='Preparation Lead Time'),
 
1472
 
 
1473
    _columns = {'shipment_lead_time': fields.float(digits=(16, 2), string='Shipment Lead Time'),
 
1474
                'preparation_lead_time': fields.float(digits=(16, 2), string='Preparation Lead Time'),
1529
1475
                }
1530
 
    
 
1476
 
1531
1477
    _defaults = {'shipment_lead_time': 0.0,
1532
1478
                 'preparation_lead_time': 0.0,
1533
 
                 'po_lead': lambda *a: 0.0, # removed from processes - set to 0.0 for security
 
1479
                 'po_lead': lambda *a: 0.0,  # removed from processes - set to 0.0 for security
1534
1480
                 }
1535
1481
 
1536
1482
res_company()