add7d4b2fc1428975503b30d5d195e10973214c5
[odoo/odoo.git] / addons / delivery / stock.py
1 # -*- encoding: utf-8 -*-
2 ##############################################################################
3 #
4 #    OpenERP, Open Source Management Solution
5 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6 #    $Id$
7 #
8 #    This program is free software: you can redistribute it and/or modify
9 #    it under the terms of the GNU General Public License as published by
10 #    the Free Software Foundation, either version 3 of the License, or
11 #    (at your option) any later version.
12 #
13 #    This program is distributed in the hope that it will be useful,
14 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
15 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 #    GNU General Public License for more details.
17 #
18 #    You should have received a copy of the GNU General Public License
19 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 #
21 ##############################################################################
22
23 import netsvc
24 from osv import fields,osv
25 from tools.translate import _
26 import tools
27
28 # Overloaded stock_picking to manage carriers :
29 class stock_picking(osv.osv):
30     _name = "stock.picking"
31     _description = "Picking list"
32     _inherit = 'stock.picking'
33
34     def _cal_weight(self, cr, uid, ids, name, args, context=None):
35         res = {}
36         uom_obj = self.pool.get('product.uom')
37         for picking in self.browse(cr, uid, ids, context):
38             total_weight = 0.00
39             if picking.move_lines:
40                 weight = 0.00
41                 for move in picking.move_lines:
42                     if move.product_id.weight > 0.00:
43                         converted_qty = move.product_qty
44 #                        from_uom = move.product_uom.id
45 #                        pass_qty = move.product_qty
46 #                        to_uom = move.product_id.uom_id.id
47 #                        if picking.type == 'out':
48 #                            if move.product_uos:
49 #                                converted_qty = move.product_uos_qty
50 #                                if move.product_uos.id <> move.product_uom.id:
51 #                                    converted_qty = (move.product_uos_qty/move.product_id.uos_coeff)
52 #                                pass_qty = converted_qty
53                         if move.product_uom.id <> move.product_id.uom_id.id:
54                             converted_qty = uom_obj._compute_qty(cr, uid, move.product_uom.id, move.product_qty, move.product_id.uom_id.id)
55
56                         weight = (converted_qty * move.product_id.weight)
57                         total_weight += weight
58             res[picking.id] = total_weight
59         return res
60
61     def _get_picking_line(self, cr, uid, ids, context=None):
62         result = {}
63         for line in self.pool.get('stock.move').browse(cr, uid, ids, context=context):
64             result[line.picking_id.id] = True
65         return result.keys()
66     
67     _columns = {
68         'carrier_id':fields.many2one("delivery.carrier","Carrier"),
69         'volume': fields.float('Volume'),
70         'weight': fields.function(_cal_weight, method=True, type='float', string='Weight',digits=(16, 6),
71                   store={
72                  'stock.picking': (lambda self, cr, uid, ids, c={}: ids, ['move_lines'], 20),
73                  'stock.move': (_get_picking_line, ['product_id','product_uos_qty'], 20),
74                  }),
75         }
76
77     def action_invoice_create(self, cursor, user, ids, journal_id=False,
78             group=False, type='out_invoice', context=None):
79         invoice_obj = self.pool.get('account.invoice')
80         picking_obj = self.pool.get('stock.picking')
81         carrier_obj = self.pool.get('delivery.carrier')
82         grid_obj = self.pool.get('delivery.grid')
83         invoice_line_obj = self.pool.get('account.invoice.line')
84
85         result = super(stock_picking, self).action_invoice_create(cursor, user,
86                 ids, journal_id=journal_id, group=group, type=type,
87                 context=context)
88
89         picking_ids = result.keys()
90         invoice_ids = result.values()
91
92         invoices = {}
93         for invoice in invoice_obj.browse(cursor, user, invoice_ids,
94                 context=context):
95             invoices[invoice.id] = invoice
96
97         for picking in picking_obj.browse(cursor, user, picking_ids,
98                 context=context):
99             if not picking.carrier_id:
100                 continue
101             grid_id = carrier_obj.grid_get(cursor, user, [picking.carrier_id.id],
102                     picking.address_id.id, context=context)
103             if not grid_id:
104                 raise osv.except_osv(_('Warning'),
105                         _('The carrier %s (id: %d) has no delivery grid!') \
106                                 % (picking.carrier_id.name,
107                                     picking.carrier_id.id))
108             invoice = invoices[result[picking.id]]
109             price = grid_obj.get_price_from_picking(cursor, user, grid_id,
110                     invoice.amount_untaxed, picking.weight, picking.volume,
111                     context=context)
112             account_id = picking.carrier_id.product_id.product_tmpl_id\
113                     .property_account_income.id
114             if not account_id:
115                 account_id = picking.carrier_id.product_id.categ_id\
116                         .property_account_income_categ.id
117
118             taxes = picking.carrier_id.product_id.taxes_id
119
120             partner_id=picking.address_id.partner_id and picking.address_id.partner_id.id or False
121             taxes_ids = [x.id for x in picking.carrier_id.product_id.taxes_id]
122             if partner_id:
123                 partner = picking.address_id.partner_id
124                 account_id = self.pool.get('account.fiscal.position').map_account(cursor, user, partner.property_account_position, account_id)
125                 taxes_ids = self.pool.get('account.fiscal.position').map_tax(cursor, user, partner.property_account_position, taxes)
126
127             invoice_line_obj.create(cursor, user, {
128                 'name': picking.carrier_id.name,
129                 'invoice_id': invoice.id,
130                 'uos_id': picking.carrier_id.product_id.uos_id.id,
131                 'product_id': picking.carrier_id.product_id.id,
132                 'account_id': account_id,
133                 'price_unit': price,
134                 'quantity': 1,
135                 'invoice_line_tax_id': [(6, 0,taxes_ids)],
136             })
137         return result
138
139 stock_picking()
140
141 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
142