~credativ/credativ-openerp/order_edit-7.0

« back to all changes in this revision

Viewing changes to so_line_delivery_date/sale.py

  • Committer: Jacob Hicks
  • Date: 2013-10-29 11:17:50 UTC
  • Revision ID: jacob.hicks@credativ.co.uk-20131029111750-hlnxr3h9nxhjx2ao
[IMP] Improve onchange handlers and sale order confirmation logic

Show diffs side-by-side

added added

removed removed

Lines of Context:
46
46
class sale_order_line(osv.osv):
47
47
    _inherit = 'sale.order.line'
48
48
 
 
49
    def onchange_delay(self, cr, uid, ids, delay, context=None):
 
50
        context = context or {}
 
51
        res = {'value':{}}
 
52
        res['value']['default_delivery_date'] = self._get_single_default_delivery_date(cr, uid, ids and ids[0], delay=delay, context=context)
 
53
        return res
 
54
 
 
55
    def _get_single_days_until_delivery(self, cr, uid, id, requested_delivery_date, context=None):
 
56
        today = datetime.datetime(year=datetime.datetime.today().year, month=datetime.datetime.today().month, day=datetime.datetime.today().day)
 
57
        if requested_delivery_date and not id:
 
58
            timedelta_until_delivery = datetime.datetime.strptime(requested_delivery_date, '%Y-%m-%d') - today
 
59
            return timedelta_until_delivery and timedelta_until_delivery.days
 
60
        try:
 
61
            line = self.browse(cr, uid, id, context=context)
 
62
            if not requested_delivery_date:
 
63
                requested_delivery_date = line.requested_delivery_date
 
64
            date_confirm = line.order_id.date_confirm and datetime.datetime.strptime(line.order_id.date_confirm, '%Y-%m-%d')
 
65
            timedelta_until_delivery = datetime.datetime.strptime(requested_delivery_date, '%Y-%m-%d') - ( date_confirm or today )
 
66
            return timedelta_until_delivery and timedelta_until_delivery.days
 
67
        except:
 
68
            return False
 
69
 
49
70
    def _fnct_days_until_delivery(self, cr, uid, ids, field_name, arg, context=None):
 
71
        context = context or {}
50
72
        res = {}
51
73
        for line in self.browse(cr, uid, ids, context=context):
52
 
            try:
53
 
                date_confirm = line.order_id.date_confirm and datetime.datetime.strptime(line.order_id.date_confirm, '%Y-%m-%d')
54
 
                timedelta_until_delivery = line.requested_delivery_date and datetime.datetime.strptime(line.requested_delivery_date, '%Y-%m-%d') - ( date_confirm or datetime.datetime.now() )
55
 
                days_until_delivery = timedelta_until_delivery and timedelta_until_delivery.days + 1 # Add one because of rounding
56
 
                res[line.id] = days_until_delivery
57
 
            except:
58
 
                res[line.id] = False
 
74
            res[line.id] = self._get_single_days_until_delivery(cr, uid, line.id, line.requested_delivery_date, context=context)
59
75
        return res
60
76
 
 
77
    def _get_single_default_delivery_date(self, cr, uid, id, delay, context=None):
 
78
        today = datetime.datetime(year=datetime.datetime.today().year, month=datetime.datetime.today().month, day=datetime.datetime.today().day)
 
79
        if delay and not id:
 
80
            default_delivery_datetime = datetime.timedelta(days=delay) + today
 
81
            return default_delivery_datetime.strftime('%Y-%m-%d')
 
82
        try:
 
83
            line = self.browse(cr, uid, id, context=context)
 
84
            if not delay:
 
85
                delay = line.delay
 
86
            date_confirm = line.order_id.date_confirm and datetime.datetime.strptime(line.order_id.date_confirm, '%Y-%m-%d')
 
87
            default_delivery_datetime = datetime.timedelta(days=delay) + ( date_confirm or today )
 
88
            return default_delivery_datetime.strftime('%Y-%m-%d')
 
89
        except:
 
