~ecommerce-addons-core-editors/e-commerce-addons/github-6.1

« back to all changes in this revision

Viewing changes to sale_exceptions/sale.py

  • Committer: sebastien beau
  • Author(s): Raphaël Valyi
  • Date: 2011-03-07 12:19:42 UTC
  • Revision ID: git-v1:fa9a6b6ef7fa14322f612a6b364bf1e8f9d4597e
[ADD] sale_exceptions: new module making it easier to deal with order exceptions that prevent validation; specially useful in external importation scenarios

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
##############################################################################
 
3
#
 
4
#    OpenERP, Open Source Management Solution
 
5
#    Copyright (C) 2011 Akretion LTDA.
 
6
#
 
7
#    This program is free software: you can redistribute it and/or modify
 
8
#    it under the terms of the GNU Affero General Public License as
 
9
#    published by the Free Software Foundation, either version 3 of the
 
10
#    License, or (at your option) any later version.
 
11
#
 
12
#    This program is distributed in the hope that it will be useful,
 
13
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
#    GNU Affero General Public License for more details.
 
16
#
 
17
#    You should have received a copy of the GNU Affero General Public License
 
18
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
19
#
 
20
##############################################################################
 
21
 
 
22
from datetime import datetime, timedelta
 
23
from dateutil.relativedelta import relativedelta
 
24
import time
 
25
 
 
26
from osv import fields, osv
 
27
from tools.translate import _
 
28
import netsvc
 
29
 
 
30
class sale_exception(osv.osv):
 
31
    _name = "sale.exception"
 
32
    _description = "Sale Exceptions"
 
33
    _columns = {
 
34
        'name': fields.char('Exception Name', size=64, required=True),
 
35
        'sale_order_ids': fields.many2many('sale.order', 'sale_order_exception_rel', 'exception_id', 'sale_order_id', 'Sale Orders'),
 
36
    }
 
37
 
 
38
sale_exception()
 
39
 
 
40
class sale_order(osv.osv):
 
41
    _inherit = "sale.order"
 
42
    _columns = {
 
43
        'exceptions_ids': fields.many2many('sale.exception', 'sale_order_exception_rel', 'sale_order_id', 'exception_id', 'Exceptions'),
 
44
    }
 
45
 
 
46
    def __add_exception(self, cr, uid, exceptions_list, exception_name):
 
47
        ir_model_data_id = self.pool.get('ir.model.data').search(cr, uid, [('name', '=', exception_name)])[0]
 
48
        except_id = self.pool.get('ir.model.data').read(cr, uid, ir_model_data_id, ['res_id'])['res_id']
 
49
        if except_id not in exceptions_list:
 
50
            exceptions_list.append(except_id)
 
51
 
 
52
    def test_exceptions(self, cr, uid, ids, *args):
 
53
        for order in self.browse(cr, uid, ids, args):
 
54
            new_exceptions = []
 
55
            self.add_custom_order_exception(cr, uid, ids, order, new_exceptions, *args)
 
56
            self.write(cr, uid, [order.id], {'exceptions_ids': [(6, 0, new_exceptions)]})
 
57
            cr.commit()
 
58
        if len(new_exceptions) != 0:
 
59
            raise osv.except_osv(_('Order has errors!'), "\n".join(ex.name for ex in self.pool.get('sale.exception').browse(cr, uid, new_exceptions, *args)))
 
60
        return True
 
61
 
 
62
    def add_custom_order_exception(self, cr, uid, ids, order, exceptions, *args):
 
63
        self.detect_invalid_destination(cr, uid, order, exceptions)
 
64
        self.detect_no_zip(cr, uid, order, exceptions)
 
65
        for order_line in order.order_line:
 
66
            self.detect_wrong_product(cr, uid, order_line, exceptions)
 
67
            self.detect_not_enough_virtual_stock(cr, uid, order_line, exceptions)
 
68
        return exceptions
 
69
 
 
70
    def detect_invalid_destination(self, cr, uid, order, exceptions):
 
71
        if len(self.pool.get('delivery.grid').search(cr, uid, [('country_ids', 'ilike', "%%%s%%" % (order.partner_shipping_id.country_id.name,))])) > 0: #TODO may be add an extra condition on grid type/name
 
72
            self.__add_exception(cr, uid, exceptions, 'excep_invalid_location')
 
73
 
 
74
    def detect_no_zip(self, cr, uid, order, exceptions):
 
75
        if not order.partner_shipping_id.zip:
 
76
            self.__add_exception(cr, uid, exceptions, 'excep_no_zip')
 
77
 
 
78
    def detect_wrong_product(self, cr, uid, order_line, exceptions):
 
79
        if order_line.product_id and 'unknown' in order_line.product_id.name or not order_line.product_id:
 
80
            self.__add_exception(cr, uid, exceptions, 'excep_product')
 
81
 
 
82
    def detect_not_enough_virtual_stock(self, cr, uid, order_line, exceptions):
 
83
        if order_line.product_id and order_line.product_id.virtual_available < order_line.product_uom_qty:
 
84
            self.__add_exception(cr, uid, exceptions, 'excep_no_stock')
 
85
 
 
86
sale_order()