90
            return False
 
91
        
61
92
    def _fnct_default_delivery_date(self, cr, uid, ids, field_name, arg, context=None):
 
93
        context = context or {}
62
94
        res = {}
63
95
        for line in self.browse(cr, uid, ids, context=context):
64
 
            try:
65
 
                date_confirm = line.order_id.date_confirm and datetime.datetime.strptime(line.order_id.date_confirm, '%Y-%m-%d')
66
 
                default_delivery_datetime = datetime.timedelta(days=line.delay) + ( date_confirm or datetime.datetime.now() )
67
 
                res[line.id] =  default_delivery_datetime.strftime('%Y-%m-%d')
68
 
            except:
69
 
                res[line.id] = False
 
96
            if line.state == 'confirmed':
 
97
                res[line.id] = line.default_delivery_date_when_confirmed
 
98
            else:
 
99
                res[line.id] = self._get_single_default_delivery_date(cr, uid, line.id, delay=line.delay, context=context)
70
100
        return res
71
101
 
72
102
    def onchange_requested_delivery_date(self, cr, uid, ids, requested_delivery_date, default_delivery_date, context=None):
73
103
        if not context:
74
104
            context = {}
75
 
        
 
105
        if not isinstance(ids, list):
 
106
            ids = [ids]
76
107
        res = {}
77
 
        new_days_until_delivery = False
78
 
        if requested_delivery_date:
79
 
            line = self.browse(cr, uid, ids, context=context)[0]
80
 
            original_date = line.requested_delivery_date and datetime.datetime.strptime(line.requested_delivery_date, '%Y-%m-%d') or datetime.datetime.today()
81
 
            days_change =  ( datetime.datetime.strptime(requested_delivery_date, '%Y-%m-%d') - original_date ).days
82
 
            new_days_until_delivery = (line.days_until_delivery or 0) + days_change
83
 
            if requested_delivery_date < default_delivery_date:
84
 
                res['warning'] = {'title':'Requested days until delivery is less than delivery lead time', 'message':'Please ensure this delivery date is manageable before continuing.'}
85
 
        res['value'] = {'days_until_delivery': new_days_until_delivery }
86
 
        
 
108
        res = {'value':{}}
 
109
        res['value']['days_until_delivery'] = self._get_single_days_until_delivery(cr, uid, ids and ids[0], requested_delivery_date=requested_delivery_date, context=None)
 
110
        if requested_delivery_date < default_delivery_date:
 
111
            res['warning'] = {'title':'Requested days until delivery is less than delivery lead time', 'message':'Please ensure this delivery date is manageable before continuing.'}
87
112
        return res
88
113
 
89
114
    def button_confirm(self, cr, uid, ids, context=None):
90
115
        if not context:
91
116
            context = {}
92
 
        res = super(sale_order_line, self).button_confirm(cr, uid, ids, context=context)
93
117
        for line in self.browse(cr, uid, ids, context=context):
 
118
            self.write(cr, uid, ids, {'default_delivery_date_when_confirmed': line.default_delivery_date})
94
119
            if line.days_until_delivery:
95
120
                self.write(cr, uid, ids, {'delay': line.days_until_delivery})
 
121
        res = super(sale_order_line, self).button_confirm(cr, uid, ids, context=context)
96
122
        return res
97
123
 
98
124
    _columns = { 
99
125
        'days_until_delivery': fields.function(_fnct_days_until_delivery, string='Days Until Delivery', type='float', help="Number of days remaining until requested delivery date.", readonly=True),
100
126
        'requested_delivery_date': fields.date('Requested Delivery Date', select=True, help="Date on which customer has requested delivery."),
 
127
        'default_delivery_date_when_confirmed': fields.date('Default Delivery Date When Confirmed'),
101
128
        'default_delivery_date': fields.function(_fnct_default_delivery_date, string='Default Delivery Date', type='date', help="Date on which delivery is projected, assuming customer has not requested a specific date."),
102
129
    }
103
130
    _defaults = {